From 165405bdc3b5b1571f949a8bd974458c3d71b387 Mon Sep 17 00:00:00 2001 From: Jaco Date: Thu, 13 May 2021 22:19:11 +0300 Subject: [PATCH] Contracts read for variable-length bytes (#3526) --- packages/api-contract/src/base/Contract.ts | 2 +- packages/types/src/interfaces/contracts/definitions.ts | 3 +-- packages/types/src/interfaces/contracts/types.ts | 2 +- packages/types/src/primitive/Text.spec.ts | 7 +++++-- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/api-contract/src/base/Contract.ts b/packages/api-contract/src/base/Contract.ts index 83ed24a543..cacd1bb7a7 100644 --- a/packages/api-contract/src/base/Contract.ts +++ b/packages/api-contract/src/base/Contract.ts @@ -151,7 +151,7 @@ export class Contract extends Base { debugMessage, gasConsumed, output: result.isOk && message.returnType - ? createTypeUnsafe(this.registry, message.returnType.type, [result.asOk.data], { isPedantic: true }) + ? createTypeUnsafe(this.registry, message.returnType.type, [result.asOk.data.toU8a(true)], { isPedantic: true }) : null, result })) diff --git a/packages/types/src/interfaces/contracts/definitions.ts b/packages/types/src/interfaces/contracts/definitions.ts index 571f6b36b5..23513969e5 100644 --- a/packages/types/src/interfaces/contracts/definitions.ts +++ b/packages/types/src/interfaces/contracts/definitions.ts @@ -133,8 +133,7 @@ export default { }, ContractExecResultOk: { flags: 'u32', - // only via RPC, decode hex exactly as received - data: 'Raw' + data: 'Bytes' }, ContractExecResultResult: { _enum: { diff --git a/packages/types/src/interfaces/contracts/types.ts b/packages/types/src/interfaces/contracts/types.ts index 52fabb8659..6f8b080887 100644 --- a/packages/types/src/interfaces/contracts/types.ts +++ b/packages/types/src/interfaces/contracts/types.ts @@ -56,7 +56,7 @@ export interface ContractExecResultErrModule extends Struct { /** @name ContractExecResultOk */ export interface ContractExecResultOk extends Struct { readonly flags: u32; - readonly data: Raw; + readonly data: Bytes; } /** @name ContractExecResultResult */ diff --git a/packages/types/src/primitive/Text.spec.ts b/packages/types/src/primitive/Text.spec.ts index fbeb414c9a..29894d7698 100644 --- a/packages/types/src/primitive/Text.spec.ts +++ b/packages/types/src/primitive/Text.spec.ts @@ -5,13 +5,13 @@ import type { CodecTo } from '../types'; import { Raw } from '../codec/Raw'; import { TypeRegistry } from '../create'; -import { Text } from '.'; +import { Bytes, Text } from '.'; describe('Text', (): void => { const registry = new TypeRegistry(); describe('decode', (): void => { - const testDecode = (type: string, input: null | string | Uint8Array | { toString: () => string }, expected: string, toFn: 'toString' | 'toHex' = 'toString'): void => + const testDecode = (type: string, input: null | string | Uint8Array | { toString: () => string }, expected: string, toFn: 'toString' | 'toHex' | 'toHuman' = 'toString'): void => it(`can decode from ${type}`, (): void => { expect(new Text(registry, input)[toFn]()).toBe(expected); }); @@ -20,6 +20,9 @@ describe('Text', (): void => { testDecode('Text', new Text(registry, 'foo'), 'foo'); testDecode('Uint8Array', Uint8Array.from([12, 102, 111, 111]), 'foo'); testDecode('Raw', new Raw(registry, Uint8Array.from([102, 111, 111])), 'foo'); // no length + testDecode('Raw', new Raw(registry, Uint8Array.from([102, 111, 111])), 'foo', 'toHuman'); // no length + testDecode('Bytes', new Bytes(registry, Uint8Array.from([12, 102, 111, 111])), 'foo'); // length-aware encoding + testDecode('Bytes', new Bytes(registry, Uint8Array.from([12, 102, 111, 111])), 'foo', 'toHuman'); // length-aware encoding testDecode('object with `toString()`', { toString (): string { return 'foo'; } }, 'foo'); testDecode('hex input value', new Text(registry, '0x12345678'), '0x12345678', 'toHex'); testDecode('null', null, '');