26 Commits

Author SHA1 Message Date
lash
64e8df2573 Interface and abi generator interface 2023-06-09 09:44:03 +01:00
lash
45ca79cf46 Add seal set part of interface test 2023-06-08 16:55:48 +01:00
lash
fe4f1c2c41 Habilitate expire unittest module for external use 2023-06-08 16:06:03 +01:00
lash
80589e574a Ensure test client specifies max supply in unittest 2023-06-08 14:39:46 +01:00
lash
5ff686e513 Bump version 2023-06-08 14:00:59 +01:00
lash
6aa0319407 Add bytecode generator for cic contracts unittests 2023-06-08 14:00:23 +01:00
lash
a7b0858baa Include unittest modules 2023-06-08 08:34:12 +01:00
lash
6f44c8304f Add seal test interface 2023-06-08 08:05:10 +01:00
lash
993d52ecab Rename writer test contract 2023-06-06 18:15:07 +01:00
lash
02aa54f653 Add writer test contract 2023-06-06 18:12:06 +01:00
lash
360a288d77 Bump version 2023-06-06 17:57:29 +01:00
lash
ef3ee7caf0 Add minter and burner python interface and test code 2023-06-06 17:56:45 +01:00
lash
220b8afbeb Add capped interface, python interface and test for capped, expire 2023-06-06 14:46:55 +01:00
lash
c10d2c46f1 Add readme from texinfo docbook intermediary 2023-05-13 20:42:47 +01:00
lash
3edc8bf021 Add option count to interface token vote 2023-05-07 19:16:08 +01:00
lash
2c666cc2aa Merge branch 'dev-0.2.1' 2023-05-07 19:02:58 +01:00
lash
2eba8c6254 Add token vote interfaces 2023-05-07 19:01:06 +01:00
lash
c2c9581dab Update gitignore 2023-03-26 12:06:12 +01:00
lash
b3f6e45696 Add Digest interface 2023-03-26 12:04:31 +01:00
lash
1e11d8df08 Update writer, registry, expire, improve comments 2023-03-26 09:58:23 +01:00
lash
46cc35b54c Add back ERC interfaces 2023-03-25 12:32:56 +00:00
lash
a28cfdbb36 Improve locator example 2023-03-25 11:24:23 +00:00
lash
0877fe7769 Embed solidity code, interfaces in documentation 2023-03-25 11:14:46 +00:00
lash
8507f202e7 Update declarator to include topic 2023-03-24 11:05:21 +00:00
lash
0f2cc2d232 Update interfaces to current implenentations 2023-03-21 20:46:46 +00:00
lash
99dce60a97 Bump dep 2023-02-11 04:53:46 +00:00
184 changed files with 3845 additions and 124 deletions

5
.gitignore vendored
View File

@@ -3,4 +3,7 @@ gmon.out
dist
build
*.egg-info
.venv
.venv
solidity/*.json
solidity/*.interface
solidity/*.bin

View File

@@ -6,7 +6,7 @@ INPUTS = $(wildcard solidity/*.sol)
OUTPUTS_JSON = $(patsubst %.sol, %.json, $(INPUTS))
OUTPUTS_INTERFACE = $(patsubst %.sol, %.interface, $(INPUTS))
OUTPUTS = $(OUTPUTS_JSON) $(OUTPUTS_INTERFACE)
PREFIX = /usr/local/share/cic/solidity/abi
PREFIX = $(DESTDIR)/usr/local/share/cic/solidity/abi
#%.abi.json: $(wildcard *.sol)
# install -vDm0644 $@ $(PREFIX)/$@
@@ -19,14 +19,36 @@ PREFIX = /usr/local/share/cic/solidity/abi
.sol.interface:
bash to_interface.sh $(basename $@).sol > $@
all: $(OUTPUTS)
all: outs doc
outs: $(OUTPUTS)
echo $(OUTPUTS)
install: $(OUTPUTS)
install-code: $(OUTPUTS)
install -vDm0644 -t $(PREFIX) $?
install-doc:
bash texify.sh
install: outs install-code install-doc doc
clean:
rm -vf solidity/*.json
rm -vf solidity/*.interface
doc:
bash texify.sh
make -C doc/texinfo
readme:
make -C doc/texinfo readme
pandoc -f docbook -t gfm doc/texinfo/build/docbook.xml > README.md
cp -v README.md python/README.md
python: outs
mkdir -vp python/cic_contracts/data
cp -v solidity/*.interface python/cic_contracts/data
cp -v solidity/*.json python/cic_contracts/data
make -C python
.PHONY: clean install

741
README.md Normal file
View File

@@ -0,0 +1,741 @@
# Smart contract interfaces
## Technology
CIC smart contracts are implemented using the *solidity* programming
language for the (Ethereum Virtual Machine (EVM).
## Adopted standards
### Signing
### ERC - Direct use
The following well-known solidity interfaces are used directly.
- [ERC20 - Token Standard](https://eips.ethereum.org/EIPS/eip-20)
- [ERC165 - Standard Interface
Detection](https://eips.ethereum.org/EIPS/eip-165)
- [ERC173 - Contract Ownership
Standard](https://eips.ethereum.org/EIPS/eip-173)
- [ERC191 - Signed Data
Standard](https://eips.ethereum.org/EIPS/eip-191)
- [ERC712 - Typed structured data hashing and
signing](https://eips.ethereum.org/EIPS/eip-712)
- [ERC721 - Non-Fungible Token
Standard](https://eips.ethereum.org/EIPS/eip-721)
- [ERC5007 - Time NFT (EIP-721 Time
Extension)](https://eips.ethereum.org/EIPS/eip-5007)
- [ERC5192 - Minimal Soulbound
NFTs](https://eips.ethereum.org/EIPS/eip-5192)
### ERCs Partial use
The following well-known solidity interfaces are partially implemented
in CIC native interfaces.
- [ERC5679 - Token Minting and
Burning](https://eips.ethereum.org/EIPS/eip-5679) (See `Minter`,
`Burner`)
## Native interfaces
### Accounts Index
Append-only list of addresses. Typically used for access control lists.
Addresses may be *added*, *removed*, aswell as *deactivated* and
*activated*. Deactivated accounts still count towards the `entryCount`.
The `entry` method is used to iterate the account list. The order of
which accounts are returned is not guaranteed. Any returned value
matching `address(0x00)` should be skipped, and not counted towards
`entryCount`.
May optionally record time when account was added.
ERC165 Interface identifier
b7bca625
Solidity interface definition
interface IAccountsIndex {
// Address added to store, index in array.
event AddressAdded(uint256 indexed _idx, address _account);
// Return number of entries in index.
function entryCount() external view returns (uint256);
// Return entry at the spceificed index.
// Will revert if index is beyond array length.
// An entry result of 0 means the entry should be skipped, and not count towards entry count.
function entry(uint256) external view returns (address);
// Add an entry to the index. Incresases the entry count.
function add(address) external returns (bool);
// Verify that the entry exists in the index.
function have(address) external view returns (bool);
// Retrieve the timestamp when account was added.
// If time is not being tracked, a value of 0 should be returned.
function time(address) external view returns (uint256);
}
Reference implementation
<git://holbrook.no/eth-accounts-index.git> (v0.5.1)
### Accounts Index Mutable
Extends the functionality of `Accounts Index` to allow changes to the
address list.
Addresses may be *added*, *removed*, aswell as *deactivated* and
*activated*. Deactivated accounts still count towards the `entryCount`.
ERC165 Interface identifier
9479f0ae
Solidity interface definition
interface IAccountsIndexMutable {
// Active status of address changed, and by whom changed.
event AddressActive(address indexed _account, bool _active);
// Address removed from store, and by whom removed.
event AddressRemoved(address _account);
// Remove an entry from the index. Reduces the entry count.
function remove(address) external returns (bool);
// Deactivate account but keep in index. Does not affect entry count.
function deactivate(address) external returns (bool);
// Activate previously deactivated account. Does not affect entry count.
function activate(address) external returns (bool);
// Check if account exists and is active;
function isActive(address) external view returns (bool);
}
Reference implementation
<git://holbrook.no/eth-accounts-index.git> (v0.5.1)
### Burner
Attached to `ERC20` and `ERC721` tokens that may be *burned*.
Implements the `burn(...)` part of `ERC5679` for interoperability.
ERC165 Interface identifier
bc4babdd
Solidity interface definition
interface IBurner {
// Token(s) successfully burned; by who and how much.
event Burn(address indexed _burner, uint256 _burned);
// Satisfies ERC 5679
function burn(address _from, uint256 _amount, bytes calldata _data) external;
// Burn given amount of tokens held by signer.
function burn(uint256 _burn) external returns (bool);
// Burn all tokens held by signer.
function burn() external returns (bool);
// Total amount of tokens that have been burned.
function totalBurned() external returns (uint256);
// Total amount of tokens ever minted.
// If totalSupply() is available (ERC20, ERC721 Enumerable), this equals totalSupply() + totalBurned().
function totalMinted() external returns (uint256);
}
Example implementation
<https://git.grassecon.net/cicnet/erc20-demurrage-token.git>
### Chrono
Define a creation time for a resource.
Complements `ERC5007`.
ERC165 Interface identifier
4db1ccd4
Solidity interface definition
interface IChrono {
// Returns the timestamp of when a resource corresponding to _idx was first created.
// int64 chosen as return value for simpler interoperability with ERC5007.
function createTime(uint256 _idx) external returns(int64);
}
Example implementation
<https://git.defalsify.org/eth-erc721> (BadgeToken contract)
### Declarator
Permissionless store of signed claims made by an address about other
addresses, or addresses about themselves.
It is used to declare or respond to certifications of vouchers, NFT,
voucher members.
Addresses may be Externally Owned Accounts or smart contracts.
Claims may be made with or without topics. A missing topic is synonymous
with a topic value of `bytes32(0x00)`.
Any number of claims can be made about an address under any number of
topics. All claims must be stored, and returned in the order which they
were added.
ERC165 Interface identifier
21b7493b
Solidity interface definition
interface IDeclarator {
event DeclarationAdded(address indexed _declarator, address indexed _subject, bytes32 indexed _topic, bytes32 _proof);
// Get all declarations for a subject (without topic) signed by a declarator
function declaration(address _declarator, address _subject) external view returns ( bytes32[] memory );
// Get all declarations for a subject for the given topic signed by a declarator
function declaration(address _declarator, address _subject, bytes32 _topic) external view returns ( bytes32[] memory );
// Get number of declarations the declarator has ever signed
function declarationCount(address _declarator) external view returns ( uint256 );
// Get the subject of a declarator's declarations at the specific index
function declarationAddressAt(address _declarator, uint256 _idx) external view returns ( address );
// Add a declaration for the subject
function addDeclaration(address _subject, bytes32 _proof) external returns ( bool );
// Add a declaration with topic for the subject
function addDeclaration(address _subject, bytes32 _proof, bytes32 _topic) external returns ( bool );
// Get the declarator that signed a declaration at the specificed index for a subject
function declaratorAddressAt(address _subject, uint256 _idx) external view returns ( address );
// Get the number of declarators that have signed for a subject
function declaratorCount(address _subject) external view returns ( uint256 );
}
Reference implementation
<git://holbrook.no/eth-address-index.git>
### Digest
Allows encoding of digests according to a specific encoding scheme.
Primary use-case is the abstraction of self-describing
[Multhash](https://multiformats.io/multihash/) encoding.
A default encoding *must* always be defined, and the encoding of a valid
digest *must* succeed with the default encoding.
ERC165 Interface identifier
982ab05d
Solidity interface definition
interface IDigest {
// Returns the default digest encoding used by the contract instance.
function defaultDigestEncoding() external view returns (uint256 _encoding);
// Check if the given encoding has been implemented in the contract instance.
function haveDigestEncoding(uint256 _codec) external view returns(bool);
// Verify and encode the given digest for a specific hashing algorithm.
// Returns a zero-length byte array if digest is invalid.
// Must succeed if called with the defaultDigestEncoding and a valid digest.
function encodeDigest(bytes memory _data, uint256 _encoding) external view returns (bytes memory);
// Encodes the digest using the default digest encoding.
// Returns a zero-length byte array if digest is invalid.
// Must succeed with a valid digest.
function encodeDigest(bytes memory _data) external view returns (bytes memory);
}
Example implementation
<git://holbrook.no/eth-event-msg.git>
### Expire
Defines an expiry time after which token balances or supply *cannot
change*.
A contract defining an expiry *must not* allow changing the expiration
time to a time in the past.
ERC165 Interface identifier
841a0e94
Solidity interface definition
interface IExpire {
// Contract has expired.
event Expired(uint256 _timestamp);
// Expiry time has changed.
event ExpiryChange(uint256 indexed _oldTimestamp, uint256 _newTimestamp);
// The current expiration timestamp.
function expires() external returns (uint256);
// Check expiry and apply expiration if expired.
// Return values must be:
// 0: not yet expired.
// 1: already expired.
// >1: expiry executed.
function applyExpiry() external returns(uint8);
}
Example implementation
<https://git.grassecon.net/cicnet/erc20-demurrage-token.git>
### Faucet
Used for dispensing tokens to any address.
It can be used for gas tokens and *ERC20* alike.
The interface is the same whether the faucet is dispensing from existing
balance or minting new tokens.
The value dispersed *must* be the same for all addresses.
In general, four criteria are expected to exist in any combination for
limiting access to the faucet:
Time
A recipient may only use the faucet again after some time has passed.
Balance threshold
A recipient may only use the faucet after its balance is below a certain
amount.
Membership
A recipient may only use the faucet if it has been added to an access
control list.
Capacity
The contract has sufficient token funds to dispense the current defined
amount to dispense.
The *check(address)* contract call *must* evaluate all four criteria,
and *must* return `false` if any of the criteria are not met.
ERC165 Interface identifier
1a3ac634
Solidity interface definition
interface IFaucet {
// Tokens were given to an address
event Give(address indexed _recipient, address indexed _token, uint256 _value);
// The amount that the faucet disperses has changed
event FaucetAmountChange(uint256 _value);
// Address of token the faucet represents
// The faucet will return gas tokens with the zero-address is returned.
function token() external returns (address);
// Amount of tokens the faucet gives out
function tokenAmount() external returns (uint256);
// Give tokens to the given recipient. Returns amount of tokens given.
function giveTo(address _recipient) external returns (uint256);
// Give tokens to yourself. Returns amount of tokens given.
function gimme() external returns (uint256);
// Check if faucet may be used in the current contract state by _recipient
function check(address _recipient) external view returns (bool);
// Returns timestamp when faucet may be used again by _recipient
// If 0 is returned, the address has not yet been used.
// A return value of max(uint256) indicates that the faucet may not be used again.
function nextTime(address _recipient) external returns (uint256);
// Returns the token balance under which faucet may be used again by _recipient
// A return value of max(uint256) indicates that the faucet may be used regardless
// of the token balance of _recipient
function nextBalance(address _recipient) external returns (uint256);
}
Reference implementations
- <git://holbrook.no/erc20-faucet.git>
- <git://holbrook.no/eth-faucet.git>
### Locator
This interface supports `ERC721 Metadata`, in particular the
`tokenURI(uint256)` call.
Off-chain resources in the CIC network *must* be defined in terms of
content addressed strings.
It *must* be possible to refer to all off-chain resources directly by
the content address.
Furthermore, it *should* be possible to refer to a resource by a
fully-qualified location on the web or an overlay network (e.g. tor).
ERC165 Interface identifier
ed75b333
Solidity interface definition
interface ILocator {
// URI that may or may not point to a specific resource location.
function toURI(bytes memory _data) external view returns (string memory);
// URL pointing to a specific resource location.
function toURL(bytes memory _data) external view returns(string memory);
}
Example implementation
<git://holbrook.no/eth-event-msg.git>
#### Expressing locators in terms of numetic token id
Given the numeric token id `1234567890987654321` (`0x112210f4b16c1cb1`
hex), and a base url `https://contentgateway.grassecon.net`, the result
of the methods may be as follows:
`toURI(toHex(1234567890987654321))`
-\>
`https://contentgateway.grassecon.net/000000000000000000000000000000000000000000000000112210f4b16c1cb1`
`toURL(toHex(1234567890987654321))`
-\>
`https://contentgateway.grassecon.net/000000000000000000000000000000000000000000000000112210f4b16c1cb1`
`tokenURI(1234567890987654321)`
-\>
`https://contentgateway.grassecon.net/000000000000000000000000000000000000000000000000112210f4b16c1cb1`
#### Expressing locators in terms of a digest
Given the data `foo`, the digest algorithm `sha256` and a base url
`https://contentgateway.grassecon.net`, the result of the methods may be
as follows:
`toURI(sha256(foo))`
-\>
`"sha256:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"`
`toURL(sha256(foo))`
-\>
`"https://contentgateway.grassecon.net/2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"`
`tokenURI(toUint(sha256(foo)))`
-\>
`"https://contentgateway.grassecon.net/2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"`
#### Locator without URL
Given the data `foo`, the digest algorithm `sha256` and no base url, the
result of the methods may be as follows:
`toURI(sha256(foo))`
-\>
`"sha256:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"`
`toURL(sha256(foo))`
-\> `""`
`tokenURI(toUint(sha256(foo)))`
-\>
`"sha256:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"`
### Minter
Attached to `ERC20` and `ERC721` tokens that may be minted.
Implements the `mint(...)` and `safeMint(...)` parts of `ERC5679` for
interoperability.
ERC165 Interface identifier
5878bcf4
Solidity interface definition
interface IMinter {
// Tokens are successfully minted; by who, to whom and how much
event Mint(address indexed _minter, address indexed _beneficiary, uint256 value);
// Mint the specified value of tokens to the specified recipient
function mintTo(address _beneficiary, uint256 value) external returns (bool);
// Satisfies ERC5679 for ERC20
function mint(address _beneficiary, uint256 value, bytes calldata _data) external;
// Satisfies ERC5679 for ERC721
function safeMint(address _beneficiary, uint256 value, bytes calldata _data) external;
}
Example implementation
<https://git.grassecon.net/cicnet/erc20-demurrage-token.git>
### Msg
Enables a reference "message" to describe the contract using an
off-chain resource.
The reference may or may not be mutable.
The interface complements `Locator` and `MultiHash` to generate locators
for how to resolve the reference.
ERC165 Interface identifier
a3002595
Solidity interface definition
interface IMsg {
// Emitted when a new message digest has been set
// Should not be emitted if the digest set is identical to the previous
event Msg(bytes _msgDigest);
// Get the current message content hash
function getMsg() external view returns(bytes memory);
}
Example implementation
<git://holbrook.no/eth-event-msg.git>
### Registry
The Registry interface is a key-value store resolving well-known
contract identifier names to contract addresses.
It currently has two distinct uses in the CIC context:
1. Entry-point to discover all relevant contracts of CIC networks.
2. Unique (ERC20) token symbol resolver.
ERC165 Interface identifier
effbf671
Solidity interface definition
interface IRegistryClient {
// Address added to store with the given key
event AddressKey(bytes32 indexed _key, address _address);
// Return the address of the contract identified by the given byte string
function addressOf(bytes32) external view returns (address);
// Indexed accessor for the full list of registred identifiers
function identifier(uint256) external view returns (bytes32);
// Number of registered interfaces
function identifierCount() external view returns (uint256);
}
Contract registry implementation
<git://holbrook.no/eth-contract-registry.git>
Token index implementation
<git://holbrook.no/eth-contract-registry.git>
### Seal
Some smart contract parameters may need to be mutable over part of a
smart contracts lifetime.
This interface provides a method to explicitly signal when certain
parameters have been rendered immutable.
The value of `sealState()` *must not* decrease, and must not exceed
`maxSealState`.
`maxSealState` is used to define that *all mutable parameters* have been
rendered immutable. The practical implications of this will vary between
contracts.
The implementer is encouraged to use simple, descriptive names in the
source code to describe the applicable seal states.
Use cases of sealing include:
- Whether more tokens can be minted
- Allow ownership of a contract to be transferred
- The expiry time of a token (see `Expire`)
ERC165 Interface identifier
0d7491f8
Solidity interface definition
interface ISeal {
// Seal state has changed.
event SealStateChange(bool indexed _final, uint256 _sealState);
// The current seal state.
function sealState() external view returns(uint256);
// The numeric seal state in everything sealable has been sealed.
function maxSealState() external view returns(uint256);
}
Example implementation
<https://git.grassecon.net/cicnet/erc20-demurrage-token.git>
### TokenVend
This interface defines the mechanism for which a specific ERC20 token
may be exchanged for a different ERC20 token.
A typical use-case is generation of voting tokens based on a momentary
voucher balance. This is especially useful if the original ERC20 token
is subject to decay (demurrage).
The tokens used for exchange **SHOULD** be locked for the full duration
of holding the vended tokens.
The withdrawal function may or may not allow partial withdrawals.
ERC165 Interface identifier
8a13249c
Solidity interface definition
interface ITokenVend {
// A new vended token has been created.
event TokenCreated(uint256 indexed _tokenIdx, uint256 indexed _supply, address _token);
// Create corresponding vended tokens for the control token balance of the caller.
function getFor(address _token) external returns (uint256);
// Recover control tokens that were used to retrieve the corresponding vended tokens.
function withdrawFor(address _token) external returns (uint256);
}
Reference implementations
- <git://holbrook.no/erc20-vend.git>
### TokenVote
Execute elections with granular ERC20 token votes.
A proposal submitted for vote may or may not contain multiple options.
If multiple options are available, an ERC20 token holder may distribute
its vote among the options with the granularity of the token balance.
Voted tokens **SHOULD** be locked until the voting has finalized.
Finalization of voting should be callable by anyone.
ERC165 Interface identifier
28091366
Solidity interface definition
interface ITokenVote {
// A new proposal has been created.
event ProposalAdded(uint256 indexed _blockDeadline, uint256 indexed voteTargetPpm, uint256 indexed _proposalIdx);
// A proposal vote has been completed.
// The proposal is identified by the serial number in _proposalIdx. It is up to the implementer to define how the proposal should be retrieved by index.
// The proposal result may be in one of three states:
// * Ratified (_cancelled == false, _insufficient == false)
// * Cancelled (_cancelled == true, _insufficient == false)
// * Not reached quorum (_cancelled == false, _insufficient == true)
event ProposalCompleted(uint256 indexed _proposalIdx, bool indexed _cancelled, bool indexed _insufficient, uint256 _totalVote);
// Propose a new vote.
// Voting is active until one of:
// * total cancel vote reach quorum (_targetVotePpm, ppm = parts-per-million).
// * _blockWait blocks from now.
function propose(bytes32 _description, uint256 _blockWait, uint24 _targetVotePpm) external returns (uint256);
// Same as propose(...), but provide options to vote on.
function proposeMulti(bytes32 _description, bytes32[] memory _options, uint256 _blockWait, uint24 _targetVotePpm) external returns (uint256);
// Get number of options available for the proposal.
// This decides the boundary of the index that can be used with voteOptions(...)
// If the result is 0, vote(...) can be used aswell.
function optionCount(uint256 _proposalIdx) external view returns(uint256);
// Get proposal option. Assumes that proposal was created with proposeMulti(...)
function getOption(uint256 _proposalIdx, uint256 _optionIdx) external view returns (bytes32);
// Get vote count for the given option.
// If proposal has no options, it should be called with _optionIdx = 0
function voteCount(uint256 _proposalIdx, uint256 _optionIdx) external view returns(uint256);
// Vote on a proposal without options.
// Assumes that proposal was created with propose(...) and will fail otherwise.
function vote(uint256 _value) external returns (bool);
// Vote on a proposal option. Assumes that proposal was created with proposeMulti(...).
// Must work with a non-option proposal if _optionIndex is 0.
function voteOption(uint256 _optionIndex, uint256 _value) external returns (bool);
// Vote to cancel a proposal.
// If cancel has the majority:
// * A vote without options will have rejected the proposal description.
// * A vote with options will have rejected the proposal description as well as all option descriptions.
function voteCancel(uint256 _value) external returns (bool);
// Finalize the vote for a proposal.
// May be called if deadline has been passed, or if:
// * quorum has been reached with cancel votes.
// * quorum has been reached and proposal has no/only one option.
function finalize() external returns (bool);
}
Reference implementations
- <git://holbrook.no/evm-tokenvote.git>
### Writer
A complement to ERC173, which allows definition of a class of
super-users for a contract.
A super-user address may perform *more* actions than a "normal" address,
aswell as *some* actions normally limited to the *contract owner*.
If an *contract owner* is defined, No super-user should be able to
perform actions that *contract owner* cannot perform.
Typically, only the *contract owner*, if it is defined, can add or
remove a super-user.
Some use-case examples of super-user actions include:
- Mint new tokens.
- Change the amount dispensed by the faucet.
- Edit access control lists.
ERC165 Interface identifier
abe1f1f5
Solidity interface definition
interface IWriter {
// A writer has been added by _executor
event WriterAdded(address _writer);
// A writer has been removed by _executor
event WriterDeleted(address _writer);
// Add a new writer to the contract.
function addWriter(address _writer) external returns (bool);
// Remove existing writer from the contract.
function deleteWriter(address _writer) external returns (bool);
// Check whether the given address is a writer.
function isWriter(address _writer) external view returns (bool);
}
Example implementation
<https://git.grassecon.net/cicnet/erc20-demurrage-token.git>

View File

@@ -1 +1 @@
0.0.5
0.2.0

View File

@@ -1,3 +1,5 @@
all:
makeinfo --html index.texi
readme:
makeinfo --docbook --no-split -o build/docbook.xml index.texi

View File

@@ -0,0 +1,36 @@
@subsection Accounts Index
Append-only list of addresses. Typically used for access control lists.
Addresses may be @emph{added}, @emph{removed}, aswell as @emph{deactivated} and @emph{activated}. Deactivated accounts still count towards the @code{entryCount}.
The @code{entry} method is used to iterate the account list. The order of which accounts are returned is not guaranteed. Any returned value matching @code{address(0x00)} should be skipped, and not counted towards @code{entryCount}.
May optionally record time when account was added.
@table @dfn
@item ERC165 Interface identifier
@include ../../build/AccountsIndex.interface
@item Solidity interface definition
@include ../../build/contract_AccountsIndex.texi
@item Reference implementation
@uref{git://holbrook.no/eth-accounts-index.git,} (v0.5.1)
@end table
@subsection Accounts Index Mutable
Extends the functionality of @code{Accounts Index} to allow changes to the address list.
Addresses may be @emph{added}, @emph{removed}, aswell as @emph{deactivated} and @emph{activated}. Deactivated accounts still count towards the @code{entryCount}.
@table @dfn
@item ERC165 Interface identifier
@include ../../build/AccountsIndexMutable.interface
@item Solidity interface definition
@include ../../build/contract_AccountsIndexMutable.texi
@item Reference implementation
@uref{git://holbrook.no/eth-accounts-index.git,} (v0.5.1)
@end table

View File

@@ -0,0 +1,14 @@
@subsection Burner
Attached to @code{ERC20} and @code{ERC721} tokens that may be @emph{burned}.
Implements the @code{burn(...)} part of @code{ERC5679} for interoperability.
@table @dfn
@item ERC165 Interface identifier
@include ../../build/Burner.interface
@item Solidity interface definition
@include ../../build/contract_Burner.texi
@item Example implementation
@uref{https://git.grassecon.net/cicnet/erc20-demurrage-token.git}
@end table

View File

@@ -0,0 +1,15 @@
@subsection Chrono
Define a creation time for a resource.
Complements @code{ERC5007}.
@table @dfn
@item ERC165 Interface identifier
@include ../../build/Chrono.interface
@item Solidity interface definition
@include ../../build/contract_Chrono.texi
@item Example implementation
@uref{https://git.defalsify.org/eth-erc721} (BadgeToken contract)
@end table

View File

@@ -0,0 +1,20 @@
@subsection Declarator
Permissionless store of signed claims made by an address about other addresses, or addresses about themselves.
It is used to declare or respond to certifications of vouchers, NFT, voucher members.
Addresses may be Externally Owned Accounts or smart contracts.
Claims may be made with or without topics. A missing topic is synonymous with a topic value of @code{bytes32(0x00)}.
Any number of claims can be made about an address under any number of topics. All claims must be stored, and returned in the order which they were added.
@table @dfn
@item ERC165 Interface identifier
@include ../../build/Declarator.interface
@item Solidity interface definition
@include ../../build/contract_Declarator.texi
@item Reference implementation
@uref{git://holbrook.no/eth-address-index.git,}
@end table

View File

@@ -0,0 +1,17 @@
@subsection Digest
Allows encoding of digests according to a specific encoding scheme.
Primary use-case is the abstraction of self-describing @uref{https://multiformats.io/multihash/,Multhash} encoding.
A default encoding @emph{must} always be defined, and the encoding of a valid digest @emph{must} succeed with the default encoding.
@table @dfn
@item ERC165 Interface identifier
@include ../../build/Digest.interface
@item Solidity interface definition
@include ../../build/contract_Digest.texi
@item Example implementation
@uref{git://holbrook.no/eth-event-msg.git}
@end table

View File

@@ -0,0 +1,15 @@
@subsection Expire
Defines an expiry time after which token balances or supply @emph{cannot change}.
A contract defining an expiry @emph{must not} allow changing the expiration time to a time in the past.
@table @dfn
@item ERC165 Interface identifier
@include ../../build/Expire.interface
@item Solidity interface definition
@include ../../build/contract_Expire.texi
@item Example implementation
@uref{https://git.grassecon.net/cicnet/erc20-demurrage-token.git}
@end table

View File

@@ -0,0 +1,39 @@
@subsection Faucet
Used for dispensing tokens to any address.
It can be used for gas tokens and @emph{ERC20} alike.
The interface is the same whether the faucet is dispensing from existing balance or minting new tokens.
The value dispersed @emph{must} be the same for all addresses.
In general, four criteria are expected to exist in any combination for limiting access to the faucet:
@table @dfn
@item Time
A recipient may only use the faucet again after some time has passed.
@item Balance threshold
A recipient may only use the faucet after its balance is below a certain amount.
@item Membership
A recipient may only use the faucet if it has been added to an access control list.
@item Capacity
The contract has sufficient token funds to dispense the current defined amount to dispense.
@end table
The @emph{check(address)} contract call @emph{must} evaluate all four criteria, and @emph{must} return @code{false} if any of the criteria are not met.
@table @dfn
@item ERC165 Interface identifier
@include ../../build/Faucet.interface
@item Solidity interface definition
@include ../../build/contract_Faucet.texi
@item Reference implementations
@itemize
@item
@uref{git://holbrook.no/erc20-faucet.git,}
@item
@uref{git://holbrook.no/eth-faucet.git,}
@end itemize
@end table

View File

@@ -0,0 +1,60 @@
@subsection Locator
This interface supports @code{ERC721 Metadata}, in particular the @code{tokenURI(uint256)} call.
Off-chain resources in the CIC network @emph{must} be defined in terms of content addressed strings.
It @emph{must} be possible to refer to all off-chain resources directly by the content address.
Furthermore, it @emph{should} be possible to refer to a resource by a fully-qualified location on the web or an overlay network (e.g. tor).
@table @dfn
@item ERC165 Interface identifier
@include ../../build/Locator.interface
@item Solidity interface definition
@include ../../build/contract_Locator.texi
@item Example implementation
@uref{git://holbrook.no/eth-event-msg.git}
@end table
@subsubsection Expressing locators in terms of numetic token id
Given the numeric token id @code{1234567890987654321} (@code{0x112210f4b16c1cb1} hex), and a base url @code{https://contentgateway.grassecon.net}, the result of the methods may be as follows:
@table @code
@item toURI(toHex(1234567890987654321))
-> @code{https://contentgateway.grassecon.net/000000000000000000000000000000000000000000000000112210f4b16c1cb1}
@item toURL(toHex(1234567890987654321))
-> @code{https://contentgateway.grassecon.net/000000000000000000000000000000000000000000000000112210f4b16c1cb1}
@item tokenURI(1234567890987654321)
-> @code{https://contentgateway.grassecon.net/000000000000000000000000000000000000000000000000112210f4b16c1cb1}
@end table
@subsubsection Expressing locators in terms of a digest
Given the data @code{foo}, the digest algorithm @code{sha256} and a base url @code{https://contentgateway.grassecon.net}, the result of the methods may be as follows:
@table @code
@item toURI(sha256(foo))
-> @code{"sha256:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"}
@item toURL(sha256(foo))
-> @code{"https://contentgateway.grassecon.net/2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"}
@item tokenURI(toUint(sha256(foo)))
-> @code{"https://contentgateway.grassecon.net/2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"}
@end table
@subsubsection Locator without URL
Given the data @code{foo}, the digest algorithm @code{sha256} and no base url, the result of the methods may be as follows:
@table @code
@item toURI(sha256(foo))
-> @code{"sha256:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"}
@item toURL(sha256(foo))
-> @code{""}
@item tokenURI(toUint(sha256(foo)))
-> @code{"sha256:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"}
@end table

View File

@@ -0,0 +1,14 @@
@subsection Minter
Attached to @code{ERC20} and @code{ERC721} tokens that may be minted.
Implements the @code{mint(...)} and @code{safeMint(...)} parts of @code{ERC5679} for interoperability.
@table @dfn
@item ERC165 Interface identifier
@include ../../build/Minter.interface
@item Solidity interface definition
@include ../../build/contract_Minter.texi
@item Example implementation
@uref{https://git.grassecon.net/cicnet/erc20-demurrage-token.git}
@end table

17
doc/texinfo/msg.sol.texi Normal file
View File

@@ -0,0 +1,17 @@
@subsection Msg
Enables a reference "message" to describe the contract using an off-chain resource.
The reference may or may not be mutable.
The interface complements @code{Locator} and @code{MultiHash} to generate locators for how to resolve the reference.
@table @dfn
@item ERC165 Interface identifier
@include ../../build/Msg.interface
@item Solidity interface definition
@include ../../build/contract_Msg.texi
@item Example implementation
@uref{git://holbrook.no/eth-event-msg.git}
@end table

59
doc/texinfo/old.texi Normal file
View File

@@ -0,0 +1,59 @@
@subsection Auxiliary contracts
All other Smart Contracts in the network other than CICRegistry are essentially optional, and each applies @emph{at least one} the interfaces defined in the @code{cic-contracts} repository.
@subsection Contract interfaces
All contracts interfaces also implement the @strong{EIP165} Standard Interface Detection.
@subsubsection Registry
A key-value store, which resolves arbitrary 32-byte pointers to Ethereum addresses. Typically, this is used to resolve an address from a well-known identifier, either as a UTF-8 value or a 256-bit hash.
It also provides numerical index access to all registered values in order of insertion.
@subsubsection Registry Client
A subset of the @code{Registry} interface, which defines only the non-transactional methods of the contract. The @code{Registry Client} interface is implemented by the @code{CICRegistry} contract.
@subsubsection Faucet
Enables disbursement of a set amount of tokens to a requesting address.
Allows privileged accounts to adjust the amount of tokens to disburse.
Can be implemented as a periodic or a one-time service per account.
@subsubsection Transfer approval
Enables a third-party approval to spend an ERC20 token allowance.
This is useful in the case of a custodial key store, where a transaction has been initiated by another entity than the owner of the key.
The contract allows the third-party address to either allow or reject the transfer.
@subsubsection Declarator
Stores one or more 32-byte entries as a description of an Ethereum address, @emph{signed} by another Ethereum address.
This can be used to @emph{describe} network resources, be it tokens, contracts or user accounts. Examples of uses are KYC documentation proofs for users, token metadata used for display, or fraud alerts.
Entries are stored by the transacting address that adds address/description pairs. In other words, any address may have different "opinions" registered about it, depending on which signing address it is queried in the context of. This, in turn, allows the quering entity to compile its own "opinion" of an address by combining data from signatures it trusts.
Entries typically are text strings or content hashes.
@subsubsection Address Index
A simple append-only list of addresses. Used to check whether an address is part of a particular group.
@subsubsection DEX Index
Methods required to convert between tokens.

View File

@@ -2,75 +2,80 @@
@chapter Smart contract interfaces
@section Smart Contracts in the CIC Network
@subsection Technology
@section Technology
The long-term aim of the CIC network is to be agnostic of consensus engines. However, since we have to start @emph{somewhere}, the current state of development only deals with Smart Contracts on the (Ethereum Virtual Machine (EVM).
CIC smart contracts are implemented using the @emph{solidity} programming language for the (Ethereum Virtual Machine (EVM).
@subsection The registry contract
@section Adopted standards
The CICRegistry contract defines the entry-point to the entire CIC network. All other CIC network resources can be discovered through this contract.
Its implementation is contained in the @file{cic-registry} repository. Details about it are documented further in that section.
@subsection Auxiliary contracts
All other Smart Contracts in the network other than CICRegistry are essentially optional, and each applies @emph{at least one} the interfaces defined in the @code{cic-contracts} repository.
@subsection Signing
@subsection Contract interfaces
@subsection ERC - Direct use
All contracts interfaces also implement the @strong{EIP165} Standard Interface Detection.
The following well-known solidity interfaces are used directly.
@subsubsection Registry
A key-value store, which resolves arbitrary 32-byte pointers to Ethereum addresses. Typically, this is used to resolve an address from a well-known identifier, either as a UTF-8 value or a 256-bit hash.
It also provides numerical index access to all registered values in order of insertion.
@itemize @bullet
@item
@uref{https://eips.ethereum.org/EIPS/eip-20, ERC20 - Token Standard}
@item
@uref{https://eips.ethereum.org/EIPS/eip-165, ERC165 - Standard Interface Detection}
@item
@uref{https://eips.ethereum.org/EIPS/eip-173, ERC173 - Contract Ownership Standard}
@item
@uref{https://eips.ethereum.org/EIPS/eip-191, ERC191 - Signed Data Standard}
@item
@uref{https://eips.ethereum.org/EIPS/eip-712, ERC712 - Typed structured data hashing and signing}
@item
@uref{https://eips.ethereum.org/EIPS/eip-721, ERC721 - Non-Fungible Token Standard}
@item
@uref{https://eips.ethereum.org/EIPS/eip-5007, ERC5007 - Time NFT (EIP-721 Time Extension)}
@item
@uref{https://eips.ethereum.org/EIPS/eip-5192, ERC5192 - Minimal Soulbound NFTs}
@end itemize
@subsubsection Registry Client
@subsection ERCs Partial use
A subset of the @code{Registry} interface, which defines only the non-transactional methods of the contract. The @code{Registry Client} interface is implemented by the @code{CICRegistry} contract.
The following well-known solidity interfaces are partially implemented in CIC native interfaces.
@itemize @dfn
@item
@uref{https://eips.ethereum.org/EIPS/eip-5679, ERC5679 - Token Minting and Burning} (See @code{Minter}, @code{Burner})
@end itemize
@subsubsection Faucet
@section Native interfaces
Enables disbursement of a set amount of tokens to a requesting address.
@include accountsindex.sol.texi
Allows privileged accounts to adjust the amount of tokens to disburse.
@include burner.sol.texi
Can be implemented as a periodic or a one-time service per account.
@include chrono.sol.texi
@include declarator.sol.texi
@subsubsection Transfer approval
@include digest.sol.texi
Enables a third-party approval to spend an ERC20 token allowance.
@include expire.sol.texi
This is useful in the case of a custodial key store, where a transaction has been initiated by another entity than the owner of the key.
@include faucet.sol.texi
The contract allows the third-party address to either allow or reject the transfer.
@include locator.sol.texi
@include minter.sol.texi
@subsubsection Declarator
@include msg.sol.texi
Stores one or more 32-byte entries as a description of an Ethereum address, @emph{signed} by another Ethereum address.
@include registry.sol.texi
This can be used to @emph{describe} network resources, be it tokens, contracts or user accounts. Examples of uses are KYC documentation proofs for users, token metadata used for display, or fraud alerts.
@include seal.sol.texi
Entries are stored by the transacting address that adds address/description pairs. In other words, any address may have different "opinions" registered about it, depending on which signing address it is queried in the context of. This, in turn, allows the quering entity to compile its own "opinion" of an address by combining data from signatures it trusts.
@include tokenvend.sol.texi
Entries typically are text strings or content hashes.
@include tokenvote.sol.texi
@subsubsection Address Index
A simple append-only list of addresses. Used to check whether an address is part of a particular group.
@subsubsection DEX Index
Methods required to convert between tokens.
@include writer.sol.texi

View File

@@ -0,0 +1,23 @@
@subsection Registry
The Registry interface is a key-value store resolving well-known contract identifier names to contract addresses.
It currently has two distinct uses in the CIC context:
@enumerate
@item
Entry-point to discover all relevant contracts of CIC networks.
@item
Unique (ERC20) token symbol resolver.
@end enumerate
@table @dfn
@item ERC165 Interface identifier
@include ../../build/RegistryClient.interface
@item Solidity interface definition
@include ../../build/contract_RegistryClient.texi
@item Contract registry implementation
@uref{git://holbrook.no/eth-contract-registry.git,}
@item Token index implementation
@uref{git://holbrook.no/eth-contract-registry.git,}
@end table

31
doc/texinfo/seal.sol.texi Normal file
View File

@@ -0,0 +1,31 @@
@subsection Seal
Some smart contract parameters may need to be mutable over part of a smart contract's lifetime.
This interface provides a method to explicitly signal when certain parameters have been rendered immutable.
The value of @code{sealState()} @emph{must not} decrease, and must not exceed @code{maxSealState}.
@code{maxSealState} is used to define that @emph{all mutable parameters} have been rendered immutable. The practical implications of this will vary between contracts.
The implementer is encouraged to use simple, descriptive names in the source code to describe the applicable seal states.
Use cases of sealing include:
@itemize
@item
Whether more tokens can be minted
@item
Allow ownership of a contract to be transferred
@item
The expiry time of a token (see @code{Expire})
@end itemize
@table @dfn
@item ERC165 Interface identifier
@include ../../build/Seal.interface
@item Solidity interface definition
@include ../../build/contract_Seal.texi
@item Example implementation
@uref{https://git.grassecon.net/cicnet/erc20-demurrage-token.git}
@end table

View File

@@ -0,0 +1,21 @@
@subsection TokenVend
This interface defines the mechanism for which a specific ERC20 token may be exchanged for a different ERC20 token.
A typical use-case is generation of voting tokens based on a momentary voucher balance. This is especially useful if the original ERC20 token is subject to decay (demurrage).
The tokens used for exchange @strong{SHOULD} be locked for the full duration of holding the vended tokens.
The withdrawal function may or may not allow partial withdrawals.
@table @dfn
@item ERC165 Interface identifier
@include ../../build/TokenVend.interface
@item Solidity interface definition
@include ../../build/contract_TokenVend.texi
@item Reference implementations
@itemize
@item
@uref{git://holbrook.no/erc20-vend.git,}
@end itemize
@end table

View File

@@ -0,0 +1,23 @@
@anchor{token_vote}
@subsection TokenVote
Execute elections with granular ERC20 token votes.
A proposal submitted for vote may or may not contain multiple options. If multiple options are available, an ERC20 token holder may distribute its vote among the options with the granularity of the token balance.
Voted tokens @strong{SHOULD} be locked until the voting has finalized.
Finalization of voting should be callable by anyone.
@table @dfn
@item ERC165 Interface identifier
@include ../../build/TokenVote.interface
@item Solidity interface definition
@include ../../build/contract_TokenVote.texi
@item Reference implementations
@itemize
@item
@uref{git://holbrook.no/evm-tokenvote.git,}
@end itemize
@end table

View File

@@ -0,0 +1,29 @@
@subsection Writer
A complement to ERC173, which allows definition of a class of super-users for a contract.
A super-user address may perform @emph{more} actions than a "normal" address, aswell as @emph{some} actions normally limited to the @emph{contract owner}.
If an @emph{contract owner} is defined, No super-user should be able to perform actions that @emph{contract owner} cannot perform.
Typically, only the @emph{contract owner}, if it is defined, can add or remove a super-user.
Some use-case examples of super-user actions include:
@itemize
@item
Mint new tokens.
@item
Change the amount dispensed by the faucet.
@item
Edit access control lists.
@end itemize
@table @dfn
@item ERC165 Interface identifier
@include ../../build/Writer.interface
@item Solidity interface definition
@include ../../build/contract_Writer.texi
@item Example implementation
@uref{https://git.grassecon.net/cicnet/erc20-demurrage-token.git}
@end table

View File

@@ -1 +1 @@
include *requirements.txt
include *requirements.txt solidity/* LICENSE README* cic_contracts/unittest/solidity/*

17
python/Makefile Normal file
View File

@@ -0,0 +1,17 @@
INPUTS = $(wildcard cic_contracts/unittest/solidity/*.sol)
OUTPUTS = $(patsubst %.sol, %.bin, $(INPUTS))
all: outs package
.SUFFIXES: .sol .bin
solidity:
.sol.bin:
solc $(basename $@).sol --evm-version=byzantium --bin | awk 'NR>3' > $@
truncate -s -1 $@
outs: $(OUTPUTS)
package:
python setup.py sdist

741
python/README.md Normal file
View File

@@ -0,0 +1,741 @@
# Smart contract interfaces
## Technology
CIC smart contracts are implemented using the *solidity* programming
language for the (Ethereum Virtual Machine (EVM).
## Adopted standards
### Signing
### ERC - Direct use
The following well-known solidity interfaces are used directly.
- [ERC20 - Token Standard](https://eips.ethereum.org/EIPS/eip-20)
- [ERC165 - Standard Interface
Detection](https://eips.ethereum.org/EIPS/eip-165)
- [ERC173 - Contract Ownership
Standard](https://eips.ethereum.org/EIPS/eip-173)
- [ERC191 - Signed Data
Standard](https://eips.ethereum.org/EIPS/eip-191)
- [ERC712 - Typed structured data hashing and
signing](https://eips.ethereum.org/EIPS/eip-712)
- [ERC721 - Non-Fungible Token
Standard](https://eips.ethereum.org/EIPS/eip-721)
- [ERC5007 - Time NFT (EIP-721 Time
Extension)](https://eips.ethereum.org/EIPS/eip-5007)
- [ERC5192 - Minimal Soulbound
NFTs](https://eips.ethereum.org/EIPS/eip-5192)
### ERCs Partial use
The following well-known solidity interfaces are partially implemented
in CIC native interfaces.
- [ERC5679 - Token Minting and
Burning](https://eips.ethereum.org/EIPS/eip-5679) (See `Minter`,
`Burner`)
## Native interfaces
### Accounts Index
Append-only list of addresses. Typically used for access control lists.
Addresses may be *added*, *removed*, aswell as *deactivated* and
*activated*. Deactivated accounts still count towards the `entryCount`.
The `entry` method is used to iterate the account list. The order of
which accounts are returned is not guaranteed. Any returned value
matching `address(0x00)` should be skipped, and not counted towards
`entryCount`.
May optionally record time when account was added.
ERC165 Interface identifier
b7bca625
Solidity interface definition
interface IAccountsIndex {
// Address added to store, index in array.
event AddressAdded(uint256 indexed _idx, address _account);
// Return number of entries in index.
function entryCount() external view returns (uint256);
// Return entry at the spceificed index.
// Will revert if index is beyond array length.
// An entry result of 0 means the entry should be skipped, and not count towards entry count.
function entry(uint256) external view returns (address);
// Add an entry to the index. Incresases the entry count.
function add(address) external returns (bool);
// Verify that the entry exists in the index.
function have(address) external view returns (bool);
// Retrieve the timestamp when account was added.
// If time is not being tracked, a value of 0 should be returned.
function time(address) external view returns (uint256);
}
Reference implementation
<git://holbrook.no/eth-accounts-index.git> (v0.5.1)
### Accounts Index Mutable
Extends the functionality of `Accounts Index` to allow changes to the
address list.
Addresses may be *added*, *removed*, aswell as *deactivated* and
*activated*. Deactivated accounts still count towards the `entryCount`.
ERC165 Interface identifier
9479f0ae
Solidity interface definition
interface IAccountsIndexMutable {
// Active status of address changed, and by whom changed.
event AddressActive(address indexed _account, bool _active);
// Address removed from store, and by whom removed.
event AddressRemoved(address _account);
// Remove an entry from the index. Reduces the entry count.
function remove(address) external returns (bool);
// Deactivate account but keep in index. Does not affect entry count.
function deactivate(address) external returns (bool);
// Activate previously deactivated account. Does not affect entry count.
function activate(address) external returns (bool);
// Check if account exists and is active;
function isActive(address) external view returns (bool);
}
Reference implementation
<git://holbrook.no/eth-accounts-index.git> (v0.5.1)
### Burner
Attached to `ERC20` and `ERC721` tokens that may be *burned*.
Implements the `burn(...)` part of `ERC5679` for interoperability.
ERC165 Interface identifier
bc4babdd
Solidity interface definition
interface IBurner {
// Token(s) successfully burned; by who and how much.
event Burn(address indexed _burner, uint256 _burned);
// Satisfies ERC 5679
function burn(address _from, uint256 _amount, bytes calldata _data) external;
// Burn given amount of tokens held by signer.
function burn(uint256 _burn) external returns (bool);
// Burn all tokens held by signer.
function burn() external returns (bool);
// Total amount of tokens that have been burned.
function totalBurned() external returns (uint256);
// Total amount of tokens ever minted.
// If totalSupply() is available (ERC20, ERC721 Enumerable), this equals totalSupply() + totalBurned().
function totalMinted() external returns (uint256);
}
Example implementation
<https://git.grassecon.net/cicnet/erc20-demurrage-token.git>
### Chrono
Define a creation time for a resource.
Complements `ERC5007`.
ERC165 Interface identifier
4db1ccd4
Solidity interface definition
interface IChrono {
// Returns the timestamp of when a resource corresponding to _idx was first created.
// int64 chosen as return value for simpler interoperability with ERC5007.
function createTime(uint256 _idx) external returns(int64);
}
Example implementation
<https://git.defalsify.org/eth-erc721> (BadgeToken contract)
### Declarator
Permissionless store of signed claims made by an address about other
addresses, or addresses about themselves.
It is used to declare or respond to certifications of vouchers, NFT,
voucher members.
Addresses may be Externally Owned Accounts or smart contracts.
Claims may be made with or without topics. A missing topic is synonymous
with a topic value of `bytes32(0x00)`.
Any number of claims can be made about an address under any number of
topics. All claims must be stored, and returned in the order which they
were added.
ERC165 Interface identifier
21b7493b
Solidity interface definition
interface IDeclarator {
event DeclarationAdded(address indexed _declarator, address indexed _subject, bytes32 indexed _topic, bytes32 _proof);
// Get all declarations for a subject (without topic) signed by a declarator
function declaration(address _declarator, address _subject) external view returns ( bytes32[] memory );
// Get all declarations for a subject for the given topic signed by a declarator
function declaration(address _declarator, address _subject, bytes32 _topic) external view returns ( bytes32[] memory );
// Get number of declarations the declarator has ever signed
function declarationCount(address _declarator) external view returns ( uint256 );
// Get the subject of a declarator's declarations at the specific index
function declarationAddressAt(address _declarator, uint256 _idx) external view returns ( address );
// Add a declaration for the subject
function addDeclaration(address _subject, bytes32 _proof) external returns ( bool );
// Add a declaration with topic for the subject
function addDeclaration(address _subject, bytes32 _proof, bytes32 _topic) external returns ( bool );
// Get the declarator that signed a declaration at the specificed index for a subject
function declaratorAddressAt(address _subject, uint256 _idx) external view returns ( address );
// Get the number of declarators that have signed for a subject
function declaratorCount(address _subject) external view returns ( uint256 );
}
Reference implementation
<git://holbrook.no/eth-address-index.git>
### Digest
Allows encoding of digests according to a specific encoding scheme.
Primary use-case is the abstraction of self-describing
[Multhash](https://multiformats.io/multihash/) encoding.
A default encoding *must* always be defined, and the encoding of a valid
digest *must* succeed with the default encoding.
ERC165 Interface identifier
982ab05d
Solidity interface definition
interface IDigest {
// Returns the default digest encoding used by the contract instance.
function defaultDigestEncoding() external view returns (uint256 _encoding);
// Check if the given encoding has been implemented in the contract instance.
function haveDigestEncoding(uint256 _codec) external view returns(bool);
// Verify and encode the given digest for a specific hashing algorithm.
// Returns a zero-length byte array if digest is invalid.
// Must succeed if called with the defaultDigestEncoding and a valid digest.
function encodeDigest(bytes memory _data, uint256 _encoding) external view returns (bytes memory);
// Encodes the digest using the default digest encoding.
// Returns a zero-length byte array if digest is invalid.
// Must succeed with a valid digest.
function encodeDigest(bytes memory _data) external view returns (bytes memory);
}
Example implementation
<git://holbrook.no/eth-event-msg.git>
### Expire
Defines an expiry time after which token balances or supply *cannot
change*.
A contract defining an expiry *must not* allow changing the expiration
time to a time in the past.
ERC165 Interface identifier
841a0e94
Solidity interface definition
interface IExpire {
// Contract has expired.
event Expired(uint256 _timestamp);
// Expiry time has changed.
event ExpiryChange(uint256 indexed _oldTimestamp, uint256 _newTimestamp);
// The current expiration timestamp.
function expires() external returns (uint256);
// Check expiry and apply expiration if expired.
// Return values must be:
// 0: not yet expired.
// 1: already expired.
// >1: expiry executed.
function applyExpiry() external returns(uint8);
}
Example implementation
<https://git.grassecon.net/cicnet/erc20-demurrage-token.git>
### Faucet
Used for dispensing tokens to any address.
It can be used for gas tokens and *ERC20* alike.
The interface is the same whether the faucet is dispensing from existing
balance or minting new tokens.
The value dispersed *must* be the same for all addresses.
In general, four criteria are expected to exist in any combination for
limiting access to the faucet:
Time
A recipient may only use the faucet again after some time has passed.
Balance threshold
A recipient may only use the faucet after its balance is below a certain
amount.
Membership
A recipient may only use the faucet if it has been added to an access
control list.
Capacity
The contract has sufficient token funds to dispense the current defined
amount to dispense.
The *check(address)* contract call *must* evaluate all four criteria,
and *must* return `false` if any of the criteria are not met.
ERC165 Interface identifier
1a3ac634
Solidity interface definition
interface IFaucet {
// Tokens were given to an address
event Give(address indexed _recipient, address indexed _token, uint256 _value);
// The amount that the faucet disperses has changed
event FaucetAmountChange(uint256 _value);
// Address of token the faucet represents
// The faucet will return gas tokens with the zero-address is returned.
function token() external returns (address);
// Amount of tokens the faucet gives out
function tokenAmount() external returns (uint256);
// Give tokens to the given recipient. Returns amount of tokens given.
function giveTo(address _recipient) external returns (uint256);
// Give tokens to yourself. Returns amount of tokens given.
function gimme() external returns (uint256);
// Check if faucet may be used in the current contract state by _recipient
function check(address _recipient) external view returns (bool);
// Returns timestamp when faucet may be used again by _recipient
// If 0 is returned, the address has not yet been used.
// A return value of max(uint256) indicates that the faucet may not be used again.
function nextTime(address _recipient) external returns (uint256);
// Returns the token balance under which faucet may be used again by _recipient
// A return value of max(uint256) indicates that the faucet may be used regardless
// of the token balance of _recipient
function nextBalance(address _recipient) external returns (uint256);
}
Reference implementations
- <git://holbrook.no/erc20-faucet.git>
- <git://holbrook.no/eth-faucet.git>
### Locator
This interface supports `ERC721 Metadata`, in particular the
`tokenURI(uint256)` call.
Off-chain resources in the CIC network *must* be defined in terms of
content addressed strings.
It *must* be possible to refer to all off-chain resources directly by
the content address.
Furthermore, it *should* be possible to refer to a resource by a
fully-qualified location on the web or an overlay network (e.g. tor).
ERC165 Interface identifier
ed75b333
Solidity interface definition
interface ILocator {
// URI that may or may not point to a specific resource location.
function toURI(bytes memory _data) external view returns (string memory);
// URL pointing to a specific resource location.
function toURL(bytes memory _data) external view returns(string memory);
}
Example implementation
<git://holbrook.no/eth-event-msg.git>
#### Expressing locators in terms of numetic token id
Given the numeric token id `1234567890987654321` (`0x112210f4b16c1cb1`
hex), and a base url `https://contentgateway.grassecon.net`, the result
of the methods may be as follows:
`toURI(toHex(1234567890987654321))`
-\>
`https://contentgateway.grassecon.net/000000000000000000000000000000000000000000000000112210f4b16c1cb1`
`toURL(toHex(1234567890987654321))`
-\>
`https://contentgateway.grassecon.net/000000000000000000000000000000000000000000000000112210f4b16c1cb1`
`tokenURI(1234567890987654321)`
-\>
`https://contentgateway.grassecon.net/000000000000000000000000000000000000000000000000112210f4b16c1cb1`
#### Expressing locators in terms of a digest
Given the data `foo`, the digest algorithm `sha256` and a base url
`https://contentgateway.grassecon.net`, the result of the methods may be
as follows:
`toURI(sha256(foo))`
-\>
`"sha256:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"`
`toURL(sha256(foo))`
-\>
`"https://contentgateway.grassecon.net/2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"`
`tokenURI(toUint(sha256(foo)))`
-\>
`"https://contentgateway.grassecon.net/2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"`
#### Locator without URL
Given the data `foo`, the digest algorithm `sha256` and no base url, the
result of the methods may be as follows:
`toURI(sha256(foo))`
-\>
`"sha256:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"`
`toURL(sha256(foo))`
-\> `""`
`tokenURI(toUint(sha256(foo)))`
-\>
`"sha256:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"`
### Minter
Attached to `ERC20` and `ERC721` tokens that may be minted.
Implements the `mint(...)` and `safeMint(...)` parts of `ERC5679` for
interoperability.
ERC165 Interface identifier
5878bcf4
Solidity interface definition
interface IMinter {
// Tokens are successfully minted; by who, to whom and how much
event Mint(address indexed _minter, address indexed _beneficiary, uint256 value);
// Mint the specified value of tokens to the specified recipient
function mintTo(address _beneficiary, uint256 value) external returns (bool);
// Satisfies ERC5679 for ERC20
function mint(address _beneficiary, uint256 value, bytes calldata _data) external;
// Satisfies ERC5679 for ERC721
function safeMint(address _beneficiary, uint256 value, bytes calldata _data) external;
}
Example implementation
<https://git.grassecon.net/cicnet/erc20-demurrage-token.git>
### Msg
Enables a reference "message" to describe the contract using an
off-chain resource.
The reference may or may not be mutable.
The interface complements `Locator` and `MultiHash` to generate locators
for how to resolve the reference.
ERC165 Interface identifier
a3002595
Solidity interface definition
interface IMsg {
// Emitted when a new message digest has been set
// Should not be emitted if the digest set is identical to the previous
event Msg(bytes _msgDigest);
// Get the current message content hash
function getMsg() external view returns(bytes memory);
}
Example implementation
<git://holbrook.no/eth-event-msg.git>
### Registry
The Registry interface is a key-value store resolving well-known
contract identifier names to contract addresses.
It currently has two distinct uses in the CIC context:
1. Entry-point to discover all relevant contracts of CIC networks.
2. Unique (ERC20) token symbol resolver.
ERC165 Interface identifier
effbf671
Solidity interface definition
interface IRegistryClient {
// Address added to store with the given key
event AddressKey(bytes32 indexed _key, address _address);
// Return the address of the contract identified by the given byte string
function addressOf(bytes32) external view returns (address);
// Indexed accessor for the full list of registred identifiers
function identifier(uint256) external view returns (bytes32);
// Number of registered interfaces
function identifierCount() external view returns (uint256);
}
Contract registry implementation
<git://holbrook.no/eth-contract-registry.git>
Token index implementation
<git://holbrook.no/eth-contract-registry.git>
### Seal
Some smart contract parameters may need to be mutable over part of a
smart contracts lifetime.
This interface provides a method to explicitly signal when certain
parameters have been rendered immutable.
The value of `sealState()` *must not* decrease, and must not exceed
`maxSealState`.
`maxSealState` is used to define that *all mutable parameters* have been
rendered immutable. The practical implications of this will vary between
contracts.
The implementer is encouraged to use simple, descriptive names in the
source code to describe the applicable seal states.
Use cases of sealing include:
- Whether more tokens can be minted
- Allow ownership of a contract to be transferred
- The expiry time of a token (see `Expire`)
ERC165 Interface identifier
0d7491f8
Solidity interface definition
interface ISeal {
// Seal state has changed.
event SealStateChange(bool indexed _final, uint256 _sealState);
// The current seal state.
function sealState() external view returns(uint256);
// The numeric seal state in everything sealable has been sealed.
function maxSealState() external view returns(uint256);
}
Example implementation
<https://git.grassecon.net/cicnet/erc20-demurrage-token.git>
### TokenVend
This interface defines the mechanism for which a specific ERC20 token
may be exchanged for a different ERC20 token.
A typical use-case is generation of voting tokens based on a momentary
voucher balance. This is especially useful if the original ERC20 token
is subject to decay (demurrage).
The tokens used for exchange **SHOULD** be locked for the full duration
of holding the vended tokens.
The withdrawal function may or may not allow partial withdrawals.
ERC165 Interface identifier
8a13249c
Solidity interface definition
interface ITokenVend {
// A new vended token has been created.
event TokenCreated(uint256 indexed _tokenIdx, uint256 indexed _supply, address _token);
// Create corresponding vended tokens for the control token balance of the caller.
function getFor(address _token) external returns (uint256);
// Recover control tokens that were used to retrieve the corresponding vended tokens.
function withdrawFor(address _token) external returns (uint256);
}
Reference implementations
- <git://holbrook.no/erc20-vend.git>
### TokenVote
Execute elections with granular ERC20 token votes.
A proposal submitted for vote may or may not contain multiple options.
If multiple options are available, an ERC20 token holder may distribute
its vote among the options with the granularity of the token balance.
Voted tokens **SHOULD** be locked until the voting has finalized.
Finalization of voting should be callable by anyone.
ERC165 Interface identifier
28091366
Solidity interface definition
interface ITokenVote {
// A new proposal has been created.
event ProposalAdded(uint256 indexed _blockDeadline, uint256 indexed voteTargetPpm, uint256 indexed _proposalIdx);
// A proposal vote has been completed.
// The proposal is identified by the serial number in _proposalIdx. It is up to the implementer to define how the proposal should be retrieved by index.
// The proposal result may be in one of three states:
// * Ratified (_cancelled == false, _insufficient == false)
// * Cancelled (_cancelled == true, _insufficient == false)
// * Not reached quorum (_cancelled == false, _insufficient == true)
event ProposalCompleted(uint256 indexed _proposalIdx, bool indexed _cancelled, bool indexed _insufficient, uint256 _totalVote);
// Propose a new vote.
// Voting is active until one of:
// * total cancel vote reach quorum (_targetVotePpm, ppm = parts-per-million).
// * _blockWait blocks from now.
function propose(bytes32 _description, uint256 _blockWait, uint24 _targetVotePpm) external returns (uint256);
// Same as propose(...), but provide options to vote on.
function proposeMulti(bytes32 _description, bytes32[] memory _options, uint256 _blockWait, uint24 _targetVotePpm) external returns (uint256);
// Get number of options available for the proposal.
// This decides the boundary of the index that can be used with voteOptions(...)
// If the result is 0, vote(...) can be used aswell.
function optionCount(uint256 _proposalIdx) external view returns(uint256);
// Get proposal option. Assumes that proposal was created with proposeMulti(...)
function getOption(uint256 _proposalIdx, uint256 _optionIdx) external view returns (bytes32);
// Get vote count for the given option.
// If proposal has no options, it should be called with _optionIdx = 0
function voteCount(uint256 _proposalIdx, uint256 _optionIdx) external view returns(uint256);
// Vote on a proposal without options.
// Assumes that proposal was created with propose(...) and will fail otherwise.
function vote(uint256 _value) external returns (bool);
// Vote on a proposal option. Assumes that proposal was created with proposeMulti(...).
// Must work with a non-option proposal if _optionIndex is 0.
function voteOption(uint256 _optionIndex, uint256 _value) external returns (bool);
// Vote to cancel a proposal.
// If cancel has the majority:
// * A vote without options will have rejected the proposal description.
// * A vote with options will have rejected the proposal description as well as all option descriptions.
function voteCancel(uint256 _value) external returns (bool);
// Finalize the vote for a proposal.
// May be called if deadline has been passed, or if:
// * quorum has been reached with cancel votes.
// * quorum has been reached and proposal has no/only one option.
function finalize() external returns (bool);
}
Reference implementations
- <git://holbrook.no/evm-tokenvote.git>
### Writer
A complement to ERC173, which allows definition of a class of
super-users for a contract.
A super-user address may perform *more* actions than a "normal" address,
aswell as *some* actions normally limited to the *contract owner*.
If an *contract owner* is defined, No super-user should be able to
perform actions that *contract owner* cannot perform.
Typically, only the *contract owner*, if it is defined, can add or
remove a super-user.
Some use-case examples of super-user actions include:
- Mint new tokens.
- Change the amount dispensed by the faucet.
- Edit access control lists.
ERC165 Interface identifier
abe1f1f5
Solidity interface definition
interface IWriter {
// A writer has been added by _executor
event WriterAdded(address _writer);
// A writer has been removed by _executor
event WriterDeleted(address _writer);
// Add a new writer to the contract.
function addWriter(address _writer) external returns (bool);
// Remove existing writer from the contract.
function deleteWriter(address _writer) external returns (bool);
// Check whether the given address is a writer.
function isWriter(address _writer) external view returns (bool);
}
Example implementation
<https://git.grassecon.net/cicnet/erc20-demurrage-token.git>

View File

@@ -0,0 +1,8 @@
# local imports
from cic_contracts.search import search
from cic_contracts.names import Name
erc165_for = search
def abi(v):
return search(v, ext='json')

View File

@@ -0,0 +1 @@
b7bca625

View File

@@ -0,0 +1 @@
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_idx","type":"uint256"},{"indexed":false,"internalType":"address","name":"_account","type":"address"}],"name":"AddressAdded","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"add","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"entry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"entryCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"have","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"time","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

View File

@@ -0,0 +1 @@
9479f0ae

View File

@@ -0,0 +1 @@
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":false,"internalType":"bool","name":"_active","type":"bool"}],"name":"AddressActive","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_account","type":"address"}],"name":"AddressRemoved","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"activate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"deactivate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"remove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

View File

@@ -0,0 +1 @@
b1110c1b

View File

@@ -0,0 +1 @@
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_burned","type":"uint256"}],"name":"Burn","type":"event"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]

View File

@@ -0,0 +1 @@
869f7594

View File

@@ -0,0 +1 @@
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]

View File

@@ -0,0 +1 @@
4db1ccd4

View File

@@ -0,0 +1 @@
[{"inputs":[{"internalType":"uint256","name":"_idx","type":"uint256"}],"name":"createTime","outputs":[{"internalType":"int64","name":"","type":"int64"}],"stateMutability":"nonpayable","type":"function"}]

View File

@@ -0,0 +1 @@
21b7493b

View File

@@ -0,0 +1 @@
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_declarator","type":"address"},{"indexed":true,"internalType":"address","name":"_subject","type":"address"},{"indexed":true,"internalType":"bytes32","name":"_topic","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"_proof","type":"bytes32"}],"name":"DeclarationAdded","type":"event"},{"inputs":[{"internalType":"address","name":"_subject","type":"address"},{"internalType":"bytes32","name":"_proof","type":"bytes32"},{"internalType":"bytes32","name":"_topic","type":"bytes32"}],"name":"addDeclaration","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_subject","type":"address"},{"internalType":"bytes32","name":"_proof","type":"bytes32"}],"name":"addDeclaration","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_declarator","type":"address"},{"internalType":"address","name":"_subject","type":"address"}],"name":"declaration","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_declarator","type":"address"},{"internalType":"address","name":"_subject","type":"address"},{"internalType":"bytes32","name":"_topic","type":"bytes32"}],"name":"declaration","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_declarator","type":"address"},{"internalType":"uint256","name":"_idx","type":"uint256"}],"name":"declarationAddressAt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_declarator","type":"address"}],"name":"declarationCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_subject","type":"address"},{"internalType":"uint256","name":"_idx","type":"uint256"}],"name":"declaratorAddressAt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_subject","type":"address"}],"name":"declaratorCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

View File

@@ -0,0 +1 @@
982ab05d

View File

@@ -0,0 +1 @@
[{"inputs":[],"name":"defaultDigestEncoding","outputs":[{"internalType":"uint256","name":"_encoding","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"encodeDigest","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"uint256","name":"_encoding","type":"uint256"}],"name":"encodeDigest","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_codec","type":"uint256"}],"name":"haveDigestEncoding","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

View File

@@ -0,0 +1 @@
01ffc9a7

View File

@@ -0,0 +1 @@
[{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}]

View File

@@ -0,0 +1 @@
9493f8b2

View File

@@ -0,0 +1 @@
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

View File

@@ -0,0 +1 @@
b61bc941

View File

@@ -0,0 +1 @@
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

View File

@@ -0,0 +1 @@
7a0cdf92

View File

@@ -0,0 +1 @@
[{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"endTime","outputs":[{"internalType":"int64","name":"","type":"int64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"startTime","outputs":[{"internalType":"int64","name":"","type":"int64"}],"stateMutability":"view","type":"function"}]

View File

@@ -0,0 +1 @@
b45a3c0e

View File

@@ -0,0 +1 @@
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Unlocked","type":"event"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

View File

@@ -0,0 +1 @@
d0017968

View File

@@ -0,0 +1 @@
[{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"}]

View File

@@ -0,0 +1 @@
cce39764

View File

@@ -0,0 +1 @@
[{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"}]

View File

@@ -0,0 +1 @@
c22876c3

View File

@@ -0,0 +1 @@
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"}]

View File

@@ -0,0 +1 @@
dd9d2087

View File

@@ -0,0 +1 @@
[{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

View File

@@ -0,0 +1 @@
d283ef1d

View File

@@ -0,0 +1 @@
[{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

View File

@@ -0,0 +1 @@
150b7a02

View File

@@ -0,0 +1 @@
[{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"}]

View File

@@ -0,0 +1 @@
841a0e94

View File

@@ -0,0 +1 @@
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newTimestamp","type":"uint256"}],"name":"ExpiryChange","type":"event"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]

View File

@@ -0,0 +1 @@
1a3ac634

View File

@@ -0,0 +1 @@
[{"anonymous":false,"inputs":[{"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":"Give","type":"event"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"check","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gimme","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"giveTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"nextBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"nextTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]

View File

@@ -0,0 +1 @@
ed75b333

View File

@@ -0,0 +1 @@
[{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

View File

@@ -0,0 +1 @@
5878bcf4

View File

@@ -0,0 +1 @@
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Mint","type":"event"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"}]

View File

@@ -0,0 +1 @@
a3002595

View File

@@ -0,0 +1 @@
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"_msgDigest","type":"bytes"}],"name":"Msg","type":"event"},{"inputs":[],"name":"getMsg","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"}]

View File

@@ -0,0 +1 @@
cd8391b0

View File

@@ -0,0 +1 @@
[{"inputs":[{"internalType":"uint256","name":"_codec","type":"uint256"}],"name":"digestCodec","outputs":[{"components":[{"internalType":"uint8","name":"l","type":"uint8"},{"internalType":"uint8","name":"codecRLength","type":"uint8"},{"internalType":"uint8","name":"prefixRLength","type":"uint8"},{"internalType":"bytes16","name":"prefix","type":"bytes16"},{"internalType":"bytes8","name":"codec","type":"bytes8"}],"internalType":"struct IMultiHash.MultiHash","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_codec","type":"uint256"},{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"encodeDigest","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_codec","type":"uint256"}],"name":"haveDigestEncoding","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

View File

@@ -0,0 +1 @@
52e86958

View File

@@ -0,0 +1 @@
[{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"executeOfflineRequest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"isOfflineValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"verifyOfflineRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

View File

@@ -0,0 +1 @@
37a47be4

View File

@@ -0,0 +1 @@
[{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

View File

@@ -0,0 +1 @@
6b578339

View File

@@ -0,0 +1 @@
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_result","type":"address"}],"name":"OwnershipTaken","type":"event"},{"inputs":[{"internalType":"address","name":"_target","type":"address"}],"name":"takeOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

View File

@@ -0,0 +1 @@
d719b0cc

View File

@@ -0,0 +1 @@
[{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"bind","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"name":"set","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

View File

@@ -0,0 +1 @@
effbf671

View File

@@ -0,0 +1 @@
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_key","type":"bytes32"},{"indexed":false,"internalType":"address","name":"_address","type":"address"}],"name":"AddressKey","type":"event"},{"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":"identifier","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"identifierCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

View File

@@ -0,0 +1 @@
0d7491f8

View File

@@ -0,0 +1 @@
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

View File

@@ -0,0 +1 @@
8a13249c

View File

@@ -0,0 +1 @@
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_tokenIdx","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_supply","type":"uint256"},{"indexed":false,"internalType":"address","name":"_token","type":"address"}],"name":"TokenCreated","type":"event"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"withdrawFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]

View File

@@ -0,0 +1 @@
ac3142f7

View File

@@ -0,0 +1 @@
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_blockDeadline","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"voteTargetPpm","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_proposalIdx","type":"uint256"}],"name":"ProposalAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_proposalIdx","type":"uint256"},{"indexed":true,"internalType":"bool","name":"_cancelled","type":"bool"},{"indexed":true,"internalType":"bool","name":"_insufficient","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_totalVote","type":"uint256"}],"name":"ProposalCompleted","type":"event"},{"inputs":[],"name":"finalize","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalIdx","type":"uint256"},{"internalType":"uint256","name":"_optionIdx","type":"uint256"}],"name":"getOption","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalIdx","type":"uint256"}],"name":"optionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_description","type":"bytes32"},{"internalType":"uint256","name":"_blockWait","type":"uint256"},{"internalType":"uint24","name":"_targetVotePpm","type":"uint24"}],"name":"propose","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_description","type":"bytes32"},{"internalType":"bytes32[]","name":"_options","type":"bytes32[]"},{"internalType":"uint256","name":"_blockWait","type":"uint256"},{"internalType":"uint24","name":"_targetVotePpm","type":"uint24"}],"name":"proposeMulti","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"vote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"voteCancel","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalIdx","type":"uint256"},{"internalType":"uint256","name":"_optionIdx","type":"uint256"}],"name":"voteCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_optionIndex","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"voteOption","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

View File

@@ -0,0 +1 @@
abe1f1f5

View File

@@ -0,0 +1 @@
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_writer","type":"address"}],"name":"WriterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_writer","type":"address"}],"name":"WriterDeleted","type":"event"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"deleteWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

View File

@@ -0,0 +1,4 @@
# standard imports
import os
data_dir = os.path.dirname(os.path.realpath(__file__))

View File

@@ -0,0 +1,10 @@
# standard imports
import enum
class Name(enum.Enum):
WRITER = "Writer"
EXPIRE = "Expire"
SEAL = "Seal"
CAPPED = "Capped"
MINTER = "Minter"
BURNER = "Burner"

View File

@@ -0,0 +1,16 @@
# standard imports
import os
# local imports
from cic_contracts.data import data_dir
from cic_contracts.names import Name
def search(v, ext='interface', search_dir=data_dir):
if isinstance(v, Name):
v = v.value
fp = os.path.join(search_dir, v + '.' + ext)
f = open(fp, 'r')
r = f.read()
f.close()
return r.rstrip()

View File

@@ -0,0 +1,17 @@
# standard imports
import os
# local imports
from cic_contracts.search import search
from cic_contracts import Name
cic_unittest_dir = os.path.dirname(os.path.realpath(__file__))
contracts_dir = os.path.join(cic_unittest_dir, 'solidity')
def bytecode(v):
if isinstance(v, Name):
v = v.value
return search(v + 'Test', ext='bin', search_dir=contracts_dir)

View File

@@ -0,0 +1,22 @@
# external imports
from hexathon import strip_0x
from hexathon import same as same_hex
from chainlib.eth.nonce import RPCNonceOracle
from chainlib.eth.address import to_checksum_address
from eth_owned import Owned
class TestInterface:
def __owned_check(self):
self.owner == to_checksum_address(self.owner)
def test_owner(self):
self.__owned_check()
c = Owned(self.chain_spec)
o = c.owner(self.address, sender_address=self.accounts[0])
r = self.rpc.do(o)
owner_address = c.parse_owner(r)
self.assertTrue(same_hex(self.owner, owner_address))

View File

@@ -0,0 +1 @@
608060405234801561001057600080fd5b5060405161070438038061070483398181016040528101906100329190610081565b8060008190555080600281905550506100ae565b600080fd5b6000819050919050565b61005e8161004b565b811461006957600080fd5b50565b60008151905061007b81610055565b92915050565b60006020828403121561009757610096610046565b5b60006100a58482850161006c565b91505092915050565b610647806100bd6000396000f3fe608060405234801561001057600080fd5b506004361061007f576000357c01000000000000000000000000000000000000000000000000000000009004806301ffc9a71461008457806342966c68146100b457806344d17187146100e457806344df8e7014610100578063a2309ff81461011e578063d89135cd1461013c575b600080fd5b61009e60048036038101906100999190610353565b61015a565b6040516100ab919061039b565b60405180910390f35b6100ce60048036038101906100c991906103ec565b61020a565b6040516100db919061039b565b60405180910390f35b6100fe60048036038101906100f991906104dc565b61021f565b005b61010861022f565b604051610115919061055f565b60405180910390f35b610126610241565b604051610133919061055f565b60405180910390f35b610144610247565b604051610151919061055f565b60405180910390f35b60006301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036101ae5760019050610205565b63bc4babdd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036102005760019050610205565b600090505b919050565b60006102158261024d565b5060019050919050565b6102288361020a565b5050505050565b600061023c60005461024d565b905090565b60005481565b60015481565b6000808260025461025e91906105a9565b101561026957600080fd5b816001600082825461027b91906105dd565b92505081905550816002600082825461029491906105a9565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516102e1919061055f565b60405180910390a2819050919050565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b610330816102fb565b811461033b57600080fd5b50565b60008135905061034d81610327565b92915050565b600060208284031215610369576103686102f1565b5b60006103778482850161033e565b91505092915050565b60008115159050919050565b61039581610380565b82525050565b60006020820190506103b0600083018461038c565b92915050565b6000819050919050565b6103c9816103b6565b81146103d457600080fd5b50565b6000813590506103e6816103c0565b92915050565b600060208284031215610402576104016102f1565b5b6000610410848285016103d7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061044482610419565b9050919050565b61045481610439565b811461045f57600080fd5b50565b6000813590506104718161044b565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261049c5761049b610477565b5b8235905067ffffffffffffffff8111156104b9576104b861047c565b5b6020830191508360018202830111156104d5576104d4610481565b5b9250929050565b600080600080606085870312156104f6576104f56102f1565b5b600061050487828801610462565b9450506020610515878288016103d7565b935050604085013567ffffffffffffffff811115610536576105356102f6565b5b61054287828801610486565b925092505092959194509250565b610559816103b6565b82525050565b60006020820190506105746000830184610550565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006105b4826103b6565b91506105bf836103b6565b92508282039050818111156105d7576105d661057a565b5b92915050565b60006105e8826103b6565b91506105f3836103b6565b925082820190508082111561060b5761060a61057a565b5b9291505056fea26469706673582212208cc8e912e94a09c49f6772a6a0bfcea389d65478dcee0b3e12fa669028b5567e64736f6c63430008130033

View File

@@ -0,0 +1,50 @@
pragma solidity >=0.6.3;
// Author: Louis Holbrook <dev@holbrook.no> 0826EDA1702D1E87C6E2875121D2E7BB88C2A746
// SPDX-License-Identifier: AGPL-3.0-or-later
contract MinterTest {
uint256 public totalMinted;
uint256 public totalBurned;
uint256 balance;
event Burn(address indexed _burner, uint256 _burned);
constructor(uint256 _mintValue) {
totalMinted = _mintValue;
balance = _mintValue;
}
function burn(address _from, uint256 _value, bytes calldata _data) public {
_from;
_data;
burn(_value);
}
function burn(uint256 _value) public returns (bool) {
burnCore(_value);
return true;
}
function burnCore(uint256 _value) internal returns(uint256) {
require(balance - _value >= 0);
totalBurned += _value;
balance -= _value;
emit Burn(msg.sender, _value);
return _value;
}
function burn() public returns (uint256) {
return burnCore(totalMinted);
}
function supportsInterface(bytes4 _sum) public pure returns (bool) {
if (_sum == 0x01ffc9a7) { // EIP165
return true;
}
if (_sum == 0xbc4babdd) { // Burner
return true;
}
return false;
}
}

View File

@@ -0,0 +1 @@
608060405234801561001057600080fd5b506040516104003803806104008339818101604052810190610032919061007a565b80600081905550506100a7565b600080fd5b6000819050919050565b61005781610044565b811461006257600080fd5b50565b6000815190506100748161004e565b92915050565b6000602082840312156100905761008f61003f565b5b600061009e84828501610065565b91505092915050565b61034a806100b66000396000f3fe608060405234801561001057600080fd5b506004361061005e576000357c01000000000000000000000000000000000000000000000000000000009004806301ffc9a7146100635780636f8b44b014610093578063d5abeb01146100af575b600080fd5b61007d60048036038101906100789190610224565b6100cd565b60405161008a919061026c565b60405180910390f35b6100ad60048036038101906100a891906102bd565b61017d565b005b6100b76101c1565b6040516100c491906102f9565b60405180910390f35b60006301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036101215760019050610178565b63869f75947c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036101735760019050610178565b600090505b919050565b6000547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe6826040516101af91906102f9565b60405180910390a28060008190555050565b60005481565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b610201816101cc565b811461020c57600080fd5b50565b60008135905061021e816101f8565b92915050565b60006020828403121561023a576102396101c7565b5b60006102488482850161020f565b91505092915050565b60008115159050919050565b61026681610251565b82525050565b6000602082019050610281600083018461025d565b92915050565b6000819050919050565b61029a81610287565b81146102a557600080fd5b50565b6000813590506102b781610291565b92915050565b6000602082840312156102d3576102d26101c7565b5b60006102e1848285016102a8565b91505092915050565b6102f381610287565b82525050565b600060208201905061030e60008301846102ea565b9291505056fea26469706673582212202fae6928974c7d7b0aa39737c7a191972db33126d9966e893091aac145fd34c864736f6c63430008130033

Some files were not shown because too many files have changed in this diff Show More