PageSourceSearch

https://docs.idena.io/assets/js/56b1ba71.8faffe09.js

js idena.io collected 2026-10-02 06:08:13 UTC 21,489 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkidena_docs=self.webpackChunkidena_docs||[]).push([[3057],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>u});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var d=a.createContext({}),s=function(e){var t=a.useContext(d),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=s(e.components);return a.createElement(d.Provider,{value:t},e.children)},m="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,d=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),m=s(n),h=r,u=m["".concat(d,".").concat(h)]||m[h]||p[h]||o;return n?a.createElement(u,i(i({ref:t},c),{},{components:n})):a.createElement(u,i({ref:t},c))}));function u(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=h;var l={};for(var d in t)hasOwnProperty.call(t,d)&&(l[d]=t[d]);l.originalType=e,l[m]="string"==typeof e?e:r,i[1]=l;for(var s=2;s<o;s++)i[s]=n[s];return a.createElement.apply(null,i)}return a.createElement.apply(null,n)}h.displayName="MDXCreateElement"},4475:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var a=n(7462),r=(n(7294),n(3905));const o={hide_title:!0,title:"RefundableOracleLock smart contract",sidebar_label:"RefundableOracleLock"},i="RefundableOracleLock",l={unversionedId:"developer/node/refundable-oracle-lock",id:"developer/node/refundable-oracle-lock",title:"RefundableOracleLock smart contract",description:"The smart contract blocks iDNA deposited by multiple users until a decision is made by oracles. It works similarly to OracleLock: if the voting result matches the expected value, coins are transferred to address A (if specified), otherwise to address B (if specified). However, a refund is provided to all users if the destination address A or B is not specified or oracle voting fails to reach a consensus. The amount of the refund is equal to the initial deposit or proportional to the initial deposit if the RefundableOracleLock address has been funded additionally.",source:"@site/docs/developer/node/refundable-oracle-lock.md",sourceDirName:"developer/node",slug:"/developer/node/refundable-oracle-lock",permalink:"/docs/developer/node/refundable-oracle-lock",draft:!1,editUrl:"https://github.com/idena-network/idena-docs/edit/main/docs/developer/node/refundable-oracle-lock.md",tags:[],version:"current",frontMatter:{hide_title:!0,title:"RefundableOracleLock smart contract",sidebar_label:"RefundableOracleLock"},sidebar:"developer",previous:{title:"OracleLock",permalink:"/docs/developer/node/oracle-lock"},next:{title:"Multisig M-of-N",permalink:"/docs/developer/node/multisig"}},d={},s=[{value:"Use case 1",id:"use-case-1",level:2},{value:"Use case 2 (prediction market)",id:"use-case-2-prediction-market",level:2},{value:"Smart contract data",id:"smart-contract-data",level:2},{value:"Methods",id:"methods",level:2},{value:"<code>contract_deploy</code> and <code>contract_estimateDeploy</code> methods",id:"contract_deploy-and-contract_estimatedeploy-methods",level:3},{value:"<code>deposit</code> method",id:"deposit-method",level:3},{value:"<code>push</code> method",id:"push-method",level:3},{value:"<code>refund</code> method",id:"refund-method",level:3},{value:"<code>terminate</code> method",id:"terminate-method",level:3}],c={toc:s},m="wrapper";
1function p(e){let{components:t,...n}=e;return(0,r.kt)(m,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"refundableoraclelock"},"RefundableOracleLock"),(0,r.kt)("p",null,"The smart contract blocks ",(0,r.kt)("inlineCode",{parentName:"p"},"iDNA")," deposited by multiple users until a decision is made by oracles. It works similarly to ",(0,r.kt)("a",{parentName:"p",href:"./oracle-lock"},(0,r.kt)("inlineCode",{parentName:"a"},"OracleLock")),": if the voting result matches the expected value, coins are transferred to address A (if specified), otherwise to address B (if specified). However, a refund is provided to all users if the destination address A or B is not specified or oracle voting fails to reach a consensus. The amount of the refund is equal to the initial deposit or proportional to the initial deposit if the ",(0,r.kt)("inlineCode",{parentName:"p"},"RefundableOracleLock")," address has been funded additionally."),(0,r.kt)("h2",{id:"use-case-1"},"Use case 1"),(0,r.kt)("p",null,"The contractor promises to complete the work by a certain deadline. The community is ready to fund the work. An oracle voting is created so that oracles at some point in the future confirm whether the work is done. Community members fund the work by depositing money from various wallets to ",(0,r.kt)("inlineCode",{parentName:"p"},"RefundableOracleLock"),". If the result of the oracle voting confirms that the work is done, the money is transferred to the contractor. Otherwise, all contributors get a refund."),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://user-images.githubusercontent.com/47352542/105392446-06191680-5c3d-11eb-9759-047e6e2da710.png",alt:"image"})),(0,r.kt)("h2",{id:"use-case-2-prediction-market"},"Use case 2 (prediction market)"),(0,r.kt)("p",null,"An oracle voting is created so that oracles at some point in the future confirm the occurrence or non-occurrence of the event. Bets on the occurrence or non-occurrence of the event are locked on two linked RefundableOracleLock contracts. According to the results of the oracle voting, one of the two contracts will be the RefundableOracleLock-winner and the other will be the RefundableOracleLock-loser.\nAll money locked on the RefundableOracleLock-loser contract is sent to the address of the RefundableOracleLock-winner contract. After that, the money from the RefundableOracleLock-winner is returned to the winning users in the form of a refund in proportion to the bets made."),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://user-images.githubusercontent.com/47352542/105392562-28129900-5c3d-11eb-85c0-402829951a2d.png",alt:"image"})),(0,r.kt)("p",null,"In order to deploy several smart contracts having recursive references to each other see ",(0,r.kt)("a",{parentName:"p",href:"./smart-contracts-methods#smart-contract-address"},"how to calculate the address of the smart contract beforehand"),"."),(0,r.kt)("h2",{id:"smart-contract-data"},"Smart contract data"),(0,r.kt)("p",null,"The following smart contract data can be read using the ",(0,r.kt)("a",{parentName:"p",href:"./smart-contracts-methods#contract_readdata-method"},(0,r.kt)("inlineCode",{parentName:"a"},"contract_readData"))," method:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"oracleVoting")," (hex): oracle voting smart contract address."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"value")," (byte): expected voting result at the ",(0,r.kt)("inlineCode",{parentName:"li"},"oracleVoting")," smart contract address"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"successAddr")," (hex): the destination address for sending the all the locked coins if ",(0,r.kt)("inlineCode",{parentName:"li"},"value")," matches the voting result."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"failAddr")," (hex): the destination address for sending the all locked coins if ",(0,r.kt)("inlineCode",{parentName:"li"},"Value")," does not match the voting result."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"refundDelay")," (uint64): the number of blocks delay since the ",(0,r.kt)("inlineCode",{parentName:"li"},"push")," method was called. Determines when the ",(0,r.kt)("inlineCode",{parentName:"li"},"refund")," method can be called."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"depositDeadline")," (hex): timestamp in seconds. Determines the time until when the ",(0,r.kt)("inlineCode",{parentName:"li"},"deposit")," method can be called."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"factEvidenceFee")," (byte): determines percentage 0..100 of deposited coins that will be sent to the referred ",(0,r.kt)("inlineCode",{parentName:"li"},"OracleVoting")," smart contract when the ",(0,r.kt)("inlineCode",{parentName:"li"},"deposit")," method is called."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"}
1,"state")," (byte): the state of the smart contract (only the ",(0,r.kt)("inlineCode",{parentName:"li"},"push")," method can change the state):",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"1")," - ",(0,r.kt)("inlineCode",{parentName:"li"},"locked"),": the initial state of the smart contract."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"2")," - ",(0,r.kt)("inlineCode",{parentName:"li"},"unlocked_success"),": the result on the ",(0,r.kt)("inlineCode",{parentName:"li"},"OracleVoting")," smart contract matches the expected ",(0,r.kt)("inlineCode",{parentName:"li"},"Value")," and the ",(0,r.kt)("inlineCode",{parentName:"li"},"Success address")," is specified."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"3")," - ",(0,r.kt)("inlineCode",{parentName:"li"},"unlocked_fail"),": the result on the ",(0,r.kt)("inlineCode",{parentName:"li"},"OracleVoting")," smart contract does not match the expected ",(0,r.kt)("inlineCode",{parentName:"li"},"Value")," and the ",(0,r.kt)("inlineCode",{parentName:"li"},"Fail address")," is specified."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"4")," - ",(0,r.kt)("inlineCode",{parentName:"li"},"unlocked_refund")," all other cases."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"sum")," (dna): total sum of deposited coins")),(0,r.kt)("p",null,"The following smart contract array data can be read using the ",(0,r.kt)("a",{parentName:"p",href:"./smart-contracts-methods#contract_iteratemap-method"},(0,r.kt)("inlineCode",{parentName:"a"},"contract_iterateMap"))," and ",(0,r.kt)("a",{parentName:"p",href:"./smart-contracts-methods#contract_readmap-method"},(0,r.kt)("inlineCode",{parentName:"a"},"contract_readMap"))," methods:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"deposits"),": amount of coins deposited by each user")),(0,r.kt)("h2",{id:"methods"},"Methods"),(0,r.kt)("h3",{id:"contract_deploy-and-contract_estimatedeploy-methods"},(0,r.kt)("inlineCode",{parentName:"h3"},"contract_deploy")," and ",(0,r.kt)("inlineCode",{parentName:"h3"},"contract_estimateDeploy")," methods"),(0,r.kt)("p",null,"See static parameters for the methods ",(0,r.kt)("a",{parentName:"p",href:"./smart-contracts-methods#contract_deploy-and-contract_estimatedeploy-methods"},"here"),"."),(0,r.kt)("p",null,"Dynamic ",(0,r.kt)("inlineCode",{parentName:"p"},"args")," parameter:"),(0,r.kt)("ol",{start:0},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"OracleVoting")," (hex): the referred ",(0,r.kt)("inlineCode",{parentName:"li"},"OracleVoting")," smart contract address."),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"Value")," (byte): expected voting result value on the referred ",(0,r.kt)("inlineCode",{parentName:"li"},"OracleVoting")," smart contract (0, 1, 2...)"),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"Success address")," (hex): the destination address for sending the all the locked coins if ",(0,r.kt)("inlineCode",{parentName:"li"},"Value")," matches the voting result. The parameter is not mandatory."),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"Fail address")," (hex): the destination address for sending the all locked coins if ",(0,r.kt)("inlineCode",{parentName:"li"},"Value")," does not match the voting result. The parameter is not mandatory."),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"Refund delay")," (uint64): the number of blocks delay since the ",(0,r.kt)("inlineCode",{parentName:"li"},"push")," method was called. Determines when the ",(0,r.kt)("inlineCode",{parentName:"li"},"refund")," method can be called."),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"Deposit deadline")," (uint64): timestamp in seconds. Determines the time until when the ",(0,r.kt)("inlineCode",{parentName:"li"},"deposit")," method can be called."),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"Oracle voting fee")," (byte): Determines percentage 0..100 of deposited coins that will be sent to the referred ",(0,r.kt)("inlineCode",{parentName:"li"},"OracleVoting")," smart contract when the ",(0,r.kt)("inlineCode",{parentName:"li"},"deposit")," method is called.")),(0,r.kt)("p",null,"Example:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"}
1,'{\n  "method": "contract_deploy",\n  "params": [\n    {\n      "from": "<Address>",\n      "codeHash": "0x03",\n      "amount": 1240,\n      "maxFee": 123,\n      "args": [\n        {\n          "index": 0,\n          "format": "hex",\n          "value": "<OracleVoting smart contract address>"\n        },\n        {\n          "index": 1,\n          "format": "byte",\n          "value": "0"\n        },\n        {\n          "index": 2,\n          "format": "hex",\n          "value": "<Address>"\n        },\n        {\n          "index": 3,\n          "format": "hex",\n          "value": "<Address>"\n        },\n        {\n          "index": 4,\n          "format": "uint64",\n          "value": "4320"\n        },\n        {\n          "index": 5,\n          "format": "uint64",\n          "value": "1611063000"\n        },\n        {\n          "index": 6,\n          "format": "byte",\n          "value": "1"\n        }\n      ]\n    }\n  ],\n  "id": 1,\n  "key": "<api key>"\n}\n')),(0,r.kt)("h3",{id:"deposit-method"},(0,r.kt)("inlineCode",{parentName:"h3"},"deposit")," method"),(0,r.kt)("p",null,"In order to be able to get a refund, users must deposit their coins to the smart contract address by calling the ",(0,r.kt)("inlineCode",{parentName:"p"},"deposit")," method. Otherwise coins cannot be refunded."),(0,r.kt)("p",null,"See static parameters for the ",(0,r.kt)("inlineCode",{parentName:"p"},"call")," method ",(0,r.kt)("a",{parentName:"p",href:"./smart-contracts-methods#contract_call-and-contract_estimatecall-methods"},"here"),"."),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"amount")," transferred in the transaction calling ",(0,r.kt)("inlineCode",{parentName:"p"},"deposit")," method will be recorded in the smart contract for the corresponding sender's address. The sender can call the ",(0,r.kt)("inlineCode",{parentName:"p"},"deposit")," method multiple times. The total sum of the deposited amount will be recorded for the sender's address."),(0,r.kt)("p",null,"A percentage of the deposited coins are automatically sent to the referred ",(0,r.kt)("inlineCode",{parentName:"p"},"OracleVoting")," smart contract address according to the ",(0,r.kt)("inlineCode",{parentName:"p"},"Oracle voting fee")," parameter specified for the ",(0,r.kt)("inlineCode",{parentName:"p"},"RefundableOracleLock")," smart contract."),(0,r.kt)("p",null,"Example:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},'{\n  "method": "contract_call",\n  "params": [\n    {\n      "from": "<Address>",\n      "contract": "<Address>",\n      "method": "deposit",\n      "amount": 1900,\n      "maxFee": 1,\n      "broadcastBlock": 0\n    }\n  ],\n  "id": 1,\n  "key": "<API key>"\n}\n')),(0,r.kt)("h3",{id:"push-method"},(0,r.kt)("inlineCode",{parentName:"h3"},"push")," method"),(0,r.kt)("p",null,"When the voting result becomes known in the referred ",(0,r.kt)("inlineCode",{parentName:"p"},"OracleVoting")," smart contract, then the ",(0,r.kt)("inlineCode",{parentName:"p"},"push")," method can be be called. Otherwise an error will be returned. The ",(0,r.kt)("inlineCode",{parentName:"p"},"push")," method can be called by anyone."),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"push")," returns error if the the the smart contract state is not ",(0,r.kt)("inlineCode",{parentName:"p"},"locked"),". Otherwise the state changes to:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"unlocked_success")," if the result on the ",(0,r.kt)("inlineCode",{parentName:"li"},"OracleVoting")," smart contract matches the expected ",(0,r.kt)("inlineCode",{parentName:"li"},"Value")," and the ",(0,r.kt)("inlineCode",{parentName:"li"},"Success address")," is specified. Coins are sent to the ",(0,r.kt)("inlineCode",{parentName:"li"},"Success address")," automatically."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"unlocked_fail")," if the result on the ",(0,r.kt)("inlineCode",{parentName:"li"},"OracleVoting")," smart contract does not match the expected ",(0,r.kt)("inlineCode",{parentName:"li"},"Value")," and the ",(0,r.kt)("inlineCode",{parentName:"li"},"Fail address")," is specified. Coins are sent to the ",(0,r.kt)("inlineCode",{parentName:"li"},"Fail address")," automatically."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"unlocked_refund")," all the other cases. The method ",(0,r.kt)("inlineCode",{parentName:"li"},"refund")," can be called afterwards.")),(0,r.kt)("p",null,"See static parameters for the ",(0,r.kt)("inlineCode",{parentName:"p"},"call")," method ",(0,r.kt)("a",{parentName:"p",href:"./smart-contracts-methods#contract_call-and-contract_estimatecall-methods"},"here"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"}
1,'{\n  "method": "contract_call",\n  "params": [\n    {\n      "from": "<Address>",\n      "contract": "<Address>",\n      "method": "push",\n      "maxFee": 1\n    }\n  ],\n  "id": 1,\n  "key": "<API key>"\n}\n')),(0,r.kt)("h3",{id:"refund-method"},(0,r.kt)("inlineCode",{parentName:"h3"},"refund")," method"),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"refund")," method can be called only when the state of the smart contract is ",(0,r.kt)("inlineCode",{parentName:"p"},"unlocked_refund")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"Refund delay")," is expired. Otherwise an error will be returned. The ",(0,r.kt)("inlineCode",{parentName:"p"},"refund")," method can be called by anyone."),(0,r.kt)("p",null,"All coins deposited at the ",(0,r.kt)("inlineCode",{parentName:"p"},"RefundableOracleLock")," smart contract are distributed to all addresses who called ",(0,r.kt)("inlineCode",{parentName:"p"},"deposit")," method proportionally to total amount deposited by each address."),(0,r.kt)("p",null,"See static parameters for the ",(0,r.kt)("inlineCode",{parentName:"p"},"call")," method ",(0,r.kt)("a",{parentName:"p",href:"./smart-contracts-methods#contract_call-and-contract_estimatecall-methods"},"here"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},'{\n  "method": "contract_call",\n  "params": [\n    {\n      "from": "<Address>",\n      "contract": "<Address>",\n      "method": "refund",\n      "maxFee": 1\n    }\n  ],\n  "id": 1,\n  "key": "<API key>"\n}\n')),(0,r.kt)("h3",{id:"terminate-method"},(0,r.kt)("inlineCode",{parentName:"h3"},"terminate")," method"),(0,r.kt)("p",null,"See static parameters for the ",(0,r.kt)("inlineCode",{parentName:"p"},"terminate")," method ",(0,r.kt)("a",{parentName:"p",href:"./smart-contracts-methods#contract_terminate-and-contract_estimateterminate-methods"},"here"),"."),(0,r.kt)("p",null,"Dynamic ",(0,r.kt)("inlineCode",{parentName:"p"},"args")," parameter:"),(0,r.kt)("ol",{start:0},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("inlineCode",{parentName:"li"},"Destination address")," (hex): determines the address to which 50% of the staked coins will be transferred.")),(0,r.kt)("p",null,"Example:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},'{\n  "method": "contract_terminate",\n  "params": [\n    {\n      "from": "<Sender address>",\n      "contract": "<Smart contract address>",\n      "maxFee": 1,\n      "args": [\n        {\n          "index": 0,\n          "format": "hex",\n          "value": "<Destination address>"\n        }\n      ]\n    }\n  ],\n  "id": 1,\n  "key": "<api key>"\n}\n')))}p.isMDXComponent=!0}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.