* adds definitions and types according to ink v5 changes
* adds toV5 boilerplate code draft
* adds v5 flipper test contract code
* fix license dates
* adds test v5 toLatest test
* implements new scheme to determine event
* apply linter changes
* adds test result outputs
* change `EventRecord['topics'][0]` type to plain `Hash`
* adds testcases for decoding payload data of a ink!v4 and ink!v5 event
* changes `Abi.decodeEvent(data:Bytes)` method interface to `Abi.decodeEvent(record:EventRecord)` which includes the event and the topic for decoding.
* draft implementation with version metadata
* cleaner implementation of versioned Metadata by actually leveraging the `version` field included since v2 contract metadata
* trying to make linter happy
* makes `ContractMetadataSupported` in internal to `Abi` type and not exposing it externally.
* properly types unused parameter for tsc 🤷
* adds `@polkadot/types-support` dev dependency
* Update yarn.lock
* references `types-support` in `api-contract
* resolving change requests
* resolves linter warnings
* changes ContractMetadataV5 field to `u64` from `Text`
* adds contracts and contract metadata compiled with the most recent ink version
* implements decoding of anonymous events if possible
* removes done todo comments
48 lines
2.0 KiB
TypeScript
48 lines
2.0 KiB
TypeScript
// Copyright 2017-2024 @polkadot/api-contract authors & contributors
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
import type { ContractMetadataV4, ContractMetadataV5 } from '@polkadot/types/interfaces';
|
|
import type { Registry } from '@polkadot/types/types';
|
|
import type { ContractMetadataSupported } from './index.js';
|
|
|
|
import { v0ToV1 } from './toV1.js';
|
|
import { v1ToV2 } from './toV2.js';
|
|
import { v2ToV3 } from './toV3.js';
|
|
import { v3ToV4 } from './toV4.js';
|
|
|
|
// The versions where an enum is used, aka V0 is missing
|
|
// (Order from newest, i.e. we expect more on newest vs oldest)
|
|
export const enumVersions = ['V5', 'V4', 'V3', 'V2', 'V1'] as const;
|
|
|
|
type Versions = typeof enumVersions[number] | 'V0';
|
|
|
|
type Converter = (registry: Registry, vx: any) => ContractMetadataSupported;
|
|
|
|
// Helper to convert metadata from one step to the next
|
|
function createConverter <I, O> (next: (registry: Registry, input: O) => ContractMetadataSupported, step: (registry: Registry, input: I) => O): (registry: Registry, input: I) => ContractMetadataSupported {
|
|
return (registry: Registry, input: I): ContractMetadataSupported =>
|
|
next(registry, step(registry, input));
|
|
}
|
|
|
|
export function v5ToLatestCompatible (_registry: Registry, v5: ContractMetadataV5): ContractMetadataV5 {
|
|
return v5;
|
|
}
|
|
|
|
export function v4ToLatestCompatible (_registry: Registry, v4: ContractMetadataV4): ContractMetadataV4 {
|
|
return v4;
|
|
}
|
|
|
|
export const v3ToLatestCompatible = /*#__PURE__*/ createConverter(v4ToLatestCompatible, v3ToV4);
|
|
export const v2ToLatestCompatible = /*#__PURE__*/ createConverter(v3ToLatestCompatible, v2ToV3);
|
|
export const v1ToLatestCompatible = /*#__PURE__*/ createConverter(v2ToLatestCompatible, v1ToV2);
|
|
export const v0ToLatestCompatible = /*#__PURE__*/ createConverter(v1ToLatestCompatible, v0ToV1);
|
|
|
|
export const convertVersions: [Versions, Converter][] = [
|
|
['V5', v5ToLatestCompatible],
|
|
['V4', v4ToLatestCompatible],
|
|
['V3', v3ToLatestCompatible],
|
|
['V2', v2ToLatestCompatible],
|
|
['V1', v1ToLatestCompatible],
|
|
['V0', v0ToLatestCompatible]
|
|
];
|