Agreement

Financial Agreement written in DSL between two or more users

Agreement contract that is used to implement any custom logic of a financial agreement. Ex. lender-borrower agreement

recordIds

uint256[] recordIds

parser

address parser

contextProgram

address contextProgram

contextDSL

address contextDSL

ownerAddr

address ownerAddr

records

mapping(uint256 => struct IAgreement.Record) records

onlyOwner

modifier onlyOwner()

constructor

constructor(address _parser, address _ownerAddr, address _dslContext) public

Sets parser address, creates new contextProgram instance, and setups contextProgram

receive

receive() external payable

hex4Bytes

function hex4Bytes(string _str) external pure returns (bytes4)

Apply keccak256 to _str, cut the result to the first 4 bytes

Parameters

Name Type Description
_str string Input string

Return Values

Name Type Description
[0] bytes4 bytes4(keccak256(str))

archiveRecord

function archiveRecord(uint256 _recordId) external

archive any of the existing records by recordId.

Parameters

Name Type Description
_recordId uint256 Record ID

unarchiveRecord

function unarchiveRecord(uint256 _recordId) external

unarchive any of the existing records by recordId

Parameters

Name Type Description
_recordId uint256 Record ID

activateRecord

function activateRecord(uint256 _recordId) external

activates the existing records by recordId, only awailable for ownerAddr

Parameters

Name Type Description
_recordId uint256 Record ID

deactivateRecord

function deactivateRecord(uint256 _recordId) external

deactivates the existing records by recordId, only awailable for ownerAddr

Parameters

Name Type Description
_recordId uint256 Record ID

parseFinished

function parseFinished() external view returns (bool _result)

returns true if parsing was finished for the record including conditions otherwise, it returns false The finished parsing therm means that all record and conditions already parsed and have got their bytecodes, so all bytecodes already storing in the Agreement smart contract

parse

function parse(address _preProc) external returns (bool _result)

Parse DSL code from the user and set the program bytecode in Agreement contract

Parameters

Name Type Description
_preProc address Preprocessor address

_parse

function _parse(uint256 _recordId, address _preProc, string _code, bool _isRecord) internal

Parse DSL code and set the program bytecode in Agreement contract

Parameters

Name Type Description
_recordId uint256 Record ID
_preProc address Preprocessor address
_code string DSL code for the record of the condition
_isRecord bool a flag that shows if provided _code is a record or not (a condition then)

update

function update(uint256 _recordId, uint256[] _requiredRecords, address[] _signatories, string _recordString, string[] _conditionStrings) public

Updates Agreement contract by DSL code for the record and its conditions. All records that will be updated still need to be parsed. Please, check the parse function for more details TODO: rename this function to addRecord

Parameters

Name Type Description
_recordId uint256 Record ID
_requiredRecords uint256[] array of required records in the record
_signatories address[] array of signatories in the record
_recordString string string of record DSL transaction
_conditionStrings string[] the array of conditions string for the record

execute

function execute(uint256 _recordId) external payable virtual

Check if the recorcID is executable (validate all conditions before record execution, check signatures).

Parameters

Name Type Description
_recordId uint256 Record ID

_verifyRecord

function _verifyRecord(uint256 _recordId) internal

conditionString

function conditionString(uint256 _recordId, uint256 i) external view returns (string)

Returns the condition string for provided recordID and index for the searching condition string

Parameters

Name Type Description
_recordId uint256 Record ID
i uint256

getActiveRecords

function getActiveRecords() external view returns (uint256[])

Sorted all records and return array of active records in Agreement

Return Values

Name Type Description
[0] uint256[] activeRecords array of active records in Agreement

getRecord

function getRecord(uint256 _recordId) external view returns (uint256[] _requiredRecords, address[] _signatories, string[] _conditions, string _record, bool _isActive)

return valuses for preview record before execution

Parameters

Name Type Description
_recordId uint256 Record ID

Return Values

Name Type Description
_requiredRecords uint256[] array of required records in the record
_signatories address[] array of signatories in the record
_conditions string[] array of conditions in the record
_record string string of record DSL transaction
_isActive bool true if the record is active

_checkSignatories

function _checkSignatories(address[] _signatories) internal view

Checks input _signatures that only one 'ANYONE' address exists in the list or that 'ANYONE' address does not exist in signatures at all

Parameters

Name Type Description
_signatories address[] the list of addresses

_verify

function _verify(uint256 _recordId) internal view returns (bool)

Verify that the user who wants to execute the record is amoung the signatories for this Record

Parameters

Name Type Description
_recordId uint256 ID of the record

Return Values

Name Type Description
[0] bool true if the user is allowed to execute the record, false - otherwise

_validateRequiredRecords

function _validateRequiredRecords(uint256 _recordId) internal view returns (bool)

Check that all records required by this records were executed

Parameters

Name Type Description
_recordId uint256 ID of the record

Return Values

Name Type Description
[0] bool true all the required records were executed, false - otherwise

_addRecordBlueprint

function _addRecordBlueprint(uint256 _recordId, uint256[] _requiredRecords, address[] _signatories) internal

Define some basic values for a new record

Parameters

Name Type Description
_recordId uint256 is the ID of a transaction
_requiredRecords uint256[] transactions ids that have to be executed
_signatories address[] addresses that can execute the chosen transaction

_addRecordCondition

function _addRecordCondition(uint256 _recordId, string _conditionStr) internal

Conditional Transaction: Append a condition to already existing conditions inside Record

Parameters

Name Type Description
_recordId uint256 Record ID
_conditionStr string DSL code for condition

_addRecordTransaction

function _addRecordTransaction(uint256 _recordId, string _recordString) internal

Adds a transaction that should be executed if all conditions inside Record are met

Parameters

Name Type Description
_recordId uint256 Record ID
_recordString string DSL code for record string

_validateConditions

function _validateConditions(uint256 _recordId, uint256 _msgValue) internal returns (bool)

Validate all conditions for the certain record ID

Parameters

Name Type Description
_recordId uint256 Record ID to execute
_msgValue uint256 Value that were sent along with function execution // TODO: possibly remove this argument

_fulfill

function _fulfill(uint256 _recordId, uint256 _msgValue, address _signatory) internal returns (bool result)

Fulfill Record

Parameters

Name Type Description
_recordId uint256 Record ID to execute
_msgValue uint256 Value that were sent along with function execution // TODO: possibly remove this argument
_signatory address The user that is executing the Record

Return Values

Name Type Description
result bool Boolean whether the record was successfully executed or not

_activeRecordsLen

function _activeRecordsLen() internal view returns (uint256)

return length of active records for getActiveRecords

Return Values

Name Type Description
[0] uint256 count length of active records array

conditionStringsLen

function conditionStringsLen(uint256 _recordId) public view returns (uint256)