Skip to content

Commit d93a127

Browse files
authored
Create linkage compatible types in V14 conversion (#4816)
* Create linkage compatible types in V14 conversion * Handle Linkage in extractTypes * Linkage fallback type * CHANGELOG
1 parent 3a9a35a commit d93a127

File tree

4 files changed

+21
-5
lines changed

4 files changed

+21
-5
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Changes:
1010
- Allow for optional `definitions.ts` in typegen (only use chain)
1111
- Optimize `Compact<*>` decoding in Uint8Array streams
1212
- Use `I*` interfaces for extrinsic payload getters
13+
- Re-add support for historic linked-map queries
1314
- Update to latest Substrate, Kusama & Polkadot static metadata
1415

1516

packages/rpc-core/src/bundle.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import type { RpcInterfaceMethod } from './types';
1212
import { Observable, publishReplay, refCount } from 'rxjs';
1313

1414
import { rpcDefinitions } from '@polkadot/types';
15-
import { assert, hexToU8a, isFunction, isNull, isUndefined, lazyMethod, logger, memoize, objectSpread, u8aToU8a } from '@polkadot/util';
15+
import { assert, hexToU8a, isFunction, isNull, isUndefined, lazyMethod, logger, memoize, objectSpread, u8aConcat, u8aToU8a } from '@polkadot/util';
1616

1717
import { drr, refCountDelay } from './util';
1818

@@ -455,7 +455,10 @@ export class RpcCore {
455455
return registry.createTypeUnsafe(type, [
456456
isEmpty
457457
? meta.fallback
458-
? hexToU8a(meta.fallback.toHex())
458+
// For old-style Linkage, we add an empty linkage at the end
459+
? type.includes('Linkage<')
460+
? u8aConcat(hexToU8a(meta.fallback.toHex()), new Uint8Array(2))
461+
: hexToU8a(meta.fallback.toHex())
459462
: undefined
460463
: meta.modifier.isOptional
461464
? registry.createTypeUnsafe(type, [input], { blockHash, isPedantic: true })

packages/types/src/metadata/util/extractTypes.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ const mapping: Record<TypeDefInfo, (type: string, typeDef: TypeDef) => Extracted
3030
[TypeDefInfo.Enum]: extractSubArray,
3131
[TypeDefInfo.HashMap]: extractSubArray,
3232
[TypeDefInfo.Int]: unhandled,
33-
[TypeDefInfo.Linkage]: unhandled,
33+
[TypeDefInfo.Linkage]: extractSubSingle,
3434
[TypeDefInfo.Null]: unhandled,
3535
[TypeDefInfo.Option]: extractSubSingle,
3636
[TypeDefInfo.Plain]: (_: string, typeDef: TypeDef) => typeDef.lookupName || typeDef.type,

packages/types/src/metadata/v13/toV14.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import { knownOrigins } from '../../interfaces/runtime/definitions';
1313

1414
interface MapDef {
1515
hashers: StorageHasherV13[];
16+
isLinked: boolean;
17+
isOptional: boolean;
1618
keys: Type[];
1719
value: Type;
1820
}
@@ -211,7 +213,7 @@ function convertEvents (specs: TypeSpec[], registry: Registry, modName: Text, ev
211213
}]);
212214
}
213215

214-
function createMapEntry (specs: TypeSpec[], registry: Registry, sectionTypes: OverrideModuleType, { hashers, keys, value }: MapDef): StorageEntryTypeV14 {
216+
function createMapEntry (specs: TypeSpec[], registry: Registry, sectionTypes: OverrideModuleType, { hashers, isLinked, isOptional, keys, value }: MapDef): StorageEntryTypeV14 {
215217
setTypeOverride(sectionTypes, [value, ...(Array.isArray(keys) ? keys : [keys])]);
216218

217219
return registry.createTypeUnsafe('StorageEntryTypeV14', [{
@@ -220,7 +222,11 @@ function createMapEntry (specs: TypeSpec[], registry: Registry, sectionTypes: Ov
220222
key: hashers.length === 1
221223
? compatType(specs, keys[0])
222224
: makeTupleType(specs, keys.map((t) => compatType(specs, t))),
223-
value: compatType(specs, value)
225+
value: isLinked
226+
// For previous-generation linked-map support, the actual storage result
227+
// is a Tuple with the value and the Linkage (Option appears in teh value-part only)
228+
? compatType(specs, `(${isOptional ? `Option<${value.toString()}>` : value.toString()}, Linkage<${keys[0].toString()}>)`)
229+
: compatType(specs, value)
224230
}
225231
}]);
226232
}
@@ -247,6 +253,8 @@ function convertStorage (specs: TypeSpec[], registry: Registry, { items, prefix
247253

248254
entryType = createMapEntry(specs, registry, sectionTypes, {
249255
hashers: [map.hasher],
256+
isLinked: map.linked.isTrue,
257+
isOptional: modifier.isOptional,
250258
keys: [map.key],
251259
value: map.value
252260
});
@@ -255,6 +263,8 @@ function convertStorage (specs: TypeSpec[], registry: Registry, { items, prefix
255263

256264
entryType = createMapEntry(specs, registry, sectionTypes, {
257265
hashers: [dm.hasher, dm.key2Hasher],
266+
isLinked: false,
267+
isOptional: modifier.isOptional,
258268
keys: [dm.key1, dm.key2],
259269
value: dm.value
260270
});
@@ -263,6 +273,8 @@ function convertStorage (specs: TypeSpec[], registry: Registry, { items, prefix
263273

264274
entryType = createMapEntry(specs, registry, sectionTypes, {
265275
hashers: nm.hashers,
276+
isLinked: false,
277+
isOptional: modifier.isOptional,
266278
keys: nm.keyVec,
267279
value: nm.value
268280
});

0 commit comments

Comments
 (0)