You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The following actions break down the construction of a Tokenized protocol message. The action is constructed by building a single string from each of the elements in order. Each field within the action is given a specific type, including standard types and compound types.
See the Transactions article for details on how to construct a complete transaction.
Allows the administration to tell the smart contract what they want the details (labels, data, T&C's, etc.) of the Contract to be on-chain in a public and immutable way. The Contract Offer action 'initializes' a generic smart contract that has been spun up by either the smart contract operator or the administration. This on-chain action allows for the positive response from the smart contract with either a Contract Formation Action or a Rejection Action.
Action Code
C1
Field
Type
Description
ContractName
varchar(tiny)
The name/title of the contract.
Example: Tesla - Shareholder Agreement
BodyOfAgreementType
uint(1)
0 - No Body of agreement included 1 - SHA-256 Hash 2 - Tokenized Body of Agreement Format where the agreement is specified with a separate C6/C7 action
Body of Agreement - Amendments can be restricted to a vote. Example: 1
BodyOfAgreement
varbin(medium)
SHA-256 hash of the body of the agreement (full contract in pdf format or the like) or the full agreement. If BodyOfAgreementType is 2 then this field is empty and the agreement is specified in a C6/C7 action. This is specific to the smart contract and relevant Instruments. Legal and technical information.
This field is only valid when the field BodyOfAgreementType equals 1.
(Deprecated)ContractType
deprecated
Deprecated for more specific type. Describes the purpose of the contract.
Example: Shareholder Agreement
Supporting documents that are important to the contract.
(Deprecated)GoverningLaw
deprecated
Deprecated to remove fixed size. 5 Letter Code to identify which governing law the contract will adhere to. Disputes are to be settled by this law in the jurisdiction specified below. Private dispute resolution organizations can be used as well. A custom code just needs to be defined.
Governing Legal System - Amendments can be restricted to a vote. Example: USA
(Deprecated)Jurisdiction
deprecated
Deprecated to remove fixed size. Legal proceedings/arbitration will take place using the specified Governing Law in this location.
Jurisdiction - Amendments can be restricted to a vote. Example: US-CA
All actions related to the contract will cease to work after this timestamp. The smart contract will stop running. This will allow many token use cases to be able to calculate total smart contract running costs for the entire life of the contract. Eg. an issuer is creating tickets for an event on the 5th of June 2018. The smart contract will facilitate exchange and send transactions up until the 6th of June. Wallets can use this to forget tokens that are no longer valid - or at least store them in an 'Expired' folder.
Contract Expiration - Amendments can be restricted to a vote.
ContractURI
varchar(tiny)
Points to an information page that also has a copy of the Contract. Anyone can go to the website to have a look at the price/token, information about the issuer (company), information about the instrument, legal information, etc. There will also be a way for token owners to vote on this page and contact details with the issuer/tokenized companies. Could be a IPv6/IPv4, or txn-id for on-chain information or even a public address (DNS).
Example: https://tokenized.com/Contract/3qeoSCg7JmfSnJesJFojj
If true, then the second input is a contract operator. If false, then all additional inputs are just funding and "includes" fields are skipped in serialization.
(Deprecated)ContractOperator
deprecated
Deprecated for operator entity contract address. An additional entity with operator access to the contract.
(Deprecated)AdminOracle
deprecated
The oracle that provided the signature used to verify the administration's identity and association with a parent contract if one is specified.
(Deprecated)AdminOracleSignature
deprecated
The ECDSA signature provided by the oracle specified. The first input must correspond to the administration entity and, if a contract operator is included, the second input must correspond to the contract operator entity.
(Deprecated)AdminOracleSigBlockHeight
deprecated
The block height of the block hash used in the oracle signature.
ContractFee
uint(8)
Satoshis required to be paid to the contract for each instrument action.
A set of permission objects containing switches and field references that define the permissions for modifying this contract. See the Permission documentation for more detail.
RestrictedQtyInstruments
uint(8)
Number of Instruments (non-fungible) permitted on this contract. 0 if unlimited which will display an infinity symbol in UI
Qty of Instruments - Amendments can be restricted to a vote. Example: 1
AdministrationProposal
bool
Set to true if the administration is permitted to make proposals outside of the smart contract scope.
General Governance Example: true
HolderProposal
bool
Set to true if a holder is permitted to make proposals outside of the smart contract scope.
Example: true
The address of the contract's master key. This key has the ability to change the active contract address in case of a security failure with the active contract key.
The address of the contract's parent entity. This is not valid for entity contracts, but required for instrument and service contracts to identify the entity parent contract.
This field is required when the field ContractType equals 1.
This field is only valid when the field ContractType equals 1.
5 Letter Code to identify which governing law the contract will adhere to. Disputes are to be settled by this law in the jurisdiction specified below. Private dispute resolution organizations can be used as well. A custom code just needs to be defined.
Governing Legal System - Amendments can be restricted to a vote. Example: USA
Legal proceedings/arbitration will take place using the specified Governing Law in this location.
Jurisdiction - Amendments can be restricted to a vote. Example: US-CA
Transaction Summary
Index
Input
Description
0
Administration's Public Address
The smart contract sets the administration's public address with whatever public address is in Index 0 of the first valid Contract Offer. From then on, the SC will only respond to 'commands' (request actions) from this address with respect to actions that are controlled by the administration according to the protocol.
1
Contract Operator's Public Address (Optional)
Can also be used as a cold storage backup for the issuer. This is important if the issuer wants to be able to change their address as changes to the issuer or operator pkh in an amendment require signatures from both the issuer and the operator pkhs. The one exception to this rule, the Contract Operator can nominate a secondary controlling public address that can act on behalf of the issuer for issuer related requests. Typically this will be the Smart Contract Operator.
Index
Output
Description
0
Contract Public Address
A contract address that has no other contract associated to it already.
Contract Formation
This txn is created by the contract (smart contract/off-chain agent/token contract) upon receipt of a valid Contract Offer Action from the administration. The smart contract will execute on a server controlled by the administration, or a smart contract operator on their behalf.
Action Code
C2
Field
Type
Description
ContractName
varchar(tiny)
The name/title of the contract.
Example: Tesla - Shareholder Agreement
BodyOfAgreementType
uint(1)
0 - No Body of agreement included 1 - SHA-256 Hash 2 - Tokenized Body of Agreement Format where the agreement is specified with a separate C6/C7 action
Body of Agreement - Amendments can be restricted to a vote. Example: 1
BodyOfAgreement
varbin(medium)
SHA-256 hash of the body of the agreement (full contract in pdf format or the like) or the full agreement. If BodyOfAgreementType is 2 then this field is empty and the agreement is specified in a C6/C7 action. This is specific to the smart contract and relevant Instruments. Legal and technical information.
This field is only valid when the field BodyOfAgreementType equals 1.
(Deprecated)ContractType
deprecated
Deprecated for more specific type. Describes the purpose of the contract.
Example: Shareholder Agreement
Supporting documents that are important to the contract.
(Deprecated)GoverningLaw
deprecated
Deprecated to remove fixed size. 5 Letter Code to identify which governing law the contract will adhere to. Disputes are to be settled by this law in the jurisdiction specified below. Private dispute resolution organizations can be used as well. A custom code just needs to be defined.
Governing Legal System - Amendments can be restricted to a vote. Example: USA
(Deprecated)Jurisdiction
deprecated
Deprecated to remove fixed size. Legal proceedings/arbitration will take place using the specified Governing Law in this location.
Jurisdiction - Amendments can be restricted to a vote. Example: US-CA
All actions related to the contract will cease to work after this timestamp. The smart contract will stop running. This will allow many token use cases to be able to calculate smart contract running costs. Eg. an issuer is creating tickets for an event on the 5th of June 2018. The smart contract will facilitate exchange and send transactions up until the 6th of June. Wallets can use this to forget tokens that are no longer valid - or at least store them in an 'Expired' folder.
Contract Expiration - Amendments can be restricted to a vote.
ContractURI
varchar(tiny)
Length 0-255 bytes. 0 is valid. Points to an information page that also has a copy of the Contract. Anyone can go to the website to have a look at the price/token, information about the Issuer (company), information about the Instrument, legal information, etc. There will also be a way for Token Owners to vote on this page and contact details with the Issuer/tokenized companies. Could be a IPv6/IPv4, an IPFS address (hash) or txn-id for on chain information or even a public address (DNS).
Example: https://tokenized.com/Contract/3qeoSCg7JmfSnJesJFojj
Deprecated for operator entity contract address. An additional entity with operator access to the contract.
(Deprecated)AdminOracle
deprecated
The oracle that provided the signature used to verify the administration's identity.
(Deprecated)AdminOracleSignature
deprecated
The ECDSA signature provided by the oracle specified. The first input must correspond to the administration entity and, if a contract operator is included, the second input must correspond to the contract operator entity.
(Deprecated)AdminOracleSigBlockHeight
deprecated
The block height of the block hash used in the oracle signature.
ContractFee
uint(8)
Satoshis required to be paid to the contract for each instrument action.
A set of permission objects containing switches and field references that define the permissions for modifying this contract. See the Permission documentation for more detail.
RestrictedQtyInstruments
uint(8)
Number of Instruments (non-fungible) permitted on this contract. 0 if unlimited which will display an infinity symbol in UI
Qty of Instruments - Amendments can be restricted to a vote. Example: 1
AdministrationProposal
bool
Set to true if the administration is permitted to make proposals outside of the smart contract scope.
General Governance Example: true
HolderProposal
bool
Set to true if a holder is permitted to make proposals outside of the smart contract scope.
Example: true
The address of the contract's master key. This key has the ability to change the active contract address in case of a security failure with the active contract key.
ContractRevision
uint(4)
A counter for the number of times this contract has been revised using an amendment action.
Can't be changed by the administration, operator. Smart contract controls. Example: 0
The address of the contract's parent entity. This is optional for entity contracts, but required for instrument and service contracts to identify the entity parent contract. This field is required when the field ContractType equals 1.
This field is only valid when the field ContractType equals 1.
The address of the contract's administrator. This is not contained in the contract offer payload, but determined by the inputs of the contract offer transaction and included here by the smart contract agent as a convenience.
The address of the contract's operator. This is not contained in the contract offer payload, but determined by the inputs of the contract offer transaction and included here by the smart contract agent as a convenience."
5 Letter Code to identify which governing law the contract will adhere to. Disputes are to be settled by this law in the jurisdiction specified below. Private dispute resolution organizations can be used as well. A custom code just needs to be defined.
Governing Legal System - Amendments can be restricted to a vote. Example: USA
Legal proceedings/arbitration will take place using the specified Governing Law in this location.
Jurisdiction - Amendments can be restricted to a vote. Example: US-CA
Transaction Summary
Index
Input
Description
0
Contract Public Address
The related contract address.
Index
Output
Description
0
Contract Public Address
Required so that users can monitor transactions to the contract for updates to contract/instruments.
Contract Amendment
The administration can initiate an amendment to the contract establishment metadata. The ability to make an amendment to the contract is restricted by the Authorization Flag set on the current revision of Contract Formation action.
Action Code
C3
Field
Type
Description
ChangeAdministrationAddress
bool
Used to change the administration address. The new administration address must be in the input[1] position. A change of the administration or operator address requires both the operator and the administration address to be in the inputs (both signatures) of the Contract Amendment action.
Example: 1
ChangeOperatorAddress
bool
Used to change the smart contract operator address. The new operator address must be in the input[1] position, unless the administration is being changed too, then it is in input[2]. A change of the administration or operator address requires both the operator and the administration address to be in the inputs (both signatures) of the Contract Amendment action.
Example: 1
The Bitcoin transaction ID of the associated result action that permitted the modifications. See Governance for more details.
Transaction Summary
Index
Input
Description
0
Administration's Public Address
This action can only come from the administration.
1
New Administration Public Address
Only treated as the new administration address when the Change Administration Address flag is set to true.
Index
Output
Description
0
Contract Public Address
The related contract address.
Static Contract Formation
Static Contract Formation Action
Action Code
C4
Field
Type
Description
ContractName
varchar(tiny)
Can be any unique identifying string, including human readable names for branding/vanity purposes. Contract identifier (instance) is the bitcoin public address. If the public address is lost, then the administration will have to reissue the entire contract, Instrument Definition and tokens with the new public address. Smart contracts can be branded and specialized to suit any terms and conditions. Example: Tesla - Shareholder Agreement
32 randomly generated bytes. Each Contract Code should be unique. The Contract ID will be human facing and will be the Contract Code, with a checksum, encoded in base58 and prefixed by 'CON'. Contract ID = CON + base58(ContractCode + checksum). Eg. Contract ID = 'CON18RDoKK7Ed5zid2FkKVy7q3rULr4tgfjr4'
BodyOfAgreementType
uint(1)
1 - SHA-256 Hash, 2 - Tokenized Body of Agreement Format
Body of Agreement - Amendments can be restricted to a vote. Example: 1
BodyOfAgreement
varbin(medium)
SHA-256 hash of the body of the agreement (full contract in pdf format or the like) or the full terms and conditions of an agreement in the Tokenized Body of Agreement format. This is specific to the smart contract and relevant Instruments. Legal and technical information.
ContractType
varchar(tiny)
Describes the purpose of the contract.
Example: Non-Disclosure Agreement
Supporting documents that are important to the contract.
ContractRevision
uint(4)
Counter 0 to (2^32)-1
Example: 0
(Deprecated)GoverningLawDeprecated
deprecated
Deprecated to remove fixed size. 5 Letter Code to identify which governing law the contract will adhere to. Disputes are to be settled by this law in the jurisdiction specified below. Private dispute resolution organizations can be used as well. A custom code just needs to be defined.
Example: USA
(Deprecated)JurisdictionDeprecated
deprecated
Deprecated to remove fixed size. Legal proceedings/arbitration will take place using the specified Governing Law in this location.
Example: US-CA
All actions related to the contract will cease to work after this timestamp. The smart contract will stop running. This will allow many token use cases to be able to calculate smart contract running costs. Eg. an issuer is creating tickets for an event on the 5th of June 2018. The smart contract will facilitate exchange and send transactions up until the 6th of June. Wallets can use this to forget tokens that are no longer valid - or at least store them in an 'Expired' folder.
ContractURI
varchar(tiny)
Length 0-255 bytes. Points to an information page that also has a copy of the Contract. Anyone can go to the website to have a look at the price/token, information about the issuer (company), information about the Instrument, legal information, etc. There will also be a way for token owners to vote on this page and contact details with the issuer/tokenized companies. Could be a IPv6/IPv4, or txn-id for on chain information or even a public address (DNS).
Example: https://tokenized.com/Contract/3qeoSCg7JmfSnJesJFojj
5 Letter Code to identify which governing law the contract will adhere to. Disputes are to be settled by this law in the jurisdiction specified below. Private dispute resolution organizations can be used as well. A custom code just needs to be defined.
Governing Legal System - Amendments can be restricted to a vote. Example: USA
Legal proceedings/arbitration will take place using the specified Governing Law in this location.
Jurisdiction - Amendments can be restricted to a vote. Example: US-CA
Transaction Summary
Index
Input
Description
0
Issuer or Party X Public Address
Any number of involved parties with this contract.
Contract Address Change
This txn is signed by the master contract key defined in the contract formation and changes the active contract address which the contract uses to receive and respond to requests. This is a worst case scenario fallback to only be used when the contract private key is believed to be exposed.
A counter for the number of times this agreement has been revised using a modification action.
Can't be changed by the administration, operator. Smart contract controls. Example: 0
The Bitcoin transaction ID of the associated result action that permitted the modifications. See Governance for more details.
Transaction Summary
Index
Input
Description
0
Administration's Public Address
Index
Output
Description
0
Contract Public Address
Instrument Definition
This action is used by the administration to define the properties/characteristics of the instrument (token) that it wants to create. An instrument has a unique identifier called InstrumentID = InstrumentType + base58(InstrumentCode + checksum). An instrument is always linked to a contract that is identified by the public address of the Contract wallet.
Action Code
I1
Field
Type
Description
InstrumentPermissions
varbin(small)
A set of permission objects containing switches and field references that define the permissions for modifying this instrument. See the Permission documentation for more detail.
(Deprecated)TransfersPermitted
deprecated
Deprecated to move into specific instrument types. Set to true if transfers are permitted between two parties, otherwise set to false to prevent peer-to-peer transfers.
(Deprecated)TradeRestrictionsDeprecated
deprecated
Deprecated to remove fixed size. If specified, the instrument can only be traded within the specified trade restriction zone. For example, AUS would restrict to Australian residents only.
EnforcementOrdersPermitted
bool
Set to true if the administration is permitted to make enforcement orders on user tokens and balances, otherwise set to false to disable this feature.
Example: 1
VotingRights
bool
When false holders of this instrument will not be able to vote for tokens of this instrument even on voting systems in which vote multiplers are not permitted.
Example: true
VoteMultiplier
uint(1)
Multiplies a vote by the specified integer. Where 1 token is equal to 1 vote with a 1 for vote multipler (normal), 1 token = 3 votes with a multiplier of 3, for example. If zero, then holders of this instrument don't get any votes for their tokens.
Example: 3
AdministrationProposal
bool
Set to true if the administration is permitted to make proposals outside of the smart contract scope.
General Governance Example: true
HolderProposal
bool
Set to true if a holder is permitted to make proposals outside of the smart contract scope.
Example: true
InstrumentModificationGovernance
uint(1)
Supported values: 1 - Contract-wide Instrument Governance. 0 - Instrument-wide Instrument Governance. If a referendum or initiative is used to propose a modification to a subfield controlled by the instrument permissions, then the vote will either be a contract-wide vote (all instruments vote on the referendum/initiative) or an instrument-wide vote (only this instrument votes on the referendum/initiative) depending on the value in this subfield. The voting system specifies the voting rules.
Example: 1
AuthorizedTokenQty
uint(8)
The number of tokens authorized to be issued for this instrument. Set to greater than zero for fungible tokens. If the value is 1 then it becomes a non-fungible token, where the contract would have many instruments. Set to 0 to represent a placeholder instrument, where tokens are to be issued later, or to represent a decomissioned instrument where all tokens have been revoked.
Example: 1000000
A code representing the type of instrument and the structure of the payload.
This field is always required.
InstrumentPayload
varbin(small)
A custom payload that contains meta data about this instrument. Payload structure and length is dependent on the instrument type chosen. See instrument documentation for more details.
This field is always required.
If specified, the instrument can only be traded within the specified trade restriction zone. For example, AUS would restrict to Australian residents only.
Transaction Summary
Index
Input
Description
0
Administration's Public Address
This action can only come from the administration.
Index
Output
Description
0
Contract Public Address
The contract that this instrument should be assigned to. Must include enough for the responding action.
Instrument Creation
This action creates an instrument in response to the administration's instructions in the Definition Action.
A unique code that is used to identify the instrument. It is generated by hashing the contract public key hash and the instrument index. SHA256(contract PKH + instrument index)
Cannot be changed by the administration, operator or smart contract.
InstrumentIndex
uint(8)
The index of the instrument within the contract. First instrument is zero, second is one. Used to derive the instrument code.
Example: 0
InstrumentPermissions
varbin(small)
A set of permission objects containing switches and field references that define the permissions for modifying this instrument. See the Permission documentation for more detail.
(Deprecated)TransfersPermitted
deprecated
Deprecated to move into specific instrument types. Set to true if transfers are permitted between two parties, otherwise set to false to prevent peer-to-peer transfers.
(Deprecated)TradeRestrictionsDeprecated
deprecated
Deprecated to remove fixed size. If specified, the instrument can only be traded within the specified trade restriction zone. For example, AUS would restrict to Australian residents only.
EnforcementOrdersPermitted
bool
Set to true if the administration is permitted to make enforcement orders on user tokens and balances, otherwise set to false to disable this feature.
Example: true
VotingRights
bool
When false holders of this instrument will not be able to vote for tokens of this instrument even on voting systems in which vote multiplers are not permitted.
Example: true
VoteMultiplier
uint(1)
Multiplies a vote by the specified integer. Where 1 token is equal to 1 vote with a 1 for vote multipler (normal), 1 token = 3 votes with a multiplier of 3, for example. If zero, then holders of this instrument don't get any votes for their tokens.
Example: 3
AdministrationProposal
bool
Set to true if the administration is permitted to make proposals outside of the smart contract scope.
General Governance Example: true
HolderProposal
bool
Set to true if a holder is permitted to make proposals outside of the smart contract scope.
Example: true
InstrumentModificationGovernance
uint(1)
Supported values: 1 - Contract-wide Instrument Governance. 0 - Instrument-wide Instrument Governance. If a referendum or initiative is used to propose a modification to a subfield controlled by the instrument permissions, then the vote will either be a contract-wide vote (all instruments vote on the referendum/initiative) or an instrument-wide vote (only this instrument votes on the referendum/initiative) depending on the value in this subfield. The voting system specifies the voting rules.
Example: 1
AuthorizedTokenQty
uint(8)
The number of tokens authorized to be issued for this instrument. Set to greater than zero for fungible tokens. If the value is 1 then it becomes a non-fungible token, where the contract would have many instruments. Set to 0 to represent a placeholder instrument, where tokens are to be issued later, or to represent a decomissioned instrument where all tokens have been revoked.
Example: 1000000
A code representing the type of instrument and the structure of the payload.
InstrumentPayload
varbin(small)
A custom payload that contains meta data about this instrument. Payload structure and length is dependent on the instrument type chosen. See instrument documentation for more details.
InstrumentRevision
uint(4)
A counter for the number of times this instrument has been revised using a modification action.
Can't be changed by the administration, operator. Smart contract controls. Example: 456789
If specified, the instrument can only be traded within the specified trade restriction zone. For example, AUS would restrict to Australian residents only.
Transaction Summary
Index
Input
Description
0
Contract Public Address
The contract that this instrument was assigned to.
Index
Output
Description
0
Contract Public Address
Required so that users can monitor transactions to the contract for updates to contract/instruments.
Instrument Modification
Token Dilutions, Call Backs/Revocations, burning etc.
Action Code
I3
Field
Type
Description
InstrumentType
fixedchar(3)
Three letter character that specifies the instrument type.
Example: SHC
A unique code that is used to identify the instrument. It is generated by hashing the contract public key hash and the instrument index. SHA256(contract PKH + instrument index)
Cannot be changed by the administration, operator or smart contract.
InstrumentRevision
uint(4)
The current revision figure to ensure the modification provided is based on the latest version.
Cannot be Amended Example: 0
The Bitcoin transaction ID of the associated result action that permitted the modifications. See Governance for more details.
Transaction Summary
Index
Input
Description
0
Administration's Public Address
This action can only come from the administration.
Index
Output
Description
0
Contract Public Address
The contract that this instrument currently belongs to. Must include enough for the responding action.
Transfer
A Token Owner(s) Sends, Exchanges or Swaps a token(s) or Bitcoin for a token(s) or Bitcoin. Can be as simple as sending a single token to a receiver. Or can be as complex as many senders sending many different instruments - controlled by many different smart contracts - to a number of receivers. This action also supports atomic swaps (tokens for tokens). Since many parties and contracts can be involved in a transfer and the corresponding settlement action, the partially signed T1 and T2 actions will need to be passed around on-chain with an M1 action, or off-chain.
Timestamp in nanoseconds of when the smart contract created the action.
Cannot be changed by the administration, operator. Smart contract controls.
Transaction Summary
Index
Input
Description
0
Contract Public Address (Instrument X)
Contract (Instrument X) in response to a transfer action with Instrument X being sent to another address(es).
Index
Output
Description
0
Instrument 1 Settlement Address X
Address X that is being settled for Instrument 1.
Proposal
Allows the Administration/Token Holders to propose a change (aka Initiative/Shareholder vote). A significant cost - specified in the Contract Formation - can be attached to this action when sent from Token Holders to reduce spam, as the resulting vote will be put to all token owners.
Action Code
G1
Field
Type
Description
Type
uint(1)
Type of proposal. Supported values:
0 Referendum / Administration Initiates / Members Vote
1 Initiative / Members Initiate / Members Vote
2 AdministrativeMatter / Administration Initiates / Administrators Vote
InstrumentType
fixedchar(3)
Three letter character that specifies the instrument type.
Example: SHC
A unique code that is used to identify the instrument. It is generated by hashing the contract public key hash and the instrument index. SHA256(contract PKH + instrument index)
Cannot be changed by the administration, operator or smart contract.
VoteSystem
uint(1)
X for Vote System X. (1-255, 0 is not valid.)
Example: 1
Each element contains details of which fields to modify, or delete. Because the number of fields in a Contract and Instrument is dynamic due to some fields being able to be repeated, the index value of the field needs to be calculated against the Contract or Instrument the changes are to apply to. In the event of a Vote being created from this Initiative, the changes will be applied to the version of the Contract or Instrument at that time.
VoteOptions
varchar(tiny)
Length 1-255 bytes. 0 is not valid. Each byte allows for a different vote option. Typical votes will likely be multiple choice or Y/N. Vote instances are identified by the Tx-ID. AB would be used for Y/N (binary) type votes. When Specific is true, only AB is a valid value.
Example: ABCDEFGHIJKLMNO
VoteMax
uint(1)
Range: 1-X. How many selections can a voter make in a Ballot Cast. 1 is selected for Y/N (binary). When Specific is true, only 1 is a valid value.
Example: 15
ProposalDescription
varchar(medium)
Length restricted by the Bitcoin protocol. 0 is valid. Description or details of the vote
Example: Change the name of the Contract.
ProposalDocumentHash
bin(32)
SHA256 Hash of the proposal document to be distributed to voters.
Example: 77201b0094f50df309f0343e4f44dae64d0de503c91038faf2c6b039f9f18aec
Timestamp in nanoseconds of when the smart contract created the action.
Cannot be changed by the administration, operator. Smart contract controls.
Transaction Summary
Index
Input
Description
0
Contract Public Address
The contract that is performing this action.
Index
Output
Description
0
Contract Public Address
Required so that users can monitor transactions to the contract for notifications of this action.
Ballot Cast
Used by Token Owners to cast their ballot (vote) on proposals. 1 Vote per token unless a vote multiplier is specified in the relevant Instrument Definition action.
Tx ID of the Vote the Ballot Cast is being made for.
Vote
varchar(tiny)
Length 1-255 bytes. 0 is not valid. Max length is the VoteMax value from the Proposal action. Accept, Reject, Abstain, Spoiled, Multiple Choice, or Preference List. 15 options total. Order of preference. 1st position = 1st choice. 2nd position = 2nd choice, etc. A is always Accept and B is always reject in a Y/N votes.
Example: A
Transaction Summary
Index
Input
Description
0
Token Owner's Public Address
The user casting the ballot for this contract.
Index
Output
Description
0
Contract Public Address
Funds ballot cast response.
Ballot Counted
The smart contract will respond to a Ballot Cast action with a Ballot Counted action if the Ballot Cast is valid. If the Ballot Cast is not valid, then the smart contract will respond with a Rejection Action.
Tx ID of the Vote the Ballot Cast is being made for.
Vote
varchar(tiny)
Length 1-255 bytes. 0 is not valid. Max length is the VoteMax value from the Proposal action. Accept, Reject, Abstain, Spoiled, Multiple Choice, or Preference List. 15 options total. Order of preference. 1st position = 1st choice. 2nd position = 2nd choice, etc. A is always Accept and B is always reject in a Y/N votes.
Example: A
Quantity
uint(8)
Number of votes counted for this ballot. Factors in vote multipliers if there are any allowed, otherwise it is just quantity of tokens held.
Timestamp in nanoseconds of when the smart contract created the action.
Cannot be changed by the administration, operator. Smart contract controls.
Transaction Summary
Index
Input
Description
0
Contract Public Address
The contract that is performing this action.
Index
Output
Description
0
Contract Public Address
Required so that users can monitor transactions to the contract for notifications of this action.
Result
Once a vote has been completed the results are published. After the result is posted, it is up to the administration to send a contract/instrument amendement if appropriate.
Action Code
G5
Field
Type
Description
InstrumentType
fixedchar(3)
Three letter character that specifies the instrument type.
Example: SHC
A unique code that is used to identify the instrument. It is generated by hashing the contract public key hash and the instrument index. SHA256(contract PKH + instrument index)
Cannot be changed by the administration, operator or smart contract.
Each element contains details of which fields to modify, or delete. Because the number of fields in a Contract and Instrument is dynamic due to some fields being able to be repeated, the index value of the field needs to be calculated against the Contract or Instrument the changes are to apply to. In the event of a Vote being created from this Initiative, the changes will be applied to the version of the Contract or Instrument at that time.
List of number of valid votes counted for each vote option. Length is encoded like a regular list object, but must match the length of VoteOptions from the Proposal action.
Result
varchar(tiny)
Length 1-255 bytes. 0 is not valid. The Option with the most votes. In the event of a draw for 1st place, all winning options are listed.
Timestamp in nanoseconds of when the smart contract created the action.
Cannot be changed by the administration, operator. Smart contract controls.
Transaction Summary
Index
Input
Description
0
Contract Public Address
The contract that is performing this action.
Index
Output
Description
0
Contract Public Address
Required so that users can monitor transactions to the contract for notifications of this action.
Order
Used by the administration to signal to the smart contract that the tokens that a particular public address(es) owns are to be confiscated, frozen, thawed or reconciled.
Action Code
E1
Field
Type
Description
ComplianceAction
fixedchar(1)
Freeze (F), Thaw (T), Confiscate (C), Reconcile (R)
Example: F
InstrumentType
fixedchar(3)
Three letter character that specifies the instrument type.
Example: SHC
A unique code that is used to identify the instrument. It is generated by hashing the contract public key hash and the instrument index. SHA256(contract PKH + instrument index)
Cannot be changed by the administration, operator or smart contract.
The holders and quantities that are effected by the order. For a contract or instrument wide freeze only the contract address is specified. Zero quantities are invalid unless it is for the contract address in an instrument wide or contract wide freeze. In a thaw order this field is not serialized, because the entire freeze from the FreezeTxId freeze action will be thawed.
Used for a 'time out'. Tokens are automatically unfrozen after the expiration timestamp without requiring a Thaw Action. Null value for Thaw, Confiscation and Reconciallitaion orders.
Example: Tue Oct 09 2018 05:00:00 GMT+1000 (AEST)
The public address for confiscated tokens to be deposited in. Null for Freeze, Thaw, actions.
Eventually the supporting evidence/explanation can be supported by a Subfield that has the public address (and a signed message) owned by a legal authority for ID verification/certification purposes.
AuthorityName
varchar(tiny)
Length 0-255 bytes. Enforcement Authority Name (eg. Issuer, Queensland Police Service, Tokenized, etc.)
Example: Supreme and District Courts Brisbane
AuthorityPublicKey
varbin(tiny)
Length 0-255 bytes. Public Key associated with the Enforcement Authority
SignatureAlgorithm
uint(1)
Algorithm used for order signature. Only valid value is currently 1 = ECDSA+secp256k1
Example: 1
OrderSignature
varbin(tiny)
Length 0-255 bytes. Signature for a message that lists out the target addresses and deposit address. Signature of (Contract PKH, Compliance Action, Authority Name, Instrument Code, Supporting Evidence Hash, FreezePeriod, TargetAddresses, and DepositAddress)
(Deprecated)SupportingEvidenceHash
deprecated
Deprecated for new supporting evidence type and data fields (bin 32). SHA-256: warrant, court order, etc.
(Deprecated)RefTxs
deprecated
Deprecated for a new data format for reference transactions (varbin medium). The request/response actions that were dropped. The entire txn for both actions is included as evidence that the actions were accepted into the mempool at one point and that the senders (token/Bitcoin) signed their intent to transfer. The management of this record keeping is off-chain and managed by the administration or operator to preserve the integrity of the state of the tokens. Only applicable for reconcilliation actions. No subfield when F, T, R is selected as the Compliance Action subfield.
Can be null. Dropped actions that require a reconciliation action to fix the break in the chain are considered to be an extremely rare event.
The request/response actions that were dropped. The entire txn for both actions is included as evidence that the actions were accepted into the mempool at one point and that the senders (token/Bitcoin) signed their intent to transfer. The management of this record keeping is off-chain and managed by the administration or operator to preserve the integrity of the state of the tokens. Only applicable for reconcilliation actions. No subfield when F, T, R is selected as the Compliance Action subfield.
Can be null. Dropped actions that require a reconciliation action to fix the break in the chain are considered to be an extremely rare event.
Transaction Summary
Index
Input
Description
0
Administration's Public Address
This action can only come from the administration.
Index
Output
Description
0
Contract Public Address
Contract fee and funding for response transaction.
Freeze
The contract responding to an Order action to freeze instruments. To be used to comply with contractual/legal/issuer requirements. The target public address(es) will be marked as frozen. However the Freeze action publishes this fact to the public blockchain for transparency. The contract will not respond to any actions requested by the frozen address.
Action Code
E2
Field
Type
Description
InstrumentType
fixedchar(3)
Three letter character that specifies the instrument type.
Example: SHC
A unique code that is used to identify the instrument. It is generated by hashing the contract public key hash and the instrument index. SHA256(contract PKH + instrument index)
Cannot be changed by the administration, operator or smart contract.
Indices to addresses in outputs and the quantities being frozen. If the only address is the contract address and the instrument code is zeros, then it is a contract wide freeze. If the only address is the contract address and the instrument code is specified, then it is an instrument wide freeze.
Timestamp in nanoseconds of when the smart contract created the action.
Cannot be changed by the administration, operator. Smart contract controls.
Transaction Summary
Index
Input
Description
0
Contract Public Address
The contract that is performing this action.
Index
Output
Description
0
Target Public Address X
If Target Public Address is the Contract Address then the entire contract is frozen. All request actions during the Freeze period will be ignored and rejected when the contract is thawed and rebuilds.
Thaw
The contract responding to an Order action to thaw instruments. To be used to comply with contractual obligations or legal requirements. The Alleged Offender's tokens will be unfrozen to allow them to resume normal exchange and governance activities.
Timestamp in nanoseconds of when the smart contract created the action.
Cannot be changed by the administration, operator. Smart contract controls.
Transaction Summary
Index
Input
Description
0
Contract Public Address
The contract that is performing this action.
Index
Output
Description
0
Target Public Address X
Can be the Contract Address for a 'Contract-wide' Thaw in response to a Contract-wide Freeze.
Confiscation
The contract responding to an Order action to confiscate instruments. To be used to comply with contractual obligations, legal and/or issuer requirements.
Action Code
E4
Field
Type
Description
InstrumentType
fixedchar(3)
Three letter character that specifies the instrument type.
Example: SHC
A unique code that is used to identify the instrument. It is generated by hashing the contract public key hash and the instrument index. SHA256(contract PKH + instrument index)
Cannot be changed by the administration, operator or smart contract.
Timestamp in nanoseconds of when the smart contract created the action.
Cannot be changed by the administration, operator. Smart contract controls.
Transaction Summary
Index
Input
Description
0
Contract Public Address
The contract that is performing this action.
Index
Output
Description
0
Target Public Address X
Can be the Contract Address for a 'Contract-wide' Confiscation.
1
Deposit Public Address
Dust limit rule minimum value output of 546
Reconciliation
The contract responding to an Order action to reconcile instruments. To be used at the direction of the administration to fix record keeping errors with bitcoin and token balances.
Action Code
E5
Field
Type
Description
InstrumentType
fixedchar(3)
Three letter character that specifies the instrument type.
Example: SHC
A unique code that is used to identify the instrument. It is generated by hashing the contract public key hash and the instrument index. SHA256(contract PKH + instrument index)
Cannot be changed by the administration, operator or smart contract.
Transaction ID of the register entry to be altered.
Message
varchar(medium)
A custom message to include with this action.
Example: Removed due to violation of company policy.
Transaction Summary
Index
Input
Description
0
Register Public Address
The address of the associated register.
Index
Output
Description
0
Register Public Address
Required so that users can monitor transactions to the register for notifications of this action.
Message
The message action is a general purpose communication action. 'Twitter/SMS' for Issuers/Investors/Users. The message txn can also be used for passing partially signed txns on-chain, establishing private communication channels and EDI (receipting, invoices, PO, and private offers/bids). The messages are broken down by type for easy filtering in the a user's wallet. The Message Types are listed in the Message Types table.
Action Code
M1
Field
Type
Description
SenderIndexes
uint(4)[tiny]
Associates the message to a particular input by the index. If none are specified then the first input is assumed.
ReceiverIndexes
uint(4)[tiny]
Associates the message to a particular output by the index. If none are specified then the first output is assumed.
MessageCode
uint(2)
MessagePayload
varbin(medium)
Public or private (RSA public key, Diffie-Hellman). Issuers/Contracts can send the signifying amount of satoshis to themselves for public announcements or private 'notes' if encrypted. See Message Types for a full list of potential use cases.
Example: Hello world!
Transaction Summary
Index
Input
Description
0
Sender Public Address
The user sending the message.
Index
Output
Description
0
Receiver Public Address"
The recipient's address for the message, supplied by the sender.
Rejection
Used to reject request actions that do not comply with the Contract. If money is to be returned to a User then it is used in lieu of the Settlement Action to properly account for token balances. All Administration/User request Actions must be responded to by the Contract with an Action. The only exception to this rule is when there is not enough fees in the first Action for the Contract response action to remain revenue neutral. If not enough fees are attached to pay for the Contract response then the Contract will not respond.
Action Code
M2
Field
Type
Description
AddressIndexes
uint(4)[tiny]
Associates the message to a particular output by the index. If none are specified then the first output is assumed.
RejectAddressIndex
uint(2)
The address which is believed to have caused the rejection.
Length 0-65,535 bytes. Message that explains the reasoning for a rejection, if needed. Most rejection types will be captured by the Rejection Type Subfield.
Example: Sorry, you don't have enough tokens.
Chairman, Director, Managing Partner, etc.. Found in 'Roles' in Specification/Resources
Example: 7
Name
varchar(tiny)
Length 0-255 bytes. 0 is valid.
Example: Satoshi Nakamoto
Administrator Identity Certificate
A certificate provided by an identity oracle to verify the administrator address is associated with the issuer entity identification information. Also if a contract operator is provided then it verifies that the contract operator address is associated with the specified contract operator identity information. For a child contract that references a parent entity contract the certificate verifies that the administrator address is associated with that entity contract.
The signature provided by the oracle specified. The first input must correspond to the administration entity and, if a contract operator is included, the second input must correspond to the contract operator entity."
BlockHeight
uint(4)
The block height of the block hash used in the oracle signature.
Oracles have the option to specify an expiration after which a new certificate should be provided.
Amendment
An Amendment is used to describe the modification of a single field in a Contract or Instrument, as defined in the ContractFormation and InstrumentCreation messages.
Field
Type
Description
FieldIndexPath
varbin(tiny)
List of indices that identify the field/sub-field to be amended.
The index path of the field being modified. Encoded as a list of base 128 var ints. Each index is an index into the current object, top level being the ContractFormation or InstrumentCreation. Indexes are defined by protobuf messages. If the current level is a list, then the index is a zero based offset to the element in the list.
Operation
uint(1)
0 = Modify. 1 = Add an element to the data to the array of elements. 2 = Delete the element listed in the Element field. The Add and Delete operations only apply to a particilar element of a complex array type. For example, it could be used to remove a particular VotingSystem from a Contract.
Example: 0
Data
varbin(medium)
New data for the amended subfield. Data type depends on the the type of the field being amended. The value should be serialize as defined by the protocol.
The bytes must be encoded in the format of the field being modified.
Instrument Receiver
An InstrumentReceiver is a quantity, address, and oracle signature. The quantity could be used to describe a number of tokens, or a value. The address is where the instrument will be sent.
Number of tokens to be received by address at Output X
Example: 100
OracleSigAlgorithm
uint(1)
0 = No Oracle-signed Message (OracleConfirmationSig skipped in serialization), 1 = ECDSA+secp256k1. If the contract for the instrument being received has oracles, then a signature is required from one of them.
Example: 1
OracleIndex
uint(1)
Specifies the index into the list of oracles in the contract offer that was used to authorize this transfer.
Length 0-255 bytes. If restricted to a oracle (whitelist) or has transfer restrictions (age, location, investor status): ECDSA+secp256k1 (or the like) signed message provided by an approved/trusted oracle through an API signature of the defined message. If no transfer restrictions(trade restriction/age restriction fields in the Instrument Type payload. or restricted to a whitelist by the Contract Auth Flags, it is a NULL field.
OracleSigBlockHeight
uint(4)
The block height of the block hash used in the oracle signature.
A unique code that is used to identify the instrument. It is generated by hashing the contract public key hash and the instrument index. SHA256(contract PKH + instrument index)
Cannot be changed by the administration, operator or smart contract.
A unique code that is used to identify the instrument. It is generated by hashing the contract public key hash and the instrument index. SHA256(contract PKH + instrument index)
Cannot be changed by the administration, operator or smart contract.
A clause is the standard piece of an agreement, contained in each of the sub-levels of the agreement. Articles, Sections, Subsections, Paragraphs, and Subparagraphs.
A definition define a term specified throughout an agreement.
Field
Type
Description
Term
varchar(tiny)
The name of the term being defined. Linked to from within the agreement with curly braces {} around the name.
Definition
varchar(small)
The definition of the name.
Document
A file containing data.
Field
Type
Description
Name
varchar(tiny)
Full name, including file extension, of the file. Length 0-255 bytes. 0 is valid.
Example: Agreement.pdf
Type
varchar(tiny)
MIME type of the file. Length 0-255 bytes. 0 is valid.
Example: application/pdf
Contents
varbin(medium)
The contents of the file.
Entity
Entity represents the details of a legal Entity, such as a public or private company, government agency, or and individual.
Field
Type
Description
Name
varchar(tiny)
Length 1-255 bytes (0 is not valid). Issuing entity (company, organization, individual). Can be any unique identifying string, including human readable names for branding/vanity purposes.
Example: Tesla Inc.
The type of entity. (i.e Public Company, Individual) (Specification/Resources).
Example: P
LEI
fixedchar(20)
Null is valid. A Legal Entity Identifier (or LEI) is an international identifier made up of a 20-character identifier that identifies distinct legal entities that engage in financial transactions. It is defined by ISO 17442.[1] Natural persons are not required to have an LEI; they’re eligible to have one issued, however, but only if they act in an independent business capacity.[2] The LEI is a global standard, designed to be non-proprietary data that is freely accessible to all.[3] As of December 2018, over 1,300,000 legal entities from more than 200 countries have now been issued with LEIs.
ISO 17442 - https://en.wikipedia.org/wiki/Legal_Entity_Identifier Example: 54930084UKLVMY22DS16
UnitNumber
varchar(tiny)
Issuer/Entity/Contracting Party X Address Details (eg. HQ)
Example: 2
A list of people in Management Roles for the Entity. e.g CEO, COO, CTO, CFO, Secretary, Executive, etc.
DomainName
varchar(tiny)
Domain name owned by this entity. Length 0-255 bytes. 0 is valid.
Example: tokenized.com
(Deprecated)EntityContractAddress
deprecated
Deprecated for separate field in contract. Address of entity contract. When the contract type is instrument contract, or a child type, this field refers to the entity specified in the contract at the address specified. When this field is present, no other fields should be included in the entity.
PaymailHandle
varchar(tiny)
Length 0-255 bytes. Handle containing an alias and domain name performing queries defined in the Paymail protocol.
Example: satoshi@tokenized.id
Manager
Manager is used to refer to a role that is responsible for the Management of an Entity.
Deprecated for service contract address. Length 0-255 bytes. 0 is not valid. Oracle Public Key (eg. Bitcoin Public key), used to confirm digital signed proofs for transfers. Can also be the same public address that controls a Tokenized Oracle.
OracleTypes
uint(1)[tiny]
The type of the oracle. 0 = Identity, 1 = Authority, 2 = Event. More than one value can be included to specify the oracle has more than one type.
The entity contract address of the service on chain that defines the oracle.
Quantity Index
A QuantityIndex contains a quantity, and an index. The quantity could be used to describe a number of tokens, or a value. The index is used to refer to an input or output index position.
Field
Type
Description
Index
uint(2)
The index of the input/output (depending on context) sending/receiving the tokens.
Example: 0
Quantity
uint(8)
Number of tokens being sent
Example: 100
Reference Transaction
A bitcoin transaction and the outputs that it spends.
Field
Type
Description
Transaction
varbin(tiny)
A bitcoin transaction serialized in the bitcoin P2P format.
Example: 0
Outputs
varbin(large)[medium]
The bitcoin outputs corresponding to the inputs for the transaction. Serialized in bitcoin P2P format. There must be the same count as there are inputs in the contained transaction and they must be in the same order.
Service
A definition of a service provided by an identity oracle to verify the administrator address is associated with the issuer entity identification information. Also if a contract operator is provided then it verifies that the contract operator address is associated with the specified contract operator identity information. For a child contract that references a parent entity contract the certificate verifies that the administrator address is associated with that entity contract.
Field
Type
Description
Type
uint(1)
Describes the type of service.
0 - Identity Oracle
1 - Authority Oracle
2 - Event Oracle
3 - Contract Operator
Example: 0
URL
varchar(tiny)
The base URL of the service. For each service type there are predefined methods for determining the specific endpoints.
Public address where the token balance will be changed.
Quantity
uint(8)
Qty of tokens to be frozen, thawed, confiscated or reconciled. For Contract-wide freezes 0 will be used.
Example: 10000
Voting System
A VotingSystem defines all details of a Voting System.
Field
Type
Description
Name
varchar(tiny)
eg. Special Resolutions, Ordinary Resolutions, Fundamental Matters, General Matters, Directors' Vote, Poll, etc.
Example: Special Resolutions
VoteType
fixedchar(1)
R - Relative Threshold, A - Absolute Threshold, P - Plurality. Relative Threshold means the number of counted votes must exceed the threshold % of total ballots cast. Abstentations/spoiled votes do not detract from the likelihood of a vote passing as they are not included in the denominator. Absolute Threshold requires the number of ballots counted to exceed the threshold value when compared to the total outstanding tokens. Abstentations/spoiled votes detract from the likelihood of the vote passing. For example, in an absolute threshold vote, if the threshold was 50% and 51% of the total outstanding tokens did not vote, then the vote cannot pass. 50% of all tokens would have had to vote for one vote option for the vote to be successful. Plurality means the most favoured option is selected, regardless of the number of votes cast or the percentage relative to other choices.
Example: A
TallyLogic
uint(1)
0 - Standard Scoring (+1 * # of tokens owned), 1 - Weighted Scoring (1st choice * Vote Max * # of tokens held, 2nd choice * Vote Max-1 * # of tokens held,..etc.)
Example: 0
ThresholdPercentage
uint(1)
This field is ignored when VoteType is P (Plurality). Otherwise it is the percentage of ballots required for a proposal to pass. Valid values are greater than 0 and less than 100. 75 means 75% and greater. Only applicable to Relative and Absolute Threshold vote methods. The Plurality vote method requires no threshold value (NULL), as the successful vote option is simply selected on the basis of highest ballots cast for it.
Example: 75
VoteMultiplierPermitted
bool
Where an instrument has a vote multiplier, true must be set here for the vote multiplier to count, otherwise votes are simply treated as 1x per token.
HolderProposalFee
uint(8)
Token Owners must pay the fee amount to broadcast a valid Proposal. If the Proposal action is valid, the smart contract will start a vote. 0 is valid.
Example: 100
Field Aliases
Field
Type
Description
Role
uint(1)
A role within an entity. (i.e. CEO, CFO)
Example: 5
EntityType
fixedchar(1)
A type of entity. (i.e. Individual, Public Company)
Example: I
LegalSystems (Legal Systems for Governing Law/Choice of Law
Example: GBREW
RejectionCode
uint(1)
Codes returned in rejection messages when a request is not accepted.
Example: 10
Tag
uint(1)
Predefined tags for output metadata.
Example: 1
Address
varbin(small)
A representation of a bitcoin address in raw format, with no check sum or encoding.
Example: 20f8d521553a2b0de0ceba82b70c5dd184c6cd2f43
ContractCode
bin(32)
32 randomly generated bytes. Each Contract Code should be unique. The Contract ID will be human facing and will be the Contract Code, with a checksum, encoded in base58 and prefixed by 'CON'. Contract ID = CON + base58(ContractCode + checksum). Eg. Contract ID = 'CON18RDoKK7Ed5zid2FkKVy7q3rULr4tgfjr4'
Example: 260840c0b3d4dadb870cd34ffbfc47fed903fe7d94a7a5bab491fb728aebcc74
InstrumentType
fixedchar(3)
A code representing the type of instrument and the structure of the payload.
Example: CCY
InstrumentCode
bin(20)
Represents a unique identifier for an instrument/token.
Example: 0e6996402ea456156838652e3bd82c6c0986ef79
Timestamp
uint(8)
Represents a time, encoded as a 64 bit unsigned integer representing the number of nanoseconds since the Unix epoch.
Example: 1594668650000000000
TxId
bin(32)
Represents a Bitcoin transaction ID, the double SHA256 hash of the serialized transaction.
Example: 9d1ef0b1201c1dec3c1eb1caf758a988205226173e988e7a04afb4ea9977f506
PublicKey
bin(33)
Represents a compressed public key.
Example: 027fed903fe7d94a7a5bab491fb728aebcc74260840c0b3d4dadb870cd34ffbfc4
Signature
varbin(tiny)
Represents a DER encoded elliptic curve signature.
Example: 3044022036164b0c724e6f19e234306444a11631b2f8e47d05468a099928adce0dead62102205138a635827d61915483e7ca1a53b37975a9aa0617c78ef7ac199d94742c36cf