UNPKG

@kazeblockchain/kazejs

Version:

Javascript libraries for Kaze wallet

79 lines (67 loc) 2.23 kB
import { setResultBase, hasChildren } from './StackItemType' import { reverseHex } from '../utils' const determineByteLength = baseLength => { if (baseLength === 'fd') return 2 else if (baseLength === 'fe') return 4 else if (baseLength === 'ff') return 8 } const deserialize = serializedArray => { // Split into bytes of 2 characters const byteArray = serializedArray.match(/.{2}/g) // Initialize under root byte let iterator = -1 let iteratedByte const setIteratedByte = () => { iterator++ iteratedByte = byteArray[iterator] } const stackItemIterator = () => { setIteratedByte() const _result = setResultBase(iteratedByte) const length = intIterator() for (let i = 0; i < length; i++) { if (hasChildren(_result.type)) { if (_result.type === 'Array' || _result.type === 'Struct') { _result.value.push(stackItemIterator()) } else if (_result.type === 'Map') { // Map is basically JSON, each entry has 2 values (first is the key, second the actual value) // But both key and value will be StackItems, we'll store them as an array of key-value pairs... // until we have a better solution of course _result.value.push({ key: stackItemIterator(), value: stackItemIterator() }) } } else { if (_result.type === 'Boolean') { setIteratedByte() _result.value = parseInt(iteratedByte, 16) > 0 // true if the byte is nonzero; otherwise, false. } else { setIteratedByte() // Integer = bigInt aka hexstring _result.value += iteratedByte } } } return _result } const intIterator = () => { let length = '' setIteratedByte() const base = iteratedByte base.toLowerCase() if (base === 'fd' || base === 'fe' || base === 'ff') { const byteLength = determineByteLength(base) for (let i = 0; i < byteLength; i++) { setIteratedByte() length += iteratedByte } length = reverseHex(length) } else { length += base } return parseInt(length, 16) } return stackItemIterator() } export default deserialize