From c3d4e19ef08c02f5804ce20b805cecd6c4feb873 Mon Sep 17 00:00:00 2001 From: tamirms Date: Mon, 7 Oct 2024 16:27:26 -0400 Subject: [PATCH 1/5] Ingest new invoke host operation type --- .../ingest/processors/operations_processor.go | 61 +- .../internal/integration/contracts/Cargo.lock | 756 +++++++++++------- .../internal/integration/contracts/Cargo.toml | 5 +- .../contracts/constructor/Cargo.toml | 17 + .../contracts/constructor/src/lib.rs | 20 + .../integration/invokehostfunction_test.go | 118 ++- .../horizon/internal/integration/sac_test.go | 8 +- .../integration/testdata/soroban_add_u64.wasm | Bin 631 -> 631 bytes .../soroban_constructor_contract.wasm | Bin 0 -> 894 bytes .../testdata/soroban_increment_contract.wasm | Bin 701 -> 604 bytes .../testdata/soroban_sac_test.wasm | Bin 1924 -> 1887 bytes .../integration/testdata/soroban_store.wasm | Bin 449 -> 449 bytes 12 files changed, 683 insertions(+), 302 deletions(-) create mode 100644 services/horizon/internal/integration/contracts/constructor/Cargo.toml create mode 100644 services/horizon/internal/integration/contracts/constructor/src/lib.rs create mode 100755 services/horizon/internal/integration/testdata/soroban_constructor_contract.wasm diff --git a/services/horizon/internal/ingest/processors/operations_processor.go b/services/horizon/internal/ingest/processors/operations_processor.go index 252d5a6ba0..e99488744e 100644 --- a/services/horizon/internal/ingest/processors/operations_processor.go +++ b/services/horizon/internal/ingest/processors/operations_processor.go @@ -676,22 +676,7 @@ func (operation *transactionOperationWrapper) Details() (map[string]interface{}, args = append(args, xdr.ScVal{Type: xdr.ScValTypeScvAddress, Address: &invokeArgs.ContractAddress}) args = append(args, xdr.ScVal{Type: xdr.ScValTypeScvSymbol, Sym: &invokeArgs.FunctionName}) args = append(args, invokeArgs.Args...) - params := make([]map[string]string, 0, len(args)) - - for _, param := range args { - serializedParam := map[string]string{} - serializedParam["value"] = "n/a" - serializedParam["type"] = "n/a" - - if scValTypeName, ok := param.ArmForSwitch(int32(param.Type)); ok { - serializedParam["type"] = scValTypeName - if raw, err := param.MarshalBinary(); err == nil { - serializedParam["value"] = base64.StdEncoding.EncodeToString(raw) - } - } - params = append(params, serializedParam) - } - details["parameters"] = params + details["parameters"] = extractFunctionArgs(args) if balanceChanges, err := operation.parseAssetBalanceChangesFromContractEvents(); err != nil { return nil, err @@ -717,6 +702,32 @@ func (operation *transactionOperationWrapper) Details() (map[string]interface{}, default: panic(fmt.Errorf("unknown contract id type: %s", args.ContractIdPreimage.Type)) } + case xdr.HostFunctionTypeHostFunctionTypeCreateContractV2: + args := op.HostFunction.MustCreateContractV2() + switch args.ContractIdPreimage.Type { + case xdr.ContractIdPreimageTypeContractIdPreimageFromAddress: + fromAddress := args.ContractIdPreimage.MustFromAddress() + address, err := fromAddress.Address.String() + if err != nil { + panic(fmt.Errorf("error obtaining address for: %s", args.ContractIdPreimage.Type)) + } + details["from"] = "address" + details["address"] = address + details["salt"] = fromAddress.Salt.String() + case xdr.ContractIdPreimageTypeContractIdPreimageFromAsset: + details["from"] = "asset" + details["asset"] = args.ContractIdPreimage.MustFromAsset().StringCanonical() + default: + panic(fmt.Errorf("unknown contract id type: %s", args.ContractIdPreimage.Type)) + } + + details["parameters"] = extractFunctionArgs(args.ConstructorArgs) + + if balanceChanges, err := operation.parseAssetBalanceChangesFromContractEvents(); err != nil { + return nil, err + } else { + details["asset_balance_changes"] = balanceChanges + } case xdr.HostFunctionTypeHostFunctionTypeUploadContractWasm: default: panic(fmt.Errorf("unknown host function type: %s", op.HostFunction.Type)) @@ -740,6 +751,24 @@ func (operation *transactionOperationWrapper) Details() (map[string]interface{}, return details, nil } +func extractFunctionArgs(args []xdr.ScVal) []map[string]string { + params := make([]map[string]string, 0, len(args)) + for _, param := range args { + serializedParam := map[string]string{} + serializedParam["value"] = "n/a" + serializedParam["type"] = "n/a" + + if scValTypeName, ok := param.ArmForSwitch(int32(param.Type)); ok { + serializedParam["type"] = scValTypeName + if raw, err := param.MarshalBinary(); err == nil { + serializedParam["value"] = base64.StdEncoding.EncodeToString(raw) + } + } + params = append(params, serializedParam) + } + return params +} + // Searches an operation for SAC events that are of a type which represent // asset balances having changed. // diff --git a/services/horizon/internal/integration/contracts/Cargo.lock b/services/horizon/internal/integration/contracts/Cargo.lock index e80d7d5d28..9a51ac7a62 100644 --- a/services/horizon/internal/integration/contracts/Cargo.lock +++ b/services/horizon/internal/integration/contracts/Cargo.lock @@ -3,20 +3,17 @@ version = 3 [[package]] -name = "addr2line" -version = "0.21.0" +name = "ahash" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ - "gimli", + "cfg-if", + "once_cell", + "version_check", + "zerocopy", ] -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - [[package]] name = "android-tzdata" version = "0.1.1" @@ -42,37 +39,134 @@ dependencies = [ ] [[package]] -name = "autocfg" -version = "1.1.0" +name = "ark-bls12-381" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", +] [[package]] -name = "backtrace" -version = "0.3.69" +name = "ark-ec" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "zeroize", ] [[package]] -name = "base16ct" -version = "0.2.0" +name = "ark-ff" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest", + "itertools", + "num-bigint", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest", + "num-bigint", +] [[package]] -name = "base32" +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23ce669cd6c8588f79e15cf450314f9638f967fc5770ff1c7c1deb0925ea7cfa" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] name = "base64" @@ -82,9 +176,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.5" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" @@ -103,9 +197,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes-lit" @@ -116,16 +216,16 @@ dependencies = [ "num-bigint", "proc-macro2", "quote", - "syn", + "syn 2.0.79", ] [[package]] name = "cc" -version = "1.0.83" +version = "1.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "2e80e3b6a3ab07840e1cae9b0666a63970dc28e8ed5ffbcdacbfc760c281bfc1" dependencies = [ - "libc", + "shlex", ] [[package]] @@ -136,9 +236,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", @@ -149,21 +249,21 @@ dependencies = [ [[package]] name = "const-oid" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.11" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] @@ -203,26 +303,25 @@ dependencies = [ [[package]] name = "ctor" -version = "0.2.5" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37e366bff8cd32dd8754b0991fb66b279dc48f598c3a18914852a6673deef583" +checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn", + "syn 2.0.79", ] [[package]] name = "curve25519-dalek" -version = "4.1.1" +version = "4.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89b8c6a2e4b1f45971ad09761aafb85514a84744b67a95e32c3cc1352d1f65c" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", "digest", "fiat-crypto", - "platforms", "rustc_version", "subtle", "zeroize", @@ -236,14 +335,14 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.79", ] [[package]] name = "darling" -version = "0.20.3" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ "darling_core", "darling_macro", @@ -251,34 +350,40 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.3" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn", + "syn 2.0.79", ] [[package]] name = "darling_macro" -version = "0.20.3" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.79", ] +[[package]] +name = "data-encoding" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + [[package]] name = "der" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" dependencies = [ "const-oid", "zeroize", @@ -286,14 +391,25 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.9" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", "serde", ] +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "derive_arbitrary" version = "1.3.2" @@ -302,7 +418,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.79", ] [[package]] @@ -319,9 +435,9 @@ dependencies = [ [[package]] name = "downcast-rs" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "ecdsa" @@ -334,7 +450,6 @@ dependencies = [ "elliptic-curve", "rfc6979", "signature", - "spki", ] [[package]] @@ -349,9 +464,9 @@ dependencies = [ [[package]] name = "ed25519-dalek" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f628eaec48bfd21b865dc2950cfa014450c01d2fa2b69a86c2fd5844ec523c0" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ "curve25519-dalek", "ed25519", @@ -364,9 +479,9 @@ dependencies = [ [[package]] name = "either" -version = "1.9.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "elliptic-curve" @@ -380,7 +495,6 @@ dependencies = [ "ff", "generic-array", "group", - "pkcs8", "rand_core", "sec1", "subtle", @@ -393,6 +507,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "escape-bytes" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bfcf67fea2815c2fc3b90873fae90957be12ff417335dfadc7f52927feb03b2" + [[package]] name = "ethnum" version = "1.5.0" @@ -411,9 +531,9 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.2.5" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27573eac26f4dd11e2b1916c3fe1baa56407c83c71a773a8ba17ec0bca03b6b7" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "fnv" @@ -434,9 +554,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.11" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "js-sys", @@ -445,12 +565,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "gimli" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" - [[package]] name = "group" version = "0.13.0" @@ -470,9 +584,18 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" [[package]] name = "hex" @@ -500,9 +623,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.58" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -540,12 +663,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.1.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown 0.15.0", "serde", ] @@ -557,56 +680,54 @@ checksum = "8e04e2fd2b8188ea827b32ef11de88377086d690286ab35747ef7f9bf3ccb590" [[package]] name = "itertools" -version = "0.11.0" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.66" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ "wasm-bindgen", ] [[package]] name = "k256" -version = "0.13.2" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f01b677d82ef7a676aa37e099defd83a28e15687112cafdd112d60236b6115b" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "once_cell", "sha2", - "signature", ] [[package]] name = "keccak" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" dependencies = [ "cpufeatures", ] [[package]] name = "libc" -version = "0.2.150" +version = "0.2.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" [[package]] name = "libm" @@ -616,86 +737,84 @@ checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "log" -version = "0.4.20" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "memchr" -version = "2.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" - -[[package]] -name = "miniz_oxide" -version = "0.7.1" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", -] +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "num-bigint" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "autocfg", "num-integer", "num-traits", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-derive" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.79", ] [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] [[package]] -name = "object" -version = "0.32.1" +name = "once_cell" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" -dependencies = [ - "memchr", -] +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] -name = "once_cell" -version = "1.18.0" +name = "p256" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pkcs8" @@ -707,12 +826,6 @@ dependencies = [ "spki", ] -[[package]] -name = "platforms" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14e6ab3f592e6fb464fc9712d8d6e6912de6473954635fd76a589d832cffcbb0" - [[package]] name = "powerfmt" version = "0.2.0" @@ -721,34 +834,46 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "prettyplease" -version = "0.2.15" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" +checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" dependencies = [ "proc-macro2", - "syn", + "syn 2.0.79", +] + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", ] [[package]] name = "proc-macro2" -version = "1.0.70" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.33" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -793,26 +918,20 @@ dependencies = [ "subtle", ] -[[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver", ] [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sec1" @@ -823,60 +942,61 @@ dependencies = [ "base16ct", "der", "generic-array", - "pkcs8", "subtle", "zeroize", ] [[package]] name = "semver" -version = "1.0.20" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.193" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.193" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.79", ] [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] [[package]] name = "serde_with" -version = "3.4.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64cd236ccc1b7a29e7e2739f27c0b2dd199804abc4290e32f59f3b68d6405c23" +checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" dependencies = [ - "base64 0.21.5", + "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.1.0", + "indexmap 2.6.0", "serde", + "serde_derive", "serde_json", "serde_with_macros", "time", @@ -884,14 +1004,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.4.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93634eb5f75a2323b16de4748022ac4297f9e76b6dced2be287a099f41b5e788" +checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.79", ] [[package]] @@ -915,6 +1035,12 @@ dependencies = [ "keccak", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signature" version = "2.2.0" @@ -927,25 +1053,34 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "soroban-builtin-sdk-macros" -version = "20.0.0-rc2" -source = "git+https://github.com/stellar/rs-soroban-env?rev=be04cf31e925ba5bacd9b22db7caf7b4f6dd8372#be04cf31e925ba5bacd9b22db7caf7b4f6dd8372" +version = "22.0.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cdb13e8f4556fe89d2b1c8f529a66997e1d90fd6f10440dc5a1717f5f733251" dependencies = [ "itertools", "proc-macro2", "quote", - "syn", + "syn 2.0.79", +] + +[[package]] +name = "soroban-constructor-contract" +version = "0.0.0" +dependencies = [ + "soroban-sdk", ] [[package]] name = "soroban-env-common" -version = "20.0.0-rc2" -source = "git+https://github.com/stellar/rs-soroban-env?rev=be04cf31e925ba5bacd9b22db7caf7b4f6dd8372#be04cf31e925ba5bacd9b22db7caf7b4f6dd8372" +version = "22.0.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "984c9a1a84c05599f5c9cb17d5fbb75fe1c7106598659a34d9da8a8f16d2c23f" dependencies = [ "arbitrary", "crate-git-revision", @@ -957,12 +1092,14 @@ dependencies = [ "soroban-wasmi", "static_assertions", "stellar-xdr", + "wasmparser", ] [[package]] name = "soroban-env-guest" -version = "20.0.0-rc2" -source = "git+https://github.com/stellar/rs-soroban-env?rev=be04cf31e925ba5bacd9b22db7caf7b4f6dd8372#be04cf31e925ba5bacd9b22db7caf7b4f6dd8372" +version = "22.0.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "570dfaa0f35b373a2f9793b89a1864caf68e9071c5c8a4100654aa3434b4fde1" dependencies = [ "soroban-env-common", "static_assertions", @@ -970,12 +1107,19 @@ dependencies = [ [[package]] name = "soroban-env-host" -version = "20.0.0-rc2" -source = "git+https://github.com/stellar/rs-soroban-env?rev=be04cf31e925ba5bacd9b22db7caf7b4f6dd8372#be04cf31e925ba5bacd9b22db7caf7b4f6dd8372" +version = "22.0.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e59d22359f8d372872b7630fc0dc6884c36356d5d33d3fca83d2b76e572c2a32" dependencies = [ - "backtrace", + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-serialize", "curve25519-dalek", + "ecdsa", "ed25519-dalek", + "elliptic-curve", + "generic-array", "getrandom", "hex-literal", "hmac", @@ -983,8 +1127,10 @@ dependencies = [ "num-derive", "num-integer", "num-traits", + "p256", "rand", "rand_chacha", + "sec1", "sha2", "sha3", "soroban-builtin-sdk-macros", @@ -992,12 +1138,14 @@ dependencies = [ "soroban-wasmi", "static_assertions", "stellar-strkey", + "wasmparser", ] [[package]] name = "soroban-env-macros" -version = "20.0.0-rc2" -source = "git+https://github.com/stellar/rs-soroban-env?rev=be04cf31e925ba5bacd9b22db7caf7b4f6dd8372#be04cf31e925ba5bacd9b22db7caf7b4f6dd8372" +version = "22.0.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76184b736ac2ce144461efbe7c3551ac2c2973fa144e32957bb2ae2d80467f64" dependencies = [ "itertools", "proc-macro2", @@ -1005,7 +1153,7 @@ dependencies = [ "serde", "serde_json", "stellar-xdr", - "syn", + "syn 2.0.79", ] [[package]] @@ -1017,8 +1165,8 @@ dependencies = [ [[package]] name = "soroban-ledger-snapshot" -version = "20.0.0-rc2" -source = "git+https://github.com/stellar/rs-soroban-sdk?rev=e35bace9de5addae7c32f405cdc11bb459cb1d61#e35bace9de5addae7c32f405cdc11bb459cb1d61" +version = "22.0.0-rc.2" +source = "git+https://github.com/stellar/rs-soroban-sdk?rev=f0e653e364b19a7bf23bcb6b1cb2427ba12cee44#f0e653e364b19a7bf23bcb6b1cb2427ba12cee44" dependencies = [ "serde", "serde_json", @@ -1037,8 +1185,8 @@ dependencies = [ [[package]] name = "soroban-sdk" -version = "20.0.0-rc2" -source = "git+https://github.com/stellar/rs-soroban-sdk?rev=e35bace9de5addae7c32f405cdc11bb459cb1d61#e35bace9de5addae7c32f405cdc11bb459cb1d61" +version = "22.0.0-rc.2" +source = "git+https://github.com/stellar/rs-soroban-sdk?rev=f0e653e364b19a7bf23bcb6b1cb2427ba12cee44#f0e653e364b19a7bf23bcb6b1cb2427ba12cee44" dependencies = [ "arbitrary", "bytes-lit", @@ -1056,8 +1204,8 @@ dependencies = [ [[package]] name = "soroban-sdk-macros" -version = "20.0.0-rc2" -source = "git+https://github.com/stellar/rs-soroban-sdk?rev=e35bace9de5addae7c32f405cdc11bb459cb1d61#e35bace9de5addae7c32f405cdc11bb459cb1d61" +version = "22.0.0-rc.2" +source = "git+https://github.com/stellar/rs-soroban-sdk?rev=f0e653e364b19a7bf23bcb6b1cb2427ba12cee44#f0e653e364b19a7bf23bcb6b1cb2427ba12cee44" dependencies = [ "crate-git-revision", "darling", @@ -1070,13 +1218,13 @@ dependencies = [ "soroban-spec", "soroban-spec-rust", "stellar-xdr", - "syn", + "syn 2.0.79", ] [[package]] name = "soroban-spec" -version = "20.0.0-rc2" -source = "git+https://github.com/stellar/rs-soroban-sdk?rev=e35bace9de5addae7c32f405cdc11bb459cb1d61#e35bace9de5addae7c32f405cdc11bb459cb1d61" +version = "22.0.0-rc.2" +source = "git+https://github.com/stellar/rs-soroban-sdk?rev=f0e653e364b19a7bf23bcb6b1cb2427ba12cee44#f0e653e364b19a7bf23bcb6b1cb2427ba12cee44" dependencies = [ "base64 0.13.1", "stellar-xdr", @@ -1086,8 +1234,8 @@ dependencies = [ [[package]] name = "soroban-spec-rust" -version = "20.0.0-rc2" -source = "git+https://github.com/stellar/rs-soroban-sdk?rev=e35bace9de5addae7c32f405cdc11bb459cb1d61#e35bace9de5addae7c32f405cdc11bb459cb1d61" +version = "22.0.0-rc.2" +source = "git+https://github.com/stellar/rs-soroban-sdk?rev=f0e653e364b19a7bf23bcb6b1cb2427ba12cee44#f0e653e364b19a7bf23bcb6b1cb2427ba12cee44" dependencies = [ "prettyplease", "proc-macro2", @@ -1095,7 +1243,7 @@ dependencies = [ "sha2", "soroban-spec", "stellar-xdr", - "syn", + "syn 2.0.79", "thiserror", ] @@ -1108,8 +1256,9 @@ dependencies = [ [[package]] name = "soroban-wasmi" -version = "0.31.0-soroban1" -source = "git+https://github.com/stellar/wasmi?rev=7e63b4c9e08c4163f417d118d81f7ea34789d0be#7e63b4c9e08c4163f417d118d81f7ea34789d0be" +version = "0.31.1-soroban.20.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "710403de32d0e0c35375518cb995d4fc056d0d48966f2e56ea471b8cb8fc9719" dependencies = [ "smallvec", "spin", @@ -1149,23 +1298,25 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "stellar-strkey" -version = "0.0.8" +version = "0.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12d2bf45e114117ea91d820a846fd1afbe3ba7d717988fee094ce8227a3bf8bd" +checksum = "5e3aa3ed00e70082cb43febc1c2afa5056b9bb3e348bbb43d0cd0aa88a611144" dependencies = [ - "base32", "crate-git-revision", + "data-encoding", "thiserror", ] [[package]] name = "stellar-xdr" -version = "20.0.0-rc1" -source = "git+https://github.com/stellar/rs-stellar-xdr?rev=d6f8ece2c89809d5e2800b9df64ae60787ee492b#d6f8ece2c89809d5e2800b9df64ae60787ee492b" +version = "22.0.0-rc.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c88dc0e928b9cb65ea43836b52560bb4ead3e32895f5019ca223dc7cd1966cbf" dependencies = [ "arbitrary", "base64 0.13.1", "crate-git-revision", + "escape-bytes", "hex", "serde", "serde_with", @@ -1174,21 +1325,32 @@ dependencies = [ [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.39" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" dependencies = [ "proc-macro2", "quote", @@ -1197,32 +1359,33 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.50" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.50" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.79", ] [[package]] name = "time" -version = "0.3.30" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", + "num-conv", "powerfmt", "serde", "time-core", @@ -1237,10 +1400,11 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.15" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ + "num-conv", "time-core", ] @@ -1252,15 +1416,15 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "wasi" @@ -1270,34 +1434,35 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.89" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.89" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn", + "syn 2.0.79", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.89" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1305,32 +1470,34 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.89" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.79", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.89" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] name = "wasmi_arena" -version = "0.4.0" -source = "git+https://github.com/stellar/wasmi?rev=7e63b4c9e08c4163f417d118d81f7ea34789d0be#7e63b4c9e08c4163f417d118d81f7ea34789d0be" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "104a7f73be44570cac297b3035d76b169d6599637631cf37a1703326a0727073" [[package]] name = "wasmi_core" version = "0.13.0" -source = "git+https://github.com/stellar/wasmi?rev=7e63b4c9e08c4163f417d118d81f7ea34789d0be#7e63b4c9e08c4163f417d118d81f7ea34789d0be" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf1a7db34bff95b85c261002720c00c3a6168256dcb93041d3fa2054d19856a" dependencies = [ "downcast-rs", "libm", @@ -1340,40 +1507,42 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.88.0" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb8cf7dd82407fe68161bedcd57fde15596f32ebf6e9b3bdbf3ae1da20e38e5e" +checksum = "a58e28b80dd8340cb07b8242ae654756161f6fc8d0038123d679b7b99964fa50" dependencies = [ - "indexmap 1.9.3", + "indexmap 2.6.0", + "semver", ] [[package]] name = "wasmparser-nostd" -version = "0.100.1" +version = "0.100.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9157cab83003221bfd385833ab587a039f5d6fa7304854042ba358a3b09e0724" +checksum = "d5a015fe95f3504a94bb1462c717aae75253e39b9dd6c3fb1062c934535c64aa" dependencies = [ "indexmap-nostd", ] [[package]] name = "windows-core" -version = "0.51.1" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", + "windows_i686_gnullvm", "windows_i686_msvc", "windows_x86_64_gnu", "windows_x86_64_gnullvm", @@ -1382,48 +1551,89 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" -version = "0.48.5" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" -version = "0.48.5" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] diff --git a/services/horizon/internal/integration/contracts/Cargo.toml b/services/horizon/internal/integration/contracts/Cargo.toml index 72ada87404..2fcdb8fd5b 100644 --- a/services/horizon/internal/integration/contracts/Cargo.toml +++ b/services/horizon/internal/integration/contracts/Cargo.toml @@ -6,6 +6,7 @@ members = [ "increment", "add_u64", "store", + "constructor", ] [profile.release-with-logs] @@ -23,6 +24,6 @@ codegen-units = 1 lto = true [workspace.dependencies.soroban-sdk] -version = "20.0.0-rc2" +version = "22.0.0-rc.2" git = "https://github.com/stellar/rs-soroban-sdk" -rev = "e35bace9de5addae7c32f405cdc11bb459cb1d61" +rev = "f0e653e364b19a7bf23bcb6b1cb2427ba12cee44" diff --git a/services/horizon/internal/integration/contracts/constructor/Cargo.toml b/services/horizon/internal/integration/contracts/constructor/Cargo.toml new file mode 100644 index 0000000000..1ff6d4e505 --- /dev/null +++ b/services/horizon/internal/integration/contracts/constructor/Cargo.toml @@ -0,0 +1,17 @@ +[package] +version = "0.0.0" +name = "soroban-constructor-contract" +authors = ["Stellar Development Foundation "] +license = "Apache-2.0" +edition = "2021" +publish = false + +[lib] +crate-type = ["cdylib"] +doctest = false + +[dependencies] +soroban-sdk = { workspace = true } + +[dev_dependencies] +soroban-sdk = { workspace = true, features = ["testutils"] } diff --git a/services/horizon/internal/integration/contracts/constructor/src/lib.rs b/services/horizon/internal/integration/contracts/constructor/src/lib.rs new file mode 100644 index 0000000000..dcd13337ba --- /dev/null +++ b/services/horizon/internal/integration/contracts/constructor/src/lib.rs @@ -0,0 +1,20 @@ +#![no_std] +use soroban_sdk::{contract, contractimpl, Env, Symbol}; + +#[contract] +pub struct Contract; + +#[contractimpl] +impl Contract { + pub fn __constructor(env: Env, key: Symbol) { + env.storage().persistent().set(&key, &1_u32); + env.storage().instance().set(&key, &2_u32); + env.storage().temporary().set(&key, &3_u32); + } + + pub fn get_data(env: Env, key: Symbol) -> u32 { + env.storage().persistent().get::<_, u32>(&key).unwrap() + + env.storage().instance().get::<_, u32>(&key).unwrap() + + env.storage().temporary().get::<_, u32>(&key).unwrap() + } +} diff --git a/services/horizon/internal/integration/invokehostfunction_test.go b/services/horizon/internal/integration/invokehostfunction_test.go index 6447b98147..a21251c2f6 100644 --- a/services/horizon/internal/integration/invokehostfunction_test.go +++ b/services/horizon/internal/integration/invokehostfunction_test.go @@ -19,6 +19,7 @@ import ( const add_u64_contract = "soroban_add_u64.wasm" const increment_contract = "soroban_increment_contract.wasm" +const constructor_contract = "soroban_constructor_contract.wasm" // Tests use precompiled wasm bin files that are added to the testdata directory. // Refer to ./services/horizon/internal/integration/contracts/README.md on how to recompile @@ -94,7 +95,7 @@ func TestContractInvokeHostFunctionCreateContractByAddress(t *testing.T) { itest.MustSubmitOperationsWithFee(&sourceAccount, itest.Master(), minFee+txnbuild.MinBaseFee, &preFlightOp) // Create the contract - createContractOp := assembleCreateContractOp(t, itest.Master().Address(), add_u64_contract, "a1", itest.GetPassPhrase()) + createContractOp := assembleCreateContractOp(t, itest.Master().Address(), add_u64_contract, "a1") preFlightOp, minFee = itest.PreflightHostFunctions(&sourceAccount, *createContractOp) tx, err := itest.SubmitOperationsWithFee(&sourceAccount, itest.Master(), minFee+txnbuild.MinBaseFee, &preFlightOp) require.NoError(t, err) @@ -126,6 +127,78 @@ func TestContractInvokeHostFunctionCreateContractByAddress(t *testing.T) { assert.Equal(t, invokeHostFunctionOpJson.Salt, "110986164698320180327942133831752629430491002266485370052238869825166557303060") } +func TestContractInvokeHostFunctionCreateConstructorContract(t *testing.T) { + if integration.GetCoreMaxSupportedProtocol() < 20 { + t.Skip("This test run does not support less than Protocol 20") + } + + itest := integration.NewTest(t, integration.Config{ + EnableSorobanRPC: true, + }) + + // establish which account will be contract owner, and load it's current seq + sourceAccount, err := itest.Client().AccountDetail(horizonclient.AccountRequest{ + AccountID: itest.Master().Address(), + }) + require.NoError(t, err) + + // Install the contract + installContractOp := assembleInstallContractCodeOp(t, itest.Master().Address(), constructor_contract) + preFlightOp, minFee := itest.PreflightHostFunctions(&sourceAccount, *installContractOp) + itest.MustSubmitOperationsWithFee(&sourceAccount, itest.Master(), minFee+txnbuild.MinBaseFee, &preFlightOp) + + // Create the contract + keySym := xdr.ScSymbol("constructorKey") + keyArg := xdr.ScVal{ + Type: xdr.ScValTypeScvSymbol, + Sym: &keySym, + } + createContractOp := assembleCreateContractConstructorOp( + t, + itest.Master().Address(), + constructor_contract, + "a1", + []xdr.ScVal{ + keyArg, + }, + ) + preFlightOp, minFee = itest.PreflightHostFunctions(&sourceAccount, *createContractOp) + tx, err := itest.SubmitOperationsWithFee(&sourceAccount, itest.Master(), minFee+txnbuild.MinBaseFee, &preFlightOp) + require.NoError(t, err) + + clientTx, err := itest.Client().TransactionDetail(tx.Hash) + require.NoError(t, err) + + assert.Equal(t, tx.Hash, clientTx.Hash) + var txResult xdr.TransactionResult + err = xdr.SafeUnmarshalBase64(clientTx.ResultXdr, &txResult) + require.NoError(t, err) + + opResults, ok := txResult.OperationResults() + assert.True(t, ok) + assert.Equal(t, len(opResults), 1) + invokeHostFunctionResult, ok := opResults[0].MustTr().GetInvokeHostFunctionResult() + assert.True(t, ok) + assert.Equal(t, invokeHostFunctionResult.Code, xdr.InvokeHostFunctionResultCodeInvokeHostFunctionSuccess) + + clientInvokeOp, err := itest.Client().Operations(horizonclient.OperationRequest{ + ForTransaction: tx.Hash, + }) + require.NoError(t, err) + + invokeHostFunctionOpJson, ok := clientInvokeOp.Embedded.Records[0].(operations.InvokeHostFunction) + assert.True(t, ok) + assert.Equal(t, invokeHostFunctionOpJson.Function, "HostFunctionTypeHostFunctionTypeCreateContractV2") + assert.Equal(t, invokeHostFunctionOpJson.Address, sourceAccount.AccountID) + assert.Equal(t, invokeHostFunctionOpJson.Salt, "110986164698320180327942133831752629430491002266485370052238869825166557303060") + assert.Len(t, invokeHostFunctionOpJson.Parameters, 1) + serializedKey, err := xdr.MarshalBase64(keyArg) + assert.NoError(t, err) + assert.Equal(t, invokeHostFunctionOpJson.Parameters[0].Value, serializedKey) + assert.Equal(t, invokeHostFunctionOpJson.Parameters[0].Type, "Sym") + assert.Empty(t, invokeHostFunctionOpJson.AssetBalanceChanges) +} + func TestContractInvokeHostFunctionInvokeStatelessContractFn(t *testing.T) { if integration.GetCoreMaxSupportedProtocol() < 20 { t.Skip("This test run does not support less than Protocol 20") @@ -147,7 +220,7 @@ func TestContractInvokeHostFunctionInvokeStatelessContractFn(t *testing.T) { itest.MustSubmitOperationsWithFee(&sourceAccount, itest.Master(), minFee+txnbuild.MinBaseFee, &preFlightOp) // Create the contract - createContractOp := assembleCreateContractOp(t, itest.Master().Address(), add_u64_contract, "a1", itest.GetPassPhrase()) + createContractOp := assembleCreateContractOp(t, itest.Master().Address(), add_u64_contract, "a1") preFlightOp, minFee = itest.PreflightHostFunctions(&sourceAccount, *createContractOp) tx, err := itest.SubmitOperationsWithFee(&sourceAccount, itest.Master(), minFee+txnbuild.MinBaseFee, &preFlightOp) require.NoError(t, err) @@ -257,7 +330,7 @@ func TestContractInvokeHostFunctionInvokeStatefulContractFn(t *testing.T) { // Create the contract - createContractOp := assembleCreateContractOp(t, itest.Master().Address(), increment_contract, "a1", itest.GetPassPhrase()) + createContractOp := assembleCreateContractOp(t, itest.Master().Address(), increment_contract, "a1") preFlightOp, minFee = itest.PreflightHostFunctions(&sourceAccount, *createContractOp) tx, err := itest.SubmitOperationsWithFee(&sourceAccount, itest.Master(), minFee+txnbuild.MinBaseFee, &preFlightOp) require.NoError(t, err) @@ -342,7 +415,7 @@ func assembleInstallContractCodeOp(t *testing.T, sourceAccount string, wasmFileN } } -func assembleCreateContractOp(t *testing.T, sourceAccount string, wasmFileName string, contractSalt string, passPhrase string) *txnbuild.InvokeHostFunction { +func assembleCreateContractOp(t *testing.T, sourceAccount string, wasmFileName string, contractSalt string) *txnbuild.InvokeHostFunction { // Assemble the InvokeHostFunction CreateContract operation: // CAP-0047 - https://github.com/stellar/stellar-protocol/blob/master/core/cap-0047.md#creating-a-contract-using-invokehostfunctionop @@ -380,3 +453,40 @@ func assembleCreateContractOp(t *testing.T, sourceAccount string, wasmFileName s SourceAccount: sourceAccount, } } + +func assembleCreateContractConstructorOp(t *testing.T, sourceAccount string, wasmFileName string, contractSalt string, args []xdr.ScVal) *txnbuild.InvokeHostFunction { + contract, err := os.ReadFile(filepath.Join("testdata", wasmFileName)) + require.NoError(t, err) + + salt := sha256.Sum256([]byte(contractSalt)) + t.Logf("Salt hash: %v", hex.EncodeToString(salt[:])) + saltParameter := xdr.Uint256(salt) + + accountId := xdr.MustAddress(sourceAccount) + require.NoError(t, err) + contractHash := xdr.Hash(sha256.Sum256(contract)) + + return &txnbuild.InvokeHostFunction{ + HostFunction: xdr.HostFunction{ + Type: xdr.HostFunctionTypeHostFunctionTypeCreateContractV2, + CreateContractV2: &xdr.CreateContractArgsV2{ + ContractIdPreimage: xdr.ContractIdPreimage{ + Type: xdr.ContractIdPreimageTypeContractIdPreimageFromAddress, + FromAddress: &xdr.ContractIdPreimageFromAddress{ + Address: xdr.ScAddress{ + Type: xdr.ScAddressTypeScAddressTypeAccount, + AccountId: &accountId, + }, + Salt: saltParameter, + }, + }, + Executable: xdr.ContractExecutable{ + Type: xdr.ContractExecutableTypeContractExecutableWasm, + WasmHash: &contractHash, + }, + ConstructorArgs: args, + }, + }, + SourceAccount: sourceAccount, + } +} diff --git a/services/horizon/internal/integration/sac_test.go b/services/horizon/internal/integration/sac_test.go index 6356ba9ac5..4a9db284bf 100644 --- a/services/horizon/internal/integration/sac_test.go +++ b/services/horizon/internal/integration/sac_test.go @@ -1421,13 +1421,7 @@ func mustCreateAndInstallContract(itest *integration.Test, signer *keypair.Full, _, _, createContractOp := assertInvokeHostFnSucceeds( itest, signer, - assembleCreateContractOp( - itest.CurrentTest(), - itest.Master().Address(), - wasmFileName, - contractSalt, - itest.GetPassPhrase(), - ), + assembleCreateContractOp(itest.CurrentTest(), itest.Master().Address(), wasmFileName, contractSalt), ) keys := append( diff --git a/services/horizon/internal/integration/testdata/soroban_add_u64.wasm b/services/horizon/internal/integration/testdata/soroban_add_u64.wasm index 9ffd8622b744ae3355a7a3fbda92b20afdba0dc5..e2cc3ccc2bb8bb78f49e167a27c5dd27d0de92db 100755 GIT binary patch delta 92 zcmey)@||VFUq(i;$^RI&{VWXi3>aX5qo}wzCA%!O2q<7;WTa=HXP{e@tY@U0W{_%T oYMg3pW|CxRnP{GrW@Ma{oMe_{n4Dx}Vq~6_XlRt2nrdPK0B^GxP5=M^ delta 92 zcmey)@||VFUq(ie$^RI&{mf1D3>aX5qo}wzCA%!O2q<7|WS|Fxx<$!G%BjYtNr}m+ mmMN*Gi76?GspiSXMrkGnrpYPEhK5N=CZ?9jNrowAh716Z8W`aK diff --git a/services/horizon/internal/integration/testdata/soroban_constructor_contract.wasm b/services/horizon/internal/integration/testdata/soroban_constructor_contract.wasm new file mode 100755 index 0000000000000000000000000000000000000000..658699e79e710ac3c79349610c4131090c819520 GIT binary patch literal 894 zcmaJ<&2G~`5T4n!-6U38S4frMfL3lL#DOSwOaiysqN+H;3plp31vO35+9pyjcA)$e zUL>bJ05{G&3NKN1{ZpqL*u%~@GvBxKdA$%MGXwy9vNfhzmSHv~#ZI$4gE1BbiDWe& z1CR$4&(If&GqeE3-Upa zr16I+UBsZY-tp9*1Ze=87@>FkBJufrLQ(hq_dGcF!yw_5bbiwI9xz~d*jIME7 zp5+n!K+KTCN3zc4<@%)>W&8|scgKT3`wFPwl5$+r0GX&gjpa?Yb= zU)1aM&xlqyz8V)dU*E1mKiHY)z91|O5Shh2=HBDUTF!7}f zlR(>KenwXzP6mPYhK2?P25uIh?c7WZ+>y~kdg)lN9~DsWw;zS zfY~wvtrLH{#v<_=|KfEeVHoS2i7nxc^4Ur>^npJ!!Nnpa+wSfHVqppc)Z zkf@O0m!FrKpiq{WQ<@6Y%)pRXQj(fmP@+(huaKCMqEMb$lA(}amRgjSlV3hLh;ag= z$mGY2+DzsqlLeT>O^uBV^ng&eDA`Ck)z~yCF*(&TCDjzDGcnaX+1Mz}#K1H;CE3t0 QDapjtGC9dG#mtZa0Q2QiU;qFB diff --git a/services/horizon/internal/integration/testdata/soroban_sac_test.wasm b/services/horizon/internal/integration/testdata/soroban_sac_test.wasm index 9424da50fd6f580b243c78ea1a342b13d2432169..7e1e7ea9d3bc6dd3eeb4d5ff43cf70715ff3e873 100755 GIT binary patch literal 1887 zcmZWq&2Jk;6n}5VyIE)Jcq$M|b3nT(Ld~JZc1&CjsM%4|3gyxk#MN0ln>L%;F18y{ zf$Tt>gwLvg3P+Bddf@;!=!GK^e*xS$aOj02Lg{<6yLO^Zl$rNE@8h>)2>WdW0DLXK zA%;U7ZpfiIfJkIsj7GEr5HSR!g$*2mcykt;7?bB6EStSz_68unk982Zi?>L!jh8^u zUN`#+Nj8yeq$-M>u%wVS%z$M%mL(C++UMj5gT1{c;Eo_TNY96S&b;l|?Wo=D-4~GC z?raZWE`KW;GzQ(Br~}1(^Iosh=tp<9Kske6*y(RYJ$RAsnxAbnHp4;Kh&r1R-A3bf z6y9w#!+s>i?2q~4e<+bkl%w-|v>;GBi|~peHTW2O;0v+Je{$6mYXuC@mx4&nZV%#% z0E@ZcFSuF&lIDWzad3?91+#CZ{I8=#us{M*f1k4F)(aM~Yq2lS2$!gJrjV(dM7bVn z`_Pk*^)c>`eWdF!_Qe@+S>qh)ITDgNw`va_Ywu9!#(GRy{{hP6?o%xAur3`B0w)eo zea_WUD5@|{>hsWD055a*FpZ-Q*wS4^9CF?2GiDb-qxy&`jW?+jWf3~Qm3sqRi?IW?Gf_>LeKuOq!gWA>!L<97M1j0fr~ zwxgi9B%SMPln-)|DqfP{6SE|hFOp!sRNNQva~`#kT)$?nE-w(9t4l8c-;%2o$_muA z0x)Z4P3+YInz)`7)9J-@QvA9EvUOtLGUJf?!QVgspHC7HNte|(d31dU!1SjCG0bLH7RJ@+Rhx#~O@Gei>g9B1uKJxHjtRVpbLD3y^ zZPeIL$P3&nI2jv#NirE52PPY#K4lvN1aX66%Agpl?^s5NkrQCL$Ik;mOe3X0;tWJE zPhCmi;E5$UZ@?ge3kC^v zN_sP;1U&(B2+131y<;A~eKFVScIeS-4f=PZ)-JurAm~3^Ggs*OTaWHDkC~9p)cu46 z(x-K5=VXz|>V;F504LtxiH75!v^()G8=LHYJ8XCFbp}S}PP`Lh`hHLA5QDB!X0f05 zfB9^dYSh_nM}yGxft_A5p8ZLaPARQkf0uqK%(5$`OO+D0FIi5n-{0Ix)U|50R4$b- t_FARt`K@xa^7?YLyi#jc-U#c>t?F{K)m&*-TFq*$T5pDxYAcFrwP)S3e@*}Z literal 1924 zcmZuyOK%)S5U%Q;*SfuNTS3V70rfZt#fLavKeFV2vNMW}kS|FFrr~(~<`G9wc)0SFEbafJ8wSq5hir5Q)`UVT|ezlsFK5 z97GU`7(yv(q9$twjaVzw7M0e@BF4}WH3LRuHvnec=wDbXgK?i*u^ZjXqOteNKqhYV z=OBw_h#~S zL2*t7_g3jX$j#B&oP>~=IjKXD2MeV>WaH3@p4pB%`UlIqhWbLGeq^pHuM_K3rJ)9T zvPPl3NWWVKW^E^lhY%fT!_UvEW0#ih*NN-#ImS zd=x_t4#J&c+)*NZN?xGu;(0siGn08cIWXA>{RP`tfQb7PQ$`b+{)J_PBzgX!sZ;R^ zFvKWQ0WiLSh^DAVIZTY0lT#KXBD!u7LK)|zA!Jy%g-(GGH#)Wm2?~UGgb%J+fe_7b z;XxpbOGP4N_!cOBG?fFzw?H8_|K#Zgen!Ur5G6jN#J4DM3QIVRl=aVSX>!-Fw{bS(!Tb&WX{C zAH75L_N;Ok`&IupCWlu|+xxp|FR^uCr`N1!_q<4#ly0ZHProL1d6oI<@;sL>UqPqa zZEff3rNxDL`n%C-E?!HQRvJk&z1>Pzl2$88tIegw&EsAF` E0!iL~#sB~S diff --git a/services/horizon/internal/integration/testdata/soroban_store.wasm b/services/horizon/internal/integration/testdata/soroban_store.wasm index 7f839bd20839c603505278596459bc09871e5760..1d7f39938896ec8ac669c7f60e7f147c3c5b16d7 100755 GIT binary patch delta 92 zcmX@ee2{sAJ0qjmWDiDdKMO-W0|pr2C@L;a$u3JR0t%QI8R;458R!-z>lrDh8Kjz- o8mAhYnIsunCYmRu85t)fCz&M~CMOx07?~#}8X6_1rka=l0MKR@bN~PV delta 92 zcmX@ee2{sAJ0qjWWDiDdKXVg30|pr2C@L;a$u3JR0ty%#8R!9_Zc(z4a;mXuQetwd mWlE}PVoFM4s(G@pQJRT?X>v-kp Date: Mon, 7 Oct 2024 17:46:59 -0400 Subject: [PATCH 2/5] update test --- .../contracts/constructor/src/lib.rs | 14 +++-- .../integration/invokehostfunction_test.go | 52 ++++++++++++++---- .../soroban_constructor_contract.wasm | Bin 894 -> 1251 bytes 3 files changed, 50 insertions(+), 16 deletions(-) diff --git a/services/horizon/internal/integration/contracts/constructor/src/lib.rs b/services/horizon/internal/integration/contracts/constructor/src/lib.rs index dcd13337ba..5935ed9162 100644 --- a/services/horizon/internal/integration/contracts/constructor/src/lib.rs +++ b/services/horizon/internal/integration/contracts/constructor/src/lib.rs @@ -1,15 +1,19 @@ #![no_std] -use soroban_sdk::{contract, contractimpl, Env, Symbol}; +use soroban_sdk::{contract, contractimpl, symbol_short, Address, Env, token, Symbol}; #[contract] pub struct Contract; +const KEY: Symbol = symbol_short!("key"); + #[contractimpl] impl Contract { - pub fn __constructor(env: Env, key: Symbol) { - env.storage().persistent().set(&key, &1_u32); - env.storage().instance().set(&key, &2_u32); - env.storage().temporary().set(&key, &3_u32); + pub fn __constructor(env: Env, sender: Address, token_contract: Address, amount: i128) { + let client = token::Client::new(&env, &token_contract); + client.transfer(&sender, &env.current_contract_address(), &amount); + env.storage().persistent().set(&KEY, &1_u32); + env.storage().instance().set(&KEY, &2_u32); + env.storage().temporary().set(&KEY, &3_u32); } pub fn get_data(env: Env, key: Symbol) -> u32 { diff --git a/services/horizon/internal/integration/invokehostfunction_test.go b/services/horizon/internal/integration/invokehostfunction_test.go index a21251c2f6..04d49626f2 100644 --- a/services/horizon/internal/integration/invokehostfunction_test.go +++ b/services/horizon/internal/integration/invokehostfunction_test.go @@ -5,11 +5,14 @@ import ( "encoding/hex" "os" "path/filepath" + "strings" "testing" + "github.com/stellar/go/amount" "github.com/stellar/go/clients/horizonclient" "github.com/stellar/go/protocols/horizon/operations" "github.com/stellar/go/services/horizon/internal/test/integration" + "github.com/stellar/go/strkey" "github.com/stellar/go/txnbuild" "github.com/stellar/go/xdr" @@ -128,14 +131,19 @@ func TestContractInvokeHostFunctionCreateContractByAddress(t *testing.T) { } func TestContractInvokeHostFunctionCreateConstructorContract(t *testing.T) { - if integration.GetCoreMaxSupportedProtocol() < 20 { - t.Skip("This test run does not support less than Protocol 20") + if integration.GetCoreMaxSupportedProtocol() < 22 { + t.Skip("This test run does not support less than Protocol 22") } itest := integration.NewTest(t, integration.Config{ EnableSorobanRPC: true, }) + issuer := itest.Master().Address() + code := "USD" + asset := xdr.MustNewCreditAsset(code, issuer) + createSAC(itest, asset) + // establish which account will be contract owner, and load it's current seq sourceAccount, err := itest.Client().AccountDetail(horizonclient.AccountRequest{ AccountID: itest.Master().Address(), @@ -148,23 +156,28 @@ func TestContractInvokeHostFunctionCreateConstructorContract(t *testing.T) { itest.MustSubmitOperationsWithFee(&sourceAccount, itest.Master(), minFee+txnbuild.MinBaseFee, &preFlightOp) // Create the contract - keySym := xdr.ScSymbol("constructorKey") - keyArg := xdr.ScVal{ - Type: xdr.ScValTypeScvSymbol, - Sym: &keySym, + senderAddressArg := accountAddressParam(itest.Master().Address()) + usdcAddress := contractIDParam(stellarAssetContractID(itest, asset)) + usdcAddressArg := xdr.ScVal{ + Type: xdr.ScValTypeScvAddress, + Address: &usdcAddress, } + amount := i128Param(0, uint64(amount.MustParse("10.0000000"))) createContractOp := assembleCreateContractConstructorOp( t, itest.Master().Address(), constructor_contract, "a1", []xdr.ScVal{ - keyArg, + senderAddressArg, + usdcAddressArg, + amount, }, ) preFlightOp, minFee = itest.PreflightHostFunctions(&sourceAccount, *createContractOp) tx, err := itest.SubmitOperationsWithFee(&sourceAccount, itest.Master(), minFee+txnbuild.MinBaseFee, &preFlightOp) require.NoError(t, err) + contractID := preFlightOp.Ext.SorobanData.Resources.Footprint.ReadWrite[0].MustContractData().Contract.ContractId clientTx, err := itest.Client().TransactionDetail(tx.Hash) require.NoError(t, err) @@ -191,12 +204,29 @@ func TestContractInvokeHostFunctionCreateConstructorContract(t *testing.T) { assert.Equal(t, invokeHostFunctionOpJson.Function, "HostFunctionTypeHostFunctionTypeCreateContractV2") assert.Equal(t, invokeHostFunctionOpJson.Address, sourceAccount.AccountID) assert.Equal(t, invokeHostFunctionOpJson.Salt, "110986164698320180327942133831752629430491002266485370052238869825166557303060") - assert.Len(t, invokeHostFunctionOpJson.Parameters, 1) - serializedKey, err := xdr.MarshalBase64(keyArg) + + assert.Len(t, invokeHostFunctionOpJson.Parameters, 3) + serializedKey, err := xdr.MarshalBase64(senderAddressArg) assert.NoError(t, err) assert.Equal(t, invokeHostFunctionOpJson.Parameters[0].Value, serializedKey) - assert.Equal(t, invokeHostFunctionOpJson.Parameters[0].Type, "Sym") - assert.Empty(t, invokeHostFunctionOpJson.AssetBalanceChanges) + assert.Equal(t, invokeHostFunctionOpJson.Parameters[0].Type, "Address") + serializedKey, err = xdr.MarshalBase64(usdcAddressArg) + assert.NoError(t, err) + assert.Equal(t, invokeHostFunctionOpJson.Parameters[1].Value, serializedKey) + assert.Equal(t, invokeHostFunctionOpJson.Parameters[1].Type, "Address") + serializedKey, err = xdr.MarshalBase64(amount) + assert.NoError(t, err) + assert.Equal(t, invokeHostFunctionOpJson.Parameters[2].Value, serializedKey) + assert.Equal(t, invokeHostFunctionOpJson.Parameters[2].Type, "I128") + + assert.Len(t, invokeHostFunctionOpJson.AssetBalanceChanges, 1) + assetBalanceChange := invokeHostFunctionOpJson.AssetBalanceChanges[0] + assert.Equal(itest.CurrentTest(), assetBalanceChange.Amount, "10.0000000") + assert.Equal(itest.CurrentTest(), assetBalanceChange.From, issuer) + assert.Equal(itest.CurrentTest(), assetBalanceChange.To, strkey.MustEncode(strkey.VersionByteContract, contractID[:])) + assert.Equal(itest.CurrentTest(), assetBalanceChange.Type, "transfer") + assert.Equal(itest.CurrentTest(), assetBalanceChange.Asset.Code, strings.TrimRight(asset.GetCode(), "\x00")) + assert.Equal(itest.CurrentTest(), assetBalanceChange.Asset.Issuer, asset.GetIssuer()) } func TestContractInvokeHostFunctionInvokeStatelessContractFn(t *testing.T) { diff --git a/services/horizon/internal/integration/testdata/soroban_constructor_contract.wasm b/services/horizon/internal/integration/testdata/soroban_constructor_contract.wasm index 658699e79e710ac3c79349610c4131090c819520..f0c92476bc48106b2e9432808f971a2c89ef3a13 100755 GIT binary patch literal 1251 zcmZ7#O-~b1aOS=3(sn5O8THf^abo?u@T;!zG>x7)I)Ep4&8G?JJWrBI9! zy?FIXV&c`KAu(P|O#B7@01sZgn&7;*3#CrF^Zorg;QCDj09=Syc(2#PUIirr`j`?~ zzXuiUgA)4{09H=m7CIF37?%JEmkB>5%!n@m$1Xl3yrF!yFi-pz=795LLW3CU69h4i zVCr+ckM`c)DHweirxSN{z3DaEom~bg$Emeje$d&e1?>(b;}5;S*>D3FCaJ_s(ourr zwKg~!j`PTKx1Fl%dz>Y|#1eBLj{km`wcw+$4uv+b(A*<{YsP!dSfBOgm1yT08Gb{t zY{dd`hWp|>tf#=j5zki0#!l=re3H@ZudqsH%{JCj%wl4Bn2r&N57TTC4U3u2Wf`e6 zUnq_l=DuR|FprSc2u|UdIEw%tP)f>nV98v|!-IiPO;FxLVGP35GUb2*A6(=}F2M~1JTHtScwQi0K=kVWgC^e6ax=%OZ zb(C}^(oF^JhS!n@rSgs0bhp{wX$4A0O^?Co=;-hx3vYP4lAWPX>NL1MbDr31b(>z` zUi5lZI)Z;O$e1zK@w-ud8J#6-eRd( e&EIy*)y=|UwN@=v^R;TBSSVNBe4*xf#o|BCzYhBV literal 894 zcmaJ<&2G~`5T4n!-6U38S4frMfL3lL#DOSwOaiysqN+H;3plp31vO35+9pyjcA)$e zUL>bJ05{G&3NKN1{ZpqL*u%~@GvBxKdA$%MGXwy9vNfhzmSHv~#ZI$4gE1BbiDWe& z1CR$4&(If&GqeE3-Upa zr16I+UBsZY-tp9*1Ze=87@>FkBJufrLQ(hq_dGcF!yw_5bbiwI9xz~d*jIME7 zp5+n!K+KTCN3zc4<@%)>W&8|scgKT3`wFPwl5$+r0GX&gjpa?Yb= zU)1aM&x Date: Mon, 7 Oct 2024 18:42:38 -0400 Subject: [PATCH 3/5] fix protocol 21 tests --- .../integration/testdata/soroban_add_u64.wasm | Bin 631 -> 631 bytes .../testdata/soroban_increment_contract.wasm | Bin 604 -> 604 bytes .../testdata/soroban_sac_test.wasm | Bin 1887 -> 1936 bytes .../integration/testdata/soroban_store.wasm | Bin 449 -> 449 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/services/horizon/internal/integration/testdata/soroban_add_u64.wasm b/services/horizon/internal/integration/testdata/soroban_add_u64.wasm index e2cc3ccc2bb8bb78f49e167a27c5dd27d0de92db..76a8f617d74695d7298b92a5fe2999063b15b4c9 100755 GIT binary patch delta 67 zcmey)@||VFUq(ie$^RH#OpT2U^ng&eDA`Ck)z~yCF*(&TCDk-BB_%P{JlWVN&BVYo VIVIW9Fe%Bz)G|5AFvZM}0RZr=6r2D6 delta 67 zcmey)@||VFUq(i;$^RH#Oihf8^bGV2bc>SpjFi(1Qq4?_Q;p3`k_;^q&6CoMjFXa+ W%#sX~lZ;G^%##ugjgnJSO-umLtrQCY diff --git a/services/horizon/internal/integration/testdata/soroban_increment_contract.wasm b/services/horizon/internal/integration/testdata/soroban_increment_contract.wasm index 5fb1ba5d4988e5dbac139163586a857464ccf302..de0b68c62ad40d195dfb9a102feb90ec64c2cef3 100755 GIT binary patch delta 67 zcmcb^a))KZBSuD%$&VRbOpT2U^ng&eDA`Ck)z~yCF*(&TCDk-BB_%P{JlWVN&BVYo VIVIW9Fe%Bz)G|5AFvZM}0RYxC6fgh) delta 67 zcmcb^a))KZBSuEC$&VRbOihf8^bGV2bc>SpjFi(1Qq4?_Q;p3`k_;^q&6CoMjFXa+ W%#sX~lZ;G^%##ugjgnJSO-ul`G!vfy diff --git a/services/horizon/internal/integration/testdata/soroban_sac_test.wasm b/services/horizon/internal/integration/testdata/soroban_sac_test.wasm index 7e1e7ea9d3bc6dd3eeb4d5ff43cf70715ff3e873..5a251794bb6915d3a389721ef1e7849d0897fb63 100755 GIT binary patch delta 1068 zcmY*YOKTKC5U%R(d2BjsdPOt|f;}Elbe0L#USZrToATG8pc3`M* zKJG-F#Y=GuRH1&g-HMjt%kxn3JMCI)X+CblR$6UzAc~r`PFjoNR+FQQq6=~DN>r~c z#heX%FO+5(rntOwg&r{K(in{AP=nnFr5ttN4pq2MDL*l&9#|eAQI+(IQGP&IIFTMuWHn6wum}qrZ8J%AqIj~HE5Ph0E{{22h0{hJMZ$eV@@V!;CK^dvj{CZO-O2HFbS9znul(8HQ<9FC1JlCZdx50ks98G zx*LjBjeVf*S|QmwZk=1TNLCS-?Y7lDOUEEYMPP;EY1)RRH~ItXcq{w{r-}$5)kB*E zT0j;+y~xh7@!^{`H5xMMgIcp#{<8jv>=oONPqL3}Jk8SqSGVkNAk13swoqBl9c!Eh z_0+No-%V6hxF&O5PCL}DQOAm4Y3?#n>oQV9wmo&3=pF)XPh@X?3Klw_fxLz~7pNV)raI5I^~W%A^pbz@+C?06M zka7`YkPu3=dO_}fFR`6Stmv&)6>&+Ei~CykfrH|fwj7)!7%gwN1JtDR8O~=Bz!HzN z6R5hC0r4ymNAz@nV4_9Voxh`p8oV*ay0ZLm&5+2h#vC^Yc=kVOB8pbEnbNRj4IxX0;AINTt{dO z{NJ>#orLn8af~Rpj6+iirO~D|iBV^2Qwoi&&yPuysuEo)hE1t_0-K6qNorW8@_|eR zl0}Ml_ZrUH_K%GZZ@&J7IHLG2UG&)OiEi=k;|5T7bV3_RpZ_gJKUo(-au3ZZx?rz= znSF@+qXQkMN6MwrP+_Pr*q9zF_0Jak(UD<)c(m*lPt+>jY-!k=_C~$pv{x#ZDqgKv Jn)dy2`7hRN?x_F( diff --git a/services/horizon/internal/integration/testdata/soroban_store.wasm b/services/horizon/internal/integration/testdata/soroban_store.wasm index 1d7f39938896ec8ac669c7f60e7f147c3c5b16d7..3d2c799b2652f22c1e1782c71ca1152be76db6c2 100755 GIT binary patch delta 67 zcmX@ee2{sAJ0qjWWDiCcQ)43oJs{LAN;XnXH8xF3Oir~-Ni|JONl8pKPc}A6Gchnt VPDwU2OiD5_wM Date: Tue, 8 Oct 2024 11:01:59 -0400 Subject: [PATCH 4/5] code review fixes --- .../ingest/processors/operations_processor.go | 16 ++++++++-------- .../contracts/constructor/src/lib.rs | 6 ------ .../integration/invokehostfunction_test.go | 16 +++++----------- .../testdata/soroban_constructor_contract.wasm | Bin 1251 -> 923 bytes 4 files changed, 13 insertions(+), 25 deletions(-) diff --git a/services/horizon/internal/ingest/processors/operations_processor.go b/services/horizon/internal/ingest/processors/operations_processor.go index e99488744e..39d09b1608 100644 --- a/services/horizon/internal/ingest/processors/operations_processor.go +++ b/services/horizon/internal/ingest/processors/operations_processor.go @@ -550,7 +550,7 @@ func (operation *transactionOperationWrapper) Details() (map[string]interface{}, op := operation.operation.Body.MustClaimClaimableBalanceOp() balanceID, err := xdr.MarshalHex(op.BalanceId) if err != nil { - panic(fmt.Errorf("Invalid balanceId in op: %d", operation.index)) + return nil, fmt.Errorf("Invalid balanceId in op: %d", operation.index) } details["balance_id"] = balanceID addAccountAndMuxedAccountDetails(details, *source, "claimant") @@ -585,7 +585,7 @@ func (operation *transactionOperationWrapper) Details() (map[string]interface{}, op := operation.operation.Body.MustClawbackClaimableBalanceOp() balanceID, err := xdr.MarshalHex(op.BalanceId) if err != nil { - panic(fmt.Errorf("Invalid balanceId in op: %d", operation.index)) + return nil, fmt.Errorf("Invalid balanceId in op: %d", operation.index) } details["balance_id"] = balanceID case xdr.OperationTypeSetTrustLineFlags: @@ -691,7 +691,7 @@ func (operation *transactionOperationWrapper) Details() (map[string]interface{}, fromAddress := args.ContractIdPreimage.MustFromAddress() address, err := fromAddress.Address.String() if err != nil { - panic(fmt.Errorf("error obtaining address for: %s", args.ContractIdPreimage.Type)) + return nil, fmt.Errorf("error obtaining address for: %s", args.ContractIdPreimage.Type) } details["from"] = "address" details["address"] = address @@ -700,7 +700,7 @@ func (operation *transactionOperationWrapper) Details() (map[string]interface{}, details["from"] = "asset" details["asset"] = args.ContractIdPreimage.MustFromAsset().StringCanonical() default: - panic(fmt.Errorf("unknown contract id type: %s", args.ContractIdPreimage.Type)) + return nil, fmt.Errorf("unknown contract id type: %s", args.ContractIdPreimage.Type) } case xdr.HostFunctionTypeHostFunctionTypeCreateContractV2: args := op.HostFunction.MustCreateContractV2() @@ -709,7 +709,7 @@ func (operation *transactionOperationWrapper) Details() (map[string]interface{}, fromAddress := args.ContractIdPreimage.MustFromAddress() address, err := fromAddress.Address.String() if err != nil { - panic(fmt.Errorf("error obtaining address for: %s", args.ContractIdPreimage.Type)) + return nil, fmt.Errorf("error obtaining address for: %s", args.ContractIdPreimage.Type) } details["from"] = "address" details["address"] = address @@ -718,7 +718,7 @@ func (operation *transactionOperationWrapper) Details() (map[string]interface{}, details["from"] = "asset" details["asset"] = args.ContractIdPreimage.MustFromAsset().StringCanonical() default: - panic(fmt.Errorf("unknown contract id type: %s", args.ContractIdPreimage.Type)) + return nil, fmt.Errorf("unknown contract id type: %s", args.ContractIdPreimage.Type) } details["parameters"] = extractFunctionArgs(args.ConstructorArgs) @@ -730,14 +730,14 @@ func (operation *transactionOperationWrapper) Details() (map[string]interface{}, } case xdr.HostFunctionTypeHostFunctionTypeUploadContractWasm: default: - panic(fmt.Errorf("unknown host function type: %s", op.HostFunction.Type)) + return nil, fmt.Errorf("unknown host function type: %s", op.HostFunction.Type) } case xdr.OperationTypeExtendFootprintTtl: op := operation.operation.Body.MustExtendFootprintTtlOp() details["extend_to"] = op.ExtendTo case xdr.OperationTypeRestoreFootprint: default: - panic(fmt.Errorf("unknown operation type: %s", operation.OperationType())) + return nil, fmt.Errorf("unknown operation type: %s", operation.OperationType()) } sponsor, err := operation.getSponsor() diff --git a/services/horizon/internal/integration/contracts/constructor/src/lib.rs b/services/horizon/internal/integration/contracts/constructor/src/lib.rs index 5935ed9162..08be44d001 100644 --- a/services/horizon/internal/integration/contracts/constructor/src/lib.rs +++ b/services/horizon/internal/integration/contracts/constructor/src/lib.rs @@ -15,10 +15,4 @@ impl Contract { env.storage().instance().set(&KEY, &2_u32); env.storage().temporary().set(&KEY, &3_u32); } - - pub fn get_data(env: Env, key: Symbol) -> u32 { - env.storage().persistent().get::<_, u32>(&key).unwrap() - + env.storage().instance().get::<_, u32>(&key).unwrap() - + env.storage().temporary().get::<_, u32>(&key).unwrap() - } } diff --git a/services/horizon/internal/integration/invokehostfunction_test.go b/services/horizon/internal/integration/invokehostfunction_test.go index 04d49626f2..216bc8607c 100644 --- a/services/horizon/internal/integration/invokehostfunction_test.go +++ b/services/horizon/internal/integration/invokehostfunction_test.go @@ -144,16 +144,10 @@ func TestContractInvokeHostFunctionCreateConstructorContract(t *testing.T) { asset := xdr.MustNewCreditAsset(code, issuer) createSAC(itest, asset) - // establish which account will be contract owner, and load it's current seq - sourceAccount, err := itest.Client().AccountDetail(horizonclient.AccountRequest{ - AccountID: itest.Master().Address(), - }) - require.NoError(t, err) - // Install the contract installContractOp := assembleInstallContractCodeOp(t, itest.Master().Address(), constructor_contract) - preFlightOp, minFee := itest.PreflightHostFunctions(&sourceAccount, *installContractOp) - itest.MustSubmitOperationsWithFee(&sourceAccount, itest.Master(), minFee+txnbuild.MinBaseFee, &preFlightOp) + preFlightOp, minFee := itest.PreflightHostFunctions(itest.MasterAccount(), *installContractOp) + itest.MustSubmitOperationsWithFee(itest.MasterAccount(), itest.Master(), minFee+txnbuild.MinBaseFee, &preFlightOp) // Create the contract senderAddressArg := accountAddressParam(itest.Master().Address()) @@ -174,8 +168,8 @@ func TestContractInvokeHostFunctionCreateConstructorContract(t *testing.T) { amount, }, ) - preFlightOp, minFee = itest.PreflightHostFunctions(&sourceAccount, *createContractOp) - tx, err := itest.SubmitOperationsWithFee(&sourceAccount, itest.Master(), minFee+txnbuild.MinBaseFee, &preFlightOp) + preFlightOp, minFee = itest.PreflightHostFunctions(itest.MasterAccount(), *createContractOp) + tx, err := itest.SubmitOperationsWithFee(itest.MasterAccount(), itest.Master(), minFee+txnbuild.MinBaseFee, &preFlightOp) require.NoError(t, err) contractID := preFlightOp.Ext.SorobanData.Resources.Footprint.ReadWrite[0].MustContractData().Contract.ContractId @@ -202,7 +196,7 @@ func TestContractInvokeHostFunctionCreateConstructorContract(t *testing.T) { invokeHostFunctionOpJson, ok := clientInvokeOp.Embedded.Records[0].(operations.InvokeHostFunction) assert.True(t, ok) assert.Equal(t, invokeHostFunctionOpJson.Function, "HostFunctionTypeHostFunctionTypeCreateContractV2") - assert.Equal(t, invokeHostFunctionOpJson.Address, sourceAccount.AccountID) + assert.Equal(t, invokeHostFunctionOpJson.Address, itest.Master().Address()) assert.Equal(t, invokeHostFunctionOpJson.Salt, "110986164698320180327942133831752629430491002266485370052238869825166557303060") assert.Len(t, invokeHostFunctionOpJson.Parameters, 3) diff --git a/services/horizon/internal/integration/testdata/soroban_constructor_contract.wasm b/services/horizon/internal/integration/testdata/soroban_constructor_contract.wasm index f0c92476bc48106b2e9432808f971a2c89ef3a13..88ff28aa4e529032cf5d2523d0b85e897c674c0f 100755 GIT binary patch delta 172 zcmaFNIh&oEA+b1@k%57MQJH-rw*o5z1CuuUL^CZ8W;Rw9239t64Z)j*>aAa~~5`eInofrh#Cnqu)%5{Qd7`TCmlR=;h!eIeAh?@y0SU!0< KbH!wTmMH+MUMbB0 delta 532 zcmY*W%T59@6uq}C1H(8{7RI=1W~Uor<(6rD#HIc~9buwD0R>EC<4mGah*2cOl^?*$ zg@2%N=gNQZL$GBa;_c)1^q!OUv@hu&+kv1}Ljb_l%)k*2xw^vW0Dx@RgTh*br&t84 z=K@fgwHc()O6y2b1a7U+2>m#I2PcC6IlXCFwXoJ`b_lpil^gX|yLnM=H=2;m9EELF z3EBZHpn`l>O@IpP6^f2h$6;`$4ue)mNtS-5?6;39F7@I#2A@d6lNFV~d&3ebM)#%y zj_x+_rv!W>#fWGlq?9xPBY%wN9{P*hE(r9$V8=yAfJFXaG+QoCz?}gekz>4;Y+qAB zA34V$JYmooBLYFB=#D%lsL53i1>1Fr7Q(y`rb3tr^({1KqF@4zg1t&{E7?uXnBk9! z72Z#BPG3bJ?;0d=&zPN5mgjvl&`P2oV}!##xm?$98h>xDe|ow{Pr{B_=JhapY-rKv EU)aoYY5)KL From 443fa19f05af56a200d258a034467888579a4e0e Mon Sep 17 00:00:00 2001 From: tamirms Date: Tue, 8 Oct 2024 15:54:09 -0400 Subject: [PATCH 5/5] fix tests --- .../processors/transaction_operation_wrapper_test.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/services/horizon/internal/ingest/processors/transaction_operation_wrapper_test.go b/services/horizon/internal/ingest/processors/transaction_operation_wrapper_test.go index 48b1f729b4..78afaa6e71 100644 --- a/services/horizon/internal/ingest/processors/transaction_operation_wrapper_test.go +++ b/services/horizon/internal/ingest/processors/transaction_operation_wrapper_test.go @@ -2282,9 +2282,6 @@ func TestDetailsCoversAllOperationTypes(t *testing.T) { operation: op, ledgerSequence: 1, } - // calling Details should panic with unknown operation type - f := func() { - operation.Details() - } - assert.PanicsWithError(t, "unknown operation type: ", f) + _, err := operation.Details() + assert.ErrorContains(t, err, "unknown operation type: ") }