diff --git a/AddressDeclarator.sol b/AddressDeclarator.sol new file mode 100644 index 0000000..c4a78d3 --- /dev/null +++ b/AddressDeclarator.sol @@ -0,0 +1,15 @@ +pragma solidity >=0.6.12; + +// Author: Louis Holbrook 0826EDA1702D1E87C6E2875121D2E7BB88C2A746 +// SPDX-License-Identifier: GPL-3.0-or-later +// File-version: 1 +// Description: The ERC20 standard interface as specified in EIP20 (sha256:9f843cbb25a737c9351b0b6a6f54b86864490d0d5284f6877b4929d481d34312) + +interface AddressDeclarator { + function addDeclaration(address _address, bytes32 _proof) external returns ( bytes32 ); + function declaratorCount(address _objectAddress) external view returns ( uint256 ); + function declaratorAddressAt(address _targetAddress, uint256 _idx) external view returns ( address ); + function declaration(address _subjectAddress, address _objectAddress) external view returns ( bytes32[] memory ); + function declarationCount(address _subjectAddress) external view returns ( uint256 ); + function declarationAddressAt(address _subjectAddress, uint256 _idx) external view returns ( address ); +} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..bbf5385 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,24 @@ +FROM ethereum/solc:0.6.12 + +# The solc image messes up the alpine environment, so we have to go all over again +FROM alpine +COPY --from=0 /usr/bin/solc /usr/bin/solc + +RUN apk update && \ + apk add make + +WORKDIR /usr/src + +COPY ./Makefile ./cic-contracts/Makefile +COPY ./*.sol ./cic-contracts/ + +RUN cd cic-contracts && \ + make -B && make install -B + +#RUN mkdir -vp /usr/local/share/cic/solidity && \ +# cp -rv cic-contracts/abis + +LABEL authors="Louis Holbrook 0826EDA1702D1E87C6E2875121D2E7BB88C2A746" +LABEL spdx-license-identifier="GPL-3.0-or-later" +LABEL description="Ethereum smart contract interfaces used by the CIC component suite" +LABEL version="3" diff --git a/TokenEndorsement.sol b/TokenEndorsement.sol new file mode 100644 index 0000000..4f4155a --- /dev/null +++ b/TokenEndorsement.sol @@ -0,0 +1,3 @@ +interface TokenEndorser { + function getBySymbol(address _tokenAddress) external view returns ( bytes32 ); +} diff --git a/TokenRegistry.sol b/TokenRegistry.sol new file mode 100644 index 0000000..eb91256 --- /dev/null +++ b/TokenRegistry.sol @@ -0,0 +1,18 @@ +pragma solidity >=0.6.12; + +// Author: Louis Holbrook 0826EDA1702D1E87C6E2875121D2E7BB88C2A746 +// SPDX-License-Identifier: GPL-3.0-or-later +// File-version: 1 +// Description: The ERC20 standard interface as specified in EIP20 (sha256:9f843cbb25a737c9351b0b6a6f54b86864490d0d5284f6877b4929d481d34312) + + +// TODO: Rename everything to something more generic +interface TokenEndorser { + function endorsement(bytes32) external view returns ( bytes32 ); + function tokenIndex(address) external view returns ( uint256 ); + function endorser(address, uint256) external view returns ( uint256 ); + function endorserTokenCount(address) external view returns ( uint256 ); + function tokenSymbolIndex(string memory) external view returns ( address ); + function tokens(uint256) external view returns ( address ); + function add(address _token, bytes32 _data) external returns ( bool ); +} diff --git a/TokenRegistryClient.sol b/TokenRegistryClient.sol new file mode 100644 index 0000000..eb91256 --- /dev/null +++ b/TokenRegistryClient.sol @@ -0,0 +1,18 @@ +pragma solidity >=0.6.12; + +// Author: Louis Holbrook 0826EDA1702D1E87C6E2875121D2E7BB88C2A746 +// SPDX-License-Identifier: GPL-3.0-or-later +// File-version: 1 +// Description: The ERC20 standard interface as specified in EIP20 (sha256:9f843cbb25a737c9351b0b6a6f54b86864490d0d5284f6877b4929d481d34312) + + +// TODO: Rename everything to something more generic +interface TokenEndorser { + function endorsement(bytes32) external view returns ( bytes32 ); + function tokenIndex(address) external view returns ( uint256 ); + function endorser(address, uint256) external view returns ( uint256 ); + function endorserTokenCount(address) external view returns ( uint256 ); + function tokenSymbolIndex(string memory) external view returns ( address ); + function tokens(uint256) external view returns ( address ); + function add(address _token, bytes32 _data) external returns ( bool ); +} diff --git a/abis/Faucet.json b/abis/Faucet.json index fa6cbd6..0c437e6 100644 --- a/abis/Faucet.json +++ b/abis/Faucet.json @@ -1 +1 @@ -[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"FaucetAmountChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_recipient","type":"address"},{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"FaucetFail","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_recipient","type":"address"},{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"FaucetUsed","type":"event"},{"inputs":[],"name":"amount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"cooldown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"giveTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}] +[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_recipient","type":"address"},{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"FaucetFail","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_recipient","type":"address"},{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"FaucetUsed","type":"event"},{"inputs":[],"name":"amount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"giveTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}] diff --git a/abis/RegistryClient.json b/abis/RegistryClient.json index d1d0123..2b3baa8 100644 --- a/abis/RegistryClient.json +++ b/abis/RegistryClient.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"addressOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"entry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"registryCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}] +[{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"addressOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}] diff --git a/abis/TokenEndorser.json b/abis/TokenEndorser.json new file mode 100644 index 0000000..388a916 --- /dev/null +++ b/abis/TokenEndorser.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"add","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"endorsement","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"endorser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"endorserTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"tokenSymbolIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}] diff --git a/abis/TokenRegistry.json b/abis/TokenRegistry.json new file mode 100644 index 0000000..388a916 --- /dev/null +++ b/abis/TokenRegistry.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"add","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"endorsement","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"endorser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"endorserTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"tokenSymbolIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}] diff --git a/abis/TransferApproval.json b/abis/TransferApproval.json new file mode 100644 index 0000000..dcbf2d6 --- /dev/null +++ b/abis/TransferApproval.json @@ -0,0 +1 @@ +[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"serial","type":"uint256"}],"name":"NewExecution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"serial","type":"uint256"}],"name":"NewRejection","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_sender","type":"address"},{"indexed":true,"internalType":"address","name":"_recipient","type":"address"},{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_serial","type":"uint256"}],"name":"NewRequest","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_serial","type":"uint256"}],"name":"execute","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_serial","type":"uint256"}],"name":"reject","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"request","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"requests","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"serial","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}] diff --git a/calculate_erc165.py b/calculate_erc165.py new file mode 100644 index 0000000..dcf1cfa --- /dev/null +++ b/calculate_erc165.py @@ -0,0 +1,16 @@ +import sys +import web3 + +f = open(sys.argv[1], 'r') +z = b'' +for i in range(32): + z += b'\x00' +while True: + l = f.readline() + if l == '': + break + print('line {}'.format(l)) + h = web3.Web3.keccak(text=l) + z = bytes([a ^ b for a, b in zip(h, z)]) + print(h.hex(), z.hex()) +f.close()