Skip to content

Commit

Permalink
Merge pull request #6 from Riad-Quadratic/main
Browse files Browse the repository at this point in the history
Solve Issues #2 Fix return Type array and #3 Resolve function parameters without array
  • Loading branch information
ivpavici authored Dec 22, 2022
2 parents c614e85 + 7553643 commit d1e2a7c
Show file tree
Hide file tree
Showing 5 changed files with 240 additions and 169 deletions.
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -107,4 +107,7 @@ dist

.npmrc

*.js
*.js

# local folder for tests
local
7 changes: 4 additions & 3 deletions index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {Abi, ExtractAbiFunctionName, FunctionArgs, FunctionRet} from './kanabi';

export function call<TAbi extends Abi, TFunctionName extends ExtractAbiFunctionName<TAbi>>(abi: TAbi, f: TFunctionName, args: FunctionArgs<TAbi, TFunctionName>): FunctionRet<TAbi, TFunctionName> {
throw new Error('todo')
}
export function
call<TAbi extends Abi, TFunctionName extends ExtractAbiFunctionName<TAbi>>(
abi: TAbi, f: TFunctionName, args: FunctionArgs<TAbi, TFunctionName>):
FunctionRet<TAbi, TFunctionName>{throw new Error('todo')};
164 changes: 84 additions & 80 deletions kanabi.ts
Original file line number Diff line number Diff line change
@@ -1,109 +1,113 @@
type Felt = 'felt'
type CairoFunction = 'function'
type Felt = 'felt';
type CairoFunction = 'function';

type MAX_TUPLE_SIZE = 3
type MAX_TUPLE_SIZE = 3;

type _BuildTuple<
R extends unknown = never,
A extends string = '',
D extends readonly number[] = []
> = D['length'] extends MAX_TUPLE_SIZE
? `${A})` | R
: A extends ''
? _BuildTuple<R, `(${string}`, [...D, 1]>
: _BuildTuple<`${A})` | R, `${A}, ${string}`, [...D, 1]>
type _BuildTuple<R extends unknown = never, A extends string = '', D extends
readonly number[] = []> =
D['length'] extends MAX_TUPLE_SIZE ? `${A})`|R : A extends '' ?
_BuildTuple<R, `(${string}`, [...D, 1]>:
_BuildTuple<`${A})`|R, `${A}, ${string}`, [...D, 1]>;

type CairoTuple = _BuildTuple
type CairoTuple = _BuildTuple;

type AbiType = Felt | CairoFunction | CairoTuple
type AbiType = Felt|CairoFunction|CairoTuple;

type ResolvedAbiType = AbiType
type ResolvedAbiType = AbiType;

type AbiParameter = {
type: string
name: string
type: string,
name: string,
}

type AbiStateMutability = 'view' | 'external'
type AbiStateMutability = 'view'|'external';

type AbiFunction = {
name: string
inputs: readonly AbiParameter[]
outputs: readonly AbiParameter[]
} & (
| {
type: 'function'
stateMutability?: AbiStateMutability
}
| {
type: 'constructor'
}
)
name: string,
inputs: readonly AbiParameter[],
outputs: readonly AbiParameter[]
}&(|{type: 'function', stateMutability?: AbiStateMutability}|
{type: 'constructor'});

type AbiMember = {
name: string
offset: number
type: string
}
name: string,
offset: number,
type: string
};

type AbiStruct = {
type: 'struct'
name: string
size: number
members: readonly AbiMember[]
}
type: 'struct',
name: string,
size: number,
members: readonly AbiMember[]
};

export type Abi = readonly (AbiFunction | AbiStruct)[]
export type Abi = readonly(AbiFunction|AbiStruct)[];

/// Implement
type _BuildArgs<TAbi extends Abi, TAbiParam extends readonly AbiParameter[], R extends unknown[]> =
R['length'] extends TAbiParam['length'] ? R : _BuildArgs<TAbi, TAbiParam, [...R, AbiParameterToPrimitiveType<TAbi, TAbiParam[R['length']]>]>

export type FunctionArgs<TAbi extends Abi, TFunctionName extends ExtractAbiFunctionName<TAbi>> =
_BuildArgs<TAbi, ExtractAbiFunction<TAbi, TFunctionName>['inputs'], []>

export type FunctionRet<TAbi extends Abi, TFunctionName extends ExtractAbiFunctionName<TAbi>> =
_BuildArgs<TAbi, ExtractAbiFunction<TAbi, TFunctionName>['outputs'], []>

export type ExtractAbiFunctions<TAbi extends Abi> = Extract<TAbi[number], { type: 'function' }>

export type ExtractAbiFunctionName<TAbi extends Abi> = ExtractAbiFunctions<TAbi>['name']
type _BuildArgs<TAbi extends Abi, TAbiParam extends readonly AbiParameter[],
R extends unknown[]> =
R['length'] extends TAbiParam['length'] ? R : _BuildArgs<TAbi, TAbiParam, [
...R, AbiParameterToPrimitiveType<TAbi, TAbiParam[R['length']]>
]>;

export type FunctionArgs<
TAbi extends Abi, TFunctionName extends ExtractAbiFunctionName<TAbi>> =
ExtractAbiFunction<TAbi, TFunctionName>['inputs'] extends readonly[] ?
[] :
_BuildArgs<
TAbi, ExtractAbiFunction<TAbi, TFunctionName>['inputs'],
[]> extends [infer T] ?
T :
_BuildArgs<TAbi, ExtractAbiFunction<TAbi, TFunctionName>['inputs'], []>;

export type FunctionRet<
TAbi extends Abi, TFunctionName extends ExtractAbiFunctionName<TAbi>> =
ExtractAbiFunction<TAbi, TFunctionName>['outputs'] extends readonly[] ?
void :
_BuildArgs<
TAbi, ExtractAbiFunction<TAbi, TFunctionName>['outputs'],
[]> extends [infer T] ?
T :
_BuildArgs<TAbi, ExtractAbiFunction<TAbi, TFunctionName>['outputs'], []>;

export type ExtractAbiFunctions<TAbi extends Abi> =
Extract<TAbi[number], {type: 'function'}>;

export type ExtractAbiFunctionName<TAbi extends Abi> =
ExtractAbiFunctions<TAbi>['name'];

export type ExtractAbiFunction<
TAbi extends Abi,
TFunctionName extends ExtractAbiFunctionName<TAbi>
> = Extract<ExtractAbiFunctions<TAbi>, { name: TFunctionName }>
TAbi extends Abi, TFunctionName extends ExtractAbiFunctionName<TAbi>> =
Extract<ExtractAbiFunctions<TAbi>, {name: TFunctionName}>;

export type ExtractAbiStructs<TAbi extends Abi> = Extract<TAbi[number], { type: 'struct' }>
export type ExtractAbiStructs<TAbi extends Abi> =
Extract<TAbi[number], {type: 'struct'}>;

export type ExtractAbiStructNames<TAbi extends Abi> = ExtractAbiStructs<TAbi>['name']
export type ExtractAbiStructNames<TAbi extends Abi> =
ExtractAbiStructs<TAbi>['name'];

export type ExtractAbiStruct<
TAbi extends Abi,
TStructName extends ExtractAbiStructNames<TAbi>
> = Extract<ExtractAbiStructs<TAbi>, { name: TStructName }>
TAbi extends Abi, TStructName extends ExtractAbiStructNames<TAbi>> =
Extract<ExtractAbiStructs<TAbi>, {name: TStructName}>;

type PrimitiveTypeLookup<TAbi extends Abi> = {
[_ in Felt]: number
} & {
[_ in CairoFunction]: number
} & {
[_ in CairoTuple]: [number, number]
[_ in Felt]: number
}&{[_ in CairoFunction]: number}&{
[_ in CairoTuple]: [number, number]
}
export type AbiTypeToPrimitiveType<TAbi extends Abi, TAbiType extends AbiType> = PrimitiveTypeLookup<TAbi>[TAbiType]
export type AbiTypeToPrimitiveType<TAbi extends Abi, TAbiType extends AbiType> =
PrimitiveTypeLookup<TAbi>[TAbiType];

export type AbiParameterToPrimitiveType<
TAbi extends Abi,
TAbiParameter extends AbiParameter
> =
TAbiParameter['type'] extends AbiType
? AbiTypeToPrimitiveType<TAbi, TAbiParameter['type']>
: ExtractAbiStruct<TAbi, TAbiParameter['type']> extends {
type: 'struct',
members: infer TMembers extends readonly AbiMember[]
}
?
{
[Member in TMembers[number] as Member['name']]: AbiParameterToPrimitiveType<TAbi, Member>
}
: unknown
TAbi extends Abi, TAbiParameter extends AbiParameter> =
TAbiParameter['type'] extends AbiType ?
AbiTypeToPrimitiveType<TAbi, TAbiParameter['type']>:
ExtractAbiStruct<TAbi, TAbiParameter['type']> extends {
type: 'struct', members: infer TMembers extends readonly AbiMember[]
} ?
{
[Member in TMembers[number] as Member['name']]:
AbiParameterToPrimitiveType<TAbi, Member>
} :
unknown;
101 changes: 101 additions & 0 deletions test/abi_demo2.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
[
{
"members":[
{
"name":"low",
"offset":0,
"type":"felt"
},
{
"name":"high",
"offset":1,
"type":"felt"
}
],
"name":"Uint256",
"size":2,
"type":"struct"
},
{
"inputs":[
{
"name":"par1",
"type":"felt"
},
{
"name":"symbol",
"type":"felt"
},
{
"name":"decimals",
"type":"felt"
},
{
"name":"initial_supply",
"type":"Uint256"
},
{
"name":"recipient",
"type":"felt"
}
],
"name":"constructor",
"outputs":[

],
"type":"constructor"
},
{
"inputs":[

],
"name":"fun1",
"outputs":[
{
"name":"par1",
"type":"felt"
},
{
"name":"par2",
"type":"Uint256"
}
],
"stateMutability":"view",
"type":"function"
},
{
"inputs":[
{
"name":"x",
"type":"felt"
},
{
"name":"y",
"type":"felt"
}
],
"name":"fun2",
"outputs":[

],
"stateMutability":"view",
"type":"function"
},
{
"inputs":[
{
"name":"account",
"type":"felt"
}
],
"name":"balanceOf",
"outputs":[
{
"name":"balance",
"type":"Uint256"
}
],
"stateMutability":"view",
"type":"function"
}
]
Loading

0 comments on commit d1e2a7c

Please sign in to comment.