-
Notifications
You must be signed in to change notification settings - Fork 19
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #6 from Riad-Quadratic/main
- Loading branch information
Showing
5 changed files
with
240 additions
and
169 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -107,4 +107,7 @@ dist | |
|
||
.npmrc | ||
|
||
*.js | ||
*.js | ||
|
||
# local folder for tests | ||
local |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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')}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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" | ||
} | ||
] |
Oops, something went wrong.