From a3ec742cd35236029f408217b042f1ce537943b6 Mon Sep 17 00:00:00 2001 From: Duc Pham Le <44611780+ducphamle2@users.noreply.github.com> Date: Wed, 28 Aug 2024 11:59:17 -0700 Subject: [PATCH] Fix/gasless (#60) * chore: remove docker * chore: remove e2e docker script * feat: remove evmutil module * chore: add todo * chore: re-add evmutil * fix: add e2e tests, commit_timeout to 500ms & pass clock counter test * chore: add more test cases clock counter --- README.md | 12 +- go.work | 5 +- go.work.sum | 27 +- interchaintest/go.mod | 4 +- orai/Dockerfile | 32 - orai/Dockerfile.oraivisor | 23 - orai/Dockerfile.prod | 67 -- orai/README.md | 8 - orai/app/app.go | 2 +- orai/doc/Genesis_validator.md | 116 --- orai/doc/README.md | 3 - orai/doc/network.md | 31 - orai/doc/proto.md | 857 ------------------ orai/doc/reset_node.md | 13 - orai/doc/smart_contract.md | 65 -- orai/docker-compose-e2e-upgrade.yml | 58 -- orai/docker-compose.prod.yml | 25 - orai/docker-compose.yml | 30 - orai/go.mod | 7 +- orai/go.sum | 12 +- orai/scripts/e2e-docker-upgrade.sh | 99 -- orai/scripts/e2e-tests.sh | 48 + orai/scripts/e2e-upgrade.sh | 5 +- orai/scripts/multinode-docker.sh | 168 ---- orai/scripts/test_clock_counter_contract.sh | 23 +- .../test-evm-cosmos-mapping-docker.sh | 27 - .../tests-0.42.1/test-gasless-docker.sh | 35 - .../tests-0.42.1/test-tokenfactory-docker.sh | 60 -- .../tests-0.42.2/test-multi-sig-docker.sh | 52 -- .../tests-0.42.3/test-commit-timeout.sh | 21 + orai/scripts/wasm_file/cw-clock-example.wasm | Bin 137498 -> 148003 bytes 31 files changed, 113 insertions(+), 1822 deletions(-) delete mode 100755 orai/Dockerfile delete mode 100644 orai/Dockerfile.oraivisor delete mode 100755 orai/Dockerfile.prod delete mode 100755 orai/doc/Genesis_validator.md delete mode 100755 orai/doc/README.md delete mode 100644 orai/doc/network.md delete mode 100755 orai/doc/proto.md delete mode 100755 orai/doc/reset_node.md delete mode 100644 orai/doc/smart_contract.md delete mode 100755 orai/docker-compose-e2e-upgrade.yml delete mode 100755 orai/docker-compose.prod.yml delete mode 100755 orai/docker-compose.yml delete mode 100755 orai/scripts/e2e-docker-upgrade.sh create mode 100755 orai/scripts/e2e-tests.sh delete mode 100755 orai/scripts/multinode-docker.sh delete mode 100755 orai/scripts/tests-0.42.1/test-evm-cosmos-mapping-docker.sh delete mode 100755 orai/scripts/tests-0.42.1/test-gasless-docker.sh delete mode 100755 orai/scripts/tests-0.42.1/test-tokenfactory-docker.sh delete mode 100755 orai/scripts/tests-0.42.2/test-multi-sig-docker.sh create mode 100755 orai/scripts/tests-0.42.3/test-commit-timeout.sh diff --git a/README.md b/README.md index 73ec62c0..1d588d1a 100644 --- a/README.md +++ b/README.md @@ -10,18 +10,8 @@ Cosmos based blockchain integrated with Smart Contracts [Orai](https://orai.io). | [`oraivisor`](oraivisor) | A small process manager around Oraichain binaries that monitors the governance module | | [`interchaintest`](interchaintest) | Docker containers for hooks testing of IBC-compatible blockchains | -## Docker Build - -```bash -# dev -docker build -t -f orai/Dockerfile --build-arg WASMVM_VERSION=v1.5.2 --build-arg VERSION=v0.42.2 . - -# prod -docker build -t -f orai/Dockerfile.prod --build-arg WASMVM_VERSION=v1.5.2 --build-arg VERSION=v0.42.2 . -``` - ## Upgrade command ```bash -oraid tx gov submit-proposal software-upgrade "v0.42.2" --title "upgrade Oraichain network to v0.42.2" --description "Please visit https://github.com/oraichain/orai/releases/tag/v0.42.2 to view the CHANGELOG for this upgrade" --from wallet --upgrade-height 21627705 --upgrade-info "https://github.com/oraichain/orai/releases/download/v0.42.2/manifest.json" --deposit 10000000orai --chain-id Oraichain -y -b block --gas-prices 0.001orai --gas 20000000 --node https://rpc.orai.io:443 +oraid tx gov submit-proposal software-upgrade "v0.42.3" --title "upgrade Oraichain network to v0.42.3" --description "Please visit https://github.com/oraichain/orai/releases/tag/v0.42.3 to view the CHANGELOG for this upgrade" --from wallet --upgrade-height 21627705 --upgrade-info "https://github.com/oraichain/orai/releases/download/v0.42.3/manifest.json" --deposit 10000000orai --chain-id Oraichain -y -b block --gas-prices 0.001orai --gas 20000000 --node https://rpc.orai.io:443 ``` diff --git a/go.work b/go.work index a271e5ab..b986dffa 100644 --- a/go.work +++ b/go.work @@ -8,4 +8,7 @@ use ( ./oraivisor ) -replace github.com/CosmWasm/wasmd => github.com/oraichain/wasmd v0.30.2-0.20240729102409-91ec1f5fdc6c +replace ( + github.com/CosmWasm/wasmd => github.com/oraichain/wasmd v0.30.2-0.20240729102409-91ec1f5fdc6c + github.com/cosmos/cosmos-sdk => github.com/oraichain/cosmos-sdk v0.45.17-0.20240822154747-4cc2e82d6f68 +) diff --git a/go.work.sum b/go.work.sum index c5fd2609..aa2f7799 100644 --- a/go.work.sum +++ b/go.work.sum @@ -286,11 +286,9 @@ github.com/cosmos/btcutil v1.0.4/go.mod h1:Ffqc8Hn6TJUdDgHBwIZLtrLQC1KdJ9jGJl/Tv github.com/cosmos/cosmos-db v0.0.0-20221226095112-f3c38ecb5e32/go.mod h1:kwMlEC4wWvB48zAShGKVqboJL6w4zCLesaNQ3YLU2BQ= github.com/cosmos/cosmos-proto v1.0.0-beta.1/go.mod h1:8k2GNZghi5sDRFw/scPL8gMSowT1vDA+5ouxL8GjaUE= github.com/cosmos/cosmos-proto v1.0.0-beta.2/go.mod h1:+XRCLJ14pr5HFEHIUcn51IKXD1Fy3rkEQqt4WqmN4V0= -github.com/cosmos/cosmos-sdk v0.45.16 h1:5ba/Bh5/LE55IwHQuCU4fiG4eXeDKtSWzehXRpaKDcw= github.com/cosmos/cosmos-sdk v0.45.16/go.mod h1:bScuNwWAP0TZJpUf+SHXRU3xGoUPp+X9nAzfeIXts40= github.com/cosmos/gogoproto v1.4.3/go.mod h1:0hLIG5TR7IvV1fme1HCFKjfzW9X2x0Mo+RooWXCnOWU= github.com/cosmos/gogoproto v1.4.4/go.mod h1:/yl6/nLwsZcZ2JY3OrqjRqvqCG9InUMcXRfRjQiF9DU= -github.com/cosmos/gogoproto v1.5.0/go.mod h1:iUM31aofn3ymidYG6bUR5ZFrk+Om8p5s754eMUcyp8I= github.com/cosmos/iavl v1.0.0/go.mod h1:CmTGqMnRnucjxbjduneZXT+0vPgNElYvdefjX2q9tYc= github.com/cosmos/ibc-go/v2 v2.0.2/go.mod h1:XUmW7wmubCRhIEAGtMGS+5IjiSSmcAwihoN/yPGd6Kk= github.com/cosmos/ibc-go/v4 v4.3.1/go.mod h1:89E+K9CxpkS/etLEcG026jPM/RSnVMcfesvRYp/0aKI= @@ -388,7 +386,6 @@ github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82/go.mod h1:PxC8OnwL11+ github.com/gonum/internal v0.0.0-20181124074243-f884aa714029/go.mod h1:Pu4dmpkhSyOzRwuXkOgAvijx4o+4YMUJJo9OvPYMkks= github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9/go.mod h1:XA3DeT6rxh2EAE789SSiSJNqxPaC0aE9J8NTOI0Jo/A= github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9/go.mod h1:0EXg4mc1CNP0HCqCz+K4ts155PXIlUywf0wqN+GfPZw= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= @@ -396,7 +393,6 @@ github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8 github.com/google/safehtml v0.0.2/go.mod h1:L4KWwDsUJdECRAEpZoBn3O64bQaywRscowZjJAzjHnU= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go v0.0.0-20161107002406-da06d194a00e h1:CYRpN206UTHUinz3VJoLaBdy1gEGeJNsqT0mvswDcMw= @@ -594,6 +590,11 @@ github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.m github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= +github.com/oraichain/cometbft v0.34.30-0.20240425173150-09d3515b75aa h1:VYk/7NyyDIjiSPhTZJVjF4xbidyxikD/C1EH+ZXSzo0= +github.com/oraichain/cometbft v0.34.30-0.20240425173150-09d3515b75aa/go.mod h1:L9shMfbkZ8B+7JlwANEr+NZbBcn+hBpwdbeYvA5rLCw= +github.com/oraichain/cosmos-sdk v0.45.16-ics-epi-191/go.mod h1:bScuNwWAP0TZJpUf+SHXRU3xGoUPp+X9nAzfeIXts40= +github.com/oraichain/cosmos-sdk v0.45.17-0.20240822154747-4cc2e82d6f68 h1:zXer3jRPWbrC9jl7w2cEx4nCY19QWKNRdQ7l8xF7/+U= +github.com/oraichain/cosmos-sdk v0.45.17-0.20240822154747-4cc2e82d6f68/go.mod h1:bScuNwWAP0TZJpUf+SHXRU3xGoUPp+X9nAzfeIXts40= github.com/oraichain/ethermint v0.14.0-kava-v21.1 h1:JOOHoQqURFMRhBXhLxiU4ey4fLwtsIXE8j0eMre9Oow= github.com/oraichain/ethermint v0.14.0-kava-v21.1/go.mod h1:L4wqbHHORlqm04t6Qmv7CYHzqnOAl8jbkJF0yNm9LH4= github.com/oraichain/ethermint v0.14.0-orai-v1.0.0 h1:8bnCJO0fyPLT+ASoPs1+PYPQLVZt80N31p6UFFq2rmY= @@ -603,15 +604,15 @@ github.com/oraichain/ethermint v0.14.0-orai-v1.0.4 h1:/V5C5ud517uHdpKvMkd9qO5xl0 github.com/oraichain/ethermint v0.14.0-orai-v1.0.4/go.mod h1:ry+tXrkYJOEE/ICMXSWOGgv4uuDkc6GjuHHln3oKatg= github.com/oraichain/ethermint v0.14.0-orai-v1.0.5 h1:+sXxJWDuKTMNrq58TYn28RxKI/m9PrZNNZpybbOKe0k= github.com/oraichain/ethermint v0.14.0-orai-v1.0.5/go.mod h1:ry+tXrkYJOEE/ICMXSWOGgv4uuDkc6GjuHHln3oKatg= -github.com/oraichain/ethermint v0.14.1-0.20240730173417-7e4df27e54fd/go.mod h1:gpe0BVcBWKIfTraQXgCZ3g2f62vFzObAv2w/hvjLUko= github.com/oraichain/juno/x/clock v0.0.0-20231103100256-4c83cb3f8224 h1:bEt/DUaqXbvaRLp7/XWqvAFTJT7/3DdyVjdD2KL7Ioo= github.com/oraichain/juno/x/clock v0.0.0-20231103100256-4c83cb3f8224/go.mod h1:9bcy6YbLhOQ3IXqlOk1O5un+mFWUoSnCYTon5zANNkM= -github.com/oraichain/juno/x/clock v0.0.0-20240730041913-b862021c6b14/go.mod h1:A2bZN9cK0mV34BBtcZx+vnWf1Zj7yiZHT5e88BXczcI= github.com/oraichain/kava v0.21.1-orai-v1.0.0/go.mod h1:3adeVmSpm8xejhI+v0qKZsLA8LNdMpkZSns1kXG9YiA= github.com/oraichain/kava v0.21.1 h1:d6PUnDEg2P3sWvcK45b9hLpMQNkz2TX3zN1v3IHZ09E= github.com/oraichain/kava v0.21.1/go.mod h1:3adeVmSpm8xejhI+v0qKZsLA8LNdMpkZSns1kXG9YiA= github.com/oraichain/wasmd v0.30.2-0.20240701023743-e3d76c6757b5 h1:X8Edb1x06x3lEx1mRLHhKnQ3ZVNLsgdpmJskmShcrXk= github.com/oraichain/wasmd v0.30.2-0.20240701023743-e3d76c6757b5/go.mod h1:DUWz5+p7h3BbDxXAt7IBovagwt5NRPCGVuQkweIixzM= +github.com/oraichain/wasmd v0.30.2-0.20240729102409-91ec1f5fdc6c h1:M9XoVJ0EgBPBfuNUMxXGpa5AitznA27m59J0j651opk= +github.com/oraichain/wasmd v0.30.2-0.20240729102409-91ec1f5fdc6c/go.mod h1:DUWz5+p7h3BbDxXAt7IBovagwt5NRPCGVuQkweIixzM= github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= github.com/oxyno-zeta/gomock-extra-matcher v1.1.0/go.mod h1:UMGTHYEmJ1dRq8LDZ7VTAYO4nqM3GD1UGC3RJEUxEz0= @@ -633,7 +634,6 @@ github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrb github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= @@ -777,6 +777,7 @@ go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/ go.opentelemetry.io/otel/metric v0.32.3/go.mod h1:pgiGmKohxHyTPHGOff+vrtIH39/R9fiO/WoenUQ3kcc= go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= +go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= go.opentelemetry.io/otel/trace v1.11.0/go.mod h1:nyYjis9jy0gytE9LXGU+/m1sHTKbRY0fX0hulNNDP1U= go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= @@ -814,20 +815,17 @@ golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98y golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= golang.org/x/exp v0.0.0-20221019170559-20944726eadf/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= golang.org/x/exp v0.0.0-20221205204356-47842c84f3db/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/exp v0.0.0-20230131160201-f062dba9d201/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/exp v0.0.0-20230310171629-522b1b587ee0/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/exp/typeparams v0.0.0-20220827204233-334a2380cb91/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= @@ -842,7 +840,6 @@ golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.0.0-20170207211851-4464e7848382/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= @@ -850,7 +847,6 @@ golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQ golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -882,10 +878,8 @@ golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -923,7 +917,6 @@ golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= -golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= gonum.org/v1/plot v0.10.0/go.mod h1:JWIHJ7U20drSQb/aDpTetJzfC1KlAPldJLpkSy88dvQ= google.golang.org/api v0.0.0-20170206182103-3d017632ea10/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= @@ -936,10 +929,8 @@ google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:zqTuNwFl google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI= google.golang.org/genproto v0.0.0-20231212172506-995d672761c0/go.mod h1:l/k7rMz0vFTBPy+tFSGvXEd3z+BcoG1k7EHbqm+YBsY= -google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:+Rvu7ElI+aLzyDQhpHMFMMltsD6m7nqpuWDd2CwJw3k= google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= -google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917/go.mod h1:CmlNWB9lSezaYELKS5Ym1r44VrrbPUa7JTvw+6MbpJ0= google.golang.org/genproto/googleapis/bytestream v0.0.0-20231030173426-d783a09b4405/go.mod h1:GRUCuLdzVqZte8+Dl/D4N25yLzcGqqWaYkeVOwulFqw= google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= @@ -947,9 +938,7 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go. google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA= google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917/go.mod h1:xtjpI3tXFPP051KaWnhvxkiubL/6dJ18vLVf7q2pTOU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= diff --git a/interchaintest/go.mod b/interchaintest/go.mod index 40ac7234..3f2b80e0 100644 --- a/interchaintest/go.mod +++ b/interchaintest/go.mod @@ -6,14 +6,12 @@ toolchain go1.21.4 replace ( // fork wasmd so that we have legacy wasm types - github.com/CosmWasm/wasmd => github.com/oraichain/wasmd v0.30.2-0.20240701025001-60163da93f49 // go list -m -json github.com/oraichain/wasmvm@main | jq '.|"\(.Path) \(.Version)"' -r github.com/CosmWasm/wasmvm => github.com/oraichain/wasmvm v1.5.2 // interchaintest supports ICS features so we need this for now - github.com/cosmos/cosmos-sdk => github.com/oraichain/cosmos-sdk v0.45.16-ics-epi-191 github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 - github.com/tendermint/tendermint => github.com/oraichain/cometbft v0.34.30-0.20240329015336-24dcc6856c88 + github.com/tendermint/tendermint => github.com/oraichain/cometbft v0.34.30-0.20240822152340-79f7b8278984 // github.com/tidwall/btree => github.com/tidwall/btree v1.5.0 github.com/vedhavyas/go-subkey => github.com/strangelove-ventures/go-subkey v1.0.7 google.golang.org/grpc => google.golang.org/grpc v1.33.2 diff --git a/orai/Dockerfile b/orai/Dockerfile deleted file mode 100755 index 481d31ab..00000000 --- a/orai/Dockerfile +++ /dev/null @@ -1,32 +0,0 @@ -FROM golang:1.19-alpine as builder - -# this comes from standard alpine nightly file -# https://github.com/rust-lang/docker-rust-nightly/blob/master/alpine3.12/Dockerfile -# with some changes to support our toolchain, etc -RUN set -eux; apk add --no-cache ca-certificates build-base; -RUN apk add upx bash jq -# NOTE: add these to run with LEDGER_ENABLED=true -# RUN apk add libusb-dev linux-headers - -ARG WASMVM_VERSION -ARG VERSION - -WORKDIR /workspace -COPY orai/app/ /workspace/app -COPY orai/cmd/ /workspace/cmd -COPY orai/doc/statik /workspace/doc/statik -COPY orai/go.mod /workspace/ -COPY orai/go.sum /workspace/ -COPY orai/Makefile /workspace/ - -# See https://github.com/Oraichain/wasmvm/releases -RUN set -eux; \ - export ARCH=$(uname -m); \ - wget -O /lib/libwasmvm_muslc.a https://github.com/oraichain/wasmvm/releases/download/${WASMVM_VERSION}/libwasmvm_muslc.${ARCH}.a; - -RUN go mod download - -# # force it to use static lib (from above) not standard libgo_cosmwasm.so file -RUN make build LEDGER_ENABLED=false BUILD_TAGS=muslc GOMOD_FLAGS= VERSION=${VERSION} -RUN cp /workspace/build/oraid /bin/oraid -RUN upx --best --lzma /workspace/build/oraid diff --git a/orai/Dockerfile.oraivisor b/orai/Dockerfile.oraivisor deleted file mode 100644 index c4bc2f22..00000000 --- a/orai/Dockerfile.oraivisor +++ /dev/null @@ -1,23 +0,0 @@ -FROM golang:1.15-alpine3.12 AS go-builder - -# this comes from standard alpine nightly file -# https://github.com/rust-lang/docker-rust-nightly/blob/master/alpine3.12/Dockerfile -# with some changes to support our toolchain, etc -RUN set -eux; apk add --no-cache ca-certificates build-base; -RUN apk add make git upx -# NOTE: add these to run with LEDGER_ENABLED=true -# RUN apk add libusb-dev linux-headers - -WORKDIR /code -COPY oraivisor /code - -RUN make build - -# make size smaller -RUN goupx /code/build/oraivisor - -# ----- Update oraivisor from mainnet-alpine --------------------------------------------------- -FROM orai/orai:0.20.1-alpine - -# copy binaries -COPY --from=go-builder /code/build/oraivisor /usr/bin \ No newline at end of file diff --git a/orai/Dockerfile.prod b/orai/Dockerfile.prod deleted file mode 100755 index e3f78e4d..00000000 --- a/orai/Dockerfile.prod +++ /dev/null @@ -1,67 +0,0 @@ -FROM golang:1.19-alpine as orai-builder - -# this comes from standard alpine nightly file -# https://github.com/rust-lang/docker-rust-nightly/blob/master/alpine3.12/Dockerfile -# with some changes to support our toolchain, etc -RUN set -eux; apk add --no-cache ca-certificates build-base; -RUN apk add upx jq -# NOTE: add these to run with LEDGER_ENABLED=true -# RUN apk add libusb-dev linux-headers - -ARG WASMVM_VERSION -ARG VERSION - -WORKDIR /workspace -COPY orai/app/ /workspace/app -COPY orai/cmd/ /workspace/cmd -COPY orai/doc/statik /workspace/doc/statik -COPY orai/go.mod orai/go.sum orai/Makefile /workspace/ -COPY oraivisor/ /workspace/oraivisor -COPY oraivisor/Makefile /workspace/oraivisor/Makefile - -# See https://github.com/Oraichain/wasmvm/releases -RUN set -eux; \ - export ARCH=$(uname -m); \ - wget -O /lib/libwasmvm_muslc.a https://github.com/oraichain/wasmvm/releases/download/${WASMVM_VERSION}/libwasmvm_muslc.${ARCH}.a; - -RUN go mod download - -# # force it to use static lib (from above) not standard libgo_cosmwasm.so file -RUN make build LEDGER_ENABLED=false BUILD_TAGS=muslc GOMOD_FLAGS= VERSION=${VERSION} -RUN cp /workspace/build/oraid /bin/oraid -RUN upx --best --lzma /workspace/build/oraid - -FROM golang:1.19-alpine as oraivisor-builder - -RUN set -eux; apk add --no-cache ca-certificates build-base; -RUN apk add upx jq -WORKDIR /workspace -COPY oraivisor/ /workspace/ - -# install oraivisor -RUN pwd -RUN go mod download && go mod tidy -RUN make build -RUN upx --best --lzma /workspace/build/oraivisor - -# # then remove -# RUN rm -rf /workspace/* - -FROM alpine:3.16 - -WORKDIR /workspace - -RUN apk update - -# need to install build-base to run go oraid binary -RUN apk add bash build-base jq - -ENV DAEMON_ALLOW_DOWNLOAD_BINARIES=true DAEMON_RESTART_AFTER_UPGRADE=true DAEMON_NAME=oraid DAEMON_HOME=/root -ENV PATH="${DAEMON_HOME}/oraivisor/current/bin:${PATH}" -RUN mkdir -p $DAEMON_HOME/oraivisor/genesis/bin - -# init first symbolic link to run oraid and later oraivisor will update the link -RUN ln -s $DAEMON_HOME/oraivisor/genesis $DAEMON_HOME/oraivisor/current - -COPY --from=oraivisor-builder /workspace/build/oraivisor /usr/bin -COPY --from=orai-builder /workspace/build/oraid $DAEMON_HOME/oraivisor/genesis/bin \ No newline at end of file diff --git a/orai/README.md b/orai/README.md index 02a4a385..e8889aab 100755 --- a/orai/README.md +++ b/orai/README.md @@ -67,14 +67,6 @@ sudo wget https://github.com/CosmWasm/wasmvm/releases/download/v0.13.0/libwasmvm `oraid version` -## Deployment - -We recommend using Docker to deploy the network. To do so, please type: - -```bash -docker build -t -f Dockerfile.prod . -``` - ## Protobuf & protobuf swagger generation * [Install Docker](https://docs.docker.com/engine/install) diff --git a/orai/app/app.go b/orai/app/app.go index 484bd7ef..ff9a1391 100755 --- a/orai/app/app.go +++ b/orai/app/app.go @@ -164,7 +164,7 @@ const appName = "Oraichain" var ( NodeDir = ".oraid" - BinaryVersion = "v0.42.2" + BinaryVersion = "v0.42.3" // If EnabledSpecificProposals is "", and this is "true", then enable all x/wasm proposals. // If EnabledSpecificProposals is "", and this is not "true", then disable all x/wasm proposals. diff --git a/orai/doc/Genesis_validator.md b/orai/doc/Genesis_validator.md deleted file mode 100755 index 7c40db14..00000000 --- a/orai/doc/Genesis_validator.md +++ /dev/null @@ -1,116 +0,0 @@ -# Tutorial to participate in the genesis phase - -### 1. Download the setup file. - -```bash -curl -OL https://raw.githubusercontent.com/oraichain/oraichain-static-files/master/setup_genesis.sh -sudo chmod +x setup_genesis.sh -``` - -### 2. Run the setup file. - -```bash -./setup_genesis.sh -``` - -### 3. Edit wallet name and moniker you prefer to create a new wallet and validator. - -### 4. Run the following command: - -``` -docker-compose -f docker-compose.genesis.yml up -d -``` - -### 5. Enter the container through the command: - -``` -docker-compose exec orai ash -``` - -### 6. Type the following command to initiate your genesis node: - -```bash -setup -``` - -After running, there will be three .txt files generated. - -One file, which is account.txt, stores your genesis account information as well as its mnemonic. Please keep it safe, and remove the file when you finish storing your account information. - -Please upload the .oraid/config/gentx/gentx-\*.json file to the following google form: - -### 8. Wait for the team to setup the genesis file - -On the same vpn facilitating docker-machine, it can be done using command: -`docker-machine scp genesis1:"/home/ubuntu/oraichain/.oraid/config/gentx/gentx-*.json" genesis2:/home/ubuntu/oraichain/.oraid/config/gentx/` - -then add genesis accounts: -`./fn.sh addGenAccount --address address --amount 10000000` - -and finally call `oraid collect-gentxs` to complete the genesis.json file and use `docker-machine scp genesis1:/home/ubuntu/oraichain/.oraid/config/genesis.json genesis2:/home/ubuntu/oraichain/.oraid/config` to override other node's genesis file. - -then following [Network](./network.md) for secured network setup. - -### 9. After the team has finished setting up, type the following commands: - -Download the new genesis file containing all the information of the genesis nodes. - -```bash -curl $GENESIS_URL > .oraid/config/genesis.json -``` - -After downloading, please check if it contains your account and validator information. If it does not, please inform us so we can add your information. - -### 10. Restart the container to start your node: - -``` -docker-compose -f docker-compose.genesis.yml restart orai -``` - -to check if the node has run successfully, you can make a simple http request as follows: - -```bash -curl -X GET http://localhost:1317/cosmos/staking/v1beta1/validators -``` - -if you see your validator information as well as others, then your node is running well - -```json -{ - "validators": [ - { - "operator_address": "oraivaloper13fw6fhmcnllp4c4u584rjsnuun2stddjgngk4y", - "consensus_pubkey": { - "@type": "/cosmos.crypto.ed25519.PubKey", - "key": "B5zXxXtJ3fGOp9Ngxn5GtemEuX7JrAZL/ysayZSU2V4=" - }, - "jailed": false, - "status": "BOND_STATUS_BONDED", - "tokens": "250000000", - "delegator_shares": "250000000.000000000000000000", - "description": { - "moniker": "phamthanhtu", - "identity": "", - "website": "", - "security_contact": "", - "details": "" - }, - "unbonding_height": "0", - "unbonding_time": "1970-01-01T00:00:00Z", - "commission": { - "commission_rates": { - "rate": "0.100000000000000000", - "max_rate": "0.200000000000000000", - "max_change_rate": "0.010000000000000000" - }, - "update_time": "2021-01-27T07:46:51.048265860Z" - }, - "min_self_delegation": "1" - } - ], - "pagination": { - "next_key": null, - "total": "1" - } -} -``` diff --git a/orai/doc/README.md b/orai/doc/README.md deleted file mode 100755 index 9f3e98c8..00000000 --- a/orai/doc/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Generated doc - -Tutorials and project doc is available on https://docs.cosmwasm.com/ diff --git a/orai/doc/network.md b/orai/doc/network.md deleted file mode 100644 index 388e571f..00000000 --- a/orai/doc/network.md +++ /dev/null @@ -1,31 +0,0 @@ -## Setup nodes and validators for network - -**Validator node configuration** - -```bash -pex = false -persistent_peers = list of sentry nodes, optionally other vpn validators -private_peer_ids = -addr_book_strict = false - -oraid start --p2p.pex false --p2p.persistent_peers "" -``` - -**Sentry Node Configuration** - -```bash -pex = true -unconditional_peer_ids = validator node id -persistent_peers = validator node, optionally other vpn sentry nodes -private_peer_ids = validator node id -addr_book_strict = false -external_address = public ip -oraid start --rpc.laddr tcp://0.0.0.0:26657 --p2p.pex true --p2p.persistent_peers "" --p2p.unconditional_peer_ids "" --p2p.private_peer_ids "" -``` - -**Full Node Configuration** - -```bash -persistent_peers = sentry nodes -addr_book_strict = true -``` diff --git a/orai/doc/proto.md b/orai/doc/proto.md deleted file mode 100755 index c60b552c..00000000 --- a/orai/doc/proto.md +++ /dev/null @@ -1,857 +0,0 @@ -# Protocol Documentation - - -## Table of Contents - -- [x/provider/types/genesis.proto](#x/provider/types/genesis.proto) - - [GenesisState](#oraichain.orai.provider.GenesisState) - -- [x/provider/types/query.proto](#x/provider/types/query.proto) - - [Query](#oraichain.orai.provider.Query) - -- [x/provider/types/query_dsource.proto](#x/provider/types/query_dsource.proto) - - [DataSourceInfoReq](#oraichain.orai.provider.DataSourceInfoReq) - - [DataSourceInfoRes](#oraichain.orai.provider.DataSourceInfoRes) - - [ListDataSourcesReq](#oraichain.orai.provider.ListDataSourcesReq) - - [ListDataSourcesRes](#oraichain.orai.provider.ListDataSourcesRes) - -- [x/provider/types/query_oscript.proto](#x/provider/types/query_oscript.proto) - - [ListOracleScriptsReq](#oraichain.orai.provider.ListOracleScriptsReq) - - [ListOracleScriptsRes](#oraichain.orai.provider.ListOracleScriptsRes) - - [MinFeesReq](#oraichain.orai.provider.MinFeesReq) - - [MinFeesRes](#oraichain.orai.provider.MinFeesRes) - - [OracleScriptInfoReq](#oraichain.orai.provider.OracleScriptInfoReq) - - [OracleScriptInfoRes](#oraichain.orai.provider.OracleScriptInfoRes) - -- [x/provider/types/query_tcase.proto](#x/provider/types/query_tcase.proto) - - [ListTestCasesReq](#oraichain.orai.provider.ListTestCasesReq) - - [ListTestCasesRes](#oraichain.orai.provider.ListTestCasesRes) - - [TestCaseInfoReq](#oraichain.orai.provider.TestCaseInfoReq) - - [TestCaseInfoRes](#oraichain.orai.provider.TestCaseInfoRes) - -- [x/provider/types/tx.proto](#x/provider/types/tx.proto) - - [Msg](#oraichain.orai.provider.Msg) - -- [x/provider/types/tx_dsource.proto](#x/provider/types/tx_dsource.proto) - - [MsgCreateAIDataSource](#oraichain.orai.provider.MsgCreateAIDataSource) - - [MsgCreateAIDataSourceRes](#oraichain.orai.provider.MsgCreateAIDataSourceRes) - - [MsgEditAIDataSource](#oraichain.orai.provider.MsgEditAIDataSource) - - [MsgEditAIDataSourceRes](#oraichain.orai.provider.MsgEditAIDataSourceRes) - -- [x/provider/types/tx_oscript.proto](#x/provider/types/tx_oscript.proto) - - [MsgCreateOracleScript](#oraichain.orai.provider.MsgCreateOracleScript) - - [MsgCreateOracleScriptRes](#oraichain.orai.provider.MsgCreateOracleScriptRes) - - [MsgEditOracleScript](#oraichain.orai.provider.MsgEditOracleScript) - - [MsgEditOracleScriptRes](#oraichain.orai.provider.MsgEditOracleScriptRes) - -- [x/provider/types/tx_tcase.proto](#x/provider/types/tx_tcase.proto) - - [MsgCreateTestCase](#oraichain.orai.provider.MsgCreateTestCase) - - [MsgCreateTestCaseRes](#oraichain.orai.provider.MsgCreateTestCaseRes) - - [MsgEditTestCase](#oraichain.orai.provider.MsgEditTestCase) - - [MsgEditTestCaseRes](#oraichain.orai.provider.MsgEditTestCaseRes) - -- [x/provider/types/types_ds.proto](#x/provider/types/types_ds.proto) - - [AIDataSource](#oraichain.orai.provider.AIDataSource) - -- [x/provider/types/types_os.proto](#x/provider/types/types_os.proto) - - [OracleScript](#oraichain.orai.provider.OracleScript) - -- [x/provider/types/types_tc.proto](#x/provider/types/types_tc.proto) - - [TestCase](#oraichain.orai.provider.TestCase) - -- [Scalar Value Types](#scalar-value-types) - - - - -

Top

- -## x/provider/types/genesis.proto - - - - - -### GenesisState -GenesisState defines the capability module's genesis state. - - -| Field | Type | Label | Description | -| ------------- | ----------------------------------------------------- | -------- | ----------- | -| AIDataSources | [AIDataSource](#oraichain.orai.provider.AIDataSource) | repeated | | -| OracleScripts | [OracleScript](#oraichain.orai.provider.OracleScript) | repeated | | -| TestCases | [TestCase](#oraichain.orai.provider.TestCase) | repeated | | - - - - - - - - - - - - - - - - -

Top

- -## x/provider/types/query.proto - - - - - - - - - - - -### Query -Query provides defines the gRPC querier service - -| Method Name | Request Type | Response Type | Description | -| ----------------- | --------------------------------------------------------------------- | --------------------------------------------------------------------- | ------------------------------------------------- | -| DataSourceInfo | [DataSourceInfoReq](#oraichain.orai.provider.DataSourceInfoReq) | [DataSourceInfoRes](#oraichain.orai.provider.DataSourceInfoRes) | DataSourceInfo gets the data source meta data | -| ListDataSources | [ListDataSourcesReq](#oraichain.orai.provider.ListDataSourcesReq) | [ListDataSourcesRes](#oraichain.orai.provider.ListDataSourcesRes) | ListDataSources gets the list of data sources | -| OracleScriptInfo | [OracleScriptInfoReq](#oraichain.orai.provider.OracleScriptInfoReq) | [OracleScriptInfoRes](#oraichain.orai.provider.OracleScriptInfoRes) | OracleScriptInfo gets the oracle script meta data | -| ListOracleScripts | [ListOracleScriptsReq](#oraichain.orai.provider.ListOracleScriptsReq) | [ListOracleScriptsRes](#oraichain.orai.provider.ListOracleScriptsRes) | ListOracleScripts gets the list of oracle scripts | -| TestCaseInfo | [TestCaseInfoReq](#oraichain.orai.provider.TestCaseInfoReq) | [TestCaseInfoRes](#oraichain.orai.provider.TestCaseInfoRes) | TestCaseInfo gets the test case meta data | -| ListTestCases | [ListTestCasesReq](#oraichain.orai.provider.ListTestCasesReq) | [ListTestCasesRes](#oraichain.orai.provider.ListTestCasesRes) | ListTestCases gets the list of test cases | -| QueryMinFees | [MinFeesReq](#oraichain.orai.provider.MinFeesReq) | [MinFeesRes](#oraichain.orai.provider.MinFeesRes) | QueryMinFees gets the min fees of oracle script | - - - - - - -

Top

- -## x/provider/types/query_dsource.proto - - - - - -### DataSourceInfoReq -DataSourceInfoReq is the request type for the Query/DataSourceInfo RPC method - - -| Field | Type | Label | Description | -| ----- | ----------------- | ----- | ----------------------------------------------- | -| name | [string](#string) | | address is the address of the contract to query | - - - - - - - - -### DataSourceInfoRes -DataSourceInfoRes is the response type for the Query/DataSourceInfo RPC method - - -| Field | Type | Label | Description | -| ----------- | ----------------------------------------------------- | -------- | ------------------------------------------------------------------------------- | -| name | [string](#string) | | | -| owner | [bytes](#bytes) | | Owner is the address who is allowed to make further changes to the data source. | -| contract | [string](#string) | | | -| description | [string](#string) | | | -| fees | [cosmos.base.v1beta1.Coin](#cosmos.base.v1beta1.Coin) | repeated | | - - - - - - - - -### ListDataSourcesReq -ListDataSourcesReq is the request type for the Query/ListDataSources RPC method - - -| Field | Type | Label | Description | -| ----- | ----------------- | ----- | ----------- | -| name | [string](#string) | | | -| page | [int64](#int64) | | | -| limit | [int64](#int64) | | | - - - - - - - - -### ListDataSourcesRes -ListDataSourcesRes is the response type for the Query/ListDataSources RPC method - - -| Field | Type | Label | Description | -| ------------- | ----------------------------------------------------- | -------- | ----------- | -| AIDataSources | [AIDataSource](#oraichain.orai.provider.AIDataSource) | repeated | | -| count | [int64](#int64) | | | - - - - - - - - - - - - - - - - -

Top

- -## x/provider/types/query_oscript.proto - - - - - -### ListOracleScriptsReq -ListOracleScriptsReq is the request type for the Query/ListOracleScripts RPC method - - -| Field | Type | Label | Description | -| ----- | ----------------- | ----- | ----------- | -| name | [string](#string) | | | -| page | [int64](#int64) | | | -| limit | [int64](#int64) | | | - - - - - - - - -### ListOracleScriptsRes -ListOracleScriptsRes is the response type for the Query/ListOracleScripts RPC method - - -| Field | Type | Label | Description | -| ------------- | ----------------------------------------------------- | -------- | ----------- | -| OracleScripts | [OracleScript](#oraichain.orai.provider.OracleScript) | repeated | | -| count | [int64](#int64) | | | - - - - - - - - -### MinFeesReq -ListOracleScriptsReq is the request type for the Query/ListOracleScripts RPC method - - -| Field | Type | Label | Description | -| ---------------- | ----------------- | ----- | ----------- | -| OracleScriptName | [string](#string) | | | -| ValNum | [int64](#int64) | | | - - - - - - - - -### MinFeesRes -ListOracleScriptsRes is the response type for the Query/ListOracleScripts RPC method - - -| Field | Type | Label | Description | -| ------- | ----------------- | ----- | ----------- | -| minFees | [string](#string) | | | - - - - - - - - -### OracleScriptInfoReq -OracleScriptInfoReq is the request type for the Query/OracleScriptInfo RPC method - - -| Field | Type | Label | Description | -| ----- | ----------------- | ----- | ----------------------------------------------- | -| name | [string](#string) | | address is the address of the contract to query | - - - - - - - - -### OracleScriptInfoRes -OracleScriptInfoRes is the response type for the Query/OracleScriptInfo RPC method - - -| Field | Type | Label | Description | -| ----------- | ----------------------------------------------------- | -------- | --------------------------------------------------------------------------------- | -| name | [string](#string) | | | -| owner | [bytes](#bytes) | | Owner is the address who is allowed to make further changes to the oracle script. | -| contract | [string](#string) | | | -| description | [string](#string) | | | -| fees | [cosmos.base.v1beta1.Coin](#cosmos.base.v1beta1.Coin) | repeated | | -| d_sources | [string](#string) | repeated | | -| t_cases | [string](#string) | repeated | | - - - - - - - - - - - - - - - - -

Top

- -## x/provider/types/query_tcase.proto - - - - - -### ListTestCasesReq -ListTestCasesReq is the request type for the Query/ListTestCases RPC method - - -| Field | Type | Label | Description | -| ----- | ----------------- | ----- | ----------- | -| name | [string](#string) | | | -| page | [int64](#int64) | | | -| limit | [int64](#int64) | | | - - - - - - - - -### ListTestCasesRes -ListTestCasesRes is the response type for the Query/ListTestCases RPC method - - -| Field | Type | Label | Description | -| --------- | --------------------------------------------- | -------- | ----------- | -| TestCases | [TestCase](#oraichain.orai.provider.TestCase) | repeated | | -| count | [int64](#int64) | | | - - - - - - - - -### TestCaseInfoReq -TestCaseInfoReq is the request type for the Query/TestCaseInfo RPC method - - -| Field | Type | Label | Description | -| ----- | ----------------- | ----- | ----------------------------------------------- | -| name | [string](#string) | | address is the address of the contract to query | - - - - - - - - -### TestCaseInfoRes -TestCaseInfoRes is the response type for the Query/TestCaseInfo RPC method - - -| Field | Type | Label | Description | -| ----------- | ----------------------------------------------------- | -------- | ----------------------------------------------------------------------------- | -| name | [string](#string) | | | -| owner | [bytes](#bytes) | | Owner is the address who is allowed to make further changes to the test case. | -| contract | [string](#string) | | | -| description | [string](#string) | | | -| fees | [cosmos.base.v1beta1.Coin](#cosmos.base.v1beta1.Coin) | repeated | | - - - - - - - - - - - - - - - - -

Top

- -## x/provider/types/tx.proto - - - - - - - - - - - -### Msg -Msg defines the provider Msg service. - -| Method Name | Request Type | Response Type | Description | -| ------------------ | ----------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ------------------------------ | -| CreateAIDataSource | [MsgCreateAIDataSource](#oraichain.orai.provider.MsgCreateAIDataSource) | [MsgCreateAIDataSourceRes](#oraichain.orai.provider.MsgCreateAIDataSourceRes) | Create a new data source | -| EditAIDataSource | [MsgEditAIDataSource](#oraichain.orai.provider.MsgEditAIDataSource) | [MsgEditAIDataSourceRes](#oraichain.orai.provider.MsgEditAIDataSourceRes) | Edit an existing data source | -| CreateOracleScript | [MsgCreateOracleScript](#oraichain.orai.provider.MsgCreateOracleScript) | [MsgCreateOracleScriptRes](#oraichain.orai.provider.MsgCreateOracleScriptRes) | Create a new oracle script | -| EditOracleScript | [MsgEditOracleScript](#oraichain.orai.provider.MsgEditOracleScript) | [MsgEditOracleScriptRes](#oraichain.orai.provider.MsgEditOracleScriptRes) | Edit an existing oracle script | -| CreateTestCase | [MsgCreateTestCase](#oraichain.orai.provider.MsgCreateTestCase) | [MsgCreateTestCaseRes](#oraichain.orai.provider.MsgCreateTestCaseRes) | Create a new test case | -| EditTestCase | [MsgEditTestCase](#oraichain.orai.provider.MsgEditTestCase) | [MsgEditTestCaseRes](#oraichain.orai.provider.MsgEditTestCaseRes) | Edit an existing test case | - - - - - - -

Top

- -## x/provider/types/tx_dsource.proto - - - - - -### MsgCreateAIDataSource -MsgCreateAIDataSource submit data source metadata onto Oraichain - - -| Field | Type | Label | Description | -| ----------- | ----------------- | ----- | ------------------------------------------------------------------------------- | -| name | [string](#string) | | | -| description | [string](#string) | | | -| contract | [string](#string) | | | -| owner | [bytes](#bytes) | | Owner is the address who is allowed to make further changes to the data source. | -| fees | [string](#string) | | | - - - - - - - - -### MsgCreateAIDataSourceRes -MsgCreateAIDataSourceRes returns store result data. - - -| Field | Type | Label | Description | -| ----------- | ----------------- | ----- | ------------------------------------------------------------------------------- | -| name | [string](#string) | | | -| description | [string](#string) | | | -| contract | [string](#string) | | | -| owner | [bytes](#bytes) | | Owner is the address who is allowed to make further changes to the data source. | -| fees | [string](#string) | | | - - - - - - - - -### MsgEditAIDataSource -MsgEditAIDataSource edit data source metadata onto Oraichain - - -| Field | Type | Label | Description | -| ----------- | ----------------- | ----- | ------------------------------------------------------------------------------- | -| old_name | [string](#string) | | | -| new_name | [string](#string) | | | -| description | [string](#string) | | | -| contract | [string](#string) | | | -| owner | [bytes](#bytes) | | Owner is the address who is allowed to make further changes to the data source. | -| fees | [string](#string) | | | - - - - - - - - -### MsgEditAIDataSourceRes -MsgEditAIDataSourceRes returns edit result data. - - -| Field | Type | Label | Description | -| ----------- | ----------------- | ----- | ------------------------------------------------------------------------------- | -| name | [string](#string) | | | -| description | [string](#string) | | | -| contract | [string](#string) | | | -| owner | [bytes](#bytes) | | Owner is the address who is allowed to make further changes to the data source. | -| fees | [string](#string) | | | - - - - - - - - - - - - - - - - -

Top

- -## x/provider/types/tx_oscript.proto - - - - - -### MsgCreateOracleScript -MsgCreateOracleScript submit oracle script metadata onto Oraichain - - -| Field | Type | Label | Description | -| ------------ | ----------------- | -------- | --------------------------------------------------------------------------------- | -| name | [string](#string) | | | -| description | [string](#string) | | | -| contract | [string](#string) | | | -| owner | [bytes](#bytes) | | Owner is the address who is allowed to make further changes to the oracle script. | -| fees | [string](#string) | | | -| data_sources | [string](#string) | repeated | | -| test_cases | [string](#string) | repeated | | - - - - - - - - -### MsgCreateOracleScriptRes -MsgCreateOracleScriptRes returns store result data. - - -| Field | Type | Label | Description | -| ------------ | ----------------- | -------- | --------------------------------------------------------------------------------- | -| name | [string](#string) | | | -| description | [string](#string) | | | -| contract | [string](#string) | | | -| owner | [bytes](#bytes) | | Owner is the address who is allowed to make further changes to the oracle script. | -| fees | [string](#string) | | | -| data_sources | [string](#string) | repeated | | -| test_cases | [string](#string) | repeated | | - - - - - - - - -### MsgEditOracleScript -MsgEditOracleScript edit oracle script metadata onto Oraichain - - -| Field | Type | Label | Description | -| ------------ | ----------------- | -------- | --------------------------------------------------------------------------------- | -| old_name | [string](#string) | | | -| new_name | [string](#string) | | | -| description | [string](#string) | | | -| contract | [string](#string) | | | -| owner | [bytes](#bytes) | | Owner is the address who is allowed to make further changes to the oracle script. | -| fees | [string](#string) | | | -| data_sources | [string](#string) | repeated | | -| test_cases | [string](#string) | repeated | | - - - - - - - - -### MsgEditOracleScriptRes -MsgEditOracleScriptRes returns edit result data. - - -| Field | Type | Label | Description | -| ------------ | ----------------- | -------- | --------------------------------------------------------------------------------- | -| name | [string](#string) | | | -| description | [string](#string) | | | -| contract | [string](#string) | | | -| owner | [bytes](#bytes) | | Owner is the address who is allowed to make further changes to the oracle script. | -| fees | [string](#string) | | | -| data_sources | [string](#string) | repeated | | -| test_cases | [string](#string) | repeated | | - - - - - - - - - - - - - - - - -

Top

- -## x/provider/types/tx_tcase.proto - - - - - -### MsgCreateTestCase -MsgCreateTestCase submit test case metadata onto Oraichain - - -| Field | Type | Label | Description | -| ----------- | ----------------- | ----- | ----------------------------------------------------------------------------- | -| name | [string](#string) | | | -| description | [string](#string) | | | -| contract | [string](#string) | | | -| owner | [bytes](#bytes) | | Owner is the address who is allowed to make further changes to the test case. | -| fees | [string](#string) | | | - - - - - - - - -### MsgCreateTestCaseRes -MsgCreateTestCaseRes returns store result data. - - -| Field | Type | Label | Description | -| ----------- | ----------------- | ----- | ----------------------------------------------------------------------------- | -| name | [string](#string) | | | -| description | [string](#string) | | | -| contract | [string](#string) | | | -| owner | [bytes](#bytes) | | Owner is the address who is allowed to make further changes to the test case. | -| fees | [string](#string) | | | - - - - - - - - -### MsgEditTestCase -MsgEditTestCase edit test case metadata onto Oraichain - - -| Field | Type | Label | Description | -| ----------- | ----------------- | ----- | ----------------------------------------------------------------------------- | -| old_name | [string](#string) | | | -| new_name | [string](#string) | | | -| description | [string](#string) | | | -| contract | [string](#string) | | | -| owner | [bytes](#bytes) | | Owner is the address who is allowed to make further changes to the test case. | -| fees | [string](#string) | | | - - - - - - - - -### MsgEditTestCaseRes -MsgEditTestCaseRes returns edit result data. - - -| Field | Type | Label | Description | -| ----------- | ----------------- | ----- | ----------------------------------------------------------------------------- | -| name | [string](#string) | | | -| description | [string](#string) | | | -| contract | [string](#string) | | | -| owner | [bytes](#bytes) | | Owner is the address who is allowed to make further changes to the test case. | -| fees | [string](#string) | | | - - - - - - - - - - - - - - - - -

Top

- -## x/provider/types/types_ds.proto - - - - - -### AIDataSource - - - -| Field | Type | Label | Description | -| ----------- | ----------------------------------------------------- | -------- | ------------------------------------------------------------------------------- | -| name | [string](#string) | | | -| contract | [string](#string) | | | -| owner | [bytes](#bytes) | | Owner is the address who is allowed to make further changes to the data source. | -| description | [string](#string) | | | -| fees | [cosmos.base.v1beta1.Coin](#cosmos.base.v1beta1.Coin) | repeated | | - - - - - - - - - - - - - - - - -

Top

- -## x/provider/types/types_os.proto - - - - - -### OracleScript - - - -| Field | Type | Label | Description | -| ------------ | ----------------------------------------------------- | -------- | ------------------------------------------------------------------------------- | -| name | [string](#string) | | | -| contract | [string](#string) | | | -| owner | [bytes](#bytes) | | Owner is the address who is allowed to make further changes to the data source. | -| description | [string](#string) | | | -| minimum_fees | [cosmos.base.v1beta1.Coin](#cosmos.base.v1beta1.Coin) | repeated | | -| d_sources | [string](#string) | repeated | | -| t_cases | [string](#string) | repeated | | - - - - - - - - - - - - - - - - -

Top

- -## x/provider/types/types_tc.proto - - - - - -### TestCase - - - -| Field | Type | Label | Description | -| ----------- | ----------------------------------------------------- | -------- | ------------------------------------------------------------------------------- | -| name | [string](#string) | | | -| contract | [string](#string) | | | -| owner | [bytes](#bytes) | | Owner is the address who is allowed to make further changes to the data source. | -| description | [string](#string) | | | -| fees | [cosmos.base.v1beta1.Coin](#cosmos.base.v1beta1.Coin) | repeated | | - - - - - - - - - - - - - - - -## Scalar Value Types - -| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby | -| ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- | ------ | ---------- | ----------- | ------- | ---------- | -------------- | ------------------------------ | -| double | | double | double | float | float64 | double | float | Float | -| float | | float | float | float | float32 | float | float | Float | -| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) | -| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) | -| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) | -| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum | -| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | -| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum | -| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass | -| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) | -| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | []byte | ByteString | string | String (ASCII-8BIT) | - diff --git a/orai/doc/reset_node.md b/orai/doc/reset_node.md deleted file mode 100755 index 76b7bd12..00000000 --- a/orai/doc/reset_node.md +++ /dev/null @@ -1,13 +0,0 @@ -# Tutorial to reset the node - -### 1. Remove all runtime directories using the following command in the directory where you have the orai.env file - -```bash -sudo rm -rf .oraid/ -``` - -### 2. Pull and recreate the latest version of the orai image: - -``` -docker-compose pull orai && docker-compose up -d --force-recreate -``` \ No newline at end of file diff --git a/orai/doc/smart_contract.md b/orai/doc/smart_contract.md deleted file mode 100644 index 94fd8942..00000000 --- a/orai/doc/smart_contract.md +++ /dev/null @@ -1,65 +0,0 @@ -# How to simulate the oracle script smart contract - -## NOTE: You need to be in the root directory of the repository to successfully follow the below steps. - -### 1. Build the smart contract - -Start the rust container - -```bash -docker-compose up -d rust && docker-compose exec rust bash -``` - -```bash -cd oscript-price/ && optimize.sh . && exit -``` - -### 2. Start and enter the docker container - -```bash -docker-compose up -d simulate && docker-compose exec simulate bash -``` - -### 3. Simulate the smart contract - -```bash -cosmwasm-simulate oscript-price/artifacts/oscript_price.wasm -``` - -### 4. Type "query" in the command line - -The terminal will show something similar to: - -```bash -Auto loading json schema from oscript-price/artifacts/schema -Input call type(init | handle | query): -``` - -Please type **query** to continue - -### 5. Type the input for the query - -The terminal will ask you to type an input json string, similar to this below: - -```bash -Input json string: -``` - -Type the following input to query: - -```bash -{"aggregate":{"results":["100.5","200.1","300.1"]}} -``` - -The **results** field requires an array of float numbers to aggregate the results - -After typing, the result should look like: - -```bash -executing func [query] , params is {"aggregate":{"results":["100.5","200.1","300.1"]}} -query data = "200.23" -Gas used : 34661 -***************************call finished*************************** -``` - -The simulation process is done \ No newline at end of file diff --git a/orai/docker-compose-e2e-upgrade.yml b/orai/docker-compose-e2e-upgrade.yml deleted file mode 100755 index 0e204330..00000000 --- a/orai/docker-compose-e2e-upgrade.yml +++ /dev/null @@ -1,58 +0,0 @@ -services: - validator1: - container_name: validator1 - image: oraichain/foundation-orai:0.42.1-alpine-prod # one version lower so we can test the network upgrade - working_dir: /workspace - tty: true - ulimits: - nofile: - soft: 65536 - hard: 65536 - ports: - - 1317:1317 - - 26656:26656 - - 26657:26657 - - 9090:9090 - - 8545:8545 - cap_add: - - SYS_PTRACE - volumes: - - ./:/workspace - - validator2: - container_name: validator2 - image: oraichain/foundation-orai:0.42.1-alpine-prod - working_dir: /workspace - tty: true - ulimits: - nofile: - soft: 65536 - hard: 65536 - ports: - - 3317:1317 - - 36656:26656 - - 36657:26657 - - 3090:9090 - cap_add: - - SYS_PTRACE - volumes: - - ./:/workspace - - validator3: - container_name: validator3 - image: oraichain/foundation-orai:0.42.1-alpine-prod - working_dir: /workspace - tty: true - ulimits: - nofile: - soft: 65536 - hard: 65536 - ports: - - 4317:1317 - - 46656:26656 - - 46657:26657 - - 4090:9090 - cap_add: - - SYS_PTRACE - volumes: - - ./:/workspace diff --git a/orai/docker-compose.prod.yml b/orai/docker-compose.prod.yml deleted file mode 100755 index 2ad285f7..00000000 --- a/orai/docker-compose.prod.yml +++ /dev/null @@ -1,25 +0,0 @@ -services: - orai: - container_name: orai_node - image: oraichain/foundation-orai:0.42.2-alpine-prod - working_dir: /workspace - tty: true - ulimits: - nofile: - soft: 65536 - hard: 65536 - ports: - - 1317:1317 - - 26656:26656 - - 26657:26657 - - 9090:9090 - cap_add: - - SYS_PTRACE - env_file: - - orai.env - volumes: - - ./:/workspace - - oraivisor:/root/oraivisor - -volumes: - oraivisor: null diff --git a/orai/docker-compose.yml b/orai/docker-compose.yml deleted file mode 100755 index 5ef6bc01..00000000 --- a/orai/docker-compose.yml +++ /dev/null @@ -1,30 +0,0 @@ -services: - orai: - container_name: orai_node - image: oraichain/foundation-orai:0.42.2-alpine-dev - working_dir: /workspace - tty: true - ulimits: - nofile: - soft: 65536 - hard: 65536 - ports: - - 3317:1317 - - 36656:26656 - - 36657:26657 - - 3090:9090 - cap_add: - - SYS_PTRACE - env_file: - - orai.env - volumes: - - ./:/workspace - - oraivisor:/root/oraivisor - - proto: - image: cosmwasm/prototools-docker - tty: true - volumes: - - ./:/work -volumes: - oraivisor: null diff --git a/orai/go.mod b/orai/go.mod index 6206ef09..ecd674f0 100755 --- a/orai/go.mod +++ b/orai/go.mod @@ -200,8 +200,6 @@ replace ( github.com/CosmWasm/token-factory => github.com/CosmosContracts/token-factory v1.2.1-juno.0.20230523144425-253f9b9df6a6 // fork wasmd so that we have legacy wasm types - github.com/CosmWasm/wasmd => github.com/oraichain/wasmd v0.30.2-0.20240729102409-91ec1f5fdc6c - // go list -m -json github.com/oraichain/wasmvm@main | jq '.|"\(.Path) \(.Version)"' -r github.com/CosmWasm/wasmvm => github.com/oraichain/wasmvm v1.5.2 @@ -209,8 +207,6 @@ replace ( // same version as cosmos-sdk github.com/btcsuite/btcd => github.com/btcsuite/btcd v0.22.2 - github.com/cosmos/cosmos-sdk => github.com/oraichain/cosmos-sdk v0.45.16-ics-epi-191 - // backport iavl and go-ethereum to matching version with cosmos sdk & kava v0.14.0-kava-v21.1 github.com/cosmos/iavl => github.com/cosmos/iavl v0.19.5 github.com/ethereum/go-ethereum => github.com/ethereum/go-ethereum v1.10.17 @@ -224,7 +220,8 @@ replace ( // use Oraichain fork of cometbft // go list -m -json github.com/oraichain/cometbft@482cde0c4e04479d4164b1b4f7a0b90071c58b7f | jq '.|"\(.Path) \(.Version)"' -r - github.com/tendermint/tendermint => github.com/oraichain/cometbft v0.34.30-0.20240329015336-24dcc6856c88 + // github.com/tendermint/tendermint => github.com/oraichain/cometbft v0.34.30-0.20240425173150-09d3515b75aa + github.com/tendermint/tendermint => github.com/oraichain/cometbft v0.34.30-0.20240822152340-79f7b8278984 // Use ethermint fork that respects min-gas-price with NoBaseFee true and london enabled, and includes eip712 support // also add params query, fix proto account & ibc v3 to v4 compatibility, and get first 4 bytes of sha256(chain_id) when not eip159 compatible diff --git a/orai/go.sum b/orai/go.sum index 35d3882f..f2220e3f 100755 --- a/orai/go.sum +++ b/orai/go.sum @@ -63,6 +63,8 @@ github.com/ChainSafe/go-schnorrkel v1.0.0 h1:3aDA67lAykLaG1y3AOjs88dMxC88PgUuHRr github.com/ChainSafe/go-schnorrkel v1.0.0/go.mod h1:dpzHYVxLZcp8pjlV+O+UR8K0Hp/z7vcchBSbMBEhCw4= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= +github.com/CosmWasm/wasmd v0.33.0 h1:bNh596FfZj26m02kjpA0pkRj/f1JueMokT3zJfHT6Ww= +github.com/CosmWasm/wasmd v0.33.0/go.mod h1:BuszgLUQffVXxjfFCRjc2RuulJOpLyNZpG9+GdC0t/c= github.com/CosmosContracts/token-factory v1.2.1-juno.0.20230523144425-253f9b9df6a6 h1:2jL+sNaJoH+OMGYhOCcL6M5i3RaLGDDunZr+GeWy2xQ= github.com/CosmosContracts/token-factory v1.2.1-juno.0.20230523144425-253f9b9df6a6/go.mod h1:REKRfNe+zunKZitx2wGCPJBBmwu8qofOxGhsgV2h4cw= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= @@ -221,6 +223,8 @@ github.com/cosmos/cosmos-db v1.0.0 h1:EVcQZ+qYag7W6uorBKFPvX6gRjw6Uq2hIh4hCWjuQ0 github.com/cosmos/cosmos-db v1.0.0/go.mod h1:iBvi1TtqaedwLdcrZVYRSSCb6eSy61NLj4UNmdIgs0U= github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= +github.com/cosmos/cosmos-sdk v0.45.16 h1:5ba/Bh5/LE55IwHQuCU4fiG4eXeDKtSWzehXRpaKDcw= +github.com/cosmos/cosmos-sdk v0.45.16/go.mod h1:bScuNwWAP0TZJpUf+SHXRU3xGoUPp+X9nAzfeIXts40= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= @@ -824,18 +828,14 @@ github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxS github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/oraichain/cometbft v0.34.30-0.20240329015336-24dcc6856c88 h1:TCLtpL/CLFq+awORdJK3JzVJ1C+I1hS9vX+PTBcz2f4= -github.com/oraichain/cometbft v0.34.30-0.20240329015336-24dcc6856c88/go.mod h1:L9shMfbkZ8B+7JlwANEr+NZbBcn+hBpwdbeYvA5rLCw= -github.com/oraichain/cosmos-sdk v0.45.16-ics-epi-191 h1:xQrW8zgHNvuzeGxD7Yd2KPS4rZH4uTGsjFrWVHOW4eQ= -github.com/oraichain/cosmos-sdk v0.45.16-ics-epi-191/go.mod h1:bScuNwWAP0TZJpUf+SHXRU3xGoUPp+X9nAzfeIXts40= +github.com/oraichain/cometbft v0.34.30-0.20240822152340-79f7b8278984 h1:6bnkvlyGf6PE+3+/fM9Ic5Yb5qafPf1iM1YG21UOxt4= +github.com/oraichain/cometbft v0.34.30-0.20240822152340-79f7b8278984/go.mod h1:L9shMfbkZ8B+7JlwANEr+NZbBcn+hBpwdbeYvA5rLCw= github.com/oraichain/ethermint v0.14.1-0.20240730173417-7e4df27e54fd h1:6x+W4+RgYlzfUkbLrVeFbjDUQTyJOyvF5konzAGUxWs= github.com/oraichain/ethermint v0.14.1-0.20240730173417-7e4df27e54fd/go.mod h1:gpe0BVcBWKIfTraQXgCZ3g2f62vFzObAv2w/hvjLUko= github.com/oraichain/juno/x/clock v0.0.0-20240730041913-b862021c6b14 h1:VF0heTRI6XI364bctsIXe5UNQctryVVU+qvGSdHax18= github.com/oraichain/juno/x/clock v0.0.0-20240730041913-b862021c6b14/go.mod h1:A2bZN9cK0mV34BBtcZx+vnWf1Zj7yiZHT5e88BXczcI= github.com/oraichain/kava v0.21.2-0.20240712210740-04e37a257e4c h1:4/8eCd5wXyUn2N41qeQ3mS5c3vqVXDNQ0VmlW1AhUoA= github.com/oraichain/kava v0.21.2-0.20240712210740-04e37a257e4c/go.mod h1:3adeVmSpm8xejhI+v0qKZsLA8LNdMpkZSns1kXG9YiA= -github.com/oraichain/wasmd v0.30.2-0.20240729102409-91ec1f5fdc6c h1:M9XoVJ0EgBPBfuNUMxXGpa5AitznA27m59J0j651opk= -github.com/oraichain/wasmd v0.30.2-0.20240729102409-91ec1f5fdc6c/go.mod h1:DUWz5+p7h3BbDxXAt7IBovagwt5NRPCGVuQkweIixzM= github.com/oraichain/wasmvm v1.5.2 h1:hN5Pa4EPlRb0BYKkNh2cgixd0+L6kPpzc+s30Il2W/Q= github.com/oraichain/wasmvm v1.5.2/go.mod h1:fXB+m2gyh4v9839zlIXdMZGeLAxqUdYdFQqYsTha2hc= github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= diff --git a/orai/scripts/e2e-docker-upgrade.sh b/orai/scripts/e2e-docker-upgrade.sh deleted file mode 100755 index a716328c..00000000 --- a/orai/scripts/e2e-docker-upgrade.sh +++ /dev/null @@ -1,99 +0,0 @@ -#!/bin/bash -set -u - -# setup the network using the old binary - -ARGS="--chain-id testing -y --keyring-backend test --gas 20000000 --gas-adjustment 1.5 -b block" -NEW_VERSION=${NEW_VERSION:-"v0.42.2"} -UPGRADE_INFO_VERSION=${UPGRADE_INFO_VERSION:-"v0.42.2"} -UPGRADE_INFO=${UPGRADE_INFO:-"https://github.com/oraichain/orai/releases/download/$UPGRADE_INFO_VERSION/manifest.json"} -MIGRATE_MSG=${MIGRATE_MSG:-'{}'} -EXECUTE_MSG=${EXECUTE_MSG:-'{"ping":{}}'} -docker_command="docker-compose -f $PWD/docker-compose-e2e-upgrade.yml exec" -validator1_command="$docker_command validator1 bash -c" -validator2_command="$docker_command validator2 bash -c" -working_dir=/workspace -oraid_dir=$working_dir/.oraid -VALIDATOR_HOME=${VALIDATOR_HOME:-"$oraid_dir/validator1"} -WASM_PATH=${WASM_PATH:-"$working_dir/scripts/wasm_file/swapmap.wasm"} -HIDE_LOGS="/dev/null" - -# setup local network -sh $PWD/scripts/multinode-docker.sh - -# create new upgrade proposal -UPGRADE_HEIGHT=${UPGRADE_HEIGHT:-85} -$validator1_command "oraid tx gov submit-proposal software-upgrade $NEW_VERSION --title 'foobar' --description 'foobar' --from validator1 --upgrade-height $UPGRADE_HEIGHT --upgrade-info $UPGRADE_INFO --deposit 10000000orai $ARGS --home $VALIDATOR_HOME > $HIDE_LOGS" -$validator1_command "oraid tx gov vote 1 yes --from validator1 --home $VALIDATOR_HOME $ARGS > $HIDE_LOGS" -$validator1_command "oraid tx gov vote 1 yes --from validator2 --home $oraid_dir/validator2 $ARGS > $HIDE_LOGS" - -# sleep to wait til the proposal passes -echo "Sleep til the proposal passes..." - -# Check if latest height is less than the upgrade height -latest_height=$(curl --no-progress-meter http://localhost:1317/blocks/latest | jq '.block.header.height | tonumber') -echo $latest_height -while [ $latest_height -lt $UPGRADE_HEIGHT ]; -do - sleep 5 - ((latest_height=$(curl --no-progress-meter http://localhost:1317/blocks/latest | jq '.block.header.height | tonumber'))) - echo $latest_height -done - -# sleep about 5 secs to wait for the rest & json rpc server to be u -echo "Waiting for the REST & JSONRPC servers to be up ..." -sleep 19 - -oraid_version=$(curl --no-progress-meter http://localhost:36657/abci_info | jq '.result.response.version' | tr -d '"') -echo "oraid version: $oraid_version" -if [[ $oraid_version != $NEW_VERSION ]] ; then - echo "The chain has not upgraded yet. There's something wrong!"; exit 1 -fi - -height_before=$(curl --no-progress-meter http://localhost:1317/blocks/latest | jq '.block.header.height | tonumber') - -re='^[0-9]+([.][0-9]+)?$' -if ! [[ $height_before =~ $re ]] ; then - echo "error: Not a number" >&2; exit 1 -fi - -sleep 5 - -height_after=$(curl --no-progress-meter http://localhost:1317/blocks/latest | jq '.block.header.height | tonumber') - -if ! [[ $height_after =~ $re ]] ; then - echo "error: Not a number" >&2; exit 1 -fi - -if [ $height_after -gt $height_before ] -then -echo "Upgrade Passed" -else -echo "Upgarde Failed" -fi - -inflation=$(curl --no-progress-meter http://localhost:1317/cosmos/mint/v1beta1/inflation | jq '.inflation | tonumber') -if ! [[ $inflation =~ $re ]] ; then - echo "Error: Cannot query inflation => Potentially missing Go GRPC backport" >&2; - echo "Tests Failed"; exit 1 -fi - -result=$(curl --no-progress-meter http://localhost:8545/ -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":1}' | jq '.result') - -if ! [[ $result =~ true ]] ; then - echo "Error: Cannot query JSONRPC" >&2; - echo "Tests Failed"; exit 1 -fi - -evm_denom=$(curl --no-progress-meter http://localhost:1317/ethermint/evm/v1/params | jq '.params.evm_denom') -if ! [[ $evm_denom =~ "aorai" ]] ; then - echo "Error: EVM denom is not correct. The upgraded version is not the latest!" >&2; - echo "Tests Failed"; exit 1 -fi - -NODE_HOME=$VALIDATOR_HOME USER=validator1 WASM_PATH=$WASM_PATH bash $PWD/scripts/tests-0.42.1/test-gasless-docker.sh -NODE_HOME=$VALIDATOR_HOME USER=validator1 WASM_PATH=$WASM_PATH bash $PWD/scripts/tests-0.42.1/test-tokenfactory-docker.sh -NODE_HOME=$VALIDATOR_HOME USER=validator1 bash $PWD/scripts/tests-0.42.1/test-evm-cosmos-mapping-docker.sh -NODE_HOME=$VALIDATOR_HOME USER=validator1 bash $PWD/scripts/tests-0.42.2/test-multi-sig-docker.sh - -echo "Tests Passed" diff --git a/orai/scripts/e2e-tests.sh b/orai/scripts/e2e-tests.sh new file mode 100755 index 00000000..9c482e6a --- /dev/null +++ b/orai/scripts/e2e-tests.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +set -eu + +# setup the network using the old binary + +WASM_PATH=${WASM_PATH:-"$PWD/scripts/wasm_file/swapmap.wasm"} +ARGS="--chain-id testing -y --keyring-backend test --gas auto --gas-adjustment 1.5 -b block" +NEW_VERSION=${NEW_VERSION:-"v0.42.3"} +VALIDATOR_HOME=${VALIDATOR_HOME:-"$HOME/.oraid/validator1"} +re='^[0-9]+([.][0-9]+)?$' + +# setup local network +sh $PWD/scripts/multinode-local-testnet.sh + +# sleep about 5 secs to wait for the rest & json rpc server to be u +echo "Waiting for the REST & JSONRPC servers to be up ..." +sleep 5 + +oraid_version=$(oraid version) +if [[ $oraid_version =~ $NEW_VERSION ]] ; then + echo "The chain version is not latest yet. There's something wrong!"; exit 1 +fi + +inflation=$(curl --no-progress-meter http://localhost:1317/cosmos/mint/v1beta1/inflation | jq '.inflation | tonumber') +if ! [[ $inflation =~ $re ]] ; then + echo "Error: Cannot query inflation => Potentially missing Go GRPC backport" >&2; + echo "Tests Failed"; exit 1 +fi + +evm_denom=$(curl --no-progress-meter http://localhost:1317/ethermint/evm/v1/params | jq '.params.evm_denom') +if ! [[ $evm_denom =~ "aorai" ]] ; then + echo "Error: EVM denom is not correct. The current chain version is not the latest!" >&2; + echo "Tests Failed"; exit 1 +fi + +sh $PWD/scripts/test_clock_counter_contract.sh + +# test gasless +NODE_HOME=$VALIDATOR_HOME USER=validator1 WASM_PATH="$PWD/scripts/wasm_file/counter_high_gas_cost.wasm" sh $PWD/scripts/tests-0.42.1/test-gasless.sh +NODE_HOME=$VALIDATOR_HOME USER=validator1 sh $PWD/scripts/tests-0.42.1/test-tokenfactory.sh +NODE_HOME=$VALIDATOR_HOME USER=validator1 sh $PWD/scripts/tests-0.42.1/test-tokenfactory-bindings.sh +NODE_HOME=$VALIDATOR_HOME USER=validator1 sh $PWD/scripts/tests-0.42.1/test-evm-cosmos-mapping.sh +NODE_HOME=$VALIDATOR_HOME USER=validator1 sh $PWD/scripts/tests-0.42.1/test-evm-cosmos-mapping-complex.sh +NODE_HOME=$VALIDATOR_HOME USER=validator1 sh $PWD/scripts/tests-0.42.2/test-multi-sig.sh +NODE_HOME=$VALIDATOR_HOME sh $PWD/scripts/tests-0.42.3/test-commit-timeout.sh + +echo "Tests Passed!!" \ No newline at end of file diff --git a/orai/scripts/e2e-upgrade.sh b/orai/scripts/e2e-upgrade.sh index 3c1eadfc..db9a2bf6 100755 --- a/orai/scripts/e2e-upgrade.sh +++ b/orai/scripts/e2e-upgrade.sh @@ -4,10 +4,10 @@ set -eu # setup the network using the old binary -OLD_VERSION=${OLD_VERSION:-"v0.42.1"} +OLD_VERSION=${OLD_VERSION:-"v0.42.2"} WASM_PATH=${WASM_PATH:-"$PWD/scripts/wasm_file/swapmap.wasm"} ARGS="--chain-id testing -y --keyring-backend test --gas auto --gas-adjustment 1.5 -b block" -NEW_VERSION=${NEW_VERSION:-"v0.42.2"} +NEW_VERSION=${NEW_VERSION:-"v0.42.3"} VALIDATOR_HOME=${VALIDATOR_HOME:-"$HOME/.oraid/validator1"} MIGRATE_MSG=${MIGRATE_MSG:-'{}'} EXECUTE_MSG=${EXECUTE_MSG:-'{"ping":{}}'} @@ -127,5 +127,6 @@ NODE_HOME=$VALIDATOR_HOME USER=validator1 sh $PWD/scripts/tests-0.42.1/test-toke NODE_HOME=$VALIDATOR_HOME USER=validator1 sh $PWD/scripts/tests-0.42.1/test-evm-cosmos-mapping.sh NODE_HOME=$VALIDATOR_HOME USER=validator1 sh $PWD/scripts/tests-0.42.1/test-evm-cosmos-mapping-complex.sh NODE_HOME=$VALIDATOR_HOME USER=validator1 sh $PWD/scripts/tests-0.42.2/test-multi-sig.sh +NODE_HOME=$VALIDATOR_HOME sh $PWD/scripts/tests-0.42.3/test-commit-timeout.sh echo "Tests Passed!!" \ No newline at end of file diff --git a/orai/scripts/multinode-docker.sh b/orai/scripts/multinode-docker.sh deleted file mode 100755 index 4a6d7abf..00000000 --- a/orai/scripts/multinode-docker.sh +++ /dev/null @@ -1,168 +0,0 @@ -#!/bin/bash -set -u - -# # always returns true so set -e doesn't exit if it is not running. -rm -rf $PWD/.oraid/ - -# make four orai directories -mkdir $PWD/.oraid -mkdir $PWD/.oraid/validator1 -mkdir $PWD/.oraid/validator2 -mkdir $PWD/.oraid/validator3 -docker-compose -f docker-compose-e2e-upgrade.yml down --remove-orphans -docker volume rm orai_oraivisor -docker-compose -f docker-compose-e2e-upgrade.yml up -d --force-recreate -docker_command="docker-compose -f docker-compose-e2e-upgrade.yml exec" -validator1_command="$docker_command validator1 bash -c" -validator2_command="$docker_command validator2 bash -c" -validator3_command="$docker_command validator3 bash -c" -working_dir=/workspace/.oraid -HIDE_LOGS="/dev/null" - -# init all three validators -$validator1_command "oraid init --chain-id=testing validator1 --home=$working_dir/validator1" -$validator2_command "oraid init --chain-id=testing validator2 --home=$working_dir/validator2" -$validator3_command "oraid init --chain-id=testing validator3 --home=$working_dir/validator3" - -# # create keys for all three validators -$validator1_command "oraid keys add validator1 --keyring-backend=test --home=$working_dir/validator1" -$validator1_command "oraid keys add validator2 --keyring-backend=test --home=$working_dir/validator2" -$validator1_command "oraid keys add validator3 --keyring-backend=test --home=$working_dir/validator3" - -update_genesis () { - cat $PWD/.oraid/validator1/config/genesis.json | jq "$1" > $PWD/.oraid/validator1/config/tmp_genesis.json && mv $PWD/.oraid/validator1/config/tmp_genesis.json $PWD/.oraid/validator1/config/genesis.json -} - -# change staking denom to orai -update_genesis '.app_state["staking"]["params"]["bond_denom"]="orai"' - -# create validator node 1 -validator1_key=`$validator1_command "oraid keys list --output json --home $working_dir/validator1 --keyring-backend test" | jq .[0].address` -$validator1_command "oraid add-genesis-account $validator1_key 1000000000000orai,1000000000000stake --home=$working_dir/validator1" -$validator1_command "oraid gentx validator1 500000000orai --keyring-backend=test --home=$working_dir/validator1 --chain-id=testing" -$validator1_command "oraid collect-gentxs --home=$working_dir/validator1" -$validator1_command "oraid validate-genesis --home=$working_dir/validator1" - -# update staking genesis -update_genesis '.app_state["staking"]["params"]["unbonding_time"]="240s"' - -# update crisis variable to orai -update_genesis '.app_state["crisis"]["constant_fee"]["denom"]="orai"' - -# udpate gov genesis -update_genesis '.app_state["gov"]["voting_params"]["voting_period"]="5s"' -update_genesis '.app_state["gov"]["deposit_params"]["min_deposit"][0]["denom"]="orai"' - -# update mint genesis -update_genesis '.app_state["mint"]["params"]["mint_denom"]="orai"' - -# port key (validator1 uses default ports) -# validator1 1317, 9090, 9091, 26658, 26657, 26656, 6060 -# validator2 1316, 9088, 9089, 26655, 26654, 26653, 6061 -# validator3 1315, 9086, 9087, 26652, 26651, 26650, 6062 - - -# change app.toml values -VALIDATOR1_APP_TOML=$PWD/.oraid/validator1/config/app.toml -VALIDATOR2_APP_TOML=$PWD/.oraid/validator2/config/app.toml -VALIDATOR3_APP_TOML=$PWD/.oraid/validator3/config/app.toml - -# change config.toml values -VALIDATOR1_CONFIG=$PWD/.oraid/validator1/config/config.toml -VALIDATOR2_CONFIG=$PWD/.oraid/validator2/config/config.toml -VALIDATOR3_CONFIG=$PWD/.oraid/validator3/config/config.toml - -# Pruning - comment this configuration if you want to run upgrade script -pruning="custom" -pruning_keep_recent="5" -pruning_keep_every="10" -pruning_interval="10" - -sed -i -e "s%^pruning *=.*%pruning = \"$pruning\"%; " $VALIDATOR1_APP_TOML -sed -i -e "s%^pruning-keep-recent *=.*%pruning-keep-recent = \"$pruning_keep_recent\"%; " $VALIDATOR1_APP_TOML -sed -i -e "s%^pruning-keep-every *=.*%pruning-keep-every = \"$pruning_keep_every\"%; " $VALIDATOR1_APP_TOML -sed -i -e "s%^pruning-interval *=.*%pruning-interval = \"$pruning_interval\"%; " $VALIDATOR1_APP_TOML - -sed -i -e "s%^pruning *=.*%pruning = \"$pruning\"%; " $VALIDATOR2_APP_TOML -sed -i -e "s%^pruning-keep-recent *=.*%pruning-keep-recent = \"$pruning_keep_recent\"%; " $VALIDATOR2_APP_TOML -sed -i -e "s%^pruning-keep-every *=.*%pruning-keep-every = \"$pruning_keep_every\"%; " $VALIDATOR2_APP_TOML -sed -i -e "s%^pruning-interval *=.*%pruning-interval = \"$pruning_interval\"%; " $VALIDATOR2_APP_TOML - -sed -i -e "s%^pruning *=.*%pruning = \"$pruning\"%; " $VALIDATOR3_APP_TOML -sed -i -e "s%^pruning-keep-recent *=.*%pruning-keep-recent = \"$pruning_keep_recent\"%; " $VALIDATOR3_APP_TOML -sed -i -e "s%^pruning-keep-every *=.*%pruning-keep-every = \"$pruning_keep_every\"%; " $VALIDATOR3_APP_TOML -sed -i -e "s%^pruning-interval *=.*%pruning-interval = \"$pruning_interval\"%; " $VALIDATOR3_APP_TOML - -# state sync - comment this configuration if you want to run upgrade script -snapshot_interval="10" -snapshot_keep_recent="2" - -sed -i -e "s%^snapshot-interval *=.*%snapshot-interval = \"$snapshot_interval\"%; " $VALIDATOR1_APP_TOML -sed -i -e "s%^snapshot-keep-recent *=.*%snapshot-keep-recent = \"$snapshot_keep_recent\"%; " $VALIDATOR1_APP_TOML - -sed -i -e "s%^snapshot-interval *=.*%snapshot-interval = \"$snapshot_interval\"%; " $VALIDATOR2_APP_TOML -sed -i -e "s%^snapshot-keep-recent *=.*%snapshot-keep-recent = \"$snapshot_keep_recent\"%; " $VALIDATOR2_APP_TOML - -sed -i -e "s%^snapshot-interval *=.*%snapshot-interval = \"$snapshot_interval\"%; " $VALIDATOR3_APP_TOML -sed -i -e "s%^snapshot-keep-recent *=.*%snapshot-keep-recent = \"$snapshot_keep_recent\"%; " $VALIDATOR3_APP_TOML - -# validator1 -sed -i -E 's|allow_duplicate_ip = false|allow_duplicate_ip = true|g' $VALIDATOR1_CONFIG - -# validator2 -sed -i -E 's|tcp://127.0.0.1:26658|tcp://0.0.0.0:26658|g' $VALIDATOR2_CONFIG -sed -i -E 's|tcp://127.0.0.1:26657|tcp://0.0.0.0:26657|g' $VALIDATOR2_CONFIG -sed -i -E 's|tcp://0.0.0.0:26656|tcp://0.0.0.0:26656|g' $VALIDATOR2_CONFIG -sed -i -E 's|allow_duplicate_ip = false|allow_duplicate_ip = true|g' $VALIDATOR2_CONFIG - -# validator3 -sed -i -E 's|tcp://127.0.0.1:26658|tcp://0.0.0.0:26658|g' $VALIDATOR3_CONFIG -sed -i -E 's|tcp://127.0.0.1:26657|tcp://0.0.0.0:26657|g' $VALIDATOR3_CONFIG -sed -i -E 's|tcp://0.0.0.0:26656|tcp://0.0.0.0:26656|g' $VALIDATOR3_CONFIG -sed -i -E 's|allow_duplicate_ip = false|allow_duplicate_ip = true|g' $VALIDATOR3_CONFIG - -# modify jsonrpc ports to avoid clashing -sed -i -E 's|0.0.0.0:8545|0.0.0.0:7545|g' $VALIDATOR2_APP_TOML -sed -i -e "s%^ws-address *=.*%ws-address = \"0.0.0.0:7546\"%; " $VALIDATOR2_APP_TOML - -sed -i -E 's|0.0.0.0:8545|0.0.0.0:6545|g' $VALIDATOR3_APP_TOML -sed -i -e "s%^ws-address *=.*%ws-address = \"0.0.0.0:6546\"%; " $VALIDATOR3_APP_TOML - -# copy validator1 genesis file to validator2-3 -cp $PWD/.oraid/validator1/config/genesis.json $PWD/.oraid/validator2/config/genesis.json -cp $PWD/.oraid/validator1/config/genesis.json $PWD/.oraid/validator3/config/genesis.json - -validator1_id_res=`$validator1_command "oraid tendermint show-node-id --home=$working_dir/validator1 --log_format json"` -validator1_id=$(echo "$validator1_id_res" | tr -d -c '[:alnum:]') # remove all special characters because of the command's result -# copy tendermint node id of validator1 to persistent peers of validator2-3 -sed -i -E "s|persistent_peers = \"\"|persistent_peers = \"$validator1_id@validator1:26656\"|g" $VALIDATOR2_CONFIG -sed -i -E "s|persistent_peers = \"\"|persistent_peers = \"$validator1_id@validator1:26656\"|g" $VALIDATOR3_CONFIG - -# start all three validators -$docker_command -d validator1 bash -c "oraivisor start --home=$working_dir/validator1" -$docker_command -d validator2 bash -c "oraivisor start --home=$working_dir/validator2" -$docker_command -d validator3 bash -c "oraivisor start --home=$working_dir/validator3" - -# send orai from first validator to second validator -echo "Waiting 5 seconds to send funds to validators 2 and 3..." -sleep 5 - -validator2_key_res=`$validator2_command "oraid keys show validator2 -a --keyring-backend=test --home=$working_dir/validator2"` -validator2_key=$(echo "$validator2_key_res" | tr -d -c '[:alnum:]') # remove all special characters because of the command's result -validator3_key_res=`$validator3_command "oraid keys show validator3 -a --keyring-backend=test --home=$working_dir/validator3"` -validator3_key=$(echo "$validator3_key_res" | tr -d -c '[:alnum:]') # remove all special characters because of the command's result - -$validator1_command "oraid tx send validator1 $validator2_key 5000000000orai --keyring-backend=test --home=$working_dir/validator1 --chain-id=testing --broadcast-mode block --gas 200000 --fees 2orai --yes > $HIDE_LOGS" -$validator1_command "oraid tx send validator1 $validator3_key 4000000000orai --keyring-backend=test --home=$working_dir/validator1 --chain-id=testing --broadcast-mode block --gas 200000 --fees 2orai --yes > $HIDE_LOGS" -# send test orai to a test account -# oraid tx send $(oraid keys show validator1 -a --keyring-backend=test --home=$PWD/.oraid/validator1) orai14n3tx8s5ftzhlxvq0w5962v60vd82h30rha573 5000000000orai --keyring-backend=test --home=$PWD/.oraid/validator1 --chain-id=testing --broadcast-mode block --gas 200000 --fees 2orai --node http://localhost:26657 --yes - -# create second & third validator -validator2_pubkey_res=`$validator2_command "oraid tendermint show-validator --home=$working_dir/validator2"` -validator2_pubkey=$(echo "$validator2_pubkey_res" | jq '@json') # remove all special characters because of the command's result -validator3_pubkey_res=`$validator3_command "oraid tendermint show-validator --home=$working_dir/validator3"` -validator3_pubkey=$(echo "$validator3_pubkey_res" | jq '@json') # remove all special characters because of the command's result -$validator2_command "oraid tx staking create-validator --amount=500000000orai --from=validator2 --pubkey=$validator2_pubkey --moniker=validator2 --chain-id=testing --commission-rate=0.1 --commission-max-rate=0.2 --commission-max-change-rate=0.05 --min-self-delegation=500000000 --keyring-backend=test --home=$working_dir/validator2 --broadcast-mode block --gas 200000 --fees 2orai --yes > $HIDE_LOGS" -$validator3_command "oraid tx staking create-validator --amount=400000000orai --from=validator3 --pubkey=$validator3_pubkey --moniker=validator3 --chain-id=testing --commission-rate=0.1 --commission-max-rate=0.2 --commission-max-change-rate=0.05 --min-self-delegation=400000000 --keyring-backend=test --home=$working_dir/validator3 --broadcast-mode block --gas 200000 --fees 2orai --yes > $HIDE_LOGS" - -echo "All 3 Validators are up and running!" \ No newline at end of file diff --git a/orai/scripts/test_clock_counter_contract.sh b/orai/scripts/test_clock_counter_contract.sh index 9a34a1c9..84c4a554 100755 --- a/orai/scripts/test_clock_counter_contract.sh +++ b/orai/scripts/test_clock_counter_contract.sh @@ -1,6 +1,7 @@ #!/bin/bash # Before running this script, you must setup local network: # sh $PWD/scripts/multinode-local-testnet.sh +# cw-clock-example.wasm source code: https://github.com/oraichain/cw-plus.git WASM_PATH=${WASM_PATH:-"$PWD/scripts/wasm_file/cw-clock-example.wasm"} ARGS="--chain-id testing -y --keyring-backend test --gas auto --gas-adjustment 1.5 -b block" @@ -38,9 +39,21 @@ counter_after=$(oraid query wasm contract-state smart $contract_address $QUERY_M sleep 2 echo "cw-clock counter_after: $counter_after" -if [ $counter_after -gt $counter_before ] -then -echo "Clock Counter Test Passed" -else -echo "Clock Counter Test Failed" +if [[ $counter_after == $counter_before ]]; then + echo "Clock Counter Test Failed"; exit 1 fi + +QUERY_MSG='{"get_after_sudo":{}}' +after_sudo_before=$(oraid query wasm contract-state smart $contract_address $QUERY_MSG --node "tcp://localhost:26657" --output json | jq -r '.data | tonumber') +sleep 2 +echo "cw-clock after sudo before: $after_sudo_before" + +after_sudo_after=$(oraid query wasm contract-state smart $contract_address $QUERY_MSG --node "tcp://localhost:26657" --output json | jq -r '.data | tonumber') +sleep 2 +echo "cw-clock after sudo after: $after_sudo_after" + +if [[ $after_sudo_before == $after_sudo_after ]]; then + echo "Clock Counter After Sudo Test Failed"; exit 1 +fi + +echo "Clock Counter Test Passed" diff --git a/orai/scripts/tests-0.42.1/test-evm-cosmos-mapping-docker.sh b/orai/scripts/tests-0.42.1/test-evm-cosmos-mapping-docker.sh deleted file mode 100755 index 5da683dd..00000000 --- a/orai/scripts/tests-0.42.1/test-evm-cosmos-mapping-docker.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash - -set -eux - -CHAIN_ID=${CHAIN_ID:-testing} -USER=${USER:-tupt} -NODE_HOME=${NODE_HOME:-"$PWD/.oraid"} -ARGS="--from $USER --chain-id $CHAIN_ID -y --keyring-backend test --gas auto --gas-adjustment 1.5 -b block --home $NODE_HOME" -docker_command="docker-compose -f $PWD/docker-compose-e2e-upgrade.yml exec" -validator1_command="$docker_command validator1 bash -c" -HIDE_LOGS="/dev/null" - -user_address_result=`$validator1_command "oraid keys show $USER --home $NODE_HOME --keyring-backend test --output json"` -user_address=$(echo $user_address_result | jq '.address' | tr -d '"') - -user_pubkey_result=`$validator1_command "oraid keys show $USER --home $NODE_HOME --keyring-backend test -p"` -user_pubkey=$(echo $user_pubkey_result | jq '.key' | tr -d '"') -$validator1_command "oraid tx evm set-mapping-evm $user_pubkey $ARGS > $HIDE_LOGS" - -expected_evm_address=`$validator1_command "oraid debug pubkey-simple $user_pubkey"` -actual_evm_address_result=`$validator1_command "oraid query evm mappedevm $user_address --output json"` -actual_evm_address=$(echo $actual_evm_address_result | jq '.evm_address' | tr -d '"') -if ! [[ $actual_evm_address =~ $expected_evm_address ]] ; then - echo "The evm addresses dont match"; exit 1 -fi - -echo "EVM cosmos mapping docker tests passed!" \ No newline at end of file diff --git a/orai/scripts/tests-0.42.1/test-gasless-docker.sh b/orai/scripts/tests-0.42.1/test-gasless-docker.sh deleted file mode 100755 index a120e50b..00000000 --- a/orai/scripts/tests-0.42.1/test-gasless-docker.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - -set -eu - -CHAIN_ID=${CHAIN_ID:-testing} -USER=${USER:-tupt} -WASM_PATH=${WASM_PATH:-"$PWD/scripts/wasm_file/swapmap.wasm"} -EXECUTE_MSG=${EXECUTE_MSG:-'{"ping":{}}'} -NODE_HOME=${NODE_HOME:-"$PWD/.oraid"} -ARGS="--from $USER --chain-id $CHAIN_ID -y --keyring-backend test --gas 20000000 --gas-adjustment 1.5 -b block --home $NODE_HOME" -docker_command="docker-compose -f $PWD/docker-compose-e2e-upgrade.yml exec" -validator1_command="$docker_command validator1 bash -c" -HIDE_LOGS="/dev/null" - -# prepare a new contract for gasless -store_ret=`$validator1_command "oraid tx wasm store $WASM_PATH --from validator1 --home $NODE_HOME $ARGS --output json"` -code_id=$(echo $store_ret | jq -r '.logs[0].events[1].attributes[] | select(.key | contains("code_id")).value') -$validator1_command "oraid tx wasm instantiate $code_id \"{}\" --label 'testing' --from validator1 --home $NODE_HOME -b block --no-admin $ARGS > $HIDE_LOGS" -contract_address_res=`$validator1_command "oraid query wasm list-contract-by-code $code_id --output json | jq -r '.contracts[0]'"` -contract_address=$(echo "$contract_address_res" | tr -d -c '[:alnum:]') # remove all special characters because of the command's result - -# set gasless proposal -$validator1_command "oraid tx gov submit-proposal set-gasless $contract_address --title 'gasless' --description 'gasless' --deposit 10000000orai $ARGS > $HIDE_LOGS" -proposal_id_result=`$validator1_command "oraid query gov proposals --reverse --output json"` -proposal_id=$(echo $proposal_id_result | jq '.proposals[0].proposal_id | tonumber') - -$validator1_command "oraid tx gov vote $proposal_id yes $ARGS > $HIDE_LOGS" - -# wait til proposal passes -sleep 6 -proposal_status_result=`$validator1_command "oraid query gov proposal $proposal_id --output json"` -proposal_status=$(echo $proposal_status_result | jq '.status') -if ! [[ $proposal_status =~ "PROPOSAL_STATUS_PASSED" ]] ; then - echo "The proposal has not passed yet"; exit 1 -fi \ No newline at end of file diff --git a/orai/scripts/tests-0.42.1/test-tokenfactory-docker.sh b/orai/scripts/tests-0.42.1/test-tokenfactory-docker.sh deleted file mode 100755 index 9f0fdf7a..00000000 --- a/orai/scripts/tests-0.42.1/test-tokenfactory-docker.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/bash - -set -eu - -CHAIN_ID=${CHAIN_ID:-testing} -USER=${USER:-tupt} -NODE_HOME=${NODE_HOME:-"$PWD/.oraid"} -ARGS="--from $USER --chain-id $CHAIN_ID -y --keyring-backend test --gas auto --gas-adjustment 1.5 -b block --home $NODE_HOME" -docker_command="docker-compose -f $PWD/docker-compose-e2e-upgrade.yml exec" -validator1_command="$docker_command validator1 bash -c" -HIDE_LOGS="/dev/null" - -# prepare a new contract for gasless -fee_params=`$validator1_command "oraid query tokenfactory params --output json | jq '.params.denom_creation_fee[0].denom'"` -if ! [[ $fee_params =~ "orai" ]] ; then - echo "The tokenfactory fee params is not orai"; exit 1 -fi - -# try creating a new denom -denom_name="usdt" -$validator1_command "oraid tx tokenfactory create-denom $denom_name $ARGS > $HIDE_LOGS" - -# try querying list denoms afterwards -user_address_result=`$validator1_command "oraid keys show $USER --home $NODE_HOME --keyring-backend test --output json"` -user_address=$(echo $user_address_result | jq '.address' | tr -d '"') -first_denom_before_trim=`$validator1_command "oraid query tokenfactory denoms-from-creator $user_address --output json"` -first_denom=$(echo $first_denom_before_trim | jq '.denoms[0]' | tr -d '"') -echo "first denom: $first_denom" - -if ! [[ $first_denom =~ "factory/$user_address/$denom_name" ]] ; then - echo "The tokenfactory denom does not match the created denom"; exit 1 -fi - -admin=`$validator1_command "oraid query tokenfactory denom-authority-metadata $first_denom --output json | jq '.authority_metadata.admin'"` -echo "admin: $admin" - -if ! [[ $admin =~ $user_address ]] ; then - echo "The tokenfactory admin does not match the creator"; exit 1 -fi - -# try mint -$validator1_command "oraid tx tokenfactory mint 10$first_denom $ARGS > $HIDE_LOGS" - -# query balance after mint -tokenfactory_balance_result=`$validator1_command "oraid query bank balances $user_address --denom=$first_denom --output json"` -tokenfactory_balance=$(echo $tokenfactory_balance_result | jq '.amount | tonumber') -echo "token factory balance: $tokenfactory_balance" -if [[ $tokenfactory_balance -ne 10 ]] ; then - echo "The tokenfactory balance does not increase after mint"; exit 1 -fi - -# try burn -$validator1_command "oraid tx tokenfactory burn 10$first_denom $ARGS > $HIDE_LOGS" -tokenfactory_balance_result=`$validator1_command "oraid query bank balances $user_address --denom=$first_denom --output json"` -tokenfactory_balance=$(echo $tokenfactory_balance_result | jq '.amount | tonumber') -if [[ $tokenfactory_balance -ne 0 ]] ; then - echo "The tokenfactory balance does not decrease after burn"; exit 1 -fi - -echo "Tokenfactory tests passed!" \ No newline at end of file diff --git a/orai/scripts/tests-0.42.2/test-multi-sig-docker.sh b/orai/scripts/tests-0.42.2/test-multi-sig-docker.sh deleted file mode 100755 index 73ca1f96..00000000 --- a/orai/scripts/tests-0.42.2/test-multi-sig-docker.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash - -set -eu - -CHAIN_ID=${CHAIN_ID:-testing} -USER=${USER:-tupt} -NODE_HOME=${NODE_HOME:-"$PWD/.oraid"} -ARGS="--from $USER --chain-id $CHAIN_ID -y --keyring-backend test --gas 20000000 -b block --home $NODE_HOME" -docker_command="docker-compose -f $PWD/docker-compose-e2e-upgrade.yml exec" -validator1_command="$docker_command validator1 bash -c" -HIDE_LOGS="/dev/null" - -# add a signer wallet -signer="signer" -$validator1_command "echo y | oraid keys add $signer --home $NODE_HOME --keyring-backend test" -signer_address_result=`$validator1_command "oraid keys show $signer --home $NODE_HOME --keyring-backend test --output json"` -signer_address=$(echo $signer_address_result | jq '.address' | tr -d '"') - -# add a multisig wallet -multisig="multisig" -$validator1_command "echo y | oraid keys add $multisig --multisig $USER,$signer --multisig-threshold 1 --home $NODE_HOME --keyring-backend test" -multisig_address_result=`$validator1_command "oraid keys show $multisig --home $NODE_HOME --keyring-backend test --output json"` -multisig_address=$(echo $multisig_address_result | jq '.address' | tr -d '"') - -user_address_result=`$validator1_command "oraid keys show $USER --home $NODE_HOME --keyring-backend test --output json"` -user_address=$(echo $user_address_result | jq '.address' | tr -d '"') - -# send some tokens to the multisign address -$validator1_command "oraid tx send $user_address $multisig_address 100000000orai $ARGS > $HIDE_LOGS" -$validator1_command "oraid tx send $user_address $signer_address 100000000orai $ARGS > $HIDE_LOGS" - -# now we test multi-sign -# generate dry message -$validator1_command "oraid tx send $multisig_address $user_address 1orai --generate-only $ARGS 2>&1 | tee tx.json" - -# sign message -$validator1_command "oraid tx sign --from $user_address --multisig=$multisig_address tx.json $ARGS 2>&1 | tee tx-signed-data.json" - -# multisign -$validator1_command "oraid tx multisign tx.json multisig tx-signed-data.json $ARGS 2>&1 | tee tx-signed.json" - -# broadcast -result=`$validator1_command "oraid tx broadcast tx-signed.json $ARGS --output json"` -code=$(echo $result | jq '.code | tonumber') -# clean up tx files -$validator1_command "rm tx*.json" - -if [[ $code -gt 0 ]] ; then - echo "Multi-sig test failed"; exit 1 -fi - -echo "Multi-sign test passed!" \ No newline at end of file diff --git a/orai/scripts/tests-0.42.3/test-commit-timeout.sh b/orai/scripts/tests-0.42.3/test-commit-timeout.sh new file mode 100755 index 00000000..07a0b9da --- /dev/null +++ b/orai/scripts/tests-0.42.3/test-commit-timeout.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +set -eu + +NODE_HOME=${NODE_HOME:-"$PWD/.oraid"} +TEST_NODE_HOME="$NODE_HOME/.oraid" + +# remove old test default config files +rm -rf $TEST_NODE_HOME +# populate config files in the test directory +oraid version --home $TEST_NODE_HOME + +# Extract timeout commit from the test commit file. Should be 500ms +timeout_commit=$(sed -n 's/^[[:space:]]*timeout_commit[[:space:]]*=[[:space:]]*"\(.*\)".*/\1/p' $TEST_NODE_HOME/config/config.toml) +echo "timeout commit: $timeout_commit" + +if ! [[ $timeout_commit == "500ms" ]] ; then + echo "Commit timeout test failed"; exit 1 +fi + +echo "Commit timeout test passed!" \ No newline at end of file diff --git a/orai/scripts/wasm_file/cw-clock-example.wasm b/orai/scripts/wasm_file/cw-clock-example.wasm index 87781826fa7c509ca90cbcf9c93322825ac317de..bfb1fe40d655ec1a916979fc9c5a4e56f9fe201a 100644 GIT binary patch literal 148003 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�QI_b=fdMolKB;Wh7}qiccfklLwtU+PEbQd+6wzt`!Gy_LPjZx?;Y({# zkyKsB-y5+?Hq|Z_Do(LjnxIZBo+Oq?Wl}{!wOV7T6Q_#XlnbN>FUVQa+H{S8^<6nA6)2)Ho zbJqUhg%_1c<$>VZb(h|I{{!D`Jv!lvEBD>56ciRuX!Q6ai`qNRS+=}4w&~Hws;YI1 z%|59t5RTk^&#OPT2Cq4Aw{B~j6Yt-DZE>>msdwMo(Ea|OkFQ#N%dM`K`i3>P9X#~4 z!*|{N&Bvekfo6A<)I{bkI`7WAe)7|UdPU`wX>;bj{my&GpMFMRXHA>l;0r~ToU?Sr zsx@oR->_**S5GW{L2Ab(mtJ-F-UlB1-V66XkVrmx-IggAtFkgvj>}?;E3>Oc_7qhs zQ?0e?40WMW*p#_fo2pDz8Z3VMvIV0-YpKmr-nJ+#_gJj%Qv6l8Dpi~pQqEOd6q|0< z=dpUlVGYO;wNh6c`ihRAufV6fEVj|HEo|i zr%7v5ZQ6O7s5)geb9Hy^5{oT!=awmp>^7}nVnnkAnw7H5w`cXPaxAgh+80$Vv8*cS z&~2Fy+if-S;*OwPXt8Nw-8LGi(A(tdwPKOC;IdoeX?x}eS1s)+*zIWU+(IQl}4p^7cQNh`HxwesH{<|{L*M)v(oEWYs=gpswrqzth!XF zWp26bRi#)ikhd$HnnMwb97+g-Yp_gNHoDqT16%@@LKL;?nIBKH?bZZQR#i=tbj_k$ zi*42R3P)vuv(QnbIOPcwCR$6yGNoLskSp~nv0ADtW%3MprrjmFWsl?)?~?A3?p5xy z{7L#){fqR8eBAoY9Xqeydxv}7`B(3`rutWfMdvR4_|LAExtlh3zPWqvz600Z^U&kp zdHR{>e)Q|Nesf$Sh*}QunG9P*TJJ0;+`6F-rMi?XaHlp_}y|LW~ZoTcf z=Z_Q=H%8hPb*$UCX-j8sZ0~`4Q03|8UVrO1#|nxUb@awEyB~hy$){d=<=F2oyZq|I zcRu;l(?2}&+Ao&e{N0~E^Zb#HWy{yC-_m*IzWon9`q)$d{>%?wDK0JBxaq?`esVlB z`1xPIURak%R@Zc1^2Pffxb!{5rPifN<|^&J!;Uh=b4VF| zZMyDI)y$pF(GPTyHEGD*t7M*(tK_1BPvzlRUfxMAUXtnOIJvE51=w{1f(dUzn$C}t z+8Of%Y)W5@{N}mFjl>YrbZ(h&9O<(V1Q{PBD@-_`b_ts&9uy{&u{sCqs(Y{b;EX0W zYfj#Iv{|~lYi8}oT`u7h7P$R*SKu$=8v)TaIXJc8jo^KS(Qr%op|HC;y5tYFhnCLs zM^_x%cIdq2$;m5kd*aYa;Yf5)v^5^7sS-bn5yrWuNT4mTR+90fG=NnU5GP5cIQ38(ZCgZLwn?@4^Hw5$ z1kfrrpn0?^tDrhvvh!96C3GqgTrGuxpV>=|xI|QNA6FDD;(4N^J1pIzWVP!ZQWe@0 z#bBX`9#y+I)hfmnQ3Fy^g`~(%{BdhZ(!?SWb1&COwfHv=zw%%aCA(Dw#fxcaig=-{ zNLEpke}PE=wmP*aSu~p@y6ZfO8?Y)iSRME|1Qd`%$V5dsVv(eqWwAiisY6+MW}YB^ zf3hI&6}yx;x~y_NZ^gYy+TsOo21GK1>$r|h215)F*Zr67Z+gWCH$0+MQjm$ zXca$fgK;-W7V%x0HW7l96CWF(l{dv3R6)ill?GW6zmE0=X@%Tw_b3;Ofucr?(4NR+NdiLKc6i5Rh3erRwRH82;yAjJiHfNQW*qj+`7geWz%bw>+yHZ6|Y4s6iZdH v2(1?L7S&$yAnMFkFa!FaE_7v%86OpsHJ;=|GbEuy+<@>f!m9|M_?-U-0Y?lk literal 137498 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�DYcJ36MzI=$9|Q8TvaL7sFA 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