From 5aa4f95eeef94370679f6f1d97380ec8ec9ae12a Mon Sep 17 00:00:00 2001
From: Colin Roberts <colin@primitive.xyz>
Date: Mon, 26 Feb 2024 18:31:31 -0700
Subject: [PATCH 1/2] trying out implementations

---
 Cargo.lock                                    | 286 +++++++++++++++---
 kit/Cargo.toml                                |   1 +
 kit/src/behaviors/initialize.rs               |  18 ++
 .../behaviors/liquidity_provision/initial.rs  |  18 ++
 kit/src/behaviors/liquidity_provision/mod.rs  |  52 ++++
 kit/src/behaviors/mod.rs                      |   2 +
 kit/src/lib.rs                                |   2 +
 kit/src/pool/constant_sum.rs                  |   8 +-
 kit/src/pool/mod.rs                           |  17 +-
 9 files changed, 357 insertions(+), 47 deletions(-)
 create mode 100644 kit/src/behaviors/initialize.rs
 create mode 100644 kit/src/behaviors/liquidity_provision/initial.rs
 create mode 100644 kit/src/behaviors/liquidity_provision/mod.rs

diff --git a/Cargo.lock b/Cargo.lock
index 6cce4f54..b7791dcc 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -33,7 +33,7 @@ version = "0.8.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0"
 dependencies = [
- "cfg-if",
+ "cfg-if 1.0.0",
  "cipher",
  "cpufeatures",
 ]
@@ -44,7 +44,7 @@ version = "0.8.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d713b3834d76b85304d4d525563c1276e2e30dc97cc67bfb4585a4a29fc2c89f"
 dependencies = [
- "cfg-if",
+ "cfg-if 1.0.0",
  "getrandom",
  "once_cell",
  "version_check",
@@ -89,7 +89,7 @@ checksum = "ef197eb250c64962003cb08b90b17f0882c192f4a6f2f544809d424fd7cb0e7d"
 dependencies = [
  "alloy-rlp",
  "bytes",
- "cfg-if",
+ "cfg-if 1.0.0",
  "const-hex",
  "derive_more",
  "hex-literal",
@@ -401,6 +401,18 @@ version = "0.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
 
+[[package]]
+name = "as-slice"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "45403b49e3954a4b8428a0ac21a4b7afadccf92bfd96273f1a58cd4812496ae0"
+dependencies = [
+ "generic-array 0.12.4",
+ "generic-array 0.13.3",
+ "generic-array 0.14.7",
+ "stable_deref_trait",
+]
+
 [[package]]
 name = "ascii-canvas"
 version = "3.0.0"
@@ -504,7 +516,7 @@ checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837"
 dependencies = [
  "addr2line",
  "cc",
- "cfg-if",
+ "cfg-if 1.0.0",
  "libc",
  "miniz_oxide",
  "object",
@@ -590,7 +602,7 @@ version = "0.10.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
 dependencies = [
- "generic-array",
+ "generic-array 0.14.7",
 ]
 
 [[package]]
@@ -636,6 +648,19 @@ dependencies = [
  "tinyvec",
 ]
 
+[[package]]
+name = "build_id"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c6deb6795d8b4d2269c3fcf87a87bff9f4cd45a99e259806603ee8007077daf3"
+dependencies = [
+ "byteorder",
+ "once_cell",
+ "palaver",
+ "twox-hash",
+ "uuid",
+]
+
 [[package]]
 name = "bumpalo"
 version = "3.15.3"
@@ -759,6 +784,12 @@ dependencies = [
  "libc",
 ]
 
+[[package]]
+name = "cfg-if"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
+
 [[package]]
 name = "cfg-if"
 version = "1.0.0"
@@ -891,7 +922,7 @@ dependencies = [
  "bech32",
  "bs58",
  "digest 0.10.7",
- "generic-array",
+ "generic-array 0.14.7",
  "hex",
  "ripemd",
  "serde",
@@ -925,7 +956,7 @@ version = "1.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "18d59688ad0945eaf6b84cb44fedbe93484c81b48970e98f09db8a22832d7961"
 dependencies = [
- "cfg-if",
+ "cfg-if 1.0.0",
  "cpufeatures",
  "hex",
  "proptest",
@@ -981,7 +1012,7 @@ version = "1.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa"
 dependencies = [
- "cfg-if",
+ "cfg-if 1.0.0",
 ]
 
 [[package]]
@@ -1061,7 +1092,7 @@ version = "0.5.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76"
 dependencies = [
- "generic-array",
+ "generic-array 0.14.7",
  "rand_core",
  "subtle",
  "zeroize",
@@ -1073,7 +1104,7 @@ version = "0.1.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
 dependencies = [
- "generic-array",
+ "generic-array 0.14.7",
  "typenum",
 ]
 
@@ -1150,6 +1181,7 @@ dependencies = [
  "futures-util",
  "serde",
  "serde_json",
+ "serde_traitobject",
  "tokio",
  "tracing",
  "tracing-subscriber",
@@ -1167,7 +1199,7 @@ version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
 dependencies = [
- "generic-array",
+ "generic-array 0.14.7",
 ]
 
 [[package]]
@@ -1197,7 +1229,7 @@ version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1"
 dependencies = [
- "cfg-if",
+ "cfg-if 1.0.0",
  "dirs-sys-next",
 ]
 
@@ -1266,7 +1298,7 @@ dependencies = [
  "crypto-bigint",
  "digest 0.10.7",
  "ff",
- "generic-array",
+ "generic-array 0.14.7",
  "group",
  "pkcs8",
  "rand_core",
@@ -1290,7 +1322,7 @@ version = "0.8.33"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1"
 dependencies = [
- "cfg-if",
+ "cfg-if 1.0.0",
 ]
 
 [[package]]
@@ -1340,6 +1372,15 @@ version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
 
+[[package]]
+name = "erased-serde"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c138974f9d5e7fe373eb04df7cae98833802ae4b11c24ac7039a21d5af4b26c"
+dependencies = [
+ "serde",
+]
+
 [[package]]
 name = "errno"
 version = "0.3.8"
@@ -1520,7 +1561,7 @@ dependencies = [
  "const-hex",
  "elliptic-curve",
  "ethabi",
- "generic-array",
+ "generic-array 0.14.7",
  "k256",
  "num_enum",
  "once_cell",
@@ -1643,7 +1684,7 @@ version = "2.0.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d21df08582e0a43005018a858cc9b465c5fff9cf4056651be64f844e57d1f55f"
 dependencies = [
- "cfg-if",
+ "cfg-if 1.0.0",
  "const-hex",
  "dirs",
  "dunce",
@@ -1917,6 +1958,24 @@ dependencies = [
  "byteorder",
 ]
 
+[[package]]
+name = "generic-array"
+version = "0.12.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd"
+dependencies = [
+ "typenum",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.13.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f797e67af32588215eaaab8327027ee8e71b9dd0b2b26996aedf20c030fce309"
+dependencies = [
+ "typenum",
+]
+
 [[package]]
 name = "generic-array"
 version = "0.14.7"
@@ -1934,7 +1993,7 @@ version = "0.2.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5"
 dependencies = [
- "cfg-if",
+ "cfg-if 1.0.0",
  "js-sys",
  "libc",
  "wasi",
@@ -2005,6 +2064,15 @@ dependencies = [
  "serde",
 ]
 
+[[package]]
+name = "hash32"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4041af86e63ac4298ce40e5cca669066e75b6f1aa3390fe2561ffa5e1d9f4cc"
+dependencies = [
+ "byteorder",
+]
+
 [[package]]
 name = "hashbrown"
 version = "0.13.2"
@@ -2035,6 +2103,18 @@ dependencies = [
  "fxhash",
 ]
 
+[[package]]
+name = "heapless"
+version = "0.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "74911a68a1658cfcfb61bc0ccfbd536e3b6e906f8c2f7883ee50157e3e2184f1"
+dependencies = [
+ "as-slice",
+ "generic-array 0.13.3",
+ "hash32",
+ "stable_deref_trait",
+]
+
 [[package]]
 name = "heck"
 version = "0.4.1"
@@ -2245,7 +2325,7 @@ version = "0.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5"
 dependencies = [
- "generic-array",
+ "generic-array 0.14.7",
 ]
 
 [[package]]
@@ -2254,7 +2334,7 @@ version = "0.1.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
 dependencies = [
- "cfg-if",
+ "cfg-if 1.0.0",
 ]
 
 [[package]]
@@ -2333,7 +2413,7 @@ version = "0.13.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b"
 dependencies = [
- "cfg-if",
+ "cfg-if 1.0.0",
  "ecdsa",
  "elliptic-curve",
  "once_cell",
@@ -2526,13 +2606,22 @@ dependencies = [
  "libc",
 ]
 
+[[package]]
+name = "mach"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa"
+dependencies = [
+ "libc",
+]
+
 [[package]]
 name = "md-5"
 version = "0.10.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf"
 dependencies = [
- "cfg-if",
+ "cfg-if 1.0.0",
  "digest 0.10.7",
 ]
 
@@ -2551,6 +2640,12 @@ dependencies = [
  "libc",
 ]
 
+[[package]]
+name = "metatype"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23decce7c32638bcefbd5a5a5d79a5bb5b720c47b82ad5cb670a7eb912705946"
+
 [[package]]
 name = "mime"
 version = "0.3.17"
@@ -2605,6 +2700,25 @@ version = "1.0.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
 
+[[package]]
+name = "nix"
+version = "0.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b2e0b4f3320ed72aaedb9a5ac838690a8047c7b275da22711fddff4f8a14229"
+dependencies = [
+ "bitflags 1.3.2",
+ "cc",
+ "cfg-if 0.1.10",
+ "libc",
+ "void",
+]
+
+[[package]]
+name = "nom"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf51a729ecf40266a2368ad335a5fdde43471f545a967109cd62146ecf8b66ff"
+
 [[package]]
 name = "now"
 version = "0.1.3"
@@ -2798,6 +2912,23 @@ version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
 
+[[package]]
+name = "palaver"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49dfc200733ac34dcd9a1e4a7e454b521723936010bef3710e2d8024a32d685f"
+dependencies = [
+ "bitflags 1.3.2",
+ "heapless",
+ "lazy_static",
+ "libc",
+ "mach",
+ "nix",
+ "procinfo",
+ "typenum",
+ "winapi",
+]
+
 [[package]]
 name = "parity-scale-codec"
 version = "3.6.9"
@@ -2840,7 +2971,7 @@ version = "0.9.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
 dependencies = [
- "cfg-if",
+ "cfg-if 1.0.0",
  "libc",
  "redox_syscall",
  "smallvec",
@@ -3531,6 +3662,18 @@ dependencies = [
  "unicode-ident",
 ]
 
+[[package]]
+name = "procinfo"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ab1427f3d2635891f842892dda177883dca0639e05fe66796a62c9d2f23b49c"
+dependencies = [
+ "byteorder",
+ "libc",
+ "nom",
+ "rustc_version 0.2.3",
+]
+
 [[package]]
 name = "proptest"
 version = "1.4.0"
@@ -3716,6 +3859,17 @@ version = "0.8.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
 
+[[package]]
+name = "relative"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3401c189ee92c7028ba4863f3fdb92af815789993221af2fa186eed8115da304"
+dependencies = [
+ "build_id",
+ "serde",
+ "uuid",
+]
+
 [[package]]
 name = "reqwest"
 version = "0.11.24"
@@ -3764,7 +3918,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "266f86bdefa6dac07d92e2f5c37d7d183f2575b2f9e0ee9cba9402dfde912524"
 dependencies = [
  "auto_impl",
- "cfg-if",
+ "cfg-if 1.0.0",
  "ethers-core",
  "ethers-providers",
  "futures",
@@ -3815,7 +3969,7 @@ dependencies = [
  "bitvec",
  "blst",
  "c-kzg",
- "cfg-if",
+ "cfg-if 1.0.0",
  "derive_more",
  "enumn",
  "hashbrown 0.14.3",
@@ -3856,7 +4010,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d"
 dependencies = [
  "cc",
- "cfg-if",
+ "cfg-if 1.0.0",
  "getrandom",
  "libc",
  "spin 0.9.8",
@@ -3937,6 +4091,15 @@ version = "2.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6"
 
+[[package]]
+name = "rustc_version"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
+dependencies = [
+ "semver 0.9.0",
+]
+
 [[package]]
 name = "rustc_version"
 version = "0.3.3"
@@ -4047,7 +4210,7 @@ version = "2.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60"
 dependencies = [
- "cfg-if",
+ "cfg-if 1.0.0",
  "derive_more",
  "parity-scale-codec",
  "scale-info-derive",
@@ -4101,7 +4264,7 @@ checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc"
 dependencies = [
  "base16ct",
  "der",
- "generic-array",
+ "generic-array 0.14.7",
  "pkcs8",
  "subtle",
  "zeroize",
@@ -4125,13 +4288,22 @@ dependencies = [
  "cc",
 ]
 
+[[package]]
+name = "semver"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
+dependencies = [
+ "semver-parser 0.7.0",
+]
+
 [[package]]
 name = "semver"
 version = "0.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6"
 dependencies = [
- "semver-parser",
+ "semver-parser 0.10.2",
 ]
 
 [[package]]
@@ -4143,6 +4315,12 @@ dependencies = [
  "serde",
 ]
 
+[[package]]
+name = "semver-parser"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
+
 [[package]]
 name = "semver-parser"
 version = "0.10.2"
@@ -4211,6 +4389,18 @@ dependencies = [
  "serde",
 ]
 
+[[package]]
+name = "serde_traitobject"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c5ae15a5d31f7c57875a480ddd7be02314d264617d0294d961314a6d502e6b1"
+dependencies = [
+ "erased-serde",
+ "metatype",
+ "relative",
+ "serde",
+]
+
 [[package]]
 name = "serde_urlencoded"
 version = "0.7.1"
@@ -4229,7 +4419,7 @@ version = "0.10.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
 dependencies = [
- "cfg-if",
+ "cfg-if 1.0.0",
  "cpufeatures",
  "digest 0.10.7",
 ]
@@ -4240,7 +4430,7 @@ version = "0.10.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
 dependencies = [
- "cfg-if",
+ "cfg-if 1.0.0",
  "cpufeatures",
  "digest 0.10.7",
 ]
@@ -4262,7 +4452,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bac61da6b35ad76b195eb4771210f947734321a8d81d7738e1580d953bc7a15e"
 dependencies = [
  "cc",
- "cfg-if",
+ "cfg-if 1.0.0",
 ]
 
 [[package]]
@@ -4422,6 +4612,12 @@ dependencies = [
  "log",
 ]
 
+[[package]]
+name = "stable_deref_trait"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
+
 [[package]]
 name = "static_assertions"
 version = "1.1.0"
@@ -4563,7 +4759,7 @@ version = "0.30.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1fb4f3438c8f6389c864e61221cbc97e9bca98b4daf39a5beb7bea660f528bb2"
 dependencies = [
- "cfg-if",
+ "cfg-if 1.0.0",
  "core-foundation-sys",
  "libc",
  "ntapi",
@@ -4610,7 +4806,7 @@ version = "3.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67"
 dependencies = [
- "cfg-if",
+ "cfg-if 1.0.0",
  "fastrand",
  "rustix",
  "windows-sys 0.52.0",
@@ -4653,7 +4849,7 @@ version = "1.1.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c"
 dependencies = [
- "cfg-if",
+ "cfg-if 1.0.0",
  "once_cell",
 ]
 
@@ -4967,6 +5163,16 @@ dependencies = [
  "utf-8",
 ]
 
+[[package]]
+name = "twox-hash"
+version = "1.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675"
+dependencies = [
+ "cfg-if 1.0.0",
+ "static_assertions",
+]
+
 [[package]]
 name = "typenum"
 version = "1.17.0"
@@ -5114,6 +5320,12 @@ version = "0.9.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
 
+[[package]]
+name = "void"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
+
 [[package]]
 name = "wait-timeout"
 version = "0.2.0"
@@ -5154,7 +5366,7 @@ version = "0.2.91"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f"
 dependencies = [
- "cfg-if",
+ "cfg-if 1.0.0",
  "wasm-bindgen-macro",
 ]
 
@@ -5179,7 +5391,7 @@ version = "0.4.41"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "877b9c3f61ceea0e56331985743b13f3d25c406a7098d45180fb5f09bc19ed97"
 dependencies = [
- "cfg-if",
+ "cfg-if 1.0.0",
  "js-sys",
  "wasm-bindgen",
  "web-sys",
@@ -5436,7 +5648,7 @@ version = "0.50.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1"
 dependencies = [
- "cfg-if",
+ "cfg-if 1.0.0",
  "windows-sys 0.48.0",
 ]
 
diff --git a/kit/Cargo.toml b/kit/Cargo.toml
index 65443b8c..dde07bb4 100644
--- a/kit/Cargo.toml
+++ b/kit/Cargo.toml
@@ -25,6 +25,7 @@ futures-util = "0.3.30"
 # Serde 
 serde = { version = "1.0.197", features = ["derive"] }
 serde_json = "1.0.114"
+serde_traitobject = "0.2.8"
 
 # Errors and tracing
 anyhow = "1.0.80"
diff --git a/kit/src/behaviors/initialize.rs b/kit/src/behaviors/initialize.rs
new file mode 100644
index 00000000..dca328d2
--- /dev/null
+++ b/kit/src/behaviors/initialize.rs
@@ -0,0 +1,18 @@
+use super::*;
+
+#[derive(Debug, Deserialize, Serialize)]
+pub struct Initialize<P: PoolType> {
+    // pub pool: Pool<P>,
+    phantom: std::marker::PhantomData<P>,
+}
+
+#[async_trait::async_trait]
+impl<P: PoolType> Behavior<()> for Initialize<P> {
+    async fn startup(
+        &mut self,
+        client: Arc<ArbiterMiddleware>,
+        messager: Messager,
+    ) -> Result<Option<EventStream<()>>> {
+        Ok(None)
+    }
+}
diff --git a/kit/src/behaviors/liquidity_provision/initial.rs b/kit/src/behaviors/liquidity_provision/initial.rs
new file mode 100644
index 00000000..2f7ad457
--- /dev/null
+++ b/kit/src/behaviors/liquidity_provision/initial.rs
@@ -0,0 +1,18 @@
+use super::*;
+
+#[derive(Debug, Deserialize, Serialize)]
+pub struct Initial {
+    pub input_x: Option<eU256>,
+    pub input_y: Option<eU256>,
+    pub price: eU256,
+}
+
+impl AllocationType<()> for Initial {
+    fn change_allocation_amount(self, event: ()) -> Option<Allocation> {
+        Some(Allocation {
+            amount_x: self.input_x.map(I256::from_raw),
+            amount_y: self.input_y.map(I256::from_raw),
+            price: Some(self.price),
+        })
+    }
+}
diff --git a/kit/src/behaviors/liquidity_provision/mod.rs b/kit/src/behaviors/liquidity_provision/mod.rs
new file mode 100644
index 00000000..47c44e07
--- /dev/null
+++ b/kit/src/behaviors/liquidity_provision/mod.rs
@@ -0,0 +1,52 @@
+use std::fmt::Debug;
+use std::marker::PhantomData;
+
+use ethers::types::I256;
+use serde::de::DeserializeOwned;
+
+use super::*;
+
+pub mod initial;
+
+#[derive(Debug, Deserialize, Serialize)]
+pub struct LiquidityProvision<A, E>
+where
+    A: AllocationType<E>,
+    E: Debug + Send + Sync,
+{
+    pub allocation_type: A,
+    // #[serde(skip)]
+    // pub pool: Option<Pool<P>>,
+    #[serde(skip)]
+    pub client: Option<Arc<ArbiterMiddleware>>,
+    #[serde(skip)]
+    pub messager: Option<Messager>,
+    phantom: PhantomData<E>,
+}
+
+pub trait AllocationType<E>: Send + Sync + Debug + Serialize + 'static {
+    fn change_allocation_amount(self, event: E) -> Option<Allocation>;
+}
+
+pub struct Allocation {
+    pub amount_x: Option<I256>,
+    pub amount_y: Option<I256>,
+    pub price: Option<eU256>,
+}
+
+#[async_trait::async_trait]
+impl<A, E> Behavior<E> for LiquidityProvision<A, E>
+where
+    A: AllocationType<E> + DeserializeOwned,
+    E: Debug + Send + Sync + 'static,
+{
+    async fn startup(
+        &mut self,
+        client: Arc<ArbiterMiddleware>,
+        messager: Messager,
+    ) -> Result<Option<EventStream<E>>> {
+        self.client = Some(client);
+        self.messager = Some(messager);
+        Ok(None)
+    }
+}
diff --git a/kit/src/behaviors/mod.rs b/kit/src/behaviors/mod.rs
index 24b2fec7..9908ddb6 100644
--- a/kit/src/behaviors/mod.rs
+++ b/kit/src/behaviors/mod.rs
@@ -11,6 +11,8 @@ use self::deployer::Deployer;
 use super::*;
 
 pub mod deployer;
+pub mod initialize;
+pub mod liquidity_provision;
 
 #[derive(Behaviors, Debug, Deserialize, Serialize)]
 pub enum Behaviors {
diff --git a/kit/src/lib.rs b/kit/src/lib.rs
index 2492edc6..b99004ca 100644
--- a/kit/src/lib.rs
+++ b/kit/src/lib.rs
@@ -1,8 +1,10 @@
 pub mod behaviors;
 pub mod bindings;
 pub mod pool;
+pub use pool::{Pool, PoolType, Token};
 
 use anyhow::Result;
 use arbiter_core::middleware::ArbiterMiddleware;
 use ethers::types::U256 as eU256;
+use serde::{Deserialize, Serialize};
 use tracing::trace;
diff --git a/kit/src/pool/constant_sum.rs b/kit/src/pool/constant_sum.rs
index b7ad4c30..9668a3a1 100644
--- a/kit/src/pool/constant_sum.rs
+++ b/kit/src/pool/constant_sum.rs
@@ -2,12 +2,14 @@ use bindings::{constant_sum::ConstantSum, constant_sum_solver::ConstantSumSolver
 
 use super::*;
 
+#[derive(Debug)]
 pub struct ConstantSumPool {
     pub strategy_contract: ConstantSum<ArbiterMiddleware>,
     pub solver_contract: ConstantSumSolver<ArbiterMiddleware>,
     pub parameters: ConstantSumParameters,
 }
 
+#[derive(Debug, Deserialize, Serialize)]
 pub struct ConstantSumParameters {
     pub price: eU256,
     pub swap_fee: eU256,
@@ -22,17 +24,17 @@ impl PoolType for ConstantSumPool {
     async fn swap_data(
         &self,
         pool_id: eU256,
-        input_token: InputToken,
+        input_token: Token,
         amount_in: eU256,
     ) -> Result<Bytes> {
         let (valid, _, data) = match input_token {
-            InputToken::TokenX => {
+            Token::TokenX => {
                 self.solver_contract
                     .simulate_swap(pool_id, true, amount_in)
                     .call()
                     .await?
             }
-            InputToken::TokenY => {
+            Token::TokenY => {
                 self.solver_contract
                     .simulate_swap(pool_id, false, amount_in)
                     .call()
diff --git a/kit/src/pool/mod.rs b/kit/src/pool/mod.rs
index 865d439c..a58621aa 100644
--- a/kit/src/pool/mod.rs
+++ b/kit/src/pool/mod.rs
@@ -1,3 +1,5 @@
+use std::fmt::Debug;
+
 use arbiter_core::middleware::ArbiterMiddleware;
 use ethers::types::Bytes;
 
@@ -9,14 +11,14 @@ pub mod constant_sum;
 pub mod geometric_mean;
 pub mod log_normal;
 
-pub trait PoolType {
+pub trait PoolType: Debug + Send + Sync {
     type Parameters;
     type StrategyContract;
     type SolverContract;
     type AllocationData;
 
     #[allow(async_fn_in_trait)]
-    async fn swap_data(&self, pool_id: eU256, swap: InputToken, amount_in: eU256) -> Result<Bytes>;
+    async fn swap_data(&self, pool_id: eU256, swap: Token, amount_in: eU256) -> Result<Bytes>;
     /// Change Parameters
     #[allow(async_fn_in_trait)]
     async fn update_data(&self, new_data: Self::Parameters) -> Result<Bytes>;
@@ -29,7 +31,7 @@ pub trait PoolType {
     ) -> Result<Bytes>;
 }
 
-pub enum InputToken {
+pub enum Token {
     TokenX,
     TokenY,
 }
@@ -39,23 +41,24 @@ pub enum AllocateOrDeallocate {
     Deallocate,
 }
 
+#[derive(Debug)]
 pub struct Pool<P: PoolType> {
     pub id: eU256,
-    pub dfmm: DFMM<ArbiterMiddleware>,
     pub instance: P,
+    pub dfmm: DFMM<ArbiterMiddleware>,
     pub token_x: ArbiterToken<ArbiterMiddleware>,
     pub token_y: ArbiterToken<ArbiterMiddleware>,
 }
 
 impl<P: PoolType> Pool<P> {
-    pub async fn swap(&self, amount_in: eU256, token_in: InputToken) -> Result<()> {
+    pub async fn swap(&self, amount_in: eU256, token_in: Token) -> Result<()> {
         let data = match token_in {
-            InputToken::TokenX => {
+            Token::TokenX => {
                 self.instance
                     .swap_data(self.id, token_in, amount_in)
                     .await?
             }
-            InputToken::TokenY => {
+            Token::TokenY => {
                 self.instance
                     .swap_data(self.id, token_in, amount_in)
                     .await?

From 33960ed1d4c1c0194104592727a76db96d158583 Mon Sep 17 00:00:00 2001
From: Colin Roberts <colin@primitive.xyz>
Date: Mon, 26 Feb 2024 19:53:03 -0700
Subject: [PATCH 2/2] feat: initialize

---
 kit/src/behaviors/deployer.rs   | 58 +++++++++++++++++++++++----------
 kit/src/behaviors/initialize.rs | 45 ++++++++++++++++++++++---
 kit/src/behaviors/mod.rs        |  2 +-
 kit/src/lib.rs                  | 16 +++++++--
 kit/src/pool/constant_sum.rs    | 12 ++-----
 5 files changed, 97 insertions(+), 36 deletions(-)

diff --git a/kit/src/behaviors/deployer.rs b/kit/src/behaviors/deployer.rs
index c781d7c2..6c9aab1d 100644
--- a/kit/src/behaviors/deployer.rs
+++ b/kit/src/behaviors/deployer.rs
@@ -1,9 +1,4 @@
-use arbiter_bindings::bindings::weth::WETH;
 use arbiter_engine::messager::To;
-use bindings::{
-    constant_sum::ConstantSum, dfmm::DFMM, geometric_mean::GeometricMean, log_normal::LogNormal,
-};
-use ethers::types::Address;
 
 use super::*;
 
@@ -11,13 +6,16 @@ use super::*;
 pub struct Deployer {}
 #[derive(Debug, Deserialize, Serialize)]
 pub struct DeploymentData {
-    pub weth: Address,
-    pub dfmm: Address,
-    pub geometric_mean: Address,
-    pub log_normal: Address,
-    pub constant_sum: Address,
-    pub token_x: Address,
-    pub token_y: Address,
+    pub weth: eAddress,
+    pub dfmm: eAddress,
+    pub geometric_mean: eAddress,
+    pub geometric_mean_solver: eAddress,
+    pub log_normal: eAddress,
+    pub log_normal_solver: eAddress,
+    pub constant_sum: eAddress,
+    pub constant_sum_solver: eAddress,
+    pub token_x: eAddress,
+    pub token_y: eAddress,
 }
 
 #[async_trait::async_trait]
@@ -36,25 +34,48 @@ impl Behavior<()> for Deployer {
         let geometric_mean = GeometricMean::deploy(client.clone(), dfmm.address())?
             .send()
             .await?;
-        trace!("GeometricMean deployed at {:?}", geometric_mean.address());
+        let geometric_mean_solver =
+            GeometricMeanSolver::deploy(client.clone(), geometric_mean.address())?
+                .send()
+                .await?;
+        trace!(
+            "GeometricMean deployed at {:?} with solver at {:?}",
+            geometric_mean.address(),
+            geometric_mean_solver.address()
+        );
 
         let log_normal = LogNormal::deploy(client.clone(), dfmm.address())?
             .send()
             .await?;
-        trace!("LogNormal deployed at {:?}", log_normal.address());
+        let log_normal_solver = LogNormalSolver::deploy(client.clone(), log_normal.address())?
+            .send()
+            .await?;
+        trace!(
+            "LogNormal deployed at {:?} with solver at {:?}",
+            log_normal.address(),
+            log_normal_solver.address()
+        );
 
         let constant_sum = ConstantSum::deploy(client.clone(), dfmm.address())?
             .send()
             .await?;
-        trace!("ConstantSum deployed at {:?}", constant_sum.address());
+        let constant_sum_solver =
+            ConstantSumSolver::deploy(client.clone(), constant_sum.address())?
+                .send()
+                .await?;
+        trace!(
+            "ConstantSum deployed at {:?} with solver at {:?}",
+            constant_sum.address(),
+            constant_sum_solver.address()
+        );
 
-        let token_x = arbiter_bindings::bindings::arbiter_token::ArbiterToken::deploy(
+        let token_x = ArbiterToken::deploy(
             client.clone(),
             ("Token X".to_owned(), "ARBX".to_owned(), 18u8),
         )?
         .send()
         .await?;
-        let token_y = arbiter_bindings::bindings::arbiter_token::ArbiterToken::deploy(
+        let token_y = ArbiterToken::deploy(
             client.clone(),
             ("Token Y".to_owned(), "ARBY".to_owned(), 18u8),
         )?
@@ -71,8 +92,11 @@ impl Behavior<()> for Deployer {
             weth: weth.address(),
             dfmm: dfmm.address(),
             geometric_mean: geometric_mean.address(),
+            geometric_mean_solver: geometric_mean_solver.address(),
             log_normal: log_normal.address(),
+            log_normal_solver: log_normal_solver.address(),
             constant_sum: constant_sum.address(),
+            constant_sum_solver: constant_sum_solver.address(),
             token_x: token_x.address(),
             token_y: token_y.address(),
         };
diff --git a/kit/src/behaviors/initialize.rs b/kit/src/behaviors/initialize.rs
index dca328d2..179c971b 100644
--- a/kit/src/behaviors/initialize.rs
+++ b/kit/src/behaviors/initialize.rs
@@ -1,18 +1,53 @@
+use self::bindings::idfmm::InitParams;
 use super::*;
 
 #[derive(Debug, Deserialize, Serialize)]
-pub struct Initialize<P: PoolType> {
-    // pub pool: Pool<P>,
-    phantom: std::marker::PhantomData<P>,
+pub struct Initialize {
+    pub rx: Option<eU256>,
+    pub ry: Option<eU256>,
+    pub pool_parameters: PoolParameters,
+}
+
+#[derive(Debug, Deserialize, Serialize)]
+pub enum PoolParameters {
+    ConstantSum(ConstantSumParams),
 }
 
 #[async_trait::async_trait]
-impl<P: PoolType> Behavior<()> for Initialize<P> {
+impl Behavior<()> for Initialize {
     async fn startup(
         &mut self,
         client: Arc<ArbiterMiddleware>,
-        messager: Messager,
+        mut messager: Messager,
     ) -> Result<Option<EventStream<()>>> {
+        // await the deployment of DFMM contracts
+        while let Ok(message) = messager.get_next().await {
+            let deployment_data = match serde_json::from_str::<DeploymentData>(&message.data) {
+                Ok(data) => data,
+                Err(_) => continue,
+            };
+            match &self.pool_parameters {
+                PoolParameters::ConstantSum(params) => {
+                    let solver =
+                        ConstantSumSolver::new(deployment_data.constant_sum, client.clone());
+                    let data = solver
+                        .get_initial_pool_data(self.rx.unwrap(), self.ry.unwrap(), params.clone())
+                        .call()
+                        .await?;
+                    let dfmm = DFMM::new(deployment_data.dfmm, client);
+                    dfmm.init(InitParams {
+                        strategy: deployment_data.constant_sum,
+                        token_x: deployment_data.token_x,
+                        token_y: deployment_data.token_y,
+                        data,
+                    })
+                    .send()
+                    .await?
+                    .await?;
+                    break;
+                }
+            }
+        }
         Ok(None)
     }
 }
diff --git a/kit/src/behaviors/mod.rs b/kit/src/behaviors/mod.rs
index 9908ddb6..f2d2a6cb 100644
--- a/kit/src/behaviors/mod.rs
+++ b/kit/src/behaviors/mod.rs
@@ -7,7 +7,7 @@ use arbiter_engine::{
 use arbiter_macros::Behaviors;
 use serde::{Deserialize, Serialize};
 
-use self::deployer::Deployer;
+pub use self::deployer::{Deployer, DeploymentData};
 use super::*;
 
 pub mod deployer;
diff --git a/kit/src/lib.rs b/kit/src/lib.rs
index b99004ca..605d6340 100644
--- a/kit/src/lib.rs
+++ b/kit/src/lib.rs
@@ -1,10 +1,20 @@
 pub mod behaviors;
 pub mod bindings;
 pub mod pool;
-pub use pool::{Pool, PoolType, Token};
-
 use anyhow::Result;
+use arbiter_bindings::bindings::arbiter_token::ArbiterToken;
 use arbiter_core::middleware::ArbiterMiddleware;
-use ethers::types::U256 as eU256;
+use bindings::{
+    constant_sum::ConstantSum,
+    constant_sum_solver::{ConstantSumParams, ConstantSumSolver},
+    dfmm::DFMM,
+    geometric_mean::GeometricMean,
+    geometric_mean_solver::{GeometricMeanParams, GeometricMeanSolver},
+    log_normal::LogNormal,
+    log_normal_solver::{LogNormalParams, LogNormalSolver},
+    weth::WETH,
+};
+use ethers::types::{Address as eAddress, U256 as eU256};
+use pool::{constant_sum::ConstantSumPool, Pool, PoolType, Token};
 use serde::{Deserialize, Serialize};
 use tracing::trace;
diff --git a/kit/src/pool/constant_sum.rs b/kit/src/pool/constant_sum.rs
index 9668a3a1..7bef01fb 100644
--- a/kit/src/pool/constant_sum.rs
+++ b/kit/src/pool/constant_sum.rs
@@ -1,22 +1,14 @@
-use bindings::{constant_sum::ConstantSum, constant_sum_solver::ConstantSumSolver};
-
 use super::*;
 
 #[derive(Debug)]
 pub struct ConstantSumPool {
     pub strategy_contract: ConstantSum<ArbiterMiddleware>,
     pub solver_contract: ConstantSumSolver<ArbiterMiddleware>,
-    pub parameters: ConstantSumParameters,
-}
-
-#[derive(Debug, Deserialize, Serialize)]
-pub struct ConstantSumParameters {
-    pub price: eU256,
-    pub swap_fee: eU256,
+    pub parameters: ConstantSumParams,
 }
 
 impl PoolType for ConstantSumPool {
-    type Parameters = ConstantSumParameters;
+    type Parameters = ConstantSumParams;
     type StrategyContract = ConstantSum<ArbiterMiddleware>;
     type SolverContract = ConstantSumSolver<ArbiterMiddleware>;
     type AllocationData = (AllocateOrDeallocate, eU256, eU256);