CREATING CRYPTOLAW FOR THE UNIFORM COMMERCIAL CODE

This page contains supporting information to the article, “Creating Cryptolaw for the Uniform Commercial Code,” volume 78 of the Washington & Lee Law Review (2021), by Carla L. Reyes, Assistant Professor of Law, Southern Methodist University Dedman School of Law.

Lexon is a new type of program language that anyone can read. Prof. Reyes' article explains how Lexon can be used to articulate law, which can then be performed by a computer, as is.

This is the Lexon code Prof. Reyes proposed for the UCC Financial Statement:

The Lexon Code

LEX UCC Financing Statement. LEXON: 0.2.12 "Financing Statement" is this contract. "File Number" is data. "Initial Statement Date" is a time. "Filer" is a person. "Debtor" is a person. "Secured Party" is a person. "Filing Office" is a person. "Collateral" is data. "Digital Asset Collateral" is an amount. "Reminder Fee" is an amount. "Continuation Window Start" is a time. "Continuation Statement Date" is a time. "Continuation Statement Filing Number" is data. "Lapse Date" is a time. "Default" is a binary. "Continuation Statement" is a binary. "Termination Statement" is a binary. "Termination Statement Time" is a time. "Notification Statement" is a text. The Filer fixes the Filing Office, fixes the Debtor, fixes the Secured Party, and fixes the Collateral. Clause: Certify. The Filing Office may certify the File Number. Clause: Set File Date. The Filing Office may fix the Initial Statement Date as the current time. Clause: Set Lapse. The Filing Office may fix the Lapse Date. Clause: Set Continuation Start. The Filing Office may fix the Continuation Window Start. Clause: Pay Fee. The Secured Party may pay a Reminder Fee into escrow. Clause: Notice. The Filing Office may fix the Notification Statement. Clause: Notify. The Filing Office may, if the Continuation Window Start has passed, send the Notification Statement to the Secured Party. Clause: Pay Escrow In. The Debtor may pay the Digital Asset Collateral into escrow. Clause: Fail to Pay. The Secured Party may declare Default. Clause: Take Possession. The Filing Office may, if Default is declared, pay the Digital Asset Collateral to the Secured Party. Clause: File Continuation. The Secured Party may file the Continuation Statement. Clause: Set Continuation Lapse. The Filing Office may, if the Continuation Statement is filed, fix the Continuation Statement Date. Clause: File Termination. The Secured Party may file a Termination Statement, and certify the Termination Statement Time as the then current time. Clause: Release Escrow. The Filing Office may, if the Termination Statement is filed, return the Digital Asset Collateral to the Debtor. Clause: Release Reminder Fee. The Filing Office may, if the Termination Statement is filed, return the Reminder Fee to the Secured Party. Clause: Termination Period. "Termination Period" is defined as 365 days after the Termination Statement Time. Clause: Terminate and Clear. The Filing Office may, if the Termination Period has passed, terminate this contract.

↑ Lexon code for the UCC Financial Statement as proposed by Asst. Prof. Carla L. Reyes in her article, “Creating Cryptolaw for the Uniform Commercial Code,” forthcoming in volume 78 of the Washington & Lee Law Review (2021).

This is the Javascript program that the Lexon compiler creates from above code:

Javascript Result

/* Lexon-generated Javascript code: UCC Financing Statement file: statement.lex code tagged: 0.2.12 compiler: lexon 0.3 alpha 60 grammar: 0.2.18.59 / subset 0.3.7 alpha 59 - English / Reyes backend: javascript 0.3.60 target: node 14.1+ parameters: --javascript --all-auxiliaries INSTRUCTIONS FOR USE: Execute this program using node. Replace the <parameters> with literal values. Running this program as-is requires beginners programmer knowledge. This phase is yet not covered by lexon's mission to make code readable and useful for non-coders. In the future, an interface will be generated to complete this last mile. However, embedding this code into a self-explanatory user interface is a straight forward task for a full-stack programmer. Note that the instructions below reflect your lexon code as well as the parameters used during compilation of the code: different functions and parameters will result from different input. Some functions are 'built-in' but only appear when needed as per compiled-in features – a list of which is available with lexon -h. The functions are not given in a specific order of execution but as listed in the lexon source. These node modules have to be installed once: $ npm install serialize-javascript $ npm install tar $ npm install nodemailer $ npm install prompt-sync Parameters below are marked with double angle brackets << >> for the respective required caller. If the role is defined earlier, it can only be performed by this person. (But remember that this entire setup is trustful: anyone can manipulate anything about this contract. Though they cannot sign it or change the signed log.) If the role is not defined earlier, the call makes the role be assigned to the person named for the call. Some functions can be called without naming a caller. Some clauses of the original lexon source will not appear below. Namely, those that have no permission phrase, wherefore they are regarded as internal. The main contract system is initialized by loading the module and instantiating: $ node > contract = require("./statement.jsx"); > statement = new contract(<<filer>>, <filing_office>, <debtor>, <secured_party>, <collateral>); Remember to reset node's module cache each time you edit and recompile your code: > delete require.cache[require.resolve('./statement.jsx')]; These are the state progress functions that allow to interact with the contract: > statement.certify(<<filing_office>>, <file_number>) > statement.set_file_date(<<filing_office>>) > statement.set_lapse(<<filing_office>>, <lapse_date>) > statement.set_continuation_start(<<filing_office>>, <continuation_window_start>) > statement.pay_fee(<<secured_party>>, <reminder_fee>) > statement.notice(<<filing_office>>, <notification_statement>) > statement.notify(<<filing_office>>) > statement.pay_escrow_in(<<debtor>>, <digital_asset_collateral>) > statement.fail_to_pay(<<secured_party>>) > statement.take_possession(<<filing_office>>) > statement.file_continuation(<<secured_party>>, <continuation_statement>) > statement.set_continuation_lapse(<<filing_office>>, <continuation_statement_date>) > statement.file_termination(<<secured_party>>, <termination_statement>) > statement.release_escrow(<<filing_office>>) > statement.release_reminder_fee(<<filing_office>>) > statement.termination_period() > statement.terminate_and_clear(<<filing_office>>) state changes of the contract can be listed, e.g. actions performed by a party to it, or agents who are assigned privileges. In case hash chains or signatures are used, they are visible in this log. The log is stored in in the file 'log'. > statement.history() The complete contract state can be saved to disk and re-loaded at a later point in time. This serves to continue work after stopping and restarting node; or to send the entire contract system and its current state - which can include hashes and signatures - to another party, who may perform the next steps. > statement.persist() > statement.load() The contract code, state and log can be bundled into one file to exchange or archive it: > statement.bundle() > statement.unbundle() The contract code, state and log can be sent to a counterparty. This requires configuring an email account in the file 'config'. > statement.send() Keys for signing log entries are expected on-file, by default named after the actor, with the extension .key. For demo purposes, key files can be created using this utility function: > system.create_key(name, passphrase) */ var fs = require('fs'); var crypto = require('crypto'); var serialize = require('serialize-javascript'); var prompt = require('prompt-sync')(); var tar = require('tar'); var nodemailer = require('nodemailer'); var last_caller; var last_passphrase; /** ** ** Main UCC Financing Statement contract system ** **/ module.exports = class UCCFinancingStatement { constructor(filer, filing_office, debtor, secured_party, collateral) { /* object members: skip for restoring serialized object */ if(typeof filer !== 'undefined') { this.financing_statement = null; this.file_number = null; this.initial_statement_date = null; this.filer = filer; this.debtor = debtor; this.secured_party = secured_party; this.filing_office = filing_office; this.collateral = collateral; this.digital_asset_collateral = null; this.reminder_fee = null; this.continuation_window_start = null; this.continuation_statement_date = null; this.continuation_statement_filing_number = null; this.lapse_date = null; this.default_ = null; this.continuation_statement = null; this.termination_statement = null; this.termination_statement_time = null; this.notification_statement = null; this.logname = 'log'; /* start log - overwrites previous by same name */ fs.writeFileSync(this.logname, "Lexon log " + (new Date).toLocaleString('en-US') + "\n", ()=>{}); this.log(filer, "✓ Filing Office fixed"); this.log(filer, "✓ Debtor fixed"); this.log(filer, "✓ Secured Party fixed"); this.log(filer, "✓ Collateral fixed"); } /* restore object from file (must be below class definition) */ if(typeof filer === 'undefined') { console.log("> restore from file 'state'"); var data = fs.readFileSync('state', ()=>{}); var live = eval('(' + data + ')'); Object.assign(this, live); } } /* Certify clause */ certify(caller, file_number) { if(caller == this.filing_office) { this.file_number = file_number; this.log(caller, "✓ File Number certified"); } else { return 'not permitted.'; } return 'done.'; } /* Set File Date clause */ set_file_date(caller) { if(caller == this.filing_office) { this.initial_statement_date = Date.now(); this.log(caller, "✓ Initial Statement Date fixed"); } else { return 'not permitted.'; } return 'done.'; } /* Set Lapse clause */ set_lapse(caller, lapse_date) { if(caller == this.filing_office) { this.lapse_date = lapse_date; this.log(caller, "✓ Lapse Date fixed"); } else { return 'not permitted.'; } return 'done.'; } /* Set Continuation Start clause */ set_continuation_start(caller, continuation_window_start) { if(caller == this.filing_office) { this.continuation_window_start = continuation_window_start; this.log(caller, "✓ Continuation Window Start fixed"); } else { return 'not permitted.'; } return 'done.'; } /* Pay Fee clause */ pay_fee(caller, reminder_fee) { if(caller == this.secured_party) { this.reminder_fee = reminder_fee; this._pay(caller, this.secured_party, 'escrow', reminder_fee); } else { return 'not permitted.'; } return 'done.'; } /* Notice clause */ notice(caller, notification_statement) { if(caller == this.filing_office) { this.notification_statement = notification_statement; this.log(caller, "✓ Notification Statement fixed"); } else { return 'not permitted.'; } return 'done.'; } /* Notify clause */ notify(caller) { if(caller == this.filing_office) { if(this.continuation_window_start <= Date.now()) { this_send(caller, this.filing_office, this.secured_party, this.notification_statement); } } else { return 'not permitted.'; } return 'done.'; } /* Pay Escrow In clause */ pay_escrow_in(caller, digital_asset_collateral) { if(caller == this.debtor) { this.digital_asset_collateral = digital_asset_collateral; this._pay(caller, this.debtor, 'escrow', digital_asset_collateral); } else { return 'not permitted.'; } return 'done.'; } /* Fail to Pay clause */ fail_to_pay(caller) { if(caller == this.secured_party) { this.default_ = true; this.log(caller, "✓ Default declared"); } else { return 'not permitted.'; } return 'done.'; } /* Take Possession clause */ take_possession(caller) { if(caller == this.filing_office) { if((this.default_ != null)) { this._pay(caller, this.filing_office, this.secured_party, this.digital_asset_collateral); } } else { return 'not permitted.'; } return 'done.'; } /* File Continuation clause */ file_continuation(caller, continuation_statement) { if(caller == this.secured_party) { this.continuation_statement = continuation_statement; this.log(caller, "✓ Continuation Statement filed"); } else { return 'not permitted.'; } return 'done.'; } /* Set Continuation Lapse clause */ set_continuation_lapse(caller, continuation_statement_date) { if(caller == this.filing_office) { if((this.continuation_statement != null)) { this.continuation_statement_date = continuation_statement_date; this.log(caller, "✓ Continuation Statement Date fixed"); } } else { return 'not permitted.'; } return 'done.'; } /* File Termination clause */ file_termination(caller, termination_statement) { if(caller == this.secured_party) { this.termination_statement = termination_statement; this.log(caller, "✓ Termination Statement filed"); this.termination_statement_time = Date.now(); this.log(caller, "✓ Termination Statement Time certified"); } else { return 'not permitted.'; } return 'done.'; } /* Release Escrow clause */ release_escrow(caller) { if(caller == this.filing_office) { if((this.termination_statement != null)) { this._pay(caller, this.filing_office, this.debtor, this.digital_asset_collateral); } } else { return 'not permitted.'; } return 'done.'; } /* Release Reminder Fee clause */ release_reminder_fee(caller) { if(caller == this.filing_office) { if((this.termination_statement != null)) { this._pay(caller, this.filing_office, this.secured_party, this.reminder_fee); } } else { return 'not permitted.'; } return 'done.'; } /* Termination Period clause */ termination_period() { return (this.termination_statement_time + (365 * 86400000)); } /* Terminate and Clear clause */ terminate_and_clear(caller) { if(caller == this.filing_office) { if(this.termination_period() <= Date.now()) { this.termination(caller); } } else { return 'not permitted.'; } return 'done.'; } /* built-in convenience function to view state change log. */ history() { fs.readFile(this.logname, (e,d)=>{console.log(d.toString())}); } /* built-in serialization and storage of entire contract system state. */ persist() { console.log('> persisting'); var data = serialize(this, {space: 4}); fs.writeFileSync('state', data, ()=>{}); } /* re-instate entire contract system from serialized file store */ static load() { return new UCCFinancingStatement(); } /* built-in tar-balling of code, log and state. */ bundle() { console.log('> bundling into contract.tgz'); tar.create({gzip:true, file:'contract.tgz'}, ['statement.lex', 'statement.jsx', 'state', 'log', 'INSTRUCTIONS.TXT']); } /* built-in untar-balling of code, log and state. */ static unbundle() { console.log('> unbundling contract.tgz'); tar.extract('contract.tgz'); } /* built-in email sending of code, log and state. */ send() { this.persist(); this.bundle(); console.log('> sending via email'); var receiver = prompt('enter receiver address: '); var config = fs.readFileSync('config', ()=>{}); var email = eval('(' + config + ')').email; console.log(email); var transporter = nodemailer.createTransport({ service: email.service, auth: { user: email.user, pass: email.pass }}); var mailOptions = { from: email.from, to: receiver, subject: email.subject, text: email.text, attachments: { path: './contract.tgz', contentType: 'application/gzip' }}; transporter.sendMail(mailOptions, function(error, info){ if (error) { console.log(error); } else { console.log('> email sent: ' + info.response); }}); } /* built-in termination of the entire contract system */ termination(caller) { this.terminated = true; this.log(caller, '■ contract system terminated'); } already_terminated() { if(!this.terminated) return false; console.log('✕ contract system previously terminated'); return true; } /* built-in logging of state changes. */ log(caller, msg) { console.log(msg); let stamp = (new Date()).toLocaleString('en-US'); var entry = `⌽ ${stamp} ✦ ${caller} ${msg}`; var passphrase = this.sync_passphrase(caller); var pem = fs.readFileSync(caller + '.key'); var key = pem.toString('ascii'); var sign = crypto.createSign('RSA-SHA256'); sign.update(entry); var sig = sign.sign({ key: key, passphrase: passphrase }, 'hex'); fs.appendFileSync(this.logname, `${entry} ❈ ${sig}\n`); let pay = fs.readFileSync(this.logname); let hash = crypto.createHash('sha256').update(pay); fs.appendFileSync(this.logname, '⧉ ' + hash.digest('hex').substr(0, 12) + " "); } /* built-in password query for private key file, with cache. */ sync_passphrase(caller) { if(!caller) process.exit('no caller information'); if(caller == last_caller) return last_passphrase; last_caller = caller; return last_passphrase = prompt('enter pass phrase for ' + caller + ': ', {echo: ''}); } /* built-in convenience function to create keys for users. */ static create_key(name, passphrase) { const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', { modulusLength: 2048, publicKeyEncoding: { type: 'spki', format: 'pem' }, privateKeyEncoding: { type: 'pkcs8', format: 'pem', cipher: 'aes-256-cbc', passphrase: passphrase }}); fs.writeFileSync(name+'.key', privateKey); fs.writeFileSync(name+'.pub', publicKey); return true; } /* built-in pay message */ _pay(caller, from, to, amount) { this.log(caller, `➠ system message: pay ${amount} from ${from} to ${to}.`); } /* built-in send message */ _send(caller, from, to, message) { this.log(caller, `➠ system message: send message «${message}» from ${from} to ${to}.`); } } /* end */

↑ Javascript output from the Lexon compiler.

The following shows test input to perform the individual functions of the API that is exposed by the javascript code.

Testing the Javascript Code

$ node > contract = require("./statement.jsx"); [Function: UCCFinancingStatement] > statement = new contract("FILER", "OFFICE", "DEBTOR", "BANK", "TRACTOR"); ✓ Filing Office fixed enter pass phrase for FILER: ✓ Debtor fixed ✓ Secured Party fixed ✓ Collateral fixed UCCFinancingStatement { financing_statement: null, file_number: null, initial_statement_date: null, filer: 'FILER', debtor: 'DEBTOR', secured_party: 'BANK', filing_office: 'OFFICE', collateral: 'TRACTOR', digital_asset_collateral: null, reminder_fee: null, continuation_window_start: null, continuation_statement_date: null, continuation_statement_filing_number: null, lapse_date: null, default_: null, continuation_statement: null, termination_statement: null, termination_statement_time: null, notification_statement: null, logname: 'log' } > statement.certify("OFFICE", "FN-890"); ✓ File Number certified enter pass phrase for OFFICE: 'done.' > statement.set_file_date("OFFICE"); ✓ Initial Statement Date fixed 'done.' > statement.set_lapse("OFFICE", new Date("4/1/25")); ✓ Lapse Date fixed 'done.' > statement.set_continuation_start("OFFICE", new Date("4/1/24")); ✓ Continuation Window Start fixed 'done.' > statement.pay_fee("BANK", 2000); ➠ system message: pay 2000 from BANK to escrow. enter pass phrase for BANK: 'done.' > statement.notice("OFFICE", "be notified!"); ✓ Notification Statement fixed enter pass phrase for OFFICE: 'done.' > statement.notify("OFFICE"); 'done.' > statement.pay_escrow_in("DEBTOR", 1000000); ➠ system message: pay 1000000 from DEBTOR to escrow. enter pass phrase for DEBTOR: 'done.' > statement.fail_to_pay("BANK"); ✓ Default declared enter pass phrase for BANK: 'done.' > statement.take_possession("OFFICE"); ➠ system message: pay 1000000 from OFFICE to BANK. enter pass phrase for OFFICE: 'done.' > statement.file_continuation("BANK", "continue!"); ✓ Continuation Statement filed enter pass phrase for BANK: 'done.' > statement.set_continuation_lapse("OFFICE", new Date("4/1/21")); ✓ Continuation Statement Date fixed enter pass phrase for OFFICE: 'done.' > statement.file_termination("BANK", "terminate!"); ✓ Termination Statement filed enter pass phrase for BANK: ✓ Termination Statement Time certified 'done.' > statement.release_escrow("OFFICE"); ➠ system message: pay 1000000 from OFFICE to DEBTOR. enter pass phrase for OFFICE: 'done.' > statement.release_reminder_fee("OFFICE"); ➠ system message: pay 2000 from OFFICE to BANK. 'done.' > statement.terminate_and_clear("OFFICE"); 'done.' >

↑ Testing the Javascript API in the Console

The following is the signed log that is created as a result of this test.

The Test Log

Lexon log 3/22/2021, 1:34:19 AM ⌽ 3/22/2021, 1:34:19 AM ✦ FILER ✓ Filing Office fixed ❈ 5a22046438c33aa138fd44486c137655c37d46f3b6bbdac166d6daae7cf3abf6fcc94f030dbc6f3f95ce8a5c5609202dd3728676b84e538c9bfd47fe3c0e595dd26f0e0ac1c3f1691ada598cef4e299d0b60191c9128ca74aa66594e6acba5ffe57016798ccb9ad177c666199dbd1707f0b18a3fa2777f66538596f28bedfb05539baf2e4f72302958b5557d42c030cc1111fb799c2bae2fe3326d98479f5fda1465a87a1d7bcc2792142d49aedc4ea7eb354d5c07af89821d54d3af163358b70765b55e187cd9c15102b2ebffef1b234f3e9776c4c0b367992a112ee6fd3ee4c650c9bc80b423cd25dbc0b2ac0ada01c18b8c972ea5807ccc4821463bbf421b ⧉ ced930bc47be ⌽ 3/22/2021, 1:34:22 AM ✦ FILER ✓ Debtor fixed ❈ 098c119ecde9f2d87ef2e78ba2fb6dfd2a35234b7be8c7f1caa3d2398e0a78f88a9a138b3ecf6b3bd002710cc949168cedc5054485dd0c8c473ac879d1cb9fdc1528a8120edb8f1dafa3d4bc945f18bccf8f2d5d4fcbdce3d47c68b51509e9c29e5f772343d0b54087e4045d1f9a03da2cad56e0bd4427ed54e30b59aced9371d30f99bee4980d54df40b97fa64465b0c46e471e280795b61de937d8c5af9e93f961f2ecb0e3588abad12db1b2e7aac73a13e919325f595563089b1b615df0d4a78643d01ebe4968f195f61191737e7fb7af6a7f06297ead727bcd9251fa4985a978d9a02df047192e6ca7671157907e29265e433710298294571493001df5e1 ⧉ eb5c28b69b4b ⌽ 3/22/2021, 1:34:22 AM ✦ FILER ✓ Secured Party fixed ❈ 5b89a88bfec5fcac46cbfb3b541a408ad4160c52e95d5dd51006cbdb3f0603d1850a1cc0853dcb4245b047e626ae4b99704fd0a75c09c1bc4c539b0b631f5862a3275599006e4436e65f76a013b62204b63d5747882180faa98884b5b1a0a8930bd0e6a5339be7b5fcd148d690c840e18c60d8092c88ed8e0387cff5cb0a25cb0ed8ea90cca7fed2425aa830add7b4c8f4164476fd0f19cbadee4d7dd7b0d2c76bf533023298143282e43a9e6af14a5e11c69812e78cad9e43d53d58f0281c2a8e180dd2c3b6ae3a851e38dded02c1be6c144a40399d3beb9d66ae4d8a0654bc1c4d94243fcf347a675fdfebab024d0e7951407817f8678c87c42c612804c57f ⧉ f3b21bde6076 ⌽ 3/22/2021, 1:34:22 AM ✦ FILER ✓ Collateral fixed ❈ 6ff7ab169e49f2f574c7f13497a0c134eb5987476a6fcc35515b60775cdaef75afa1bcdae06be7965921cf36da228aec1b195f21b4696249d327a6799efca1d5dd176ec95050407de40427dbdf5af8a6d4a6e9eb88271717c51d7cded996fc931be7e1c932716c26ee3cfbb2281579061342c9101e4bf66974ad85e36c6dcca156fd1c6040f5f2925e4ae77e3b9b2c8c7644020f86971d958600b8a17e2385f6d5d8c3c505f649d1a97852116869f2bca53fa172f63d05b88eda1f312620bab5a90bf35334dc4a3890f737a7ad950791e1c49eeabd5b64c51a3a6046cada2421e18726643bbff3a7fe63ce18b15af0332972635caecac4bafc0659d4f71d3675 ⧉ 448d9a8e7ba5 ⌽ 3/22/2021, 1:35:12 AM ✦ OFFICE ✓ File Number certified ❈ 6d41057ea47910a576a0c2a686fdf73855b581199476309d90a207fdc3a8da70ac9bb71ab3bc5e2f9a2fc368305a6f4bb14dee00e590e7dd5265c0ef847e8f9f5a9f7352f55eed0eb2a9a62365d344df646240cf4cfcde1cc75c85b8a26b2d18b66908089372e3f5ba8e09117d4aa07cc54d105ffa37a8f623814040b145821530c75cdea45a440e00960bbc5f11875132d1d603723fa28fa0415cb709bee6d0c75b1b390d07545614abdb111434970b5ebb43c974ebcfaf840a7424d6109c5bb1905e4bb0faf4ebdb5a98ee93f5783f6732fb2e720dd52a9b6095c8547570224c57128ba2487c5443a3b888b6e03d63c771250ecbc0b09f64bb47de04f90499 ⧉ caaa3095898b ⌽ 3/22/2021, 1:35:28 AM ✦ OFFICE ✓ Initial Statement Date fixed ❈ 3c444e5d473349ebe33471a0409d87567eff9fa4eae1171e8fa24dd2fb0708f2275a2706a141c16970aaed96b9d6adef16dbc70c81708b2b4d16035e77bf550d6f93d12d4367b3724b4d81ce66f519a351b15a9b656c176b2abba539b277f0dc747544b59397d01f7301327252e22a298a3cd22a6d31073b762e243d6a4332249384ea3c492dfbacef5be0efe34f26413876f2977f4c2a3249c5a44cd11ad62814dda2ab365413fe4d0483d1f069a6e27bf661f2a123b20470bd0f0bcbde699a292b90e8beffc557ba391f8cebc5b7ef851bbb4dced5364a573fd0ceed306a05cf742fe7492297365b61304fa511f7d069b0be6f3bc046cfb71a151b726f680a ⧉ cf770ab8947d ⌽ 3/22/2021, 1:35:49 AM ✦ OFFICE ✓ Lapse Date fixed ❈ 6107eff31587d8a1d75b0923ed71469bba40181bd8852703ea8f237d2185acbdee5b3052716537cd3b8c1a7382ec171783c324a3467e2ebc937b580d41fbffbb78ab0e100c29afabdccd7dda0a3985159f74cee3387c50d0834a801d82a93e648a91aac1203cd7a4ab9b45b4f3c5b21313a9199d75b160f371ea4fdf1a577d411859c2dc33355af1f0544906d679b41a989b90bd2248a6c81758dc4a345f6fdd08449c44b0666e721b5948bbe770e9c31a8574d3a1fb50959452fdff90989dca3c44e0ff6526926099e70af07cca72f840c2ba01d3d36f894d5ca7af491d0a0a3169c50f95fb4438ed17871c9034a275139c64574c3528b8e54e66e5d6e67547 ⧉ 855af379bb9d ⌽ 3/22/2021, 1:36:09 AM ✦ OFFICE ✓ Continuation Window Start fixed ❈ 826800db0dfafbab131cc28a7c11758dec406d531d4efb8903d2e1fc6b48acae5ba61477df915575ad216b23636d95b9092280971688321c8f5eea960b09d88d7a376dce662a437afbaed8724b17a82f7b7d169a24e8e0bace851c799fe3e119f2e9e886298dc347ee7293b44d3ff7bda6e076d7852e8cc4dc034ed4cfef0f80185aad8c2c99b7150ff9d3d477205d37d6f514ed0eeccbd2118f5bc64e822670067ba2b2341927c36f7af3a19a654ad0be25bf47ef412ee0a36b4c447dc3259417f2ade19486f76d5e0d50a1a3ebdd9b32be1e1f140c6c87a4a1d08fb6e628c1508dfed3f4d342904935872aa25a3cc5d82012f00718176fd873d653308fee48 ⧉ 53ee26f9751b ⌽ 3/22/2021, 1:36:23 AM ✦ BANK ➠ system message: pay 2000 from BANK to escrow. ❈ c3a9139c3078c2d328e0e0266e419cd54995e9961cd2739f743f2e9171d2b31e174ef6d2b628f6690f41383787fbb947040c338a72921ac3b2993b134be2c7ab8853ab2a5c22f512e93edc3d98a81c0687e43d3b976a873e5d8aab872c5eb111161851123a78bfb44a1177c8e0a4e57642df0049c6e2f1c23e19609a1b31c609bc1de2f6834b4a2aa58705b9cba88b41f72bba5ee21b62267126427acbd34befc49d7b397dad9a82e6f4e256cbc9e4db9e782415c95a4424adc666b3f52c9a7c3523600a46c130a75aee72de65dd1f5d440218b6d7df4b9fe3cee56b76556814f78dede6f09a3366322b70d8aea4b346af75fe4ad6aff68d510702b297f1b262 ⧉ b257faa754c6 ⌽ 3/22/2021, 1:36:54 AM ✦ OFFICE ✓ Notification Statement fixed ❈ a196b1457e744cf23f4056c4969482ce03ffc8ff8efa7513a628cc78a1f3e980075aada766bb095576b8cabc99e5ff380ebcb2440418fa1d4125b326eabf55acaaf4bcd1bf691ef435a41f56061464d9c160761a8e012957989fb720f631073ef7de0ac0e156bb304b1e338e19ce2b3c07ac94b2a857731152014cdb4395fc5bd9f12a7a7cd5869691cba78c4d5e6c9ee292f2cb6855e19bb05b86cb946709b4a56a62bc74d013c016c01df36e5090835c3218805293059400daec10393ab3d88673c28a45da0f0a5f14e060349a20e11f28151581ca0c1ae7109b39545274cf64301fbc3f6ff455af98abdd6a3ecd8335448b5b5289634097346626f78ef4a8 ⧉ 7d6f58530ba4 ⌽ 3/22/2021, 1:37:27 AM ✦ DEBTOR ➠ system message: pay 1000000 from DEBTOR to escrow. ❈ 12e97fab5410ef23c3dcae501057bd67c1f132bf985b6d4e670b242302255beb8020ae869b64aa4986d300b2fe7b4ede4dc2a8025db8df7dd912b3c22d7e91b429da93181f4dd24d37d24178126188b745059bd855d9a4bfc2f8a9fd608cab39796e13c8d81a89b1d8aa19f814c9732d71c93272ccc58a245cf11b261aa075169ecb1632dae407ddf3685a94afa37b8884dce5aff756c8837dc31e05b83194419d5b8a5bf3450d8572e9481b6b74cd063d1597c0bddd798fd64f636942d5f129ac61bd46a945c27f9dda81cd1fbe3ac536308a6f5e649a32f770e5274bc004755034276e5da40917bf56bf95b678f49e1d3d9a093581b18ac4d26aaf72fd75c1 ⧉ 68377e2cbe6b ⌽ 3/22/2021, 1:37:52 AM ✦ BANK ✓ Default declared ❈ 822847a595e837b90d10b56524694e8d567cec1fe0fb4a842724c84d3e9d214a321f62295da9c332135a582fd7cd6fadb27f3e1fc61bf9b4b234ad562ac4aca532880b870071165c66bb9bf88e2f832a5d52fdc3b49939e5eedf17c3978886b8bd7fa522f50fabe52992578a3b6a7775aa7dd567890fde28662acfc1bc48866fc8a288cd687629075a06b5c18e41907f231ced502b49109b331ff186201d7fc1229e541b371f0e9dffc2c1286bf37150bfd92999bf81e6f76ac90f2925886fadb6fd71cce276adbd20aa9b6338ead9ddc425168f8bb6bd8f7009ddf46fe3feec2773a705c8bb23dff7cf114367dd06692941e11ff2784adb73525d5680b51eba ⧉ d9d6fabd064f ⌽ 3/22/2021, 1:38:17 AM ✦ OFFICE ➠ system message: pay 1000000 from OFFICE to BANK. ❈ 333638c8e23800b26ac325151705b4d569c935b2e2a2e3b5e8a5e71b1a6ac55a7019b90cef57d670fe8aed60fe05c108f84258663ed6e8e63f79537ee50bf483d97ff110eb3f9f50868306a068bea53a96b1a0e837963bd1cd423582cfcc0fba4124ad9066a77570ee0204139d2704c09f14de5bd98bd70e3aa04b97dfa82ceeb24f77a460f82f7a382e789ea5f3e24f87d4848a55ddd77e45b09cd578773b1fc083c2c8ba0f51ae9bbb67d1174417b32236d8fa26c5dffae4336d4bde93e669fc8f646a0fa928dede06f5b956321b90b1993e20741bb09fd1f4e80997cc365c916240aab947097910201ae63799cb40bc8fd880e2828b16b80fbcdcd2cad219 ⧉ 6a7aa4957b54 ⌽ 3/22/2021, 1:38:45 AM ✦ BANK ✓ Continuation Statement filed ❈ a73d6242e66821fa53d3e183cafbe3dadf4717cc6a57f5ce1374ad09c40cf0977738498063c79b88454a71952cf3a3d3f006ceb53931435595639e7f2fe7b76f800aeff7a84adbbd4a11051c55ee8ee24dcd6424f8a9147d2f8361b60faf15131e77ef9ccf0312eb45e38e31be30d589e48b125382978254afe5f19ee8536a14d022df2341b116c8f98b35a7abae243607c7e3b0a4ff107b9bc8454155fa583448e430dbf90979343bc5069f77941cadb40559460849927853fc78baa52d841a0dbabd9a710481c06715f3b022710ce1c516f77af9cbb54e9299cde68a6e04541701be6424841938efcfac560e45ba81f86a1e2331c06e629e4686dbadf88258 ⧉ 36814fa38029 ⌽ 3/22/2021, 1:39:12 AM ✦ OFFICE ✓ Continuation Statement Date fixed ❈ 50c84962be3906a7fb9916df6bb69ac1dc318d93c8ece8a8076cc697c428845fe1c3cd80cc874385670eb82705309b7966c0791ca962c619ce5e54c3e2a5a2d120d81c3afd8fa4abd69430ab8106404659b2b07e510ae60aa3cf21108a103f1e82d656cf23457e0ed18d33e8967eb3637e9c75815f294ce31021b3d53d47e4be47aa335a7fca701977380a8ea4b68699709a95b0635d6e7b7ef04e24a75f46a97104fc8c19b9bba5fe2f3daff91705274f5659f23cf5daf98e2f0a137d2d1335aacc7256ee4784f97654e6eed4dbb0af3f0de1d57aa542d57963ef72fd18741dddf8a29fc208adad9fc69b92c081b9cef341289e484bd8968abc81037c26a3ed ⧉ 1ef12353c3b7 ⌽ 3/22/2021, 1:39:33 AM ✦ BANK ✓ Termination Statement filed ❈ 3af03a1e76f96d1f39c3badf50fb80b20e953e062ae9cc167d78ee25e93e6a4b5b10cb3d434fac8dca52ecf61d1e2c01a2fdef1c01f204739f2d37880e38b3bab5c44fb64241d39095805a0f9a09e36841fe059302db6e6899da36f87cefd3de82901d267c0defd42dca9daf5f0b2f972d1716399d32e9404760efe89425f0d097c98c193c6e5dea7b6e310a8579536d5337123830bf186a9e860c7c76b115f58a1cb37e8a63e95462e8f6769e96a53d77e0bd1b352334597c8faddc36b86d08a63c2bd1d7bebca12998cdaf3aa77adfbb1a6e8f1da4b29b5d0246793dccfe201ed1a0be6f6ca3f11c09c7f289a77f3a76981050c30e1d5ae2b732b430779dec ⧉ b64ba51f1735 ⌽ 3/22/2021, 1:39:44 AM ✦ BANK ✓ Termination Statement Time certified ❈ 23c1d52d3b6645e5dddaaabb0f1f5d64ce4bfe53d62788aae4ebeacddaea512d09d18051ba19fa45a447dd92290d48205b928c1906b0671e33d58006084ff0c76a7a825edc1542831e2967f00dd69cbe5ed4859ae5679ad01d80ed2de60b76a80e527e9a4b1d6966b45a0f7b3ede6759e1e62cb52430658d85fd3deb34077615750f5c7443b77c4d9ac8587a11d1c109d72984793c86f060112b3f00b6bab8d0dfa99f2687b959ea1acae04912851305f95d623058bd1ebbaaa86ec40d8ab8f38fd9b12e3173e531ec340681626307f9d007538c2ca70fbec0371eee3ce8bc465d9dd9d8822fda476a3a3b9b3bb7a0e23422673554eede4134cabed123b11074 ⧉ c34956bbc828 ⌽ 3/22/2021, 1:39:57 AM ✦ OFFICE ➠ system message: pay 1000000 from OFFICE to DEBTOR. ❈ 6ca8ba16c431be38ce044f5267c81c014d3e94ca6b062e813491540b0ac8ba15f7c0d4ad778e849a6c9d3b0f55cecdefcf0a488c89f95f59d75b304ad230a337b922509a1b435d65b9121aa7103eef6880424866901a440b6a9900e3d12ad4833d2459cf484ecacd5bd9e2ecf62f744aa01f487650923267643947f6866defc9bb4d28cf84bf8ba3984b55b91e37dd6a9c32f894a61444a7a4a8fab384f22137cb8944c1834a69b8d2076ac32a5746be6da309ed834edd390210681e145c3e282230af6759112e00fe69ced7c61ae544e5e288e5787a22c14c4efa25571acbfef8401639b0b4804ae3ea810aeb8ac6b2be65855af9bc1e1595f95cfcf87cec98 ⧉ 8cd5632c5178 ⌽ 3/22/2021, 1:40:14 AM ✦ OFFICE ➠ system message: pay 2000 from OFFICE to BANK. ❈ 0542d7495b166b469b7e07d6b0ec86749e9fbd93130f912ededc541f5b633b410303d196868d93b0a60ee2fd759fbbae466d321d745d7768b18340b8ee9f407c29d91c2ab6b7caa1ff465e032ee6f973076e15e311afe6616403db36086540fc83fe119e524c3939ce0fa2cd2827c86bc24414af6beef6dd91e91da72eea56e08221734b8c40523312dc519029e86e585d93877a92cd05fd563525f11de2f31982adf57430c26a1f35ee3dbb2d1a950bec8df42cff9ad2675684fd6eb351c3ffbe13ca442c16cf6439b61e5c053d29e232e67f69b4816344ef82aeed25864c09a501339ecebd52bf1969d126fddb56b7ad615fba41a36dd00b628b7fba24d51b

↑ Testing the Javascript API in the Console

About Lexon

Lexon merges law and automation. The legal and the program text are one.

⇨ Web.

⇨ Book.

⇨ Whitepaper.

⇨ Compiler