Skip to content

Uniswap v1 #4

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 3 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 54 additions & 0 deletions definition.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# 記法
シグネチャをつけたモジュールとして定義します.

## storage
シグネチャ内の1つ目に定義された型がstorage,2つ目に指定された型がmutable storageとして扱われます.
また,3つ目以降に型を定義することはできません.

## 定義可能な値
シグネチャ内に記述できる値は関数のみです.関数の第2引数は必須で,storageである必要があります.オプションでmutable storage型の第3引数をつけることができ,以降の引数はつけることはできません.返り値は2番目の要素にstorageを置いた2つ組のタプルである必要があります.

複数の値を入力として受け取る関数を書く場合はタプル型を使用します.


## 型
### unit型
`unit`: 可能な値は()です.

### bool型
`bool`: 可能な値は`true`と`false`です.

### uint型
符号なし整数(unsigned int)型
`uint`: `UInt`というコンストラクタを伴った符号なし整数.`UInt 1`など

### sint型
符号付き整数(signed int)型
`sint`: `SInt`というコンストラクタを伴った符号なし整数.`SInt 1`など

### address型
`address`: アドレスを表す型.

### タプル型
`t1 * t2 * ...`:`t1`, `t2`には実際の型が入ります.

### ハッシュテーブル型
`(t1, t2) Hashtbl.t`: `t1`, `t2`には実際の型が入り,`t1`から`t2`へのハッシュテーブル型となります.

## 式
使用可能な式は関数適用,let式,if式,逐次実行です.
let式で束縛する式としてunit型は使えません.代わりに逐次実行を使用してください.
逐次実行`e1; e2`の`e1`はunit型である必要があり,また,`()`のみの場合は使えません.


## 組み込み関数
### 演算子
関数として定義されています.
- `<`, `>`, `<=`, `>=`, `=`, `!=` : `'a -> 'a -> bool` 大小や等価性の比較
- `+`, `-`, `*`, `\`: `sint -> sint -> sint` sint型の演算子
- `+^`, `-^`, `*^`, `/^`: `uint -> uint -> uint` uint型の演算子

## その他関数
- `caller: unit -> address`: トランザクションを発行したアドレスを返します
- `Hashtbl.find: ('a, 'b) Hashtbl.t -> 'a -> 'b`: Hashtblライブラリ参照.
- `Hashtbl.replace: ('a, 'b) Hashtbl.t -> 'a -> 'b -> unit`: Hashtblライブラリを参照.
4 changes: 2 additions & 2 deletions sample/contracts/SimpleStorageIf.json
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,6 @@
"stateMutability": "nonpayable"
}
],
"bytecode": "335f556102f36100115f396102f35ff3fe6100076102d5565b8063e5c19b2d146101a25780636d4ce63c1461018c5780633088003814610163578063ac08973d1461013a57806350b978401461011157806344f45307146100e8578063e95e21bc146100bf578063fd3ce04014610096576381fe57861461006d575f80fd5b6100906100786102c4565b61008260016102dd565b61008b5f6102dd565b61028f565b506102ca565b6100b96100a16102c4565b6100ab60016102e7565b6100b45f6102e7565b61022c565b506102ca565b6100e26100ca6102c4565b6100d460016102e7565b6100dd5f6102e7565b6101f4565b506102ca565b61010b6100f36102c4565b6100fd60016102dd565b6101065f6102dd565b6101eb565b506102ca565b61013461011c6102c4565b61012660016102dd565b61012f5f6102dd565b6101e2565b506102ca565b61015d6101456102c4565b61014f60016102dd565b6101585f6102dd565b6101da565b506102ca565b61018661016e6102c4565b61017860016102dd565b6101815f6102dd565b6101d2565b506102ca565b61019c6101976102c4565b6101cd565b506102ca565b6101c36101be6101b06102c4565b6101b95f6102dd565b6101c8565b6102bf565b6102d1565b905090565b908190565b929192109190565b929192119190565b92919211159190565b92919210159190565b92919280918115610223575b8161021b575b501581610213575b509190565b90505f61020e565b90505f610206565b80925091610200565b909291925f918060011461026a575f1461024657505b9190565b80600114610261575f1461025a575b610242565b505f610255565b50506001610255565b5080600114610287575f1461027f575b610242565b50600161027a565b50505f61027a565b90929192808211915f9290816001146102b657505f146102af57505b9190565b90506102ab565b925050506102ab565b600155565b60015490565b5f5260205ff35b5f80f35b5f3560e01c90565b6020026004013590565b6102f0906102dd565b9056",
"deployedBytecode": "6100076102d5565b8063e5c19b2d146101a25780636d4ce63c1461018c5780633088003814610163578063ac08973d1461013a57806350b978401461011157806344f45307146100e8578063e95e21bc146100bf578063fd3ce04014610096576381fe57861461006d575f80fd5b6100906100786102c4565b61008260016102dd565b61008b5f6102dd565b61028f565b506102ca565b6100b96100a16102c4565b6100ab60016102e7565b6100b45f6102e7565b61022c565b506102ca565b6100e26100ca6102c4565b6100d460016102e7565b6100dd5f6102e7565b6101f4565b506102ca565b61010b6100f36102c4565b6100fd60016102dd565b6101065f6102dd565b6101eb565b506102ca565b61013461011c6102c4565b61012660016102dd565b61012f5f6102dd565b6101e2565b506102ca565b61015d6101456102c4565b61014f60016102dd565b6101585f6102dd565b6101da565b506102ca565b61018661016e6102c4565b61017860016102dd565b6101815f6102dd565b6101d2565b506102ca565b61019c6101976102c4565b6101cd565b506102ca565b6101c36101be6101b06102c4565b6101b95f6102dd565b6101c8565b6102bf565b6102d1565b905090565b908190565b929192109190565b929192119190565b92919211159190565b92919210159190565b92919280918115610223575b8161021b575b501581610213575b509190565b90505f61020e565b90505f610206565b80925091610200565b909291925f918060011461026a575f1461024657505b9190565b80600114610261575f1461025a575b610242565b505f610255565b50506001610255565b5080600114610287575f1461027f575b610242565b50600161027a565b50505f61027a565b90929192808211915f9290816001146102b657505f146102af57505b9190565b90506102ab565b925050506102ab565b600155565b60015490565b5f5260205ff35b5f80f35b5f3560e01c90565b6020026004013590565b6102f0906102dd565b9056"
"bytecode": "335f5561031f6100115f3961031f5ff3fe610007610301565b8063e5c19b2d146101a25780636d4ce63c1461018c5780633088003814610163578063ac08973d1461013a57806350b978401461011157806344f45307146100e8578063e95e21bc146100bf578063fd3ce04014610096576381fe57861461006d575f80fd5b6100906100786102f0565b6100826001610309565b61008b5f610309565b6102bb565b506102f6565b6100b96100a16102f0565b6100ab6001610313565b6100b45f610313565b61022c565b506102f6565b6100e26100ca6102f0565b6100d46001610313565b6100dd5f610313565b6101f4565b506102f6565b61010b6100f36102f0565b6100fd6001610309565b6101065f610309565b6101eb565b506102f6565b61013461011c6102f0565b6101266001610309565b61012f5f610309565b6101e2565b506102f6565b61015d6101456102f0565b61014f6001610309565b6101585f610309565b6101da565b506102f6565b61018661016e6102f0565b6101786001610309565b6101815f610309565b6101d2565b506102f6565b61019c6101976102f0565b6101cd565b506102f6565b6101c36101be6101b06102f0565b6101b95f610309565b6101c8565b6102eb565b6102fd565b905090565b908190565b929192109190565b929192119190565b92919211159190565b92919210159190565b92919280918115610223575b8161021b575b501581610213575b509190565b90505f61020e565b90505f610206565b80925091610200565b909291927f737472696e670000000000000000000000000000000000000000000000000000805f93918260011461028f5750505f1461026b57505b9190565b80600114610286575f1461027f575b610267565b505f61027a565b5050600161027a565b915091806001146102b1575f146102a85750505b610267565b909150146102a3565b505050505f6102a3565b90929192808211915f9290816001146102e257505f146102db57505b9190565b90506102d7565b925050506102d7565b600155565b60015490565b5f5260205ff35b5f80f35b5f3560e01c90565b6020026004013590565b61031c90610309565b9056",
"deployedBytecode": "610007610301565b8063e5c19b2d146101a25780636d4ce63c1461018c5780633088003814610163578063ac08973d1461013a57806350b978401461011157806344f45307146100e8578063e95e21bc146100bf578063fd3ce04014610096576381fe57861461006d575f80fd5b6100906100786102f0565b6100826001610309565b61008b5f610309565b6102bb565b506102f6565b6100b96100a16102f0565b6100ab6001610313565b6100b45f610313565b61022c565b506102f6565b6100e26100ca6102f0565b6100d46001610313565b6100dd5f610313565b6101f4565b506102f6565b61010b6100f36102f0565b6100fd6001610309565b6101065f610309565b6101eb565b506102f6565b61013461011c6102f0565b6101266001610309565b61012f5f610309565b6101e2565b506102f6565b61015d6101456102f0565b61014f6001610309565b6101585f610309565b6101da565b506102f6565b61018661016e6102f0565b6101786001610309565b6101815f610309565b6101d2565b506102f6565b61019c6101976102f0565b6101cd565b506102f6565b6101c36101be6101b06102f0565b6101b95f610309565b6101c8565b6102eb565b6102fd565b905090565b908190565b929192109190565b929192119190565b92919211159190565b92919210159190565b92919280918115610223575b8161021b575b501581610213575b509190565b90505f61020e565b90505f610206565b80925091610200565b909291927f737472696e670000000000000000000000000000000000000000000000000000805f93918260011461028f5750505f1461026b57505b9190565b80600114610286575f1461027f575b610267565b505f61027a565b5050600161027a565b915091806001146102b1575f146102a85750505b610267565b909150146102a3565b505050505f6102a3565b90929192808211915f9290816001146102e257505f146102db57505b9190565b90506102d7565b925050506102d7565b600155565b60015490565b5f5260205ff35b5f80f35b5f3560e01c90565b6020026004013590565b61031c90610309565b9056"
}
4 changes: 3 additions & 1 deletion src/anormal.ml
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,9 @@ let rec remove_tuple rename e mut : exp * Abi.state_mutability =
| ATuple el ->
let rec gen_tuple_let = function
| [ x ], [ y ] -> Letin ([ x ], LVal y, e2')
| x :: xs, y :: ys -> Letin ([ x ], LVal y, gen_tuple_let (xs, ys))
| x :: xs, y :: ys -> if y = UnitV then gen_tuple_let (x::xs, ys) else Letin ([ x ], LVal y, gen_tuple_let (xs, ys))
| [], y :: ys -> if y = UnitV then gen_tuple_let ([], ys) else assert false
| [], [] -> e2'
| _ -> assert false
in
(gen_tuple_let (vars, el), mut)
Expand Down
5 changes: 4 additions & 1 deletion src/utils.ml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ let count_vars_in_type t =

let flatten_tuple_pat p =
let rec count_tuple_elem = function
| Tconstr (Path.Pident t_name, _, _) -> if Ident.name t_name = "unit" then 0 else 1
| Tconstr _ -> 1
| Ttuple types ->
List.fold_left
Expand All @@ -48,6 +49,7 @@ let flatten_tuple_pat p =
in
let rec flatten_tuple_pat_aux (p, t) =
match (p, get_desc t) with
| Tpat_any, Tconstr(Path.Pident t_name, _, _) -> if Ident.name t_name = "unit" then ([], []) else assert false
| Tpat_any, _ -> ([], [ fresh_var () ])
| Tpat_construct (_, { cstr_res = res_t; _ }, [], _), Tconstr (_, [], _)
-> (
Expand All @@ -57,7 +59,8 @@ let flatten_tuple_pat p =
| _ -> assert false)
| Tpat_var (s, _), t ->
let n = count_tuple_elem t in
if n > 1 then
if n = 0 then ([], [])
else if n > 1 then
let renamed = gen_renaming_ids n in
([ (Ident.unique_name s, renamed) ], renamed)
else ([], [ Ident.unique_name s ])
Expand Down
4 changes: 2 additions & 2 deletions src/yul_compile.ml
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ let rec translate_body_aux e acc ret_vars=
(* let acc = Exp (letexp_to_yul e1) :: acc in *)
translate_body_aux e2 acc ret_vars
| Letin (vars, e1, e2) ->
let a = (match e1 with LIf (v, e1', e2') ->
(match e1 with LIf (v, e1', e2') ->
let e1_block, _ = translate_body_aux e1' [] vars in
let e1_block = List.rev e1_block in
let e2_block, _ = translate_body_aux e2' [] vars in
Expand All @@ -114,7 +114,7 @@ let rec translate_body_aux e acc ret_vars=
let acc = (Yul_ast.If (bexp, [Assign ((var, []), v2)])) :: Let ((var, []), v1) :: acc in
translate_body_aux e2 acc ret_vars
|_ -> let acc = Let ((List.hd vars, List.tl vars), letexp_to_yul e1) :: acc in
translate_body_aux e2 acc ret_vars) in a
translate_body_aux e2 acc ret_vars)
| If (v, e1, e2) ->
let e1', vars1 = translate_body_aux e1 acc ret_vars in
let e1' = List.rev e1' in
Expand Down
Loading