( struct: AbiStruct, field: AbiStructField, offset: number, context: FileContext, maxValueReference: string )
| 273 | }; |
| 274 | |
| 275 | export const getReadField = ( |
| 276 | struct: AbiStruct, |
| 277 | field: AbiStructField, |
| 278 | offset: number, |
| 279 | context: FileContext, |
| 280 | maxValueReference: string |
| 281 | ) => { |
| 282 | if (field.type.meta !== "elementary" && field.type.meta !== 'enum') throw Error("Unsupported field!"); |
| 283 | const constantsPrefix = `${struct.name}_${field.name}`; |
| 284 | const size = field.type.size; |
| 285 | const bitsAfter = 256 - (offset + size); |
| 286 | let rightAligned = "encoded"; |
| 287 | if (bitsAfter > 0) { |
| 288 | const bitsAfterName = `${constantsPrefix}_bitsAfter`; |
| 289 | const bitsAfterReference = context.addConstant(bitsAfterName, toHex(bitsAfter)); |
| 290 | rightAligned = `shr(${bitsAfterReference}, encoded)`; |
| 291 | } |
| 292 | if (field.type.meta === "elementary" && field.type.type === 'int') { |
| 293 | const bytesLess1 = (field.type.size / 8) - 1; |
| 294 | return `signextend(${toHex(bytesLess1)}, ${rightAligned})` |
| 295 | } |
| 296 | let masked = rightAligned; |
| 297 | if (offset > 0) { |
| 298 | // const maskName = `MaskOnlyLast${numberToPascalCaseWords(size / 8)}Bytes`; |
| 299 | // const maskReference = context.addConstant(maskName, getInclusionMask(size)); |
| 300 | masked = `and(${maxValueReference}, ${rightAligned})`; |
| 301 | } |
| 302 | return masked; |
| 303 | }; |
no test coverage detected