├── .editorconfig ├── .gitignore ├── .gitmodules ├── AddressDiscovery.md ├── ApprovedDigitalCurrency.md ├── CBDCAccessControl.md ├── ITPFt.md ├── ITPFtOperation1002.md ├── ITPFtOperation1052.md ├── KeyDictionary.md ├── README.md ├── RealDigital.md ├── RealDigitalDefaultAccount.md ├── RealDigitalEnableAccount.md ├── RealTokenizado.md ├── STR.md ├── SwapOneStep.md ├── SwapTwoSteps.md ├── SwapTwoStepsReserve.md ├── TPFtAccessControl.md ├── abi ├── AddressDiscovery.json ├── ApprovedDigitalCurrency.json ├── ITPFt.json ├── ITPFtOperation1002.json ├── ITPFtOperation1052.json ├── KeyDictionary.json ├── RealDigital.json ├── RealDigitalDefaultAccount.json ├── RealDigitalEnableAccount.json ├── RealTokenizado.json ├── STR.json ├── SwapOneStep.json ├── SwapTwoSteps.json └── SwapTwoStepsReserve.json ├── arquitetura.md ├── config.toml ├── exemplos ├── README.md ├── approveRealDigital.ts ├── approveRealTokenizado.ts ├── example1.ts ├── example10.ts ├── example11.ts ├── example12.ts ├── example2.ts ├── example3.ts ├── example4.ts ├── example5.ts ├── example6.ts ├── example7.ts ├── example8.ts ├── example9.ts ├── hardhat.config.ts ├── package.json ├── setApprovalForAll.ts └── tsconfig.json ├── genesis.json ├── ingresso.md ├── smartcontracts.md ├── smartcontractsTitulos.md └── topologia.png /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | package-lock.json 3 | cache/ 4 | .vscode/ 5 | *.bak 6 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "contracts"] 2 | path = contracts 3 | url = https://github.com/wireshape/real-digital-smart-contracts.git 4 | branch = main 5 | -------------------------------------------------------------------------------- /AddressDiscovery.md: -------------------------------------------------------------------------------- 1 | # Solidity API 2 | 3 | ## AddressDiscovery 4 | 5 | _Smart Contract_ utilitário para facilitar a descoberta dos demais endereços de contratos na rede do Piloto RD. Pode ser acessado a partir do endereço 0xDc2633B0cdA829bd2A54Db3Fd39b474aa0953c70. 6 | 7 | ### ACCESS_ROLE 8 | 9 | ```solidity 10 | bytes32 ACCESS_ROLE 11 | ``` 12 | 13 | _Role_ de acesso, pertencente a autoridade do contrato. 14 | 15 | ### addressDiscovery 16 | 17 | ```solidity 18 | mapping(bytes32 => address) addressDiscovery 19 | ``` 20 | 21 | _Mapping_ do endereço dos contratos, a chave é o hash keccak256 do nome do contrato. 22 | 23 | ### constructor 24 | 25 | ```solidity 26 | constructor(address _authority, address _admin) public 27 | ``` 28 | 29 | Construtor 30 | 31 | #### Parameters 32 | 33 | | Name | Type | Description | 34 | | ---- | ---- | ----------- | 35 | | _authority | address | Autoridade do contrato, pode atualizar os endereços dos contratos. | 36 | | _admin | address | Administrador, pode trocar a autoridade. | 37 | 38 | ### updateAddress 39 | 40 | ```solidity 41 | function updateAddress(bytes32 smartContract, address newAddress) public 42 | ``` 43 | 44 | Atualiza o endereço de um contrato, permitido apenas para a autoridade (BCB). 45 | 46 | #### Parameters 47 | 48 | | Name | Type | Description | 49 | | ---- | ---- | ----------- | 50 | | smartContract | bytes32 | Hash keccak256 do nome do contrato. | 51 | | newAddress | address | Novo endereço do contrato. | 52 | 53 | -------------------------------------------------------------------------------- /ApprovedDigitalCurrency.md: -------------------------------------------------------------------------------- 1 | # Solidity API 2 | 3 | ## ApprovedDigitalCurrency 4 | 5 | _Smart Contract_ utilitário para gerenciar que tokens podem ser usados nos contrato de _swap 6 | 7 | ### ACCESS_ROLE 8 | 9 | ```solidity 10 | bytes32 ACCESS_ROLE 11 | ``` 12 | 13 | _Role_ que permite adicionar tokens na lista de tokens permitidos 14 | 15 | ### approvedDigitalCurrency 16 | 17 | ```solidity 18 | mapping(address => bool) approvedDigitalCurrency 19 | ``` 20 | 21 | ### constructor 22 | 23 | ```solidity 24 | constructor(address _authority, address _admin) public 25 | ``` 26 | 27 | Construtor 28 | 29 | #### Parameters 30 | 31 | | Name | Type | Description | 32 | | ---- | ---- | ----------- | 33 | | _authority | address | Autoridade do contrato, pode fazer todas as operações com o contrato | 34 | | _admin | address | Administrador do contrato, pode trocar a autoridade do contrato caso seja necessário | 35 | 36 | ### setDigitalCurrencyApproval 37 | 38 | ```solidity 39 | function setDigitalCurrencyApproval(address asset, bool approved) public 40 | ``` 41 | 42 | Habilita ou desabilita a operação de um token nos contratos de swap 43 | 44 | #### Parameters 45 | 46 | | Name | Type | Description | 47 | | ---- | ---- | ----------- | 48 | | asset | address | endereço do token | 49 | | approved | bool | habilitado ou desabilitado | 50 | 51 | -------------------------------------------------------------------------------- /CBDCAccessControl.md: -------------------------------------------------------------------------------- 1 | # Solidity API 2 | 3 | ## CBDCAccessControl 4 | 5 | _Smart Contract_ responsável pela camada de controle de acesso para o Real Digital/Tokenizado. 6 | 7 | Suas principais funcionalidades são: 8 | - Determinar quais carteiras podem enviar/receber tokens. 9 | - Controlar os papeis de qual endereço pode emitir/resgatar/congelar saldo de uma carteira. 10 | 11 | ### PAUSER_ROLE 12 | 13 | ```solidity 14 | bytes32 PAUSER_ROLE 15 | ``` 16 | 17 | _Role_ que permite pausar o contrato. 18 | 19 | ### MINTER_ROLE 20 | 21 | ```solidity 22 | bytes32 MINTER_ROLE 23 | ``` 24 | 25 | _Role_ que permite fazer o `mint` nos contratos de token. 26 | 27 | ### ACCESS_ROLE 28 | 29 | ```solidity 30 | bytes32 ACCESS_ROLE 31 | ``` 32 | 33 | _Role_ que permite habilitar um endereço. 34 | 35 | ### MOVER_ROLE 36 | 37 | ```solidity 38 | bytes32 MOVER_ROLE 39 | ``` 40 | 41 | _Role_ que permite acesso à função `move`, ou seja, transferir o token de outra carteira. 42 | 43 | ### BURNER_ROLE 44 | 45 | ```solidity 46 | bytes32 BURNER_ROLE 47 | ``` 48 | 49 | _Role_ que permite acesso à função `burn`. 50 | 51 | ### FREEZER_ROLE 52 | 53 | ```solidity 54 | bytes32 FREEZER_ROLE 55 | ``` 56 | 57 | _Role_ que permite bloquear saldo de uma carteira, por exemplo para o [_swap_ de dois passos](./SwapTwoSteps.md). 58 | 59 | ### authorizedAccounts 60 | 61 | ```solidity 62 | mapping(address => bool) authorizedAccounts 63 | ``` 64 | 65 | _Mapping_ das contas autorizadas a receber o token. 66 | 67 | ### EnabledAccount 68 | 69 | ```solidity 70 | event EnabledAccount(address member) 71 | ``` 72 | 73 | Evento de carteira habilitada. 74 | 75 | #### Parameters 76 | 77 | | Name | Type | Description | 78 | | ---- | ---- | ----------- | 79 | | member | address | Carteira habilitada | 80 | 81 | ### DisabledAccount 82 | 83 | ```solidity 84 | event DisabledAccount(address member) 85 | ``` 86 | 87 | Evento de carteira desabilitada. 88 | 89 | #### Parameters 90 | 91 | | Name | Type | Description | 92 | | ---- | ---- | ----------- | 93 | | member | address | Carteira desabilitada | 94 | 95 | ### constructor 96 | 97 | ```solidity 98 | constructor(address _authority, address _admin) internal 99 | ``` 100 | 101 | Constrói uma instância do contrato, armazenando os argumentos informados. 102 | 103 | #### Parameters 104 | 105 | | Name | Type | Description | 106 | | ---- | ---- | ----------- | 107 | | _authority | address | Autoridade do contrato, pode fazer todas as operações com o token | 108 | | _admin | address | Administrador do contrato, pode trocar a autoridade do contrato caso seja necessário | 109 | 110 | ### checkAccess 111 | 112 | ```solidity 113 | modifier checkAccess(address from, address to) 114 | ``` 115 | 116 | Modificador que checa se tanto o pagador quanto o recebedor estão habilitados a receber o token. 117 | 118 | #### Parameters 119 | 120 | | Name | Type | Description | 121 | | ---- | ---- | ----------- | 122 | | from | address | Carteira do pagador | 123 | | to | address | Carteira do recebedor | 124 | 125 | ### enableAccount 126 | 127 | ```solidity 128 | function enableAccount(address member) public 129 | ``` 130 | 131 | Habilita a carteira a receber o token. 132 | 133 | #### Parameters 134 | 135 | | Name | Type | Description | 136 | | ---- | ---- | ----------- | 137 | | member | address | Carteira a ser habilitada | 138 | 139 | ### disableAccount 140 | 141 | ```solidity 142 | function disableAccount(address member) public 143 | ``` 144 | 145 | Desabilita a carteira. 146 | 147 | #### Parameters 148 | 149 | | Name | Type | Description | 150 | | ---- | ---- | ----------- | 151 | | member | address | Carteira a ser desabilitada | 152 | 153 | ### verifyAccount 154 | 155 | ```solidity 156 | function verifyAccount(address account) public view virtual returns (bool) 157 | ``` 158 | 159 | Checa se a carteira pode receber o token. 160 | 161 | #### Parameters 162 | 163 | | Name | Type | Description | 164 | | ---- | ---- | ----------- | 165 | | account | address | Carteira a ser checada | 166 | 167 | -------------------------------------------------------------------------------- /ITPFt.md: -------------------------------------------------------------------------------- 1 | # Solidity API 2 | 3 | ## ITPFt 4 | 5 | Interface responsável pela criação e emissão de Título Público Federal tokenizado (TPFt). 6 | 7 | ### FrozenBalance 8 | 9 | ```solidity 10 | event FrozenBalance(address from, uint256 balance) 11 | ``` 12 | 13 | Evento emitido quando o saldo de uma carteira é congelado. 14 | 15 | #### Parameters 16 | 17 | | Name | Type | Description | 18 | | ---- | ---- | ----------- | 19 | | from | address | Endereço da carteira que teve o saldo congelado. | 20 | | balance | uint256 | Saldo de ativo congelado. | 21 | 22 | ### TPFtData 23 | 24 | ```solidity 25 | struct TPFtData { 26 | string acronym; 27 | string code; 28 | uint256 maturityDate; 29 | } 30 | ``` 31 | 32 | ### OnlyMinterContract 33 | 34 | ```solidity 35 | error OnlyMinterContract() 36 | ``` 37 | 38 | Erro lançado porque a ação só pode ser realizada pelo contrato de colocação direta de TPFts. 39 | 40 | ### OnlyDirectPlacementContract 41 | 42 | ```solidity 43 | error OnlyDirectPlacementContract() 44 | ``` 45 | 46 | Erro lançado porque a ação só pode ser realizada pelo contrato de colocação direta de TPFts. 47 | 48 | ### createTPFt 49 | 50 | ```solidity 51 | function createTPFt(struct ITPFt.TPFtData tpftData) external 52 | ``` 53 | 54 | Função para criar um novo TPFt. 55 | 56 | #### Parameters 57 | 58 | | Name | Type | Description | 59 | | ---- | ---- | ----------- | 60 | | tpftData | struct ITPFt.TPFtData | Estrutura de dados do TPFt, que incluem as seguintes informações:
- `acronym`: A sigla do TPFt.
- `code`: O código único do TPFt.
- `maturityDate`: A data de vencimento do TPFt, representada como um valor numérico (timestamp Unix). | 61 | 62 | ### mint 63 | 64 | ```solidity 65 | function mint(address receiverAddress, struct ITPFt.TPFtData tpftData, uint256 tpftAmount) external 66 | ``` 67 | 68 | Função para emitir TPFt. 69 | 70 | #### Parameters 71 | 72 | | Name | Type | Description | 73 | | ---- | ---- | ----------- | 74 | | receiverAddress | address | Endereço do cessionário da operação. Nesta operação sempre será o endereço da STN. | 75 | | tpftData | struct ITPFt.TPFtData | Estrutura de dados do TPFt, que incluem as seguintes informações:
- `acronym`: A sigla do TPFt.
- `code`: O código único do TPFt.
- `maturityDate`: A data de vencimento do TPFt, representada como um valor numérico (timestamp Unix). | 76 | | tpftAmount | uint256 | Quantidade de TPFt a ser emitida. | 77 | 78 | ### getTPFtId 79 | 80 | ```solidity 81 | function getTPFtId(struct ITPFt.TPFtData tpftData) external view returns (uint256) 82 | ``` 83 | 84 | Função para obter o ID do título. 85 | 86 | #### Parameters 87 | 88 | | Name | Type | Description | 89 | | ---- | ---- | ----------- | 90 | | tpftData | struct ITPFt.TPFtData | Estrutura de dados do TPFt, que incluem as seguintes informações:
- `acronym`: A sigla do TPFt.
- `code`: O código único do TPFt.
- `maturityDate`: A data de vencimento do TPFt, representada como um valor numérico (timestamp Unix). | 91 | 92 | #### Return Values 93 | 94 | | Name | Type | Description | 95 | | ---- | ---- | ----------- | 96 | | [0] | uint256 | Retorna o ID do título. Se não existir um TPFt com as informações fornecidas, o valor retornado será 0. | 97 | 98 | ### directPlacement 99 | 100 | ```solidity 101 | function directPlacement(address from, address to, struct ITPFt.TPFtData tpftData, uint256 tpftAmount) external 102 | ``` 103 | 104 | Função para realizar uma operação de colocação direta de TPFt. 105 | 106 | #### Parameters 107 | 108 | | Name | Type | Description | 109 | | ---- | ---- | ----------- | 110 | | from | address | Endereço da carteira de origem da operação de colocação direta. | 111 | | to | address | Endereço da carteira de destino da operação de colocação direta. | 112 | | tpftData | struct ITPFt.TPFtData | Estrutura de dados do TPFt, que incluem as seguintes informações:
- `acronym`: A sigla do TPFt.
- `code`: O código único do TPFt.
- `maturityDate`: A data de vencimento do TPFt, representada como um valor numérico (timestamp Unix). | 113 | | tpftAmount | uint256 | Quantidade de TPFt a ser enviada na operação de colocação direta. | 114 | 115 | ### increaseFrozenBalance 116 | 117 | ```solidity 118 | function increaseFrozenBalance(address from, struct ITPFt.TPFtData tpftData, uint256 tpftAmount) external 119 | ``` 120 | 121 | Função para incrementar tokens parcialmente bloqueados de uma carteira. Somente quem possuir FREEZER_ROLE pode executar. 122 | 123 | #### Parameters 124 | 125 | | Name | Type | Description | 126 | | ---- | ---- | ----------- | 127 | | from | address | Endereço da carteira que os ativos serão bloqueados. | 128 | | tpftData | struct ITPFt.TPFtData | Estrutura de dados do TPFt, que incluem as seguintes informações:
- `acronym`: A sigla do TPFt.
- `code`: O código único do TPFt.
- `maturityDate`: A data de vencimento do TPFt, representada como um valor numérico (timestamp Unix). | 129 | | tpftAmount | uint256 | Quantidade de TPFt. | 130 | 131 | ### decreaseFrozenBalance 132 | 133 | ```solidity 134 | function decreaseFrozenBalance(address from, struct ITPFt.TPFtData tpftData, uint256 tpftAmount) external 135 | ``` 136 | 137 | Função para decrementar tokens parcialmente bloqueados de uma carteira. Somente quem possuir FREEZER_ROLE pode executar. 138 | 139 | #### Parameters 140 | 141 | | Name | Type | Description | 142 | | ---- | ---- | ----------- | 143 | | from | address | Endereço da carteira que os ativos serão desbloqueados. | 144 | | tpftData | struct ITPFt.TPFtData | Estrutura de dados do TPFt, que incluem as seguintes informações:
- `acronym`: A sigla do TPFt.
- `code`: O código único do TPFt.
- `maturityDate`: A data de vencimento do TPFt, representada como um valor numérico (timestamp Unix). | 145 | | tpftAmount | uint256 | Quantidade de TPFt. | 146 | 147 | ### pause 148 | 149 | ```solidity 150 | function pause() external 151 | ``` 152 | 153 | Função para pausar o token em casos necessários, bloqueando-o para todas as operações. 154 | 155 | ### unpause 156 | 157 | ```solidity 158 | function unpause() external 159 | ``` 160 | 161 | Função para despausar o token em casos necessários, desbloqueando-o para todas as operações. 162 | 163 | -------------------------------------------------------------------------------- /ITPFtOperation1002.md: -------------------------------------------------------------------------------- 1 | # Solidity API 2 | 3 | ## ITPFtOperation1002 4 | 5 | Interface responsável por permitir a liquidação de oferta pública envolvendo Título Público Federal tokenizado (TPFt). 6 | 7 | ### auctionPlacement 8 | 9 | ```solidity 10 | function auctionPlacement(uint256 operationId, uint256 cnpj8Sender, uint256 cnpj8Receiver, enum ITPFtOperation.CallerPart callerPart, struct ITPFt.TPFtData tpftData, uint256 tpftAmount, uint256 unitPrice) external 11 | ``` 12 | 13 | Função para realizar a liquidação de oferta pública. 14 | 15 | #### Parameters 16 | 17 | | Name | Type | Description | 18 | | ---- | ---- | ----------- | 19 | | operationId | uint256 | Número de operação + data vigente no formato yyyyMMdd. | 20 | | cnpj8Sender | uint256 | CNPJ8 do cedente da operação. Nesta operação sempre será o CNPJ8 da STN. | 21 | | cnpj8Receiver | uint256 | CNPJ8 do cessionário da operação. | 22 | | callerPart | enum ITPFtOperation.CallerPart | Parte que está transmitindo o comando da operação. Se for o cedente deve ser informado CallerPart.TPFtSender, se for o cessionário deve ser informado CallerPart.TPFtReceiver. | 23 | | tpftData | struct ITPFt.TPFtData | Estrutura de dados do TPFt, que incluem as seguintes informações:
- `acronym`: A sigla do TPFt.
- `code`: O código único do TPFt.
- `maturityDate`: A data de vencimento do TPFt, representada como um valor numérico (timestamp Unix). | 24 | | tpftAmount | uint256 | Quantidade de TPFt a ser negociada. Incluir as 2 casas decimais. | 25 | | unitPrice | uint256 | Preço unitário do TPFt. Incluir as 8 casas decimais. | 26 | 27 | -------------------------------------------------------------------------------- /ITPFtOperation1052.md: -------------------------------------------------------------------------------- 1 | # Solidity API 2 | 3 | ## ITPFtOperation1052 4 | 5 | Interface responsável por permitir que participantes cadastrados no 6 | Real Digital realizem a operação de compra e venda envolvendo 7 | Título Público Federal tokenizado (TPFt) entre si e/ou clientes. 8 | 9 | ### trade 10 | 11 | ```solidity 12 | function trade(uint256 operationId, uint256 cnpj8Sender, uint256 cnpj8Receiver, enum ITPFtOperation.CallerPart callerPart, struct ITPFt.TPFtData tpftData, uint256 tpftAmount, uint256 unitPrice) external 13 | ``` 14 | 15 | Função para os participantes realizarem a operação de compra e venda entre 16 | si informando os CNPJ8s das partes. O CNPJ8 identifica a carteira default da parte. 17 | 18 | #### Parameters 19 | 20 | | Name | Type | Description | 21 | | ---- | ---- | ----------- | 22 | | operationId | uint256 | Número de operação + data vigente no formato yyyyMMdd. | 23 | | cnpj8Sender | uint256 | CNPJ8 do cedente da operação. | 24 | | cnpj8Receiver | uint256 | CNPJ8 do cessionário da operação. | 25 | | callerPart | enum ITPFtOperation.CallerPart | Parte que está transmitindo o comando da operação. Se for o cedente deve ser informado CallerPart.TPFtSender, se for o cessionário deve ser informado CallerPart.TPFtReceiver. | 26 | | tpftData | struct ITPFt.TPFtData | Estrutura de dados do TPFt, que incluem as seguintes informações:
- `acronym`: A sigla do TPFt.
- `code`: O código único do TPFt.
- `maturityDate`: A data de vencimento do TPFt, representada como um valor numérico (timestamp Unix). | 27 | | tpftAmount | uint256 | Quantidade de TPFt a ser negociada. Incluir as 2 casas decimais. | 28 | | unitPrice | uint256 | Preço unitário do TPFt. Incluir as 8 casas decimais. | 29 | 30 | ### trade 31 | 32 | ```solidity 33 | function trade(uint256 operationId, address sender, address receiver, enum ITPFtOperation.CallerPart callerPart, struct ITPFt.TPFtData tpftData, uint256 tpftAmount, uint256 unitPrice) external 34 | ``` 35 | 36 | Função para os participantes realizarem a operação de compra e venda entre si informando os endereços das carteiras das partes. 37 | 38 | #### Parameters 39 | 40 | | Name | Type | Description | 41 | | ---- | ---- | ----------- | 42 | | operationId | uint256 | Número de operação + data vigente no formato yyyyMMdd. | 43 | | sender | address | Endereço da carteira do cedente da operação. | 44 | | receiver | address | Endereço da carteira do cessionário da operação. | 45 | | callerPart | enum ITPFtOperation.CallerPart | Parte que está transmitindo o comando da operação. Se for o cedente deve ser informado CallerPart.TPFtSender, se for o cessionário deve ser informado CallerPart.TPFtReceiver. | 46 | | tpftData | struct ITPFt.TPFtData | Estrutura de dados do TPFt, que incluem as seguintes informações:
- `acronym`: A sigla do TPFt.
- `code`: O código único do TPFt.
- `maturityDate`: A data de vencimento do TPFt, representada como um valor numérico (timestamp Unix). | 47 | | tpftAmount | uint256 | Quantidade de TPFt a ser negociada. Incluir as 2 casas decimais. | 48 | | unitPrice | uint256 | Preço unitário do TPFt. Incluir as 8 casas decimais. | 49 | 50 | ### trade 51 | 52 | ```solidity 53 | function trade(uint256 operationId, address sender, contract RealTokenizado senderToken, address receiver, contract RealTokenizado receiverToken, enum ITPFtOperation.CallerPart callerPart, struct ITPFt.TPFtData tpftData, uint256 tpftAmount, uint256 unitPrice) external 54 | ``` 55 | 56 | Função para participantes e/ou clientes realizarem a operação de compra e venda entre si 57 | informando o endereço das carteiras das partes e do seu Real Tokenizado. 58 | 59 | #### Parameters 60 | 61 | | Name | Type | Description | 62 | | ---- | ---- | ----------- | 63 | | operationId | uint256 | Número de operação + data vigente no formato yyyyMMdd. | 64 | | sender | address | Endereço da carteira do cedente da operação. | 65 | | senderToken | contract RealTokenizado | RealTokenizado do cedente da operação. | 66 | | receiver | address | Endereço da carteira do cessionário da operação. | 67 | | receiverToken | contract RealTokenizado | RealTokenizado do cessionário da operação. | 68 | | callerPart | enum ITPFtOperation.CallerPart | Parte que está transmitindo o comando da operação. Se for o cedente deve ser informado CallerPart.TPFtSender, se for o cessionário deve ser informado CallerPart.TPFtReceiver. | 69 | | tpftData | struct ITPFt.TPFtData | Estrutura de dados do TPFt, que incluem as seguintes informações:
- `acronym`: A sigla do TPFt.
- `code`: O código único do TPFt.
- `maturityDate`: A data de vencimento do TPFt, representada como um valor numérico (timestamp Unix). | 70 | | tpftAmount | uint256 | Quantidade de TPFt a ser negociada. Incluir as 2 casas decimais. | 71 | | unitPrice | uint256 | Preço unitário do TPFt. Incluir as 8 casas decimais. | 72 | -------------------------------------------------------------------------------- /KeyDictionary.md: -------------------------------------------------------------------------------- 1 | # Solidity API 2 | 3 | ## KeyDictionary 4 | 5 | Contrato que representa a consulta de carteiras de clientes. É um contrato de simulação de um diretório de informações. 6 | 7 | Este contrato será usado somente durante o piloto. Os métodos desse contrato podem ser chamados por qualquer endereço habilitado a receber CBDC. 8 | 9 | ### CBDC 10 | 11 | ```solidity 12 | contract RealDigital CBDC 13 | ``` 14 | 15 | Referência para o contrato de Real Digital. 16 | 17 | ### CustomerData 18 | 19 | ```solidity 20 | struct CustomerData { 21 | uint256 taxId; // O CPF do cliente 22 | uint256 bankNumber; // O código da participante 23 | uint256 account; // A conta do cliente 24 | uint256 branch; // A agência do cliente 25 | address wallet; // A carteira do cliente 26 | bool registered; // Registrado ou não 27 | address owner; // A carteira do participante que inseriu o cliente 28 | } 29 | ``` 30 | 31 | ### KeyRequested 32 | 33 | ```solidity 34 | event KeyRequested(address owner, uint256 proposalId, bytes32 key) 35 | ``` 36 | 37 | Evento de solicitação de troca de dono de chave. 38 | 39 | #### Parameters 40 | 41 | | Name | Type | Description | 42 | | ---- | ---- | ----------- | 43 | | owner | address | O atual dono da chave | 44 | | proposalId | uint256 | Id da proposta | 45 | | key | bytes32 | A chave | 46 | 47 | ### onlyParticipant 48 | 49 | ```solidity 50 | modifier onlyParticipant() 51 | ``` 52 | 53 | Modificador de método: somente participantes podem executar o método. 54 | 55 | 56 | ### constructor 57 | 58 | ```solidity 59 | constructor(contract RealDigital token) public 60 | ``` 61 | 62 | Constrói uma instância do contrato e armazena o endereço do contrato do Real Digital. 63 | 64 | #### Parameters 65 | 66 | | Name | Type | Description | 67 | | ---- | ---- | ----------- | 68 | | token | contract RealDigital | Endereço do contrato do Real Digital | 69 | 70 | 71 | 72 | ### addAccount 73 | 74 | ```solidity 75 | function addAccount(bytes32 key, uint256 _taxId, uint256 _bankNumber, uint256 _account, uint256 _branch, address _wallet) public 76 | ``` 77 | 78 | Adiciona os dados do cliente, vinculando à chave _key_. 79 | 80 | #### Parameters 81 | 82 | | Name | Type | Description | 83 | | ---- | ---- | ----------- | 84 | | key | bytes32 | A chave | 85 | | _taxId | uint256 | O CPF do cliente | 86 | | _bankNumber | uint256 | O ID do participante | 87 | | _account | uint256 | A conta do cliente | 88 | | _branch | uint256 | A agência do cliente | 89 | | _wallet | address | A carteira do cliente | 90 | 91 | ### getWallet 92 | 93 | ```solidity 94 | function getWallet(bytes32 key) public view returns (address) 95 | ``` 96 | 97 | Retorna a carteira do cliente com base na sua chave _key_. 98 | 99 | #### Parameters 100 | 101 | | Name | Type | Description | 102 | | ---- | ---- | ----------- | 103 | | key | bytes32 | A chave cuja carteira está sendo buscada | 104 | 105 | 106 | ### getKey 107 | 108 | ```solidity 109 | function getKey(address wallet) public view returns (bytes32) 110 | ``` 111 | 112 | Retorna a chave do cliente com base na sua carteira. 113 | 114 | #### Parameters 115 | 116 | | Name | Type | Description | 117 | | ---- | ---- | ----------- | 118 | | wallet | address | A carteira do cliente | 119 | 120 | 121 | 122 | ### getCustomerData 123 | 124 | ```solidity 125 | function getCustomerData(bytes32 key) public view returns (struct KeyDictionary.CustomerData) 126 | ``` 127 | 128 | Retorna todos os dados do cliente. 129 | 130 | #### Parameters 131 | 132 | | Name | Type | Description | 133 | | ---- | ---- | ----------- | 134 | | key | bytes32 | A chave do cliente solicitado | 135 | 136 | ### updateData 137 | 138 | ```solidity 139 | function updateData(bytes32 key, uint256 _taxId, uint256 _bankNumber, uint256 _account, uint256 _branch, address _wallet) public 140 | ``` 141 | 142 | Atualiza os dados do cliente vinculado à chave _key_. Apenas o dono da carteira do participante ao qual o cliente vinculou sua chave pode alterar os dados por esta função. 143 | 144 | #### Parameters 145 | 146 | | Name | Type | Description | 147 | | ---- | ---- | ----------- | 148 | | key | bytes32 | A nova chave do cliente | 149 | | _taxId | uint256 | O novo CPF do cliente | 150 | | _bankNumber | uint256 | O novo ID do participante responsável pelo cliente | 151 | | _account | uint256 | A nova conta do cliente | 152 | | _branch | uint256 | A nova agência do cliente | 153 | | _wallet | address | A nova carteira do cliente | 154 | 155 | ### requestKey 156 | 157 | ```solidity 158 | function requestKey(bytes32 key, uint256 _taxId, uint256 _bankNumber, uint256 _account, uint256 _branch, address _wallet) public 159 | ``` 160 | 161 | Requisita uma chave que pertence a outro participante. 162 | 163 | #### Parameters 164 | 165 | | Name | Type | Description | 166 | | ---- | ---- | ----------- | 167 | | key | bytes32 | A chave requisitada | 168 | | _taxId | uint256 | O CPF do cliente requisitante | 169 | | _bankNumber | uint256 | ID do participante responsável pelo cliente requisitante | 170 | | _account | uint256 | A conta do cliente requisitante | 171 | | _branch | uint256 | A agência do cliente requisitante | 172 | | _wallet | address | A carteira do cliente requisitante | 173 | 174 | ### authorizeKey 175 | 176 | ```solidity 177 | function authorizeKey(uint256 proposalId, bytes32 key) public 178 | ``` 179 | 180 | Autoriza a alteração de dados proposta pelo id _proposalId_ para a chave _key_. 181 | 182 | #### Parameters 183 | 184 | | Name | Type | Description | 185 | | ---- | ---- | ----------- | 186 | | proposalId | uint256 | Id da proposta | 187 | | key | bytes32 | A chave cujos dados serão alterados | 188 | 189 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Kit Onboarding - Piloto Real Digital (#6d6da5767e6dfe60099a473e47f33fd13419e0a8) 2 | 3 | Este repositório contém as informações necessárias para a participação no piloto do Real Digital. A documentação será complementada conforme o _feedback_ dos participantes. 4 | 5 | 6 | * [Arquitetura do Piloto](arquitetura.md) 7 | * [Conexão com a rede do Real Digital](ingresso.md) 8 | * [Smart Contracts - Real Digital, Real Tokenizado](smartcontracts.md) 9 | * [Smart Contracts - Título Público Federal Tokenizado e Operações com títulos](smartcontractsTitulos.md) 10 | * [Exemplos de interação com os smart contracts](exemplos/README.md) 11 | -------------------------------------------------------------------------------- /RealDigital.md: -------------------------------------------------------------------------------- 1 | # Solidity API 2 | 3 | ## RealDigital 4 | 5 | 6 | ### frozenBalanceOf 7 | 8 | ```solidity 9 | mapping(address => uint256) frozenBalanceOf 10 | ``` 11 | 12 | _Mapping_ das carteiras e respectivo valor congelado. 13 | 14 | ### FrozenBalance 15 | 16 | ```solidity 17 | event FrozenBalance(address wallet, uint256 amount) 18 | ``` 19 | 20 | Evento emitido quando um valor de uma carteira é congelado. 21 | 22 | #### Parameters 23 | 24 | | Name | Type | Description | 25 | | ---- | ---- | ----------- | 26 | | wallet | address | carteira que teve o fundo congelado | 27 | | amount | uint256 | quantidade congelada | 28 | 29 | ### checkFrozenBalance 30 | 31 | ```solidity 32 | modifier checkFrozenBalance(address from, uint256 amount) 33 | ``` 34 | 35 | _Modifier_ para verificar se um endereço possui fundos suficientes. Usado no `_beforeTokenTransfer`. 36 | 37 | ### constructor 38 | 39 | ```solidity 40 | constructor(string _name, string _symbol, address _authority, address _admin) public 41 | ``` 42 | 43 | Construtor do token do Real Digital. 44 | 45 | Invoca o construtor do ERC20 e dá permissão de autoridade para a carteira do BCB. 46 | 47 | #### Parameters 48 | 49 | | Name | Type | Description | 50 | | ---- | ---- | ----------- | 51 | | _name | string | Nome do token: Real Digital | 52 | | _symbol | string | Símbolo do token: BRL | 53 | | _authority | address | Carteira responsável por emitir, resgatar, mover e congelar fundos (BCB) | 54 | | _admin | address | Carteira responsável por administrar o controle de acessos (BCB) | 55 | 56 | 57 | 58 | 59 | ### pause 60 | 61 | ```solidity 62 | function pause() public 63 | ``` 64 | 65 | Função para pausar o token em casos necessários, bloqueando-o para todas as operações. 66 | 67 | ### unpause 68 | 69 | ```solidity 70 | function unpause() public 71 | ``` 72 | 73 | Função para despausar o token em casos necessários, desbloqueando-o para todas as operações. 74 | 75 | ### mint 76 | 77 | ```solidity 78 | function mint(address to, uint256 amount) public 79 | ``` 80 | 81 | Função para emitir tokens para as carteiras permitidas. 82 | 83 | #### Parameters 84 | 85 | | Name | Type | Description | 86 | | ---- | ---- | ----------- | 87 | | to | address | carteira destino | 88 | | amount | uint256 | quantidade de tokens | 89 | 90 | ### _beforeTokenTransfer 91 | 92 | ```solidity 93 | function _beforeTokenTransfer(address from, address to, uint256 amount) internal 94 | ``` 95 | 96 | Gatilho executado sempre que é solicitada uma movimentação de token, inclusive na criação e destruição de tokens. 97 | 98 | Condições de chamada: 99 | 100 | - quando `from` é zero, `amount` tokens serão emitidos `to`. 101 | - quando `to` é zero, `amount` do `from` tokens serão destruídos. 102 | - `from` e `to` nunca serão simultaneamente zero. 103 | - `from` e `to` devem estar registrados como participantes. 104 | 105 | ### decimals 106 | 107 | ```solidity 108 | function decimals() public view virtual returns (uint8) 109 | ``` 110 | 111 | Retorna o número de casas decimais utilizadas na representação do valor do token. Por exemplo, se `decimals` for igual a `2`, um saldo de `505` tokens deve ser apresentado como `5.05` (`505 / 10 ** 2`). 112 | 113 | ### move 114 | 115 | ```solidity 116 | function move(address from, address to, uint256 amount) public 117 | ``` 118 | 119 | Função para mover tokens de uma carteira para outra. Somente quem possuir MOVER_ROLE pode executar. 120 | 121 | #### Parameters 122 | 123 | | Name | Type | Description | 124 | | ---- | ---- | ----------- | 125 | | from | address | carteira origem | 126 | | to | address | carteira destino | 127 | | amount | uint256 | quantidade de tokens | 128 | 129 | ### increaseFrozenBalance 130 | 131 | ```solidity 132 | function increaseFrozenBalance(address from, uint256 amount) public 133 | ``` 134 | 135 | Função para incrementar tokens parcialmente bloqueados de uma carteira. Somente quem possuir FREEZER_ROLE pode executar. 136 | 137 | #### Parameters 138 | 139 | | Name | Type | Description | 140 | | ---- | ---- | ----------- | 141 | | from | address | carteira origem | 142 | | amount | uint256 | quantidade de tokens | 143 | 144 | ### decreaseFrozenBalance 145 | 146 | ```solidity 147 | function decreaseFrozenBalance(address from, uint256 amount) public 148 | ``` 149 | 150 | Função para decrementar tokens parcialmente bloqueados de uma carteira. Somente quem possuir FREEZER_ROLE pode executar. 151 | 152 | #### Parameters 153 | 154 | | Name | Type | Description | 155 | | ---- | ---- | ----------- | 156 | | from | address | carteira origem | 157 | | amount | uint256 | quantidade de tokens | 158 | 159 | ### burn 160 | 161 | ```solidity 162 | function burn(uint256 amount) public 163 | ``` 164 | 165 | Destrói um determinado valor da carteira. 166 | 167 | Veja {ERC20-_burn}._ 168 | 169 | ### moveAndBurn 170 | 171 | ```solidity 172 | function moveAndBurn(address from, uint256 amount) public 173 | ``` 174 | 175 | Função para destruir tokens de uma carteira. Somente quem possuir MOVER_ROLE pode executar. 176 | 177 | #### Parameters 178 | 179 | | Name | Type | Description | 180 | | ---- | ---- | ----------- | 181 | | from | address | carteira origem | 182 | | amount | uint256 | quantidade de tokens | 183 | 184 | ### burnFrom 185 | 186 | ```solidity 187 | function burnFrom(address account, uint256 amount) public 188 | ``` 189 | 190 | Destrói `amount` tokens da `account`, deduzindo alllowance do executor. 191 | Olhe {ERC20-_burn} e {ERC20-allowance}. 192 | 193 | Requerimentos: 194 | 195 | - o executor deve possuir autorização de mover fundos da `accounts` de no mínimo o 196 | `amount`. 197 | 198 | -------------------------------------------------------------------------------- /RealDigitalDefaultAccount.md: -------------------------------------------------------------------------------- 1 | # Solidity API 2 | 3 | ## RealDigitalDefaultAccount 4 | 5 | Contrato que permite aos participantes trocarem sua carteira _default_. 6 | 7 | ### ACCESS_ROLE 8 | 9 | ```solidity 10 | bytes32 ACCESS_ROLE 11 | ``` 12 | 13 | _Role_ de acesso pertencente à autoridade do contrato. 14 | 15 | 16 | ### CBDC 17 | 18 | ```solidity 19 | contract RealDigital CBDC 20 | ``` 21 | 22 | Referência ao contrato do Real Digital para validação de participantes. 23 | 24 | 25 | ### defaultAccount 26 | 27 | ```solidity 28 | mapping(uint256 => address) defaultAccount 29 | ``` 30 | 31 | _Mapping_ das contas default. Chave é o CPNJ8 do participante. 32 | 33 | 34 | ### onlyParticipant 35 | 36 | ```solidity 37 | modifier onlyParticipant() 38 | ``` 39 | 40 | Modificador de método: somente participantes podem alterar suas carteiras _default_. 41 | 42 | 43 | ### constructor 44 | 45 | ```solidity 46 | constructor(contract RealDigital token, address _authority, address _admin) public 47 | ``` 48 | 49 | #### Parameters 50 | 51 | | Name | Type | Description | 52 | | ---- | ---- | ----------- | 53 | | token | contract RealDigital | Endereço do Real Digital | 54 | | _authority | address | Autoridade do contrato. Adiciona carteiras default | 55 | | _admin | address | Administrador do contrato. Permite trocar a autoridade | 56 | 57 | 58 | 59 | 60 | ### addDefaultAccount 61 | 62 | ```solidity 63 | function addDefaultAccount(uint256 cnpj8, address wallet) public 64 | ``` 65 | 66 | Adiciona a primeira carteira _default_ para um participante. É permitido apenas para a autoridade. (BCB) 67 | 68 | #### Parameters 69 | 70 | | Name | Type | Description | 71 | | ---- | ---- | ----------- | 72 | | cnpj8 | uint256 | CNPJ8 do participante | 73 | | wallet | address | Carteira | 74 | 75 | 76 | 77 | 78 | ### updateDefaultWallet 79 | 80 | ```solidity 81 | function updateDefaultWallet(uint256 cnpj8, address newWallet) public 82 | ``` 83 | 84 | Permite ao participante trocar sua carteira _default_. Deve ser chamado a partir do endereço default. 85 | 86 | #### Parameters 87 | 88 | | Name | Type | Description | 89 | | ---- | ---- | ----------- | 90 | | cnpj8 | uint256 | CNPJ8 do participante | 91 | | newWallet | address | Carteira | 92 | 93 | -------------------------------------------------------------------------------- /RealDigitalEnableAccount.md: -------------------------------------------------------------------------------- 1 | # Solidity API 2 | 3 | ## RealDigitalEnableAccount 4 | 5 | Contrato que permite ao participante habilitar outras carteiras de sua propriedade. 6 | 7 | 8 | 9 | 10 | ### constructor 11 | 12 | ```solidity 13 | constructor(address accessControlAddress) public 14 | ``` 15 | 16 | Constrói uma instância do contrato e armazena o endereço do contrato do RealDigital, responsável pelas verificações de controle de acesso. 17 | 18 | #### Parameters 19 | 20 | | Name | Type | Description | 21 | | ---- | ---- | ----------- | 22 | | accessControlAddress | address | Endereço do contrato de controle de acesso | 23 | 24 | 25 | 26 | 27 | ### enableAccount 28 | 29 | ```solidity 30 | function enableAccount(address member) public 31 | ``` 32 | 33 | Habilita uma nova carteira para o participante. Qualquer carteira previamente habilitada para o participante pode habilitar outras carteiras. 34 | 35 | #### Parameters 36 | 37 | | Name | Type | Description | 38 | | ---- | ---- | ----------- | 39 | | member | address | Novo endereço do participante | 40 | 41 | 42 | 43 | 44 | ### disableAccount 45 | 46 | ```solidity 47 | function disableAccount() public 48 | ``` 49 | 50 | Desabilita a própria carteira que executou a função. 51 | 52 | -------------------------------------------------------------------------------- /RealTokenizado.md: -------------------------------------------------------------------------------- 1 | # Solidity API 2 | 3 | ## RealTokenizado 4 | 5 | Implementação do contrato do Real Tokenizado (DVt e MEt). 6 | 7 | Este contrato herda do Real Digital e todas as funções implementadas. As funções de autoridade são designadas ao participante do piloto. 8 | 9 | ### participant 10 | 11 | ```solidity 12 | string participant 13 | ``` 14 | _String_ que representa o nome do participante. 15 | 16 | ### cnpj8 17 | 18 | ```solidity 19 | uint256 cnpj8 20 | ``` 21 | _Uitn256_ que representa o número da instituição. 22 | 23 | ### reserve 24 | 25 | ```solidity 26 | address reserve 27 | ``` 28 | Carteira de reserva da instituição participante. 29 | 30 | 31 | ### constructor 32 | 33 | ```solidity 34 | constructor(string _name, string _symbol, address _authority, address _admin, string _participant, uint256 _cnpj8, address _reserve) public 35 | ``` 36 | 37 | Construtor do token do Real Tokenizado. 38 | 39 | Invoca o construtor do ERC20 e dá permissão de autoridade para a carteira do participante e admin para o BCB. 40 | 41 | #### Parameters 42 | 43 | | Name | Type | Description | 44 | | ---- | ---- | ----------- | 45 | | _name | string | Nome do token: RealTokenizado@CNPJ8 | 46 | | _symbol | string | Símbolo do token: DREX@CNPJ8 | 47 | | _authority | address | Carteira responsável por emitir, resgatar, mover e congelar fundos | 48 | | _admin | address | Carteira responsável por administrar o controle de acessos (BCB) | 49 | | _participant | string | Identificação do participante como string. | 50 | | _cnpj8 | uint256 | Primeiros 8 digitos do CNPJ da instituição | 51 | | _reserve | address | Carteira de reserva da instituição | 52 | 53 | 54 | ### updateReserve 55 | 56 | ```solidity 57 | function updateReserve(address newReserve) public 58 | ``` 59 | 60 | Função para atualizar a carteira de reserva do token. A carteira de reserva é usada pelo DvP 61 | 62 | 63 | #### Parameters 64 | 65 | | Name | Type | Description | 66 | | ---- | ---- | ----------- | 67 | | newReserve | address | Carteira da autoridade (Instituição) | 68 | 69 | -------------------------------------------------------------------------------- /STR.md: -------------------------------------------------------------------------------- 1 | # Solidity API 2 | 3 | ## STR 4 | 5 | Este contrato que simula o STR. Por meio dele, os participantes autorizados podem emitir Real Digital. 6 | 7 | Para o piloto nenhuma validação é feita, bastando que o participante esteja autorizado. 8 | 9 | ### CBDC 10 | 11 | ```solidity 12 | contract RealDigital CBDC 13 | ``` 14 | 15 | Referência ao contrato do Real Digital para checar se o participante é autorizado. 16 | 17 | ### onlyParticipant 18 | 19 | ```solidity 20 | modifier onlyParticipant() 21 | ``` 22 | 23 | Modificador de método: somente participantes podem executar a função 24 | 25 | ### constructor 26 | 27 | ```solidity 28 | constructor(contract RealDigital token) public 29 | ``` 30 | 31 | Constrói uma instância do contrato e armazena o endereço do Real Digital 32 | 33 | #### Parameters 34 | 35 | | Name | Type | Description | 36 | | ---- | ---- | ----------- | 37 | | token | contract RealDigital | Endereço do Real Digital | 38 | 39 | ### requestToMint 40 | 41 | ```solidity 42 | function requestToMint(uint256 amount) modifier onlyParticipant() public 43 | ``` 44 | 45 | Emite a quantidade de Real Digital informada em _amount_ para a própria carteira executora desta função 46 | 47 | #### Parameters 48 | 49 | | Name | Type | Description | 50 | | ---- | ---- | ----------- | 51 | | amount | uint256 | Quantidade a ser emitida (obs: lembrar das 2 casas decimais) | 52 | 53 | ### requestToBurn 54 | 55 | ```solidity 56 | function requestToBurn(uint256 amount) modifier onlyParticipant() public 57 | ``` 58 | 59 | Destrói a quantidade de Real Digital informada em _amount_ da própria carteira executora desta função 60 | 61 | #### Parameters 62 | 63 | | Name | Type | Description | 64 | | ---- | ---- | ----------- | 65 | | amount | uint256 | Quantidade a ser destruída (obs: lembrar das 2 casas decimais) | 66 | 67 | -------------------------------------------------------------------------------- /SwapOneStep.md: -------------------------------------------------------------------------------- 1 | # Solidity API 2 | 3 | ## SwapOneStep 4 | 5 | Este contrato implementa a troca de Real Tokenizado entre dois participantes distintos. 6 | 7 | A troca destrói Real Tokenizado do cliente pagador, 8 | transfere Real Digital do participante pagador para o participante recebedor 9 | e emite Real Tokenizado para o cliente recebedor. 10 | 11 | Todos os passos dessa operação de _swap_ são realizados em apenas uma transação. 12 | 13 | Este contrato parte da premissa que o participante pagador já aprovou a movimentação 14 | de Real Digital pelo contrato de _swap_ usando o método _approve_ do ERC20 15 | 16 | 17 | ### CBDC 18 | 19 | ```solidity 20 | contract RealDigital CBDC 21 | ``` 22 | 23 | Referência ao contrato para que seja efetuada a movimentação de Real Digital. 24 | 25 | 26 | ### SwapExecuted 27 | 28 | ```solidity 29 | event SwapExecuted(uint256 senderNumber, uint256 receiverNumber, address sender, address receiver, uint256 amount) 30 | ``` 31 | 32 | Evento de _swap_ executado. 33 | 34 | #### Parameters 35 | 36 | | Name | Type | Description | 37 | | ---- | ---- | ----------- | 38 | | senderNumber | uint256 | O CNPJ8 do pagador | 39 | | receiverNumber | uint256 | O CNPJ8 do recebedor | 40 | | sender | address | A carteira do pagador | 41 | | receiver | address | A carteira do recebedor | 42 | | amount | uint256 | O valor que foi movimentado | 43 | 44 | ### constructor 45 | 46 | ```solidity 47 | constructor(contract RealDigital _CBDC) public 48 | ``` 49 | 50 | Constrói uma instância do contrato e armazena o endereço do contrato do Real Digital. 51 | 52 | #### Parameters 53 | 54 | | Name | Type | Description | 55 | | ---- | ---- | ----------- | 56 | | _CBDC | contract RealDigital | Endereço do contrato do Real Digital | 57 | 58 | 59 | 60 | ### executeSwap 61 | 62 | ```solidity 63 | function executeSwap(contract RealTokenizado tokenSender, contract RealTokenizado tokenReceiver, address receiver, uint256 amount) public 64 | ``` 65 | 66 | Transfere o Real Tokenizado do cliente pagador para o recebedor. O cliente pagador é identificado pela carteira que estiver executando esta função. 67 | 68 | #### Parameters 69 | 70 | | Name | Type | Description | 71 | | ---- | ---- | ----------- | 72 | | tokenSender | contract RealTokenizado | O endereço do contrato de Real Tokenizado do participante pagador | 73 | | tokenReceiver | contract RealTokenizado | O endereço do contrato de Real Tokenizado do participante recebedor | 74 | | receiver | address | O endereço do cliente recebedor | 75 | | amount | uint256 | O valor a ser movimentado | 76 | 77 | -------------------------------------------------------------------------------- /SwapTwoSteps.md: -------------------------------------------------------------------------------- 1 | # Solidity API 2 | 3 | ## SwapTwoSteps 4 | 5 | Este contrato implementa a troca de Real Tokenizado entre dois participantes distintos. 6 | 7 | A troca destrói Real Tokenizado do cliente pagador, transfere Real Digital do participante pagador para o participante recebedor e emite Real Tokenizado para o cliente recebedor. 8 | 9 | A operação de _swap_ implementada neste contrato é realizada em duas transações: uma de proposta e outra de aceite. 10 | 11 | Este contrato parte da premissa que o participante pagador já aprovou a movimentação 12 | de Real Digital pelo contrato usando o método _approve_ do ERC20 13 | 14 | ### CBDC 15 | 16 | ```solidity 17 | contract RealDigital CBDC 18 | ``` 19 | 20 | Referência ao contrato para que seja efetuada a movimentação de Real Digital. 21 | 22 | ### SwapStatus 23 | 24 | ```solidity 25 | enum SwapStatus { 26 | PENDING, // Operação de _swap_ registrada, pendente de cancelamento ou execução. 27 | EXECUTED, // Operação de _swap_ executada. 28 | CANCELLED // Operação de _swap_ cancelada. 29 | } 30 | ``` 31 | 32 | Enumeração com as possíveis situações de uma operação de _swap_. 33 | 34 | ### SwapProposal 35 | 36 | ```solidity 37 | struct SwapProposal { 38 | contract RealTokenizado tokenSender; // O endereço do contrato de Real Tokenizado do participante pagador 39 | contract RealTokenizado tokenReceiver; // O endereço do contrato de Real Tokenizado do participante recebedor 40 | address sender; // O endereço da wallet do cliente pagador 41 | address receiver; // O endereço da wallet do cliente recebedor 42 | uint256 amount; // Quantidade de Reais a ser movimentada. 43 | enum SwapTwoSteps.SwapStatus status; // Situação atual da operação. 44 | uint256 timestamp; 45 | } 46 | ``` 47 | 48 | ### swapProposals 49 | 50 | ```solidity 51 | mapping(uint256 => struct SwapTwoSteps.SwapProposal) swapProposals 52 | ``` 53 | 54 | _Mapping_ de propostas de _swap_. 55 | 56 | ### SwapStarted 57 | 58 | ```solidity 59 | event SwapStarted(uint256 proposalId, uint256 senderNumber, uint256 receiverNumber, address sender, address receiver, uint256 amount) 60 | ``` 61 | 62 | Evento de início do _swap_. 63 | 64 | #### Parameters 65 | 66 | | Name | Type | Description | 67 | | ---- | ---- | ----------- | 68 | | proposalId | uint256 | Id da proposta | 69 | | senderNumber | uint256 | CNPJ8 do pagador | 70 | | receiverNumber | uint256 | CNPJ8 do recebedor | 71 | | sender | address | Endereço do pagador | 72 | | receiver | address | Endereço do recebedor | 73 | | amount | uint256 | Valor | 74 | 75 | ### SwapExecuted 76 | 77 | ```solidity 78 | event SwapExecuted(uint256 proposalId, uint256 senderNumber, uint256 receiverNumber, address sender, address receiver, uint256 amount) 79 | ``` 80 | 81 | Evento de _swap_ executado. 82 | 83 | #### Parameters 84 | 85 | | Name | Type | Description | 86 | | ---- | ---- | ----------- | 87 | | proposalId | uint256 | Id da proposta | 88 | | senderNumber | uint256 | CNPJ8 do pagador | 89 | | receiverNumber | uint256 | CNPJ8 do recebedor | 90 | | sender | address | Endereço do pagador | 91 | | receiver | address | Endereço do recebedor | 92 | | amount | uint256 | Valor | 93 | 94 | ### SwapCancelled 95 | 96 | ```solidity 97 | event SwapCancelled(uint256 proposalId, string reason) 98 | ``` 99 | 100 | Evento de _swap_ cancelado. 101 | 102 | #### Parameters 103 | 104 | | Name | Type | Description | 105 | | ---- | ---- | ----------- | 106 | | proposalId | uint256 | Id da proposta | 107 | | reason | string | Razão do cancelamento | 108 | 109 | ### ExpiredProposal 110 | 111 | ```solidity 112 | event ExpiredProposal(uint256 proposalId) 113 | ``` 114 | 115 | Evento de proposta expirada. A proposta expira em 1 minuto. 116 | 117 | #### Parameters 118 | 119 | | Name | Type | Description | 120 | | ---- | ---- | ----------- | 121 | | proposalId | uint256 | Id da proposta | 122 | 123 | ### constructor 124 | 125 | ```solidity 126 | constructor(contract RealDigital _CBDC) public 127 | ``` 128 | 129 | Construtor 130 | 131 | #### Parameters 132 | 133 | | Name | Type | Description | 134 | | ---- | ---- | ----------- | 135 | | _CBDC | contract RealDigital | Endereço do contrato do Real Digital | 136 | 137 | ### startSwap 138 | 139 | ```solidity 140 | function startSwap(contract RealTokenizado tokenSender, contract RealTokenizado tokenReceiver, address receiver, uint256 amount) public 141 | ``` 142 | 143 | Cria a proposta de _swap_. 144 | 145 | #### Parameters 146 | 147 | | Name | Type | Description | 148 | | ---- | ---- | ----------- | 149 | | tokenSender | contract RealTokenizado | Endereço do contrato de Real Tokenizado do pagador | 150 | | tokenReceiver | contract RealTokenizado | Endereço do contrato de Real Tokenizado do recebedor | 151 | | receiver | address | Endereço do cliente recebedor | 152 | | amount | uint256 | Valor | 153 | 154 | ### executeSwap 155 | 156 | ```solidity 157 | function executeSwap(uint256 proposalId) public 158 | ``` 159 | 160 | Aceita a proposta de _swap_, executável apenas pelo recebedor. 161 | 162 | #### Parameters 163 | 164 | | Name | Type | Description | 165 | | ---- | ---- | ----------- | 166 | | proposalId | uint256 | Id da proposta | 167 | 168 | ### cancelSwap 169 | 170 | ```solidity 171 | function cancelSwap(uint256 proposalId, string reason) public 172 | ``` 173 | 174 | Cancela a proposta. Pode ser executada tanto pelo pagador quanto pelo recebedor. 175 | 176 | #### Parameters 177 | 178 | | Name | Type | Description | 179 | | ---- | ---- | ----------- | 180 | | proposalId | uint256 | Id da proposta | 181 | | reason | string | Razão do cancelamento | 182 | 183 | -------------------------------------------------------------------------------- /SwapTwoStepsReserve.md: -------------------------------------------------------------------------------- 1 | # Solidity API 2 | 3 | ## SwapTwoStepsReserve 4 | 5 | Este contrato implementa a troca de Real Tokenizado entre dois participantes distintos. 6 | 7 | A troca destrói Real Tokenizado do cliente pagador, transfere Real Digital do participante pagador para o participante recebedor e emite Real Tokenizado para o cliente recebedor. 8 | 9 | A operação de _swap_ implementada neste contrato é realizada em duas transações: uma de proposta e outra de aceite. 10 | 11 | Este contrato parte da premissa que o participante pagador já aprovou a movimentação 12 | de Real Digital pelo contrato usando o método _approve_ do ERC20 13 | 14 | A diferença desse contrato para o _SwapTwoSteps_ é que neste o Real Digital fica em 15 | posse do contrato até o _swap_ ser concluído. 16 | 17 | ### CBDC 18 | 19 | ```solidity 20 | contract RealDigital CBDC 21 | ``` 22 | 23 | Referência ao contrato para que seja efetuada a movimentação de Real Digital. 24 | 25 | ### SwapStatus 26 | 27 | ```solidity 28 | enum SwapStatus { 29 | PENDING, // Operação de _swap_ registrada, pendente de cancelamento ou execução. 30 | EXECUTED, // Operação de _swap_ executada. 31 | CANCELLED // Operação de _swap_ cancelada. 32 | } 33 | ``` 34 | 35 | Enumeração com as possíveis situações de uma operação de _swap_. 36 | 37 | ### SwapProposal 38 | 39 | ```solidity 40 | struct SwapProposal { 41 | contract RealTokenizado tokenSender; // O endereço do contrato de Real Tokenizado do participante pagador 42 | contract RealTokenizado tokenReceiver; // O endereço do contrato de Real Tokenizado do participante recebedor 43 | address sender; // O endereço da wallet do cliente pagador 44 | address receiver; // O endereço da wallet do cliente recebedor 45 | uint256 amount; // Quantidade de Reais a ser movimentada. 46 | enum SwapTwoSteps.SwapStatus status; // Situação atual da operação. 47 | uint256 timestamp; 48 | } 49 | ``` 50 | 51 | ### swapProposals 52 | 53 | ```solidity 54 | mapping(uint256 => struct SwapTwoSteps.SwapProposal) swapProposals 55 | ``` 56 | 57 | _Mapping_ de propostas de _swap_. 58 | 59 | ### SwapStarted 60 | 61 | ```solidity 62 | event SwapStarted(uint256 proposalId, uint256 senderNumber, uint256 receiverNumber, address sender, address receiver, uint256 amount) 63 | ``` 64 | 65 | Evento de início do _swap_. 66 | 67 | #### Parameters 68 | 69 | | Name | Type | Description | 70 | | ---- | ---- | ----------- | 71 | | proposalId | uint256 | Id da proposta | 72 | | senderNumber | uint256 | CNPJ8 do pagador | 73 | | receiverNumber | uint256 | CNPJ8 do recebedor | 74 | | sender | address | Endereço do pagador | 75 | | receiver | address | Endereço do recebedor | 76 | | amount | uint256 | Valor | 77 | 78 | ### SwapExecuted 79 | 80 | ```solidity 81 | event SwapExecuted(uint256 proposalId, uint256 senderNumber, uint256 receiverNumber, address sender, address receiver, uint256 amount) 82 | ``` 83 | 84 | Evento de _swap_ executado. 85 | 86 | #### Parameters 87 | 88 | | Name | Type | Description | 89 | | ---- | ---- | ----------- | 90 | | proposalId | uint256 | Id da proposta | 91 | | senderNumber | uint256 | CNPJ8 do pagador | 92 | | receiverNumber | uint256 | CNPJ8 do recebedor | 93 | | sender | address | Endereço do pagador | 94 | | receiver | address | Endereço do recebedor | 95 | | amount | uint256 | Valor | 96 | 97 | ### SwapCancelled 98 | 99 | ```solidity 100 | event SwapCancelled(uint256 proposalId, string reason) 101 | ``` 102 | 103 | Evento de _swap_ cancelado. 104 | 105 | #### Parameters 106 | 107 | | Name | Type | Description | 108 | | ---- | ---- | ----------- | 109 | | proposalId | uint256 | Id da proposta | 110 | | reason | string | Razão do cancelamento | 111 | 112 | ### ExpiredProposal 113 | 114 | ```solidity 115 | event ExpiredProposal(uint256 proposalId) 116 | ``` 117 | 118 | Evento de proposta expirada. A proposta expira em 1 minuto. 119 | 120 | #### Parameters 121 | 122 | | Name | Type | Description | 123 | | ---- | ---- | ----------- | 124 | | proposalId | uint256 | Id da proposta | 125 | 126 | ### constructor 127 | 128 | ```solidity 129 | constructor(contract RealDigital _CBDC) public 130 | ``` 131 | 132 | Construtor 133 | 134 | #### Parameters 135 | 136 | | Name | Type | Description | 137 | | ---- | ---- | ----------- | 138 | | _CBDC | contract RealDigital | Endereço do contrato do Real Digital | 139 | 140 | ### startSwap 141 | 142 | ```solidity 143 | function startSwap(contract RealTokenizado tokenSender, contract RealTokenizado tokenReceiver, address receiver, uint256 amount) public 144 | ``` 145 | 146 | Cria a proposta de _swap_. 147 | 148 | #### Parameters 149 | 150 | | Name | Type | Description | 151 | | ---- | ---- | ----------- | 152 | | tokenSender | contract RealTokenizado | Endereço do contrato de Real Tokenizado do pagador | 153 | | tokenReceiver | contract RealTokenizado | Endereço do contrato de Real Tokenizado do recebedor | 154 | | receiver | address | Endereço do cliente recebedor | 155 | | amount | uint256 | Valor | 156 | 157 | ### executeSwap 158 | 159 | ```solidity 160 | function executeSwap(uint256 proposalId) public 161 | ``` 162 | 163 | Aceita a proposta de _swap_, executável apenas pelo recebedor. 164 | 165 | #### Parameters 166 | 167 | | Name | Type | Description | 168 | | ---- | ---- | ----------- | 169 | | proposalId | uint256 | Id da proposta | 170 | 171 | ### cancelSwap 172 | 173 | ```solidity 174 | function cancelSwap(uint256 proposalId, string reason) public 175 | ``` 176 | 177 | Cancela a proposta. Pode ser executada tanto pelo pagador quanto pelo recebedor. 178 | 179 | #### Parameters 180 | 181 | | Name | Type | Description | 182 | | ---- | ---- | ----------- | 183 | | proposalId | uint256 | Id da proposta | 184 | | reason | string | Razão do cancelamento | 185 | 186 | -------------------------------------------------------------------------------- /TPFtAccessControl.md: -------------------------------------------------------------------------------- 1 | # Solidity API 2 | 3 | ## TPFtAccessControl 4 | 5 | _Smart Contract_ responsável pela camada de controle de acesso para as operações envolvendo Título Público Federal tokenizado (TPFt). 6 | 7 | Suas principais funcionalidades são: 8 | - Determinar quais carteiras podem criar e emitir TPFt, 9 | - Controlar quais carteiras tem acesso as operações envolvendo TPFt. 10 | 11 | ### MINTER_ROLE 12 | 13 | ```solidity 14 | bytes32 MINTER_ROLE 15 | ``` 16 | 17 | _Role_ que permite criar e emitir TPFt. 18 | 19 | ### DIRECT_PLACEMENT_ROLE 20 | 21 | ```solidity 22 | bytes32 DIRECT_PLACEMENT_ROLE 23 | ``` 24 | 25 | _Role_ que permite realizar a operação de colocação direta. 26 | 27 | ### AUCTION_PLACEMENT_ROLE 28 | 29 | ```solidity 30 | bytes32 AUCTION_PLACEMENT_ROLE 31 | ``` 32 | 33 | _Role_ que permite realizar a liquidação de oferta pública. 34 | 35 | ### FREEZER_ROLE 36 | 37 | ```solidity 38 | bytes32 FREEZER_ROLE 39 | ``` 40 | 41 | _Role_ que permite bloquear saldo de uma carteira. 42 | 43 | ### constructor 44 | 45 | ```solidity 46 | constructor() public 47 | ``` 48 | 49 | Constrói uma instância do contrato e permite a carteira conceder ou revogar 50 | as roles para os participantes. 51 | 52 | ### allowTPFtMint 53 | 54 | ```solidity 55 | function allowTPFtMint(address member) public 56 | ``` 57 | 58 | Habilita a carteira a criar e emitir TPFt. 59 | 60 | #### Parameters 61 | 62 | | Name | Type | Description | 63 | | ---- | ---- | ----------- | 64 | | member | address | Carteira a ser habilitada | 65 | 66 | ### allowDirectPlacement 67 | 68 | ```solidity 69 | function allowDirectPlacement(address member) public 70 | ``` 71 | 72 | Habilita a carteira a realizar a operação de colocação direta envolvendo TPFt. 73 | 74 | #### Parameters 75 | 76 | | Name | Type | Description | 77 | | ---- | ---- | ----------- | 78 | | member | address | Carteira a ser habilitada | 79 | 80 | ### allowAuctionPlacement 81 | 82 | ```solidity 83 | function allowAuctionPlacement(address member) public 84 | ``` 85 | 86 | Habilita a carteira a realizar a liquidação de oferta pública envolvendo TPFt. 87 | 88 | #### Parameters 89 | 90 | | Name | Type | Description | 91 | | ---- | ---- | ----------- | 92 | | member | address | Carteira a ser habilitada | 93 | 94 | ### allowFreezingPlacement 95 | 96 | ```solidity 97 | function allowFreezingPlacement(address member) public 98 | ``` 99 | 100 | Habilita a carteira a bloquear e desbloquear saldo de ativos. 101 | 102 | #### Parameters 103 | 104 | | Name | Type | Description | 105 | | ---- | ---- | ----------- | 106 | | member | address | Carteira a ser habilitada | 107 | 108 | ### enableAddress 109 | 110 | ```solidity 111 | function enableAddress(address member) public 112 | ``` 113 | 114 | Habilita a carteira a operar no piloto Real Digital Selic. 115 | 116 | #### Parameters 117 | 118 | | Name | Type | Description | 119 | | ---- | ---- | ----------- | 120 | | member | address | Carteira a ser habilitada | 121 | 122 | ### disableAddress 123 | 124 | ```solidity 125 | function disableAddress(address member) public 126 | ``` 127 | 128 | Desabilita a carteira a operar no piloto Real Digital Selic. 129 | 130 | #### Parameters 131 | 132 | | Name | Type | Description | 133 | | ---- | ---- | ----------- | 134 | | member | address | Carteira a ser desabilita | 135 | 136 | ### isEnabledAddress 137 | 138 | ```solidity 139 | function isEnabledAddress(address member) public view returns (bool) 140 | ``` 141 | 142 | Verifica se a carteira está habilitada a operar no piloto Real Digital Selic. 143 | 144 | #### Parameters 145 | 146 | | Name | Type | Description | 147 | | ---- | ---- | ----------- | 148 | | member | address | Carteira a ser verificada | 149 | 150 | #### Return Values 151 | 152 | | Name | Type | Description | 153 | | ---- | ---- | ----------- | 154 | | [0] | bool | Retorna um valor booleano que indica se a carteira está habilitada a operar no piloto Real Digital Selic. | 155 | 156 | -------------------------------------------------------------------------------- /abi/AddressDiscovery.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "inputs": [ 4 | { 5 | "internalType": "address", 6 | "name": "_authority", 7 | "type": "address" 8 | } 9 | ], 10 | "stateMutability": "nonpayable", 11 | "type": "constructor" 12 | }, 13 | { 14 | "anonymous": false, 15 | "inputs": [ 16 | { 17 | "indexed": true, 18 | "internalType": "bytes32", 19 | "name": "role", 20 | "type": "bytes32" 21 | }, 22 | { 23 | "indexed": true, 24 | "internalType": "bytes32", 25 | "name": "previousAdminRole", 26 | "type": "bytes32" 27 | }, 28 | { 29 | "indexed": true, 30 | "internalType": "bytes32", 31 | "name": "newAdminRole", 32 | "type": "bytes32" 33 | } 34 | ], 35 | "name": "RoleAdminChanged", 36 | "type": "event" 37 | }, 38 | { 39 | "anonymous": false, 40 | "inputs": [ 41 | { 42 | "indexed": true, 43 | "internalType": "bytes32", 44 | "name": "role", 45 | "type": "bytes32" 46 | }, 47 | { 48 | "indexed": true, 49 | "internalType": "address", 50 | "name": "account", 51 | "type": "address" 52 | }, 53 | { 54 | "indexed": true, 55 | "internalType": "address", 56 | "name": "sender", 57 | "type": "address" 58 | } 59 | ], 60 | "name": "RoleGranted", 61 | "type": "event" 62 | }, 63 | { 64 | "anonymous": false, 65 | "inputs": [ 66 | { 67 | "indexed": true, 68 | "internalType": "bytes32", 69 | "name": "role", 70 | "type": "bytes32" 71 | }, 72 | { 73 | "indexed": true, 74 | "internalType": "address", 75 | "name": "account", 76 | "type": "address" 77 | }, 78 | { 79 | "indexed": true, 80 | "internalType": "address", 81 | "name": "sender", 82 | "type": "address" 83 | } 84 | ], 85 | "name": "RoleRevoked", 86 | "type": "event" 87 | }, 88 | { 89 | "inputs": [], 90 | "name": "ACCESS_ROLE", 91 | "outputs": [ 92 | { 93 | "internalType": "bytes32", 94 | "name": "", 95 | "type": "bytes32" 96 | } 97 | ], 98 | "stateMutability": "view", 99 | "type": "function" 100 | }, 101 | { 102 | "inputs": [], 103 | "name": "DEFAULT_ADMIN_ROLE", 104 | "outputs": [ 105 | { 106 | "internalType": "bytes32", 107 | "name": "", 108 | "type": "bytes32" 109 | } 110 | ], 111 | "stateMutability": "view", 112 | "type": "function" 113 | }, 114 | { 115 | "inputs": [ 116 | { 117 | "internalType": "bytes32", 118 | "name": "", 119 | "type": "bytes32" 120 | } 121 | ], 122 | "name": "addressDiscovery", 123 | "outputs": [ 124 | { 125 | "internalType": "address", 126 | "name": "", 127 | "type": "address" 128 | } 129 | ], 130 | "stateMutability": "view", 131 | "type": "function" 132 | }, 133 | { 134 | "inputs": [ 135 | { 136 | "internalType": "bytes32", 137 | "name": "role", 138 | "type": "bytes32" 139 | } 140 | ], 141 | "name": "getRoleAdmin", 142 | "outputs": [ 143 | { 144 | "internalType": "bytes32", 145 | "name": "", 146 | "type": "bytes32" 147 | } 148 | ], 149 | "stateMutability": "view", 150 | "type": "function" 151 | }, 152 | { 153 | "inputs": [ 154 | { 155 | "internalType": "bytes32", 156 | "name": "role", 157 | "type": "bytes32" 158 | }, 159 | { 160 | "internalType": "address", 161 | "name": "account", 162 | "type": "address" 163 | } 164 | ], 165 | "name": "grantRole", 166 | "outputs": [], 167 | "stateMutability": "nonpayable", 168 | "type": "function" 169 | }, 170 | { 171 | "inputs": [ 172 | { 173 | "internalType": "bytes32", 174 | "name": "role", 175 | "type": "bytes32" 176 | }, 177 | { 178 | "internalType": "address", 179 | "name": "account", 180 | "type": "address" 181 | } 182 | ], 183 | "name": "hasRole", 184 | "outputs": [ 185 | { 186 | "internalType": "bool", 187 | "name": "", 188 | "type": "bool" 189 | } 190 | ], 191 | "stateMutability": "view", 192 | "type": "function" 193 | }, 194 | { 195 | "inputs": [ 196 | { 197 | "internalType": "bytes32", 198 | "name": "role", 199 | "type": "bytes32" 200 | }, 201 | { 202 | "internalType": "address", 203 | "name": "account", 204 | "type": "address" 205 | } 206 | ], 207 | "name": "renounceRole", 208 | "outputs": [], 209 | "stateMutability": "nonpayable", 210 | "type": "function" 211 | }, 212 | { 213 | "inputs": [ 214 | { 215 | "internalType": "bytes32", 216 | "name": "role", 217 | "type": "bytes32" 218 | }, 219 | { 220 | "internalType": "address", 221 | "name": "account", 222 | "type": "address" 223 | } 224 | ], 225 | "name": "revokeRole", 226 | "outputs": [], 227 | "stateMutability": "nonpayable", 228 | "type": "function" 229 | }, 230 | { 231 | "inputs": [ 232 | { 233 | "internalType": "bytes4", 234 | "name": "interfaceId", 235 | "type": "bytes4" 236 | } 237 | ], 238 | "name": "supportsInterface", 239 | "outputs": [ 240 | { 241 | "internalType": "bool", 242 | "name": "", 243 | "type": "bool" 244 | } 245 | ], 246 | "stateMutability": "view", 247 | "type": "function" 248 | }, 249 | { 250 | "inputs": [ 251 | { 252 | "internalType": "bytes32", 253 | "name": "smartContract", 254 | "type": "bytes32" 255 | }, 256 | { 257 | "internalType": "address", 258 | "name": "newAddress", 259 | "type": "address" 260 | } 261 | ], 262 | "name": "updateAddress", 263 | "outputs": [], 264 | "stateMutability": "nonpayable", 265 | "type": "function" 266 | } 267 | ] 268 | -------------------------------------------------------------------------------- /abi/ApprovedDigitalCurrency.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "inputs": [ 4 | { 5 | "internalType": "address", 6 | "name": "_authority", 7 | "type": "address" 8 | }, 9 | { 10 | "internalType": "address", 11 | "name": "_admin", 12 | "type": "address" 13 | } 14 | ], 15 | "stateMutability": "nonpayable", 16 | "type": "constructor" 17 | }, 18 | { 19 | "anonymous": false, 20 | "inputs": [ 21 | { 22 | "indexed": true, 23 | "internalType": "bytes32", 24 | "name": "role", 25 | "type": "bytes32" 26 | }, 27 | { 28 | "indexed": true, 29 | "internalType": "bytes32", 30 | "name": "previousAdminRole", 31 | "type": "bytes32" 32 | }, 33 | { 34 | "indexed": true, 35 | "internalType": "bytes32", 36 | "name": "newAdminRole", 37 | "type": "bytes32" 38 | } 39 | ], 40 | "name": "RoleAdminChanged", 41 | "type": "event" 42 | }, 43 | { 44 | "anonymous": false, 45 | "inputs": [ 46 | { 47 | "indexed": true, 48 | "internalType": "bytes32", 49 | "name": "role", 50 | "type": "bytes32" 51 | }, 52 | { 53 | "indexed": true, 54 | "internalType": "address", 55 | "name": "account", 56 | "type": "address" 57 | }, 58 | { 59 | "indexed": true, 60 | "internalType": "address", 61 | "name": "sender", 62 | "type": "address" 63 | } 64 | ], 65 | "name": "RoleGranted", 66 | "type": "event" 67 | }, 68 | { 69 | "anonymous": false, 70 | "inputs": [ 71 | { 72 | "indexed": true, 73 | "internalType": "bytes32", 74 | "name": "role", 75 | "type": "bytes32" 76 | }, 77 | { 78 | "indexed": true, 79 | "internalType": "address", 80 | "name": "account", 81 | "type": "address" 82 | }, 83 | { 84 | "indexed": true, 85 | "internalType": "address", 86 | "name": "sender", 87 | "type": "address" 88 | } 89 | ], 90 | "name": "RoleRevoked", 91 | "type": "event" 92 | }, 93 | { 94 | "inputs": [], 95 | "name": "ACCESS_ROLE", 96 | "outputs": [ 97 | { 98 | "internalType": "bytes32", 99 | "name": "", 100 | "type": "bytes32" 101 | } 102 | ], 103 | "stateMutability": "view", 104 | "type": "function" 105 | }, 106 | { 107 | "inputs": [], 108 | "name": "DEFAULT_ADMIN_ROLE", 109 | "outputs": [ 110 | { 111 | "internalType": "bytes32", 112 | "name": "", 113 | "type": "bytes32" 114 | } 115 | ], 116 | "stateMutability": "view", 117 | "type": "function" 118 | }, 119 | { 120 | "inputs": [ 121 | { 122 | "internalType": "bytes32", 123 | "name": "role", 124 | "type": "bytes32" 125 | } 126 | ], 127 | "name": "getRoleAdmin", 128 | "outputs": [ 129 | { 130 | "internalType": "bytes32", 131 | "name": "", 132 | "type": "bytes32" 133 | } 134 | ], 135 | "stateMutability": "view", 136 | "type": "function" 137 | }, 138 | { 139 | "inputs": [ 140 | { 141 | "internalType": "bytes32", 142 | "name": "role", 143 | "type": "bytes32" 144 | }, 145 | { 146 | "internalType": "address", 147 | "name": "account", 148 | "type": "address" 149 | } 150 | ], 151 | "name": "grantRole", 152 | "outputs": [], 153 | "stateMutability": "nonpayable", 154 | "type": "function" 155 | }, 156 | { 157 | "inputs": [ 158 | { 159 | "internalType": "bytes32", 160 | "name": "role", 161 | "type": "bytes32" 162 | }, 163 | { 164 | "internalType": "address", 165 | "name": "account", 166 | "type": "address" 167 | } 168 | ], 169 | "name": "hasRole", 170 | "outputs": [ 171 | { 172 | "internalType": "bool", 173 | "name": "", 174 | "type": "bool" 175 | } 176 | ], 177 | "stateMutability": "view", 178 | "type": "function" 179 | }, 180 | { 181 | "inputs": [ 182 | { 183 | "internalType": "bytes32", 184 | "name": "role", 185 | "type": "bytes32" 186 | }, 187 | { 188 | "internalType": "address", 189 | "name": "account", 190 | "type": "address" 191 | } 192 | ], 193 | "name": "renounceRole", 194 | "outputs": [], 195 | "stateMutability": "nonpayable", 196 | "type": "function" 197 | }, 198 | { 199 | "inputs": [ 200 | { 201 | "internalType": "bytes32", 202 | "name": "role", 203 | "type": "bytes32" 204 | }, 205 | { 206 | "internalType": "address", 207 | "name": "account", 208 | "type": "address" 209 | } 210 | ], 211 | "name": "revokeRole", 212 | "outputs": [], 213 | "stateMutability": "nonpayable", 214 | "type": "function" 215 | }, 216 | { 217 | "inputs": [ 218 | { 219 | "internalType": "address", 220 | "name": "asset", 221 | "type": "address" 222 | }, 223 | { 224 | "internalType": "bool", 225 | "name": "approved", 226 | "type": "bool" 227 | } 228 | ], 229 | "name": "setDigitalCurrencyApproval", 230 | "outputs": [], 231 | "stateMutability": "nonpayable", 232 | "type": "function" 233 | }, 234 | { 235 | "inputs": [ 236 | { 237 | "internalType": "bytes4", 238 | "name": "interfaceId", 239 | "type": "bytes4" 240 | } 241 | ], 242 | "name": "supportsInterface", 243 | "outputs": [ 244 | { 245 | "internalType": "bool", 246 | "name": "", 247 | "type": "bool" 248 | } 249 | ], 250 | "stateMutability": "view", 251 | "type": "function" 252 | } 253 | ] -------------------------------------------------------------------------------- /abi/ITPFtOperation1002.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "anonymous": false, 4 | "inputs": [ 5 | { 6 | "indexed": false, 7 | "internalType": "uint256", 8 | "name": "operationId", 9 | "type": "uint256" 10 | }, 11 | { 12 | "indexed": false, 13 | "internalType": "uint256", 14 | "name": "cnpj8Sender", 15 | "type": "uint256" 16 | }, 17 | { 18 | "indexed": false, 19 | "internalType": "uint256", 20 | "name": "cnpj8Receiver", 21 | "type": "uint256" 22 | }, 23 | { 24 | "indexed": false, 25 | "internalType": "address", 26 | "name": "sender", 27 | "type": "address" 28 | }, 29 | { 30 | "indexed": false, 31 | "internalType": "address", 32 | "name": "receiver", 33 | "type": "address" 34 | }, 35 | { 36 | "indexed": false, 37 | "internalType": "enum ITPFtOperation.CallerPart", 38 | "name": "callerPart", 39 | "type": "uint8" 40 | }, 41 | { 42 | "components": [ 43 | { 44 | "internalType": "string", 45 | "name": "acronym", 46 | "type": "string" 47 | }, 48 | { 49 | "internalType": "string", 50 | "name": "code", 51 | "type": "string" 52 | }, 53 | { 54 | "internalType": "uint256", 55 | "name": "maturityDate", 56 | "type": "uint256" 57 | } 58 | ], 59 | "indexed": false, 60 | "internalType": "struct ITPFt.TPFtData", 61 | "name": "tpftData", 62 | "type": "tuple" 63 | }, 64 | { 65 | "indexed": false, 66 | "internalType": "uint256", 67 | "name": "tpftAmount", 68 | "type": "uint256" 69 | }, 70 | { 71 | "indexed": false, 72 | "internalType": "uint256", 73 | "name": "unitPrice", 74 | "type": "uint256" 75 | }, 76 | { 77 | "indexed": false, 78 | "internalType": "uint256", 79 | "name": "financialValue", 80 | "type": "uint256" 81 | }, 82 | { 83 | "indexed": false, 84 | "internalType": "string", 85 | "name": "status", 86 | "type": "string" 87 | }, 88 | { 89 | "indexed": false, 90 | "internalType": "uint256", 91 | "name": "timestamp", 92 | "type": "uint256" 93 | } 94 | ], 95 | "name": "CommandEvent", 96 | "type": "event" 97 | }, 98 | { 99 | "anonymous": false, 100 | "inputs": [ 101 | { 102 | "indexed": false, 103 | "internalType": "uint256", 104 | "name": "operationId", 105 | "type": "uint256" 106 | }, 107 | { 108 | "indexed": false, 109 | "internalType": "address", 110 | "name": "sender", 111 | "type": "address" 112 | }, 113 | { 114 | "indexed": false, 115 | "internalType": "address", 116 | "name": "receiver", 117 | "type": "address" 118 | }, 119 | { 120 | "indexed": false, 121 | "internalType": "enum ITPFtOperation.CallerPart", 122 | "name": "callerPart", 123 | "type": "uint8" 124 | }, 125 | { 126 | "components": [ 127 | { 128 | "internalType": "string", 129 | "name": "acronym", 130 | "type": "string" 131 | }, 132 | { 133 | "internalType": "string", 134 | "name": "code", 135 | "type": "string" 136 | }, 137 | { 138 | "internalType": "uint256", 139 | "name": "maturityDate", 140 | "type": "uint256" 141 | } 142 | ], 143 | "indexed": false, 144 | "internalType": "struct ITPFt.TPFtData", 145 | "name": "tpftData", 146 | "type": "tuple" 147 | }, 148 | { 149 | "indexed": false, 150 | "internalType": "uint256", 151 | "name": "tpftAmount", 152 | "type": "uint256" 153 | }, 154 | { 155 | "indexed": false, 156 | "internalType": "uint256", 157 | "name": "unitPrice", 158 | "type": "uint256" 159 | }, 160 | { 161 | "indexed": false, 162 | "internalType": "uint256", 163 | "name": "financialValue", 164 | "type": "uint256" 165 | }, 166 | { 167 | "indexed": false, 168 | "internalType": "string", 169 | "name": "status", 170 | "type": "string" 171 | }, 172 | { 173 | "indexed": false, 174 | "internalType": "uint256", 175 | "name": "timestamp", 176 | "type": "uint256" 177 | } 178 | ], 179 | "name": "CommandTradeEvent", 180 | "type": "event" 181 | }, 182 | { 183 | "anonymous": false, 184 | "inputs": [ 185 | { 186 | "indexed": false, 187 | "internalType": "uint256", 188 | "name": "operationId", 189 | "type": "uint256" 190 | }, 191 | { 192 | "indexed": false, 193 | "internalType": "uint256", 194 | "name": "cnpj8Sender", 195 | "type": "uint256" 196 | }, 197 | { 198 | "indexed": false, 199 | "internalType": "uint256", 200 | "name": "cnpj8Receiver", 201 | "type": "uint256" 202 | }, 203 | { 204 | "indexed": false, 205 | "internalType": "address", 206 | "name": "sender", 207 | "type": "address" 208 | }, 209 | { 210 | "indexed": false, 211 | "internalType": "address", 212 | "name": "receiver", 213 | "type": "address" 214 | }, 215 | { 216 | "components": [ 217 | { 218 | "internalType": "string", 219 | "name": "acronym", 220 | "type": "string" 221 | }, 222 | { 223 | "internalType": "string", 224 | "name": "code", 225 | "type": "string" 226 | }, 227 | { 228 | "internalType": "uint256", 229 | "name": "maturityDate", 230 | "type": "uint256" 231 | } 232 | ], 233 | "indexed": false, 234 | "internalType": "struct ITPFt.TPFtData", 235 | "name": "tpftData", 236 | "type": "tuple" 237 | }, 238 | { 239 | "indexed": false, 240 | "internalType": "uint256", 241 | "name": "tpftAmount", 242 | "type": "uint256" 243 | }, 244 | { 245 | "indexed": false, 246 | "internalType": "uint256", 247 | "name": "unitPrice", 248 | "type": "uint256" 249 | }, 250 | { 251 | "indexed": false, 252 | "internalType": "uint256", 253 | "name": "financialValue", 254 | "type": "uint256" 255 | }, 256 | { 257 | "indexed": false, 258 | "internalType": "string", 259 | "name": "status", 260 | "type": "string" 261 | }, 262 | { 263 | "indexed": false, 264 | "internalType": "uint256", 265 | "name": "timestamp", 266 | "type": "uint256" 267 | } 268 | ], 269 | "name": "OperationEvent", 270 | "type": "event" 271 | }, 272 | { 273 | "anonymous": false, 274 | "inputs": [ 275 | { 276 | "indexed": false, 277 | "internalType": "uint256", 278 | "name": "operationId", 279 | "type": "uint256" 280 | }, 281 | { 282 | "indexed": false, 283 | "internalType": "address", 284 | "name": "sender", 285 | "type": "address" 286 | }, 287 | { 288 | "indexed": false, 289 | "internalType": "address", 290 | "name": "receiver", 291 | "type": "address" 292 | }, 293 | { 294 | "components": [ 295 | { 296 | "internalType": "string", 297 | "name": "acronym", 298 | "type": "string" 299 | }, 300 | { 301 | "internalType": "string", 302 | "name": "code", 303 | "type": "string" 304 | }, 305 | { 306 | "internalType": "uint256", 307 | "name": "maturityDate", 308 | "type": "uint256" 309 | } 310 | ], 311 | "indexed": false, 312 | "internalType": "struct ITPFt.TPFtData", 313 | "name": "tpftData", 314 | "type": "tuple" 315 | }, 316 | { 317 | "indexed": false, 318 | "internalType": "uint256", 319 | "name": "tpftAmount", 320 | "type": "uint256" 321 | }, 322 | { 323 | "indexed": false, 324 | "internalType": "uint256", 325 | "name": "unitPrice", 326 | "type": "uint256" 327 | }, 328 | { 329 | "indexed": false, 330 | "internalType": "uint256", 331 | "name": "financialValue", 332 | "type": "uint256" 333 | }, 334 | { 335 | "indexed": false, 336 | "internalType": "string", 337 | "name": "status", 338 | "type": "string" 339 | }, 340 | { 341 | "indexed": false, 342 | "internalType": "uint256", 343 | "name": "timestamp", 344 | "type": "uint256" 345 | } 346 | ], 347 | "name": "OperationTradeEvent", 348 | "type": "event" 349 | }, 350 | { 351 | "inputs": [ 352 | { 353 | "internalType": "uint256", 354 | "name": "operationId", 355 | "type": "uint256" 356 | }, 357 | { 358 | "internalType": "uint256", 359 | "name": "cnpj8Sender", 360 | "type": "uint256" 361 | }, 362 | { 363 | "internalType": "uint256", 364 | "name": "cnpj8Receiver", 365 | "type": "uint256" 366 | }, 367 | { 368 | "internalType": "enum ITPFtOperation.CallerPart", 369 | "name": "callerPart", 370 | "type": "uint8" 371 | }, 372 | { 373 | "components": [ 374 | { 375 | "internalType": "string", 376 | "name": "acronym", 377 | "type": "string" 378 | }, 379 | { 380 | "internalType": "string", 381 | "name": "code", 382 | "type": "string" 383 | }, 384 | { 385 | "internalType": "uint256", 386 | "name": "maturityDate", 387 | "type": "uint256" 388 | } 389 | ], 390 | "internalType": "struct ITPFt.TPFtData", 391 | "name": "tpftData", 392 | "type": "tuple" 393 | }, 394 | { 395 | "internalType": "uint256", 396 | "name": "tpftAmount", 397 | "type": "uint256" 398 | }, 399 | { 400 | "internalType": "uint256", 401 | "name": "unitPrice", 402 | "type": "uint256" 403 | } 404 | ], 405 | "name": "auctionPlacement", 406 | "outputs": [], 407 | "stateMutability": "nonpayable", 408 | "type": "function" 409 | } 410 | ] -------------------------------------------------------------------------------- /abi/ITPFtOperation1052.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "anonymous": false, 4 | "inputs": [ 5 | { 6 | "indexed": false, 7 | "internalType": "uint256", 8 | "name": "operationId", 9 | "type": "uint256" 10 | }, 11 | { 12 | "indexed": false, 13 | "internalType": "address", 14 | "name": "sender", 15 | "type": "address" 16 | }, 17 | { 18 | "indexed": false, 19 | "internalType": "contract RealTokenizado", 20 | "name": "senderToken", 21 | "type": "address" 22 | }, 23 | { 24 | "indexed": false, 25 | "internalType": "address", 26 | "name": "receiver", 27 | "type": "address" 28 | }, 29 | { 30 | "indexed": false, 31 | "internalType": "contract RealTokenizado", 32 | "name": "receiverToken", 33 | "type": "address" 34 | }, 35 | { 36 | "components": [ 37 | { 38 | "internalType": "string", 39 | "name": "acronym", 40 | "type": "string" 41 | }, 42 | { 43 | "internalType": "string", 44 | "name": "code", 45 | "type": "string" 46 | }, 47 | { 48 | "internalType": "uint256", 49 | "name": "maturityDate", 50 | "type": "uint256" 51 | } 52 | ], 53 | "indexed": false, 54 | "internalType": "struct ITPFt.TPFtData", 55 | "name": "tpftData", 56 | "type": "tuple" 57 | }, 58 | { 59 | "indexed": false, 60 | "internalType": "uint256", 61 | "name": "tpftAmount", 62 | "type": "uint256" 63 | }, 64 | { 65 | "indexed": false, 66 | "internalType": "uint256", 67 | "name": "unitPrice", 68 | "type": "uint256" 69 | }, 70 | { 71 | "indexed": false, 72 | "internalType": "uint256", 73 | "name": "financialValue", 74 | "type": "uint256" 75 | }, 76 | { 77 | "indexed": false, 78 | "internalType": "string", 79 | "name": "status", 80 | "type": "string" 81 | }, 82 | { 83 | "indexed": false, 84 | "internalType": "uint256", 85 | "name": "timestamp", 86 | "type": "uint256" 87 | } 88 | ], 89 | "name": "OperationClientTradeEvent", 90 | "type": "event" 91 | }, 92 | { 93 | "anonymous": false, 94 | "inputs": [ 95 | { 96 | "indexed": false, 97 | "internalType": "uint256", 98 | "name": "operationId", 99 | "type": "uint256" 100 | }, 101 | { 102 | "indexed": false, 103 | "internalType": "uint256", 104 | "name": "cnpj8Sender", 105 | "type": "uint256" 106 | }, 107 | { 108 | "indexed": false, 109 | "internalType": "uint256", 110 | "name": "cnpj8Receiver", 111 | "type": "uint256" 112 | }, 113 | { 114 | "indexed": false, 115 | "internalType": "address", 116 | "name": "sender", 117 | "type": "address" 118 | }, 119 | { 120 | "indexed": false, 121 | "internalType": "address", 122 | "name": "receiver", 123 | "type": "address" 124 | }, 125 | { 126 | "components": [ 127 | { 128 | "internalType": "string", 129 | "name": "acronym", 130 | "type": "string" 131 | }, 132 | { 133 | "internalType": "string", 134 | "name": "code", 135 | "type": "string" 136 | }, 137 | { 138 | "internalType": "uint256", 139 | "name": "maturityDate", 140 | "type": "uint256" 141 | } 142 | ], 143 | "indexed": false, 144 | "internalType": "struct ITPFt.TPFtData", 145 | "name": "tpftData", 146 | "type": "tuple" 147 | }, 148 | { 149 | "indexed": false, 150 | "internalType": "uint256", 151 | "name": "tpftAmount", 152 | "type": "uint256" 153 | }, 154 | { 155 | "indexed": false, 156 | "internalType": "uint256", 157 | "name": "unitPrice", 158 | "type": "uint256" 159 | }, 160 | { 161 | "indexed": false, 162 | "internalType": "uint256", 163 | "name": "financialValue", 164 | "type": "uint256" 165 | }, 166 | { 167 | "indexed": false, 168 | "internalType": "string", 169 | "name": "status", 170 | "type": "string" 171 | }, 172 | { 173 | "indexed": false, 174 | "internalType": "uint256", 175 | "name": "timestamp", 176 | "type": "uint256" 177 | } 178 | ], 179 | "name": "OperationEvent", 180 | "type": "event" 181 | }, 182 | { 183 | "anonymous": false, 184 | "inputs": [ 185 | { 186 | "indexed": false, 187 | "internalType": "uint256", 188 | "name": "operationId", 189 | "type": "uint256" 190 | }, 191 | { 192 | "indexed": false, 193 | "internalType": "address", 194 | "name": "sender", 195 | "type": "address" 196 | }, 197 | { 198 | "indexed": false, 199 | "internalType": "address", 200 | "name": "receiver", 201 | "type": "address" 202 | }, 203 | { 204 | "components": [ 205 | { 206 | "internalType": "string", 207 | "name": "acronym", 208 | "type": "string" 209 | }, 210 | { 211 | "internalType": "string", 212 | "name": "code", 213 | "type": "string" 214 | }, 215 | { 216 | "internalType": "uint256", 217 | "name": "maturityDate", 218 | "type": "uint256" 219 | } 220 | ], 221 | "indexed": false, 222 | "internalType": "struct ITPFt.TPFtData", 223 | "name": "tpftData", 224 | "type": "tuple" 225 | }, 226 | { 227 | "indexed": false, 228 | "internalType": "uint256", 229 | "name": "tpftAmount", 230 | "type": "uint256" 231 | }, 232 | { 233 | "indexed": false, 234 | "internalType": "uint256", 235 | "name": "unitPrice", 236 | "type": "uint256" 237 | }, 238 | { 239 | "indexed": false, 240 | "internalType": "uint256", 241 | "name": "financialValue", 242 | "type": "uint256" 243 | }, 244 | { 245 | "indexed": false, 246 | "internalType": "string", 247 | "name": "status", 248 | "type": "string" 249 | }, 250 | { 251 | "indexed": false, 252 | "internalType": "uint256", 253 | "name": "timestamp", 254 | "type": "uint256" 255 | } 256 | ], 257 | "name": "OperationTradeEvent", 258 | "type": "event" 259 | }, 260 | { 261 | "inputs": [ 262 | { 263 | "internalType": "uint256", 264 | "name": "operationId", 265 | "type": "uint256" 266 | }, 267 | { 268 | "internalType": "address", 269 | "name": "sender", 270 | "type": "address" 271 | }, 272 | { 273 | "internalType": "contract RealTokenizado", 274 | "name": "senderToken", 275 | "type": "address" 276 | }, 277 | { 278 | "internalType": "address", 279 | "name": "receiver", 280 | "type": "address" 281 | }, 282 | { 283 | "internalType": "contract RealTokenizado", 284 | "name": "receiverToken", 285 | "type": "address" 286 | }, 287 | { 288 | "internalType": "enum ITPFtOperation.CallerPart", 289 | "name": "callerPart", 290 | "type": "uint8" 291 | }, 292 | { 293 | "components": [ 294 | { 295 | "internalType": "string", 296 | "name": "acronym", 297 | "type": "string" 298 | }, 299 | { 300 | "internalType": "string", 301 | "name": "code", 302 | "type": "string" 303 | }, 304 | { 305 | "internalType": "uint256", 306 | "name": "maturityDate", 307 | "type": "uint256" 308 | } 309 | ], 310 | "internalType": "struct ITPFt.TPFtData", 311 | "name": "tpftData", 312 | "type": "tuple" 313 | }, 314 | { 315 | "internalType": "uint256", 316 | "name": "tpftAmount", 317 | "type": "uint256" 318 | }, 319 | { 320 | "internalType": "uint256", 321 | "name": "unitPrice", 322 | "type": "uint256" 323 | } 324 | ], 325 | "name": "trade", 326 | "outputs": [], 327 | "stateMutability": "nonpayable", 328 | "type": "function" 329 | }, 330 | { 331 | "inputs": [ 332 | { 333 | "internalType": "uint256", 334 | "name": "operationId", 335 | "type": "uint256" 336 | }, 337 | { 338 | "internalType": "uint256", 339 | "name": "cnpj8Sender", 340 | "type": "uint256" 341 | }, 342 | { 343 | "internalType": "uint256", 344 | "name": "cnpj8Receiver", 345 | "type": "uint256" 346 | }, 347 | { 348 | "internalType": "enum ITPFtOperation.CallerPart", 349 | "name": "callerPart", 350 | "type": "uint8" 351 | }, 352 | { 353 | "components": [ 354 | { 355 | "internalType": "string", 356 | "name": "acronym", 357 | "type": "string" 358 | }, 359 | { 360 | "internalType": "string", 361 | "name": "code", 362 | "type": "string" 363 | }, 364 | { 365 | "internalType": "uint256", 366 | "name": "maturityDate", 367 | "type": "uint256" 368 | } 369 | ], 370 | "internalType": "struct ITPFt.TPFtData", 371 | "name": "tpftData", 372 | "type": "tuple" 373 | }, 374 | { 375 | "internalType": "uint256", 376 | "name": "tpftAmount", 377 | "type": "uint256" 378 | }, 379 | { 380 | "internalType": "uint256", 381 | "name": "unitPrice", 382 | "type": "uint256" 383 | } 384 | ], 385 | "name": "trade", 386 | "outputs": [], 387 | "stateMutability": "nonpayable", 388 | "type": "function" 389 | }, 390 | { 391 | "inputs": [ 392 | { 393 | "internalType": "uint256", 394 | "name": "operationId", 395 | "type": "uint256" 396 | }, 397 | { 398 | "internalType": "address", 399 | "name": "sender", 400 | "type": "address" 401 | }, 402 | { 403 | "internalType": "address", 404 | "name": "receiver", 405 | "type": "address" 406 | }, 407 | { 408 | "internalType": "enum ITPFtOperation.CallerPart", 409 | "name": "callerPart", 410 | "type": "uint8" 411 | }, 412 | { 413 | "components": [ 414 | { 415 | "internalType": "string", 416 | "name": "acronym", 417 | "type": "string" 418 | }, 419 | { 420 | "internalType": "string", 421 | "name": "code", 422 | "type": "string" 423 | }, 424 | { 425 | "internalType": "uint256", 426 | "name": "maturityDate", 427 | "type": "uint256" 428 | } 429 | ], 430 | "internalType": "struct ITPFt.TPFtData", 431 | "name": "tpftData", 432 | "type": "tuple" 433 | }, 434 | { 435 | "internalType": "uint256", 436 | "name": "tpftAmount", 437 | "type": "uint256" 438 | }, 439 | { 440 | "internalType": "uint256", 441 | "name": "unitPrice", 442 | "type": "uint256" 443 | } 444 | ], 445 | "name": "trade", 446 | "outputs": [], 447 | "stateMutability": "nonpayable", 448 | "type": "function" 449 | } 450 | ] 451 | -------------------------------------------------------------------------------- /abi/KeyDictionary.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "inputs": [ 4 | { 5 | "internalType": "contract RealDigital", 6 | "name": "token", 7 | "type": "address" 8 | } 9 | ], 10 | "stateMutability": "nonpayable", 11 | "type": "constructor" 12 | }, 13 | { 14 | "anonymous": false, 15 | "inputs": [ 16 | { 17 | "indexed": false, 18 | "internalType": "address", 19 | "name": "owner", 20 | "type": "address" 21 | }, 22 | { 23 | "indexed": false, 24 | "internalType": "uint256", 25 | "name": "proposalId", 26 | "type": "uint256" 27 | }, 28 | { 29 | "indexed": false, 30 | "internalType": "bytes32", 31 | "name": "key", 32 | "type": "bytes32" 33 | } 34 | ], 35 | "name": "KeyRequested", 36 | "type": "event" 37 | }, 38 | { 39 | "inputs": [ 40 | { 41 | "internalType": "bytes32", 42 | "name": "key", 43 | "type": "bytes32" 44 | }, 45 | { 46 | "internalType": "uint256", 47 | "name": "_taxId", 48 | "type": "uint256" 49 | }, 50 | { 51 | "internalType": "uint256", 52 | "name": "_bankNumber", 53 | "type": "uint256" 54 | }, 55 | { 56 | "internalType": "uint256", 57 | "name": "_account", 58 | "type": "uint256" 59 | }, 60 | { 61 | "internalType": "uint256", 62 | "name": "_branch", 63 | "type": "uint256" 64 | }, 65 | { 66 | "internalType": "address", 67 | "name": "_wallet", 68 | "type": "address" 69 | } 70 | ], 71 | "name": "addAccount", 72 | "outputs": [], 73 | "stateMutability": "nonpayable", 74 | "type": "function" 75 | }, 76 | { 77 | "inputs": [ 78 | { 79 | "internalType": "uint256", 80 | "name": "proposalId", 81 | "type": "uint256" 82 | }, 83 | { 84 | "internalType": "bytes32", 85 | "name": "key", 86 | "type": "bytes32" 87 | } 88 | ], 89 | "name": "authorizeKey", 90 | "outputs": [], 91 | "stateMutability": "nonpayable", 92 | "type": "function" 93 | }, 94 | { 95 | "inputs": [ 96 | { 97 | "internalType": "bytes32", 98 | "name": "key", 99 | "type": "bytes32" 100 | } 101 | ], 102 | "name": "getCustomerData", 103 | "outputs": [ 104 | { 105 | "components": [ 106 | { 107 | "internalType": "uint256", 108 | "name": "taxId", 109 | "type": "uint256" 110 | }, 111 | { 112 | "internalType": "uint256", 113 | "name": "bankNumber", 114 | "type": "uint256" 115 | }, 116 | { 117 | "internalType": "uint256", 118 | "name": "account", 119 | "type": "uint256" 120 | }, 121 | { 122 | "internalType": "uint256", 123 | "name": "branch", 124 | "type": "uint256" 125 | }, 126 | { 127 | "internalType": "address", 128 | "name": "wallet", 129 | "type": "address" 130 | }, 131 | { 132 | "internalType": "bool", 133 | "name": "registered", 134 | "type": "bool" 135 | }, 136 | { 137 | "internalType": "address", 138 | "name": "owner", 139 | "type": "address" 140 | } 141 | ], 142 | "internalType": "struct KeyDictionary.CustomerData", 143 | "name": "", 144 | "type": "tuple" 145 | } 146 | ], 147 | "stateMutability": "view", 148 | "type": "function" 149 | }, 150 | { 151 | "inputs": [ 152 | { 153 | "internalType": "address", 154 | "name": "wallet", 155 | "type": "address" 156 | } 157 | ], 158 | "name": "getKey", 159 | "outputs": [ 160 | { 161 | "internalType": "bytes32", 162 | "name": "", 163 | "type": "bytes32" 164 | } 165 | ], 166 | "stateMutability": "view", 167 | "type": "function" 168 | }, 169 | { 170 | "inputs": [ 171 | { 172 | "internalType": "bytes32", 173 | "name": "key", 174 | "type": "bytes32" 175 | } 176 | ], 177 | "name": "getWallet", 178 | "outputs": [ 179 | { 180 | "internalType": "address", 181 | "name": "", 182 | "type": "address" 183 | } 184 | ], 185 | "stateMutability": "view", 186 | "type": "function" 187 | }, 188 | { 189 | "inputs": [ 190 | { 191 | "internalType": "bytes32", 192 | "name": "key", 193 | "type": "bytes32" 194 | }, 195 | { 196 | "internalType": "uint256", 197 | "name": "_taxId", 198 | "type": "uint256" 199 | }, 200 | { 201 | "internalType": "uint256", 202 | "name": "_bankNumber", 203 | "type": "uint256" 204 | }, 205 | { 206 | "internalType": "uint256", 207 | "name": "_account", 208 | "type": "uint256" 209 | }, 210 | { 211 | "internalType": "uint256", 212 | "name": "_branch", 213 | "type": "uint256" 214 | }, 215 | { 216 | "internalType": "address", 217 | "name": "_wallet", 218 | "type": "address" 219 | } 220 | ], 221 | "name": "requestKey", 222 | "outputs": [], 223 | "stateMutability": "nonpayable", 224 | "type": "function" 225 | }, 226 | { 227 | "inputs": [ 228 | { 229 | "internalType": "bytes32", 230 | "name": "key", 231 | "type": "bytes32" 232 | }, 233 | { 234 | "internalType": "uint256", 235 | "name": "_taxId", 236 | "type": "uint256" 237 | }, 238 | { 239 | "internalType": "uint256", 240 | "name": "_bankNumber", 241 | "type": "uint256" 242 | }, 243 | { 244 | "internalType": "uint256", 245 | "name": "_account", 246 | "type": "uint256" 247 | }, 248 | { 249 | "internalType": "uint256", 250 | "name": "_branch", 251 | "type": "uint256" 252 | }, 253 | { 254 | "internalType": "address", 255 | "name": "_wallet", 256 | "type": "address" 257 | } 258 | ], 259 | "name": "updateData", 260 | "outputs": [], 261 | "stateMutability": "nonpayable", 262 | "type": "function" 263 | } 264 | ] -------------------------------------------------------------------------------- /abi/RealDigitalDefaultAccount.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "inputs": [ 4 | { 5 | "internalType": "contract RealDigital", 6 | "name": "token", 7 | "type": "address" 8 | }, 9 | { 10 | "internalType": "address", 11 | "name": "_authority", 12 | "type": "address" 13 | }, 14 | { 15 | "internalType": "address", 16 | "name": "_admin", 17 | "type": "address" 18 | } 19 | ], 20 | "stateMutability": "nonpayable", 21 | "type": "constructor" 22 | }, 23 | { 24 | "anonymous": false, 25 | "inputs": [ 26 | { 27 | "indexed": true, 28 | "internalType": "bytes32", 29 | "name": "role", 30 | "type": "bytes32" 31 | }, 32 | { 33 | "indexed": true, 34 | "internalType": "bytes32", 35 | "name": "previousAdminRole", 36 | "type": "bytes32" 37 | }, 38 | { 39 | "indexed": true, 40 | "internalType": "bytes32", 41 | "name": "newAdminRole", 42 | "type": "bytes32" 43 | } 44 | ], 45 | "name": "RoleAdminChanged", 46 | "type": "event" 47 | }, 48 | { 49 | "anonymous": false, 50 | "inputs": [ 51 | { 52 | "indexed": true, 53 | "internalType": "bytes32", 54 | "name": "role", 55 | "type": "bytes32" 56 | }, 57 | { 58 | "indexed": true, 59 | "internalType": "address", 60 | "name": "account", 61 | "type": "address" 62 | }, 63 | { 64 | "indexed": true, 65 | "internalType": "address", 66 | "name": "sender", 67 | "type": "address" 68 | } 69 | ], 70 | "name": "RoleGranted", 71 | "type": "event" 72 | }, 73 | { 74 | "anonymous": false, 75 | "inputs": [ 76 | { 77 | "indexed": true, 78 | "internalType": "bytes32", 79 | "name": "role", 80 | "type": "bytes32" 81 | }, 82 | { 83 | "indexed": true, 84 | "internalType": "address", 85 | "name": "account", 86 | "type": "address" 87 | }, 88 | { 89 | "indexed": true, 90 | "internalType": "address", 91 | "name": "sender", 92 | "type": "address" 93 | } 94 | ], 95 | "name": "RoleRevoked", 96 | "type": "event" 97 | }, 98 | { 99 | "inputs": [], 100 | "name": "ACCESS_ROLE", 101 | "outputs": [ 102 | { 103 | "internalType": "bytes32", 104 | "name": "", 105 | "type": "bytes32" 106 | } 107 | ], 108 | "stateMutability": "view", 109 | "type": "function" 110 | }, 111 | { 112 | "inputs": [], 113 | "name": "DEFAULT_ADMIN_ROLE", 114 | "outputs": [ 115 | { 116 | "internalType": "bytes32", 117 | "name": "", 118 | "type": "bytes32" 119 | } 120 | ], 121 | "stateMutability": "view", 122 | "type": "function" 123 | }, 124 | { 125 | "inputs": [ 126 | { 127 | "internalType": "uint256", 128 | "name": "cnpj8", 129 | "type": "uint256" 130 | }, 131 | { 132 | "internalType": "address", 133 | "name": "wallet", 134 | "type": "address" 135 | } 136 | ], 137 | "name": "addDefaultAccount", 138 | "outputs": [], 139 | "stateMutability": "nonpayable", 140 | "type": "function" 141 | }, 142 | { 143 | "inputs": [ 144 | { 145 | "internalType": "uint256", 146 | "name": "", 147 | "type": "uint256" 148 | } 149 | ], 150 | "name": "defaultAccount", 151 | "outputs": [ 152 | { 153 | "internalType": "address", 154 | "name": "", 155 | "type": "address" 156 | } 157 | ], 158 | "stateMutability": "view", 159 | "type": "function" 160 | }, 161 | { 162 | "inputs": [ 163 | { 164 | "internalType": "bytes32", 165 | "name": "role", 166 | "type": "bytes32" 167 | } 168 | ], 169 | "name": "getRoleAdmin", 170 | "outputs": [ 171 | { 172 | "internalType": "bytes32", 173 | "name": "", 174 | "type": "bytes32" 175 | } 176 | ], 177 | "stateMutability": "view", 178 | "type": "function" 179 | }, 180 | { 181 | "inputs": [ 182 | { 183 | "internalType": "bytes32", 184 | "name": "role", 185 | "type": "bytes32" 186 | }, 187 | { 188 | "internalType": "address", 189 | "name": "account", 190 | "type": "address" 191 | } 192 | ], 193 | "name": "grantRole", 194 | "outputs": [], 195 | "stateMutability": "nonpayable", 196 | "type": "function" 197 | }, 198 | { 199 | "inputs": [ 200 | { 201 | "internalType": "bytes32", 202 | "name": "role", 203 | "type": "bytes32" 204 | }, 205 | { 206 | "internalType": "address", 207 | "name": "account", 208 | "type": "address" 209 | } 210 | ], 211 | "name": "hasRole", 212 | "outputs": [ 213 | { 214 | "internalType": "bool", 215 | "name": "", 216 | "type": "bool" 217 | } 218 | ], 219 | "stateMutability": "view", 220 | "type": "function" 221 | }, 222 | { 223 | "inputs": [ 224 | { 225 | "internalType": "bytes32", 226 | "name": "role", 227 | "type": "bytes32" 228 | }, 229 | { 230 | "internalType": "address", 231 | "name": "account", 232 | "type": "address" 233 | } 234 | ], 235 | "name": "renounceRole", 236 | "outputs": [], 237 | "stateMutability": "nonpayable", 238 | "type": "function" 239 | }, 240 | { 241 | "inputs": [ 242 | { 243 | "internalType": "bytes32", 244 | "name": "role", 245 | "type": "bytes32" 246 | }, 247 | { 248 | "internalType": "address", 249 | "name": "account", 250 | "type": "address" 251 | } 252 | ], 253 | "name": "revokeRole", 254 | "outputs": [], 255 | "stateMutability": "nonpayable", 256 | "type": "function" 257 | }, 258 | { 259 | "inputs": [ 260 | { 261 | "internalType": "bytes4", 262 | "name": "interfaceId", 263 | "type": "bytes4" 264 | } 265 | ], 266 | "name": "supportsInterface", 267 | "outputs": [ 268 | { 269 | "internalType": "bool", 270 | "name": "", 271 | "type": "bool" 272 | } 273 | ], 274 | "stateMutability": "view", 275 | "type": "function" 276 | }, 277 | { 278 | "inputs": [ 279 | { 280 | "internalType": "uint256", 281 | "name": "cnpj8", 282 | "type": "uint256" 283 | }, 284 | { 285 | "internalType": "address", 286 | "name": "newWallet", 287 | "type": "address" 288 | } 289 | ], 290 | "name": "updateDefaultWallet", 291 | "outputs": [], 292 | "stateMutability": "nonpayable", 293 | "type": "function" 294 | } 295 | ] -------------------------------------------------------------------------------- /abi/RealDigitalEnableAccount.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "inputs": [ 4 | { 5 | "internalType": "address", 6 | "name": "accessControlAddress", 7 | "type": "address" 8 | } 9 | ], 10 | "stateMutability": "nonpayable", 11 | "type": "constructor" 12 | }, 13 | { 14 | "inputs": [], 15 | "name": "disableAccount", 16 | "outputs": [], 17 | "stateMutability": "nonpayable", 18 | "type": "function" 19 | }, 20 | { 21 | "inputs": [ 22 | { 23 | "internalType": "address", 24 | "name": "member", 25 | "type": "address" 26 | } 27 | ], 28 | "name": "enableAccount", 29 | "outputs": [], 30 | "stateMutability": "nonpayable", 31 | "type": "function" 32 | } 33 | ] -------------------------------------------------------------------------------- /abi/STR.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "inputs": [ 4 | { 5 | "internalType": "contract RealDigital", 6 | "name": "token", 7 | "type": "address" 8 | } 9 | ], 10 | "stateMutability": "nonpayable", 11 | "type": "constructor" 12 | }, 13 | { 14 | "inputs": [ 15 | { 16 | "internalType": "uint256", 17 | "name": "amount", 18 | "type": "uint256" 19 | } 20 | ], 21 | "name": "requestToBurn", 22 | "outputs": [], 23 | "stateMutability": "nonpayable", 24 | "type": "function" 25 | }, 26 | { 27 | "inputs": [ 28 | { 29 | "internalType": "uint256", 30 | "name": "amount", 31 | "type": "uint256" 32 | } 33 | ], 34 | "name": "requestToMint", 35 | "outputs": [], 36 | "stateMutability": "nonpayable", 37 | "type": "function" 38 | } 39 | ] -------------------------------------------------------------------------------- /abi/SwapOneStep.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "inputs": [ 4 | { 5 | "internalType": "address", 6 | "name": "_admin", 7 | "type": "address" 8 | }, 9 | { 10 | "internalType": "address", 11 | "name": "_authority", 12 | "type": "address" 13 | }, 14 | { 15 | "internalType": "contract RealDigital", 16 | "name": "_CBDC", 17 | "type": "address" 18 | } 19 | ], 20 | "stateMutability": "nonpayable", 21 | "type": "constructor" 22 | }, 23 | { 24 | "anonymous": false, 25 | "inputs": [ 26 | { 27 | "indexed": true, 28 | "internalType": "bytes32", 29 | "name": "role", 30 | "type": "bytes32" 31 | }, 32 | { 33 | "indexed": true, 34 | "internalType": "bytes32", 35 | "name": "previousAdminRole", 36 | "type": "bytes32" 37 | }, 38 | { 39 | "indexed": true, 40 | "internalType": "bytes32", 41 | "name": "newAdminRole", 42 | "type": "bytes32" 43 | } 44 | ], 45 | "name": "RoleAdminChanged", 46 | "type": "event" 47 | }, 48 | { 49 | "anonymous": false, 50 | "inputs": [ 51 | { 52 | "indexed": true, 53 | "internalType": "bytes32", 54 | "name": "role", 55 | "type": "bytes32" 56 | }, 57 | { 58 | "indexed": true, 59 | "internalType": "address", 60 | "name": "account", 61 | "type": "address" 62 | }, 63 | { 64 | "indexed": true, 65 | "internalType": "address", 66 | "name": "sender", 67 | "type": "address" 68 | } 69 | ], 70 | "name": "RoleGranted", 71 | "type": "event" 72 | }, 73 | { 74 | "anonymous": false, 75 | "inputs": [ 76 | { 77 | "indexed": true, 78 | "internalType": "bytes32", 79 | "name": "role", 80 | "type": "bytes32" 81 | }, 82 | { 83 | "indexed": true, 84 | "internalType": "address", 85 | "name": "account", 86 | "type": "address" 87 | }, 88 | { 89 | "indexed": true, 90 | "internalType": "address", 91 | "name": "sender", 92 | "type": "address" 93 | } 94 | ], 95 | "name": "RoleRevoked", 96 | "type": "event" 97 | }, 98 | { 99 | "anonymous": false, 100 | "inputs": [ 101 | { 102 | "indexed": true, 103 | "internalType": "uint256", 104 | "name": "senderNumber", 105 | "type": "uint256" 106 | }, 107 | { 108 | "indexed": true, 109 | "internalType": "uint256", 110 | "name": "receiverNumber", 111 | "type": "uint256" 112 | }, 113 | { 114 | "indexed": false, 115 | "internalType": "address", 116 | "name": "sender", 117 | "type": "address" 118 | }, 119 | { 120 | "indexed": false, 121 | "internalType": "address", 122 | "name": "receiver", 123 | "type": "address" 124 | }, 125 | { 126 | "indexed": false, 127 | "internalType": "uint256", 128 | "name": "amount", 129 | "type": "uint256" 130 | } 131 | ], 132 | "name": "SwapExecuted", 133 | "type": "event" 134 | }, 135 | { 136 | "inputs": [], 137 | "name": "ACCESS_ROLE", 138 | "outputs": [ 139 | { 140 | "internalType": "bytes32", 141 | "name": "", 142 | "type": "bytes32" 143 | } 144 | ], 145 | "stateMutability": "view", 146 | "type": "function" 147 | }, 148 | { 149 | "inputs": [], 150 | "name": "DEFAULT_ADMIN_ROLE", 151 | "outputs": [ 152 | { 153 | "internalType": "bytes32", 154 | "name": "", 155 | "type": "bytes32" 156 | } 157 | ], 158 | "stateMutability": "view", 159 | "type": "function" 160 | }, 161 | { 162 | "inputs": [ 163 | { 164 | "internalType": "contract RealTokenizado", 165 | "name": "tokenSender", 166 | "type": "address" 167 | }, 168 | { 169 | "internalType": "contract RealTokenizado", 170 | "name": "tokenReceiver", 171 | "type": "address" 172 | }, 173 | { 174 | "internalType": "address", 175 | "name": "receiver", 176 | "type": "address" 177 | }, 178 | { 179 | "internalType": "uint256", 180 | "name": "amount", 181 | "type": "uint256" 182 | } 183 | ], 184 | "name": "executeSwap", 185 | "outputs": [], 186 | "stateMutability": "nonpayable", 187 | "type": "function" 188 | }, 189 | { 190 | "inputs": [ 191 | { 192 | "internalType": "bytes32", 193 | "name": "role", 194 | "type": "bytes32" 195 | } 196 | ], 197 | "name": "getRoleAdmin", 198 | "outputs": [ 199 | { 200 | "internalType": "bytes32", 201 | "name": "", 202 | "type": "bytes32" 203 | } 204 | ], 205 | "stateMutability": "view", 206 | "type": "function" 207 | }, 208 | { 209 | "inputs": [ 210 | { 211 | "internalType": "bytes32", 212 | "name": "role", 213 | "type": "bytes32" 214 | }, 215 | { 216 | "internalType": "address", 217 | "name": "account", 218 | "type": "address" 219 | } 220 | ], 221 | "name": "grantRole", 222 | "outputs": [], 223 | "stateMutability": "nonpayable", 224 | "type": "function" 225 | }, 226 | { 227 | "inputs": [ 228 | { 229 | "internalType": "bytes32", 230 | "name": "role", 231 | "type": "bytes32" 232 | }, 233 | { 234 | "internalType": "address", 235 | "name": "account", 236 | "type": "address" 237 | } 238 | ], 239 | "name": "hasRole", 240 | "outputs": [ 241 | { 242 | "internalType": "bool", 243 | "name": "", 244 | "type": "bool" 245 | } 246 | ], 247 | "stateMutability": "view", 248 | "type": "function" 249 | }, 250 | { 251 | "inputs": [ 252 | { 253 | "internalType": "bytes32", 254 | "name": "role", 255 | "type": "bytes32" 256 | }, 257 | { 258 | "internalType": "address", 259 | "name": "account", 260 | "type": "address" 261 | } 262 | ], 263 | "name": "renounceRole", 264 | "outputs": [], 265 | "stateMutability": "nonpayable", 266 | "type": "function" 267 | }, 268 | { 269 | "inputs": [ 270 | { 271 | "internalType": "bytes32", 272 | "name": "role", 273 | "type": "bytes32" 274 | }, 275 | { 276 | "internalType": "address", 277 | "name": "account", 278 | "type": "address" 279 | } 280 | ], 281 | "name": "revokeRole", 282 | "outputs": [], 283 | "stateMutability": "nonpayable", 284 | "type": "function" 285 | }, 286 | { 287 | "inputs": [ 288 | { 289 | "internalType": "address", 290 | "name": "asset", 291 | "type": "address" 292 | }, 293 | { 294 | "internalType": "bool", 295 | "name": "approved", 296 | "type": "bool" 297 | } 298 | ], 299 | "name": "setDigitalCurrencyApproval", 300 | "outputs": [], 301 | "stateMutability": "nonpayable", 302 | "type": "function" 303 | }, 304 | { 305 | "inputs": [ 306 | { 307 | "internalType": "bytes4", 308 | "name": "interfaceId", 309 | "type": "bytes4" 310 | } 311 | ], 312 | "name": "supportsInterface", 313 | "outputs": [ 314 | { 315 | "internalType": "bool", 316 | "name": "", 317 | "type": "bool" 318 | } 319 | ], 320 | "stateMutability": "view", 321 | "type": "function" 322 | } 323 | ] -------------------------------------------------------------------------------- /abi/SwapTwoSteps.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "inputs": [ 4 | { 5 | "internalType": "address", 6 | "name": "_admin", 7 | "type": "address" 8 | }, 9 | { 10 | "internalType": "address", 11 | "name": "_authority", 12 | "type": "address" 13 | }, 14 | { 15 | "internalType": "contract RealDigital", 16 | "name": "_CBDC", 17 | "type": "address" 18 | } 19 | ], 20 | "stateMutability": "nonpayable", 21 | "type": "constructor" 22 | }, 23 | { 24 | "anonymous": false, 25 | "inputs": [ 26 | { 27 | "indexed": true, 28 | "internalType": "uint256", 29 | "name": "proposalId", 30 | "type": "uint256" 31 | } 32 | ], 33 | "name": "ExpiredProposal", 34 | "type": "event" 35 | }, 36 | { 37 | "anonymous": false, 38 | "inputs": [ 39 | { 40 | "indexed": true, 41 | "internalType": "bytes32", 42 | "name": "role", 43 | "type": "bytes32" 44 | }, 45 | { 46 | "indexed": true, 47 | "internalType": "bytes32", 48 | "name": "previousAdminRole", 49 | "type": "bytes32" 50 | }, 51 | { 52 | "indexed": true, 53 | "internalType": "bytes32", 54 | "name": "newAdminRole", 55 | "type": "bytes32" 56 | } 57 | ], 58 | "name": "RoleAdminChanged", 59 | "type": "event" 60 | }, 61 | { 62 | "anonymous": false, 63 | "inputs": [ 64 | { 65 | "indexed": true, 66 | "internalType": "bytes32", 67 | "name": "role", 68 | "type": "bytes32" 69 | }, 70 | { 71 | "indexed": true, 72 | "internalType": "address", 73 | "name": "account", 74 | "type": "address" 75 | }, 76 | { 77 | "indexed": true, 78 | "internalType": "address", 79 | "name": "sender", 80 | "type": "address" 81 | } 82 | ], 83 | "name": "RoleGranted", 84 | "type": "event" 85 | }, 86 | { 87 | "anonymous": false, 88 | "inputs": [ 89 | { 90 | "indexed": true, 91 | "internalType": "bytes32", 92 | "name": "role", 93 | "type": "bytes32" 94 | }, 95 | { 96 | "indexed": true, 97 | "internalType": "address", 98 | "name": "account", 99 | "type": "address" 100 | }, 101 | { 102 | "indexed": true, 103 | "internalType": "address", 104 | "name": "sender", 105 | "type": "address" 106 | } 107 | ], 108 | "name": "RoleRevoked", 109 | "type": "event" 110 | }, 111 | { 112 | "anonymous": false, 113 | "inputs": [ 114 | { 115 | "indexed": true, 116 | "internalType": "uint256", 117 | "name": "proposalId", 118 | "type": "uint256" 119 | }, 120 | { 121 | "indexed": false, 122 | "internalType": "string", 123 | "name": "reason", 124 | "type": "string" 125 | } 126 | ], 127 | "name": "SwapCancelled", 128 | "type": "event" 129 | }, 130 | { 131 | "anonymous": false, 132 | "inputs": [ 133 | { 134 | "indexed": true, 135 | "internalType": "uint256", 136 | "name": "proposalId", 137 | "type": "uint256" 138 | }, 139 | { 140 | "indexed": true, 141 | "internalType": "uint256", 142 | "name": "senderNumber", 143 | "type": "uint256" 144 | }, 145 | { 146 | "indexed": true, 147 | "internalType": "uint256", 148 | "name": "receiverNumber", 149 | "type": "uint256" 150 | }, 151 | { 152 | "indexed": false, 153 | "internalType": "address", 154 | "name": "sender", 155 | "type": "address" 156 | }, 157 | { 158 | "indexed": false, 159 | "internalType": "address", 160 | "name": "receiver", 161 | "type": "address" 162 | }, 163 | { 164 | "indexed": false, 165 | "internalType": "uint256", 166 | "name": "amount", 167 | "type": "uint256" 168 | } 169 | ], 170 | "name": "SwapExecuted", 171 | "type": "event" 172 | }, 173 | { 174 | "anonymous": false, 175 | "inputs": [ 176 | { 177 | "indexed": true, 178 | "internalType": "uint256", 179 | "name": "proposalId", 180 | "type": "uint256" 181 | }, 182 | { 183 | "indexed": true, 184 | "internalType": "uint256", 185 | "name": "senderNumber", 186 | "type": "uint256" 187 | }, 188 | { 189 | "indexed": true, 190 | "internalType": "uint256", 191 | "name": "receiverNumber", 192 | "type": "uint256" 193 | }, 194 | { 195 | "indexed": false, 196 | "internalType": "address", 197 | "name": "sender", 198 | "type": "address" 199 | }, 200 | { 201 | "indexed": false, 202 | "internalType": "address", 203 | "name": "receiver", 204 | "type": "address" 205 | }, 206 | { 207 | "indexed": false, 208 | "internalType": "uint256", 209 | "name": "amount", 210 | "type": "uint256" 211 | } 212 | ], 213 | "name": "SwapStarted", 214 | "type": "event" 215 | }, 216 | { 217 | "inputs": [], 218 | "name": "ACCESS_ROLE", 219 | "outputs": [ 220 | { 221 | "internalType": "bytes32", 222 | "name": "", 223 | "type": "bytes32" 224 | } 225 | ], 226 | "stateMutability": "view", 227 | "type": "function" 228 | }, 229 | { 230 | "inputs": [], 231 | "name": "DEFAULT_ADMIN_ROLE", 232 | "outputs": [ 233 | { 234 | "internalType": "bytes32", 235 | "name": "", 236 | "type": "bytes32" 237 | } 238 | ], 239 | "stateMutability": "view", 240 | "type": "function" 241 | }, 242 | { 243 | "inputs": [ 244 | { 245 | "internalType": "uint256", 246 | "name": "proposalId", 247 | "type": "uint256" 248 | }, 249 | { 250 | "internalType": "string", 251 | "name": "reason", 252 | "type": "string" 253 | } 254 | ], 255 | "name": "cancelSwap", 256 | "outputs": [], 257 | "stateMutability": "nonpayable", 258 | "type": "function" 259 | }, 260 | { 261 | "inputs": [ 262 | { 263 | "internalType": "uint256", 264 | "name": "proposalId", 265 | "type": "uint256" 266 | } 267 | ], 268 | "name": "executeSwap", 269 | "outputs": [], 270 | "stateMutability": "nonpayable", 271 | "type": "function" 272 | }, 273 | { 274 | "inputs": [ 275 | { 276 | "internalType": "bytes32", 277 | "name": "role", 278 | "type": "bytes32" 279 | } 280 | ], 281 | "name": "getRoleAdmin", 282 | "outputs": [ 283 | { 284 | "internalType": "bytes32", 285 | "name": "", 286 | "type": "bytes32" 287 | } 288 | ], 289 | "stateMutability": "view", 290 | "type": "function" 291 | }, 292 | { 293 | "inputs": [ 294 | { 295 | "internalType": "bytes32", 296 | "name": "role", 297 | "type": "bytes32" 298 | }, 299 | { 300 | "internalType": "address", 301 | "name": "account", 302 | "type": "address" 303 | } 304 | ], 305 | "name": "grantRole", 306 | "outputs": [], 307 | "stateMutability": "nonpayable", 308 | "type": "function" 309 | }, 310 | { 311 | "inputs": [ 312 | { 313 | "internalType": "bytes32", 314 | "name": "role", 315 | "type": "bytes32" 316 | }, 317 | { 318 | "internalType": "address", 319 | "name": "account", 320 | "type": "address" 321 | } 322 | ], 323 | "name": "hasRole", 324 | "outputs": [ 325 | { 326 | "internalType": "bool", 327 | "name": "", 328 | "type": "bool" 329 | } 330 | ], 331 | "stateMutability": "view", 332 | "type": "function" 333 | }, 334 | { 335 | "inputs": [ 336 | { 337 | "internalType": "bytes32", 338 | "name": "role", 339 | "type": "bytes32" 340 | }, 341 | { 342 | "internalType": "address", 343 | "name": "account", 344 | "type": "address" 345 | } 346 | ], 347 | "name": "renounceRole", 348 | "outputs": [], 349 | "stateMutability": "nonpayable", 350 | "type": "function" 351 | }, 352 | { 353 | "inputs": [ 354 | { 355 | "internalType": "bytes32", 356 | "name": "role", 357 | "type": "bytes32" 358 | }, 359 | { 360 | "internalType": "address", 361 | "name": "account", 362 | "type": "address" 363 | } 364 | ], 365 | "name": "revokeRole", 366 | "outputs": [], 367 | "stateMutability": "nonpayable", 368 | "type": "function" 369 | }, 370 | { 371 | "inputs": [ 372 | { 373 | "internalType": "address", 374 | "name": "asset", 375 | "type": "address" 376 | }, 377 | { 378 | "internalType": "bool", 379 | "name": "approved", 380 | "type": "bool" 381 | } 382 | ], 383 | "name": "setDigitalCurrencyApproval", 384 | "outputs": [], 385 | "stateMutability": "nonpayable", 386 | "type": "function" 387 | }, 388 | { 389 | "inputs": [ 390 | { 391 | "internalType": "contract RealTokenizado", 392 | "name": "tokenSender", 393 | "type": "address" 394 | }, 395 | { 396 | "internalType": "contract RealTokenizado", 397 | "name": "tokenReceiver", 398 | "type": "address" 399 | }, 400 | { 401 | "internalType": "address", 402 | "name": "receiver", 403 | "type": "address" 404 | }, 405 | { 406 | "internalType": "uint256", 407 | "name": "amount", 408 | "type": "uint256" 409 | } 410 | ], 411 | "name": "startSwap", 412 | "outputs": [], 413 | "stateMutability": "nonpayable", 414 | "type": "function" 415 | }, 416 | { 417 | "inputs": [ 418 | { 419 | "internalType": "bytes4", 420 | "name": "interfaceId", 421 | "type": "bytes4" 422 | } 423 | ], 424 | "name": "supportsInterface", 425 | "outputs": [ 426 | { 427 | "internalType": "bool", 428 | "name": "", 429 | "type": "bool" 430 | } 431 | ], 432 | "stateMutability": "view", 433 | "type": "function" 434 | } 435 | ] -------------------------------------------------------------------------------- /abi/SwapTwoStepsReserve.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "inputs": [ 4 | { 5 | "internalType": "address", 6 | "name": "_admin", 7 | "type": "address" 8 | }, 9 | { 10 | "internalType": "address", 11 | "name": "_authority", 12 | "type": "address" 13 | }, 14 | { 15 | "internalType": "contract RealDigital", 16 | "name": "_CBDC", 17 | "type": "address" 18 | } 19 | ], 20 | "stateMutability": "nonpayable", 21 | "type": "constructor" 22 | }, 23 | { 24 | "anonymous": false, 25 | "inputs": [ 26 | { 27 | "indexed": true, 28 | "internalType": "uint256", 29 | "name": "proposalId", 30 | "type": "uint256" 31 | } 32 | ], 33 | "name": "ExpiredProposal", 34 | "type": "event" 35 | }, 36 | { 37 | "anonymous": false, 38 | "inputs": [ 39 | { 40 | "indexed": true, 41 | "internalType": "bytes32", 42 | "name": "role", 43 | "type": "bytes32" 44 | }, 45 | { 46 | "indexed": true, 47 | "internalType": "bytes32", 48 | "name": "previousAdminRole", 49 | "type": "bytes32" 50 | }, 51 | { 52 | "indexed": true, 53 | "internalType": "bytes32", 54 | "name": "newAdminRole", 55 | "type": "bytes32" 56 | } 57 | ], 58 | "name": "RoleAdminChanged", 59 | "type": "event" 60 | }, 61 | { 62 | "anonymous": false, 63 | "inputs": [ 64 | { 65 | "indexed": true, 66 | "internalType": "bytes32", 67 | "name": "role", 68 | "type": "bytes32" 69 | }, 70 | { 71 | "indexed": true, 72 | "internalType": "address", 73 | "name": "account", 74 | "type": "address" 75 | }, 76 | { 77 | "indexed": true, 78 | "internalType": "address", 79 | "name": "sender", 80 | "type": "address" 81 | } 82 | ], 83 | "name": "RoleGranted", 84 | "type": "event" 85 | }, 86 | { 87 | "anonymous": false, 88 | "inputs": [ 89 | { 90 | "indexed": true, 91 | "internalType": "bytes32", 92 | "name": "role", 93 | "type": "bytes32" 94 | }, 95 | { 96 | "indexed": true, 97 | "internalType": "address", 98 | "name": "account", 99 | "type": "address" 100 | }, 101 | { 102 | "indexed": true, 103 | "internalType": "address", 104 | "name": "sender", 105 | "type": "address" 106 | } 107 | ], 108 | "name": "RoleRevoked", 109 | "type": "event" 110 | }, 111 | { 112 | "anonymous": false, 113 | "inputs": [ 114 | { 115 | "indexed": true, 116 | "internalType": "uint256", 117 | "name": "proposalId", 118 | "type": "uint256" 119 | }, 120 | { 121 | "indexed": false, 122 | "internalType": "string", 123 | "name": "reason", 124 | "type": "string" 125 | } 126 | ], 127 | "name": "SwapCancelled", 128 | "type": "event" 129 | }, 130 | { 131 | "anonymous": false, 132 | "inputs": [ 133 | { 134 | "indexed": true, 135 | "internalType": "uint256", 136 | "name": "proposalId", 137 | "type": "uint256" 138 | }, 139 | { 140 | "indexed": true, 141 | "internalType": "uint256", 142 | "name": "senderNumber", 143 | "type": "uint256" 144 | }, 145 | { 146 | "indexed": true, 147 | "internalType": "uint256", 148 | "name": "receiverNumber", 149 | "type": "uint256" 150 | }, 151 | { 152 | "indexed": false, 153 | "internalType": "address", 154 | "name": "sender", 155 | "type": "address" 156 | }, 157 | { 158 | "indexed": false, 159 | "internalType": "address", 160 | "name": "receiver", 161 | "type": "address" 162 | }, 163 | { 164 | "indexed": false, 165 | "internalType": "uint256", 166 | "name": "amount", 167 | "type": "uint256" 168 | } 169 | ], 170 | "name": "SwapExecuted", 171 | "type": "event" 172 | }, 173 | { 174 | "anonymous": false, 175 | "inputs": [ 176 | { 177 | "indexed": true, 178 | "internalType": "uint256", 179 | "name": "proposalId", 180 | "type": "uint256" 181 | }, 182 | { 183 | "indexed": true, 184 | "internalType": "uint256", 185 | "name": "senderNumber", 186 | "type": "uint256" 187 | }, 188 | { 189 | "indexed": true, 190 | "internalType": "uint256", 191 | "name": "receiverNumber", 192 | "type": "uint256" 193 | }, 194 | { 195 | "indexed": false, 196 | "internalType": "address", 197 | "name": "sender", 198 | "type": "address" 199 | }, 200 | { 201 | "indexed": false, 202 | "internalType": "address", 203 | "name": "receiver", 204 | "type": "address" 205 | }, 206 | { 207 | "indexed": false, 208 | "internalType": "uint256", 209 | "name": "amount", 210 | "type": "uint256" 211 | } 212 | ], 213 | "name": "SwapStarted", 214 | "type": "event" 215 | }, 216 | { 217 | "inputs": [], 218 | "name": "ACCESS_ROLE", 219 | "outputs": [ 220 | { 221 | "internalType": "bytes32", 222 | "name": "", 223 | "type": "bytes32" 224 | } 225 | ], 226 | "stateMutability": "view", 227 | "type": "function" 228 | }, 229 | { 230 | "inputs": [], 231 | "name": "DEFAULT_ADMIN_ROLE", 232 | "outputs": [ 233 | { 234 | "internalType": "bytes32", 235 | "name": "", 236 | "type": "bytes32" 237 | } 238 | ], 239 | "stateMutability": "view", 240 | "type": "function" 241 | }, 242 | { 243 | "inputs": [ 244 | { 245 | "internalType": "uint256", 246 | "name": "proposalId", 247 | "type": "uint256" 248 | }, 249 | { 250 | "internalType": "string", 251 | "name": "reason", 252 | "type": "string" 253 | } 254 | ], 255 | "name": "cancelSwap", 256 | "outputs": [], 257 | "stateMutability": "nonpayable", 258 | "type": "function" 259 | }, 260 | { 261 | "inputs": [ 262 | { 263 | "internalType": "uint256", 264 | "name": "proposalId", 265 | "type": "uint256" 266 | } 267 | ], 268 | "name": "executeSwap", 269 | "outputs": [], 270 | "stateMutability": "nonpayable", 271 | "type": "function" 272 | }, 273 | { 274 | "inputs": [ 275 | { 276 | "internalType": "bytes32", 277 | "name": "role", 278 | "type": "bytes32" 279 | } 280 | ], 281 | "name": "getRoleAdmin", 282 | "outputs": [ 283 | { 284 | "internalType": "bytes32", 285 | "name": "", 286 | "type": "bytes32" 287 | } 288 | ], 289 | "stateMutability": "view", 290 | "type": "function" 291 | }, 292 | { 293 | "inputs": [ 294 | { 295 | "internalType": "bytes32", 296 | "name": "role", 297 | "type": "bytes32" 298 | }, 299 | { 300 | "internalType": "address", 301 | "name": "account", 302 | "type": "address" 303 | } 304 | ], 305 | "name": "grantRole", 306 | "outputs": [], 307 | "stateMutability": "nonpayable", 308 | "type": "function" 309 | }, 310 | { 311 | "inputs": [ 312 | { 313 | "internalType": "bytes32", 314 | "name": "role", 315 | "type": "bytes32" 316 | }, 317 | { 318 | "internalType": "address", 319 | "name": "account", 320 | "type": "address" 321 | } 322 | ], 323 | "name": "hasRole", 324 | "outputs": [ 325 | { 326 | "internalType": "bool", 327 | "name": "", 328 | "type": "bool" 329 | } 330 | ], 331 | "stateMutability": "view", 332 | "type": "function" 333 | }, 334 | { 335 | "inputs": [ 336 | { 337 | "internalType": "bytes32", 338 | "name": "role", 339 | "type": "bytes32" 340 | }, 341 | { 342 | "internalType": "address", 343 | "name": "account", 344 | "type": "address" 345 | } 346 | ], 347 | "name": "renounceRole", 348 | "outputs": [], 349 | "stateMutability": "nonpayable", 350 | "type": "function" 351 | }, 352 | { 353 | "inputs": [ 354 | { 355 | "internalType": "bytes32", 356 | "name": "role", 357 | "type": "bytes32" 358 | }, 359 | { 360 | "internalType": "address", 361 | "name": "account", 362 | "type": "address" 363 | } 364 | ], 365 | "name": "revokeRole", 366 | "outputs": [], 367 | "stateMutability": "nonpayable", 368 | "type": "function" 369 | }, 370 | { 371 | "inputs": [ 372 | { 373 | "internalType": "address", 374 | "name": "asset", 375 | "type": "address" 376 | }, 377 | { 378 | "internalType": "bool", 379 | "name": "approved", 380 | "type": "bool" 381 | } 382 | ], 383 | "name": "setDigitalCurrencyApproval", 384 | "outputs": [], 385 | "stateMutability": "nonpayable", 386 | "type": "function" 387 | }, 388 | { 389 | "inputs": [ 390 | { 391 | "internalType": "contract RealTokenizado", 392 | "name": "tokenSender", 393 | "type": "address" 394 | }, 395 | { 396 | "internalType": "contract RealTokenizado", 397 | "name": "tokenReceiver", 398 | "type": "address" 399 | }, 400 | { 401 | "internalType": "address", 402 | "name": "receiver", 403 | "type": "address" 404 | }, 405 | { 406 | "internalType": "uint256", 407 | "name": "amount", 408 | "type": "uint256" 409 | } 410 | ], 411 | "name": "startSwap", 412 | "outputs": [], 413 | "stateMutability": "nonpayable", 414 | "type": "function" 415 | }, 416 | { 417 | "inputs": [ 418 | { 419 | "internalType": "bytes4", 420 | "name": "interfaceId", 421 | "type": "bytes4" 422 | } 423 | ], 424 | "name": "supportsInterface", 425 | "outputs": [ 426 | { 427 | "internalType": "bool", 428 | "name": "", 429 | "type": "bool" 430 | } 431 | ], 432 | "stateMutability": "view", 433 | "type": "function" 434 | } 435 | ] -------------------------------------------------------------------------------- /arquitetura.md: -------------------------------------------------------------------------------- 1 | # Arquitetura do piloto do Real Digital 2 | 3 | ## Objetivo 4 | 5 | Esta documentação tem como objetivo apresentar a arquitetura definida para o piloto do Real Digital. 6 | 7 | Por se tratar de um piloto em ambiente de testes, a arquitetura apresentada está sujeita a constantes evoluções que serão refletidas na documentação apresentada. 8 | 9 | ## Hyperledger Besu para redes privadas 10 | 11 | **Versão do Hyperledger Besu** utilizada na rede do piloto do Real Digital: 12 | [23.4.1](https://github.com/hyperledger/besu/releases/tag/23.4.1). 13 | 14 | Para uso de versões superiores, a compatibilidade deve ser verificada com a equipe de desenvolvimento do piloto. Ao longo do projeto poderão ser testadas atualizações de versões. 15 | 16 | **Consenso** utilizado na rede do piloto do Real Digital: 17 | [QBFT](https://besu.hyperledger.org/private-networks/how-to/configure/consensus/qbft/) 18 | 19 | **Permissionamento** do nó do participante na rede: 20 | A permissão é realizada [onchain](https://besu.hyperledger.org/private-networks/concepts/permissioning/onchain/#permissioning-contracts) pelo Banco Central do Brasil. Mais detalhes no passo de [conexão com a rede](ingresso.md). 21 | 22 | Será utilizada a [versão 2](https://besu.hyperledger.org/private-networks/how-to/use-permissioning/onchain/#specify-the-permissioning-contract-interface-version) do contract interface para o permissionamento **(permissions-nodes-contract-version)**. 23 | 24 | ## Topologia 25 | 26 | A imagem abaixo mostra a arquitetura inicial proposta para a rede do piloto do Real Digital. 27 | 28 |   29 | 30 | ![Topologia](topologia.png "Arquitetura do piloto da rede do real digital") 31 | 32 |   33 | 34 | - A comunicação entre os nós da rede se dá por meio da RSFN. 35 | 36 | - Cada participante do piloto, à exceção do Banco Central do Brasil, possui um único nó na rede. 37 | 38 | - De forma a garantir disponibilidade e resiliência à rede foram disponibilizados: 39 | - no Banco Central do Brasil (Brasília): 4 validadores e 2 fullnodes, implantados em sites diferentes. 40 | - no Banco Central do Brasil (RJ, Selic - infraestrutura apartada): 2 validadores e 2 fullnodes, implantados em sites diferentes. 41 | 42 | - Todo tráfego que passará na RSFN será P2P (TCP/UDP). 43 | 44 | - Não haverá tráfego RPC na RSFN, ou seja, as portas RPCs devem ser liberadas apenas no âmbito de cada participante para acesso ao seu próprio nó. 45 | 46 | - As portas RPC não devem estar abertas na rede e recomenda-se que, mesmo na rede interna, seja configurado controle de acesso por firewall e por autenticação. 47 | 48 | - Não é necessário configurar um DNS para o nó do participante. 49 | 50 | [<<< Voltar](README.md) 51 | -------------------------------------------------------------------------------- /config.toml: -------------------------------------------------------------------------------- 1 | # Every possible CLI should be in this file. 2 | # 3 | # Please use a plausible value, besu has to at least be able to parse it. 4 | # If it is a multi-valued CLI make it a TOML array. 5 | # If it is a number or boolean make it a number or boolean 6 | # All other config options are strings, and must be quoted. 7 | 8 | # Node Information 9 | # Customizar 10 | data-path="/caminho/para/a/pasta/data" 11 | genesis-file="/caminho/para/o/arquivo/genesis.json" 12 | revert-reason-enabled=true 13 | identity="" 14 | 15 | logging="INFO" 16 | 17 | # DOCKER | KUBERNETES | AUTO | NONE 18 | # Customizar 19 | nat-method="NONE" 20 | 21 | min-gas-price=0 22 | 23 | # Transaction Pool 24 | tx-pool-retention-hours=999 25 | tx-pool-limit-by-account-percentage=1 26 | tx-pool-max-size=20000 27 | 28 | # P2P network 29 | p2p-enabled=true 30 | discovery-enabled=true 31 | #p2p-host="0.0.0.0" 32 | p2p-port=30303 33 | max-peers=25 34 | 35 | host-allowlist=["*"] 36 | 37 | # JSON-RPC 38 | rpc-http-api=["DEBUG","ETH", "ADMIN", "WEB3", "QBFT", "NET", "EEA", "PRIV", "PERM","TXPOOL","PLUGINS","MINER","TRACE"] 39 | rpc-http-cors-origins=["*"] 40 | rpc-http-enabled=true 41 | rpc-http-max-active-connections=2000 42 | #rpc-http-authentication-enabled=true 43 | #rpc-http-authentication-credentials-file="/etc/auth/auth.toml" 44 | 45 | # GRAPHQL-RPC 46 | graphql-http-enabled=false 47 | graphql-http-host="0.0.0.0" 48 | graphql-http-port=8547 49 | graphql-http-cors-origins=["*"] 50 | 51 | # WebSockets API 52 | rpc-ws-enabled=false 53 | rpc-ws-host="0.0.0.0" 54 | rpc-ws-port=8546 55 | rpc-ws-api=["DEBUG","ETH", "ADMIN", "WEB3", "QBFT", "NET", "EEA", "PRIV", "PERM"] 56 | rpc-ws-authentication-enabled=false 57 | 58 | # Metrics 59 | metrics-enabled=false 60 | metrics-host="0.0.0.0" 61 | metrics-port=9545 62 | 63 | # Permissioning (utilizar esses paramêtros para habilitar a permissão) 64 | permissions-nodes-contract-enabled=true 65 | permissions-nodes-contract-address="0x0000000000000000000000000000000000009999" 66 | permissions-nodes-contract-version=2 67 | -------------------------------------------------------------------------------- /exemplos/README.md: -------------------------------------------------------------------------------- 1 | # Exemplos de interação com os _smart contracts_ 2 | 3 | Aqui estão sendo disponibilizados alguns exemplos de interação com os contratos inteligentes, de maneira a guiar o desenvolvimento por parte dos participantes. 4 | 5 | Os exemplos estarão escritos em Typescript usando o framework [Hardhat](https://hardhat.org/). Isso não é uma recomendação do uso da ferramenta por parte do Banco Central do Brasil. Os participantes são livres para desenvolverem a interação com os contratos inteligentes da forma que bem entenderem. 6 | 7 | Esse código foi testado mas não foi feita nenhuma auditoria ou análise de vulnerabilidade. Não recomendamos o uso em produção, especialmente o uso de chaves privadas no arquivo de configuração do Hardhat. 8 | 9 | [Exemplo 1](example1.ts): 10 | Enable Account / Mint and Burn. 11 | 12 | [Exemplo 2](example2.ts): 13 | Buscar default account participant e realizar transferência de CBDC. 14 | 15 | [Exemplo 3](example3.ts): 16 | Participante ativando um endereço para um cliente e realizando uma emissão de DVt ou MEt. 17 | 18 | [Exemplo 4](example4.ts): 19 | Participante buscando o endereço de Real Digital no contrato de AddressDiscovery. 20 | 21 | [Exemplo 5](example5.ts): 22 | Operação 1002: Registro de liquidação de oferta pública. 23 | 24 | [Exemplo 6](example6.ts): 25 | Operação 1052: Registro de operação de compra e venda entre participantes. 26 | 27 | [Exemplo 7](example7.ts): 28 | TPFt: Consulta de saldo. 29 | 30 | [Exemplo 8](example8.ts): 31 | Participantes fazendo swap de Real Tokenizado em um passo. 32 | 33 | [Exemplo 9](example9.ts): 34 | Operação 1052: Registro de operação de compra e venda entre um participante e seu cliente. 35 | 36 | [Exemplo 10](example10.ts): 37 | Operação 1052: Registro de operação de compra e venda entre dois clientes do mesmo participante. 38 | 39 | [Exemplo 11](example11.ts): 40 | Operação 1052: Registro de operação de compra e venda entre um participante e um cliente de um participante distinto. 41 | 42 | [Exemplo 12](example12.ts): 43 | Operação 1052: Registro de operação de compra e venda entre dois clientes de participantes distintos. 44 | 45 | [<<< Voltar](../README.md) 46 | -------------------------------------------------------------------------------- /exemplos/approveRealDigital.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from "hardhat"; 2 | import abiRealDigital from "../abi/RealDigital.json"; 3 | 4 | /** 5 | * Real Digital e TPFt - como dar aprovações para o contrato TPFtDvP necessárias em algumas operações. 6 | */ 7 | export async function approveRealDigital( 8 | realDigitalAddress: string, 9 | walletAccount: string, 10 | realDigitalAmount: number, 11 | tpftDvpAddress: string, 12 | swapOneStepFromAddrress?: string) 13 | { 14 | 15 | /** 16 | * Obtém contrato Real Digital 17 | */ 18 | const realDigital = await ethers.getContractAt( 19 | abiRealDigital, 20 | realDigitalAddress, 21 | ); 22 | 23 | /** 24 | * Endereço do participante associado ao Real Digital 25 | */ 26 | const walletAccountSigner = await ethers.getSigner(walletAccount); 27 | 28 | /** 29 | * Aprova o contrato TPFtDvP a negociar valor de Real Digital 30 | */ 31 | await realDigital.connect(walletAccountSigner).approve(tpftDvpAddress, realDigitalAmount); 32 | 33 | if(swapOneStepFromAddrress) { 34 | /** 35 | * Aprova o contrato SwapOneStepFrom a negociar valor de Real Digital 36 | */ 37 | await realDigital.connect(walletAccountSigner).approve(swapOneStepFromAddrress, realDigitalAmount); 38 | } 39 | } 40 | 41 | const realDigitalAmount = 100; 42 | 43 | /** 44 | * Função a ser chamada para aprovar uma quantidade de Real Digital para o contrato TPFtDvP 45 | * de acordo com os critérios do participante. 46 | */ 47 | approveRealDigital( 48 | '', 49 | '', 50 | realDigitalAmount, 51 | '' 52 | ) 53 | 54 | /** 55 | * Função a ser chamada para aprovar uma quantidade de Real Digital para o contrato TPFtDvP e SwapOneStepFrom 56 | * de acordo com os critérios do participante. 57 | */ 58 | approveRealDigital( 59 | '', 60 | '', 61 | realDigitalAmount, 62 | '', 63 | '' 64 | ) 65 | -------------------------------------------------------------------------------- /exemplos/approveRealTokenizado.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from "hardhat"; 2 | import abiRealTokenizado from "../abi/RealTokenizado.json"; 3 | 4 | /** 5 | * Real Tokenizado - como dar aprovações para o contrato TPFtDvP necessárias em algumas operações. 6 | */ 7 | export async function approveRealTokenizado( 8 | realTokenizadoAddress: string, 9 | walletAccount: string, 10 | realTokenizadoAmount: number, 11 | tpftDvpAddress: string) 12 | { 13 | /** 14 | * Obtém contrato Real Tokenizado 15 | */ 16 | const realTokenizado = await ethers.getContractAt( 17 | abiRealTokenizado, 18 | realTokenizadoAddress 19 | ); 20 | 21 | /** 22 | * Endereço do participante/cliente associado ao Real Tokenizado 23 | */ 24 | const walletAccountSigner = await ethers.getSigner(walletAccount); 25 | 26 | /** 27 | * Aprova o contrato TPFtDvP a negociar valor de Real Tokenizado 28 | */ 29 | await realTokenizado.connect(walletAccountSigner).approve(tpftDvpAddress, realTokenizadoAmount); 30 | } 31 | 32 | 33 | const realTokenizadoAmount = 100; 34 | 35 | /** 36 | * Função a ser chamada para aprovar uma quantidade de Real Tokenizado para o contrato TPFtDvP 37 | * de acordo com os critérios do cliente. 38 | */ 39 | approveRealTokenizado( 40 | '', 41 | '', 42 | realTokenizadoAmount, 43 | '' 44 | ) 45 | -------------------------------------------------------------------------------- /exemplos/example1.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from "hardhat"; 2 | import abiSTR from "../abi/STR.json"; 3 | import abiRealDigitalEnableAccount from "../abi/RealDigitalEnableAccount.json"; 4 | 5 | function delay(ms: number) { 6 | return new Promise( resolve => setTimeout(resolve, ms) ); 7 | }; 8 | 9 | // Habilita uma conta, emite valores e destrói valores. 10 | async function example1() { 11 | const STR = await ethers.getContractAt(abiSTR, ''); 12 | const enableAccount = await ethers.getContractAt(abiRealDigitalEnableAccount, ''); 13 | const [, participantX, anotherAddressParticipantX ] = await ethers.getSigners(); 14 | 15 | // Após ter um endereço habilitado pelo BACEN, a instituição pode habilitar novos endereços 16 | await enableAccount.connect(participantX).enableAccount(anotherAddressParticipantX.address); 17 | 18 | // Sempre que um novo endereço for habilitado deve esperar o tempo de um bloco para estar apto a ser usado 19 | await delay(5000); 20 | 21 | // Emite Real Digital para a carteira do participante 22 | // Lembrar que são duas casas decimais, então se passar o valor 100 = 1 Real Digital 23 | // ethers.utils.parseUnits("100.50", 2) pode ser usado para formatar um valor para o contrato 24 | const mintResponse = await STR.connect(anotherAddressParticipantX).requestToMint(ethers.utils.parseUnits("100.50", 2)); 25 | console.log(mintResponse.hash); 26 | const burnResponse = await STR.connect(anotherAddressParticipantX).requestToBurn(ethers.utils.parseUnits("100", 2)); 27 | console.log(burnResponse.hash); 28 | } -------------------------------------------------------------------------------- /exemplos/example10.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from "hardhat"; 2 | import { BigNumber } from "ethers"; 3 | import { setApprovalForAll } from "./setApprovalForAll"; 4 | import { approveRealTokenizado } from "./approveRealTokenizado"; 5 | import abiITPFtOperation1052 from "../abi/ITPFtOperation1052.json"; 6 | import abiAddressDiscovery from "../abi/AddressDiscovery.json"; 7 | 8 | 9 | /** 10 | * TPFtOperation1052 - Permite que clientes pertencentes a participantes cadastrados no Real Digital 11 | * realizem a operação de compra e venda envolvendo Título Público Federal tokenizado (TPFt) 12 | * entre si e/ou seus clientes utilizando seus endereços de carteiras. 13 | * @dev Para que a operação seja concluida com sucesso, é necessário que cada carteira do participante aprove o endereço do contrato TPFtDvP. 14 | * Além disso, há dois cénarios possíveis: 15 | * 1. Quando os clientes estão no mesmo participante; 16 | * 2. Quando os clientes estão em participantes diferentes: nesse casso, é necessário que o contrato SwapOneStepFrom 17 | * no Real Digital seja aprovado por meio da função "approve" usando a carteira do participante cujo cliente é um cessionário. 18 | * Adicionalmente, as carteiras dos participantes/clientes devem aprovar o endereço do contrato TPFtDvP 19 | * em seus Real Tokenizados usando a função "approve" e no TPFt por meio da função "setApprovalForAll". 20 | * 21 | * 22 | */ 23 | async function tradeByClientAddressesInSameParticipant() { 24 | 25 | /** 26 | * Obtém contrato Address Discovery 27 | */ 28 | const addressDiscrovery = await ethers.getContractAt( 29 | abiAddressDiscovery, 30 | '' 31 | ); 32 | 33 | /** 34 | * Endereço do TPFt 35 | */ 36 | const tpftAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFt')); 37 | 38 | /** 39 | * Endereço do TPFtDvP 40 | */ 41 | const tpftDvpAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtDvP')); 42 | 43 | /** 44 | * Endereço do TPFtOperation1052 45 | */ 46 | const tpftOperation1052Address = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtOperation1052')); 47 | 48 | /** 49 | * Obtém contrato TPFtOperation1052 50 | */ 51 | const TPFtOperation1052 = await ethers.getContractAt( 52 | abiITPFtOperation1052, 53 | tpftOperation1052Address 54 | ); 55 | 56 | /** 57 | * Sender refere-se ao cedente (detentor de TPFts) 58 | */ 59 | const senderAccount = ''; 60 | const senderAccountSigner = await ethers.getSigner(senderAccount); 61 | 62 | //Endereço do RealTokenizedSender 63 | const realTokenizadoSenderAddress = '' 64 | 65 | /** 66 | * Receiver refere-se ao cessionário (não detentor de TPFts) 67 | */ 68 | const receiverAccount = ''; 69 | const receiverAccountSigner = await ethers.getSigner(receiverAccount); 70 | 71 | //Endereço do RealTokenizedReceiver 72 | const realTokenizadoReceiverAddress = '' 73 | 74 | const params = { 75 | operationId: "", 76 | tpftData: { 77 | acronym: "", 78 | code: "", 79 | // Ex: const date = new Date("2023-09-26"); Math.floor(date.getTime() / 1000); retorno 1695686400 80 | maturityDate: "", 81 | }, 82 | tpftAmount: "", 83 | unitPrice: "", 84 | }; 85 | 86 | /** 87 | * Quando o cedente está transmitindo o comando da operação. 88 | */ 89 | const callerPartBySender = BigNumber.from(0); 90 | /** 91 | * Quando o cessionário está transmitindo o comando da operação. 92 | */ 93 | const callerPartByReceiver = BigNumber.from(1); 94 | 95 | /** 96 | * Função a ser chamada somente uma vez para aprovar o contrato TPFtDvP no TPFt. 97 | */ 98 | setApprovalForAll(senderAccount, tpftAddress, tpftDvpAddress) 99 | 100 | /** 101 | * Função a ser chamada para aprovar uma quantidade de Real Tokenizado para o contrato TPFtDvP 102 | * de acordo com os critérios do cliente. 103 | */ 104 | const realTokenizadoAmount = 1000; 105 | 106 | approveRealTokenizado(realTokenizadoReceiverAddress, receiverAccount, realTokenizadoAmount, tpftDvpAddress) 107 | 108 | /** 109 | * Registro por parte do sender (cedente) para realizar operação de 110 | * compra e venda informando o endereço das carteiras. 111 | */ 112 | const senderTransaction = await TPFtOperation1052 113 | .connect(senderAccountSigner) 114 | ?.[ 115 | "trade(uint256,address,address,address,address,uint8,(string,string,uint256),uint256,uint256)" 116 | ]( 117 | params.operationId, 118 | senderAccount, 119 | realTokenizadoSenderAddress, 120 | receiverAccount, 121 | realTokenizadoReceiverAddress, 122 | callerPartBySender, 123 | params.tpftData, 124 | params.tpftAmount, 125 | params.unitPrice 126 | ); 127 | 128 | /** 129 | * Aguarda até que a transação enviada pelo sender seja confirmada na blockchain. 130 | */ 131 | await senderTransaction.wait(); 132 | 133 | /** 134 | * Registro por parte do receiver (cessionário) para realizar operação de 135 | * compra e venda informando o endereço das carteiras. 136 | */ 137 | const receiverTransaction = await TPFtOperation1052 138 | .connect(receiverAccountSigner) 139 | ?.[ 140 | "trade(uint256,address,address,address,address,uint8,(string,string,uint256),uint256,uint256)" 141 | ]( 142 | params.operationId, 143 | senderAccount, 144 | realTokenizadoSenderAddress, 145 | receiverAccount, 146 | realTokenizadoReceiverAddress, 147 | callerPartByReceiver, 148 | params.tpftData, 149 | params.tpftAmount, 150 | params.unitPrice 151 | ); 152 | 153 | /** 154 | * Aguarda até que a transação enviada pelo receiver seja confirmada na blockchain. 155 | */ 156 | await receiverTransaction.wait(); 157 | 158 | /** 159 | * Resposta da execução da operação de compra e venda 160 | */ 161 | console.log(senderTransaction.hash); 162 | console.log(receiverTransaction.hash); 163 | } 164 | -------------------------------------------------------------------------------- /exemplos/example11.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from "hardhat"; 2 | import { BigNumber } from "ethers"; 3 | import { setApprovalForAll } from "./setApprovalForAll"; 4 | import { approveRealDigital } from "./approveRealDigital"; 5 | import { approveRealTokenizado } from "./approveRealTokenizado"; 6 | import abiITPFtOperation1052 from "../abi/ITPFtOperation1052.json"; 7 | import abiAddressDiscovery from "../abi/AddressDiscovery.json"; 8 | 9 | /** 10 | * TPFtOperation1052 - Permite que a operação de compra e venda envolvendo Título Público Federal tokenizado (TPFt) 11 | * seja realizada entre um participante (cedente) e um cliente (cessionário) pertencente a um outro participante 12 | * utilizando seus endereços de carteiras. Ambos participantes devem estar cadastrados no Real Digital. 13 | * Além disso, o cliente deve estar cadastrado no Real Tokenizado do seu respetivo participante. 14 | * Como o cliente encontra-se em um participante diferente, é necessário que o contrato SwapOneStepFrom 15 | * no Real Digital seja aprovado por meio da função "approve" usando a carteira do participante cujo 16 | * cliente é um cessionário. 17 | * @dev Para que a operação seja concluida com sucesso, a carteira do participante e a do cliente devem 18 | * aprovar o endereço do contrato TPFtDvP em seus respetivos Real Tokenizados usando a função "approve" e 19 | * no TPFt por meio da função "setApprovalForAll". 20 | */ 21 | async function tradeParticipantAndDifferentClient() { 22 | 23 | /** 24 | * Obtém contrato Address Discovery 25 | */ 26 | const addressDiscrovery = await ethers.getContractAt( 27 | abiAddressDiscovery, 28 | '' 29 | ); 30 | 31 | /** 32 | * Endereço do TPFt 33 | */ 34 | const tpftAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFt')); 35 | 36 | /** 37 | * Endereço do TPFtDvP 38 | */ 39 | const tpftDvpAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtDvP')); 40 | 41 | /** 42 | * Endereço do SwapOneStepFrom 43 | */ 44 | const swapOneStepFromAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('SwapOneStepFrom')); 45 | 46 | /** 47 | * Endereço do Real Digital 48 | */ 49 | const realDigitalAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('RealDigital')); 50 | 51 | /** 52 | * Endereço do TPFtOperation1052 53 | */ 54 | const tpftOperation1052Address = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtOperation1052')); 55 | 56 | /** 57 | * Obtém contrato TPFtOperation1052 58 | */ 59 | const TPFtOperation1052 = await ethers.getContractAt( 60 | abiITPFtOperation1052, 61 | tpftOperation1052Address 62 | ); 63 | 64 | /** 65 | * senderParticipant (Ex. Participante A) refere-se ao cedente (detentor de TPFts). 66 | * receiverParticipant (Ex. Participante B) refere-se a um outro participante na rede. 67 | */ 68 | const [, , senderParticipant, receiverParticipant] = await ethers.getSigners(); 69 | const senderParticipantAddress = senderParticipant.address; 70 | const receiverParticipantAddress = receiverParticipant.address; 71 | 72 | /** 73 | * Endereço do RealTokenizedParticipantSenderAddress (Ex. Endereço do Real Tokenizado do Participante A) 74 | */ 75 | const realTokenizedParticipantSenderAddress = '' 76 | 77 | /** 78 | * receiverClient (Ex. Cliente do Participante B) refere-se ao cessionário (não detentor de TPFts) 79 | * que pertence ao receiverParticipant. 80 | */ 81 | const receiverClientAddress = ''; 82 | const receiverClient = await ethers.getSigner(receiverClientAddress); 83 | 84 | /** 85 | * Endereço do RealTokenizedParticipantReceiverAddress (Ex. Endereço do Real Tokenizado do Participante B) 86 | * @dev Note-se que o receiverClient (Ex. Cliente do Participante B) deve estar cadastrado no 87 | * RealTokenizedParticipantReceiverAddress (Ex. Real Tokenizado do Participante B) 88 | */ 89 | const realTokenizedParticipantReceiverAddress = '' 90 | 91 | const params = { 92 | operationId: "", 93 | tpftData: { 94 | acronym: "", 95 | code: "", 96 | // Ex: const date = new Date("2023-09-26"); Math.floor(date.getTime() / 1000); retorno 1695686400 97 | maturityDate: "", 98 | }, 99 | tpftAmount: "", 100 | unitPrice: "", 101 | }; 102 | 103 | /** 104 | * Quando o cedente está transmitindo o comando da operação. 105 | */ 106 | const callerPartBySender = BigNumber.from(0); 107 | /** 108 | * Quando o cessionário está transmitindo o comando da operação. 109 | */ 110 | const callerPartByReceiver = BigNumber.from(1); 111 | 112 | /** 113 | * Função a ser chamada somente uma vez para aprovar o contrato TPFtDvP no TPFt. 114 | */ 115 | setApprovalForAll(senderParticipantAddress, tpftAddress, tpftDvpAddress) 116 | 117 | /** 118 | * Função a ser chamada para aprovar uma quantidade de Real Digital para o contrato TPFtDvP 119 | * de acordo com os critérios do participante (Ex. Participante B) do receiverClient (cessionário). 120 | */ 121 | const realDigitalAmount = 1000; 122 | 123 | approveRealDigital(realDigitalAddress, receiverParticipantAddress, realDigitalAmount, tpftDvpAddress, swapOneStepFromAddress) 124 | 125 | /** 126 | * Função a ser chamada para aprovar uma quantidade de Real Tokenizado para o contrato TPFtDvP 127 | * de acordo com os critérios do cliente. 128 | */ 129 | const realTokenizadoAmount = 1000; 130 | 131 | approveRealTokenizado(realTokenizedParticipantReceiverAddress, receiverClientAddress, realTokenizadoAmount, tpftDvpAddress) 132 | 133 | /** 134 | * Registro por parte do senderParticipant (cedente) para realizar operação de 135 | * compra e venda informando o endereço das carteiras. 136 | */ 137 | const senderTransaction = await TPFtOperation1052 138 | .connect(senderParticipant) 139 | ?.[ 140 | "trade(uint256,address,address,address,address,uint8,(string,string,uint256),uint256,uint256)" 141 | ]( 142 | params.operationId, 143 | senderParticipantAddress, 144 | realTokenizedParticipantSenderAddress, 145 | receiverClientAddress, 146 | realTokenizedParticipantReceiverAddress, 147 | callerPartBySender, 148 | params.tpftData, 149 | params.tpftAmount, 150 | params.unitPrice 151 | ); 152 | 153 | /** 154 | * Aguarda até que a transação enviada pelo sender seja confirmada na blockchain. 155 | */ 156 | await senderTransaction.wait(); 157 | 158 | /** 159 | * Registro por parte do receiverClient (cessionário) para realizar operação de 160 | * compra e venda informando o endereço das carteiras. 161 | */ 162 | const receiverTransaction = await TPFtOperation1052 163 | .connect(receiverClient) 164 | ?.[ 165 | "trade(uint256,address,address,address,address,uint8,(string,string,uint256),uint256,uint256)" 166 | ]( 167 | params.operationId, 168 | senderParticipantAddress, 169 | realTokenizedParticipantSenderAddress, 170 | receiverClientAddress, 171 | realTokenizedParticipantReceiverAddress, 172 | callerPartByReceiver, 173 | params.tpftData, 174 | params.tpftAmount, 175 | params.unitPrice 176 | ); 177 | 178 | /** 179 | * Aguarda até que a transação enviada pelo receiver seja confirmada na blockchain. 180 | */ 181 | await receiverTransaction.wait(); 182 | 183 | /** 184 | * Resposta da execução da operação de compra e venda 185 | */ 186 | console.log(senderTransaction.hash); 187 | console.log(receiverTransaction.hash); 188 | } 189 | -------------------------------------------------------------------------------- /exemplos/example12.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from "hardhat"; 2 | import { BigNumber } from "ethers"; 3 | import { setApprovalForAll } from "./setApprovalForAll"; 4 | import { approveRealDigital } from "./approveRealDigital"; 5 | import { approveRealTokenizado } from "./approveRealTokenizado"; 6 | import abiITPFtOperation1052 from "../abi/ITPFtOperation1052.json"; 7 | import abiAddressDiscovery from "../abi/AddressDiscovery.json"; 8 | 9 | 10 | 11 | /** 12 | * TPFtOperation1052 - Permite que clientes pertencentes a participantes cadastrados no Real Digital 13 | * realizem a operação de compra e venda envolvendo Título Público Federal tokenizado (TPFt) 14 | * entre si e/ou seus clientes utilizando seus endereços de carteiras. 15 | * @dev Para que a operação seja concluida com sucesso, é necessário que cada carteira do participante aprove o endereço do contrato TPFtDvP. 16 | * Além disso, há dois cénarios possíveis: 17 | * 1. Quando os clientes estão no mesmo participante; 18 | * 2. Quando os clientes estão em participantes diferentes: nesse casso, é necessário que o contrato SwapOneStepFrom 19 | * no Real Digital seja aprovado por meio da função "approve" usando a carteira do participante cujo cliente é um cessionário. 20 | * Adicionalmente, as carteiras dos participantes/clientes devem aprovar o endereço do contrato TPFtDvP 21 | * em seus Real Tokenizados usando a função "approve" e no TPFt por meio da função "setApprovalForAll". 22 | * 23 | * 24 | */ 25 | async function tradeByClientAddressesInDifferentParticipant() { 26 | 27 | /** 28 | * Obtém contrato Address Discovery 29 | */ 30 | const addressDiscrovery = await ethers.getContractAt( 31 | abiAddressDiscovery, 32 | '' 33 | ); 34 | 35 | /** 36 | * Endereço do TPFt 37 | */ 38 | const tpftAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFt')); 39 | 40 | /** 41 | * Endereço do TPFtDvP 42 | */ 43 | const tpftDvpAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtDvP')); 44 | 45 | /** 46 | * Endereço do SwapOneStepFrom 47 | */ 48 | const swapOneStepFromAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('SwapOneStepFrom')); 49 | 50 | /** 51 | * Endereço do Real Digital 52 | */ 53 | const realDigitalAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('RealDigital')); 54 | 55 | /** 56 | * Endereço do TPFtOperation1052 57 | */ 58 | const tpftOperation1052Address = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtOperation1052')); 59 | 60 | /** 61 | * Obtém contrato TPFtOperation1052 62 | */ 63 | const TPFtOperation1052 = await ethers.getContractAt( 64 | abiITPFtOperation1052, 65 | tpftOperation1052Address 66 | ); 67 | 68 | /** 69 | * Sender refere-se ao cedente (detentor de TPFts) 70 | */ 71 | const senderAccount = ''; 72 | const senderAccountSigner = await ethers.getSigner(senderAccount); 73 | 74 | //Endereço do RealTokenizedSender 75 | const realTokenizadoSenderAddress = '' 76 | 77 | /** 78 | * Receiver refere-se ao cessionário (não detentor de TPFts) 79 | */ 80 | const participantReceiverAccount = ''; 81 | const receiverAccount = ''; 82 | const receiverAccountSigner = await ethers.getSigner(receiverAccount); 83 | 84 | //Endereço do RealTokenizedReceiver 85 | const realTokenizadoReceiverAddress = '' 86 | 87 | const params = { 88 | operationId: "", 89 | tpftData: { 90 | acronym: "", 91 | code: "", 92 | // Ex: const date = new Date("2023-09-26"); Math.floor(date.getTime() / 1000); retorno 1695686400 93 | maturityDate: "", 94 | }, 95 | tpftAmount: "", 96 | unitPrice: "", 97 | }; 98 | 99 | /** 100 | * Quando o cedente está transmitindo o comando da operação. 101 | */ 102 | const callerPartBySender = BigNumber.from(0); 103 | /** 104 | * Quando o cessionário está transmitindo o comando da operação. 105 | */ 106 | const callerPartByReceiver = BigNumber.from(1); 107 | 108 | /** 109 | * Função a ser chamada somente uma vez para aprovar o contrato TPFtDvP no TPFt. 110 | */ 111 | setApprovalForAll(senderAccount, tpftAddress, tpftDvpAddress) 112 | 113 | /** 114 | * Função a ser chamada para aprovar uma quantidade de Real Digital para o contrato TPFtDvP 115 | * de acordo com os critérios do participante do cliente (cessionário). 116 | */ 117 | const realDigitalAmount = 1000; 118 | 119 | approveRealDigital(realDigitalAddress, participantReceiverAccount, realDigitalAmount, tpftDvpAddress, swapOneStepFromAddress) 120 | 121 | /** 122 | * Função a ser chamada para aprovar uma quantidade de Real Tokenizado para o contrato TPFtDvP 123 | * de acordo com os critérios do cliente. 124 | */ 125 | const realTokenizadoAmount = 1000; 126 | 127 | approveRealTokenizado(realTokenizadoReceiverAddress, receiverAccount, realTokenizadoAmount, tpftDvpAddress) 128 | 129 | /** 130 | * Registro por parte do sender (cedente) para realizar operação de 131 | * compra e venda informando o endereço das carteiras. 132 | */ 133 | const senderTransaction = await TPFtOperation1052 134 | .connect(senderAccountSigner) 135 | ?.[ 136 | "trade(uint256,address,address,address,address,uint8,(string,string,uint256),uint256,uint256)" 137 | ]( 138 | params.operationId, 139 | senderAccount, 140 | realTokenizadoSenderAddress, 141 | receiverAccount, 142 | realTokenizadoReceiverAddress, 143 | callerPartBySender, 144 | params.tpftData, 145 | params.tpftAmount, 146 | params.unitPrice 147 | ); 148 | 149 | /** 150 | * Aguarda até que a transação enviada pelo sender seja confirmada na blockchain. 151 | */ 152 | await senderTransaction.wait(); 153 | 154 | /** 155 | * Registro por parte do receiver (cessionário) para realizar operação de 156 | * compra e venda informando o endereço das carteiras. 157 | */ 158 | const receiverTransaction = await TPFtOperation1052 159 | .connect(receiverAccountSigner) 160 | ?.[ 161 | "trade(uint256,address,address,address,address,uint8,(string,string,uint256),uint256,uint256)" 162 | ]( 163 | params.operationId, 164 | senderAccount, 165 | realTokenizadoSenderAddress, 166 | receiverAccount, 167 | realTokenizadoReceiverAddress, 168 | callerPartByReceiver, 169 | params.tpftData, 170 | params.tpftAmount, 171 | params.unitPrice 172 | ); 173 | 174 | /** 175 | * Aguarda até que a transação enviada pelo receiver seja confirmada na blockchain. 176 | */ 177 | await receiverTransaction.wait(); 178 | 179 | /** 180 | * Resposta da execução da operação de compra e venda 181 | */ 182 | console.log(senderTransaction.hash); 183 | console.log(receiverTransaction.hash); 184 | } 185 | -------------------------------------------------------------------------------- /exemplos/example2.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from "hardhat"; 2 | import abiRealDigital from '../abi/RealDigital.json'; 3 | import abiRealDigitalDefaultAccount from '../abi/RealDigitalDefaultAccount.json'; 4 | 5 | // Busca a conta padrão do participante e realiza transferência de CBDC 6 | async function example2() { 7 | const defaultAccount = await ethers.getContractAt(abiRealDigitalDefaultAccount, ''); 8 | const cbdc = await ethers.getContractAt(abiRealDigital, 'Endereço contrato RealDigital'); 9 | const [, participantX] = await ethers.getSigners(); 10 | 11 | // Identificador do participante que vai receber a transferência 12 | const cnpj8AnotherParticipant = '87654321'; 13 | 14 | // Busca o endereço padrão para a transferência 15 | const address = await defaultAccount.defaultAccount(cnpj8AnotherParticipant); 16 | 17 | // Realiza a transferência de CBDC 18 | const response = await cbdc.connect(participantX).transfer(address, ethers.utils.parseUnits("100", 2)); 19 | 20 | console.log(response.hash); 21 | } -------------------------------------------------------------------------------- /exemplos/example3.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from "hardhat"; 2 | import abiRealTokenizado from '../abi/RealTokenizado.json'; 3 | 4 | function delay(ms: number) { 5 | return new Promise( resolve => setTimeout(resolve, ms) ); 6 | }; 7 | 8 | // Participante ativando um endereço para um cliente e realizando uma emissão de DVt ou MEt 9 | async function example3() { 10 | const dvtParticipantX = await ethers.getContractAt(abiRealTokenizado, ''); 11 | const [, participantX, customerX ] = await ethers.getSigners(); 12 | 13 | // participante do piloto habilitando endereço para cliente 14 | await dvtParticipantX.connect(participantX).enableAccount(customerX.address); 15 | 16 | await delay(5000); 17 | 18 | // Participante do piloto emitindo dvt para cliente 19 | const response = await dvtParticipantX.connect(participantX).mint(customerX.address, ethers.utils.parseUnits("100", 2)); 20 | 21 | console.log(response.hash); 22 | } -------------------------------------------------------------------------------- /exemplos/example4.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from "hardhat"; 2 | import abiAddressDiscovery from '../abi/AddressDiscovery.json'; 3 | 4 | // busca o endereço do contrato do RealDigital 5 | async function example4() { 6 | const contract = await ethers.getContractAt(abiAddressDiscovery, ''); 7 | const realDigitalAddress = await contract.addressDiscovery(ethers.utils.id('RealDigital')); 8 | 9 | console.log(realDigitalAddress); 10 | } -------------------------------------------------------------------------------- /exemplos/example5.ts: -------------------------------------------------------------------------------- 1 | import {ethers} from "hardhat"; 2 | import { BigNumber } from "ethers"; 3 | import { approveRealDigital } from "./approveRealDigital"; 4 | import abiITPFtOperation1002 from "../abi/ITPFtOperation1002.json"; 5 | import abiAddressDiscovery from "../abi/AddressDiscovery.json"; 6 | 7 | /** 8 | * TPFtOperation1002 - Permite que o Bacen realize a liquidação de oferta pública 9 | * envolvendo Título Público Federal tokenizado (TPFt) para um participante 10 | * que esteja cadastrado no Real Digital utilizando seus CNPJ8. 11 | * @dev Para a operação ocorrer é necessário que cada carteira de aprovação para o endereço contrato TPFtDvP 12 | * no Real Digital através da função approve e no TPFt através setApprovalForAll. 13 | */ 14 | async function tpftOperation1002() { 15 | 16 | /** 17 | * Obtém contrato Address Discovery 18 | */ 19 | const addressDiscrovery = await ethers.getContractAt( 20 | abiAddressDiscovery, 21 | '' 22 | ); 23 | 24 | /** 25 | * Endereço do TPFtDvP 26 | */ 27 | const tpftDvpAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtDvP')); 28 | 29 | /** 30 | * Endereço do Real Digital 31 | */ 32 | const realDigitalAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('RealDigital')); 33 | 34 | /** 35 | * Endereço do TPFtOperation1002 36 | */ 37 | const tpftOperation1002Address = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtOperation1002')); 38 | 39 | /** 40 | * Obtém contrato TPFtOperation1002 41 | */ 42 | const TPFtOperation1002 = await ethers.getContractAt( 43 | abiITPFtOperation1002, 44 | tpftOperation1002Address 45 | ); 46 | 47 | /** 48 | * Sender refere-se ao cedente - Bacen atua a nome da Secretaria Nacional do Tesouro (STN). 49 | * Receiver refere-se ao cessionário - Instituição Financeira Participante cadastrada no Real Digital. 50 | * Restrições: 51 | * 1. O endereço da carteira do Bacen deverá ter a _role_ de AUCTION_PLACEMENT_ROLE. 52 | * 2. Tanto o endereço de carteira da STN como da Instituição Financeira Participante 53 | * deverão estar habilitados no contrato TPFt. 54 | */ 55 | 56 | const [ , , receiverAccount ] = await ethers.getSigners(); 57 | 58 | const params = { 59 | operationId: '', 60 | cnpj8Sender: '', 61 | cnpj8Receiver: '', 62 | tpftData: { 63 | acronym: '', 64 | code: "", 65 | // Ex: const date = new Date("2023-09-26"); Math.floor(date.getTime() / 1000); retorno 1695686400 66 | maturityDate: '', 67 | }, 68 | tpftAmount: '', 69 | unitPrice: '', 70 | } 71 | 72 | /** 73 | * Quando o cedente está transmitindo o comando da operação. 74 | */ 75 | const callerPartBySender = BigNumber.from(0) 76 | /** 77 | * Quando o cessionário está transmitindo o comando da operação. 78 | */ 79 | const callerPartByReceiver = BigNumber.from(1) 80 | 81 | /** 82 | * Função a ser chamada para aprovar uma quantidade de Real Digital para o contrato TPFtDvP 83 | * de acordo com os critérios do participante. 84 | */ 85 | const realDigitalAmount = 1000; 86 | 87 | approveRealDigital(realDigitalAddress, receiverAccount.address, realDigitalAmount, tpftDvpAddress) 88 | 89 | /** 90 | * Registro da liquidação de oferta pública de TPFt por parte do receiver 91 | * chamando a função auctionPlacement 92 | */ 93 | const receiverTransaction = await TPFtOperation1002 94 | .connect(receiverAccount) 95 | .auctionPlacement( 96 | params.operationId, 97 | params.cnpj8Sender, 98 | params.cnpj8Receiver, 99 | callerPartByReceiver, 100 | params.tpftData, 101 | params.tpftAmount, 102 | params.unitPrice 103 | ) 104 | 105 | /** 106 | * Aguarda até que a transação enviada pelo receiver seja confirmada na blockchain. 107 | */ 108 | await receiverTransaction.wait(); 109 | 110 | /** 111 | * Resposta da operação de liquidação de oferta pública de TPFt. 112 | */ 113 | console.log(receiverTransaction.hash); 114 | } 115 | -------------------------------------------------------------------------------- /exemplos/example6.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from "hardhat"; 2 | import { BigNumber } from "ethers"; 3 | import { setApprovalForAll } from "./setApprovalForAll"; 4 | import { approveRealDigital } from "./approveRealDigital"; 5 | import abiITPFtOperation1052 from "../abi/ITPFtOperation1052.json"; 6 | import abiAddressDiscovery from "../abi/AddressDiscovery.json"; 7 | 8 | /** 9 | * TPFtOperation1052 - Permite que participantes cadastrados no Real Digital 10 | * realizem a operação de compra e venda envolvendo Título Público Federal tokenizado (TPFt) 11 | * entre si e/ou seus clientes utilizando seus CNPJ8s. 12 | * @dev Para a operação ocorrer é necessário que cada carteira de aprovação para o endereço contrato TPFtDvP 13 | * no Real Digital através da função approve e no TPFt através setApprovalForAll. 14 | */ 15 | async function tradeByCNPJ8() { 16 | /** 17 | * Obtém contrato Address Discovery 18 | */ 19 | const addressDiscrovery = await ethers.getContractAt( 20 | abiAddressDiscovery, 21 | '' 22 | ); 23 | 24 | /** 25 | * Endereço do TPFt 26 | */ 27 | const tpftAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFt')); 28 | 29 | /** 30 | * Endereço do TPFtDvP 31 | */ 32 | const tpftDvpAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtDvP')); 33 | 34 | /** 35 | * Endereço do Real Digital 36 | */ 37 | const realDigitalAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('RealDigital')); 38 | 39 | /** 40 | * Endereço do TPFtOperation1052 41 | */ 42 | const tpftOperation1052Address = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtOperation1052')); 43 | 44 | /** 45 | * Obtém contrato TPFtOperation1052 46 | */ 47 | const TPFtOperation1052 = await ethers.getContractAt( 48 | abiITPFtOperation1052, 49 | tpftOperation1052Address 50 | ); 51 | 52 | /** 53 | * Sender refere-se ao cedente (detentor de TPFts) e receiver refere-se ao cessionário (não detentor de TPFts) 54 | */ 55 | const [, senderAccount, receiverAccount] = await ethers.getSigners(); 56 | 57 | const params = { 58 | operationId: "", 59 | cnpj8Sender: "", 60 | cnpj8Receiver: "", 61 | tpftData: { 62 | acronym: "", 63 | code: "", 64 | // Ex: const date = new Date("2023-09-26"); Math.floor(date.getTime() / 1000); retorno 1695686400 65 | maturityDate: "", 66 | }, 67 | tpftAmount: "", 68 | unitPrice: "", 69 | }; 70 | 71 | /** 72 | * Quando o cedente está transmitindo o comando da operação. 73 | */ 74 | const callerPartBySender = BigNumber.from(0); 75 | /** 76 | * Quando o cessionário está transmitindo o comando da operação. 77 | */ 78 | const callerPartByReceiver = BigNumber.from(1); 79 | 80 | /** 81 | * Função a ser chamada somente uma vez para aprovar o contrato TPFtDvP no TPFt. 82 | */ 83 | setApprovalForAll(senderAccount.address, tpftAddress, tpftDvpAddress) 84 | 85 | /** 86 | * Função a ser chamada para aprovar uma quantidade de Real Digital para o contrato TPFtDvP 87 | * de acordo com os critérios do participante. 88 | */ 89 | const realDigitalAmount = 1000; 90 | 91 | approveRealDigital(realDigitalAddress, receiverAccount.address, realDigitalAmount, tpftDvpAddress) 92 | 93 | /** 94 | * Execução por parte do sender (cedente) para realizar operação de 95 | * Compra e venda informando o CNPJ8. 96 | */ 97 | const senderTransaction = await TPFtOperation1052 98 | .connect(senderAccount) 99 | ?.[ 100 | "trade(uint256,uint256,uint256,uint8,(string,string,uint256),uint256,uint256)" 101 | ]( 102 | params.operationId, 103 | params.cnpj8Sender, 104 | params.cnpj8Receiver, 105 | callerPartBySender, 106 | params.tpftData, 107 | params.tpftAmount, 108 | params.unitPrice 109 | ); 110 | 111 | /** 112 | * Aguarda até que a transação enviada pelo sender seja confirmada na blockchain. 113 | */ 114 | await senderTransaction.wait(); 115 | 116 | /** 117 | * Execução por parte do receiver (cessionário) para realizar operação de 118 | * Compra e venda informando o CNPJ8. 119 | */ 120 | const receiverTransaction = await TPFtOperation1052 121 | .connect(receiverAccount) 122 | ?.[ 123 | "trade(uint256,uint256,uint256,uint8,(string,string,uint256),uint256,uint256)" 124 | ]( 125 | params.operationId, 126 | params.cnpj8Sender, 127 | params.cnpj8Receiver, 128 | callerPartByReceiver, 129 | params.tpftData, 130 | params.tpftAmount, 131 | params.unitPrice 132 | ); 133 | 134 | /** 135 | * Aguarda até que a transação enviada pelo receiver seja confirmada na blockchain. 136 | */ 137 | await receiverTransaction.wait(); 138 | 139 | /** 140 | * Resposta da execução da operação de compra e venda 141 | */ 142 | console.log(senderTransaction.hash); 143 | console.log(receiverTransaction.hash); 144 | } 145 | 146 | /** 147 | * TPFtOperation1052 - Permite que participantes cadastrados no Real Digital 148 | * realizem a operação de compra e venda envolvendo Título Público Federal tokenizado (TPFt) 149 | * entre si e/ou seus clientes utilizando seus endereços de carteiras. 150 | * @dev Para a operação ocorrer é necessário que cada carteira de aprovação para o endereço contrato TPFtDvP 151 | * no Real Digital através da função approve e no TPFt através setApprovalForAll. 152 | */ 153 | async function tradeByAddresses() { 154 | 155 | /** 156 | * Obtém contrato Address Discovery 157 | */ 158 | const addressDiscrovery = await ethers.getContractAt( 159 | abiAddressDiscovery, 160 | '' 161 | ); 162 | 163 | /** 164 | * Endereço do TPFt 165 | */ 166 | const tpftAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFt')); 167 | 168 | /** 169 | * Endereço do TPFtDvP 170 | */ 171 | const tpftDvpAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtDvP')); 172 | 173 | /** 174 | * Endereço do Real Digital 175 | */ 176 | const realDigitalAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('RealDigital')); 177 | 178 | /** 179 | * Endereço do TPFtOperation1052 180 | */ 181 | const tpftOperation1052Address = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtOperation1052')); 182 | 183 | const TPFtOperation1052 = await ethers.getContractAt( 184 | abiITPFtOperation1052, 185 | tpftOperation1052Address 186 | ); 187 | 188 | /** 189 | * Sender refere-se ao cedente (detentor de TPFts) e receiver refere-se ao cessionário (não detentor de TPFts) 190 | */ 191 | const [, senderAccount, receiverAccount] = await ethers.getSigners(); 192 | 193 | const params = { 194 | operationId: "", 195 | tpftData: { 196 | acronym: "", 197 | code: "", 198 | // Ex: const date = new Date("2023-09-26"); Math.floor(date.getTime() / 1000); retorno 1695686400 199 | maturityDate: "", 200 | }, 201 | tpftAmount: "", 202 | unitPrice: "", 203 | }; 204 | 205 | /** 206 | * Quando o cedente está transmitindo o comando da operação. 207 | */ 208 | const callerPartBySender = BigNumber.from(0); 209 | /** 210 | * Quando o cessionário está transmitindo o comando da operação. 211 | */ 212 | const callerPartByReceiver = BigNumber.from(1); 213 | 214 | /** 215 | * Função a ser chamada somente uma vez para aprovar o contrato TPFtDvP no TPFt. 216 | */ 217 | setApprovalForAll(senderAccount.address, tpftAddress, tpftDvpAddress) 218 | 219 | /** 220 | * Função a ser chamada para aprovar uma quantidade de Real Digital para o contrato TPFtDvP 221 | * de acordo com os critérios do participante. 222 | */ 223 | const realDigitalAmount = 1000; 224 | 225 | approveRealDigital(realDigitalAddress, receiverAccount.address, realDigitalAmount, tpftDvpAddress) 226 | 227 | /** 228 | * Registro por parte do sender (cedente) para realizar operação de 229 | * compra e venda informando o endereço das carteiras. 230 | */ 231 | const senderTransaction = await TPFtOperation1052 232 | .connect(senderAccount) 233 | ?.[ 234 | "trade(uint256,address,address,uint8,(string,string,uint256),uint256,uint256)" 235 | ]( 236 | params.operationId, 237 | senderAccount.address, 238 | receiverAccount.address, 239 | callerPartBySender, 240 | params.tpftData, 241 | params.tpftAmount, 242 | params.unitPrice 243 | ); 244 | 245 | /** 246 | * Aguarda até que a transação enviada pelo sender seja confirmada na blockchain. 247 | */ 248 | await senderTransaction.wait(); 249 | 250 | /** 251 | * Registro por parte do receiver (cessionário) para realizar operação de 252 | * compra e venda informando o endereço das carteiras. 253 | */ 254 | const receiverTransaction = await TPFtOperation1052 255 | .connect(receiverAccount) 256 | ?.[ 257 | "trade(uint256,address,address,uint8,(string,string,uint256),uint256,uint256)" 258 | ]( 259 | params.operationId, 260 | senderAccount.address, 261 | receiverAccount.address, 262 | callerPartByReceiver, 263 | params.tpftData, 264 | params.tpftAmount, 265 | params.unitPrice 266 | ); 267 | 268 | /** 269 | * Aguarda até que a transação enviada pelo receiver seja confirmada na blockchain. 270 | */ 271 | await receiverTransaction.wait(); 272 | 273 | /** 274 | * Resposta da execução da operação de compra e venda 275 | */ 276 | console.log(senderTransaction.hash); 277 | console.log(receiverTransaction.hash); 278 | } 279 | -------------------------------------------------------------------------------- /exemplos/example7.ts: -------------------------------------------------------------------------------- 1 | import {ethers} from "hardhat"; 2 | import abiTPFt from "../abi/ITPFt.json"; 3 | import abiIERC1155 from "../abi/IERC1155.json"; 4 | import abiAddressDiscovery from "../abi/AddressDiscovery.json"; 5 | 6 | /** 7 | * TPFt - Permite a obtenção do id do TPFt 8 | */ 9 | async function getTpftId() { 10 | /** 11 | * Obtém contrato Address Discovery 12 | */ 13 | const addressDiscrovery = await ethers.getContractAt( 14 | abiAddressDiscovery, 15 | '' 16 | ); 17 | 18 | /** 19 | * Endereço do TPFt 20 | */ 21 | const tpftAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFt')); 22 | 23 | /** 24 | * Obtém contrato TPFt 25 | */ 26 | const TPFt = await ethers.getContractAt( 27 | abiTPFt, 28 | tpftAddress 29 | ); 30 | 31 | const params = { 32 | tpftData: { 33 | acronym: '', 34 | code: '', 35 | // A função Math.floor(date.getTime() / 1000) transformar data milissegundos em segundos(timestamp Unix) 36 | maturityDate: '', 37 | } 38 | } 39 | 40 | //Obtém o id do TPFt. 41 | const tpftId = await TPFt.getTPFtId( 42 | params.tpftData, 43 | ); 44 | 45 | //Imprime o id do TPFt. 46 | console.log(tpftId.toString()); 47 | 48 | return tpftId; 49 | 50 | } 51 | 52 | /** 53 | * TPFt - Permite a consulta de saldo de TPFt em base ao seu id 54 | */ 55 | async function balanceOfTpft() { 56 | /** 57 | * Obtém contrato Address Discovery 58 | */ 59 | const addressDiscrovery = await ethers.getContractAt( 60 | abiAddressDiscovery, 61 | '' 62 | ); 63 | 64 | /** 65 | * Endereço do TPFt 66 | */ 67 | const tpftAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFt')); 68 | 69 | /** 70 | * Obtém contrato TPFt 71 | */ 72 | const TPFt = await ethers.getContractAt( 73 | abiIERC1155, 74 | tpftAddress 75 | ); 76 | 77 | const params = { 78 | tpftId: '', 79 | } 80 | 81 | //Consulta do saldo do TPFt. 82 | const balanceOfTPFt = await TPFt.balanceOf( 83 | '', 84 | params.tpftId 85 | ) 86 | 87 | //Saldo do TPFt. 88 | console.log(balanceOfTPFt.toString()); 89 | } 90 | 91 | 92 | -------------------------------------------------------------------------------- /exemplos/example8.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from "hardhat"; 2 | import abiSwapOneStep from '../abi/SwapOneStep.json'; 3 | import abiRealDigital from '../abi/RealDigital.json'; 4 | import abiRealTokenizado from '../abi/RealTokenizado.json'; 5 | 6 | // exemplo de transferencia entre clientes de instituições diferentes usando o SwapOneStep 7 | async function example8() { 8 | // Os endereços dos contratos podem ser consultados no AddressDiscovery 9 | const swapOneStep = await ethers.getContractAt(abiSwapOneStep, ''); 10 | const cbdc = await ethers.getContractAt(abiRealDigital, ''); 11 | const drexSender = await ethers.getContractAt(abiRealTokenizado, ''); 12 | const drexReceiverAddress = ''; 13 | 14 | // Pode ser consultado no KeyDictionary 15 | const receiver = ''; 16 | const amount = ethers.utils.parseUnits("100", 2); 17 | 18 | // drexSenderAuthority é a carteira que possui autoridade sobre o real tokenizado do participante que esta enviando a transação, 19 | // caso o endereço de reserva do real tokenizado tenha sido atualizado, deve ser passado a carteira de reserva para qual foi atualizada. 20 | const [ drexSenderAuthority, senderCustomer ] = await ethers.getSigners(); 21 | 22 | await (await cbdc.connect(drexSenderAuthority).approve(swapOneStep.address, amount)).wait(); 23 | await (await drexSender.connect(senderCustomer).approve(swapOneStep.address, amount)).wait(); 24 | 25 | const result = await swapOneStep.connect(senderCustomer).executeSwap(drexSender.address, drexReceiverAddress, receiver, amount); 26 | await result.wait(); 27 | 28 | console.log(result.hash); 29 | } -------------------------------------------------------------------------------- /exemplos/example9.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from "hardhat"; 2 | import { BigNumber } from "ethers"; 3 | import { setApprovalForAll } from "./setApprovalForAll"; 4 | import { approveRealTokenizado } from "./approveRealTokenizado"; 5 | import abiITPFtOperation1052 from "../abi/ITPFtOperation1052.json"; 6 | import abiAddressDiscovery from "../abi/AddressDiscovery.json"; 7 | 8 | 9 | /** 10 | * TPFtOperation1052 - Permite que a operação de compra e venda envolvendo Título Público Federal tokenizado (TPFt) 11 | * seja realizada entre um participante (cedente) cadastrado no Real Digital e seus clientes (cessionários) 12 | * utilizando seus respetivos endereços de carteiras. 13 | * @dev Para que a operação seja concluida com sucesso, a carteira do participante e do seu cliente devem 14 | * aprovar o endereço do contrato TPFtDvP em seu Real Tokenizado usando a função "approve" e 15 | * no TPFt por meio da função "setApprovalForAll". 16 | */ 17 | async function tradeParticipantAndItsClientByAddresses() { 18 | 19 | /** 20 | * Obtém contrato Address Discovery 21 | */ 22 | const addressDiscrovery = await ethers.getContractAt( 23 | abiAddressDiscovery, 24 | '' 25 | ); 26 | 27 | /** 28 | * Endereço do TPFt 29 | */ 30 | const tpftAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFt')); 31 | 32 | /** 33 | * Endereço do TPFtDvP 34 | */ 35 | const tpftDvpAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtDvP')); 36 | 37 | /** 38 | * Endereço do TPFtOperation1052 39 | */ 40 | const tpftOperation1052Address = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtOperation1052')); 41 | 42 | /** 43 | * Obtém contrato TPFtOperation1052 44 | */ 45 | const TPFtOperation1052 = await ethers.getContractAt( 46 | abiITPFtOperation1052, 47 | tpftOperation1052Address 48 | ); 49 | 50 | /** 51 | * senderParticipant (Ex. Participante A) refere-se ao cedente (detentor de TPFts) 52 | */ 53 | const [, , senderParticipant] = await ethers.getSigners(); 54 | const senderParticipantAddress = senderParticipant.address; 55 | 56 | /** 57 | * receiverClient (Ex. Cliente do Participante A) refere-se ao cessionário (não detentor de TPFts) 58 | */ 59 | const receiverClientAddress = ''; 60 | const receiverClient = await ethers.getSigner(receiverClientAddress); 61 | 62 | /** 63 | * Endereço do RealTokenizedParticipant (Ex. Endereço do Real Tokenizado do Participante A) 64 | * @dev Como o receiverClient (Ex. Cliente do Participante A) pertence ao senderParticipant, o mesmo endereço do 65 | * contrato do RealTokenizedParticipant deve ser utilizado por ambas partes. 66 | * Além disso, o receiverClient deve estar cadastrado no RealTokenizedParticipant 67 | */ 68 | const realTokenizedParticipantAddress = '' 69 | 70 | const params = { 71 | operationId: "", 72 | tpftData: { 73 | acronym: "", 74 | code: "", 75 | // Ex: const date = new Date("2023-09-26"); Math.floor(date.getTime() / 1000); retorno 1695686400 76 | maturityDate: "", 77 | }, 78 | tpftAmount: "", 79 | unitPrice: "", 80 | }; 81 | 82 | /** 83 | * Quando o cedente está transmitindo o comando da operação. 84 | */ 85 | const callerPartBySender = BigNumber.from(0); 86 | /** 87 | * Quando o cessionário está transmitindo o comando da operação. 88 | */ 89 | const callerPartByReceiver = BigNumber.from(1); 90 | 91 | /** 92 | * Função a ser chamada somente uma vez para aprovar o contrato TPFtDvP no TPFt. 93 | */ 94 | setApprovalForAll(senderParticipantAddress, tpftAddress, tpftDvpAddress) 95 | 96 | /** 97 | * Função a ser chamada para aprovar uma quantidade de Real Tokenizado para o contrato TPFtDvP 98 | * de acordo com os critérios do cliente. 99 | */ 100 | const realTokenizadoAmount = 1000; 101 | 102 | approveRealTokenizado(realTokenizedParticipantAddress, receiverClientAddress, realTokenizadoAmount, tpftDvpAddress) 103 | 104 | /** 105 | * Registro por parte do senderParticipant (cedente) para realizar operação de 106 | * compra e venda informando o endereço das carteiras. 107 | */ 108 | const senderTransaction = await TPFtOperation1052 109 | .connect(senderParticipant) 110 | ?.[ 111 | "trade(uint256,address,address,address,address,uint8,(string,string,uint256),uint256,uint256)" 112 | ]( 113 | params.operationId, 114 | senderParticipantAddress, 115 | realTokenizedParticipantAddress, 116 | receiverClientAddress, 117 | realTokenizedParticipantAddress, 118 | callerPartBySender, 119 | params.tpftData, 120 | params.tpftAmount, 121 | params.unitPrice 122 | ); 123 | 124 | /** 125 | * Aguarda até que a transação enviada pelo sender seja confirmada na blockchain. 126 | */ 127 | await senderTransaction.wait(); 128 | 129 | /** 130 | * Registro por parte do receiverClient (cessionário) para realizar operação de 131 | * compra e venda informando o endereço das carteiras. 132 | */ 133 | const receiverTransaction = await TPFtOperation1052 134 | .connect(receiverClient) 135 | ?.[ 136 | "trade(uint256,address,address,address,address,uint8,(string,string,uint256),uint256,uint256)" 137 | ]( 138 | params.operationId, 139 | senderParticipantAddress, 140 | realTokenizedParticipantAddress, 141 | receiverClientAddress, 142 | realTokenizedParticipantAddress, 143 | callerPartByReceiver, 144 | params.tpftData, 145 | params.tpftAmount, 146 | params.unitPrice 147 | ); 148 | 149 | /** 150 | * Aguarda até que a transação enviada pelo receiver seja confirmada na blockchain. 151 | */ 152 | await receiverTransaction.wait(); 153 | 154 | /** 155 | * Resposta da execução da operação de compra e venda 156 | */ 157 | console.log(senderTransaction.hash); 158 | console.log(receiverTransaction.hash); 159 | } 160 | -------------------------------------------------------------------------------- /exemplos/hardhat.config.ts: -------------------------------------------------------------------------------- 1 | import { HardhatUserConfig } from "hardhat/config"; 2 | import "@nomicfoundation/hardhat-toolbox"; 3 | 4 | 5 | const config: HardhatUserConfig = { 6 | solidity: { 7 | version: "0.8.19", 8 | settings: { 9 | optimizer: { 10 | enabled: true, 11 | runs: 200 12 | }, 13 | }, 14 | }, 15 | networks: { 16 | besu: { 17 | url: "", 18 | accounts: [""] 19 | } 20 | } 21 | }; 22 | 23 | export default config; 24 | -------------------------------------------------------------------------------- /exemplos/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "kit-onboarding-example", 3 | "version": "0.0.1", 4 | "description": "Exemplo de chamada dos contratos", 5 | "main": "index.js", 6 | "scripts": { 7 | "example": "npx hardhat run --network besu ./example.ts" 8 | }, 9 | "author": "", 10 | "license": "MIT", 11 | "devDependencies": { 12 | "@ethersproject/abi": "^5.7.0", 13 | "@ethersproject/providers": "^5.7.2", 14 | "@nomicfoundation/hardhat-chai-matchers": "^1.0.6", 15 | "@nomicfoundation/hardhat-network-helpers": "^1.0.6", 16 | "@nomicfoundation/hardhat-toolbox": "^2.0.0", 17 | "@nomiclabs/hardhat-ethers": "^2.2.0", 18 | "@nomiclabs/hardhat-etherscan": "^3.1.1", 19 | "@openzeppelin/contracts": "^4.8.0", 20 | "@typechain/ethers-v5": "^10.1.1", 21 | "@typechain/hardhat": "^6.1.4", 22 | "@types/chai": "^4.3.3", 23 | "@types/mocha": "^9.1.1", 24 | "@types/node": "^18.11.6", 25 | "chai": "^4.3.6", 26 | "ethers": "^5.7.2", 27 | "hardhat": "^2.12.0", 28 | "hardhat-gas-reporter": "^1.0.9", 29 | "solidity-coverage": "^0.8.2", 30 | "ts-node": "^10.9.1", 31 | "typechain": "^8.1.1", 32 | "typescript": "^4.8.4" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /exemplos/setApprovalForAll.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from "hardhat"; 2 | import abiIERC1155 from "../abi/IERC1155.json"; 3 | 4 | /** 5 | * TPFt - como dar aprovação ao contrato TPFtDvP necessária em algumas operações. 6 | */ 7 | export async function setApprovalForAll( 8 | owner: string, 9 | tpftAddress: string, 10 | tpftDvpAddress: string) 11 | { 12 | /** 13 | * Obtém contrato TPFt 14 | */ 15 | const TPFt = await ethers.getContractAt( 16 | abiIERC1155, 17 | tpftAddress 18 | ); 19 | 20 | /** 21 | * Dono do TPFt 22 | */ 23 | const ownerSigner = await ethers.getSigner(owner); 24 | 25 | /** 26 | * Aprova o contrato TPFtDvP a negociar TPFt 27 | */ 28 | await TPFt.connect(ownerSigner).setApprovalForAll(tpftDvpAddress, true); 29 | } 30 | 31 | /** 32 | * Função a ser chamada somente uma vez para aprovar o contrato TPFtDvP no TPFt. 33 | */ 34 | setApprovalForAll( 35 | '', 36 | '', 37 | '' 38 | ) 39 | -------------------------------------------------------------------------------- /exemplos/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2020", 4 | "module": "commonjs", 5 | "esModuleInterop": true, 6 | "forceConsistentCasingInFileNames": true, 7 | "strict": true, 8 | "skipLibCheck": true, 9 | "resolveJsonModule": true 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /genesis.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "chainId": 381660001, 4 | "muirglacierblock": 0, 5 | "qbft": { 6 | "blockperiodseconds": 5, 7 | "epochlength": 30000, 8 | "requesttimeoutseconds": 10 9 | } 10 | }, 11 | "nonce": "0x0", 12 | "timestamp": "0x58ee40ba", 13 | "extraData": "0xf87aa00000000000000000000000000000000000000000000000000000000000000000f854946b45f213f53d31e2f125b1a7a0647e966314a581943d6ab39222b6fc9a3b0838ff43ac6b989eaec74094fc13c289e22249d8f3c949ed61865f309fc4be0b943017ae288af105620c148f4973e8208b8077175fc080c0", 14 | "gasLimit": "0x1fffffffffffff", 15 | "difficulty": "0x1", 16 | "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", 17 | "coinbase": "0x0000000000000000000000000000000000000000", 18 | "alloc": { 19 | "0x0000000000000000000000000000000000009999": { 20 | "comment": "Node Ingress smart contract", 21 | "balance": "0", 22 | "code": "608060405234801561001057600080fd5b50600436106100a95760003560e01c80634dc3fefc116100715780634dc3fefc146101365780638aa104351461014b578063a43e04d814610153578063de8fa43114610166578063e001f8411461016e578063fe9fbb801461018157600080fd5b80630d2020dd146100ae57806310d9042e146100de57806311601306146100f35780631e7c27cb1461010a57806345a59e5b14610113575b600080fd5b6100c16100bc3660046107b7565b610194565b6040516001600160a01b0390911681526020015b60405180910390f35b6100e66101d8565b6040516100d591906107d0565b6100fc60005481565b6040519081526020016100d5565b6100fc60015481565b61012661012136600461085d565b610230565b60405190151581526020016100d5565b6101496101443660046108f9565b6102f0565b005b6005546100fc565b6101266101613660046107b7565b6103ab565b6003546100fc565b61012661017c366004610934565b6105ac565b61012661018f366004610960565b61070d565b6000816101bc5760405162461bcd60e51b81526004016101b39061097b565b60405180910390fd5b506000908152600260205260409020546001600160a01b031690565b6060600380548060200260200160405190810160405280929190818152602001828054801561022657602002820191906000526020600020905b815481526020019060010190808311610212575b5050505050905090565b6000806001600160a01b0316610247600054610194565b6001600160a01b03160361025d575060006102e7565b60008054815260026020526040908190205490516345a59e5b60e01b81526001600160a01b03909116906345a59e5b906102a390899089908990899089906004016109d9565b602060405180830381865afa1580156102c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e49190610a17565b90505b95945050505050565b600080548152600260205260409020546001600160a01b031633146103735760405162461bcd60e51b815260206004820152603360248201527f4f6e6c792052756c657320636f6e74726163742063616e20747269676765722060448201527252756c6573206368616e6765206576656e747360681b60648201526084016101b3565b60405181151581527f66120f934b66d52127e448f8e94c2460ea62821335e0dd18e89ed38a4a09b4139060200160405180910390a150565b6000816103ca5760405162461bcd60e51b81526004016101b39061097b565b60035461044f5760405162461bcd60e51b815260206004820152604760248201527f4d7573742068617665206174206c65617374206f6e652072656769737465726560448201527f6420636f6e747261637420746f20657865637574652064656c657465206f70656064820152663930ba34b7b71760c91b608482015260a4016101b3565b6104583361070d565b6104745760405162461bcd60e51b81526004016101b390610a34565b600082815260046020526040902054801580159061049457506003548111155b156105a35760035481146105135760038054600091906104b690600190610a7f565b815481106104c6576104c6610aa0565b906000526020600020015490508060036001846104e39190610a7f565b815481106104f3576104f3610aa0565b600091825260208083209091019290925591825260049052604090208190555b600380548061052457610524610ab6565b6000828152602080822060001990840181018390559092019092558482526004815260408083208390556002825280832080546001600160a01b031916905580519283529082018590527fe3d908a1f6d2467f8e7c8198f30125843211345eedb763beb4cdfb7fe728a5af91015b60405180910390a150600192915050565b50600092915050565b6000826105cb5760405162461bcd60e51b81526004016101b39061097b565b6001600160a01b03821661062c5760405162461bcd60e51b815260206004820152602260248201527f436f6e74726163742061646472657373206d757374206e6f74206265207a6572604482015261379760f11b60648201526084016101b3565b6106353361070d565b6106515760405162461bcd60e51b81526004016101b390610a34565b60008381526004602052604081205490036106a657600380546001810182557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b01849055546000848152600460205260409020555b60008381526002602090815260409182902080546001600160a01b0319166001600160a01b03861690811790915582519081529081018590527fe3d908a1f6d2467f8e7c8198f30125843211345eedb763beb4cdfb7fe728a5af9101610592565b92915050565b6001546000908152600260205260408120546001600160a01b031661073457506001919050565b600154600090815260026020526040908190205490516301fd3f7760e71b81526001600160a01b0384811660048301529091169063fe9fbb8090602401602060405180830381865afa15801561078e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107079190610a17565b919050565b6000602082840312156107c957600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b81811015610808578351835292840192918401916001016107ec565b50909695505050505050565b60008083601f84011261082657600080fd5b50813567ffffffffffffffff81111561083e57600080fd5b60208301915083602082850101111561085657600080fd5b9250929050565b60008060008060006060868803121561087557600080fd5b853567ffffffffffffffff8082111561088d57600080fd5b61089989838a01610814565b909750955060208801359150808211156108b257600080fd5b506108bf88828901610814565b909450925050604086013561ffff811681146108da57600080fd5b809150509295509295909350565b80151581146108f657600080fd5b50565b60006020828403121561090b57600080fd5b8135610916816108e8565b9392505050565b80356001600160a01b03811681146107b257600080fd5b6000806040838503121561094757600080fd5b823591506109576020840161091d565b90509250929050565b60006020828403121561097257600080fd5b6109168261091d565b6020808252818101527f436f6e7472616374206e616d65206d757374206e6f7420626520656d7074792e604082015260600190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006109ed6060830187896109b0565b8281036020840152610a008186886109b0565b91505061ffff831660408301529695505050505050565b600060208284031215610a2957600080fd5b8151610916816108e8565b6020808252602b908201527f4e6f7420617574686f72697a656420746f2075706461746520636f6e7472616360408201526a3a103932b3b4b9ba393c9760a91b606082015260800190565b8181038181111561070757634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fdfea26469706673582212207ab8f87f5693b99fe9c6bd25a60c3bdae73fa6a640827bce9829a2c17eaca56164736f6c63430008130033", 23 | "storage": { 24 | "0x0000000000000000000000000000000000000000000000000000000000000000": "0x72756c6573000000000000000000000000000000000000000000000000000000", 25 | "0x0000000000000000000000000000000000000000000000000000000000000001": "0x61646d696e697374726174696f6e000000000000000000000000000000000000", 26 | "0x0000000000000000000000000000000000000000000000000000000000000004": "0x0f4240" 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /smartcontracts.md: -------------------------------------------------------------------------------- 1 | # Interação com os _smart contracts_ 2 | 3 | ## Objetivo 4 | 5 | Esta documentação tem como objetivo explicar como será feita a interação com os _smart contracts_ que estão disponíveis na Rede do Piloto do Real Digital para uso dos ativos Real Digital e Real Tokenizado. 6 | 7 | Por se tratar de um piloto em ambiente de testes, esta documentação está sujeita a constantes evoluções que serão aqui refletidas. 8 | 9 | Serão fornecidos ao participante do piloto a [ABI](https://docs.soliditylang.org/en/v0.8.20/abi-spec.html) de cada um dos contratos e seus respectivos endereços publicados na rede. Cada participante deve implementar, da forma que melhor entender, a sua interação com os contratos, fazendo uso de bibliotecas padrão Web3 como, por exemplo, o [Web3JS](https://web3js.readthedocs.io/en/v1.10.0/), [Web3J](https://docs.web3j.io/4.10.0/), ou frameworks como, por exemplo, o [Hardhat](https://hardhat.org/) ou [Truffle](https://trufflesuite.com/). 10 | 11 | No piloto, todos os contratos serão implementados e publicados na rede pelo Banco Central do Brasil. 12 | 13 | 14 | ## CBDC - [Real Digital](./RealDigital.md) 15 | 16 | O CBDC (Central Bank Digital Currency) está definido no contrato chamado [RealDigital](./abi/RealDigital.json). 17 | 18 | Este contrato foi desenvolvido usando como base o padrão [ERC20](https://ethereum.org/pt/developers/docs/standards/tokens/erc-20/), com a adição de [funções específicas de controle de acesso](./CBDCAccessControl.md) e com as seguintes características: 19 | 20 | * A carteira do Banco Central do Brasil é a gestora do token. 21 | * O símbolo do token é `BRL`. 22 | * Valor definido com 2 casas decimais 23 | * Apenas instituições detentoras de Conta Reservas ou Conta de Liquidação e o Tesouro Nacional poderão ter Real Digital em suas carteiras. 24 | * Cada participante deve mandar ao Banco Central do Brasil o endereço da sua carteira principal para o cadastro. Esta carteira será a carteira _default_ do participante e poderá ser posteriormente alterada através do contrato [RealDigitalDefaultAccount](./RealDigitalDefaultAccount.md). 25 | * Após o cadastro inicial, o próprio participante poderá habilitar outras carteiras a receber Real Digital através do contrato [RealDigitalEnableAccount](./RealDigitalDefaultAccount.md). 26 | * A solicitação de emissão de Real Digital será feita mediante chamada da carteira ao contrato [STR](./abi/STR.md) 27 | 28 | ### [Real Digital Default Account](./RealDigitalDefaultAccount.md) 29 | 30 | O contrato [RealDigitalDefaulAccount](./abi/RealDigitalDefaultAccount.json) permite ao participante trocar a sua carteira _default_, através do método `updateDefaultWallet`. 31 | 32 | Ainda, através do _mapping_ `defaultAccount`, é possível recuperar a carteira _default_ dos outros participantes, bastando passar como parâmetro o CNPJ8 da instituição desejada. 33 | 34 | A carteira _default_ será necessária para as transações de _swap_ detalhadas em seção específica de [swaps](). 35 | 36 | ### [Real Digital Enable Account](./RealDigitalEnableAccount.md) 37 | 38 | O contrato [RealDigitalEnableAccount](./abi/RealDigitalEnableAccount.json) permite ao participante habilitar ou desabilitar outras carteiras de sua posse para o recebimento de Real Digital. 39 | 40 | Para habilitação deve ser utilizado o método `enableAccount`. Para desabilitação, `disableAccount`. 41 | 42 | ### [STR](./STR.md) 43 | 44 | O contrato chamado [STR](./abi/STR.json) representa uma simulação do sistema STR, será por meio desse contrato que os participantes solicitarão Real Digital ao Banco Central do Brasil no âmbito do projeto Piloto. 45 | 46 | Este contrato permite que qualquer participante solicite o _mint_ de Real Digital através de uma carteira previamente habilitada. 47 | 48 | Para solicitar a emissão deve ser utilizado o método `requestToMint`. 49 | 50 | 51 | ## DVt (Depósito bancário à vista tokenizado) e MEt (Moeda eletrônica tokenizada) - [Real Tokenizado](./RealTokenizado.md) 52 | 53 | O Real Tokenizado está definido no contrato chamado [RealTokenizado](./abi/RealTokenizado.json). 54 | 55 | Este contrato foi desenvolvido usando como base o padrão [ERC20](https://ethereum.org/pt/developers/docs/standards/tokens/erc-20/), com a adição de [funções específicas de controle de acesso](./CBDCAccessControl.md) e com as seguintes características: 56 | 57 | 58 | * A primeira carteira default do participante será a gestora do token; 59 | * A criação e publicação do contrato na rede será feita exclusivamente pelo Banco Central do Brasil; 60 | * Caso seja necessário alterar a carteira gestora, deve ser feita solicitação de alteração ao Banco Central do Brasil através dos mecanismos oficiais de comunicação; 61 | * O símbolo do token `BRL@CNPJ8`. Exemplo `BRL@11111111`, para o Real Tokenizado da instituição '11111111'; 62 | * Valor definido com 2 casas decimais; 63 | * Assim como o Real Digital, somente carteiras autorizadas podem receber Real Tokenizado; 64 | * O participante deve utilizar dos métodos `enableAccount` e `disableAccount` para gerenciar as carteiras permitidas. 65 | 66 | 67 | 68 | ### [KeyDictionary](./KeyDictionary.md) 69 | 70 | O contrato [KeyDictionary](./abi/KeyDictionary.json) simulará um Diretório de Identificadores de Contas Transacionais ([DICT](https://www.bcb.gov.br/estabilidadefinanceira/dict)) para a transferência de Real Tokenizado. Durante o piloto, os dados de clientes, sempre fictícios, devem ser inseridos na rede para recuperação e identificação das carteiras de clientes durante as operações de _swap_ de transferência entre clientes. 71 | O método a ser invocado para a inserção de dados é o `addAccount`, que tem os seguintes parâmetros: 72 | 73 | * Chave, identificador único gerado pelo participante, deve ser salvo no formato hash (keccak256); 74 | * CPF do cliente fictício; 75 | * Código do participante; 76 | * Conta do cliente fictício; 77 | * Agência do cliente fictício; 78 | * Carteira do cliente fictício. 79 | 80 | Ao iniciar uma transferência o participante poderá recuperar a carteira do destinatário através de consulta ao método `getWallet`. 81 | 82 | Ao receber uma transferência o participante recebedor poderá identificar o cliente pagador através da consulta aos métodos `getKey` e `getCustomerData`. 83 | 84 | 85 | ## Swaps e comunicação Off-Chain 86 | 87 | Sempre que houver uma transferência de Real Tokenizado entre clientes de instituições distintas, essa transferência deve ser efetivada por meio de um contrato de _swap_ que permita a troca de Real Tokenizado, usando como reserva o Real Digital das respectivas instituições envolvidas. 88 | 89 | No momento, há três implementações disponíveis: uma que executa o _swap_ em apenas uma transação e outras duas que dependem da aprovação do recebedor para que a troca seja concluída. Todas as implementações foram efetuadas utilizando os padrões de _approve_ para o respectivo contrato de _swap_ previamente à execução da operação. 90 | 91 | O objetivo do piloto é testar formas distintas de _swap_ de forma a avaliar como podem se encaixar em diferentes negócios. Há, ainda, a possibilidade de implementação de um _swap_ que envolva a troca de informações _off-chain_. 92 | 93 | 94 | ### [Swap One Step](./SwapOneStep.md) 95 | 96 | O contrato [SwapOneStep](./abi/SwapOneStep.json) efetua a transferência de Real Tokenizado em uma única transação atômica. Após os _approves_ das carteiras pagadoras de Real Tokenizado e Real Digital, a chamada ao `executeSwap` efetivará a destruição (`burn`) de Real Tokenizado do cliente pagador, a transferência (`transferFrom`) de Real Digital da instituição pagadora para a instituição recebedora e a emissão (`mint`) de Real Tokenizado para o cliente recebedor. 97 | 98 | 99 | ### [Swap Two Steps](./SwapTwoSteps.md) 100 | 101 | O contrato [SwapTwoSteps](./abi/SwapTwoSteps.json) executa a transferência de forma atômica quando o participante recebedor confirmar a operação. Após os _approves_ das carteiras pagadoras de Real Tokenizado e Real Digital, a chamada ao `startSwap` irá gerar um evento para a instituição recebedora. A instituição recebedora avalia o crédito e confirma a transferência efetivando, assim, a operação atômica. 102 | 103 | 104 | ### [Swap Two Steps Reserve](./SwapTwoStepsReserve.md) 105 | 106 | O contrato [SwapTwoStepsReserve](./abi/SwapTwoStepsReserve.json), assim como o [SwapTwoSteps](./abi/SwapTwoSteps.json), executa a transferência de forma atômica quando o participante recebedor confirmar a operação. Nesse contrato, entretanto, após os _approves_ das carteiras pagadoras de Real Tokenizado e Real Digital, a chamada ao `startSwap` efetivará a transferência dos tokens de Real Tokenizado e Real Digital para o contrato SwapToStepsReserve como forma de reserva e garantia de saldo, além de gerar um evento para a instituição recebedora. A instituição recebedora então avalia o crédito e confirma a transferência efetivando, assim, a operação atômica. 107 | 108 | 109 | 110 | [<<< Voltar](README.md) 111 | -------------------------------------------------------------------------------- /smartcontractsTitulos.md: -------------------------------------------------------------------------------- 1 | # Interação com os _smart contracts_ 2 | 3 | ## Objetivo 4 | 5 | Esta documentação tem como objetivo explicar como será feita a interação com os _smart contracts_ que estão disponíveis na Rede do Piloto do Real Digital para uso dos Títulos Públicos Federais Tokenizados e as operações de oferta e compra e venda destes títulos. 6 | 7 | Por se tratar de um piloto em ambiente de testes, esta documentação está sujeita a constantes evoluções que serão aqui refletidas. 8 | 9 | Serão fornecidos ao participante do piloto a [ABI](https://docs.soliditylang.org/en/v0.8.20/abi-spec.html) de cada um dos contratos e seus respectivos endereços publicados na rede. Cada participante deve implementar, da forma que melhor entender, a sua interação com os contratos, fazendo uso de bibliotecas padrão Web3 como, por exemplo, o [Web3JS](https://web3js.readthedocs.io/en/v1.10.0/), [Web3J](https://docs.web3j.io/4.10.0/), ou frameworks como, por exemplo, o [Hardhat](https://hardhat.org/) ou [Truffle](https://trufflesuite.com/). 10 | 11 | No piloto, todos os contratos serão implementados e publicados na rede pelo Banco Central do Brasil. 12 | 13 | ## Smart Contracts 14 | 15 | Uma operação será identificada unicamente pelo operationId informado pelo participante. Este número será único na rede e sugere-se que seja utilizado o número da faixa do participante concatenado com a data vigente. Este formato não será validado e o operationId será utilizado para realizar a correspondência de uma operação de duplo comando. 16 | 17 | Os valores de preço unitário, quantidade e valor financeiro serão tratados nos contratos assumindo os últimos algarismos como casas decimais de acordo com cada tipo de atributo. Caso o atributo seja um inteiro, deve ser preenchido o número de casas decimais com zero nos últimos algarismos. 18 | 19 | ## Título Público Federal tokenizado - [TPFt](./ITPFt.md) 20 | 21 | O TPFt está definido no contrato chamado TPFt que implementa a interface [ITPFt](./abi/ITPFt.json). 22 | 23 | - O TPFt é fungível e identificado pelo seu código, sigla e data vencimento. 24 | - A carteira da Secretaria do Tesouro Nacional (STN) é a gestora do token. 25 | - Somente carteiras autorizadas podem receber TPFt. 26 | - Os tokens disponibilizados seguirão as [características dos Títulos Públicos Federais](https://www.bcb.gov.br/content/estabilidadefinanceira/selic/CaracteristicaTitulos.pdf). 27 | 28 | ### Liquidação de oferta pública - [Operação 1002](./ITPFtOperation1002.md) 29 | 30 | A liquidação de oferta pública está definida no contrato chamado TPFtOperation1002 que implementa a interface [ITPFtOperation1002](./abi/ITPFtOperation1002.json). O contrato permite transferir quantidades inteiras de TPFt da carteira _default_ da STN para a carteira _default_ de um participante cadastrado por meio do método `auctionPlacement`. A liquidação da operação é realizada com a entrega contra pagamento (DvP) e somente o Bacen pode transmitir o comando cedente dessa operação. 31 | 32 | ### Compra e venda - [Operação 1052](./ITPFtOperation1052.md) 33 | 34 | A operação de compra e venda entre participantes e/ou clientes está definida no contrato chamado TPFtOperation1052 que implementa a interface [ITPFtOperation1052](./abi/ITPFtOperation1052.json). O contrato permite transferir quantidades fracionárias de TPFt entre carteiras de participantes e/ou clientes cadastrados por meio do método `trade`. A liquidação da operação é executada com a entrega contra pagamento (DvP). 35 | 36 | 37 | [<<< Voltar](README.md) 38 | -------------------------------------------------------------------------------- /topologia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wireshape/pilotord-kit-onboarding/efdfdea5f833bc2f31312a2b054063e838ebabf5/topologia.png --------------------------------------------------------------------------------