Merge remote-tracking branch 'refs/remotes/origin/main'

This commit is contained in:
boneyard93501 2023-03-01 05:54:40 -07:00
commit cf01a840a8
188 changed files with 172875 additions and 34401 deletions

View File

@ -2,13 +2,5 @@
set -o pipefail -o errexit -o nounset
set -x
MARINE_RELEASE="https://api.github.com/repos/fluencelabs/marine/releases/latest"
OUT_DIR=/usr/local/bin
# get metadata about release
curl -s -H "Accept: application/vnd.github.v3+json" $MARINE_RELEASE |
# extract url and name for asset with name "marine"
# also append $OUT_DIR to each name so file is saved to $OUT_DIR
jq -r ".assets | .[] | select(.name == \"marine\") | \"\(.browser_download_url) $OUT_DIR/\(.name)\"" |
# download assets
xargs -n2 bash -c 'curl -L $0 -o $1 && chmod +x $1'
MARINE_RELEASE="https://github.com/fluencelabs/marine/releases/download/marine-v0.12.6/marine"
curl -sS -L $MARINE_RELEASE -o /usr/local/bin/marine && chmod +x /usr/local/bin/marine

View File

@ -13,9 +13,9 @@ jobs:
working-directory: [
"./quickstart/1-browser-to-browser",
"./quickstart/3-browser-to-service",
"./fluence-js-examples/hello-world",
"./fluence-js-examples/browser-example",
"./fluence-js-examples/node-example",
"./js-client-examples/hello-world",
"./js-client-examples/browser-example",
"./js-client-examples/node-example",
"./aqua-examples/echo-greeter/client-peer",
"./aqua-examples/price-oracle/client-peer",
"./aqua-examples/price-oracle/web"

View File

@ -8,9 +8,6 @@ If you encounter a problem, please post an Issue or open a PR. If you want to co
## Resource Directory
* The [Ceramic Integration](./aqua-examples/aqua-ceramic-integration/) provides an example Wasm adapter for the Ceramic [CLI API](https://developers.ceramic.network/build/cli/api/) and [HTTP API](https://developers.ceramic.network/build/http/api/).
* Rust Wasm, Aqua
* The [IPFS Integration](./aqua-examples/aqua-ipfs-integration/) shows how to use the [aqua-ipfs](https://github.com/fluencelabs/aqua-ipfs) library to deploy single-module Wasm services to a Fluence node from a IPFS sidecar
* Fluence JS, Aqua

View File

@ -23,14 +23,14 @@
"license": "MIT",
"dependencies": {
"@fluencelabs/aqua-ipfs": "^0.5.5",
"@fluencelabs/fluence": "^0.27.0",
"@fluencelabs/fluence-network-environment": "1.0.13",
"@fluencelabs/fluence": "^0.28.0",
"@fluencelabs/fluence-network-environment": "1.0.14",
"it-all": "^1.0.5",
"multiaddr": "^10.0.0",
"uint8arrays": "^2.1.5"
},
"devDependencies": {
"@fluencelabs/aqua": "0.8.0-368",
"@fluencelabs/aqua": "0.10.3",
"@fluencelabs/aqua-lib": "0.6.0",
"typescript": "^4.6.3"
}

View File

@ -24,15 +24,15 @@
"author": "Fluence Labs",
"license": "MIT",
"dependencies": {
"@fluencelabs/fluence": "^0.27.0",
"@fluencelabs/fluence-network-environment": "1.0.13",
"@fluencelabs/fluence": "^0.28.0",
"@fluencelabs/fluence-network-environment": "1.0.14",
"@fluencelabs/ipfs-execution-aqua": "file:../aqua",
"it-all": "^1.0.5",
"multiaddr": "^10.0.0",
"uint8arrays": "^2.1.5"
},
"devDependencies": {
"@fluencelabs/aqua": "0.8.0-368",
"@fluencelabs/aqua": "0.10.3",
"@fluencelabs/aqua-lib": "0.6.0",
"@types/jest": "^27.0.3",
"jest": "^27.4.0",

View File

@ -11,8 +11,8 @@
"web"
],
"dependencies": {
"@fluencelabs/aqua": "0.8.0-368",
"@fluencelabs/fluence": "0.27.5",
"@fluencelabs/aqua": "0.10.3",
"@fluencelabs/fluence": "0.28.0",
"ipfs-http-client": "^56.0.3",
"typescript": "^4.6.3"
},
@ -31,14 +31,14 @@
"license": "MIT",
"dependencies": {
"@fluencelabs/aqua-ipfs": "^0.5.5",
"@fluencelabs/fluence": "^0.27.0",
"@fluencelabs/fluence-network-environment": "1.0.13",
"@fluencelabs/fluence": "^0.28.0",
"@fluencelabs/fluence-network-environment": "1.0.14",
"it-all": "^1.0.5",
"multiaddr": "^10.0.0",
"uint8arrays": "^2.1.5"
},
"devDependencies": {
"@fluencelabs/aqua": "0.8.0-368",
"@fluencelabs/aqua": "0.10.3",
"@fluencelabs/aqua-lib": "0.6.0",
"typescript": "^4.6.3"
}
@ -49,6 +49,11 @@
"integrity": "sha512-ifjtCM93KO3LhzPkMxqmXhwLmrg/scjOiyTihEVg7ns5N+BVzaK1eWzdOdqGdl9ZVoah43pdlQUepEo7VdRmsw==",
"dev": true
},
"aqua/node_modules/@fluencelabs/fluence-network-environment": {
"version": "1.0.14",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence-network-environment/-/fluence-network-environment-1.0.14.tgz",
"integrity": "sha512-lMiH+7obmJW2Q+PMUR/vNAuX6TcVqlKmsWAHvnBogH7s8IeMT+UGN8qrweILWmE57G7MfauB302dIFQowR9tug=="
},
"node_modules/@ampproject/remapping": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
@ -2275,13 +2280,13 @@
}
},
"node_modules/@fluencelabs/aqua": {
"version": "0.8.0-368",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.8.0-368.tgz",
"integrity": "sha512-vnqgjwJWa2XvNqGUCITvkhIiF7ps9WhZL4GfvtuSwVAsdpDaYGtxPH63wcYcG9TwRCr7nGgjOhJGXhkmGhUE2w==",
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.10.3.tgz",
"integrity": "sha512-v7Jy+KzZkUm7NuUgrp7UQ8gxuhykxuTU3JigCdxiZMcG3/zD+OtHzsSggVLxVjDP7CKuTcjEKZSCxObwHp/Tpw==",
"dependencies": {
"@fluencelabs/aqua-ipfs": "0.5.8",
"@fluencelabs/aqua-ipfs": "0.5.9",
"@fluencelabs/aqua-lib": "0.6.0",
"@fluencelabs/fluence": "0.27.4",
"@fluencelabs/fluence": "0.28.0",
"@fluencelabs/fluence-network-environment": "1.0.13",
"ipfs-http-client": "50.1.2"
},
@ -2291,9 +2296,9 @@
}
},
"node_modules/@fluencelabs/aqua-ipfs": {
"version": "0.5.8",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-ipfs/-/aqua-ipfs-0.5.8.tgz",
"integrity": "sha512-jKlyGBm8oJAIQ3Ags58oJ8QVTlCYSvZQVTnX2SnugGXWVwt4+9qtqtvNT5MvWKK3M9lCFDbJJy/qVTjzPJlaiw==",
"version": "0.5.9",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-ipfs/-/aqua-ipfs-0.5.9.tgz",
"integrity": "sha512-Vg7pYv4gEreOKfvzKEL5FchGqSKwat7JyKpqJO6h+FC5S1bl76UkI507+ExhijmUbQGznop8G33XFxyUi6q5SQ==",
"dependencies": {
"@fluencelabs/aqua-lib": "^0.5.2"
}
@ -2308,38 +2313,6 @@
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-lib/-/aqua-lib-0.6.0.tgz",
"integrity": "sha512-ifjtCM93KO3LhzPkMxqmXhwLmrg/scjOiyTihEVg7ns5N+BVzaK1eWzdOdqGdl9ZVoah43pdlQUepEo7VdRmsw=="
},
"node_modules/@fluencelabs/aqua/node_modules/@fluencelabs/fluence": {
"version": "0.27.4",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.27.4.tgz",
"integrity": "sha512-f85q8ZdmPlUd6uIgmS0CDTvSsb+TGvTqOljw0b161lfEuqPIXrjxJSt0/2Lyh2eEZ1P3slOka1tbVw01nVrt5w==",
"dependencies": {
"@fluencelabs/avm": "0.31.10",
"@fluencelabs/connection": "0.2.0",
"@fluencelabs/interfaces": "0.1.0",
"@fluencelabs/keypair": "0.2.0",
"@fluencelabs/marine-js": "0.3.37",
"async": "3.2.3",
"base64-js": "^1.5.1",
"browser-or-node": "2.0.0",
"bs58": "5.0.0",
"buffer": "^6.0.3",
"cids": "1.1.9",
"loglevel": "1.8.0",
"multiformats": "9.6.5",
"peer-id": "0.16.0",
"platform": "^1.3.6",
"rxjs": "^7.5.5",
"ts-pattern": "3.3.3",
"uuid": "8.3.2"
},
"bin": {
"copy-marine": "dist/tools/copyMarine.js"
},
"engines": {
"node": ">=10",
"pnpm": ">=3"
}
},
"node_modules/@fluencelabs/aqua/node_modules/any-signal": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/any-signal/-/any-signal-2.1.2.tgz",
@ -2489,32 +2462,6 @@
"minimatch": "^3.0.4"
}
},
"node_modules/@fluencelabs/aqua/node_modules/libp2p-crypto": {
"version": "0.21.2",
"resolved": "https://registry.npmjs.org/libp2p-crypto/-/libp2p-crypto-0.21.2.tgz",
"integrity": "sha512-EXFrhSpiHtJ+/L8xXDvQNK5VjUMG51u878jzZcaT5XhuN/zFg6PWJFnl/qB2Y2j7eMWnvCRP7Kp+ua2H36cG4g==",
"dependencies": {
"@noble/ed25519": "^1.5.1",
"@noble/secp256k1": "^1.3.0",
"err-code": "^3.0.1",
"iso-random-stream": "^2.0.0",
"multiformats": "^9.4.5",
"node-forge": "^1.2.1",
"protobufjs": "^6.11.2",
"uint8arrays": "^3.0.0"
},
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/@fluencelabs/aqua/node_modules/libp2p-crypto/node_modules/uint8arrays": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz",
"integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==",
"dependencies": {
"multiformats": "^9.4.2"
}
},
"node_modules/@fluencelabs/aqua/node_modules/multiaddr": {
"version": "9.0.2",
"resolved": "https://registry.npmjs.org/multiaddr/-/multiaddr-9.0.2.tgz",
@ -2539,42 +2486,6 @@
"multiaddr": "^9.0.1"
}
},
"node_modules/@fluencelabs/aqua/node_modules/multiformats": {
"version": "9.6.5",
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.6.5.tgz",
"integrity": "sha512-vMwf/FUO+qAPvl3vlSZEgEVFY/AxeZq5yg761ScF3CZsXgmTi/HGkicUiNN0CI4PW8FiY2P0OLklOcmQjdQJhw=="
},
"node_modules/@fluencelabs/aqua/node_modules/node-forge": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
"integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
"engines": {
"node": ">= 6.13.0"
}
},
"node_modules/@fluencelabs/aqua/node_modules/peer-id": {
"version": "0.16.0",
"resolved": "https://registry.npmjs.org/peer-id/-/peer-id-0.16.0.tgz",
"integrity": "sha512-EmL7FurFUduU9m1PS9cfJ5TAuCvxKQ7DKpfx3Yj6IKWyBRtosriFuOag/l3ni/dtPgPLwiA4R9IvpL7hsDLJuQ==",
"dependencies": {
"class-is": "^1.1.0",
"libp2p-crypto": "^0.21.0",
"multiformats": "^9.4.5",
"protobufjs": "^6.10.2",
"uint8arrays": "^3.0.0"
},
"engines": {
"node": ">=15.0.0"
}
},
"node_modules/@fluencelabs/aqua/node_modules/peer-id/node_modules/uint8arrays": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz",
"integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==",
"dependencies": {
"multiformats": "^9.4.2"
}
},
"node_modules/@fluencelabs/aqua/node_modules/retimer": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/retimer/-/retimer-2.0.0.tgz",
@ -2595,9 +2506,9 @@
"integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg=="
},
"node_modules/@fluencelabs/avm": {
"version": "0.31.10",
"resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.31.10.tgz",
"integrity": "sha512-tkpjdHyRmsTwAEZCJt15//jXEgC2Nw2qFiD1NenvK127SlgKeuzQU9IMReUYY3dowb2IGeC578/uGMu96jHYKw=="
"version": "0.35.3",
"resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.35.3.tgz",
"integrity": "sha512-Y5mPPCmAUUKc5CDO12IL8mGEreWa7maVdX0MWCAH4+GvfLPFN1FxOMSKRYEtvkyVEL88pc9pd8cm5IRCBkFthg=="
},
"node_modules/@fluencelabs/connection": {
"version": "0.2.0",
@ -2673,11 +2584,11 @@
}
},
"node_modules/@fluencelabs/fluence": {
"version": "0.27.5",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.27.5.tgz",
"integrity": "sha512-nMCzd/oHHk5/yWdg/+rPB+sc8X+fQ5YgwPhGVDoxFs8/CmIr1G5Na8Y6l8rrigasgQd+LV5GtAyh50Oq7/IXkg==",
"version": "0.28.0",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.28.0.tgz",
"integrity": "sha512-SXb2vjTj8m/nw4jEILV0tu9VIFprGo8mNb2nOB5btxdsOI8GzQZkpGzTLrSd/+UagIo2GdxAu0GhBP8dxZXaqg==",
"dependencies": {
"@fluencelabs/avm": "0.31.10",
"@fluencelabs/avm": "0.35.3",
"@fluencelabs/connection": "0.2.0",
"@fluencelabs/interfaces": "0.1.0",
"@fluencelabs/keypair": "0.2.0",
@ -2709,11 +2620,6 @@
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence-network-environment/-/fluence-network-environment-1.0.13.tgz",
"integrity": "sha512-2pci3T0sUHE08jwEs1r/vHKVT4XUh/A3j/QJ0eIhddsxyIjEksjdn05X7DF6STD14CF8GgBVOJEPgav8qaUMpA=="
},
"node_modules/@fluencelabs/fluence/node_modules/async": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
"integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
},
"node_modules/@fluencelabs/fluence/node_modules/libp2p-crypto": {
"version": "0.21.2",
"resolved": "https://registry.npmjs.org/libp2p-crypto/-/libp2p-crypto-0.21.2.tgz",
@ -2744,11 +2650,6 @@
"url": "https://tidelift.com/funding/github/npm/loglevel"
}
},
"node_modules/@fluencelabs/fluence/node_modules/multiformats": {
"version": "9.9.0",
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz",
"integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg=="
},
"node_modules/@fluencelabs/fluence/node_modules/node-forge": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
@ -5671,9 +5572,9 @@
"integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag=="
},
"node_modules/async": {
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz",
"integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g=="
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
"integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
},
"node_modules/async-foreach": {
"version": "0.1.3",
@ -12003,11 +11904,6 @@
"node": ">=10"
}
},
"node_modules/jake/node_modules/async": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
"integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
},
"node_modules/jake/node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@ -14617,9 +14513,9 @@
"integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg=="
},
"node_modules/multiformats": {
"version": "9.7.0",
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.7.0.tgz",
"integrity": "sha512-uv/tcgwk0yN4DStopnBN4GTgvaAlYdy6KnZpuzEPFOYQd71DYFJjs0MN1ERElAflrZaYyGBWXyGxL5GgrxIx0Q=="
"version": "9.9.0",
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz",
"integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg=="
},
"node_modules/multihashes": {
"version": "4.0.3",
@ -21924,15 +21820,15 @@
"version": "0.1.0",
"license": "MIT",
"dependencies": {
"@fluencelabs/fluence": "^0.27.0",
"@fluencelabs/fluence-network-environment": "1.0.13",
"@fluencelabs/fluence": "^0.28.0",
"@fluencelabs/fluence-network-environment": "1.0.14",
"@fluencelabs/ipfs-execution-aqua": "file:../aqua",
"it-all": "^1.0.5",
"multiaddr": "^10.0.0",
"uint8arrays": "^2.1.5"
},
"devDependencies": {
"@fluencelabs/aqua": "0.8.0-368",
"@fluencelabs/aqua": "0.10.3",
"@fluencelabs/aqua-lib": "0.6.0",
"@types/jest": "^27.0.3",
"jest": "^27.4.0",
@ -21947,13 +21843,18 @@
"integrity": "sha512-ifjtCM93KO3LhzPkMxqmXhwLmrg/scjOiyTihEVg7ns5N+BVzaK1eWzdOdqGdl9ZVoah43pdlQUepEo7VdRmsw==",
"dev": true
},
"nodejs/node_modules/@fluencelabs/fluence-network-environment": {
"version": "1.0.14",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence-network-environment/-/fluence-network-environment-1.0.14.tgz",
"integrity": "sha512-lMiH+7obmJW2Q+PMUR/vNAuX6TcVqlKmsWAHvnBogH7s8IeMT+UGN8qrweILWmE57G7MfauB302dIFQowR9tug=="
},
"web": {
"name": "ipfs-aqua-browser",
"version": "0.1.0",
"hasInstallScript": true,
"dependencies": {
"@fluencelabs/fluence": "0.27.5",
"@fluencelabs/fluence-network-environment": "1.0.13",
"@fluencelabs/fluence": "0.28.0",
"@fluencelabs/fluence-network-environment": "1.0.14",
"@fluencelabs/ipfs-execution-aqua": "file:../aqua",
"@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^11.2.7",
@ -21980,6 +21881,11 @@
"ts-jest": "^27.1.3"
}
},
"web/node_modules/@fluencelabs/fluence-network-environment": {
"version": "1.0.14",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence-network-environment/-/fluence-network-environment-1.0.14.tgz",
"integrity": "sha512-lMiH+7obmJW2Q+PMUR/vNAuX6TcVqlKmsWAHvnBogH7s8IeMT+UGN8qrweILWmE57G7MfauB302dIFQowR9tug=="
},
"web/node_modules/@types/node": {
"version": "12.20.55",
"resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz",
@ -23471,13 +23377,13 @@
}
},
"@fluencelabs/aqua": {
"version": "0.8.0-368",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.8.0-368.tgz",
"integrity": "sha512-vnqgjwJWa2XvNqGUCITvkhIiF7ps9WhZL4GfvtuSwVAsdpDaYGtxPH63wcYcG9TwRCr7nGgjOhJGXhkmGhUE2w==",
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.10.3.tgz",
"integrity": "sha512-v7Jy+KzZkUm7NuUgrp7UQ8gxuhykxuTU3JigCdxiZMcG3/zD+OtHzsSggVLxVjDP7CKuTcjEKZSCxObwHp/Tpw==",
"requires": {
"@fluencelabs/aqua-ipfs": "0.5.8",
"@fluencelabs/aqua-ipfs": "0.5.9",
"@fluencelabs/aqua-lib": "0.6.0",
"@fluencelabs/fluence": "0.27.4",
"@fluencelabs/fluence": "0.28.0",
"@fluencelabs/fluence-network-environment": "1.0.13",
"ipfs-http-client": "50.1.2"
},
@ -23487,31 +23393,6 @@
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-lib/-/aqua-lib-0.6.0.tgz",
"integrity": "sha512-ifjtCM93KO3LhzPkMxqmXhwLmrg/scjOiyTihEVg7ns5N+BVzaK1eWzdOdqGdl9ZVoah43pdlQUepEo7VdRmsw=="
},
"@fluencelabs/fluence": {
"version": "0.27.4",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.27.4.tgz",
"integrity": "sha512-f85q8ZdmPlUd6uIgmS0CDTvSsb+TGvTqOljw0b161lfEuqPIXrjxJSt0/2Lyh2eEZ1P3slOka1tbVw01nVrt5w==",
"requires": {
"@fluencelabs/avm": "0.31.10",
"@fluencelabs/connection": "0.2.0",
"@fluencelabs/interfaces": "0.1.0",
"@fluencelabs/keypair": "0.2.0",
"@fluencelabs/marine-js": "0.3.37",
"async": "3.2.3",
"base64-js": "^1.5.1",
"browser-or-node": "2.0.0",
"bs58": "5.0.0",
"buffer": "^6.0.3",
"cids": "1.1.9",
"loglevel": "1.8.0",
"multiformats": "9.6.5",
"peer-id": "0.16.0",
"platform": "^1.3.6",
"rxjs": "^7.5.5",
"ts-pattern": "3.3.3",
"uuid": "8.3.2"
}
},
"any-signal": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/any-signal/-/any-signal-2.1.2.tgz",
@ -23653,31 +23534,6 @@
"minimatch": "^3.0.4"
}
},
"libp2p-crypto": {
"version": "0.21.2",
"resolved": "https://registry.npmjs.org/libp2p-crypto/-/libp2p-crypto-0.21.2.tgz",
"integrity": "sha512-EXFrhSpiHtJ+/L8xXDvQNK5VjUMG51u878jzZcaT5XhuN/zFg6PWJFnl/qB2Y2j7eMWnvCRP7Kp+ua2H36cG4g==",
"requires": {
"@noble/ed25519": "^1.5.1",
"@noble/secp256k1": "^1.3.0",
"err-code": "^3.0.1",
"iso-random-stream": "^2.0.0",
"multiformats": "^9.4.5",
"node-forge": "^1.2.1",
"protobufjs": "^6.11.2",
"uint8arrays": "^3.0.0"
},
"dependencies": {
"uint8arrays": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz",
"integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==",
"requires": {
"multiformats": "^9.4.2"
}
}
}
},
"multiaddr": {
"version": "9.0.2",
"resolved": "https://registry.npmjs.org/multiaddr/-/multiaddr-9.0.2.tgz",
@ -23700,38 +23556,6 @@
"multiaddr": "^9.0.1"
}
},
"multiformats": {
"version": "9.6.5",
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.6.5.tgz",
"integrity": "sha512-vMwf/FUO+qAPvl3vlSZEgEVFY/AxeZq5yg761ScF3CZsXgmTi/HGkicUiNN0CI4PW8FiY2P0OLklOcmQjdQJhw=="
},
"node-forge": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
"integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA=="
},
"peer-id": {
"version": "0.16.0",
"resolved": "https://registry.npmjs.org/peer-id/-/peer-id-0.16.0.tgz",
"integrity": "sha512-EmL7FurFUduU9m1PS9cfJ5TAuCvxKQ7DKpfx3Yj6IKWyBRtosriFuOag/l3ni/dtPgPLwiA4R9IvpL7hsDLJuQ==",
"requires": {
"class-is": "^1.1.0",
"libp2p-crypto": "^0.21.0",
"multiformats": "^9.4.5",
"protobufjs": "^6.10.2",
"uint8arrays": "^3.0.0"
},
"dependencies": {
"uint8arrays": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz",
"integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==",
"requires": {
"multiformats": "^9.4.2"
}
}
}
},
"retimer": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/retimer/-/retimer-2.0.0.tgz",
@ -23754,9 +23578,9 @@
}
},
"@fluencelabs/aqua-ipfs": {
"version": "0.5.8",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-ipfs/-/aqua-ipfs-0.5.8.tgz",
"integrity": "sha512-jKlyGBm8oJAIQ3Ags58oJ8QVTlCYSvZQVTnX2SnugGXWVwt4+9qtqtvNT5MvWKK3M9lCFDbJJy/qVTjzPJlaiw==",
"version": "0.5.9",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-ipfs/-/aqua-ipfs-0.5.9.tgz",
"integrity": "sha512-Vg7pYv4gEreOKfvzKEL5FchGqSKwat7JyKpqJO6h+FC5S1bl76UkI507+ExhijmUbQGznop8G33XFxyUi6q5SQ==",
"requires": {
"@fluencelabs/aqua-lib": "^0.5.2"
}
@ -23767,9 +23591,9 @@
"integrity": "sha512-fmoFFE8myhLH9d+YR0+0ZPL2YIQyR6M1woAGu5d1xXI02Sjzn4id6dE4PpxHb8cSBPRie8AwsKobHCNqGxI8oA=="
},
"@fluencelabs/avm": {
"version": "0.31.10",
"resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.31.10.tgz",
"integrity": "sha512-tkpjdHyRmsTwAEZCJt15//jXEgC2Nw2qFiD1NenvK127SlgKeuzQU9IMReUYY3dowb2IGeC578/uGMu96jHYKw=="
"version": "0.35.3",
"resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.35.3.tgz",
"integrity": "sha512-Y5mPPCmAUUKc5CDO12IL8mGEreWa7maVdX0MWCAH4+GvfLPFN1FxOMSKRYEtvkyVEL88pc9pd8cm5IRCBkFthg=="
},
"@fluencelabs/connection": {
"version": "0.2.0",
@ -23834,11 +23658,11 @@
}
},
"@fluencelabs/fluence": {
"version": "0.27.5",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.27.5.tgz",
"integrity": "sha512-nMCzd/oHHk5/yWdg/+rPB+sc8X+fQ5YgwPhGVDoxFs8/CmIr1G5Na8Y6l8rrigasgQd+LV5GtAyh50Oq7/IXkg==",
"version": "0.28.0",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.28.0.tgz",
"integrity": "sha512-SXb2vjTj8m/nw4jEILV0tu9VIFprGo8mNb2nOB5btxdsOI8GzQZkpGzTLrSd/+UagIo2GdxAu0GhBP8dxZXaqg==",
"requires": {
"@fluencelabs/avm": "0.31.10",
"@fluencelabs/avm": "0.35.3",
"@fluencelabs/connection": "0.2.0",
"@fluencelabs/interfaces": "0.1.0",
"@fluencelabs/keypair": "0.2.0",
@ -23858,11 +23682,6 @@
"uuid": "8.3.2"
},
"dependencies": {
"async": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
"integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
},
"libp2p-crypto": {
"version": "0.21.2",
"resolved": "https://registry.npmjs.org/libp2p-crypto/-/libp2p-crypto-0.21.2.tgz",
@ -23883,11 +23702,6 @@
"resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz",
"integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg=="
},
"multiformats": {
"version": "9.9.0",
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz",
"integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg=="
},
"node-forge": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
@ -23928,10 +23742,10 @@
"@fluencelabs/ipfs-execution": {
"version": "file:nodejs",
"requires": {
"@fluencelabs/aqua": "0.8.0-368",
"@fluencelabs/aqua": "0.10.3",
"@fluencelabs/aqua-lib": "0.6.0",
"@fluencelabs/fluence": "^0.27.0",
"@fluencelabs/fluence-network-environment": "1.0.13",
"@fluencelabs/fluence": "^0.28.0",
"@fluencelabs/fluence-network-environment": "1.0.14",
"@fluencelabs/ipfs-execution-aqua": "file:../aqua",
"@types/jest": "^27.0.3",
"it-all": "^1.0.5",
@ -23948,17 +23762,22 @@
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-lib/-/aqua-lib-0.6.0.tgz",
"integrity": "sha512-ifjtCM93KO3LhzPkMxqmXhwLmrg/scjOiyTihEVg7ns5N+BVzaK1eWzdOdqGdl9ZVoah43pdlQUepEo7VdRmsw==",
"dev": true
},
"@fluencelabs/fluence-network-environment": {
"version": "1.0.14",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence-network-environment/-/fluence-network-environment-1.0.14.tgz",
"integrity": "sha512-lMiH+7obmJW2Q+PMUR/vNAuX6TcVqlKmsWAHvnBogH7s8IeMT+UGN8qrweILWmE57G7MfauB302dIFQowR9tug=="
}
}
},
"@fluencelabs/ipfs-execution-aqua": {
"version": "file:aqua",
"requires": {
"@fluencelabs/aqua": "0.8.0-368",
"@fluencelabs/aqua": "0.10.3",
"@fluencelabs/aqua-ipfs": "^0.5.5",
"@fluencelabs/aqua-lib": "0.6.0",
"@fluencelabs/fluence": "^0.27.0",
"@fluencelabs/fluence-network-environment": "1.0.13",
"@fluencelabs/fluence": "^0.28.0",
"@fluencelabs/fluence-network-environment": "1.0.14",
"it-all": "^1.0.5",
"multiaddr": "^10.0.0",
"typescript": "^4.6.3",
@ -23970,6 +23789,11 @@
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-lib/-/aqua-lib-0.6.0.tgz",
"integrity": "sha512-ifjtCM93KO3LhzPkMxqmXhwLmrg/scjOiyTihEVg7ns5N+BVzaK1eWzdOdqGdl9ZVoah43pdlQUepEo7VdRmsw==",
"dev": true
},
"@fluencelabs/fluence-network-environment": {
"version": "1.0.14",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence-network-environment/-/fluence-network-environment-1.0.14.tgz",
"integrity": "sha512-lMiH+7obmJW2Q+PMUR/vNAuX6TcVqlKmsWAHvnBogH7s8IeMT+UGN8qrweILWmE57G7MfauB302dIFQowR9tug=="
}
}
},
@ -26232,9 +26056,9 @@
"integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag=="
},
"async": {
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz",
"integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g=="
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
"integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
},
"async-foreach": {
"version": "0.1.3",
@ -30291,8 +30115,8 @@
"ipfs-aqua-browser": {
"version": "file:web",
"requires": {
"@fluencelabs/fluence": "0.27.5",
"@fluencelabs/fluence-network-environment": "1.0.13",
"@fluencelabs/fluence": "0.28.0",
"@fluencelabs/fluence-network-environment": "1.0.14",
"@fluencelabs/ipfs-execution-aqua": "file:../aqua",
"@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^11.2.7",
@ -30317,6 +30141,11 @@
"web-vitals": "^1.1.2"
},
"dependencies": {
"@fluencelabs/fluence-network-environment": {
"version": "1.0.14",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence-network-environment/-/fluence-network-environment-1.0.14.tgz",
"integrity": "sha512-lMiH+7obmJW2Q+PMUR/vNAuX6TcVqlKmsWAHvnBogH7s8IeMT+UGN8qrweILWmE57G7MfauB302dIFQowR9tug=="
},
"@types/node": {
"version": "12.20.55",
"resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz",
@ -31034,11 +30863,6 @@
"minimatch": "^3.0.4"
},
"dependencies": {
"async": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
"integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
},
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@ -33115,9 +32939,9 @@
}
},
"multiformats": {
"version": "9.7.0",
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.7.0.tgz",
"integrity": "sha512-uv/tcgwk0yN4DStopnBN4GTgvaAlYdy6KnZpuzEPFOYQd71DYFJjs0MN1ERElAflrZaYyGBWXyGxL5GgrxIx0Q=="
"version": "9.9.0",
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz",
"integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg=="
},
"multihashes": {
"version": "4.0.3",

View File

@ -10,8 +10,8 @@
},
"dependencies": {
"ipfs-http-client": "^56.0.3",
"@fluencelabs/aqua": "0.8.0-368",
"@fluencelabs/fluence": "0.27.5",
"@fluencelabs/aqua": "0.10.3",
"@fluencelabs/fluence": "0.28.0",
"typescript": "^4.6.3"
},
"engines": {

View File

@ -16,7 +16,7 @@ log = "0.4.14"
rand = "0.8.4"
[dev-dependencies]
marine-rs-sdk-test = "0.8.1"
marine-rs-sdk-test = "0.8.2"
[profile.release]
opt-level = "s"

View File

@ -4,8 +4,8 @@
"private": true,
"dependencies": {
"@fluencelabs/ipfs-execution-aqua": "file:../aqua",
"@fluencelabs/fluence": "0.27.5",
"@fluencelabs/fluence-network-environment": "1.0.13",
"@fluencelabs/fluence": "0.28.0",
"@fluencelabs/fluence-network-environment": "1.0.14",
"@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^11.2.7",
"@testing-library/user-event": "^12.8.3",

View File

@ -4,3 +4,13 @@ target/
Cargo.lock
**/*.bk
**/*.bak
# recommended by Fluence Labs:
.idea
.fluence
**/node_modules
**/target/
.repl_history
.vscode/settings.json
src/ts/src/aqua
src/js/src/aqua

View File

@ -0,0 +1,13 @@
[workspace]
members = [
"wasm-modules/curl-adapter",
"wasm-modules/multi-provider-query",
"wasm-modules/simple-quorum",
"wasm-modules/utilities",
"wasm-modules/eth-rpc",
"wasm-modules/ipfs-adapter",
"wasm-modules/ipfs-cli"
]
[profile.release]
opt-level = "s"

View File

@ -15,11 +15,13 @@ data EVMResult:
stdout: string
stderr: string
service MyOp("op"):
array_length(providers: []ProviderInfo) -> i64
service I64ToF64("op"):
identity(x: i64) -> f64
service MyOp2("op"):
service ProviderInfoOp("op"):
array_length(providers: []ProviderInfo) -> i64
service FuncAddrOp("op"):
array_length(providers: []FunctionAddress) -> i64
service MultiProviderQuery("service-id"):
@ -31,46 +33,6 @@ service Utilities("service_id"):
service Console("run-console"):
print(msg: string)
func get_block_heights(providers: []ProviderInfo, addrs: []FunctionAddress) -> []EVMResult:
result: *EVMResult
n <- MyOp.array_length(providers)
m <- MyOp2.array_length(addrs)
if n > 0:
for addr <- addrs par:
on addr.peer_id:
MultiProviderQuery addr.service_id
for provider <- providers:
result <- MultiProviderQuery.get_block_number(provider)
join result[n*m-1]
<- result
func get_block_height(providers: []ProviderInfo, addr: FunctionAddress) ->[]EVMResult:
result: *EVMResult
n <- MyOp.array_length(providers)
if n > 0:
on addr.peer_id:
MultiProviderQuery addr.service_id
for provider <- providers:
result <- MultiProviderQuery.get_block_number(provider)
join result[n]
<- result
func provider_test(providers: []ProviderInfo) -> []string:
result: *string
n <- MyOp.array_length(providers)
if n > 0:
for provider <- providers:
result <<- provider.name
join result[n-1]
<- result
alias QuorumService: FunctionAddress
data Quorum:
@ -83,13 +45,53 @@ service SimpleQuorum("service-id"):
point_estimate(data: []EVMResult, min_points: u32) -> Quorum
is_quorum(x:u64, y:u64, threshold:f64) -> bool
func get_block_heights(providers: []ProviderInfo, addrs: []FunctionAddress) -> []EVMResult:
result: *EVMResult
n <- ProviderInfoOp.array_length(providers)
m <- FuncAddrOp.array_length(addrs)
if n > 0:
for addr <- addrs par:
on addr.peer_id:
MultiProviderQuery addr.service_id
for provider <- providers:
result <- MultiProviderQuery.get_block_number(provider)
join result[n*m-1]
<- result
func get_block_height(providers: []ProviderInfo, addr: FunctionAddress) ->[]EVMResult:
result: *EVMResult
n <- ProviderInfoOp.array_length(providers)
if n > 0:
on addr.peer_id:
MultiProviderQuery addr.service_id
for provider <- providers:
result <- MultiProviderQuery.get_block_number(provider)
join result[n]
<- result
func provider_test(providers: []ProviderInfo) -> []string:
result: *string
n <- ProviderInfoOp.array_length(providers)
if n > 0:
for provider <- providers:
result <<- provider.name
join result[n-1]
<- result
func get_block_height_raw_quorum(providers: []ProviderInfo, addrs: []FunctionAddress, q_addr: QuorumService) -> Quorum:
result: *EVMResult
result2: *string
quorum: *Quorum
n <- MyOp.array_length(providers)
n2 <- MyOp2.array_length(addrs)
n <- ProviderInfoOp.array_length(providers)
n2 <- FuncAddrOp.array_length(addrs)
if n > 0:
for addr <- addrs par:
@ -123,8 +125,8 @@ func get_block_height_quorum(providers: []ProviderInfo, addrs: []FunctionAddress
is_quorum: *bool
min_points = 3 -- minimum points we want in order to calculate an oracle
n <- MyOp.array_length(providers)
n2 <- MyOp2.array_length(addrs)
n <- ProviderInfoOp.array_length(providers)
n2 <- FuncAddrOp.array_length(addrs)
if n > 0:
for addr <- addrs par:
@ -148,8 +150,8 @@ func get_block_height_quorum_with_mapper(providers: []ProviderInfo, addrs: []Fun
min_points = 3 -- minimum points we want in order to calculate an oracle
n <- MyOp.array_length(providers)
n2 <- MyOp2.array_length(addrs)
n <- ProviderInfoOp.array_length(providers)
n2 <- FuncAddrOp.array_length(addrs)
if n > 0:
for addr <- addrs par:
@ -206,8 +208,8 @@ func get_block_height_quorum_with_cid(providers: []ProviderInfo, services_cid: I
q_addrs <- IpfsCli.params_from_cid(quorum_cid.multiaddr, quorum_cid.cid)
u_addrs <- IpfsCli.params_from_cid(utility_cid.multiaddr, utility_cid.cid)
n <- MyOp.array_length(providers)
m <- MyOp2.array_length(addrs)
n <- ProviderInfoOp.array_length(providers)
m <- FuncAddrOp.array_length(addrs)
if n > 0:
for addr <- addrs par:
@ -238,5 +240,3 @@ func get_block_height_quorum_with_cid(providers: []ProviderInfo, services_cid: I
co ConsoleEVMResult.print(res)
Math.add(n_dev, 1)
<- quorum[0], is_quorum[0]

View File

@ -52,5 +52,22 @@
"logger_enabled": true
}
]
},
"eth-rpc": {
"modules": [
{
"name": "curl_adapter",
"path": "./artifacts/curl_adapter.wasm",
"max_heap_size": "2 MiB",
"mounted_binaries": [["curl", "/usr/bin/curl"]],
"logger_enabled": true
},
{
"name": "eth-rpc",
"path": "./artifacts/eth-rpc.wasm",
"logger_enabled": true,
"max_heap_size": "100 MiB"
}
]
}
}

View File

@ -0,0 +1,13 @@
# yaml-language-server: $schema=../../../.fluence/schemas/service.yaml.json
# Defines a [Marine service](https://fluence.dev/docs/build/concepts/#services), most importantly the modules that the service consists of. For Fluence CLI, **service** - is a directory which contains this config. You can use `fluence service new` command to generate a template for new service
# Documentation: https://github.com/fluencelabs/fluence-cli/tree/main/docs/configs/service.md
version: 0
name: eth_rpc
modules:
facade:
get: ../../../wasm-modules/eth-rpc
curl-adapter:
get: ../../../wasm-modules/curl-adapter

View File

@ -0,0 +1,13 @@
# yaml-language-server: $schema=../../../.fluence/schemas/service.yaml.json
# Defines a [Marine service](https://fluence.dev/docs/build/concepts/#services), most importantly the modules that the service consists of. For Fluence CLI, **service** - is a directory which contains this config. You can use `fluence service new` command to generate a template for new service
# Documentation: https://github.com/fluencelabs/fluence-cli/tree/main/docs/configs/service.md
version: 0
name: ipfs_package
modules:
facade:
get: ../../../wasm-modules/ipfs-cli
ipfs-adapter:
get: ../../../wasm-modules/ipfs-adapter

View File

@ -0,0 +1,13 @@
# yaml-language-server: $schema=../../../.fluence/schemas/service.yaml.json
# Defines a [Marine service](https://fluence.dev/docs/build/concepts/#services), most importantly the modules that the service consists of. For Fluence CLI, **service** - is a directory which contains this config. You can use `fluence service new` command to generate a template for new service
# Documentation: https://github.com/fluencelabs/fluence-cli/tree/main/docs/configs/service.md
version: 0
name: multi_provider_query
modules:
facade:
get: ../../../wasm-modules/multi-provider-query
curl-adapter:
get: ../../../wasm-modules/curl-adapter

View File

@ -0,0 +1,11 @@
# yaml-language-server: $schema=../../../.fluence/schemas/service.yaml.json
# Defines a [Marine service](https://fluence.dev/docs/build/concepts/#services), most importantly the modules that the service consists of. For Fluence CLI, **service** - is a directory which contains this config. You can use `fluence service new` command to generate a template for new service
# Documentation: https://github.com/fluencelabs/fluence-cli/tree/main/docs/configs/service.md
version: 0
name: simple_quorum
modules:
facade:
get: ../../../wasm-modules/simple-quorum

View File

@ -0,0 +1,11 @@
# yaml-language-server: $schema=../../../.fluence/schemas/service.yaml.json
# Defines a [Marine service](https://fluence.dev/docs/build/concepts/#services), most importantly the modules that the service consists of. For Fluence CLI, **service** - is a directory which contains this config. You can use `fluence service new` command to generate a template for new service
# Documentation: https://github.com/fluencelabs/fluence-cli/tree/main/docs/configs/service.md
version: 0
name: utilities
modules:
facade:
get: ../../../wasm-modules/utilities

View File

@ -0,0 +1,14 @@
# yaml-language-server: $schema=.fluence/schemas/fluence-lock.yaml.json
# Defines a lock file for Fluence Project dependencies. When dependencies are installed - their exact versions are saved here.
# Documentation: https://github.com/fluencelabs/fluence-cli/tree/main/docs/configs/fluence-lock.md
version: 0
cargo:
marine: 0.12.5
mrepl: 0.18.8
npm:
"@fluencelabs/aqua": 0.9.4
"@fluencelabs/aqua-lib": 0.6.0
"@fluencelabs/spell": 0.0.1

View File

@ -0,0 +1,37 @@
# yaml-language-server: $schema=.fluence/schemas/fluence.yaml.json
# Defines Fluence Project, most importantly - what exactly you want to deploy and how. You can use `fluence init` command to generate a template for new Fluence project
# Documentation: https://github.com/fluencelabs/fluence-cli/tree/main/docs/configs/fluence.md
version: 2
aquaInputPath: src/aqua/main.aqua
dependencies:
npm:
"@fluencelabs/aqua-lib": 0.6.0
"@fluencelabs/spell": 0.0.1
"@fluencelabs/aqua": 0.9.4
cargo:
marine: 0.12.5
mrepl: 0.18.8
services:
multi_provider_query:
get: configs/services/multi-provider-query
deploy:
- deployId: default
simple_quorum:
get: configs/services/simple-quorum
deploy:
- deployId: default
utilities:
get: configs/services/utilities
deploy:
- deployId: default
eth_rpc:
get: configs/services/eth-rpc
deploy:
- deployId: default
ipfs_package:
get: configs/services/ipfs-package
deploy:
- deployId: default

View File

@ -0,0 +1,50 @@
# Aqua Ethereum Gateway
Gateway represents access to different Ethereum API providers (infura, alchemy). It can be used with Web3 client and load balancing requests between different providers.
## Installation
```shell
npm install -g @fluencelabs/aqua-eth-gateway
```
## Example
```shell
aqua-eth-gateway path/to/config.json
```
where config is:
```json
{
"providers": [
"https://goerli.infura.io/v3/your-api-key",
"https://eth-goerli.g.alchemy.com/v2/your-api-key"
],
"mode": "random",
"relay": "fluence/peer/address",
"serviceId": "eth-rpc serviceId",
"port": 3000,
"counterServiceId": null,
"counterPeerId": null,
"quorumServiceId": null,
"quorumPeerId": null,
"quorumNumber": null,
"quorumTimeout": null,
"requestTimeout": null
}
```
`counterServiceId` and `counterPeerId` is credentials to counter service for `round-robin` mode. Will be used local counter if undefined.
`quorumServiceId` and `quorumPeerId` is credentials to counter service for `round-robin` mode. Will be used local counter if undefined.
`quorumNumber` is `2` by default.
`quorumTimeout` is how long we will wait for all responses
`requestTimeout` is how long we will wait for aqua request
## Mode
`random` - choose providers randomly
`round-robin` - choose providers in circle order
`quorum` - call all providers and choose the result that is the same from `>= quorumNumber` providers. Or return an error.

View File

@ -0,0 +1,236 @@
/* eslint-disable */
// @ts-nocheck
/**
*
* This file is auto-generated. Do not edit manually: changes may be erased.
* Generated by Aqua compiler: https://github.com/fluencelabs/aqua/.
* If you find any bugs, please write an issue on GitHub: https://github.com/fluencelabs/aqua/issues
* Aqua version: 0.10.1
*
*/
import {
v5_callFunction as callFunction$$,
v5_registerService as registerService$$,
} from '@fluencelabs/js-client.api';
// Services
export interface NumOpDef {
identity: (n: number, callParams: CallParams$$<'n'>) => number | Promise<number>;
}
export function registerNumOp(service: NumOpDef): void;
export function registerNumOp(serviceId: string, service: NumOpDef): void;
export function registerNumOp(peer: IFluenceClient$$, service: NumOpDef): void;
export function registerNumOp(peer: IFluenceClient$$, serviceId: string, service: NumOpDef): void;
export interface LoggerDef {
log: (s: string[], callParams: CallParams$$<'s'>) => void | Promise<void>;
logCall: (s: string, callParams: CallParams$$<'s'>) => void | Promise<void>;
}
export function registerLogger(service: LoggerDef): void;
export function registerLogger(serviceId: string, service: LoggerDef): void;
export function registerLogger(peer: IFluenceClient$$, service: LoggerDef): void;
export function registerLogger(peer: IFluenceClient$$, serviceId: string, service: LoggerDef): void;
export interface QuorumCheckerDef {
check: (results: { error: string; success: boolean; value: string; }[], minResults: number, callParams: CallParams$$<'results' | 'minResults'>) => { error: string; results: { error: string; success: boolean; value: string; }[]; value: string; } | Promise<{ error: string; results: { error: string; success: boolean; value: string; }[]; value: string; }>;
}
export function registerQuorumChecker(service: QuorumCheckerDef): void;
export function registerQuorumChecker(serviceId: string, service: QuorumCheckerDef): void;
export function registerQuorumChecker(peer: IFluenceClient$$, service: QuorumCheckerDef): void;
export function registerQuorumChecker(peer: IFluenceClient$$, serviceId: string, service: QuorumCheckerDef): void;
export interface EthCallerDef {
eth_call: (uri: string, method: string, jsonArgs: string[], callParams: CallParams$$<'uri' | 'method' | 'jsonArgs'>) => { error: string; success: boolean; value: string; } | Promise<{ error: string; success: boolean; value: string; }>;
}
export function registerEthCaller(serviceId: string, service: EthCallerDef): void;
export function registerEthCaller(peer: IFluenceClient$$, serviceId: string, service: EthCallerDef): void;
export interface CounterDef {
incrementAndReturn: (callParams: CallParams$$<null>) => number | Promise<number>;
}
export function registerCounter(service: CounterDef): void;
export function registerCounter(serviceId: string, service: CounterDef): void;
export function registerCounter(peer: IFluenceClient$$, service: CounterDef): void;
export function registerCounter(peer: IFluenceClient$$, serviceId: string, service: CounterDef): void;
// Functions
export type RoundRobinEthResult = { error: string; success: boolean; value: string; }
export function roundRobinEth(
uris: string[],
method: string,
jsonArgs: string[],
serviceId: string,
counterServiceId: string,
counterPeerId: string,
config?: {ttl?: number}
): Promise<RoundRobinEthResult>;
export function roundRobinEth(
peer: IFluenceClient$$,
uris: string[],
method: string,
jsonArgs: string[],
serviceId: string,
counterServiceId: string,
counterPeerId: string,
config?: {ttl?: number}
): Promise<RoundRobinEthResult>;
export type EmptyResult = { error: string; success: boolean; value: string; }
export function empty(
config?: {ttl?: number}
): Promise<EmptyResult>;
export function empty(
peer: IFluenceClient$$,
config?: {ttl?: number}
): Promise<EmptyResult>;
export type QuorumEthResult = { error: string; results: { error: string; success: boolean; value: string; }[]; value: string; }
export function quorumEth(
uris: string[],
quorumNumber: number,
timeout: number,
method: string,
jsonArgs: string[],
serviceId: string,
quorumServiceId: string,
quorumPeerId: string,
config?: {ttl?: number}
): Promise<QuorumEthResult>;
export function quorumEth(
peer: IFluenceClient$$,
uris: string[],
quorumNumber: number,
timeout: number,
method: string,
jsonArgs: string[],
serviceId: string,
quorumServiceId: string,
quorumPeerId: string,
config?: {ttl?: number}
): Promise<QuorumEthResult>;
export type RandomLoadBalancingResult = { error: string; success: boolean; value: string; }
export function randomLoadBalancing(
uris: string[],
method: string,
jsonArgs: string[],
serviceId: string,
callFunc: (arg0: string, arg1: string, arg2: string[], arg3: string, callParams: CallParams$$<'arg0' | 'arg1' | 'arg2' | 'arg3'>) => { error: string; success: boolean; value: string; } | Promise<{ error: string; success: boolean; value: string; }>,
config?: {ttl?: number}
): Promise<RandomLoadBalancingResult>;
export function randomLoadBalancing(
peer: IFluenceClient$$,
uris: string[],
method: string,
jsonArgs: string[],
serviceId: string,
callFunc: (arg0: string, arg1: string, arg2: string[], arg3: string, callParams: CallParams$$<'arg0' | 'arg1' | 'arg2' | 'arg3'>) => { error: string; success: boolean; value: string; } | Promise<{ error: string; success: boolean; value: string; }>,
config?: {ttl?: number}
): Promise<RandomLoadBalancingResult>;
export type RandomLoadBalancingEthResult = { error: string; success: boolean; value: string; }
export function randomLoadBalancingEth(
uris: string[],
method: string,
jsonArgs: string[],
serviceId: string,
config?: {ttl?: number}
): Promise<RandomLoadBalancingEthResult>;
export function randomLoadBalancingEth(
peer: IFluenceClient$$,
uris: string[],
method: string,
jsonArgs: string[],
serviceId: string,
config?: {ttl?: number}
): Promise<RandomLoadBalancingEthResult>;
export type QuorumResult = { error: string; results: { error: string; success: boolean; value: string; }[]; value: string; }
export function quorum(
uris: string[],
quorumNumber: number,
timeout: number,
method: string,
jsonArgs: string[],
serviceId: string,
quorumServiceId: string,
quorumPeerId: string,
callFunc: (arg0: string, arg1: string, arg2: string[], arg3: string, callParams: CallParams$$<'arg0' | 'arg1' | 'arg2' | 'arg3'>) => { error: string; success: boolean; value: string; } | Promise<{ error: string; success: boolean; value: string; }>,
config?: {ttl?: number}
): Promise<QuorumResult>;
export function quorum(
peer: IFluenceClient$$,
uris: string[],
quorumNumber: number,
timeout: number,
method: string,
jsonArgs: string[],
serviceId: string,
quorumServiceId: string,
quorumPeerId: string,
callFunc: (arg0: string, arg1: string, arg2: string[], arg3: string, callParams: CallParams$$<'arg0' | 'arg1' | 'arg2' | 'arg3'>) => { error: string; success: boolean; value: string; } | Promise<{ error: string; success: boolean; value: string; }>,
config?: {ttl?: number}
): Promise<QuorumResult>;
export type RoundRobinResult = { error: string; success: boolean; value: string; }
export function roundRobin(
uris: string[],
method: string,
jsonArgs: string[],
serviceId: string,
counterServiceId: string,
counterPeerId: string,
callFunc: (arg0: string, arg1: string, arg2: string[], arg3: string, callParams: CallParams$$<'arg0' | 'arg1' | 'arg2' | 'arg3'>) => { error: string; success: boolean; value: string; } | Promise<{ error: string; success: boolean; value: string; }>,
config?: {ttl?: number}
): Promise<RoundRobinResult>;
export function roundRobin(
peer: IFluenceClient$$,
uris: string[],
method: string,
jsonArgs: string[],
serviceId: string,
counterServiceId: string,
counterPeerId: string,
callFunc: (arg0: string, arg1: string, arg2: string[], arg3: string, callParams: CallParams$$<'arg0' | 'arg1' | 'arg2' | 'arg3'>) => { error: string; success: boolean; value: string; } | Promise<{ error: string; success: boolean; value: string; }>,
config?: {ttl?: number}
): Promise<RoundRobinResult>;
export type CallResult = { error: string; success: boolean; value: string; }
export function call(
uri: string,
method: string,
jsonArgs: string[],
serviceId: string,
config?: {ttl?: number}
): Promise<CallResult>;
export function call(
peer: IFluenceClient$$,
uri: string,
method: string,
jsonArgs: string[],
serviceId: string,
config?: {ttl?: number}
): Promise<CallResult>;
/* eslint-enable */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,76 @@
import "@fluencelabs/aqua-lib/builtin.aqua"
export randomLoadBalancingEth, roundRobinEth, Counter, Logger
data EthResult:
value: string
success: bool
error: string
data QuorumResult:
value: string
results: []EthResult
error: string
service Logger("logger"):
log(s: []string)
logCall(s: string)
service NumOp("op"):
identity(n: u64) -> i64
service Counter("counter"):
incrementAndReturn() -> u32
service QuorumChecker("quorum"):
check(results: []EthResult, minResults: u32) -> QuorumResult
func empty() -> EthResult:
<- EthResult(value = "", success = true, error = "")
service EthCaller:
eth_call(uri: string, method: string, jsonArgs: []string) -> EthResult
func call(uri: string, method: string, jsonArgs: []string, serviceId: string) -> EthResult:
EthCaller serviceId
on HOST_PEER_ID:
res <- EthCaller.eth_call(uri, method, jsonArgs)
<- res
func randomLoadBalancing(uris: []string, method: string, jsonArgs: []string, serviceId: string, callFunc: string, string, []string, string -> EthResult) -> EthResult:
on INIT_PEER_ID:
time <- NumOp.identity(Peer.timestamp_sec())
providerNumber = time % Op.array_length(uris)
Logger.logCall(uris[providerNumber])
<- callFunc(uris[providerNumber], method, jsonArgs, serviceId)
func randomLoadBalancingEth(uris: []string, method: string, jsonArgs: []string, serviceId: string) -> EthResult:
<- randomLoadBalancing(uris, method, jsonArgs, serviceId, call)
func roundRobin(uris: []string, method: string, jsonArgs: []string, serviceId: string, counterServiceId: string, counterPeerId: string, callFunc: string, string, []string, string -> EthResult) -> EthResult:
on counterPeerId:
Counter counterServiceId
requestNumber <- Counter.incrementAndReturn()
on INIT_PEER_ID:
providerNumber = requestNumber % uris.length
Logger.logCall(uris[providerNumber])
<- callFunc(uris[providerNumber], method, jsonArgs, serviceId)
func roundRobinEth(uris: []string, method: string, jsonArgs: []string, serviceId: string, counterServiceId: string, counterPeerId: string) -> EthResult:
<- roundRobin(uris, method, jsonArgs, serviceId, counterServiceId, counterPeerId, call)
func quorum(uris: []string, quorumNumber: u32, timeout: u32, method: string, jsonArgs: []string, serviceId: string, quorumServiceId: string, quorumPeerId: string,
callFunc: string, string, []string, string -> EthResult) -> QuorumResult:
results: *EthResult
on INIT_PEER_ID:
for uri <- uris par:
results <- callFunc(uri, method, jsonArgs, serviceId)
join results[uris.length - 1]
par Peer.timeout(timeout, "")
on quorumPeerId:
Counter quorumServiceId
quorumResult <- QuorumChecker.check(results, quorumNumber)
<- quorumResult
func quorumEth(uris: []string, quorumNumber: u32, timeout: u32, method: string, jsonArgs: []string, serviceId: string, quorumServiceId: string, quorumPeerId: string) -> QuorumResult:
<- quorum(uris, quorumNumber, timeout, method, jsonArgs, serviceId, quorumServiceId, quorumPeerId, call)

View File

@ -0,0 +1,18 @@
{
"providers": [
"https://goerli.infura.io/v3/77214656b25f4cad9cd2540c6d40c301",
"https://goerli.infura.io/v3/c48f3b538f154204ad53d04aa8990544"
],
"mode": "quorum",
"relay": "/dns4/kras-02.fluence.dev/tcp/19001/wss/p2p/12D3KooWHLxVhUQyAuZe6AHMB29P7wkvTNMn7eDMcsqimJYLKREf",
"serviceId": "25bf2293-7503-4a01-af00-d1b7d089ca37",
"port": 3000,
"counterServiceId": null,
"counterPeerId": null,
"quorumServiceId": null,
"quorumPeerId": null,
"quorumNumber": 2,
"quorumTimeout": null,
"requestTimeout": null
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,30 @@
{
"name": "@fluencelabs/aqua-eth-gateway",
"version": "0.0.15",
"description": "",
"main": "src/index.js",
"type": "module",
"scripts": {
"run:example": "node src/index.js \"config.json\"",
"run": "node src/index.js",
"req": "node web3run.js"
},
"bin": {
"aqua-eth-gateway": "src/index.js"
},
"files": [
"src/*",
"aqua/*",
"aqua-compiled/*"
],
"author": "Fluence Labs",
"license": "Apache-2.0",
"dependencies": {
"json-rpc-2.0": "1.4.2",
"web3": "1.8.2",
"@fluencelabs/js-client.node": "0.6.5",
"@fluencelabs/js-client.api": "0.11.3"
},
"devDependencies": {
}
}

View File

@ -0,0 +1,16 @@
import {configHelp} from "./config.js";
export function readArguments(args) {
const configPath = args[0]
let errors = []
if (!configPath) {
errors.push("Specify config with uri to ethereum RPC providers")
}
return {
configPath, errors,
help: "Example: aqua-eth-gateway <config-path>\n" + configHelp
}
}

View File

@ -0,0 +1,28 @@
import fs from 'fs';
export const configHelp = "Config structure: { port, relay, serviceId, providers, mode, counterServiceId?, counterPeerId?}\n" +
"Where 'mode' can be: 'random' (default), 'round-robin' or 'quorum',\n" +
"'counterServiceId' and 'counterPeerId' will use local service if undefined.\n"
"'quorumServiceId' and 'quorumPeerId' will use local service if undefined.\n"
export function readConfig(path) {
const rawdata = fs.readFileSync(path);
const config = JSON.parse(rawdata);
let errors = []
if (!config.port) {
errors.push("Specify port ('port') in config")
}
if (!config.relay) {
errors.push("Specify Fluence peer address ('relay') in config")
}
if (!config.serviceId) {
errors.push("Specify id to ethereum Aqua service ('serviceId') in config")
}
return {
config, errors,
help: configHelp
}
}

View File

@ -0,0 +1,163 @@
#!/usr/bin/env node
"use strict";
import express from "express";
import bodyParser from "body-parser";
import {JSONRPCServer} from "json-rpc-2.0";
import {Fluence} from '@fluencelabs/js-client.api';
import "@fluencelabs/js-client.node"
import {
quorumEth,
randomLoadBalancingEth,
registerCounter,
registerLogger,
registerQuorumChecker,
roundRobinEth
} from "../aqua-compiled/rpc.js";
import {readArguments} from "./arguments.js";
import {readConfig} from "./config.js";
import {methods} from "./methods.js";
const args = readArguments(process.argv.slice(2));
if (args.errors.length > 0) {
console.log(args.help);
args.errors.forEach((err) => console.log(err));
process.exit(1);
}
const {config, errors, help} = readConfig(args.configPath);
if (errors.length > 0) {
errors.forEach((err) => console.log(err));
console.log(help);
process.exit(1);
}
console.log("Running server...");
const route = "/";
const server = new JSONRPCServer();
// initialize fluence client
await Fluence.connect(config.relay);
const peerId = (await Fluence.getClient()).getPeerId()
// handler for logger
registerLogger({
log: s => {
console.log("log: " + s);
},
logCall: s => {
console.log("Call will be to : " + s);
},
})
let counter = 0;
registerCounter("counter", {
incrementAndReturn: () => {
counter++;
console.log("Counter: " + counter)
return counter;
}
})
function findSameResults(results, minNum) {
const resultCounts = results.filter((obj) => obj.success).map((obj) => obj.value).reduce(function(i, v) {
if (i[v] === undefined) {
i[v] = 1
} else {
i[v] = i[v] + 1;
}
return i;
}, {});
const getMaxRepeated = Math.max(...Object.values(resultCounts));
if (getMaxRepeated >= minNum) {
console.log(resultCounts)
const max = Object.entries(resultCounts).find((kv) => kv[1] === getMaxRepeated)
return {
value: max[0],
results: [],
error: ""
}
} else {
return {
error: "No consensus in results",
results: results,
value: ""
}
}
}
registerQuorumChecker("quorum",
{
check: (ethResults, minQuorum) => {
console.log(ethResults)
return findSameResults(ethResults, minQuorum)
}
}
)
const counterServiceId = config.counterServiceId || 'counter'
const counterPeerId = config.counterPeerId || peerId
const quorumServiceId = config.quorumServiceId || 'quorum'
const quorumPeerId = config.quorumPeerId || peerId
const quorumNumber = config.quorumNumber || 2
const quorumTimeout = config.quorumTimeout || 10000
const requestTimeoutConfig = config.requestTimeout ? {ttl: config.requestTimeout} : null
async function methodHandler(req, method) {
console.log(`Receiving request '${method}'`);
let result;
if (!config.mode || config.mode === "random") {
result = await randomLoadBalancingEth(config.providers, method, req.map((s) => JSON.stringify(s)), config.serviceId, requestTimeoutConfig);
} else if (config.mode === "round-robin") {
console.log("peerId: " + peerId)
result = await roundRobinEth(config.providers, method, req.map((s) => JSON.stringify(s)), config.serviceId, counterServiceId, counterPeerId,
config.serviceId, requestTimeoutConfig);
} else if (config.mode === "quorum") {
result = await quorumEth(config.providers, quorumNumber, quorumTimeout, method, req.map((s) => JSON.stringify(s)), config.serviceId, quorumServiceId, quorumPeerId,
config.serviceId, requestTimeoutConfig);
if (result.error) {
return {error: result.error, results: result.results}
}
console.log(result)
}
return JSON.parse(result.value);
}
function addMethod(op) {
server.addMethod(op, async (req) => methodHandler(req, op));
}
// register all eth methods
methods.forEach((m) => {
addMethod(m);
})
const app = express();
app.use(bodyParser.json());
// register JSON-RPC handler
app.post(route, (req, res) => {
const jsonRPCRequest = req.body;
server.receive(jsonRPCRequest).then((jsonRPCResponse) => {
if (jsonRPCResponse) {
res.json(jsonRPCResponse);
} else {
res.sendStatus(204);
}
});
});
app.listen(config.port);
console.log("Server was started on port " + config.port);

View File

@ -0,0 +1,58 @@
export const methods = ['eth_accounts',
'eth_blockNumber',
'eth_call',
'eth_chainId',
'eth_estimateGas',
'eth_getBalance',
'eth_getBlockByHash',
'eth_getBlockByNumber',
'eth_getBlockTransactionCountByHash',
'eth_getBlockTransactionCountByNumber',
'eth_getCode',
'eth_getLogs',
'eth_getStorageAt',
'eth_getTransactionByBlockHashAndIndex',
'eth_getTransactionByBlockNumberAndIndex',
'eth_getTransactionByHash',
'eth_getTransactionCount',
'eth_getTransactionReceipt',
'eth_sendTransaction',
'net_version',
'web3_sha3',
'eth_sendRawTransaction',
'eth_subscribe',
'eth_maxPriorityFeePerGas',
'eth_getUncleCountByBlockHash',
'eth_getUncleCountByBlockNumber',
'net_listening',
'net_peerCount',
'eth_protocolVersion',
'eth_syncing',
'eth_coinbase',
'eth_mining',
'eth_hashrate',
'eth_gasPrice',
'eth_getStorageAt',
'eth_sign',
'eth_getCompilers',
'eth_newBlockFilter',
'eth_newPendingTransactionFilter',
'eth_uninstallFilter',
'eth_getFilterChanges',
'eth_getWork',
'eth_submitWork',
'eth_submitHashrate',
'db_putString',
'db_getString',
'db_putHex',
'db_getHex',
'shh_post',
'shh_version',
'shh_newIdentity',
'shh_hasIdentity',
'shh_newGroup',
'shh_addToGroup',
'shh_newFilter',
'shh_uninstallFilter',
'shh_getFilterChanges',
'shh_getMessages']

View File

@ -0,0 +1,20 @@
import Web3 from 'web3';
const web3 = new Web3("http://localhost:3000");
async function main() {
const bn = await web3.eth.getBlockNumber()
await web3.eth.getBlockNumber()
await web3.eth.getBlockNumber()
await web3.eth.getBlockNumber()
await web3.eth.getBlockNumber()
await web3.eth.getBlockNumber()
await web3.eth.getBlockNumber()
console.log(bn)
const resp = await web3.eth.getTransaction("0x8bad403edde37642e4dab6c91eeca77b979fce1c979c14ca8755f5c3573eaeb4")
console.log(resp)
}
main();

View File

@ -8,33 +8,31 @@ rm -f artifacts/*.wasm
cd wasm-modules
cd curl-adapter
cargo update --aggressive
marine build --release
cp target/wasm32-wasi/release/curl_adapter.wasm ../../artifacts/
cd ../ipfs-adapter
cargo update --aggressive
marine build --release
cp target/wasm32-wasi/release/ipfs_adapter.wasm ../../artifacts/
cd ../multi-provider-query
cargo update --aggressive
marine build --release
cp target/wasm32-wasi/release/multi_provider_query.wasm ../../artifacts/
cd ../simple-quorum
cargo update --aggressive
marine build --release
cp target/wasm32-wasi/release/simple_quorum.wasm ../../artifacts/
cd ../ipfs-cli
cargo update --aggressive
marine build --release
cp target/wasm32-wasi/release/ipfs_cli.wasm ../../artifacts/
cd ../utilities
cargo update --aggressive
marine build --release
cp target/wasm32-wasi/release/utilities.wasm ../../artifacts/
cd ../eth-rpc
marine build --release
cp target/wasm32-wasi/release/eth_rpc.wasm ../../artifacts/
cd ..

View File

@ -0,0 +1,51 @@
mkdir -p service-packages/modules/eth_rpc
mkdir -p service-packages/modules/ipfs_adapter
mkdir -p service-packages/modules/ipfs_cli
mkdir -p service-packages/modules/multi_provider_query
mkdir -p service-packages/modules/simple_quorum
mkdir -p service-packages/modules/utilities
mkdir -p service-packages/modules/curl_adapter
sh ./scripts/build.sh
cd service-packages
# create eth-rpc service package
cp ../configs/services/eth-rpc/service.yaml .
cp ../artifacts/eth_rpc.wasm modules/eth_rpc/
cp ../wasm-modules/eth-rpc/module.yaml modules/eth_rpc/
cp ../artifacts/curl_adapter.wasm modules/curl_adapter/
cp ../wasm-modules/curl-adapter/module.yaml modules/curl_adapter
tar -czf eth_rpc.tar.gz modules/eth_rpc modules/curl_adapter service.yaml
rm service.yaml
# create ipfs-package service package
cp ../configs/services/ipfs-package/service.yaml .
cp ../artifacts/ipfs_cli.wasm modules/ipfs_cli/
cp ../wasm-modules/ipfs-cli/module.yaml modules/ipfs_cli/
cp ../artifacts/ipfs_adapter.wasm modules/ipfs_adapter/
cp ../wasm-modules/ipfs-adapter/module.yaml modules/ipfs_adapter
tar -czf ipfs_package.tar.gz modules/ipfs_cli modules/ipfs_adapter service.yaml
rm service.yaml
# create multi-provider-query service package
cp ../configs/services/multi-provider-query/service.yaml .
cp ../artifacts/multi_provider_query.wasm modules/multi_provider_query/
cp ../wasm-modules/multi-provider-query/module.yaml modules/multi_provider_query/
tar -czf multi_provider_query_package.tar.gz modules/ipfs_cli modules/curl_adapter service.yaml
rm service.yaml
# create simple-quorum service package
cp ../configs/services/simple-quorum/service.yaml .
cp ../artifacts/simple_quorum.wasm modules/simple_quorum/
cp ../wasm-modules/simple-quorum/module.yaml modules/simple_quorum/
tar -czf simple_quorum_package.tar.gz service.yaml
rm service.yaml
# create utility service package
cp ../configs/services/utilities/service.yaml .
cp ../artifacts/utilities.wasm modules/utilities/
cp ../wasm-modules/utilities/module.yaml modules/utilities/
tar -czf utilities_package.tar.gz service.yaml
rm service.yaml
rm -rf modules

View File

@ -1,5 +1,5 @@
[package]
name = "curl_adapter"
name = "curl-adapter"
version = "0.1.0"
authors = ["Fluence Labs"]
edition = "2018"
@ -7,7 +7,7 @@ publish = false
[[bin]]
path = "src/main.rs"
name = "curl_adapter"
name = "curl-adapter"
[dependencies]
marine-rs-sdk = "0.7.1"

View File

@ -0,0 +1,11 @@
# yaml-language-server: $schema=../../.fluence/schemas/module.yaml.json
# Defines [Marine Module](https://fluence.dev/docs/build/concepts/#modules). For Fluence CLI, **module** - is a directory which contains this config and either a precompiled .wasm Marine module or a source code of the module written in Rust which can be compiled into a .wasm Marine module. You can use `fluence module new` command to generate a template for new module
# Documentation: https://github.com/fluencelabs/fluence-cli/tree/main/docs/configs/module.md
version: 0
type: rust
name: curl-adapter
mountedBinaries:
curl: /usr/bin/curl

View File

@ -0,0 +1,24 @@
[package]
name = "eth-rpc"
version = "0.1.0"
edition = "2021"
[[bin]]
name = "eth-rpc"
path = "src/main.rs"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
web3 = { version = "0.18.0", features = [], default-features = false }
#async-std = "1.12.0" # async-std does not support wasm32-wasi
serde_json = "1.0.91"
serde = "1.0.152"
jsonrpc-core = "18.0.0"
tokio = { version = "1.24.1", default-features = false, features = ["rt"] }
eyre = "0.6.8"
marine-rs-sdk = "0.7.1"
[dev-dependencies]
marine-rs-sdk-test = "0.8.2"

View File

@ -0,0 +1,16 @@
# Build eth-rpc.wasm
```shell
marine build --release
```
# Build curl-adapter.wasm
```shell
cd ../curl-adapter
marine build --release
```
# Run tests
```shell
./test.sh
```
## It works!~

View File

@ -0,0 +1,87 @@
data RPCResponse:
value: string
success: bool
error: ?string
data RPCResult:
stdout: RPCResponse -- JSON-RPC result
stderr: string -- curl error and other non json-rpc errors
data Web3Balance:
balance: ?string -- hex string bignum
success: bool
error: ?string
data Web3GasUsed:
gas_used: ?string -- hex string
success: bool
error: ?string
data Web3EthCall:
result: ?string -- hex string
success: bool
error: ?string
service ParseToWeb3Balances("json"):
parse(s:string) -> Web3Balance
-- e.g., https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_getbalance
service Web3Services("service-id"):
call_eth_get_balance() -> RPCResult
call_eth_estimate_gas() -> RPCResult
call_eth_call() -> RPCResult
-- rpc_params: account id, blockheight: ususally "latest"
-- or we create a data struct and serialize it in aqua to []string
func eth_ getBalance(peerid: string, service_id: string, uri: string, rpc_params: Vec<String>, nonce: u32) -> Web3Balance:
result: *Web3Balance
on peerid:
Web3Services service_id
res <- Web3Services.call_eth_get_balance(uri, rpc_params, nonce)
if res.stdout.success==true:
result.balance <- res.stdout.value
result.success <<- true
else:
result.success <<- false
result.error <<- res.stdout.value
<- result[0]
-- here the data struct approach seems to make even more sense as we need the transaction call object:
-- data TObject:
-- from: ?[]u8 -- optional 20 bytes, address tx is sent from
-- to: []u8 -- 20 bytes to address
-- gas: ?string -- gas provided for execution of method haxadecimal
-- gasPrice: ?string -- gasPrice used, hexadecimal
-- maxFeesPerGase: ?string -- maximum fee in wei
-- value: ?string -- value sent with tx, hexadecimal
-- data: ?string -- hash of method signature and encoded params
--func eth_estimateGas(peerid: string, service_id: string, uri: string, t_obj: TObject, nonce: u32) -> Web3GasUsed:
-- the "easy" way: Vec<String>
func eth_estimateGas(peerid: string, service_id: string, uri: string, rpc_params: []string, nonce: u32) -> Web3GasUsed:
result: *Web3Gas
on peerid:
Web3Services service_id
res <- Web3Services.call_eth_estimate_gas(uri, rpc_params, nonce)
if res.stdout.success==true:
result.gas_used <- res.stdout.value
result.success <<- true
else:
result.success <<- false
result.error <<- res.stdout.value
<- result
-- also a big intake object, e.g. https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_call
-- easy way -- client serializes to []string
func eth_call(peerid: string, service_id: string, uri: string, rpc_params: []string, nonce: u32) -> Web3EthCall:
result: *Web3EthCall
on peerid:
Web3Services service_id
res <- Web3Services.call_eth_call(uri, rpc_params, nonce)
if res.stdout.success==true:
result.result <- res.stdout.value
result.success <<- true
else:
result.success <<- false
result.error <<- res.stdout.error ---not sure if this is how Web3 does it if there is a Revert error, e.g. https://docs.infura.io/infura/networks/ethereum/json-rpc-methods/eth_call
<- result

View File

@ -0,0 +1,66 @@
-- https://www.jsonrpc.org/specification
data RPCError:
code: i32
message: string
data: ?string
data RPCResponse:
jsonrpc: string
result: string
error: ?RPCError
id: u32
data RPCResponse2:
value: string
success: bool
error: ?string
data RPCResult:
stdout: RPCResponse -- JSON-RPC result
stderr: string -- curl error and other non json-rpc errors
data RPCResult2:
stdout: RPCResponse2 -- JSON-RPC result
stderr: string -- curl error and other non json-rpc errors
data Web3Accounts:
accounts: []string
service ParseToAccounts("json"):
parse(s:string) -> Web3Accounts
service Web3Services("service-id"):
call_get_accounts() -> [][]u8
call_get_accounts_json() -> RPCResult
call_get_accounts_json_2() -> RPCResult2
-- the bytestring return which allows you to do nothing until you convert
-- the bytes using another service to be deployed and a pita to sort through
-- error types
func get_accounts(peerid: string, service_id: string) -> [][]u8:
on peerid:
Web3Services service_id
res <- Web3Services.call_get_accounts()
<- res
func get_accounts_jstring(peerid: string, service_id: string) -> Web3Accounts:
on peerid:
Web3Services service_id
res <- Web3Services.call_get_accounts_json()
-- if not error ...
-- if not rpc error
accounts <- ParseToAccounts.parse(res.stdout.result)
<- accounts
func get_accounts_jstring_2(peerid: string, service_id: string) -> Web3Accounts:
on peerid:
Web3Services service_id
res <- Web3Services.call_get_accounts_json_2()
-- if not error ....
if res.stdout.success == true:
accounts <- ParseToAccounts.parse(res.stdout.value)
<- accounts

View File

@ -0,0 +1,9 @@
# yaml-language-server: $schema=../../.fluence/schemas/module.yaml.json
# Defines [Marine Module](https://fluence.dev/docs/build/concepts/#modules). For Fluence CLI, **module** - is a directory which contains this config and either a precompiled .wasm Marine module or a source code of the module written in Rust which can be compiled into a .wasm Marine module. You can use `fluence module new` command to generate a template for new module
# Documentation: https://github.com/fluencelabs/fluence-cli/tree/main/docs/configs/module.md
version: 0
type: rust
name: eth-rpc

View File

@ -0,0 +1,4 @@
[toolchain]
channel = "nightly-2022-12-06"
targets = [ "x86_64-unknown-linux-gnu" ]
components = [ "rustfmt" ]

View File

@ -0,0 +1,131 @@
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::Arc;
use jsonrpc_core::types::request::Call;
use jsonrpc_core::Output;
use serde_json::json;
use serde_json::Value;
use web3::futures::future::BoxFuture;
use web3::{RequestId, Transport};
use crate::curl_request;
pub type FutResult = BoxFuture<'static, web3::error::Result<Value>>;
#[derive(Debug, Clone)]
pub struct CurlTransport {
pub uri: String,
id: Arc<AtomicUsize>,
}
impl CurlTransport {
pub fn new(uri: String) -> Self {
Self {
uri,
id: Arc::new(AtomicUsize::new(0)),
}
}
pub fn next_id(&self) -> RequestId {
self.id.fetch_add(1, Ordering::AcqRel)
}
}
impl Transport for CurlTransport {
type Out = FutResult;
fn prepare(&self, method: &str, params: Vec<Value>) -> (RequestId, Call) {
let id = self.next_id();
let request = web3::helpers::build_request(id, method, params.clone());
(id, request)
}
fn send(&self, _: RequestId, call: Call) -> Self::Out {
if let Call::MethodCall(call) = call {
/*
curl --request POST \
--url $uri \
--header 'accept: application/json' \
--header 'content-type: application/json' \
--data '
{
"id": 1,
"jsonrpc": "2.0",
"method": "eth_accounts"
}
'
*/
let uri = self.uri.clone();
Box::pin(async move {
let json = json!(call).to_string();
let args = vec![
"--request",
"POST",
"--url",
&uri,
"--header",
"accept: application/json",
"--header",
"content-type: application/json",
"--data",
json.as_str(),
];
let args = args.into_iter().map(|s| s.to_string()).collect();
let response = curl_request(args);
/*
println!(
"response is: \nstdout: {:?}\nstderr: {:?}",
String::from_utf8(response.stdout.clone()),
String::from_utf8(response.stderr.clone())
);
println!("slice: {:?}", serde_json::from_value::<Output>(serde_json::from_slice(response.stdout.as_slice())?));
*/
// FIX: if there's a bad uri, the panic kicks in here.
if response.ret_code != 0 {
let stdout = String::from_utf8_lossy(&response.stdout);
let error = if response.error.is_empty() {
stdout.to_string()
} else {
format!("error: {}\nstdout: {stdout}", response.error)
};
return Err(web3::error::Error::Transport(
web3::error::TransportError::Message(format!("error: {}", error)),
));
}
let response = serde_json::from_slice(response.stdout.as_slice())?;
let response: Output = serde_json::from_value(response)?;
let result = match response {
Output::Success(jsonrpc_core::types::Success { result, .. }) => result,
// no sure if that's enough vs the complete jsonrpc error msg
Output::Failure(jsonrpc_core::types::Failure { error, .. }) => {
serde_json::to_value(error.message).unwrap()
} /*
Output::Failure(failure) => panic!(
"JSON RPC response was a failure {}",
json!(failure).to_string()
),
*/
/*
Output::Failure(failure) => {
let err = jsonrpc_core::types::error::Error.parse_error()
}
format!("JSON RPC response was a failure {}",
json!(failure).to_string()),
*/
};
// println!("parsed result is {}", result.to_string());
Ok(result)
})
} else {
todo!()
}
// Box::pin(async { Ok(json!(["0x407d73d8a49eeb85d32cf465507dd71d507100c1"])) })
}
}

View File

@ -0,0 +1,135 @@
use eyre::eyre;
use marine_rs_sdk::marine;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use tokio::runtime::Builder;
use web3::Transport;
use crate::curl_transport::CurlTransport;
use crate::values::JsonString;
#[marine]
pub fn eth_call(uri: String, method: &str, json_args: Vec<String>) -> JsonString {
let result: eyre::Result<Value> = try {
let rt = Builder::new_current_thread().build()?;
let args: Result<Vec<Value>, _> =
json_args.iter().map(|a| serde_json::from_str(a)).collect();
let args = args.map_err(|err| {
eyre!("Invalid arguments. Expected JSON serialized to string, got {json_args:?}: {err}")
})?;
let transport = CurlTransport::new(uri);
let result = rt.block_on(transport.execute(method, args))?;
result
};
result.into()
}
#[marine]
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct RPCResult {
provider_name: String,
stdout: String,
stderr: String,
}
pub fn eth_call_2(uri: String, method: &str, json_args: Vec<String>) -> JsonString {
let result: eyre::Result<Value> = try {
let rt = Builder::new_current_thread().build()?;
let args: Result<Vec<Value>, _> = json_args
.into_iter()
.map(|a| serde_json::from_str(&a))
.collect();
let transport = CurlTransport::new(uri);
let result = rt.block_on(transport.execute(method, args?))?;
result
};
result.into()
}
#[cfg(test)]
mod tests {
use marine_rs_sdk_test::marine_test;
#[marine_test(
config_path = "../tests_artifacts/Config.toml",
modules_dir = "../tests_artifacts"
)]
fn get_accounts_bad_uri(rpc: marine_test_env::eth_rpc::ModuleInterface) {
let uri: String = "http://bad_uri.to".into();
let method: String = "eth_accounts".into();
let json_args: Vec<String> = vec![];
let accounts = rpc.eth_call(uri, method, json_args);
println!("bad uri call: {:?}", accounts);
// println!("accounts: {:?}", accounts);
// assert_eq!(accounts.len(), 0);
}
#[marine_test(
config_path = "../tests_artifacts/Config.toml",
modules_dir = "../tests_artifacts"
)]
fn get_accounts_bad_method(rpc: marine_test_env::eth_rpc::ModuleInterface) {
let uri: String = std::fs::read_to_string("./infura_uri.txt").unwrap();
let method: String = "eth_getAccounts".into();
let json_args: Vec<String> = vec![];
let accounts = rpc.eth_call(uri, method, json_args);
println!("bad method: {:?}", accounts);
}
#[marine_test(
config_path = "../tests_artifacts/Config.toml",
modules_dir = "../tests_artifacts"
)]
fn get_accounts_good_uri(rpc: marine_test_env::eth_rpc::ModuleInterface) {
let uri: String = std::fs::read_to_string("./infura_uri.txt").unwrap();
let method: String = "eth_accounts".into();
let json_args: Vec<String> = vec![];
let accounts = rpc.eth_call(uri, method, json_args);
println!("all good: {:?}", accounts);
// println!("accounts: {:?}", accounts);
// assert_eq!(accounts.len(), 0);
}
#[marine_test(
config_path = "../tests_artifacts/Config.toml",
modules_dir = "../tests_artifacts"
)]
fn get_transaction(rpc: marine_test_env::eth_rpc::ModuleInterface) {
use serde_json::json;
let uri: String = todo!("put Goerli ETH RPC URL here");
let method: String = "eth_getTransactionByHash".into();
let json_args: Vec<String> =
vec![
json!("0x3ffaa16b93ef90b9385b6f6a140d8297c43b6551bf8e8b804d9eecff7bc1509f")
.to_string(),
];
let result = rpc.eth_call(uri.clone(), method.clone(), json_args);
assert!(result.success, "{}", result.error);
assert_eq!(result.value, "null", "{}", result.value);
let json_args: Vec<String> =
vec!["0x3ffaa16b93ef90b9385b6f6a140d8297c43b6551bf8e8b804d9eecff7bc1509f".into()];
let result = rpc.eth_call(uri, method, json_args);
assert!(!result.success);
assert!(
result
.error
.starts_with("Invalid arguments. Expected JSON serialized to string"),
"{}",
result.error
);
}
}

View File

@ -0,0 +1,88 @@
#![feature(try_blocks)]
use marine_rs_sdk::module_manifest;
use marine_rs_sdk::{marine, MountedBinaryResult};
use tokio::runtime::Builder;
use web3::api::Eth;
use web3::helpers::CallFuture;
use web3::types::Address;
use web3::Web3;
use crate::curl_transport::{CurlTransport, FutResult};
pub mod curl_transport;
pub mod eth_call;
pub mod typed;
pub mod values;
module_manifest!();
pub fn main() {}
// #[tokio::main(flavor = "current_thread")]
// flavor idea comes from https://github.com/rjzak/tokio-echo-test/blob/main/src/main.rs#L42
// but seems to require additional tokio futures
pub fn get_accounts(uri: String) -> web3::error::Result<Vec<Vec<u8>>> {
let rt = Builder::new_current_thread().build()?;
let web3 = Web3::new(CurlTransport::new(uri));
let eth = web3.eth();
println!("Calling accounts.");
let accounts: CallFuture<Vec<Address>, FutResult> = eth.accounts();
let accounts: web3::Result<Vec<Address>> = rt.block_on(accounts);
println!("Accounts: {:?}", accounts);
Ok(accounts?
.into_iter()
.map(|a: Address| a.as_bytes().to_vec())
.collect())
}
pub fn web3_call<
Out: serde::de::DeserializeOwned,
F: FnOnce(Eth<CurlTransport>) -> CallFuture<Out, FutResult>,
>(
uri: String,
call: F,
) -> web3::error::Result<Out> {
let rt = Builder::new_current_thread()
.build()
.expect("error starting tokio runtime");
let web3 = Web3::new(CurlTransport::new(uri));
let result: CallFuture<Out, FutResult> = call(web3.eth());
let result: web3::error::Result<Out> = rt.block_on(result);
result
}
#[marine]
pub fn call_get_accounts(uri: String) -> Vec<Vec<u8>> {
get_accounts(uri).expect("error calling main")
}
#[marine]
#[link(wasm_import_module = "curl_adapter")]
extern "C" {
pub fn curl_request(cmd: Vec<String>) -> MountedBinaryResult;
}
#[cfg(test)]
mod tests {
use marine_rs_sdk_test::marine_test;
#[marine_test(
config_path = "../tests_artifacts/Config.toml",
modules_dir = "../tests_artifacts"
)]
fn get_accounts_generic(rpc: marine_test_env::eth_rpc::ModuleInterface) {
let uri: String = std::fs::read_to_string("./infura_uri.txt").unwrap();
let method: String = "eth_accounts".into();
let json_args: Vec<String> = vec![];
let accounts = rpc.eth_call(uri, method, json_args);
println!("accounts: {:?}", accounts);
}
}

View File

@ -0,0 +1,268 @@
#![allow(unused)]
use marine_rs_sdk::marine;
use web3::types::{BlockId, BlockNumber, Bytes, CallRequest};
use crate::values::{BytesValue, JsonString, U64Value};
use crate::web3_call;
/// Get list of available accounts.
#[marine]
pub fn accounts(uri: String) -> Vec<JsonString> {
web3_call(uri, |w| w.accounts())
.into_iter()
.map(|a| {
let json = serde_json::to_value(&a).map_err(eyre::Report::from);
JsonString::from(json)
})
.collect()
}
/// Get current block number
#[marine]
pub fn block_number(uri: String) -> U64Value {
web3_call(uri, |w| w.block_number()).into()
}
/// Call a constant method of contract without changing the state of the blockchain.
#[marine]
pub fn call(uri: String, req: String, block: u64) -> BytesValue {
let result: eyre::Result<Bytes> = try {
let req: CallRequest = serde_json::from_str(&req)?;
web3_call(uri, move |w| {
w.call(
req,
Some(BlockId::Number(BlockNumber::Number(block.into()))),
)
})?
};
result.into()
}
/// Get coinbase address
// #[marine]
pub fn coinbase(uri: String) -> String {
todo!()
}
/// Compile LLL
// #[marine]
pub fn compile_lll(uri: String, code: String) -> Vec<u8> {
todo!()
}
/// Compile Solidity
// #[marine]
pub fn compile_solidity(uri: String, code: String) -> Vec<u8> {
todo!()
}
/// Compile Serpent
// #[marine]
pub fn compile_serpent(uri: String, code: String) -> Vec<u8> {
todo!()
}
/// Call a contract without changing the state of the blockchain to estimate gas usage.
// #[marine]
pub fn estimate_gas(uri: String, req: String, block: String) -> String {
todo!()
}
/// Get current recommended gas price
// #[marine]
pub fn gas_price(uri: String) -> String {
todo!()
}
/// Returns a collection of historical gas information. This can be used for evaluating the max_fee_per_gas
/// and max_priority_fee_per_gas to send the future transactions.
// #[marine]
pub fn fee_history(
uri: String,
block_count: String,
newest_block: String,
reward_percentiles: Vec<f64>,
) -> String {
todo!()
}
/// Get balance of given address
// #[marine]
pub fn balance(uri: String, address: String, block: String) -> String {
todo!()
}
/// Get all logs matching a given filter object
// #[marine]
pub fn logs(uri: String, filter: String) -> Vec<String> {
todo!()
}
/// Get block details with transaction hashes.
// #[marine]
pub fn block(uri: String, block: String) -> String {
todo!()
}
/// Get block details with full transaction objects.
// #[marine]
pub fn block_with_txs(uri: String, block: String) -> String {
todo!()
}
/// Get number of transactions in block
// #[marine]
pub fn block_transaction_count(uri: String, block: String) -> String {
todo!()
}
/// Get code under given address
// #[marine]
pub fn code(uri: String, address: String, block: String) -> Vec<u8> {
todo!()
}
/// Get supported compilers
// #[marine]
pub fn compilers(uri: String) -> Vec<String> {
todo!()
}
/// Get chain id
// #[marine]
pub fn chain_id(uri: String) -> String {
todo!()
}
/// Get available user accounts. This method is only available in the browser. With MetaMask,
/// this will cause the popup that prompts the user to allow or deny access to their accounts
/// to your app.
// #[marine]
pub fn request_accounts(uri: String) -> Vec<String> {
todo!()
}
/// Get storage entry
// #[marine]
pub fn storage(uri: String, address: String, idx: String, block: String) -> String {
todo!()
}
/// Get nonce
// #[marine]
pub fn transaction_count(uri: String, address: String, block: String) -> String {
todo!()
}
/// Get transaction
// #[marine]
pub fn transaction(uri: String, id: String) -> String {
todo!()
}
/// Get transaction receipt
// #[marine]
pub fn transaction_receipt(uri: String, hash: String) -> String {
todo!()
}
/// Get uncle header by block ID and uncle index.
///
/// This method is meant for TurboGeth compatiblity,
/// which is missing transaction hashes in the response.
// #[marine]
pub fn uncle_header(uri: String, block: String, index: String) -> String {
todo!()
}
/// Get uncle by block ID and uncle index -- transactions only has hashes.
// #[marine]
pub fn uncle(uri: String, block: String, index: String) -> String {
todo!()
}
/// Get uncle count in block
// #[marine]
pub fn uncle_count(uri: String, block: String) -> String {
todo!()
}
/// Get work package
// #[marine]
pub fn work(uri: String) -> String {
todo!()
}
/// Get hash rate
// #[marine]
pub fn hashrate(uri: String) -> String {
todo!()
}
/// Get mining status
// #[marine]
pub fn mining(uri: String) -> bool {
todo!()
}
/// Start new block filter
// #[marine]
pub fn new_block_filter(uri: String) -> String {
todo!()
}
/// Start new pending transaction filter
// #[marine]
pub fn new_pending_transaction_filter(uri: String) -> String {
todo!()
}
/// Start new pending transaction filter
// #[marine]
pub fn protocol_version(uri: String) -> String {
todo!()
}
/// Sends a rlp-encoded signed transaction
// #[marine]
pub fn send_raw_transaction(uri: String, rlp: String) -> String {
todo!()
}
/// Sends a transaction transaction
// #[marine]
pub fn send_transaction(uri: String, tx: String) -> String {
todo!()
}
/// Signs a hash of given data
// #[marine]
pub fn sign(uri: String, address: String, data: String) -> String {
todo!()
}
/// Submit hashrate of external miner
// #[marine]
pub fn submit_hashrate(uri: String, rate: String, id: String) -> bool {
todo!()
}
/// Submit work of external miner
// #[marine]
pub fn submit_work(uri: String, nonce: String, pow_hash: String, mix_hash: String) -> bool {
todo!()
}
/// Get syncing status
// #[marine]
pub fn syncing(uri: String) -> String {
todo!()
}
/// Returns the account- and storage-values of the specified account including the Merkle-proof.
// #[marine]
pub fn proof(uri: String, address: String, keys: String, block: String) -> String {
todo!()
}

View File

@ -0,0 +1,76 @@
use marine_rs_sdk::marine;
use serde_json::Value;
use web3::types::Bytes;
use web3::types::U64;
#[marine]
pub struct JsonString {
pub value: String,
pub success: bool,
pub error: String,
}
impl From<eyre::Result<Value>> for JsonString {
fn from(value: eyre::Result<Value>) -> Self {
match value {
Ok(value) => JsonString {
value: value.to_string(),
success: true,
error: String::new(),
},
Err(err) => JsonString {
value: String::new(),
success: false,
error: format!("{}\n{:?}", err, err),
},
}
}
}
#[marine]
pub struct U64Value {
pub value: u64,
pub success: bool,
pub error: String,
}
impl From<web3::error::Result<U64>> for U64Value {
fn from(value: web3::error::Result<U64>) -> Self {
match value {
Ok(value) => U64Value {
value: value.as_u64(),
success: true,
error: String::new(),
},
Err(err) => U64Value {
value: u64::default(),
success: false,
error: format!("{}\n{:?}", err, err),
},
}
}
}
#[marine]
pub struct BytesValue {
pub value: Vec<u8>,
pub success: bool,
pub error: String,
}
impl From<eyre::Result<Bytes>> for BytesValue {
fn from(value: eyre::Result<Bytes>) -> Self {
match value {
Ok(value) => BytesValue {
value: value.0,
success: true,
error: String::new(),
},
Err(err) => BytesValue {
value: vec![],
success: false,
error: format!("{}\n{:?}", err, err),
},
}
}
}

View File

@ -0,0 +1,25 @@
#!/usr/bin/env bash
set -o nounset
set -o errexit
set -o pipefail
cd "$(dirname "$0")"
mkdir -p tests_artifacts
# build eth-rpc.wasm
marine build --release
cp ./target/wasm32-wasi/release/eth-rpc.wasm tests_artifacts/
# build curl-adapter.wasm
(cd ../curl-adapter; marine build --release)
cp ../curl-adapter/target/wasm32-wasi/release/curl_adapter.wasm tests_artifacts/
#if [[ ! -f "tests_artifacts/sqlite3.wasm" ]]; then
# # download SQLite 3
# curl -L https://github.com/fluencelabs/sqlite/releases/download/v0.15.0_w/sqlite3.wasm -o tests_artifacts/sqlite3.wasm
#fi
# run tests
cargo nextest run --release --no-fail-fast --nocapture

View File

@ -0,0 +1,22 @@
modules_dir = "."
#[[module]]
#name = "sqlite3"
#mem_pages_count = 100
#logger_enabled = false
#[module.wasi]
#preopened_files = ["/tmp"]
#mapped_dirs = { "tmp" = "." }
[[module]]
name = "curl_adapter"
max_heap_size = "2 MiB"
logger_enabled = true
[module.mounted_binaries]
curl = "/usr/bin/curl"
[[module]]
name = "eth_rpc"
logger_enabled = true

View File

@ -0,0 +1,29 @@
# Fluence decentralized RPC Workshop
ETHDenver 2/27/2023
##Outline
## Intended bounty user experience
* embedd a the already created Fluence client peer into your dApp
## Deployment and code
* deploy eth-rpc service to each KRAS (?) peer at least once
* create Registry instance for deployed services
* create Aqua scaffold to interct with registry and modules
* create Fluence JS reference client to embed into dApp
## Introduction
Fluence decentralized RPC (fRPC) is a ready to use ???

View File

@ -7,7 +7,7 @@ description = "ipfs-adapter, a Marine wasi module"
license = "Apache-2.0"
[[bin]]
name = "ipfs_adapter"
name = "ipfs-adapter"
path = "src/main.rs"
[dependencies]
@ -15,8 +15,5 @@ marine-rs-sdk = { version = "0.7.1", features = ["logger"] }
log = "0.4.14"
[dev-dependencies]
marine-rs-sdk-test = "0.8.1"
marine-rs-sdk-test = "0.8.2"
[dev]
[profile.release]
opt-level = "s"

View File

@ -0,0 +1,11 @@
# yaml-language-server: $schema=../../.fluence/schemas/module.yaml.json
# Defines [Marine Module](https://fluence.dev/docs/build/concepts/#modules). For Fluence CLI, **module** - is a directory which contains this config and either a precompiled .wasm Marine module or a source code of the module written in Rust which can be compiled into a .wasm Marine module. You can use `fluence module new` command to generate a template for new module
# Documentation: https://github.com/fluencelabs/fluence-cli/tree/main/docs/configs/module.md
version: 0
type: rust
name: ipfs-adapter
mountedBinaries:
ipfs: /usr/bin/ipfs

View File

@ -7,7 +7,7 @@ description = "ipfs-cli, a Marine wasi module"
license = "Apache-2.0"
[[bin]]
name = "ipfs_cli"
name = "ipfs-cli"
path = "src/main.rs"
[dependencies]
@ -17,8 +17,4 @@ serde_json = "1.0.81"
serde = "1.0.137"
[dev-dependencies]
marine-rs-sdk-test = "0.8.1"
[dev]
[profile.release]
opt-level = "s"
marine-rs-sdk-test = "0.8.2"

View File

@ -0,0 +1,9 @@
# yaml-language-server: $schema=../../.fluence/schemas/module.yaml.json
# Defines [Marine Module](https://fluence.dev/docs/build/concepts/#modules). For Fluence CLI, **module** - is a directory which contains this config and either a precompiled .wasm Marine module or a source code of the module written in Rust which can be compiled into a .wasm Marine module. You can use `fluence module new` command to generate a template for new module
# Documentation: https://github.com/fluencelabs/fluence-cli/tree/main/docs/configs/module.md
version: 0
type: rust
name: ipfs-cli

View File

@ -1,24 +1,16 @@
[package]
name = "multi_provider_query"
version = "0.1.5"
authors = ["boneyard93501 <4523011+boneyard93501@users.noreply.github.com>"]
name = "multi-provider-query"
version = "0.1.0"
edition = "2018"
description = "multi-provider-query, a Marine wasi module"
license = "Apache-2.0"
[[bin]]
name = "multi_provider_query"
name = "multi-provider-query"
path = "src/main.rs"
[dependencies]
marine-rs-sdk = { version = "0.7.1", features = ["logger"] }
log = "0.4.14"
serde_json = "1.0.81"
serde = "1.0.137"
marine-rs-sdk = "0.7.1"
serde = "1.0.152"
serde_json = "1.0.92"
[dev-dependencies]
marine-rs-sdk-test = "0.8.1"
[dev]
[profile.release]
opt-level = "s"
marine-rs-sdk-test = "0.8.2"

View File

@ -0,0 +1,9 @@
# yaml-language-server: $schema=../../.fluence/schemas/module.yaml.json
# Defines [Marine Module](https://fluence.dev/docs/build/concepts/#modules). For Fluence CLI, **module** - is a directory which contains this config and either a precompiled .wasm Marine module or a source code of the module written in Rust which can be compiled into a .wasm Marine module. You can use `fluence module new` command to generate a template for new module
# Documentation: https://github.com/fluencelabs/fluence-cli/tree/main/docs/configs/module.md
version: 0
type: rust
name: multi-provider-query

View File

@ -7,7 +7,7 @@ description = "simple-quorum, a Marine wasi module"
license = "Apache-2.0"
[[bin]]
name = "simple_quorum"
name = "simple-quorum"
path = "src/main.rs"
[dependencies]
@ -18,8 +18,5 @@ serde = "1.0.137"
streaming-stats = "0.2.3"
[dev-dependencies]
marine-rs-sdk-test = "0.8.1"
marine-rs-sdk-test = "0.8.2"
[dev]
[profile.release]
opt-level = "s"

View File

@ -0,0 +1,9 @@
# yaml-language-server: $schema=../../.fluence/schemas/module.yaml.json
# Defines [Marine Module](https://fluence.dev/docs/build/concepts/#modules). For Fluence CLI, **module** - is a directory which contains this config and either a precompiled .wasm Marine module or a source code of the module written in Rust which can be compiled into a .wasm Marine module. You can use `fluence module new` command to generate a template for new module
# Documentation: https://github.com/fluencelabs/fluence-cli/tree/main/docs/configs/module.md
version: 0
type: rust
name: simple-quorum

View File

@ -47,6 +47,7 @@ fn mode<'a>(data: impl ExactSizeIterator<Item = &'a EVMResult>) -> (u32, u64) {
(*frequencies.get(&mode).unwrap(), *mode)
}
#[allow(unused)]
fn mean<'a>(data: impl ExactSizeIterator<Item = &'a u64>) -> Option<f64> {
let n = data.len() as u64;
if n < 1 {

View File

@ -18,8 +18,5 @@ serde = "1.0.137"
streaming-stats = "0.2.3"
[dev-dependencies]
marine-rs-sdk-test = "0.8.1"
marine-rs-sdk-test = "0.8.2"
[dev]
[profile.release]
opt-level = "s"

View File

@ -0,0 +1,9 @@
# yaml-language-server: $schema=../../.fluence/schemas/module.yaml.json
# Defines [Marine Module](https://fluence.dev/docs/build/concepts/#modules). For Fluence CLI, **module** - is a directory which contains this config and either a precompiled .wasm Marine module or a source code of the module written in Rust which can be compiled into a .wasm Marine module. You can use `fluence module new` command to generate a template for new module
# Documentation: https://github.com/fluencelabs/fluence-cli/tree/main/docs/configs/module.md
version: 0
type: rust
name: utilities

View File

@ -23,7 +23,7 @@ paired = "0.22.0"
sha2 = "0.9.9"
[dev-dependencies]
marine-rs-sdk-test = "0.8.1"
marine-rs-sdk-test = "0.8.2"
hex-literal = "0.3.4"
[dev]

View File

@ -9,12 +9,12 @@
"version": "0.1.0",
"license": "MIT",
"dependencies": {
"@fluencelabs/fluence": "^0.27.0",
"@fluencelabs/fluence": "^0.28.0",
"@fluencelabs/fluence-network-environment": "^1.0.13",
"it-all": "^1.0.5"
},
"devDependencies": {
"@fluencelabs/aqua": "0.8.0-368",
"@fluencelabs/aqua": "0.10.3",
"@fluencelabs/aqua-lib": "0.6.0",
"@types/jest": "^27.0.3",
"chokidar-cli": "^3.0.0",
@ -606,14 +606,14 @@
}
},
"node_modules/@fluencelabs/aqua": {
"version": "0.8.0-368",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.8.0-368.tgz",
"integrity": "sha512-vnqgjwJWa2XvNqGUCITvkhIiF7ps9WhZL4GfvtuSwVAsdpDaYGtxPH63wcYcG9TwRCr7nGgjOhJGXhkmGhUE2w==",
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.10.3.tgz",
"integrity": "sha512-v7Jy+KzZkUm7NuUgrp7UQ8gxuhykxuTU3JigCdxiZMcG3/zD+OtHzsSggVLxVjDP7CKuTcjEKZSCxObwHp/Tpw==",
"dev": true,
"dependencies": {
"@fluencelabs/aqua-ipfs": "0.5.8",
"@fluencelabs/aqua-ipfs": "0.5.9",
"@fluencelabs/aqua-lib": "0.6.0",
"@fluencelabs/fluence": "0.27.4",
"@fluencelabs/fluence": "0.28.0",
"@fluencelabs/fluence-network-environment": "1.0.13",
"ipfs-http-client": "50.1.2"
},
@ -623,9 +623,9 @@
}
},
"node_modules/@fluencelabs/aqua-ipfs": {
"version": "0.5.8",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-ipfs/-/aqua-ipfs-0.5.8.tgz",
"integrity": "sha512-jKlyGBm8oJAIQ3Ags58oJ8QVTlCYSvZQVTnX2SnugGXWVwt4+9qtqtvNT5MvWKK3M9lCFDbJJy/qVTjzPJlaiw==",
"version": "0.5.9",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-ipfs/-/aqua-ipfs-0.5.9.tgz",
"integrity": "sha512-Vg7pYv4gEreOKfvzKEL5FchGqSKwat7JyKpqJO6h+FC5S1bl76UkI507+ExhijmUbQGznop8G33XFxyUi6q5SQ==",
"dev": true,
"dependencies": {
"@fluencelabs/aqua-lib": "^0.5.2"
@ -644,9 +644,9 @@
"dev": true
},
"node_modules/@fluencelabs/avm": {
"version": "0.31.10",
"resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.31.10.tgz",
"integrity": "sha512-tkpjdHyRmsTwAEZCJt15//jXEgC2Nw2qFiD1NenvK127SlgKeuzQU9IMReUYY3dowb2IGeC578/uGMu96jHYKw=="
"version": "0.35.3",
"resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.35.3.tgz",
"integrity": "sha512-Y5mPPCmAUUKc5CDO12IL8mGEreWa7maVdX0MWCAH4+GvfLPFN1FxOMSKRYEtvkyVEL88pc9pd8cm5IRCBkFthg=="
},
"node_modules/@fluencelabs/connection": {
"version": "0.2.0",
@ -714,23 +714,23 @@
}
},
"node_modules/@fluencelabs/fluence": {
"version": "0.27.4",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.27.4.tgz",
"integrity": "sha512-f85q8ZdmPlUd6uIgmS0CDTvSsb+TGvTqOljw0b161lfEuqPIXrjxJSt0/2Lyh2eEZ1P3slOka1tbVw01nVrt5w==",
"version": "0.28.0",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.28.0.tgz",
"integrity": "sha512-SXb2vjTj8m/nw4jEILV0tu9VIFprGo8mNb2nOB5btxdsOI8GzQZkpGzTLrSd/+UagIo2GdxAu0GhBP8dxZXaqg==",
"dependencies": {
"@fluencelabs/avm": "0.31.10",
"@fluencelabs/avm": "0.35.3",
"@fluencelabs/connection": "0.2.0",
"@fluencelabs/interfaces": "0.1.0",
"@fluencelabs/keypair": "0.2.0",
"@fluencelabs/marine-js": "0.3.37",
"async": "3.2.3",
"async": "3.2.4",
"base64-js": "^1.5.1",
"browser-or-node": "2.0.0",
"bs58": "5.0.0",
"buffer": "^6.0.3",
"cids": "1.1.9",
"loglevel": "1.8.0",
"multiformats": "9.6.5",
"loglevel": "1.8.1",
"multiformats": "9.9.0",
"peer-id": "0.16.0",
"platform": "^1.3.6",
"rxjs": "^7.5.5",
@ -768,6 +768,18 @@
"node": ">=12.0.0"
}
},
"node_modules/@fluencelabs/fluence/node_modules/loglevel": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz",
"integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==",
"engines": {
"node": ">= 0.6.0"
},
"funding": {
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/loglevel"
}
},
"node_modules/@fluencelabs/fluence/node_modules/node-forge": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
@ -1753,9 +1765,9 @@
}
},
"node_modules/async": {
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz",
"integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g=="
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
"integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
},
"node_modules/asynckit": {
"version": "0.4.0",
@ -5542,9 +5554,9 @@
"integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg=="
},
"node_modules/multiformats": {
"version": "9.6.5",
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.6.5.tgz",
"integrity": "sha512-vMwf/FUO+qAPvl3vlSZEgEVFY/AxeZq5yg761ScF3CZsXgmTi/HGkicUiNN0CI4PW8FiY2P0OLklOcmQjdQJhw=="
"version": "9.9.0",
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz",
"integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg=="
},
"node_modules/multihashes": {
"version": "4.0.3",
@ -8026,22 +8038,22 @@
}
},
"@fluencelabs/aqua": {
"version": "0.8.0-368",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.8.0-368.tgz",
"integrity": "sha512-vnqgjwJWa2XvNqGUCITvkhIiF7ps9WhZL4GfvtuSwVAsdpDaYGtxPH63wcYcG9TwRCr7nGgjOhJGXhkmGhUE2w==",
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.10.3.tgz",
"integrity": "sha512-v7Jy+KzZkUm7NuUgrp7UQ8gxuhykxuTU3JigCdxiZMcG3/zD+OtHzsSggVLxVjDP7CKuTcjEKZSCxObwHp/Tpw==",
"dev": true,
"requires": {
"@fluencelabs/aqua-ipfs": "0.5.8",
"@fluencelabs/aqua-ipfs": "0.5.9",
"@fluencelabs/aqua-lib": "0.6.0",
"@fluencelabs/fluence": "0.27.4",
"@fluencelabs/fluence": "0.28.0",
"@fluencelabs/fluence-network-environment": "1.0.13",
"ipfs-http-client": "50.1.2"
}
},
"@fluencelabs/aqua-ipfs": {
"version": "0.5.8",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-ipfs/-/aqua-ipfs-0.5.8.tgz",
"integrity": "sha512-jKlyGBm8oJAIQ3Ags58oJ8QVTlCYSvZQVTnX2SnugGXWVwt4+9qtqtvNT5MvWKK3M9lCFDbJJy/qVTjzPJlaiw==",
"version": "0.5.9",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-ipfs/-/aqua-ipfs-0.5.9.tgz",
"integrity": "sha512-Vg7pYv4gEreOKfvzKEL5FchGqSKwat7JyKpqJO6h+FC5S1bl76UkI507+ExhijmUbQGznop8G33XFxyUi6q5SQ==",
"dev": true,
"requires": {
"@fluencelabs/aqua-lib": "^0.5.2"
@ -8062,9 +8074,9 @@
"dev": true
},
"@fluencelabs/avm": {
"version": "0.31.10",
"resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.31.10.tgz",
"integrity": "sha512-tkpjdHyRmsTwAEZCJt15//jXEgC2Nw2qFiD1NenvK127SlgKeuzQU9IMReUYY3dowb2IGeC578/uGMu96jHYKw=="
"version": "0.35.3",
"resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.35.3.tgz",
"integrity": "sha512-Y5mPPCmAUUKc5CDO12IL8mGEreWa7maVdX0MWCAH4+GvfLPFN1FxOMSKRYEtvkyVEL88pc9pd8cm5IRCBkFthg=="
},
"@fluencelabs/connection": {
"version": "0.2.0",
@ -8121,23 +8133,23 @@
}
},
"@fluencelabs/fluence": {
"version": "0.27.4",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.27.4.tgz",
"integrity": "sha512-f85q8ZdmPlUd6uIgmS0CDTvSsb+TGvTqOljw0b161lfEuqPIXrjxJSt0/2Lyh2eEZ1P3slOka1tbVw01nVrt5w==",
"version": "0.28.0",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.28.0.tgz",
"integrity": "sha512-SXb2vjTj8m/nw4jEILV0tu9VIFprGo8mNb2nOB5btxdsOI8GzQZkpGzTLrSd/+UagIo2GdxAu0GhBP8dxZXaqg==",
"requires": {
"@fluencelabs/avm": "0.31.10",
"@fluencelabs/avm": "0.35.3",
"@fluencelabs/connection": "0.2.0",
"@fluencelabs/interfaces": "0.1.0",
"@fluencelabs/keypair": "0.2.0",
"@fluencelabs/marine-js": "0.3.37",
"async": "3.2.3",
"async": "3.2.4",
"base64-js": "^1.5.1",
"browser-or-node": "2.0.0",
"bs58": "5.0.0",
"buffer": "^6.0.3",
"cids": "1.1.9",
"loglevel": "1.8.0",
"multiformats": "9.6.5",
"loglevel": "1.8.1",
"multiformats": "9.9.0",
"peer-id": "0.16.0",
"platform": "^1.3.6",
"rxjs": "^7.5.5",
@ -8160,6 +8172,11 @@
"uint8arrays": "^3.0.0"
}
},
"loglevel": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz",
"integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg=="
},
"node-forge": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
@ -9008,9 +9025,9 @@
"integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="
},
"async": {
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz",
"integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g=="
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
"integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
},
"asynckit": {
"version": "0.4.0",
@ -12093,9 +12110,9 @@
}
},
"multiformats": {
"version": "9.6.5",
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.6.5.tgz",
"integrity": "sha512-vMwf/FUO+qAPvl3vlSZEgEVFY/AxeZq5yg761ScF3CZsXgmTi/HGkicUiNN0CI4PW8FiY2P0OLklOcmQjdQJhw=="
"version": "9.9.0",
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz",
"integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg=="
},
"multihashes": {
"version": "4.0.3",

View File

@ -13,7 +13,7 @@
"package-lock.json"
],
"dependencies": {
"@fluencelabs/fluence": "^0.27.0",
"@fluencelabs/fluence": "^0.28.0",
"@fluencelabs/fluence-network-environment": "^1.0.13",
"it-all": "^1.0.5"
},
@ -41,7 +41,7 @@
},
"homepage": "git+https://github.com/fluencelabs/examples/aqua-examples/echo-greeter#readme",
"devDependencies": {
"@fluencelabs/aqua": "0.8.0-368",
"@fluencelabs/aqua": "0.10.3",
"@fluencelabs/aqua-lib": "0.6.0",
"@types/jest": "^27.0.3",
"chokidar-cli": "^3.0.0",

View File

@ -15,7 +15,7 @@ marine-rs-sdk = { version = "0.7.1", features = ["logger"] }
log = "0.4.14"
[dev-dependencies]
marine-rs-sdk-test = "0.8.1"
marine-rs-sdk-test = "0.8.2"
[dev]
[profile.release]

View File

@ -11,15 +11,15 @@
"author": "",
"license": "ISC",
"devDependencies": {
"@fluencelabs/aqua": "0.8.0-368",
"@fluencelabs/aqua": "0.10.3",
"@fluencelabs/aqua-lib": "0.6.0",
"chokidar-cli": "^3.0.0",
"ts-node": "^10.7.0",
"typescript": "^4.6.3"
},
"dependencies": {
"@fluencelabs/fluence": "0.27.5",
"@fluencelabs/fluence-network-environment": "1.0.13",
"@fluencelabs/fluence": "0.28.0",
"@fluencelabs/fluence-network-environment": "1.0.14",
"@types/sqlite3": "^3.1.7",
"near-api-js": "^0.43.1"
}

View File

@ -14,7 +14,7 @@ marine-rs-sdk = { version = "0.7.1", features = ["logger"] }
log = "0.4.14"
[dev-dependencies]
marine-rs-sdk-test = "0.8.1"
marine-rs-sdk-test = "0.8.2"
[dev]
[profile.release]

View File

@ -17,7 +17,7 @@ serde = { version = "1.0.132", default-features = false }
serde_json = { version = "1.0.73", default-features = false }
[dev-dependencies]
marine-rs-sdk-test = "0.8.1"
marine-rs-sdk-test = "0.8.2"
[dev]
[profile.release]

View File

@ -9,12 +9,12 @@
"version": "0.1.0",
"license": "MIT",
"dependencies": {
"@fluencelabs/fluence": "^0.27.0",
"@fluencelabs/fluence-network-environment": "1.0.13",
"@fluencelabs/fluence": "^0.28.0",
"@fluencelabs/fluence-network-environment": "1.0.14",
"it-all": "^1.0.5"
},
"devDependencies": {
"@fluencelabs/aqua": "0.8.0-368",
"@fluencelabs/aqua": "0.10.3",
"@fluencelabs/aqua-lib": "0.6.0",
"@types/jest": "^27.0.3",
"chokidar-cli": "^3.0.0",
@ -606,14 +606,14 @@
}
},
"node_modules/@fluencelabs/aqua": {
"version": "0.8.0-368",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.8.0-368.tgz",
"integrity": "sha512-vnqgjwJWa2XvNqGUCITvkhIiF7ps9WhZL4GfvtuSwVAsdpDaYGtxPH63wcYcG9TwRCr7nGgjOhJGXhkmGhUE2w==",
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.10.3.tgz",
"integrity": "sha512-v7Jy+KzZkUm7NuUgrp7UQ8gxuhykxuTU3JigCdxiZMcG3/zD+OtHzsSggVLxVjDP7CKuTcjEKZSCxObwHp/Tpw==",
"dev": true,
"dependencies": {
"@fluencelabs/aqua-ipfs": "0.5.8",
"@fluencelabs/aqua-ipfs": "0.5.9",
"@fluencelabs/aqua-lib": "0.6.0",
"@fluencelabs/fluence": "0.27.4",
"@fluencelabs/fluence": "0.28.0",
"@fluencelabs/fluence-network-environment": "1.0.13",
"ipfs-http-client": "50.1.2"
},
@ -623,9 +623,9 @@
}
},
"node_modules/@fluencelabs/aqua-ipfs": {
"version": "0.5.8",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-ipfs/-/aqua-ipfs-0.5.8.tgz",
"integrity": "sha512-jKlyGBm8oJAIQ3Ags58oJ8QVTlCYSvZQVTnX2SnugGXWVwt4+9qtqtvNT5MvWKK3M9lCFDbJJy/qVTjzPJlaiw==",
"version": "0.5.9",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-ipfs/-/aqua-ipfs-0.5.9.tgz",
"integrity": "sha512-Vg7pYv4gEreOKfvzKEL5FchGqSKwat7JyKpqJO6h+FC5S1bl76UkI507+ExhijmUbQGznop8G33XFxyUi6q5SQ==",
"dev": true,
"dependencies": {
"@fluencelabs/aqua-lib": "^0.5.2"
@ -643,10 +643,16 @@
"integrity": "sha512-ifjtCM93KO3LhzPkMxqmXhwLmrg/scjOiyTihEVg7ns5N+BVzaK1eWzdOdqGdl9ZVoah43pdlQUepEo7VdRmsw==",
"dev": true
},
"node_modules/@fluencelabs/aqua/node_modules/@fluencelabs/fluence-network-environment": {
"version": "1.0.13",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence-network-environment/-/fluence-network-environment-1.0.13.tgz",
"integrity": "sha512-2pci3T0sUHE08jwEs1r/vHKVT4XUh/A3j/QJ0eIhddsxyIjEksjdn05X7DF6STD14CF8GgBVOJEPgav8qaUMpA==",
"dev": true
},
"node_modules/@fluencelabs/avm": {
"version": "0.31.10",
"resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.31.10.tgz",
"integrity": "sha512-tkpjdHyRmsTwAEZCJt15//jXEgC2Nw2qFiD1NenvK127SlgKeuzQU9IMReUYY3dowb2IGeC578/uGMu96jHYKw=="
"version": "0.35.3",
"resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.35.3.tgz",
"integrity": "sha512-Y5mPPCmAUUKc5CDO12IL8mGEreWa7maVdX0MWCAH4+GvfLPFN1FxOMSKRYEtvkyVEL88pc9pd8cm5IRCBkFthg=="
},
"node_modules/@fluencelabs/connection": {
"version": "0.2.0",
@ -714,23 +720,23 @@
}
},
"node_modules/@fluencelabs/fluence": {
"version": "0.27.4",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.27.4.tgz",
"integrity": "sha512-f85q8ZdmPlUd6uIgmS0CDTvSsb+TGvTqOljw0b161lfEuqPIXrjxJSt0/2Lyh2eEZ1P3slOka1tbVw01nVrt5w==",
"version": "0.28.0",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.28.0.tgz",
"integrity": "sha512-SXb2vjTj8m/nw4jEILV0tu9VIFprGo8mNb2nOB5btxdsOI8GzQZkpGzTLrSd/+UagIo2GdxAu0GhBP8dxZXaqg==",
"dependencies": {
"@fluencelabs/avm": "0.31.10",
"@fluencelabs/avm": "0.35.3",
"@fluencelabs/connection": "0.2.0",
"@fluencelabs/interfaces": "0.1.0",
"@fluencelabs/keypair": "0.2.0",
"@fluencelabs/marine-js": "0.3.37",
"async": "3.2.3",
"async": "3.2.4",
"base64-js": "^1.5.1",
"browser-or-node": "2.0.0",
"bs58": "5.0.0",
"buffer": "^6.0.3",
"cids": "1.1.9",
"loglevel": "1.8.0",
"multiformats": "9.6.5",
"loglevel": "1.8.1",
"multiformats": "9.9.0",
"peer-id": "0.16.0",
"platform": "^1.3.6",
"rxjs": "^7.5.5",
@ -746,9 +752,9 @@
}
},
"node_modules/@fluencelabs/fluence-network-environment": {
"version": "1.0.13",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence-network-environment/-/fluence-network-environment-1.0.13.tgz",
"integrity": "sha512-2pci3T0sUHE08jwEs1r/vHKVT4XUh/A3j/QJ0eIhddsxyIjEksjdn05X7DF6STD14CF8GgBVOJEPgav8qaUMpA=="
"version": "1.0.14",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence-network-environment/-/fluence-network-environment-1.0.14.tgz",
"integrity": "sha512-lMiH+7obmJW2Q+PMUR/vNAuX6TcVqlKmsWAHvnBogH7s8IeMT+UGN8qrweILWmE57G7MfauB302dIFQowR9tug=="
},
"node_modules/@fluencelabs/fluence/node_modules/libp2p-crypto": {
"version": "0.21.2",
@ -768,6 +774,18 @@
"node": ">=12.0.0"
}
},
"node_modules/@fluencelabs/fluence/node_modules/loglevel": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz",
"integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==",
"engines": {
"node": ">= 0.6.0"
},
"funding": {
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/loglevel"
}
},
"node_modules/@fluencelabs/fluence/node_modules/node-forge": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
@ -1753,9 +1771,9 @@
}
},
"node_modules/async": {
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz",
"integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g=="
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
"integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
},
"node_modules/asynckit": {
"version": "0.4.0",
@ -5542,9 +5560,9 @@
"integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg=="
},
"node_modules/multiformats": {
"version": "9.6.5",
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.6.5.tgz",
"integrity": "sha512-vMwf/FUO+qAPvl3vlSZEgEVFY/AxeZq5yg761ScF3CZsXgmTi/HGkicUiNN0CI4PW8FiY2P0OLklOcmQjdQJhw=="
"version": "9.9.0",
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz",
"integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg=="
},
"node_modules/multihashes": {
"version": "4.0.3",
@ -8026,22 +8044,30 @@
}
},
"@fluencelabs/aqua": {
"version": "0.8.0-368",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.8.0-368.tgz",
"integrity": "sha512-vnqgjwJWa2XvNqGUCITvkhIiF7ps9WhZL4GfvtuSwVAsdpDaYGtxPH63wcYcG9TwRCr7nGgjOhJGXhkmGhUE2w==",
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.10.3.tgz",
"integrity": "sha512-v7Jy+KzZkUm7NuUgrp7UQ8gxuhykxuTU3JigCdxiZMcG3/zD+OtHzsSggVLxVjDP7CKuTcjEKZSCxObwHp/Tpw==",
"dev": true,
"requires": {
"@fluencelabs/aqua-ipfs": "0.5.8",
"@fluencelabs/aqua-ipfs": "0.5.9",
"@fluencelabs/aqua-lib": "0.6.0",
"@fluencelabs/fluence": "0.27.4",
"@fluencelabs/fluence": "0.28.0",
"@fluencelabs/fluence-network-environment": "1.0.13",
"ipfs-http-client": "50.1.2"
},
"dependencies": {
"@fluencelabs/fluence-network-environment": {
"version": "1.0.13",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence-network-environment/-/fluence-network-environment-1.0.13.tgz",
"integrity": "sha512-2pci3T0sUHE08jwEs1r/vHKVT4XUh/A3j/QJ0eIhddsxyIjEksjdn05X7DF6STD14CF8GgBVOJEPgav8qaUMpA==",
"dev": true
}
}
},
"@fluencelabs/aqua-ipfs": {
"version": "0.5.8",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-ipfs/-/aqua-ipfs-0.5.8.tgz",
"integrity": "sha512-jKlyGBm8oJAIQ3Ags58oJ8QVTlCYSvZQVTnX2SnugGXWVwt4+9qtqtvNT5MvWKK3M9lCFDbJJy/qVTjzPJlaiw==",
"version": "0.5.9",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-ipfs/-/aqua-ipfs-0.5.9.tgz",
"integrity": "sha512-Vg7pYv4gEreOKfvzKEL5FchGqSKwat7JyKpqJO6h+FC5S1bl76UkI507+ExhijmUbQGznop8G33XFxyUi6q5SQ==",
"dev": true,
"requires": {
"@fluencelabs/aqua-lib": "^0.5.2"
@ -8062,9 +8088,9 @@
"dev": true
},
"@fluencelabs/avm": {
"version": "0.31.10",
"resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.31.10.tgz",
"integrity": "sha512-tkpjdHyRmsTwAEZCJt15//jXEgC2Nw2qFiD1NenvK127SlgKeuzQU9IMReUYY3dowb2IGeC578/uGMu96jHYKw=="
"version": "0.35.3",
"resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.35.3.tgz",
"integrity": "sha512-Y5mPPCmAUUKc5CDO12IL8mGEreWa7maVdX0MWCAH4+GvfLPFN1FxOMSKRYEtvkyVEL88pc9pd8cm5IRCBkFthg=="
},
"@fluencelabs/connection": {
"version": "0.2.0",
@ -8121,23 +8147,23 @@
}
},
"@fluencelabs/fluence": {
"version": "0.27.4",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.27.4.tgz",
"integrity": "sha512-f85q8ZdmPlUd6uIgmS0CDTvSsb+TGvTqOljw0b161lfEuqPIXrjxJSt0/2Lyh2eEZ1P3slOka1tbVw01nVrt5w==",
"version": "0.28.0",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.28.0.tgz",
"integrity": "sha512-SXb2vjTj8m/nw4jEILV0tu9VIFprGo8mNb2nOB5btxdsOI8GzQZkpGzTLrSd/+UagIo2GdxAu0GhBP8dxZXaqg==",
"requires": {
"@fluencelabs/avm": "0.31.10",
"@fluencelabs/avm": "0.35.3",
"@fluencelabs/connection": "0.2.0",
"@fluencelabs/interfaces": "0.1.0",
"@fluencelabs/keypair": "0.2.0",
"@fluencelabs/marine-js": "0.3.37",
"async": "3.2.3",
"async": "3.2.4",
"base64-js": "^1.5.1",
"browser-or-node": "2.0.0",
"bs58": "5.0.0",
"buffer": "^6.0.3",
"cids": "1.1.9",
"loglevel": "1.8.0",
"multiformats": "9.6.5",
"loglevel": "1.8.1",
"multiformats": "9.9.0",
"peer-id": "0.16.0",
"platform": "^1.3.6",
"rxjs": "^7.5.5",
@ -8160,6 +8186,11 @@
"uint8arrays": "^3.0.0"
}
},
"loglevel": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz",
"integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg=="
},
"node-forge": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
@ -8180,9 +8211,9 @@
}
},
"@fluencelabs/fluence-network-environment": {
"version": "1.0.13",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence-network-environment/-/fluence-network-environment-1.0.13.tgz",
"integrity": "sha512-2pci3T0sUHE08jwEs1r/vHKVT4XUh/A3j/QJ0eIhddsxyIjEksjdn05X7DF6STD14CF8GgBVOJEPgav8qaUMpA=="
"version": "1.0.14",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence-network-environment/-/fluence-network-environment-1.0.14.tgz",
"integrity": "sha512-lMiH+7obmJW2Q+PMUR/vNAuX6TcVqlKmsWAHvnBogH7s8IeMT+UGN8qrweILWmE57G7MfauB302dIFQowR9tug=="
},
"@fluencelabs/interfaces": {
"version": "0.1.0",
@ -9008,9 +9039,9 @@
"integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="
},
"async": {
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz",
"integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g=="
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
"integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
},
"asynckit": {
"version": "0.4.0",
@ -12093,9 +12124,9 @@
}
},
"multiformats": {
"version": "9.6.5",
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.6.5.tgz",
"integrity": "sha512-vMwf/FUO+qAPvl3vlSZEgEVFY/AxeZq5yg761ScF3CZsXgmTi/HGkicUiNN0CI4PW8FiY2P0OLklOcmQjdQJhw=="
"version": "9.9.0",
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz",
"integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg=="
},
"multihashes": {
"version": "4.0.3",

View File

@ -13,8 +13,8 @@
"package-lock.json"
],
"dependencies": {
"@fluencelabs/fluence": "^0.27.0",
"@fluencelabs/fluence-network-environment": "1.0.13",
"@fluencelabs/fluence": "^0.28.0",
"@fluencelabs/fluence-network-environment": "1.0.14",
"it-all": "^1.0.5"
},
"scripts": {
@ -41,7 +41,7 @@
},
"homepage": "git+https://github.com/fluencelabs/examples/aqua-examples/price-oracle#readme",
"devDependencies": {
"@fluencelabs/aqua": "0.8.0-368",
"@fluencelabs/aqua": "0.10.3",
"@fluencelabs/aqua-lib": "0.6.0",
"@types/jest": "^27.0.3",
"chokidar-cli": "^3.0.0",

View File

@ -9,8 +9,8 @@
"version": "0.1.0",
"hasInstallScript": true,
"dependencies": {
"@fluencelabs/fluence": "0.27.5",
"@fluencelabs/fluence-network-environment": "1.0.13",
"@fluencelabs/fluence": "0.28.0",
"@fluencelabs/fluence-network-environment": "1.0.14",
"@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^11.2.7",
"@testing-library/user-event": "^12.8.3",
@ -25,7 +25,7 @@
"web-vitals": "^1.1.2"
},
"devDependencies": {
"@fluencelabs/aqua": "0.8.0-368",
"@fluencelabs/aqua": "0.10.3",
"@types/jest-environment-puppeteer": "^4.4.1",
"@types/puppeteer": "^5.4.4",
"@types/serve-handler": "^6.1.1",
@ -2116,14 +2116,14 @@
}
},
"node_modules/@fluencelabs/aqua": {
"version": "0.8.0-368",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.8.0-368.tgz",
"integrity": "sha512-vnqgjwJWa2XvNqGUCITvkhIiF7ps9WhZL4GfvtuSwVAsdpDaYGtxPH63wcYcG9TwRCr7nGgjOhJGXhkmGhUE2w==",
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.10.3.tgz",
"integrity": "sha512-v7Jy+KzZkUm7NuUgrp7UQ8gxuhykxuTU3JigCdxiZMcG3/zD+OtHzsSggVLxVjDP7CKuTcjEKZSCxObwHp/Tpw==",
"dev": true,
"dependencies": {
"@fluencelabs/aqua-ipfs": "0.5.8",
"@fluencelabs/aqua-ipfs": "0.5.9",
"@fluencelabs/aqua-lib": "0.6.0",
"@fluencelabs/fluence": "0.27.4",
"@fluencelabs/fluence": "0.28.0",
"@fluencelabs/fluence-network-environment": "1.0.13",
"ipfs-http-client": "50.1.2"
},
@ -2133,9 +2133,9 @@
}
},
"node_modules/@fluencelabs/aqua-ipfs": {
"version": "0.5.8",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-ipfs/-/aqua-ipfs-0.5.8.tgz",
"integrity": "sha512-jKlyGBm8oJAIQ3Ags58oJ8QVTlCYSvZQVTnX2SnugGXWVwt4+9qtqtvNT5MvWKK3M9lCFDbJJy/qVTjzPJlaiw==",
"version": "0.5.9",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-ipfs/-/aqua-ipfs-0.5.9.tgz",
"integrity": "sha512-Vg7pYv4gEreOKfvzKEL5FchGqSKwat7JyKpqJO6h+FC5S1bl76UkI507+ExhijmUbQGznop8G33XFxyUi6q5SQ==",
"dev": true,
"dependencies": {
"@fluencelabs/aqua-lib": "^0.5.2"
@ -2153,87 +2153,16 @@
"integrity": "sha512-ifjtCM93KO3LhzPkMxqmXhwLmrg/scjOiyTihEVg7ns5N+BVzaK1eWzdOdqGdl9ZVoah43pdlQUepEo7VdRmsw==",
"dev": true
},
"node_modules/@fluencelabs/aqua/node_modules/@fluencelabs/fluence": {
"version": "0.27.4",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.27.4.tgz",
"integrity": "sha512-f85q8ZdmPlUd6uIgmS0CDTvSsb+TGvTqOljw0b161lfEuqPIXrjxJSt0/2Lyh2eEZ1P3slOka1tbVw01nVrt5w==",
"dev": true,
"dependencies": {
"@fluencelabs/avm": "0.31.10",
"@fluencelabs/connection": "0.2.0",
"@fluencelabs/interfaces": "0.1.0",
"@fluencelabs/keypair": "0.2.0",
"@fluencelabs/marine-js": "0.3.37",
"async": "3.2.3",
"base64-js": "^1.5.1",
"browser-or-node": "2.0.0",
"bs58": "5.0.0",
"buffer": "^6.0.3",
"cids": "1.1.9",
"loglevel": "1.8.0",
"multiformats": "9.6.5",
"peer-id": "0.16.0",
"platform": "^1.3.6",
"rxjs": "^7.5.5",
"ts-pattern": "3.3.3",
"uuid": "8.3.2"
},
"bin": {
"copy-marine": "dist/tools/copyMarine.js"
},
"engines": {
"node": ">=10",
"pnpm": ">=3"
}
},
"node_modules/@fluencelabs/aqua/node_modules/libp2p-crypto": {
"version": "0.21.2",
"resolved": "https://registry.npmjs.org/libp2p-crypto/-/libp2p-crypto-0.21.2.tgz",
"integrity": "sha512-EXFrhSpiHtJ+/L8xXDvQNK5VjUMG51u878jzZcaT5XhuN/zFg6PWJFnl/qB2Y2j7eMWnvCRP7Kp+ua2H36cG4g==",
"dev": true,
"dependencies": {
"@noble/ed25519": "^1.5.1",
"@noble/secp256k1": "^1.3.0",
"err-code": "^3.0.1",
"iso-random-stream": "^2.0.0",
"multiformats": "^9.4.5",
"node-forge": "^1.2.1",
"protobufjs": "^6.11.2",
"uint8arrays": "^3.0.0"
},
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/@fluencelabs/aqua/node_modules/node-forge": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
"integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
"dev": true,
"engines": {
"node": ">= 6.13.0"
}
},
"node_modules/@fluencelabs/aqua/node_modules/peer-id": {
"version": "0.16.0",
"resolved": "https://registry.npmjs.org/peer-id/-/peer-id-0.16.0.tgz",
"integrity": "sha512-EmL7FurFUduU9m1PS9cfJ5TAuCvxKQ7DKpfx3Yj6IKWyBRtosriFuOag/l3ni/dtPgPLwiA4R9IvpL7hsDLJuQ==",
"dev": true,
"dependencies": {
"class-is": "^1.1.0",
"libp2p-crypto": "^0.21.0",
"multiformats": "^9.4.5",
"protobufjs": "^6.10.2",
"uint8arrays": "^3.0.0"
},
"engines": {
"node": ">=15.0.0"
}
"node_modules/@fluencelabs/aqua/node_modules/@fluencelabs/fluence-network-environment": {
"version": "1.0.13",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence-network-environment/-/fluence-network-environment-1.0.13.tgz",
"integrity": "sha512-2pci3T0sUHE08jwEs1r/vHKVT4XUh/A3j/QJ0eIhddsxyIjEksjdn05X7DF6STD14CF8GgBVOJEPgav8qaUMpA==",
"dev": true
},
"node_modules/@fluencelabs/avm": {
"version": "0.31.10",
"resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.31.10.tgz",
"integrity": "sha512-tkpjdHyRmsTwAEZCJt15//jXEgC2Nw2qFiD1NenvK127SlgKeuzQU9IMReUYY3dowb2IGeC578/uGMu96jHYKw=="
"version": "0.35.3",
"resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.35.3.tgz",
"integrity": "sha512-Y5mPPCmAUUKc5CDO12IL8mGEreWa7maVdX0MWCAH4+GvfLPFN1FxOMSKRYEtvkyVEL88pc9pd8cm5IRCBkFthg=="
},
"node_modules/@fluencelabs/connection": {
"version": "0.2.0",
@ -2301,11 +2230,11 @@
}
},
"node_modules/@fluencelabs/fluence": {
"version": "0.27.5",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.27.5.tgz",
"integrity": "sha512-nMCzd/oHHk5/yWdg/+rPB+sc8X+fQ5YgwPhGVDoxFs8/CmIr1G5Na8Y6l8rrigasgQd+LV5GtAyh50Oq7/IXkg==",
"version": "0.28.0",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.28.0.tgz",
"integrity": "sha512-SXb2vjTj8m/nw4jEILV0tu9VIFprGo8mNb2nOB5btxdsOI8GzQZkpGzTLrSd/+UagIo2GdxAu0GhBP8dxZXaqg==",
"dependencies": {
"@fluencelabs/avm": "0.31.10",
"@fluencelabs/avm": "0.35.3",
"@fluencelabs/connection": "0.2.0",
"@fluencelabs/interfaces": "0.1.0",
"@fluencelabs/keypair": "0.2.0",
@ -2333,14 +2262,9 @@
}
},
"node_modules/@fluencelabs/fluence-network-environment": {
"version": "1.0.13",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence-network-environment/-/fluence-network-environment-1.0.13.tgz",
"integrity": "sha512-2pci3T0sUHE08jwEs1r/vHKVT4XUh/A3j/QJ0eIhddsxyIjEksjdn05X7DF6STD14CF8GgBVOJEPgav8qaUMpA=="
},
"node_modules/@fluencelabs/fluence/node_modules/async": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
"integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
"version": "1.0.14",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence-network-environment/-/fluence-network-environment-1.0.14.tgz",
"integrity": "sha512-lMiH+7obmJW2Q+PMUR/vNAuX6TcVqlKmsWAHvnBogH7s8IeMT+UGN8qrweILWmE57G7MfauB302dIFQowR9tug=="
},
"node_modules/@fluencelabs/fluence/node_modules/libp2p-crypto": {
"version": "0.21.2",
@ -2372,11 +2296,6 @@
"url": "https://tidelift.com/funding/github/npm/loglevel"
}
},
"node_modules/@fluencelabs/fluence/node_modules/multiformats": {
"version": "9.9.0",
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz",
"integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg=="
},
"node_modules/@fluencelabs/fluence/node_modules/node-forge": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
@ -5179,9 +5098,9 @@
"integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0="
},
"node_modules/async": {
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz",
"integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g=="
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
"integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
},
"node_modules/async-foreach": {
"version": "0.1.3",
@ -14240,9 +14159,9 @@
"integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg=="
},
"node_modules/multiformats": {
"version": "9.6.5",
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.6.5.tgz",
"integrity": "sha512-vMwf/FUO+qAPvl3vlSZEgEVFY/AxeZq5yg761ScF3CZsXgmTi/HGkicUiNN0CI4PW8FiY2P0OLklOcmQjdQJhw=="
"version": "9.9.0",
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz",
"integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg=="
},
"node_modules/multihashes": {
"version": "4.0.3",
@ -22600,14 +22519,14 @@
}
},
"@fluencelabs/aqua": {
"version": "0.8.0-368",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.8.0-368.tgz",
"integrity": "sha512-vnqgjwJWa2XvNqGUCITvkhIiF7ps9WhZL4GfvtuSwVAsdpDaYGtxPH63wcYcG9TwRCr7nGgjOhJGXhkmGhUE2w==",
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua/-/aqua-0.10.3.tgz",
"integrity": "sha512-v7Jy+KzZkUm7NuUgrp7UQ8gxuhykxuTU3JigCdxiZMcG3/zD+OtHzsSggVLxVjDP7CKuTcjEKZSCxObwHp/Tpw==",
"dev": true,
"requires": {
"@fluencelabs/aqua-ipfs": "0.5.8",
"@fluencelabs/aqua-ipfs": "0.5.9",
"@fluencelabs/aqua-lib": "0.6.0",
"@fluencelabs/fluence": "0.27.4",
"@fluencelabs/fluence": "0.28.0",
"@fluencelabs/fluence-network-environment": "1.0.13",
"ipfs-http-client": "50.1.2"
},
@ -22618,73 +22537,18 @@
"integrity": "sha512-ifjtCM93KO3LhzPkMxqmXhwLmrg/scjOiyTihEVg7ns5N+BVzaK1eWzdOdqGdl9ZVoah43pdlQUepEo7VdRmsw==",
"dev": true
},
"@fluencelabs/fluence": {
"version": "0.27.4",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.27.4.tgz",
"integrity": "sha512-f85q8ZdmPlUd6uIgmS0CDTvSsb+TGvTqOljw0b161lfEuqPIXrjxJSt0/2Lyh2eEZ1P3slOka1tbVw01nVrt5w==",
"dev": true,
"requires": {
"@fluencelabs/avm": "0.31.10",
"@fluencelabs/connection": "0.2.0",
"@fluencelabs/interfaces": "0.1.0",
"@fluencelabs/keypair": "0.2.0",
"@fluencelabs/marine-js": "0.3.37",
"async": "3.2.3",
"base64-js": "^1.5.1",
"browser-or-node": "2.0.0",
"bs58": "5.0.0",
"buffer": "^6.0.3",
"cids": "1.1.9",
"loglevel": "1.8.0",
"multiformats": "9.6.5",
"peer-id": "0.16.0",
"platform": "^1.3.6",
"rxjs": "^7.5.5",
"ts-pattern": "3.3.3",
"uuid": "8.3.2"
}
},
"libp2p-crypto": {
"version": "0.21.2",
"resolved": "https://registry.npmjs.org/libp2p-crypto/-/libp2p-crypto-0.21.2.tgz",
"integrity": "sha512-EXFrhSpiHtJ+/L8xXDvQNK5VjUMG51u878jzZcaT5XhuN/zFg6PWJFnl/qB2Y2j7eMWnvCRP7Kp+ua2H36cG4g==",
"dev": true,
"requires": {
"@noble/ed25519": "^1.5.1",
"@noble/secp256k1": "^1.3.0",
"err-code": "^3.0.1",
"iso-random-stream": "^2.0.0",
"multiformats": "^9.4.5",
"node-forge": "^1.2.1",
"protobufjs": "^6.11.2",
"uint8arrays": "^3.0.0"
}
},
"node-forge": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
"integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
"@fluencelabs/fluence-network-environment": {
"version": "1.0.13",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence-network-environment/-/fluence-network-environment-1.0.13.tgz",
"integrity": "sha512-2pci3T0sUHE08jwEs1r/vHKVT4XUh/A3j/QJ0eIhddsxyIjEksjdn05X7DF6STD14CF8GgBVOJEPgav8qaUMpA==",
"dev": true
},
"peer-id": {
"version": "0.16.0",
"resolved": "https://registry.npmjs.org/peer-id/-/peer-id-0.16.0.tgz",
"integrity": "sha512-EmL7FurFUduU9m1PS9cfJ5TAuCvxKQ7DKpfx3Yj6IKWyBRtosriFuOag/l3ni/dtPgPLwiA4R9IvpL7hsDLJuQ==",
"dev": true,
"requires": {
"class-is": "^1.1.0",
"libp2p-crypto": "^0.21.0",
"multiformats": "^9.4.5",
"protobufjs": "^6.10.2",
"uint8arrays": "^3.0.0"
}
}
}
},
"@fluencelabs/aqua-ipfs": {
"version": "0.5.8",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-ipfs/-/aqua-ipfs-0.5.8.tgz",
"integrity": "sha512-jKlyGBm8oJAIQ3Ags58oJ8QVTlCYSvZQVTnX2SnugGXWVwt4+9qtqtvNT5MvWKK3M9lCFDbJJy/qVTjzPJlaiw==",
"version": "0.5.9",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-ipfs/-/aqua-ipfs-0.5.9.tgz",
"integrity": "sha512-Vg7pYv4gEreOKfvzKEL5FchGqSKwat7JyKpqJO6h+FC5S1bl76UkI507+ExhijmUbQGznop8G33XFxyUi6q5SQ==",
"dev": true,
"requires": {
"@fluencelabs/aqua-lib": "^0.5.2"
@ -22697,9 +22561,9 @@
"dev": true
},
"@fluencelabs/avm": {
"version": "0.31.10",
"resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.31.10.tgz",
"integrity": "sha512-tkpjdHyRmsTwAEZCJt15//jXEgC2Nw2qFiD1NenvK127SlgKeuzQU9IMReUYY3dowb2IGeC578/uGMu96jHYKw=="
"version": "0.35.3",
"resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.35.3.tgz",
"integrity": "sha512-Y5mPPCmAUUKc5CDO12IL8mGEreWa7maVdX0MWCAH4+GvfLPFN1FxOMSKRYEtvkyVEL88pc9pd8cm5IRCBkFthg=="
},
"@fluencelabs/connection": {
"version": "0.2.0",
@ -22756,11 +22620,11 @@
}
},
"@fluencelabs/fluence": {
"version": "0.27.5",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.27.5.tgz",
"integrity": "sha512-nMCzd/oHHk5/yWdg/+rPB+sc8X+fQ5YgwPhGVDoxFs8/CmIr1G5Na8Y6l8rrigasgQd+LV5GtAyh50Oq7/IXkg==",
"version": "0.28.0",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.28.0.tgz",
"integrity": "sha512-SXb2vjTj8m/nw4jEILV0tu9VIFprGo8mNb2nOB5btxdsOI8GzQZkpGzTLrSd/+UagIo2GdxAu0GhBP8dxZXaqg==",
"requires": {
"@fluencelabs/avm": "0.31.10",
"@fluencelabs/avm": "0.35.3",
"@fluencelabs/connection": "0.2.0",
"@fluencelabs/interfaces": "0.1.0",
"@fluencelabs/keypair": "0.2.0",
@ -22780,11 +22644,6 @@
"uuid": "8.3.2"
},
"dependencies": {
"async": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
"integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
},
"libp2p-crypto": {
"version": "0.21.2",
"resolved": "https://registry.npmjs.org/libp2p-crypto/-/libp2p-crypto-0.21.2.tgz",
@ -22805,11 +22664,6 @@
"resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz",
"integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg=="
},
"multiformats": {
"version": "9.9.0",
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz",
"integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg=="
},
"node-forge": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
@ -22830,9 +22684,9 @@
}
},
"@fluencelabs/fluence-network-environment": {
"version": "1.0.13",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence-network-environment/-/fluence-network-environment-1.0.13.tgz",
"integrity": "sha512-2pci3T0sUHE08jwEs1r/vHKVT4XUh/A3j/QJ0eIhddsxyIjEksjdn05X7DF6STD14CF8GgBVOJEPgav8qaUMpA=="
"version": "1.0.14",
"resolved": "https://registry.npmjs.org/@fluencelabs/fluence-network-environment/-/fluence-network-environment-1.0.14.tgz",
"integrity": "sha512-lMiH+7obmJW2Q+PMUR/vNAuX6TcVqlKmsWAHvnBogH7s8IeMT+UGN8qrweILWmE57G7MfauB302dIFQowR9tug=="
},
"@fluencelabs/interfaces": {
"version": "0.1.0",
@ -25043,9 +24897,9 @@
"integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0="
},
"async": {
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz",
"integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g=="
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
"integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
},
"async-foreach": {
"version": "0.1.3",
@ -32137,9 +31991,9 @@
}
},
"multiformats": {
"version": "9.6.5",
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.6.5.tgz",
"integrity": "sha512-vMwf/FUO+qAPvl3vlSZEgEVFY/AxeZq5yg761ScF3CZsXgmTi/HGkicUiNN0CI4PW8FiY2P0OLklOcmQjdQJhw=="
"version": "9.9.0",
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz",
"integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg=="
},
"multihashes": {
"version": "4.0.3",

View File

@ -3,8 +3,8 @@
"version": "0.1.0",
"private": true,
"dependencies": {
"@fluencelabs/fluence": "0.27.5",
"@fluencelabs/fluence-network-environment": "1.0.13",
"@fluencelabs/fluence": "0.28.0",
"@fluencelabs/fluence-network-environment": "1.0.14",
"@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^11.2.7",
"@testing-library/user-event": "^12.8.3",
@ -52,7 +52,7 @@
},
"devDependencies": {
"@types/serve-handler": "^6.1.1",
"@fluencelabs/aqua": "0.8.0-368",
"@fluencelabs/aqua": "0.10.3",
"@types/jest-environment-puppeteer": "^4.4.1",
"@types/puppeteer": "^5.4.4",
"chokidar-cli": "^2.1.0",

View File

@ -15,7 +15,7 @@ marine-rs-sdk = { version = "0.7.1", features = ["logger"] }
log = "0.4.14"
[dev-dependencies]
marine-rs-sdk-test = "0.8.1"
marine-rs-sdk-test = "0.8.2"
[dev]
[profile.release]

File diff suppressed because it is too large Load Diff

View File

@ -17,7 +17,7 @@ ecvrf = "0.4.3"
zeroize = "1.5.7"
[dev-dependencies]
marine-rs-sdk-test = "0.8.1"
marine-rs-sdk-test = "0.8.2"
[dev]
[profile.release]

View File

@ -15,7 +15,7 @@ marine-rs-sdk = { version = "0.7.1", features = ["logger"] }
log = "0.4.14"
[dev-dependencies]
marine-rs-sdk-test = "0.8.1"
marine-rs-sdk-test = "0.8.2"
[dev]
[profile.release]

View File

@ -15,7 +15,7 @@ marine-rs-sdk = { version = "0.7.1", features = ["logger"] }
log = "0.4.14"
[dev-dependencies]
marine-rs-sdk-test = "0.8.1"
marine-rs-sdk-test = "0.8.2"
[dev]
[profile.release]

View File

@ -14,7 +14,7 @@ marine-rs-sdk = { version = "0.7.1", features = ["logger"] }
log = "0.4.14"
[dev-dependencies]
marine-rs-sdk-test = "0.8.1"
marine-rs-sdk-test = "0.8.2"
[dev]
[profile.release]

View File

@ -12,7 +12,7 @@ Community members have been coding incredible peer-ro-pper applications and solu
* [Web3](https://github.com/ntrotner/web3-exposed-to-fluence) is a Fluence and Aqua wrapper around [web3js](https://github.com/ChainSafe/web3.js), the "original" Ethereum SDK, for use with Aqua. See[documentation](https://github.com/ntrotner/web3-exposed-to-fluence/tree/main/src/aqua/doc) for detailed documentation and [tests](https://github.com/ntrotner/web3-exposed-to-fluence/tree/main/tests) for examples.
* Uses Fluence JS
* [Ethereum and Elasticsearch](https://github.com/Joera/gitcoin11-fluence) is a project aiming to use Wasm for a variety of uses in Web3 ecosystem using Fluence and Aqua possibly in response to DAO directives. THe project is WIP but chockfull of great examples on how to use Fluence and Aqua in a larger Web3 project.
* [Ethereum and Elasticsearch](https://github.com/Joera/Public-Record-DAO) is a project aiming to use Wasm for a variety of uses in Web3 ecosystem using Fluence and Aqua possibly in response to DAO directives. THe project is WIP but chockfull of great examples on how to use Fluence and Aqua in a larger Web3 project.
* Uses Marine Wasm
* [Fluence Tronweb](https://github.com/visdauas/fluence-tronweb) is a wrapper around [TronWeb](https://github.com/tronprotocol/tronweb) -- a Javascript library for the [Tron network](https://tron.network/). Not only a great way to use Aqua to interact with all things Tron but laos a great starting point to build your own SDK wrapper.

View File

@ -1,147 +0,0 @@
# Getting Started with Fluence
This sample project demonstrates how fluence network can be accessed from the browser. As an example it retrieves the timestamp of the current time from the relay node. The project is based on an create-react-app template with slight modifications to integrate Fluence. The primary focus is the integration itself, i.e React could be swapped with a framework of your choice.
## Getting started
Run aqua compiler in watch mode:
```bash
npm run watch-aqua
```
Start the application
```bash
npm start
```
The browser window with `localhost:3000` should open
## How it works
The application can be split into two main building blocks: the runtime provided by the `@fluencelabs/fluence` package and the compiler for the `Aqua` language. The workflow is as follows:
1. You write aqua code
2. Aqua gets compiled into the typescript file
3. The typescript is build by the webpack (or any other tool of you choice) into js bunlde.
## Project structure
```
aqua (1)
┗ getting-started.aqua (3)
node_modules
public
src
┣ _aqua (2)
┃ ┗ getting-started.ts (4)
┣ App.scss
┣ App.tsx
┣ index.css
┣ index.tsx
┣ logo.svg
┗ react-app-env.d.ts
package-lock.json
package.json
tsconfig.json
```
The project structure is based on the create-react-app template with some minor differences:
* `aqua` (1) contains the Aqua source code files. The complier picks them up and generate corresponding typescript file. See `getting-started.aqua` (3) and `getting-started.ts` respectively
* `src/_aqua` (2) is where the generated target files are places. The target directory is conveniently placed inside the sources directory which makes it easy to import typescript functions from the application source code
## npm packages and scripts
The following npm packages are used:
* `@fluencelabs/fluence` - is the client for Fluence Network running inside the browser. See https://github.com/fluencelabs/fluence-js for additional information
* `@fluencelabs/fluence-network-environment` - is the maintained list of Fluence networks and nodes to connect to.
* `@fluencelabs/aqua` - is the command line interface for Aqua compiler. See https://github.com/fluencelabs/aqua for more information
* `@fluencelabs/aqua-lib` - Aqua language standard library
* `chokidar-cli` - A tool to watch for aqua file changes and compile them on the fly
The compilation of aqua code is implemented with these scripts:
```
scripts: {
...
"compile-aqua": "aqua -i ./aqua/ -o ./src/_aqua",
"watch-aqua": "chokidar \"**/*.aqua\" -c \"npm run compile-aqua\""
}
...
```
The interface is pretty straightforward: you just specify the input and output directories for the compiler.
## Aqua code
```
import "@fluencelabs/aqua-lib/builtin.aqua"
func getRelayTime(relayPeerId: PeerId) -> u64: (1)
on relayPeerId: (2)
ts <- Peer.timestamp_ms() (3)
<- ts (4)
```
The code above defines a function which retrieves the current timestamp from the relay node. The function works as following:
1. The function definition, specifying arguments and return value types
2. Shift the execution to the peer with id equal to `relayPeerId`
3. Calls built-in function on the current peer and stores the result into a variable
4. Returns the result
The function gets compiled into typescript and can be called from the application code (see next section)
## Application code
Let's take a look at how we can use Fluence from typecript.
First, we need to import the relevant packages:
```typescript
import { createClient, FluenceClient } from "@fluencelabs/fluence";
import { krasnodar } from "@fluencelabs/fluence-network-environment";
import { getRelayTime } from "./_aqua/getting-started";
```
Please notice that the function defined in Aqua has been compiled into typescript and can be directly imported. Using the code generated by the compiler is as easy as calling a function. The compiler generates all the boilerplate needed to send a particle into the network and wraps it into a single call. Note that all the type information and therefore type checking and code completion facilities are there!
Next we initialize the client:
```typescript
const relayNode = krasnodar[0];
function App() {
const [client, setClient] = useState<FluenceClient | null>(null);
...
useEffect(() => {
createClient(relayNode)
.then((client) => setClient(client))
.catch((err) => console.log("Client initialization failed", err));
}, [client]);
```
Every peer running in the browser must connect to the network through a relay node. We use the first node of the krasnodar network there. In our example we store the client using React `useState` facilities. Feel free to store wherever you store other application state.
Executing Aqua is as easy as calling a function in typesctipt:
```typescript
const doGetRelayTime = async () => {
if (!client) {
return;
}
const time = await getRelayTime(client, relayNode.peerId);
setRelayTime(new Date(time));
};
```

View File

@ -1,52 +0,0 @@
import React, { useEffect, useState } from "react";
import logo from "./logo.svg";
import "./App.scss";
import { Fluence } from "@fluencelabs/fluence";
import { krasnodar } from "@fluencelabs/fluence-network-environment";
import { getRelayTime } from "./_aqua/getting-started";
const relayNode = krasnodar[0];
function App() {
const [relayTime, setRelayTime] = useState<Date | null>(null);
useEffect(() => {
Fluence.start({ connectTo: relayNode })
.catch((err) => console.log("Client initialization failed", err));
}, []);
const onGetRelayTimeBtnClick = async () => {
if (!Fluence.getStatus().isConnected) {
return;
}
const time = await getRelayTime(relayNode.peerId);
setRelayTime(new Date(time));
};
return (
<div className="App">
<header>
<img src={logo} className="logo" alt="logo" />
</header>
<div className="content">
<h1>Status: <span id="status">{Fluence.getStatus().isConnected ? "Connected" : "Disconnected"}</span></h1>
<button id="btn" className="btn" onClick={onGetRelayTimeBtnClick}>
Get relay time
</button>
{relayTime && (
<>
<h2>Relay time:</h2>
<div id="relayTime">{relayTime?.toLocaleString() || ""}</div>
</>
)}
</div>
</div>
);
}
export default App;

View File

@ -1,12 +0,0 @@
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('root')
);

View File

@ -1,5 +0,0 @@
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
testPathIgnorePatterns: ['dist'],
};

File diff suppressed because it is too large Load Diff

View File

@ -1,31 +0,0 @@
{
"name": "hello-world",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"prestart": "npm run compile-aqua",
"prebuild": "npm run compile-aqua",
"start": "node -r ts-node/register src/index.ts",
"build": "tsc",
"test": "jest",
"compile-aqua": "aqua --import . -i ./aqua/ -o ./src/_aqua",
"watch-aqua": "chokidar \"**/*.aqua\" -c \"npm run compile-aqua\""
},
"author": "",
"license": "ISC",
"devDependencies": {
"@fluencelabs/aqua": "0.8.0-368",
"@fluencelabs/aqua-lib": "0.6.0",
"chokidar-cli": "^3.0.0",
"ts-node": "^10.6.0",
"typescript": "^4.6.3",
"@types/jest": "^27.0.3",
"jest": "^27.4.0",
"ts-jest": "^27.0.7"
},
"dependencies": {
"@fluencelabs/fluence": "^0.27.0",
"@fluencelabs/fluence-network-environment": "^1.0.13"
}
}

View File

@ -1,3 +0,0 @@
import { main } from './main';
main();

View File

@ -1,25 +0,0 @@
{
"compilerOptions": {
"lib": [
"es2015",
"dom"
],
"outDir": "./dist/",
"target": "es5",
"module": "commonjs",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"declaration": true,
"declarationMap": false,
"sourceMap": true,
},
"exclude": [
"node_modules",
"dist"
],
"include": [
"src"
],
}

View File

@ -1,5 +0,0 @@
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
testPathIgnorePatterns: ['dist'],
};

File diff suppressed because it is too large Load Diff

View File

@ -1,30 +0,0 @@
{
"name": "node-example",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"prestart": "npm run compile-aqua",
"prebuild": "npm run compile-aqua",
"start": "node -r ts-node/register src/index.ts",
"test": "jest",
"build": "tsc",
"compile-aqua": "aqua --import . -i ./aqua/ -o ./src/_aqua",
"watch-aqua": "chokidar \"**/*.aqua\" -c \"npm run compile-aqua\""
},
"author": "",
"license": "ISC",
"devDependencies": {
"@fluencelabs/aqua": "0.8.0-368",
"@types/jest": "^27.0.3",
"chokidar-cli": "^3.0.0",
"jest": "^27.4.0",
"ts-jest": "^27.0.7",
"ts-node": "^10.7.0",
"typescript": "^4.6.3"
},
"dependencies": {
"@fluencelabs/fluence": "^0.27.0",
"@fluencelabs/fluence-network-environment": "^1.0.13"
}
}

View File

@ -1,3 +0,0 @@
#! /bin/bash
npx aqua run --input ./aqua/demo-calculation.aqua --func 'demoCalculation()' --addr /dns4/stage.fluence.dev/tcp/19001/wss/p2p/12D3KooWHCJbJKGDfCgHSoCuK9q4STyRnVveqLoXAPBbXHTZx9Cv

View File

@ -1,3 +0,0 @@
import { runServer, waitForKeypressAndStop } from './main';
runServer().then(waitForKeypressAndStop);

View File

@ -1,25 +0,0 @@
{
"compilerOptions": {
"lib": [
"es2015",
"dom"
],
"outDir": "./dist/",
"target": "es5",
"module": "commonjs",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"declaration": true,
"declarationMap": false,
"sourceMap": true,
},
"exclude": [
"node_modules",
"dist"
],
"include": [
"src"
],
}

Some files were not shown because too many files have changed in this diff Show More