From bbb2180f15c040cbff9588c3c1c35b98d9b4dfb1 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 11 Aug 2016 18:25:09 +0200 Subject: [PATCH 0001/1062] initial import from external repo --- js/.babelrc | 5 + js/.codeclimate.yml | 8 + js/.eslintrc.json | 19 + js/.gitignore | 4 + js/.istanbul.yml | 4 + js/.npmignore | 1 + js/.travis.yml | 17 + js/LICENSE | 674 ++++++++++++ js/package.json | 120 +++ js/rollup.library.js | 13 + js/scripts/check-master.sh | 10 + js/scripts/deploy-to-gh-pages.sh | 33 + js/scripts/release.sh | 29 + js/src/abi/README.md | 32 + js/src/abi/abi.js | 4 + js/src/abi/decoder/bytesTaken.js | 14 + js/src/abi/decoder/bytesTaken.spec.js | 13 + js/src/abi/decoder/decodeResult.js | 14 + js/src/abi/decoder/decodeResult.spec.js | 13 + js/src/abi/decoder/decoder.js | 121 +++ js/src/abi/decoder/decoder.spec.js | 296 ++++++ js/src/abi/decoder/index.js | 1 + js/src/abi/encoder/encoder.js | 56 + js/src/abi/encoder/encoder.spec.js | 274 +++++ js/src/abi/encoder/index.js | 1 + js/src/abi/encoder/mediate.js | 126 +++ js/src/abi/encoder/mediate.spec.js | 89 ++ js/src/abi/index.js | 1 + js/src/abi/spec/constructor.js | 20 + js/src/abi/spec/constructor.spec.js | 36 + js/src/abi/spec/event/decodedLog.js | 14 + js/src/abi/spec/event/decodedLog.spec.js | 12 + js/src/abi/spec/event/decodedLogParam.js | 29 + js/src/abi/spec/event/decodedLogParam.spec.js | 26 + js/src/abi/spec/event/event.js | 84 ++ js/src/abi/spec/event/event.spec.js | 95 ++ js/src/abi/spec/event/eventParam.js | 25 + js/src/abi/spec/event/eventParam.spec.js | 24 + js/src/abi/spec/event/index.js | 1 + js/src/abi/spec/function.js | 50 + js/src/abi/spec/function.spec.js | 73 ++ js/src/abi/spec/index.js | 1 + js/src/abi/spec/interface.js | 56 + js/src/abi/spec/interface.spec.js | 110 ++ js/src/abi/spec/param.js | 20 + js/src/abi/spec/param.spec.js | 22 + js/src/abi/spec/paramType/format.js | 64 ++ js/src/abi/spec/paramType/format.spec.js | 212 ++++ js/src/abi/spec/paramType/index.js | 1 + js/src/abi/spec/paramType/paramType.js | 31 + js/src/abi/spec/paramType/paramType.spec.js | 63 ++ js/src/abi/spec/paramType/types.js | 2 + js/src/abi/token/index.js | 1 + js/src/abi/token/token.js | 26 + js/src/abi/token/token.spec.js | 59 ++ js/src/abi/util/pad.js | 54 + js/src/abi/util/pad.spec.js | 100 ++ js/src/abi/util/signature.js | 13 + js/src/abi/util/signature.spec.js | 52 + js/src/abi/util/slice.js | 13 + js/src/abi/util/slice.spec.js | 32 + js/src/abi/util/sliceAs.js | 29 + js/src/abi/util/sliceAs.spec.js | 38 + js/src/abi/util/types.js | 11 + js/src/abi/util/types.spec.js | 46 + js/src/api/README.md | 145 +++ js/src/api/api.js | 64 ++ js/src/api/api.spec.js | 31 + js/src/api/contract/contract.js | 162 +++ js/src/api/contract/contract.spec.js | 371 +++++++ js/src/api/contract/index.js | 1 + js/src/api/format/address.js | 49 + js/src/api/format/address.spec.js | 84 ++ js/src/api/format/index.js | 9 + js/src/api/format/input.js | 94 ++ js/src/api/format/input.spec.js | 223 ++++ js/src/api/format/output.js | 112 ++ js/src/api/format/output.spec.js | 231 ++++ js/src/api/format/wei.js | 21 + js/src/api/format/wei.spec.js | 41 + js/src/api/index.js | 1 + js/src/api/rpc/db/db.js | 27 + js/src/api/rpc/db/db.spec.js | 22 + js/src/api/rpc/db/index.js | 1 + js/src/api/rpc/eth/eth.e2e.js | 154 +++ js/src/api/rpc/eth/eth.js | 301 ++++++ js/src/api/rpc/eth/eth.spec.js | 458 ++++++++ js/src/api/rpc/eth/index.js | 1 + js/src/api/rpc/ethcore/ethcore.e2e.js | 61 ++ js/src/api/rpc/ethcore/ethcore.js | 141 +++ js/src/api/rpc/ethcore/ethcore.spec.js | 76 ++ js/src/api/rpc/ethcore/index.js | 1 + js/src/api/rpc/index.js | 8 + js/src/api/rpc/net/index.js | 1 + js/src/api/rpc/net/net.e2e.js | 30 + js/src/api/rpc/net/net.js | 23 + js/src/api/rpc/net/net.spec.js | 20 + js/src/api/rpc/personal/index.js | 1 + js/src/api/rpc/personal/personal.e2e.js | 37 + js/src/api/rpc/personal/personal.js | 63 ++ js/src/api/rpc/personal/personal.spec.js | 81 ++ js/src/api/rpc/shh/index.js | 1 + js/src/api/rpc/shh/shh.js | 55 + js/src/api/rpc/trace/index.js | 1 + js/src/api/rpc/trace/trace.e2e.js | 19 + js/src/api/rpc/trace/trace.js | 27 + js/src/api/rpc/trace/trace.spec.js | 28 + js/src/api/rpc/web3/index.js | 1 + js/src/api/rpc/web3/web3.e2e.js | 28 + js/src/api/rpc/web3/web3.js | 17 + js/src/api/rpc/web3/web3.spec.js | 22 + js/src/api/transport/http/http.e2e.js | 13 + js/src/api/transport/http/http.js | 47 + js/src/api/transport/http/http.spec.js | 106 ++ js/src/api/transport/http/index.js | 1 + js/src/api/transport/index.js | 2 + js/src/api/transport/jsonRpcBase.js | 39 + js/src/api/transport/jsonRpcBase.spec.js | 72 ++ js/src/api/transport/ws/index.js | 1 + js/src/api/transport/ws/ws.e2e.js | 13 + js/src/api/transport/ws/ws.js | 45 + js/src/api/transport/ws/ws.spec.js | 69 ++ js/src/api/util/types.js | 15 + js/src/api/util/types.spec.js | 54 + js/src/app.js | 36 + js/src/images/ethcore-logo-white-square.png | Bin 0 -> 41621 bytes js/src/images/ethereum-32x32.png | Bin 0 -> 635 bytes js/src/index.html | 18 + js/src/index.js | 2 + js/src/jsonrpc/README.md | 20 + js/src/jsonrpc/generator/build-json.js | 51 + js/src/jsonrpc/generator/build-markdown.js | 53 + js/src/jsonrpc/index.js | 19 + js/src/jsonrpc/index.spec.js | 46 + js/src/jsonrpc/interfaces/db.js | 87 ++ js/src/jsonrpc/interfaces/eth.js | 990 ++++++++++++++++++ js/src/jsonrpc/interfaces/ethcore.js | 267 +++++ js/src/jsonrpc/interfaces/net.js | 30 + js/src/jsonrpc/interfaces/personal.js | 195 ++++ js/src/jsonrpc/interfaces/shh.js | 153 +++ js/src/jsonrpc/interfaces/trace.js | 63 ++ js/src/jsonrpc/interfaces/web3.js | 26 + js/src/jsonrpc/rollup.config.js | 12 + js/src/jsonrpc/types.js | 11 + js/src/reset.css | 83 ++ js/src/ui/Account/Actions/actions.js | 27 + js/src/ui/Account/Actions/index.js | 1 + js/src/ui/Account/account.js | 91 ++ js/src/ui/Account/index.js | 1 + .../Accounts/AccountSummary/accountSummary.js | 42 + js/src/ui/Accounts/AccountSummary/index.js | 1 + js/src/ui/Accounts/Actions/actions.js | 39 + js/src/ui/Accounts/Actions/index.js | 1 + js/src/ui/Accounts/accounts.js | 103 ++ js/src/ui/Accounts/index.js | 1 + js/src/ui/Accounts/style.css | 13 + js/src/ui/Application/Status/index.js | 1 + js/src/ui/Application/Status/status.js | 52 + js/src/ui/Application/Status/style.css | 5 + js/src/ui/Application/TabBar/index.js | 1 + js/src/ui/Application/TabBar/tabBar.js | 39 + js/src/ui/Application/application.js | 82 ++ js/src/ui/Application/index.js | 1 + js/src/ui/Application/style.css | 4 + js/src/ui/Apps/apps.js | 9 + js/src/ui/Apps/index.js | 1 + js/src/ui/Balances/balances.js | 67 ++ js/src/ui/Balances/index.js | 1 + js/src/ui/Balances/style.css | 16 + js/src/ui/FirstRun/Completed/completed.js | 19 + js/src/ui/FirstRun/Completed/index.js | 1 + .../FirstRun/CreateAccount/createAccount.js | 80 ++ js/src/ui/FirstRun/CreateAccount/index.js | 1 + js/src/ui/FirstRun/RecoverAccount/index.js | 1 + .../FirstRun/RecoverAccount/recoverAccount.js | 58 + js/src/ui/FirstRun/Welcome/index.js | 1 + js/src/ui/FirstRun/Welcome/welcome.js | 31 + js/src/ui/FirstRun/firstRun.js | 90 ++ js/src/ui/FirstRun/index.js | 1 + js/src/ui/Form/form.js | 24 + js/src/ui/Form/index.js | 1 + js/src/ui/Form/style.css | 15 + js/src/ui/FormWrap/formWrap.js | 17 + js/src/ui/FormWrap/index.js | 1 + js/src/ui/FormWrap/style.css | 7 + js/src/ui/IdentityIcon/identityIcon.js | 41 + js/src/ui/IdentityIcon/index.js | 1 + js/src/ui/IdentityIcon/style.css | 16 + .../AccountDetails/accountDetails.js | 73 ++ js/src/ui/NewAccount/AccountDetails/index.js | 1 + .../NewAccount/CreateAccount/createAccount.js | 212 ++++ js/src/ui/NewAccount/CreateAccount/index.js | 1 + .../NewAccount/CreationType/creationType.js | 43 + js/src/ui/NewAccount/CreationType/index.js | 1 + .../NewAccount/ImportWallet/importWallet.js | 137 +++ js/src/ui/NewAccount/ImportWallet/index.js | 1 + js/src/ui/NewAccount/index.js | 1 + js/src/ui/NewAccount/newAccount.js | 186 ++++ js/src/ui/NewAccount/style.css | 33 + js/src/ui/Overlay/OverlaySteps/index.js | 1 + .../ui/Overlay/OverlaySteps/overlaySteps.js | 38 + js/src/ui/Overlay/OverlaySteps/style.css | 9 + js/src/ui/Overlay/index.js | 1 + js/src/ui/Overlay/overlay.js | 45 + js/src/ui/Tokens/index.js | 1 + js/src/ui/Tokens/tokens.js | 9 + js/test/babel.js | 1 + js/test/e2e/ethapi.js | 17 + js/test/mocha.config.js | 29 + js/test/mocha.opts | 3 + js/test/mockRpc.js | 79 ++ js/test/types.js | 26 + js/webpack.config.js | 142 +++ 213 files changed, 11616 insertions(+) create mode 100644 js/.babelrc create mode 100644 js/.codeclimate.yml create mode 100644 js/.eslintrc.json create mode 100644 js/.gitignore create mode 100644 js/.istanbul.yml create mode 100644 js/.npmignore create mode 100644 js/.travis.yml create mode 100644 js/LICENSE create mode 100644 js/package.json create mode 100644 js/rollup.library.js create mode 100644 js/scripts/check-master.sh create mode 100644 js/scripts/deploy-to-gh-pages.sh create mode 100644 js/scripts/release.sh create mode 100644 js/src/abi/README.md create mode 100644 js/src/abi/abi.js create mode 100644 js/src/abi/decoder/bytesTaken.js create mode 100644 js/src/abi/decoder/bytesTaken.spec.js create mode 100644 js/src/abi/decoder/decodeResult.js create mode 100644 js/src/abi/decoder/decodeResult.spec.js create mode 100644 js/src/abi/decoder/decoder.js create mode 100644 js/src/abi/decoder/decoder.spec.js create mode 100644 js/src/abi/decoder/index.js create mode 100644 js/src/abi/encoder/encoder.js create mode 100644 js/src/abi/encoder/encoder.spec.js create mode 100644 js/src/abi/encoder/index.js create mode 100644 js/src/abi/encoder/mediate.js create mode 100644 js/src/abi/encoder/mediate.spec.js create mode 100644 js/src/abi/index.js create mode 100644 js/src/abi/spec/constructor.js create mode 100644 js/src/abi/spec/constructor.spec.js create mode 100644 js/src/abi/spec/event/decodedLog.js create mode 100644 js/src/abi/spec/event/decodedLog.spec.js create mode 100644 js/src/abi/spec/event/decodedLogParam.js create mode 100644 js/src/abi/spec/event/decodedLogParam.spec.js create mode 100644 js/src/abi/spec/event/event.js create mode 100644 js/src/abi/spec/event/event.spec.js create mode 100644 js/src/abi/spec/event/eventParam.js create mode 100644 js/src/abi/spec/event/eventParam.spec.js create mode 100644 js/src/abi/spec/event/index.js create mode 100644 js/src/abi/spec/function.js create mode 100644 js/src/abi/spec/function.spec.js create mode 100644 js/src/abi/spec/index.js create mode 100644 js/src/abi/spec/interface.js create mode 100644 js/src/abi/spec/interface.spec.js create mode 100644 js/src/abi/spec/param.js create mode 100644 js/src/abi/spec/param.spec.js create mode 100644 js/src/abi/spec/paramType/format.js create mode 100644 js/src/abi/spec/paramType/format.spec.js create mode 100644 js/src/abi/spec/paramType/index.js create mode 100644 js/src/abi/spec/paramType/paramType.js create mode 100644 js/src/abi/spec/paramType/paramType.spec.js create mode 100644 js/src/abi/spec/paramType/types.js create mode 100644 js/src/abi/token/index.js create mode 100644 js/src/abi/token/token.js create mode 100644 js/src/abi/token/token.spec.js create mode 100644 js/src/abi/util/pad.js create mode 100644 js/src/abi/util/pad.spec.js create mode 100644 js/src/abi/util/signature.js create mode 100644 js/src/abi/util/signature.spec.js create mode 100644 js/src/abi/util/slice.js create mode 100644 js/src/abi/util/slice.spec.js create mode 100644 js/src/abi/util/sliceAs.js create mode 100644 js/src/abi/util/sliceAs.spec.js create mode 100644 js/src/abi/util/types.js create mode 100644 js/src/abi/util/types.spec.js create mode 100644 js/src/api/README.md create mode 100644 js/src/api/api.js create mode 100644 js/src/api/api.spec.js create mode 100644 js/src/api/contract/contract.js create mode 100644 js/src/api/contract/contract.spec.js create mode 100644 js/src/api/contract/index.js create mode 100644 js/src/api/format/address.js create mode 100644 js/src/api/format/address.spec.js create mode 100644 js/src/api/format/index.js create mode 100644 js/src/api/format/input.js create mode 100644 js/src/api/format/input.spec.js create mode 100644 js/src/api/format/output.js create mode 100644 js/src/api/format/output.spec.js create mode 100644 js/src/api/format/wei.js create mode 100644 js/src/api/format/wei.spec.js create mode 100644 js/src/api/index.js create mode 100644 js/src/api/rpc/db/db.js create mode 100644 js/src/api/rpc/db/db.spec.js create mode 100644 js/src/api/rpc/db/index.js create mode 100644 js/src/api/rpc/eth/eth.e2e.js create mode 100644 js/src/api/rpc/eth/eth.js create mode 100644 js/src/api/rpc/eth/eth.spec.js create mode 100644 js/src/api/rpc/eth/index.js create mode 100644 js/src/api/rpc/ethcore/ethcore.e2e.js create mode 100644 js/src/api/rpc/ethcore/ethcore.js create mode 100644 js/src/api/rpc/ethcore/ethcore.spec.js create mode 100644 js/src/api/rpc/ethcore/index.js create mode 100644 js/src/api/rpc/index.js create mode 100644 js/src/api/rpc/net/index.js create mode 100644 js/src/api/rpc/net/net.e2e.js create mode 100644 js/src/api/rpc/net/net.js create mode 100644 js/src/api/rpc/net/net.spec.js create mode 100644 js/src/api/rpc/personal/index.js create mode 100644 js/src/api/rpc/personal/personal.e2e.js create mode 100644 js/src/api/rpc/personal/personal.js create mode 100644 js/src/api/rpc/personal/personal.spec.js create mode 100644 js/src/api/rpc/shh/index.js create mode 100644 js/src/api/rpc/shh/shh.js create mode 100644 js/src/api/rpc/trace/index.js create mode 100644 js/src/api/rpc/trace/trace.e2e.js create mode 100644 js/src/api/rpc/trace/trace.js create mode 100644 js/src/api/rpc/trace/trace.spec.js create mode 100644 js/src/api/rpc/web3/index.js create mode 100644 js/src/api/rpc/web3/web3.e2e.js create mode 100644 js/src/api/rpc/web3/web3.js create mode 100644 js/src/api/rpc/web3/web3.spec.js create mode 100644 js/src/api/transport/http/http.e2e.js create mode 100644 js/src/api/transport/http/http.js create mode 100644 js/src/api/transport/http/http.spec.js create mode 100644 js/src/api/transport/http/index.js create mode 100644 js/src/api/transport/index.js create mode 100644 js/src/api/transport/jsonRpcBase.js create mode 100644 js/src/api/transport/jsonRpcBase.spec.js create mode 100644 js/src/api/transport/ws/index.js create mode 100644 js/src/api/transport/ws/ws.e2e.js create mode 100644 js/src/api/transport/ws/ws.js create mode 100644 js/src/api/transport/ws/ws.spec.js create mode 100644 js/src/api/util/types.js create mode 100644 js/src/api/util/types.spec.js create mode 100644 js/src/app.js create mode 100644 js/src/images/ethcore-logo-white-square.png create mode 100644 js/src/images/ethereum-32x32.png create mode 100644 js/src/index.html create mode 100644 js/src/index.js create mode 100644 js/src/jsonrpc/README.md create mode 100644 js/src/jsonrpc/generator/build-json.js create mode 100644 js/src/jsonrpc/generator/build-markdown.js create mode 100644 js/src/jsonrpc/index.js create mode 100644 js/src/jsonrpc/index.spec.js create mode 100644 js/src/jsonrpc/interfaces/db.js create mode 100644 js/src/jsonrpc/interfaces/eth.js create mode 100644 js/src/jsonrpc/interfaces/ethcore.js create mode 100644 js/src/jsonrpc/interfaces/net.js create mode 100644 js/src/jsonrpc/interfaces/personal.js create mode 100644 js/src/jsonrpc/interfaces/shh.js create mode 100644 js/src/jsonrpc/interfaces/trace.js create mode 100644 js/src/jsonrpc/interfaces/web3.js create mode 100644 js/src/jsonrpc/rollup.config.js create mode 100644 js/src/jsonrpc/types.js create mode 100644 js/src/reset.css create mode 100644 js/src/ui/Account/Actions/actions.js create mode 100644 js/src/ui/Account/Actions/index.js create mode 100644 js/src/ui/Account/account.js create mode 100644 js/src/ui/Account/index.js create mode 100644 js/src/ui/Accounts/AccountSummary/accountSummary.js create mode 100644 js/src/ui/Accounts/AccountSummary/index.js create mode 100644 js/src/ui/Accounts/Actions/actions.js create mode 100644 js/src/ui/Accounts/Actions/index.js create mode 100644 js/src/ui/Accounts/accounts.js create mode 100644 js/src/ui/Accounts/index.js create mode 100644 js/src/ui/Accounts/style.css create mode 100644 js/src/ui/Application/Status/index.js create mode 100644 js/src/ui/Application/Status/status.js create mode 100644 js/src/ui/Application/Status/style.css create mode 100644 js/src/ui/Application/TabBar/index.js create mode 100644 js/src/ui/Application/TabBar/tabBar.js create mode 100644 js/src/ui/Application/application.js create mode 100644 js/src/ui/Application/index.js create mode 100644 js/src/ui/Application/style.css create mode 100644 js/src/ui/Apps/apps.js create mode 100644 js/src/ui/Apps/index.js create mode 100644 js/src/ui/Balances/balances.js create mode 100644 js/src/ui/Balances/index.js create mode 100644 js/src/ui/Balances/style.css create mode 100644 js/src/ui/FirstRun/Completed/completed.js create mode 100644 js/src/ui/FirstRun/Completed/index.js create mode 100644 js/src/ui/FirstRun/CreateAccount/createAccount.js create mode 100644 js/src/ui/FirstRun/CreateAccount/index.js create mode 100644 js/src/ui/FirstRun/RecoverAccount/index.js create mode 100644 js/src/ui/FirstRun/RecoverAccount/recoverAccount.js create mode 100644 js/src/ui/FirstRun/Welcome/index.js create mode 100644 js/src/ui/FirstRun/Welcome/welcome.js create mode 100644 js/src/ui/FirstRun/firstRun.js create mode 100644 js/src/ui/FirstRun/index.js create mode 100644 js/src/ui/Form/form.js create mode 100644 js/src/ui/Form/index.js create mode 100644 js/src/ui/Form/style.css create mode 100644 js/src/ui/FormWrap/formWrap.js create mode 100644 js/src/ui/FormWrap/index.js create mode 100644 js/src/ui/FormWrap/style.css create mode 100644 js/src/ui/IdentityIcon/identityIcon.js create mode 100644 js/src/ui/IdentityIcon/index.js create mode 100644 js/src/ui/IdentityIcon/style.css create mode 100644 js/src/ui/NewAccount/AccountDetails/accountDetails.js create mode 100644 js/src/ui/NewAccount/AccountDetails/index.js create mode 100644 js/src/ui/NewAccount/CreateAccount/createAccount.js create mode 100644 js/src/ui/NewAccount/CreateAccount/index.js create mode 100644 js/src/ui/NewAccount/CreationType/creationType.js create mode 100644 js/src/ui/NewAccount/CreationType/index.js create mode 100644 js/src/ui/NewAccount/ImportWallet/importWallet.js create mode 100644 js/src/ui/NewAccount/ImportWallet/index.js create mode 100644 js/src/ui/NewAccount/index.js create mode 100644 js/src/ui/NewAccount/newAccount.js create mode 100644 js/src/ui/NewAccount/style.css create mode 100644 js/src/ui/Overlay/OverlaySteps/index.js create mode 100644 js/src/ui/Overlay/OverlaySteps/overlaySteps.js create mode 100644 js/src/ui/Overlay/OverlaySteps/style.css create mode 100644 js/src/ui/Overlay/index.js create mode 100644 js/src/ui/Overlay/overlay.js create mode 100644 js/src/ui/Tokens/index.js create mode 100644 js/src/ui/Tokens/tokens.js create mode 100644 js/test/babel.js create mode 100644 js/test/e2e/ethapi.js create mode 100644 js/test/mocha.config.js create mode 100644 js/test/mocha.opts create mode 100644 js/test/mockRpc.js create mode 100644 js/test/types.js create mode 100644 js/webpack.config.js diff --git a/js/.babelrc b/js/.babelrc new file mode 100644 index 00000000000..34171cfa006 --- /dev/null +++ b/js/.babelrc @@ -0,0 +1,5 @@ +{ + "presets": ["es2015", "stage-0", "react"], + "plugins": ["transform-runtime", "lodash"], + "retainLines": true +} diff --git a/js/.codeclimate.yml b/js/.codeclimate.yml new file mode 100644 index 00000000000..ca6414f5883 --- /dev/null +++ b/js/.codeclimate.yml @@ -0,0 +1,8 @@ +engines: + eslint: + enabled: true + channel: "eslint-2" + +ratings: + paths: + - "**.js" diff --git a/js/.eslintrc.json b/js/.eslintrc.json new file mode 100644 index 00000000000..5f7f20196b1 --- /dev/null +++ b/js/.eslintrc.json @@ -0,0 +1,19 @@ +{ + "extends": ["semistandard", "standard-react"], + "parser": "babel-eslint", + "env": { + "mocha": true, + "node": true + }, + "globals": { + "expect": true, + "FileReader": true + }, + "rules": { + "object-curly-spacing": ["error", "always"], + "no-debugger": "error", + "no-alert": "error", + "jsx-quotes": ["error", "prefer-single"], + "react/jsx-curly-spacing": ["error", "always"] + } +} diff --git a/js/.gitignore b/js/.gitignore new file mode 100644 index 00000000000..103a01e297a --- /dev/null +++ b/js/.gitignore @@ -0,0 +1,4 @@ +coverage +node_modules +npm-debug.log +build diff --git a/js/.istanbul.yml b/js/.istanbul.yml new file mode 100644 index 00000000000..5fdd3d7dc28 --- /dev/null +++ b/js/.istanbul.yml @@ -0,0 +1,4 @@ +instrumentation: + root: src + extensions: + - .js diff --git a/js/.npmignore b/js/.npmignore new file mode 100644 index 00000000000..5093a29b859 --- /dev/null +++ b/js/.npmignore @@ -0,0 +1 @@ +scripts/ diff --git a/js/.travis.yml b/js/.travis.yml new file mode 100644 index 00000000000..9febddb244f --- /dev/null +++ b/js/.travis.yml @@ -0,0 +1,17 @@ +sudo: false +language: node_js +node_js: + - '5' + +env: + global: + - CXX=g++-4.8 + +cache: + directories: + - node_modules + +script: + - npm run lint + - npm run coveralls + - npm run release diff --git a/js/LICENSE b/js/LICENSE new file mode 100644 index 00000000000..9cecc1d4669 --- /dev/null +++ b/js/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/js/package.json b/js/package.json new file mode 100644 index 00000000000..acbccbb2be0 --- /dev/null +++ b/js/package.json @@ -0,0 +1,120 @@ +{ + "name": "parity.js", + "version": "0.0.1", + "main": "release/index.js", + "jsnext:main": "src/index.js", + "author": "Ethcore Team ", + "maintainers": [ + "Jaco Greeff" + ], + "contributors": [], + "license": "GPL-3.0", + "repository": { + "type": "git", + "url": "git+https://github.com/ethcore/parity.js.git" + }, + "keywords": [ + "Ethereum", + "ABI", + "API", + "Web3", + "RPC", + "Parity", + "Promise" + ], + "scripts": { + "build": "npm run buildLibrary && npm run buildApp", + "buildApp": "webpack", + "buildLibrary": "rollup --config ./rollup.library.js", + "coveralls": "npm run testCoverage && coveralls < coverage/lcov.info", + "lint": "eslint --ignore-path .gitignore ./src/", + "release": "./scripts/release.sh", + "start": "webpack-dev-server -d --history-api-fallback --open --hot --inline --progress --colors --port 3000", + "test": "mocha 'src/**/*.spec.js'", + "testCoverage": "istanbul cover _mocha -- 'src/**/*.spec.js'", + "testE2E": "mocha 'src/**/*.e2e.js'", + "watch": "npm run test -- -w" + }, + "devDependencies": { + "babel-cli": "^6.10.1", + "babel-core": "^6.10.4", + "babel-eslint": "^6.1.2", + "babel-loader": "^6.2.3", + "babel-plugin-lodash": "^3.2.2", + "babel-plugin-transform-runtime": "^6.9.0", + "babel-preset-es2015": "^6.9.0", + "babel-preset-es2015-rollup": "^1.1.1", + "babel-preset-react": "^6.5.0", + "babel-preset-stage-0": "^6.5.0", + "babel-register": "6.9.0", + "babel-runtime": "^6.9.2", + "chai": "^3.5.0", + "chai-enzyme": "0.4.2", + "cheerio": "0.20.0", + "coveralls": "^2.11.11", + "css-loader": "^0.23.1", + "enzyme": "2.3.0", + "eslint": "^3.1.0", + "eslint-config-semistandard": "^6.0.2", + "eslint-config-standard": "^5.3.5", + "eslint-config-standard-react": "^3.0.0", + "eslint-plugin-promise": "^2.0.0", + "eslint-plugin-react": "^5.1.1", + "eslint-plugin-standard": "^2.0.0", + "extract-text-webpack-plugin": "^1.0.1", + "file-loader": "^0.8.5", + "history": "^2.0.0", + "ignore-styles": "2.0.0", + "image-webpack-loader": "^1.8.0", + "istanbul": "^1.0.0-alpha.2", + "jsdom": "9.2.1", + "json-loader": "^0.5.4", + "mocha": "^3.0.0-1", + "mock-local-storage": "1.0.2", + "mock-socket": "^3.0.1", + "nock": "^8.0.0", + "postcss-loader": "^0.8.1", + "react-addons-test-utils": "^15.3.0", + "react-hot-loader": "^1.3.0", + "rollup": "^0.34.1", + "rollup-plugin-babel": "^2.6.1", + "rollup-plugin-commonjs": "^3.3.1", + "rollup-plugin-node-globals": "^1.0.6", + "rollup-plugin-node-resolve": "^2.0.0", + "rollup-plugin-replace": "^1.1.1", + "rollup-plugin-uglify": "^1.0.1", + "rucksack-css": "^0.8.5", + "sass-loader": "^4.0.0", + "sinon": "^1.17.4", + "sinon-chai": "^2.8.0", + "style-loader": "^0.13.0", + "url-loader": "^0.5.7", + "webpack": "^1.12.14", + "webpack-dev-server": "^1.14.1", + "webpack-error-notification": "0.1.6", + "webpack-hot-middleware": "^2.7.1", + "websocket": "^1.0.23" + }, + "dependencies": { + "bignumber.js": "^2.3.0", + "blockies": "0.0.2", + "classnames": "^2.2.3", + "es6-promise": "^3.2.1", + "isomorphic-fetch": "^2.2.1", + "js-sha3": "^0.5.2", + "lodash": "4.11.1", + "material-ui": "^0.15.2", + "react": "^15.2.1", + "react-addons-css-transition-group": "^15.2.1", + "react-dom": "^15.2.1", + "react-redux": "^4.4.5", + "react-router": "^2.6.1", + "react-router-redux": "^4.0.5", + "react-tap-event-plugin": "^1.0.0", + "react-tooltip": "^2.0.3", + "redux": "^3.5.2", + "redux-actions": "^0.10.1", + "utf8": "^2.1.1", + "web3": "^0.17.0-alpha" + } +} diff --git a/js/rollup.library.js b/js/rollup.library.js new file mode 100644 index 00000000000..f21c5d4abbc --- /dev/null +++ b/js/rollup.library.js @@ -0,0 +1,13 @@ +import babel from 'rollup-plugin-babel'; + +export default { + entry: 'src/index.js', + dest: 'release/index.js', + moduleName: 'Parity', + format: 'cjs', + plugins: [babel({ + babelrc: false, + presets: ['es2015-rollup', 'stage-0'], + runtimeHelpers: true + })] +}; diff --git a/js/scripts/check-master.sh b/js/scripts/check-master.sh new file mode 100644 index 00000000000..a3f80d4bd93 --- /dev/null +++ b/js/scripts/check-master.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +PROTECTED_BRANCH='master' +CURRENT_BRANCH=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,') + +if [ $PROTECTED_BRANCH = $CURRENT_BRANCH ]; +then + echo "Direct commits to the branch master are not allowed" + exit 1 +fi diff --git a/js/scripts/deploy-to-gh-pages.sh b/js/scripts/deploy-to-gh-pages.sh new file mode 100644 index 00000000000..4458816355e --- /dev/null +++ b/js/scripts/deploy-to-gh-pages.sh @@ -0,0 +1,33 @@ +#!/bin/bash +# See https://medium.com/@nthgergo/publishing-gh-pages-with-travis-ci-53a8270e87db +set -o errexit + +SOURCE_BRANCH="master" +TARGET_BRANCH="gh-pages" +GIT_USER_EMAIL="admin@travis-ci.org" +GIT_USER_NAME="Travis CI" +SHA=$(git rev-parse --verify HEAD) # reference to commit deployed to TARGET_BRANCH +COMMIT_MSG="Deploy to Github Pages: ${SHA}" + +# Don't deploy if +# 1. Pull request +# 2. Not target branch +# 3. Forked repo + +if [[ ("$TRAVIS_PULL_REQUEST" != "false") || ("$TRAVIS_BRANCH" != "$SOURCE_BRANCH") || ("$TRAVIS_REPO_SLUG" != "$REPO_SLUG") ]]; then + echo 'Not deploying'; + exit 0 +fi + + +# config +git config --global user.email "$GIT_USER_EMAIL" +git config --global user.name "$GIT_USER_NAME" + +# deploy +cd lib +git init +git add . +git commit -m "$COMMIT_MSG" + +git push -f --quiet "https://${GITHUB_TOKEN}@github.com/${REPO_SLUG}.git" $SOURCE_BRANCH:$TARGET_BRANCH > /dev/null 2>&1 diff --git a/js/scripts/release.sh b/js/scripts/release.sh new file mode 100644 index 00000000000..fea2b5d6c2d --- /dev/null +++ b/js/scripts/release.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +set -o errexit + +if [[ ("$TRAVIS_PULL_REQUEST" != "false") || ("$TRAVIS_BRANCH" != "master") ]]; then + exit 0 +fi + +git config --global user.email "admin@travis-ci.org" +git config --global user.name "Travis CI" +git config --global push.default simple +git config credential.helper "store --file=.git/credentials" +echo "https://${GITHUB_TOKEN}:@github.com" > .git/credentials +git checkout master + +DATE=`date` + +npm run build +echo "/* ${DATE} */" >> ./index.js + +git add --force index.js +git commit --message "[CI skip] ${DATE}" + +npm version patch --message "[CI skip] ${DATE} %s" +git push +git push --tags + +echo -e "$NPM_USERNAME\n$NPM_PASSWORD\n$NPM_EMAIL" | npm login +npm publish diff --git a/js/src/abi/README.md b/js/src/abi/README.md new file mode 100644 index 00000000000..6ad6098593b --- /dev/null +++ b/js/src/abi/README.md @@ -0,0 +1,32 @@ +# ethabi-js + +A very early, very POC-type port of [https://github.com/ethcore/ethabi](https://github.com/ethcore/ethabi) to JavaScript + +[![Build Status](https://travis-ci.org/jacogr/ethabi-js.svg?branch=master)](https://travis-ci.org/jacogr/ethabi-js) +[![Coverage Status](https://coveralls.io/repos/github/jacogr/ethabi-js/badge.svg?branch=master)](https://coveralls.io/github/jacogr/ethabi-js?branch=master) +[![Dependency Status](https://david-dm.org/jacogr/ethabi-js.svg)](https://david-dm.org/jacogr/ethabi-js) +[![devDependency Status](https://david-dm.org/jacogr/ethabi-js/dev-status.svg)](https://david-dm.org/jacogr/ethabi-js#info=devDependencies) + +## contributing + +Clone the repo and install dependencies via `npm install`. Tests can be executed via + +- `npm run testOnce` (100% covered unit tests) + +## installation + +Install the package with `npm install --save ethabi-js` from the [npm registry ethabi-js](https://www.npmjs.com/package/ethabi-js) + + +## implementation +### approach + +- this version tries to stay as close to the original Rust version in intent, function names & purpose +- it is a basic port of the Rust version, relying on effectively the same test-suite (expanded where deemed appropriate) +- it is meant as a library to be used in other projects, i.e. [ethapi-js](https://www.npmjs.com/package/ethapi-js) + +### differences to original Rust version + +- internally the library operates on string binary representations as opposed to Vector bytes, lengths are therefore 64 bytes as opposed to 32 bytes +- function names are adapted from the Rust standard snake_case to the JavaScript standard camelCase +- due to the initial library focus, the cli component (as implemented by the original) is not supported nor mplemented diff --git a/js/src/abi/abi.js b/js/src/abi/abi.js new file mode 100644 index 00000000000..2c2b2813034 --- /dev/null +++ b/js/src/abi/abi.js @@ -0,0 +1,4 @@ +import Interface from './spec/interface'; + +export default class Abi extends Interface { +} diff --git a/js/src/abi/decoder/bytesTaken.js b/js/src/abi/decoder/bytesTaken.js new file mode 100644 index 00000000000..8224a08c4b4 --- /dev/null +++ b/js/src/abi/decoder/bytesTaken.js @@ -0,0 +1,14 @@ +export default class BytesTaken { + constructor (bytes, newOffset) { + this._bytes = bytes; + this._newOffset = newOffset; + } + + get bytes () { + return this._bytes; + } + + get newOffset () { + return this._newOffset; + } +} diff --git a/js/src/abi/decoder/bytesTaken.spec.js b/js/src/abi/decoder/bytesTaken.spec.js new file mode 100644 index 00000000000..32392e06f1f --- /dev/null +++ b/js/src/abi/decoder/bytesTaken.spec.js @@ -0,0 +1,13 @@ +import BytesTaken from './bytesTaken'; + +describe('abi/decoder/BytesTaken', () => { + describe('constructor', () => { + it('sets the bytes of the object', () => { + expect((new BytesTaken(1, 2)).bytes).to.equal(1); + }); + + it('sets the newOffset of the object', () => { + expect((new BytesTaken(3, 4)).newOffset).to.equal(4); + }); + }); +}); diff --git a/js/src/abi/decoder/decodeResult.js b/js/src/abi/decoder/decodeResult.js new file mode 100644 index 00000000000..4b493ddf624 --- /dev/null +++ b/js/src/abi/decoder/decodeResult.js @@ -0,0 +1,14 @@ +export default class DecodeResult { + constructor (token, newOffset) { + this._token = token; + this._newOffset = newOffset; + } + + get token () { + return this._token; + } + + get newOffset () { + return this._newOffset; + } +} diff --git a/js/src/abi/decoder/decodeResult.spec.js b/js/src/abi/decoder/decodeResult.spec.js new file mode 100644 index 00000000000..ff5ec765861 --- /dev/null +++ b/js/src/abi/decoder/decodeResult.spec.js @@ -0,0 +1,13 @@ +import DecodeResult from './decodeResult'; + +describe('abi/decoder/DecodeResult', () => { + describe('constructor', () => { + it('sets the token of the object', () => { + expect((new DecodeResult('token', 2)).token).to.equal('token'); + }); + + it('sets the newOffset of the object', () => { + expect((new DecodeResult('baz', 4)).newOffset).to.equal(4); + }); + }); +}); diff --git a/js/src/abi/decoder/decoder.js b/js/src/abi/decoder/decoder.js new file mode 100644 index 00000000000..a7b3e8702c1 --- /dev/null +++ b/js/src/abi/decoder/decoder.js @@ -0,0 +1,121 @@ +import utf8 from 'utf8'; + +import Token from '../token/token'; +import BytesTaken from './bytesTaken'; +import DecodeResult from './decodeResult'; +import ParamType from '../spec/paramType/paramType'; +import { sliceData } from '../util/slice'; +import { asAddress, asBool, asI32, asU32 } from '../util/sliceAs'; +import { isArray, isInstanceOf } from '../util/types'; + +export default class Decoder { + static decode (params, data) { + if (!isArray(params)) { + throw new Error('Parameters should be array of ParamType'); + } + + const slices = sliceData(data); + let offset = 0; + + return params.map((param) => { + const result = Decoder.decodeParam(param, slices, offset); + offset = result.newOffset; + return result.token; + }); + } + + static peek (slices, position) { + if (!slices || !slices[position]) { + throw new Error(`Invalid position ${position} in slices peek`); + } + + return slices[position]; + } + + static takeBytes (slices, position, length) { + const slicesLength = Math.floor((length + 31) / 32); + let bytesStr = ''; + + for (let idx = 0; idx < slicesLength; idx++) { + bytesStr = `${bytesStr}${Decoder.peek(slices, position + idx)}`; + } + + const bytes = bytesStr.substr(0, length * 2).match(/.{1,2}/g).map((code) => parseInt(code, 16)); + + return new BytesTaken(bytes, position + slicesLength); + } + + static decodeParam (param, slices, offset) { + if (!isInstanceOf(param, ParamType)) { + throw new Error('param should be instanceof ParamType'); + } + + const tokens = []; + let taken; + let lengthOffset; + let length; + let newOffset; + + switch (param.type) { + case 'address': + return new DecodeResult(new Token(param.type, asAddress(Decoder.peek(slices, offset))), offset + 1); + + case 'bool': + return new DecodeResult(new Token(param.type, asBool(Decoder.peek(slices, offset))), offset + 1); + + case 'int': + return new DecodeResult(new Token(param.type, asI32(Decoder.peek(slices, offset))), offset + 1); + + case 'uint': + return new DecodeResult(new Token(param.type, asU32(Decoder.peek(slices, offset))), offset + 1); + + case 'fixedBytes': + taken = Decoder.takeBytes(slices, offset, param.length); + + return new DecodeResult(new Token(param.type, taken.bytes), taken.newOffset); + + case 'bytes': + lengthOffset = asU32(Decoder.peek(slices, offset)).div(32).toNumber(); + length = asU32(Decoder.peek(slices, lengthOffset)).toNumber(); + taken = Decoder.takeBytes(slices, lengthOffset + 1, length); + + return new DecodeResult(new Token(param.type, taken.bytes), offset + 1); + + case 'string': + lengthOffset = asU32(Decoder.peek(slices, offset)).div(32).toNumber(); + length = asU32(Decoder.peek(slices, lengthOffset)).toNumber(); + taken = Decoder.takeBytes(slices, lengthOffset + 1, length); + + const str = taken.bytes.map((code) => String.fromCharCode(code)).join(''); + + return new DecodeResult(new Token(param.type, utf8.decode(str)), offset + 1); + + case 'array': + lengthOffset = asU32(Decoder.peek(slices, offset)).div(32).toNumber(); + length = asU32(Decoder.peek(slices, lengthOffset)).toNumber(); + newOffset = lengthOffset + 1; + + for (let idx = 0; idx < length; idx++) { + const result = Decoder.decodeParam(param.subtype, slices, newOffset); + newOffset = result.newOffset; + tokens.push(result.token); + } + + return new DecodeResult(new Token(param.type, tokens), offset + 1); + + case 'fixedArray': + newOffset = offset; + + for (let idx = 0; idx < param.length; idx++) { + const result = Decoder.decodeParam(param.subtype, slices, newOffset); + newOffset = result.newOffset; + tokens.push(result.token); + } + + return new DecodeResult(new Token(param.type, tokens), newOffset); + + default: + throw new Error(`Invalid param type ${param.type} in decodeParam`); + } + } +} diff --git a/js/src/abi/decoder/decoder.spec.js b/js/src/abi/decoder/decoder.spec.js new file mode 100644 index 00000000000..02181a6bc8d --- /dev/null +++ b/js/src/abi/decoder/decoder.spec.js @@ -0,0 +1,296 @@ +import BigNumber from 'bignumber.js'; + +import Decoder from './decoder'; +import ParamType from '../spec/paramType'; +import Token from '../token'; +import { padU32 } from '../util/pad'; + +describe('abi/decoder/Decoder', () => { + const stringToBytes = function (str) { + return str.match(/.{1,2}/g).map((code) => parseInt(code, 16)); + }; + + const address1 = '0000000000000000000000001111111111111111111111111111111111111111'; + const address2 = '0000000000000000000000002222222222222222222222222222222222222222'; + const address3 = '0000000000000000000000003333333333333333333333333333333333333333'; + const address4 = '0000000000000000000000004444444444444444444444444444444444444444'; + const bool1 = '0000000000000000000000000000000000000000000000000000000000000001'; + const bytes1 = '1234000000000000000000000000000000000000000000000000000000000000'; + const bytes2 = '1000000000000000000000000000000000000000000000000000000000000000'; + const bytes3 = '10000000000000000000000000000000000000000000000000000000000002'; + const bytes4 = '0010000000000000000000000000000000000000000000000000000000000002'; + const int1 = '0111111111111111111111111111111111111111111111111111111111111111'; + const intn = 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85'; + const string1 = '6761766f66796f726b0000000000000000000000000000000000000000000000'; + const tokenAddress1 = new Token('address', address1.slice(-40)); + const tokenAddress2 = new Token('address', address2.slice(-40)); + const tokenAddress3 = new Token('address', address3.slice(-40)); + const tokenAddress4 = new Token('address', address4.slice(-40)); + const tokenBool1 = new Token('bool', true); + const tokenFixedBytes1 = new Token('fixedBytes', [0x12, 0x34]); + const tokenBytes1 = new Token('bytes', [0x12, 0x34]); + const tokenBytes2 = new Token('bytes', stringToBytes(bytes2).concat(stringToBytes(bytes2))); + const tokenBytes3 = new Token('bytes', stringToBytes(bytes3)); + const tokenBytes4 = new Token('bytes', stringToBytes(bytes4)); + const tokenInt1 = new Token('int', new BigNumber(int1, 16)); + const tokenIntn = new Token('int', new BigNumber(-123)); + const tokenUint1 = new Token('uint', new BigNumber(int1, 16)); + const tokenUintn = new Token('uint', new BigNumber(intn, 16)); + const tokenString1 = new Token('string', 'gavofyork'); + const slices = [ address1, address2, address3, address4 ]; + + describe('peek', () => { + it('returns the slice at the correct position', () => { + expect(Decoder.peek(slices, 1)).to.equal(slices[1]); + }); + + it('throws an error if the position is < 0', () => { + expect(() => Decoder.peek(slices, -1)).to.throw(/Invalid/); + }); + + it('throws an error if the position is >= length', () => { + expect(() => Decoder.peek(slices, 4)).to.throw(/Invalid/); + }); + + it('throws an error on invalid slices', () => { + expect(() => Decoder.peek(null, 4)).to.throw(/Invalid/); + }); + }); + + describe('takeBytes', () => { + it('returns a single slice', () => { + expect(Decoder.takeBytes(slices, 0, 32).bytes).to.deep.equal(stringToBytes(slices[0])); + }); + + it('returns a single partial slice', () => { + expect(Decoder.takeBytes(slices, 0, 20).bytes).to.deep.equal(stringToBytes(slices[0].substr(0, 40))); + }); + + it('returns multiple slices', () => { + expect(Decoder.takeBytes(slices, 0, 64).bytes).to.deep.equal(stringToBytes(`${slices[0]}${slices[1]}`)); + }); + + it('returns a single offset slice', () => { + expect(Decoder.takeBytes(slices, 1, 32).bytes).to.deep.equal(stringToBytes(slices[1])); + }); + + it('returns multiple offset slices', () => { + expect(Decoder.takeBytes(slices, 1, 64).bytes).to.deep.equal(stringToBytes(`${slices[1]}${slices[2]}`)); + }); + + it('returns the requires length from slices', () => { + expect( + Decoder.takeBytes(slices, 1, 75).bytes + ).to.deep.equal(stringToBytes(`${slices[1]}${slices[2]}${slices[3]}`.substr(0, 150))); + }); + }); + + describe('decodeParam', () => { + it('throws an error on non ParamType param', () => { + expect(() => Decoder.decodeParam({})).to.throw(/ParamType/); + }); + + it('throws an error on invalid param type', () => { + const pt = new ParamType('address'); + pt._type = 'noMatch'; + + expect(() => Decoder.decodeParam(pt)).to.throw(/noMatch/); + }); + + it('decodes an address', () => { + expect( + Decoder.decodeParam(new ParamType('address'), [address1], 0).token + ).to.deep.equal(tokenAddress1); + }); + + it('decodes a bool', () => { + expect( + Decoder.decodeParam(new ParamType('bool'), [bool1], 0).token + ).to.deep.equal(tokenBool1); + }); + + it('decodes an int', () => { + expect( + Decoder.decodeParam(new ParamType('int'), [int1], 0).token + ).to.deep.equal(tokenInt1); + }); + + it('decodes a negative int', () => { + expect( + Decoder.decodeParam(new ParamType('int'), [intn], 0).token + ).to.deep.equal(tokenIntn); + }); + + it('decodes an uint', () => { + expect( + Decoder.decodeParam(new ParamType('uint'), [int1], 0).token + ).to.deep.equal(tokenUint1); + }); + + it('decodes an uint (negative as int)', () => { + expect( + Decoder.decodeParam(new ParamType('uint'), [intn], 0).token + ).to.deep.equal(tokenUintn); + }); + + it('decodes fixedBytes', () => { + expect( + Decoder.decodeParam(new ParamType('fixedBytes', null, 2), [bytes1], 0).token + ).to.deep.equal(tokenFixedBytes1); + }); + + it('decodes bytes', () => { + expect( + Decoder.decodeParam(new ParamType('bytes'), [padU32(0x20), padU32(2), bytes1], 0).token + ).to.deep.equal(tokenBytes1); + }); + + it('decodes string', () => { + expect( + Decoder.decodeParam(new ParamType('string'), [padU32(0x20), padU32(9), string1], 0).token + ).to.deep.equal(tokenString1); + }); + }); + + describe('decode', () => { + it('throws an error on invalid params', () => { + expect(() => Decoder.decode(null, '123')).to.throw(/array/); + }); + + describe('address', () => { + it('decodes an address', () => { + expect( + Decoder.decode( + [new ParamType('address')], + `${address1}` + ) + ).to.deep.equal([tokenAddress1]); + }); + + it('decodes 2 addresses', () => { + expect( + Decoder.decode( + [new ParamType('address'), new ParamType('address')], + `${address1}${address2}` + ) + ).to.deep.equal([tokenAddress1, tokenAddress2]); + }); + + it('decodes a fixedArray of addresses', () => { + expect( + Decoder.decode( + [new ParamType('fixedArray', new ParamType('address'), 2)], + `${address1}${address2}` + ) + ).to.deep.equal([new Token('fixedArray', [tokenAddress1, tokenAddress2])]); + }); + + it('decodes a dynamic array of addresses', () => { + expect( + Decoder.decode( + [new ParamType('array', new ParamType('address'))], + `${padU32(0x20)}${padU32(2)}${address1}${address2}` + ) + ).to.deep.equal([new Token('array', [tokenAddress1, tokenAddress2])]); + }); + + it('decodes a dynamic array of fixed arrays', () => { + expect( + Decoder.decode( + [new ParamType('array', new ParamType('fixedArray', new ParamType('address'), 2))], + `${padU32(0x20)}${padU32(2)}${address1}${address2}${address3}${address4}` + ) + ).to.deep.equal([ + new Token('array', [ + new Token('fixedArray', [tokenAddress1, tokenAddress2]), + new Token('fixedArray', [tokenAddress3, tokenAddress4]) + ]) + ]); + }); + }); + + describe('int', () => { + it('decodes an int', () => { + expect( + Decoder.decode( + [new ParamType('int')], + `${int1}` + ) + ).to.deep.equal([tokenInt1]); + }); + }); + + describe('uint', () => { + it('decodes an uint', () => { + expect( + Decoder.decode( + [new ParamType('uint')], + `${int1}` + ) + ).to.deep.equal([tokenUint1]); + }); + }); + + describe('fixedBytes', () => { + it('decodes fixedBytes', () => { + expect( + Decoder.decode( + [new ParamType('fixedBytes', null, 2)], + `${bytes1}` + ) + ).to.deep.equal([tokenFixedBytes1]); + }); + }); + + describe('bytes', () => { + it('decodes bytes', () => { + expect( + Decoder.decode( + [new ParamType('bytes')], + `${padU32(0x20)}${padU32(2)}${bytes1}` + ) + ).to.deep.equal([tokenBytes1]); + }); + + it('decodes bytes sequence', () => { + expect( + Decoder.decode( + [new ParamType('bytes')], + `${padU32(0x20)}${padU32(0x40)}${bytes2}${bytes2}` + ) + ).to.deep.equal([tokenBytes2]); + }); + + it('decodes bytes seuence (2)', () => { + expect( + Decoder.decode( + [new ParamType('bytes'), new ParamType('bytes')], + `${padU32(0x40)}${padU32(0x80)}${padU32(0x1f)}${bytes3}00${padU32(0x20)}${bytes4}` + ) + ).to.deep.equal([tokenBytes3, tokenBytes4]); + }); + }); + + describe('bool', () => { + it('decodes a single bool', () => { + expect( + Decoder.decode( + [new ParamType('bool')], + bool1 + ) + ).to.deep.equal([tokenBool1]); + }); + }); + + describe('string', () => { + it('decodes a string', () => { + expect( + Decoder.decode( + [new ParamType('string')], + `${padU32(0x20)}${padU32(9)}${string1}` + ) + ).to.deep.equal([tokenString1]); + }); + }); + }); +}); diff --git a/js/src/abi/decoder/index.js b/js/src/abi/decoder/index.js new file mode 100644 index 00000000000..dd1a4d5f44f --- /dev/null +++ b/js/src/abi/decoder/index.js @@ -0,0 +1 @@ +export default from './decoder'; diff --git a/js/src/abi/encoder/encoder.js b/js/src/abi/encoder/encoder.js new file mode 100644 index 00000000000..e7c378f96ee --- /dev/null +++ b/js/src/abi/encoder/encoder.js @@ -0,0 +1,56 @@ +import { padAddress, padBool, padBytes, padFixedBytes, padU32, padString } from '../util/pad'; +import Mediate from './mediate'; +import Token from '../token/token'; +import { isArray, isInstanceOf } from '../util/types'; + +export default class Encoder { + static encode (tokens) { + if (!isArray(tokens)) { + throw new Error('tokens should be array of Token'); + } + + const mediates = tokens.map((token) => Encoder.encodeToken(token)); + const inits = mediates + .map((mediate, idx) => mediate.init(Mediate.offsetFor(mediates, idx))) + .join(''); + const closings = mediates + .map((mediate, idx) => mediate.closing(Mediate.offsetFor(mediates, idx))) + .join(''); + + return `${inits}${closings}`; + } + + static encodeToken (token) { + if (!isInstanceOf(token, Token)) { + throw new Error('token should be instanceof Token'); + } + + switch (token.type) { + case 'address': + return new Mediate('raw', padAddress(token.value)); + + case 'int': + case 'uint': + return new Mediate('raw', padU32(token.value)); + + case 'bool': + return new Mediate('raw', padBool(token.value)); + + case 'fixedBytes': + return new Mediate('raw', padFixedBytes(token.value)); + + case 'bytes': + return new Mediate('prefixed', padBytes(token.value)); + + case 'string': + return new Mediate('prefixed', padString(token.value)); + + case 'fixedArray': + case 'array': + return new Mediate(token.type, token.value.map((token) => Encoder.encodeToken(token))); + + default: + throw new Error(`Invalid token type ${token.type} in encodeToken`); + } + } +} diff --git a/js/src/abi/encoder/encoder.spec.js b/js/src/abi/encoder/encoder.spec.js new file mode 100644 index 00000000000..5c270bbf780 --- /dev/null +++ b/js/src/abi/encoder/encoder.spec.js @@ -0,0 +1,274 @@ +import Encoder from './encoder'; +import Token from '../token'; +import { padAddress, padFixedBytes, padU32 } from '../util/pad'; + +describe('abi/encoder/Encoder', () => { + describe('encodeToken', () => { + it('requires token as Token', () => { + expect(() => Encoder.encodeToken()).to.throw(/Token/); + }); + + it('encodes address tokens in Mediate(raw)', () => { + const mediate = Encoder.encodeToken(new Token('address', '123')); + + expect(mediate.type).to.equal('raw'); + expect(mediate.value).to.be.ok; + }); + + it('encodes bool tokens in Mediate(raw)', () => { + const mediatet = Encoder.encodeToken(new Token('bool', true)); + const mediatef = Encoder.encodeToken(new Token('bool', false)); + + expect(mediatet.type).to.equal('raw'); + expect(mediatet.value).to.be.ok; + + expect(mediatef.type).to.equal('raw'); + expect(mediatef.value).to.be.ok; + }); + + it('encodes int tokens in Mediate(raw)', () => { + const mediate = Encoder.encodeToken(new Token('int', '123')); + + expect(mediate.type).to.equal('raw'); + expect(mediate.value).to.be.ok; + }); + + it('encodes uint tokens in Mediate(raw)', () => { + const mediate = Encoder.encodeToken(new Token('uint', '123')); + + expect(mediate.type).to.equal('raw'); + expect(mediate.value).to.be.ok; + }); + + it('encodes fixedBytes tokens in Mediate(raw)', () => { + const mediate = Encoder.encodeToken(new Token('fixedBytes', '123')); + + expect(mediate.type).to.equal('raw'); + expect(mediate.value).to.be.ok; + }); + + it('encodes bytes tokens in Mediate(prefixed)', () => { + const mediate = Encoder.encodeToken(new Token('bytes', '123')); + + expect(mediate.type).to.equal('prefixed'); + expect(mediate.value).to.be.ok; + }); + + it('encodes string tokens in Mediate(prefixed)', () => { + const mediate = Encoder.encodeToken(new Token('string', '123')); + + expect(mediate.type).to.equal('prefixed'); + expect(mediate.value).to.be.ok; + }); + + it('encodes fixedArray tokens in Mediate(fixedArray)', () => { + const mediate = Encoder.encodeToken(new Token('fixedArray', [new Token('uint', '123')])); + + expect(mediate.type).to.equal('fixedArray'); + expect(mediate.value).to.be.ok; + }); + + it('encodes array tokens in Mediate(array)', () => { + const mediate = Encoder.encodeToken(new Token('array', [new Token('uint', '123')])); + + expect(mediate.type).to.equal('array'); + expect(mediate.value).to.be.ok; + }); + + it('throws an Error on invalid tokens', () => { + const token = new Token('address'); + token._type = 'noMatch'; + + expect(() => Encoder.encodeToken(token)).to.throw(/noMatch/); + }); + }); + + describe('encode', () => { + it('requires tokens array', () => { + expect(() => Encoder.encode()).to.throw(/array/); + }); + + describe('addresses', () => { + const address1 = '1111111111111111111111111111111111111111'; + const address2 = '2222222222222222222222222222222222222222'; + const address3 = '3333333333333333333333333333333333333333'; + const address4 = '4444444444444444444444444444444444444444'; + const encAddress1 = padAddress(address1); + const encAddress2 = padAddress(address2); + const encAddress3 = padAddress(address3); + const encAddress4 = padAddress(address4); + const tokenAddress1 = new Token('address', address1); + const tokenAddress2 = new Token('address', address2); + const tokenAddress3 = new Token('address', address3); + const tokenAddress4 = new Token('address', address4); + + it('encodes an address', () => { + const token = tokenAddress1; + + expect(Encoder.encode([token])).to.equal(encAddress1); + }); + + it('encodes an array of addresses', () => { + const expected = `${padU32(0x20)}${padU32(2)}${encAddress1}${encAddress2}`; + const token = new Token('array', [tokenAddress1, tokenAddress2]); + + expect(Encoder.encode([token])).to.equal(expected); + }); + + it('encodes an fixedArray of addresses', () => { + const expected = `${encAddress1}${encAddress2}`; + const token = new Token('fixedArray', [tokenAddress1, tokenAddress2]); + + expect(Encoder.encode([token])).to.equal(expected); + }); + + it('encodes two addresses', () => { + const expected = `${encAddress1}${encAddress2}`; + const tokens = [tokenAddress1, tokenAddress2]; + + expect(Encoder.encode(tokens)).to.equal(expected); + }); + + it('encodes fixed array of dynamic array addresses', () => { + const tokens1 = new Token('array', [tokenAddress1, tokenAddress2]); + const tokens2 = new Token('array', [tokenAddress3, tokenAddress4]); + const fixed = new Token('fixedArray', [tokens1, tokens2]); + const expected = `${padU32(0x40)}${padU32(0xa0)}${padU32(2)}${encAddress1}${encAddress2}${padU32(2)}${encAddress3}${encAddress4}`; + + expect(Encoder.encode([fixed])).to.equal(expected); + }); + + it('encodes dynamic array of fixed array addresses', () => { + const tokens1 = new Token('fixedArray', [tokenAddress1, tokenAddress2]); + const tokens2 = new Token('fixedArray', [tokenAddress3, tokenAddress4]); + const dynamic = new Token('array', [tokens1, tokens2]); + const expected = `${padU32(0x20)}${padU32(2)}${encAddress1}${encAddress2}${encAddress3}${encAddress4}`; + + expect(Encoder.encode([dynamic])).to.equal(expected); + }); + + it('encodes dynamic array of dynamic array addresses', () => { + const tokens1 = new Token('array', [tokenAddress1]); + const tokens2 = new Token('array', [tokenAddress2]); + const dynamic = new Token('array', [tokens1, tokens2]); + const expected = `${padU32(0x20)}${padU32(2)}${padU32(0x80)}${padU32(0xc0)}${padU32(1)}${encAddress1}${padU32(1)}${encAddress2}`; + + expect(Encoder.encode([dynamic])).to.equal(expected); + }); + + it('encodes dynamic array of dynamic array addresses (2)', () => { + const tokens1 = new Token('array', [tokenAddress1, tokenAddress2]); + const tokens2 = new Token('array', [tokenAddress3, tokenAddress4]); + const dynamic = new Token('array', [tokens1, tokens2]); + const expected = `${padU32(0x20)}${padU32(2)}${padU32(0x80)}${padU32(0xe0)}${padU32(2)}${encAddress1}${encAddress2}${padU32(2)}${encAddress3}${encAddress4}`; + + expect(Encoder.encode([dynamic])).to.equal(expected); + }); + + it('encodes fixed array of fixed array addresses', () => { + const tokens1 = new Token('fixedArray', [tokenAddress1, tokenAddress2]); + const tokens2 = new Token('fixedArray', [tokenAddress3, tokenAddress4]); + const dynamic = new Token('fixedArray', [tokens1, tokens2]); + const expected = `${encAddress1}${encAddress2}${encAddress3}${encAddress4}`; + + expect(Encoder.encode([dynamic])).to.equal(expected); + }); + }); + + describe('bytes', () => { + const bytes1 = '1234'; + const bytes2 = '10000000000000000000000000000000000000000000000000000000000002'; + const bytes3 = '1000000000000000000000000000000000000000000000000000000000000000'; + + it('encodes fixed bytes', () => { + const token = new Token('fixedBytes', bytes1); + + expect(Encoder.encode([token])).to.equal(padFixedBytes(bytes1)); + }); + + it('encodes bytes', () => { + const token = new Token('bytes', bytes1); + + expect(Encoder.encode([token])).to.equal(`${padU32(0x20)}${padU32(2)}${padFixedBytes(bytes1)}`); + }); + + it('encodes bytes (short of boundary)', () => { + const token = new Token('bytes', bytes2); + + expect(Encoder.encode([token])).to.equal(`${padU32(0x20)}${padU32(0x1f)}${padFixedBytes(bytes2)}`); + }); + + it('encodes bytes (two blocks)', () => { + const input = `${bytes3}${bytes3}`; + const token = new Token('bytes', input); + + expect(Encoder.encode([token])).to.equal(`${padU32(0x20)}${padU32(0x40)}${padFixedBytes(input)}`); + }); + + it('encodes two consecutive bytes', () => { + const in1 = '10000000000000000000000000000000000000000000000000000000000002'; + const in2 = '0010000000000000000000000000000000000000000000000000000000000002'; + const tokens = [new Token('bytes', in1), new Token('bytes', in2)]; + + expect(Encoder.encode(tokens)).to.equal(`${padU32(0x40)}${padU32(0x80)}${padU32(0x1f)}${padFixedBytes(in1)}${padU32(0x20)}${padFixedBytes(in2)}`); + }); + }); + + describe('string', () => { + it('encodes a string', () => { + const string = 'gavofyork'; + const stringEnc = padFixedBytes('6761766f66796f726b'); + const token = new Token('string', string); + + expect(Encoder.encode([token])).to.equal(`${padU32(0x20)}${padU32(string.length.toString(16))}${stringEnc}`); + }); + }); + + describe('uint', () => { + it('encodes a uint', () => { + const token = new Token('uint', 4); + + expect(Encoder.encode([token])).to.equal(padU32(4)); + }); + }); + + describe('int', () => { + it('encodes a int', () => { + const token = new Token('int', 4); + + expect(Encoder.encode([token])).to.equal(padU32(4)); + }); + }); + + describe('bool', () => { + it('encodes a bool (true)', () => { + const token = new Token('bool', true); + + expect(Encoder.encode([token])).to.equal(padU32(1)); + }); + + it('encodes a bool (false)', () => { + const token = new Token('bool', false); + + expect(Encoder.encode([token])).to.equal(padU32(0)); + }); + }); + + describe('comprehensive test', () => { + it('encodes a complex sequence', () => { + const bytes = '131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'; + const tokens = [new Token('int', 5), new Token('bytes', bytes), new Token('int', 3), new Token('bytes', bytes)]; + + expect(Encoder.encode(tokens)).to.equal(`${padU32(5)}${padU32(0x80)}${padU32(3)}${padU32(0xe0)}${padU32(0x40)}${bytes}${padU32(0x40)}${bytes}`); + }); + + it('encodes a complex sequence (nested)', () => { + const array = [new Token('int', 5), new Token('int', 6), new Token('int', 7)]; + const tokens = [new Token('int', 1), new Token('string', 'gavofyork'), new Token('int', 2), new Token('int', 3), new Token('int', 4), new Token('array', array)]; + const stringEnc = padFixedBytes('6761766f66796f726b'); + + expect(Encoder.encode(tokens)).to.equal(`${padU32(1)}${padU32(0xc0)}${padU32(2)}${padU32(3)}${padU32(4)}${padU32(0x100)}${padU32(9)}${stringEnc}${padU32(3)}${padU32(5)}${padU32(6)}${padU32(7)}`); + }); + }); + }); +}); diff --git a/js/src/abi/encoder/index.js b/js/src/abi/encoder/index.js new file mode 100644 index 00000000000..698b2b348af --- /dev/null +++ b/js/src/abi/encoder/index.js @@ -0,0 +1 @@ +export default from './encoder'; diff --git a/js/src/abi/encoder/mediate.js b/js/src/abi/encoder/mediate.js new file mode 100644 index 00000000000..20586103da0 --- /dev/null +++ b/js/src/abi/encoder/mediate.js @@ -0,0 +1,126 @@ +const TYPES = ['raw', 'prefixed', 'fixedArray', 'array']; + +import { padU32 } from '../util/pad'; + +export default class Mediate { + constructor (type, value) { + Mediate.validateType(type); + + this._type = type; + this._value = value; + } + + initLength () { + switch (this._type) { + case 'raw': + return this._value.length / 2; + + case 'array': + case 'prefixed': + return 32; + + case 'fixedArray': + return this._value + .reduce((total, mediate) => { + return total + mediate.initLength(); + }, 0); + } + } + + closingLength () { + switch (this._type) { + case 'raw': + return 0; + + case 'prefixed': + return this._value.length / 2; + + case 'array': + return this._value + .reduce((total, mediate) => { + return total + mediate.initLength(); + }, 32); + + case 'fixedArray': + return this._value + .reduce((total, mediate) => { + return total + mediate.initLength() + mediate.closingLength(); + }, 0); + } + } + + init (suffixOffset) { + switch (this._type) { + case 'raw': + return this._value; + + case 'fixedArray': + return this._value + .map((mediate, idx) => mediate.init(Mediate.offsetFor(this._value, idx)).toString(16)) + .join(''); + + case 'prefixed': + case 'array': + return padU32(suffixOffset); + } + } + + closing (offset) { + switch (this._type) { + case 'raw': + return ''; + + case 'prefixed': + return this._value; + + case 'fixedArray': + return this._value + .map((mediate, idx) => mediate.closing(Mediate.offsetFor(this._value, idx)).toString(16)) + .join(''); + + case 'array': + const prefix = padU32(this._value.length); + const inits = this._value + .map((mediate, idx) => mediate.init(offset + Mediate.offsetFor(this._value, idx) + 32).toString(16)) + .join(''); + const closings = this._value + .map((mediate, idx) => mediate.closing(offset + Mediate.offsetFor(this._value, idx)).toString(16)) + .join(''); + + return `${prefix}${inits}${closings}`; + } + } + + get type () { + return this._type; + } + + get value () { + return this._value; + } + + static offsetFor (mediates, position) { + if (position < 0 || position >= mediates.length) { + throw new Error(`Invalid position ${position} specified for Mediate.offsetFor`); + } + + const initLength = mediates + .reduce((total, mediate) => { + return total + mediate.initLength(); + }, 0); + + return mediates + .slice(0, position) + .reduce((total, mediate) => { + return total + mediate.closingLength(); + }, initLength); + } + + static validateType (type) { + if (TYPES.filter((_type) => type === _type).length) { + return true; + } + + throw new Error(`Invalid type ${type} received for Mediate.validateType`); + } +} diff --git a/js/src/abi/encoder/mediate.spec.js b/js/src/abi/encoder/mediate.spec.js new file mode 100644 index 00000000000..277ed0c7419 --- /dev/null +++ b/js/src/abi/encoder/mediate.spec.js @@ -0,0 +1,89 @@ +import Mediate from './mediate'; + +describe('abi/encoder/Mediate', () => { + const LONG15 = '1234567890abcdef000000000000000000000000000000000000000000000000'; + const DOUBLE15 = `${LONG15}${LONG15}`; + const ARRAY = [new Mediate('raw', DOUBLE15), new Mediate('raw', LONG15)]; + + describe('validateType', () => { + it('validates raw', () => { + expect(Mediate.validateType('raw')).to.be.true; + }); + + it('validates prefixed', () => { + expect(Mediate.validateType('prefixed')).to.be.true; + }); + + it('validates fixedArray', () => { + expect(Mediate.validateType('fixedArray')).to.be.true; + }); + + it('validates array', () => { + expect(Mediate.validateType('array')).to.be.true; + }); + + it('throws an error on invalid types', () => { + expect(() => Mediate.validateType('noMatch')).to.throw(/noMatch/); + }); + }); + + describe('offsetFor', () => { + it('thows an error when offset < 0', () => { + expect(() => Mediate.offsetFor([1], -1)).to.throw(/Invalid position/); + }); + + it('throws an error when offset >= length', () => { + expect(() => Mediate.offsetFor([1], 1)).to.throw(/Invalid position/); + }); + }); + + describe('constructor', () => { + it('throws an error on invalid types', () => { + expect(() => new Mediate('noMatch', '1')).to.throw(/noMatch/); + }); + + it('sets the type of the object', () => { + expect((new Mediate('raw', '1')).type).to.equal('raw'); + }); + + it('sets the value of the object', () => { + expect((new Mediate('raw', '1')).value).to.equal('1'); + }); + }); + + describe('initLength', () => { + it('returns correct variable byte length for raw', () => { + expect(new Mediate('raw', DOUBLE15).initLength()).to.equal(64); + }); + + it('returns correct fixed byte length for array', () => { + expect(new Mediate('array', [1, 2, 3, 4]).initLength()).to.equal(32); + }); + + it('returns correct fixed byte length for prefixed', () => { + expect(new Mediate('prefixed', 0).initLength()).to.equal(32); + }); + + it('returns correct variable byte length for fixedArray', () => { + expect(new Mediate('fixedArray', ARRAY).initLength()).to.equal(96); + }); + }); + + describe('closingLength', () => { + it('returns 0 byte length for raw', () => { + expect(new Mediate('raw', DOUBLE15).closingLength()).to.equal(0); + }); + + it('returns prefix + size for prefixed', () => { + expect(new Mediate('prefixed', DOUBLE15).closingLength()).to.equal(64); + }); + + it('returns prefix + size for array', () => { + expect(new Mediate('array', ARRAY).closingLength()).to.equal(128); + }); + + it('returns total length for fixedArray', () => { + expect(new Mediate('fixedArray', ARRAY).closingLength()).to.equal(96); + }); + }); +}); diff --git a/js/src/abi/index.js b/js/src/abi/index.js new file mode 100644 index 00000000000..0871bc469f8 --- /dev/null +++ b/js/src/abi/index.js @@ -0,0 +1 @@ +export default from './abi'; diff --git a/js/src/abi/spec/constructor.js b/js/src/abi/spec/constructor.js new file mode 100644 index 00000000000..d46e56e140e --- /dev/null +++ b/js/src/abi/spec/constructor.js @@ -0,0 +1,20 @@ +import Encoder from '../encoder/encoder'; +import Param from './param'; + +export default class Constructor { + constructor (abi) { + this._inputs = Param.toParams(abi.inputs || []); + } + + get inputs () { + return this._inputs; + } + + inputParamTypes () { + return this._inputs.map((input) => input.kind); + } + + encodeCall (tokens) { + return Encoder.encode(tokens); + } +} diff --git a/js/src/abi/spec/constructor.spec.js b/js/src/abi/spec/constructor.spec.js new file mode 100644 index 00000000000..c64cd5e4fcc --- /dev/null +++ b/js/src/abi/spec/constructor.spec.js @@ -0,0 +1,36 @@ +import Constructor from './constructor'; +import Param from './param'; +import Token from '../token'; + +describe('abi/spec/Constructor', () => { + const inputsArr = [{ name: 'boolin', type: 'bool' }, { name: 'stringin', type: 'string' }]; + const bool = new Param('boolin', 'bool'); + const string = new Param('stringin', 'string'); + + const inputs = [bool, string]; + const cr = new Constructor({ inputs: inputsArr }); + + describe('constructor', () => { + it('stores the inputs as received', () => { + expect(cr.inputs).to.deep.equal(inputs); + }); + + it('matches empty inputs with []', () => { + expect(new Constructor({}).inputs).to.deep.equal([]); + }); + }); + + describe('inputParamTypes', () => { + it('retrieves the input types as received', () => { + expect(cr.inputParamTypes()).to.deep.equal([bool.kind, string.kind]); + }); + }); + + describe('encodeCall', () => { + it('encodes correctly', () => { + const result = cr.encodeCall([new Token('bool', true), new Token('string', 'jacogr')]); + + expect(result).to.equal('0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000066a61636f67720000000000000000000000000000000000000000000000000000'); + }); + }); +}); diff --git a/js/src/abi/spec/event/decodedLog.js b/js/src/abi/spec/event/decodedLog.js new file mode 100644 index 00000000000..01a72b414b9 --- /dev/null +++ b/js/src/abi/spec/event/decodedLog.js @@ -0,0 +1,14 @@ +export default class DecodedLog { + constructor (params, address) { + this._params = params; + this._address = address; + } + + get address () { + return this._address; + } + + get params () { + return this._params; + } +} diff --git a/js/src/abi/spec/event/decodedLog.spec.js b/js/src/abi/spec/event/decodedLog.spec.js new file mode 100644 index 00000000000..c8a395c9fe5 --- /dev/null +++ b/js/src/abi/spec/event/decodedLog.spec.js @@ -0,0 +1,12 @@ +import DecodedLog from './decodedLog'; + +const log = new DecodedLog('someParams', 'someAddress'); + +describe('abi/spec/event/DecodedLog', () => { + describe('constructor', () => { + it('sets internal state', () => { + expect(log.params).to.equal('someParams'); + expect(log.address).to.equal('someAddress'); + }); + }); +}); diff --git a/js/src/abi/spec/event/decodedLogParam.js b/js/src/abi/spec/event/decodedLogParam.js new file mode 100644 index 00000000000..3fe390764bd --- /dev/null +++ b/js/src/abi/spec/event/decodedLogParam.js @@ -0,0 +1,29 @@ +import ParamType from '../paramType/paramType'; +import Token from '../../token/token'; +import { isInstanceOf } from '../../util/types'; + +export default class DecodedLogParam { + constructor (name, kind, token) { + if (!isInstanceOf(kind, ParamType)) { + throw new Error('kind not instanceof ParamType'); + } else if (!isInstanceOf(token, Token)) { + throw new Error('token not instanceof Token'); + } + + this._name = name; + this._kind = kind; + this._token = token; + } + + get name () { + return this._name; + } + + get kind () { + return this._kind; + } + + get token () { + return this._token; + } +} diff --git a/js/src/abi/spec/event/decodedLogParam.spec.js b/js/src/abi/spec/event/decodedLogParam.spec.js new file mode 100644 index 00000000000..56ea5e54aac --- /dev/null +++ b/js/src/abi/spec/event/decodedLogParam.spec.js @@ -0,0 +1,26 @@ +import DecodedLogParam from './decodedLogParam'; +import ParamType from '../paramType'; +import Token from '../../token'; + +describe('abi/spec/event/DecodedLogParam', () => { + describe('constructor', () => { + const pt = new ParamType('bool'); + const tk = new Token('bool'); + + it('disallows kind not instanceof ParamType', () => { + expect(() => new DecodedLogParam('test', 'param')).to.throw(/ParamType/); + }); + + it('disallows token not instanceof Token', () => { + expect(() => new DecodedLogParam('test', pt, 'token')).to.throw(/Token/); + }); + + it('stores all parameters received', () => { + const log = new DecodedLogParam('test', pt, tk); + + expect(log.name).to.equal('test'); + expect(log.kind).to.equal(pt); + expect(log.token).to.equal(tk); + }); + }); +}); diff --git a/js/src/abi/spec/event/event.js b/js/src/abi/spec/event/event.js new file mode 100644 index 00000000000..7946d409914 --- /dev/null +++ b/js/src/abi/spec/event/event.js @@ -0,0 +1,84 @@ +import Decoder from '../../decoder/decoder'; +import DecodedLog from './decodedLog'; +import DecodedLogParam from './decodedLogParam'; +import EventParam from './eventParam'; +import { asAddress } from '../../util/sliceAs'; +import { eventSignature } from '../../util/signature'; + +export default class Event { + constructor (abi) { + this._name = abi.name; + this._inputs = EventParam.toEventParams(abi.inputs || []); + this._anonymous = !!abi.anonymous; + this._signature = eventSignature(this._name, this.inputParamTypes()); + } + + get name () { + return this._name; + } + + get inputs () { + return this._inputs; + } + + get anonymous () { + return this._anonymous; + } + + get signature () { + return this._signature; + } + + inputParamTypes () { + return this._inputs.map((input) => input.kind); + } + + inputParamNames () { + return this._inputs.map((input) => input.name); + } + + indexedParams (indexed) { + return this._inputs.filter((input) => input.indexed === indexed); + } + + decodeLog (topics, data) { + const topicParams = this.indexedParams(true); + const dataParams = this.indexedParams(false); + + let address; + let toSkip; + + if (!this.anonymous) { + address = asAddress(topics[0]); + toSkip = 1; + } else { + toSkip = 0; + } + + const topicTypes = topicParams.map((param) => param.kind); + const flatTopics = topics.filter((topic, idx) => idx >= toSkip).join(''); + const topicTokens = Decoder.decode(topicTypes, flatTopics); + + if (topicTokens.length !== (topics.length - toSkip)) { + throw new Error('Invalid topic data'); + } + + const dataTypes = dataParams.map((param) => param.kind); + const dataTokens = Decoder.decode(dataTypes, data); + + const namedTokens = {}; + + topicParams.forEach((param, idx) => { + namedTokens[param.name] = topicTokens[idx]; + }); + dataParams.forEach((param, idx) => { + namedTokens[param.name] = dataTokens[idx]; + }); + + const inputParamTypes = this.inputParamTypes(); + const decodedParams = this.inputParamNames() + .map((name, idx) => new DecodedLogParam(name, inputParamTypes[idx], namedTokens[name])); + + return new DecodedLog(decodedParams, address); + } +} diff --git a/js/src/abi/spec/event/event.spec.js b/js/src/abi/spec/event/event.spec.js new file mode 100644 index 00000000000..4c0325deeee --- /dev/null +++ b/js/src/abi/spec/event/event.spec.js @@ -0,0 +1,95 @@ +import BigNumber from 'bignumber.js'; + +import Event from './event'; +import EventParam from './eventParam'; +import DecodedLogParam from './decodedLogParam'; +import ParamType from '../paramType'; +import Token from '../../token'; + +describe('abi/spec/event/Event', () => { + const inputArr = [{ name: 'a', type: 'bool' }, { name: 'b', type: 'uint', indexed: true }]; + const inputs = [new EventParam('a', 'bool', false), new EventParam('b', 'uint', true)]; + const event = new Event({ name: 'test', inputs: inputArr, anonymous: true }); + + describe('constructor', () => { + it('stores the parameters as received', () => { + expect(event.name).to.equal('test'); + expect(event.inputs).to.deep.equal(inputs); + expect(event.anonymous).to.be.true; + }); + + it('matches empty inputs with []', () => { + expect(new Event({ name: 'test' }).inputs).to.deep.equal([]); + }); + + it('sets the event signature', () => { + expect(new Event({ name: 'baz' }).signature) + .to.equal('a7916fac4f538170f7cd12c148552e2cba9fcd72329a2dd5b07a6fa906488ddf'); + }); + }); + + describe('inputParamTypes', () => { + it('returns all the types', () => { + expect(event.inputParamTypes()).to.deep.equal([new ParamType('bool'), new ParamType('uint', null, 256)]); + }); + }); + + describe('inputParamNames', () => { + it('returns all the names', () => { + expect(event.inputParamNames()).to.deep.equal(['a', 'b']); + }); + }); + + describe('indexedParams', () => { + it('returns all indexed parameters (indexed)', () => { + expect(event.indexedParams(true)).to.deep.equal([inputs[1]]); + }); + + it('returns all indexed parameters (non-indexed)', () => { + expect(event.indexedParams(false)).to.deep.equal([inputs[0]]); + }); + }); + + describe('decodeLog', () => { + it('decodes an event', () => { + const event = new Event({ + name: 'foo', + inputs: [ + { name: 'a', type: 'int' }, + { name: 'b', type: 'int', indexed: true }, + { name: 'c', type: 'address' }, + { name: 'd', type: 'address', indexed: true } + ] + }); + const decoded = event.decodeLog([ + '0000000000000000000000004444444444444444444444444444444444444444', + '0000000000000000000000000000000000000000000000000000000000000002', + '0000000000000000000000001111111111111111111111111111111111111111' ], + '00000000000000000000000000000000000000000000000000000000000000030000000000000000000000002222222222222222222222222222222222222222'); + + expect(decoded.address).to.equal('4444444444444444444444444444444444444444'); + expect(decoded.params).to.deep.equal([ + new DecodedLogParam('a', new ParamType('int', null, 256), new Token('int', new BigNumber(3))), + new DecodedLogParam('b', new ParamType('int', null, 256), new Token('int', new BigNumber(2))), + new DecodedLogParam('c', new ParamType('address'), new Token('address', '2222222222222222222222222222222222222222')), + new DecodedLogParam('d', new ParamType('address'), new Token('address', '1111111111111111111111111111111111111111')) + ]); + }); + + it('decodes an anonymous event', () => { + const event = new Event({ name: 'foo', inputs: [{ name: 'a', type: 'int' }], anonymous: true }); + const decoded = event.decodeLog([], '0000000000000000000000000000000000000000000000000000000000000003'); + + expect(decoded.address).to.not.be.ok; + expect(decoded.params).to.deep.equal([ + new DecodedLogParam('a', new ParamType('int', null, 256), new Token('int', new BigNumber(3))) + ]); + }); + + it('throws on invalid topics', () => { + const event = new Event({ name: 'foo', inputs: [{ name: 'a', type: 'int' }], anonymous: true }); + + expect(() => event.decodeLog(['0000000000000000000000004444444444444444444444444444444444444444'], '0000000000000000000000000000000000000000000000000000000000000003')).to.throw(/Invalid/); + }); + }); +}); diff --git a/js/src/abi/spec/event/eventParam.js b/js/src/abi/spec/event/eventParam.js new file mode 100644 index 00000000000..ff071ef926c --- /dev/null +++ b/js/src/abi/spec/event/eventParam.js @@ -0,0 +1,25 @@ +import { toParamType } from '../paramType/format'; + +export default class EventParam { + constructor (name, type, indexed) { + this._name = name; + this._kind = toParamType(type); + this._indexed = !!indexed; + } + + get name () { + return this._name; + } + + get kind () { + return this._kind; + } + + get indexed () { + return this._indexed; + } + + static toEventParams (params) { + return params.map((param) => new EventParam(param.name, param.type, param.indexed)); + } +} diff --git a/js/src/abi/spec/event/eventParam.spec.js b/js/src/abi/spec/event/eventParam.spec.js new file mode 100644 index 00000000000..5d1d962c6eb --- /dev/null +++ b/js/src/abi/spec/event/eventParam.spec.js @@ -0,0 +1,24 @@ +import EventParam from './eventParam'; + +describe('abi/spec/event/EventParam', () => { + describe('constructor', () => { + const param = new EventParam('foo', 'uint', true); + + it('sets the properties', () => { + expect(param.name).to.equal('foo'); + expect(param.kind.type).to.equal('uint'); + expect(param.indexed).to.be.true; + }); + }); + + describe('toEventParams', () => { + it('maps an array of params', () => { + const params = EventParam.toEventParams([{ name: 'foo', type: 'uint' }]); + + expect(params.length).to.equal(1); + expect(params[0].indexed).to.be.false; + expect(params[0].name).to.equal('foo'); + expect(params[0].kind.type).to.equal('uint'); + }); + }); +}); diff --git a/js/src/abi/spec/event/index.js b/js/src/abi/spec/event/index.js new file mode 100644 index 00000000000..b36098be350 --- /dev/null +++ b/js/src/abi/spec/event/index.js @@ -0,0 +1 @@ +export default from './event'; diff --git a/js/src/abi/spec/function.js b/js/src/abi/spec/function.js new file mode 100644 index 00000000000..9b4d61598b2 --- /dev/null +++ b/js/src/abi/spec/function.js @@ -0,0 +1,50 @@ +import Decoder from '../decoder/decoder'; +import Encoder from '../encoder/encoder'; +import Param from './param'; +import { methodSignature } from '../util/signature'; + +export default class Func { + constructor (abi) { + this._name = abi.name; + this._constant = !!abi.constant; + this._inputs = Param.toParams(abi.inputs || []); + this._outputs = Param.toParams(abi.outputs || []); + this._signature = methodSignature(this._name, this.inputParamTypes()); + } + + get constant () { + return this._constant; + } + + get name () { + return this._name; + } + + get inputs () { + return this._inputs; + } + + get outputs () { + return this._outputs; + } + + get signature () { + return this._signature; + } + + inputParamTypes () { + return this._inputs.map((input) => input.kind); + } + + outputParamTypes () { + return this._outputs.map((output) => output.kind); + } + + encodeCall (tokens) { + return `${this._signature}${Encoder.encode(tokens)}`; + } + + decodeOutput (data) { + return Decoder.decode(this.outputParamTypes(), data); + } +} diff --git a/js/src/abi/spec/function.spec.js b/js/src/abi/spec/function.spec.js new file mode 100644 index 00000000000..049589561a2 --- /dev/null +++ b/js/src/abi/spec/function.spec.js @@ -0,0 +1,73 @@ +import Func from './function'; +import Param from './param'; +import Token from '../token'; + +describe('abi/spec/Function', () => { + const inputsArr = [{ name: 'boolin', type: 'bool' }, { name: 'stringin', type: 'string' }]; + const outputsArr = [{ name: 'output', type: 'uint' }]; + + const uint = new Param('output', 'uint'); + const bool = new Param('boolin', 'bool'); + const string = new Param('stringin', 'string'); + const inputs = [bool, string]; + const outputs = [uint]; + + const func = new Func({ + name: 'test', + inputs: inputsArr, + outputs: outputsArr + }); + + describe('constructor', () => { + it('stores the parameters as received', () => { + expect(func.name).to.equal('test'); + expect(func.constant).to.be.false; + expect(func.inputs).to.deep.equal(inputs); + expect(func.outputs).to.deep.equal(outputs); + }); + + it('matches empty inputs with []', () => { + expect(new Func({ name: 'test', outputs: outputsArr }).inputs).to.deep.equal([]); + }); + + it('matches empty outputs with []', () => { + expect(new Func({ name: 'test', inputs: inputsArr }).outputs).to.deep.equal([]); + }); + + it('sets the method signature', () => { + expect(new Func({ name: 'baz' }).signature).to.equal('a7916fac'); + }); + + it('allows constant functions', () => { + expect(new Func({ name: 'baz', constant: true }).constant).to.be.true; + }); + }); + + describe('inputParamTypes', () => { + it('retrieves the input types as received', () => { + expect(func.inputParamTypes()).to.deep.equal([bool.kind, string.kind]); + }); + }); + + describe('outputParamTypes', () => { + it('retrieves the output types as received', () => { + expect(func.outputParamTypes()).to.deep.equal([uint.kind]); + }); + }); + + describe('encodeCall', () => { + it('encodes the call correctly', () => { + const result = func.encodeCall([new Token('bool', true), new Token('string', 'jacogr')]); + + expect(result).to.equal('023562050000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000066a61636f67720000000000000000000000000000000000000000000000000000'); + }); + }); + + describe('decodeOutput', () => { + it('decodes the result correctly', () => { + const result = func.decodeOutput('1111111111111111111111111111111111111111111111111111111111111111'); + + expect(result[0].value.toString(16)).to.equal('1111111111111111111111111111111111111111111111111111111111111111'); + }); + }); +}); diff --git a/js/src/abi/spec/index.js b/js/src/abi/spec/index.js new file mode 100644 index 00000000000..3c69c622bf4 --- /dev/null +++ b/js/src/abi/spec/index.js @@ -0,0 +1 @@ +export default from './interface'; diff --git a/js/src/abi/spec/interface.js b/js/src/abi/spec/interface.js new file mode 100644 index 00000000000..e498da57d81 --- /dev/null +++ b/js/src/abi/spec/interface.js @@ -0,0 +1,56 @@ +import Constructor from './constructor'; +import Event from './event/event'; +import Func from './function'; +import Token from '../token/index'; + +export default class Interface { + constructor (abi) { + this._interface = Interface.parseABI(abi); + } + + get interface () { + return this._interface; + } + + get constructors () { + return this._interface.filter((item) => item instanceof Constructor); + } + + get events () { + return this._interface.filter((item) => item instanceof Event); + } + + get functions () { + return this._interface.filter((item) => item instanceof Func); + } + + encodeTokens (paramTypes, values) { + const createToken = function (paramType, value) { + if (paramType.subtype) { + return new Token(paramType.type, value.map((entry) => createToken(paramType.subtype, entry))); + } + + return new Token(paramType.type, value); + }; + + return paramTypes.map((paramType, idx) => createToken(paramType, values[idx])); + } + + static parseABI (abi) { + return abi.map((item) => { + switch (item.type) { + case 'constructor': + return new Constructor(item); + + case 'event': + return new Event(item); + + case 'function': + return new Func(item); + + default: + throw new Error(`Unknown ABI type ${item.type}`); + } + }); + } +} diff --git a/js/src/abi/spec/interface.spec.js b/js/src/abi/spec/interface.spec.js new file mode 100644 index 00000000000..1520182ea12 --- /dev/null +++ b/js/src/abi/spec/interface.spec.js @@ -0,0 +1,110 @@ +import Interface from './interface'; +import ParamType from './paramType'; +import Token from '../token'; + +describe('abi/spec/Interface', () => { + const construct = { + type: 'constructor', + inputs: [] + }; + const event = { + type: 'event', + name: 'Event2', + anonymous: false, + inputs: [{ name: 'a', type: 'uint256', indexed: true }, { name: 'b', type: 'bytes32', indexed: false }] + }; + const func = { + type: 'function', + name: 'foo', + inputs: [{ name: 'a', type: 'uint256' }], + outputs: [] + }; + + describe('parseABI', () => { + it('throws on invalid types', () => { + expect(() => Interface.parseABI([{ type: 'noMatch' }])).to.throw(/noMatch/); + }); + + it('creates constructors', () => { + expect(Interface.parseABI([ construct ])).to.deep.equal([{ _inputs: [] }]); + }); + + it('creates events', () => { + expect(Interface.parseABI([ event ])[0].name).to.equal('Event2'); + }); + + it('creates functions', () => { + expect(Interface.parseABI([ func ])[0].name).to.equal('foo'); + }); + + it('parse complex interfaces', () => { + expect(Interface.parseABI([ construct, event, func ]).length).to.equal(3); + }); + }); + + describe('constructor', () => { + const int = new Interface([ construct, event, func ]); + + it('contains the full interface', () => { + expect(int.interface.length).to.equal(3); + }); + + it('contains the constructors', () => { + expect(int.constructors.length).to.equal(1); + }); + + it('contains the events', () => { + expect(int.events.length).to.equal(1); + }); + + it('contains the functions', () => { + expect(int.functions.length).to.equal(1); + }); + }); + + describe('encodeTokens', () => { + const int = new Interface([ construct, event, func ]); + + it('encodes simple types', () => { + expect( + int.encodeTokens( + [new ParamType('bool'), new ParamType('string'), new ParamType('int'), new ParamType('uint')], + [true, 'gavofyork', -123, 123] + ) + ).to.deep.equal([ + new Token('bool', true), new Token('string', 'gavofyork'), new Token('int', -123), new Token('uint', 123) + ]); + }); + + it('encodes array', () => { + expect( + int.encodeTokens( + [new ParamType('array', new ParamType('bool'))], + [[true, false, true]] + ) + ).to.deep.equal([ + new Token('array', [ + new Token('bool', true), new Token('bool', false), new Token('bool', true) + ]) + ]); + }); + + it('encodes simple with array of array', () => { + expect( + int.encodeTokens( + [ + new ParamType('bool'), + new ParamType('fixedArray', new ParamType('array', new ParamType('uint')), 2) + ], + [true, [[0, 1], [2, 3]]] + ) + ).to.deep.equal([ + new Token('bool', true), + new Token('fixedArray', [ + new Token('array', [new Token('uint', 0), new Token('uint', 1)]), + new Token('array', [new Token('uint', 2), new Token('uint', 3)]) + ]) + ]); + }); + }); +}); diff --git a/js/src/abi/spec/param.js b/js/src/abi/spec/param.js new file mode 100644 index 00000000000..5b4869b1001 --- /dev/null +++ b/js/src/abi/spec/param.js @@ -0,0 +1,20 @@ +import { toParamType } from './paramType/format'; + +export default class Param { + constructor (name, type) { + this._name = name; + this._kind = toParamType(type); + } + + get name () { + return this._name; + } + + get kind () { + return this._kind; + } + + static toParams (params) { + return params.map((param) => new Param(param.name, param.type)); + } +} diff --git a/js/src/abi/spec/param.spec.js b/js/src/abi/spec/param.spec.js new file mode 100644 index 00000000000..a269d489d1a --- /dev/null +++ b/js/src/abi/spec/param.spec.js @@ -0,0 +1,22 @@ +import Param from './param'; + +describe('abi/spec/Param', () => { + describe('constructor', () => { + const param = new Param('foo', 'uint'); + + it('sets the properties', () => { + expect(param.name).to.equal('foo'); + expect(param.kind.type).to.equal('uint'); + }); + }); + + describe('toParams', () => { + it('maps an array of params', () => { + const params = Param.toParams([{ name: 'foo', type: 'uint' }]); + + expect(params.length).to.equal(1); + expect(params[0].name).to.equal('foo'); + expect(params[0].kind.type).to.equal('uint'); + }); + }); +}); diff --git a/js/src/abi/spec/paramType/format.js b/js/src/abi/spec/paramType/format.js new file mode 100644 index 00000000000..d3ba0851fe4 --- /dev/null +++ b/js/src/abi/spec/paramType/format.js @@ -0,0 +1,64 @@ +import ParamType from './paramType'; + +export function toParamType (type) { + if (type[type.length - 1] === ']') { + const last = type.lastIndexOf('['); + const length = type.substr(last + 1, type.length - last - 2); + const subtype = toParamType(type.substr(0, last)); + + if (length.length === 0) { + return new ParamType('array', subtype); + } + + return new ParamType('fixedArray', subtype, parseInt(length, 10)); + } + + switch (type) { + case 'address': + case 'bool': + case 'bytes': + case 'string': + return new ParamType(type); + + case 'int': + case 'uint': + return new ParamType(type, null, 256); + + default: + if (type.indexOf('uint') === 0) { + return new ParamType('uint', null, parseInt(type.substr(4), 10)); + } else if (type.indexOf('int') === 0) { + return new ParamType('int', null, parseInt(type.substr(3), 10)); + } else if (type.indexOf('bytes') === 0) { + return new ParamType('fixedBytes', null, parseInt(type.substr(5), 10)); + } + + throw new Error(`Cannot convert ${type} to valid ParamType`); + } +} + +export function fromParamType (paramType) { + switch (paramType.type) { + case 'address': + case 'bool': + case 'bytes': + case 'string': + return paramType.type; + + case 'int': + case 'uint': + return `${paramType.type}${paramType.length}`; + + case 'fixedBytes': + return `bytes${paramType.length}`; + + case 'fixedArray': + return `${fromParamType(paramType.subtype)}[${paramType.length}]`; + + case 'array': + return `${fromParamType(paramType.subtype)}[]`; + + default: + throw new Error(`Cannot convert from ParamType ${paramType.type}`); + } +} diff --git a/js/src/abi/spec/paramType/format.spec.js b/js/src/abi/spec/paramType/format.spec.js new file mode 100644 index 00000000000..ac2578701ab --- /dev/null +++ b/js/src/abi/spec/paramType/format.spec.js @@ -0,0 +1,212 @@ +import ParamType from './paramType'; +import { fromParamType, toParamType } from './format'; + +describe('abi/spec/paramType/format', () => { + describe('fromParamType', () => { + it('errors on invalid types', () => { + expect(() => fromParamType({ type: 'noMatch' })).to.throw(/noMatch/); + }); + + describe('simple types', () => { + it('converts address to address', () => { + const pt = new ParamType('address'); + + expect(fromParamType(pt)).to.equal('address'); + }); + + it('converts bool to bool', () => { + const pt = new ParamType('bool'); + + expect(fromParamType(pt)).to.equal('bool'); + }); + + it('converts bytes to bytes', () => { + const pt = new ParamType('bytes'); + + expect(fromParamType(pt)).to.equal('bytes'); + }); + + it('converts string to string', () => { + const pt = new ParamType('string'); + + expect(fromParamType(pt)).to.equal('string'); + }); + }); + + describe('length types', () => { + it('converts int32 to int32', () => { + const pt = new ParamType('int', null, 32); + + expect(fromParamType(pt)).to.equal('int32'); + }); + + it('converts uint64 to int64', () => { + const pt = new ParamType('uint', null, 64); + + expect(fromParamType(pt)).to.equal('uint64'); + }); + + it('converts fixedBytes8 to bytes8', () => { + const pt = new ParamType('fixedBytes', null, 8); + + expect(fromParamType(pt)).to.equal('bytes8'); + }); + }); + + describe('arrays', () => { + it('converts string[2] to string[2]', () => { + const pt = new ParamType('fixedArray', new ParamType('string'), 2); + + expect(fromParamType(pt)).to.equal('string[2]'); + }); + + it('converts bool[] to bool[]', () => { + const pt = new ParamType('array', new ParamType('bool')); + + expect(fromParamType(pt)).to.equal('bool[]'); + }); + + it('converts bool[][2] to bool[][2]', () => { + const pt = new ParamType('fixedArray', new ParamType('array', new ParamType('bool')), 2); + + expect(fromParamType(pt)).to.equal('bool[][2]'); + }); + + it('converts bool[2][] to bool[2][]', () => { + const pt = new ParamType('array', new ParamType('fixedArray', new ParamType('bool'), 2)); + + expect(fromParamType(pt)).to.equal('bool[2][]'); + }); + }); + }); + + describe('toParamType', () => { + it('errors on invalid types', () => { + expect(() => toParamType('noMatch')).to.throw(/noMatch/); + }); + + describe('simple mapping', () => { + it('converts address to address', () => { + const pt = toParamType('address'); + + expect(pt.type).to.equal('address'); + }); + + it('converts bool to bool', () => { + const pt = toParamType('bool'); + + expect(pt.type).to.equal('bool'); + }); + + it('converts bytes to bytes', () => { + const pt = toParamType('bytes'); + + expect(pt.type).to.equal('bytes'); + }); + + it('converts string to string', () => { + const pt = toParamType('string'); + + expect(pt.type).to.equal('string'); + }); + }); + + describe('number', () => { + it('converts int to int256', () => { + const pt = toParamType('int'); + + expect(pt.type).to.equal('int'); + expect(pt.length).to.equal(256); + }); + + it('converts uint to uint256', () => { + const pt = toParamType('uint'); + + expect(pt.type).to.equal('uint'); + expect(pt.length).to.equal(256); + }); + }); + + describe('sized types', () => { + it('converts int32 to int32', () => { + const pt = toParamType('int32'); + + expect(pt.type).to.equal('int'); + expect(pt.length).to.equal(32); + }); + + it('converts uint16 to uint16', () => { + const pt = toParamType('uint32'); + + expect(pt.type).to.equal('uint'); + expect(pt.length).to.equal(32); + }); + + it('converts bytes8 to fixedBytes8', () => { + const pt = toParamType('bytes8'); + + expect(pt.type).to.equal('fixedBytes'); + expect(pt.length).to.equal(8); + }); + }); + + describe('arrays', () => { + describe('fixed arrays', () => { + it('creates fixed array', () => { + const pt = toParamType('bytes[8]'); + + expect(pt.type).to.equal('fixedArray'); + expect(pt.subtype.type).to.equal('bytes'); + expect(pt.length).to.equal(8); + }); + + it('creates fixed arrays of fixed arrays', () => { + const pt = toParamType('bytes[45][3]'); + + expect(pt.type).to.equal('fixedArray'); + expect(pt.length).to.equal(3); + expect(pt.subtype.type).to.equal('fixedArray'); + expect(pt.subtype.length).to.equal(45); + expect(pt.subtype.subtype.type).to.equal('bytes'); + }); + }); + + describe('dynamic arrays', () => { + it('creates a dynamic array', () => { + const pt = toParamType('bytes[]'); + + expect(pt.type).to.equal('array'); + expect(pt.subtype.type).to.equal('bytes'); + }); + + it('creates a dynamic array of dynamic arrays', () => { + const pt = toParamType('bool[][]'); + + expect(pt.type).to.equal('array'); + expect(pt.subtype.type).to.equal('array'); + expect(pt.subtype.subtype.type).to.equal('bool'); + }); + }); + + describe('mixed arrays', () => { + it('creates a fixed dynamic array', () => { + const pt = toParamType('bool[][3]'); + + expect(pt.type).to.equal('fixedArray'); + expect(pt.length).to.equal(3); + expect(pt.subtype.type).to.equal('array'); + expect(pt.subtype.subtype.type).to.equal('bool'); + }); + + it('creates a dynamic fixed array', () => { + const pt = toParamType('bool[3][]'); + + expect(pt.type).to.equal('array'); + expect(pt.subtype.type).to.equal('fixedArray'); + expect(pt.subtype.length).to.equal(3); + expect(pt.subtype.subtype.type).to.equal('bool'); + }); + }); + }); + }); +}); diff --git a/js/src/abi/spec/paramType/index.js b/js/src/abi/spec/paramType/index.js new file mode 100644 index 00000000000..640b6930981 --- /dev/null +++ b/js/src/abi/spec/paramType/index.js @@ -0,0 +1 @@ +export default from './paramType'; diff --git a/js/src/abi/spec/paramType/paramType.js b/js/src/abi/spec/paramType/paramType.js new file mode 100644 index 00000000000..5f68ed5fbe4 --- /dev/null +++ b/js/src/abi/spec/paramType/paramType.js @@ -0,0 +1,31 @@ +import TYPES from './types'; + +export default class ParamType { + constructor (type, subtype, length) { + ParamType.validateType(type); + + this._type = type; + this._subtype = subtype; + this._length = length; + } + + get type () { + return this._type; + } + + get subtype () { + return this._subtype; + } + + get length () { + return this._length; + } + + static validateType (type) { + if (TYPES.filter((_type) => type === _type).length) { + return true; + } + + throw new Error(`Invalid type ${type} received for ParamType`); + } +} diff --git a/js/src/abi/spec/paramType/paramType.spec.js b/js/src/abi/spec/paramType/paramType.spec.js new file mode 100644 index 00000000000..3e2edf3eabf --- /dev/null +++ b/js/src/abi/spec/paramType/paramType.spec.js @@ -0,0 +1,63 @@ +import ParamType from './paramType'; + +describe('abi/spec/paramType/ParamType', () => { + describe('validateType', () => { + it('validates address', () => { + expect(ParamType.validateType('address')).to.be.true; + }); + + it('validates fixedArray', () => { + expect(ParamType.validateType('fixedArray')).to.be.true; + }); + + it('validates array', () => { + expect(ParamType.validateType('array')).to.be.true; + }); + + it('validates fixedBytes', () => { + expect(ParamType.validateType('fixedBytes')).to.be.true; + }); + + it('validates bytes', () => { + expect(ParamType.validateType('bytes')).to.be.true; + }); + + it('validates bool', () => { + expect(ParamType.validateType('bool')).to.be.true; + }); + + it('validates int', () => { + expect(ParamType.validateType('int')).to.be.true; + }); + + it('validates uint', () => { + expect(ParamType.validateType('uint')).to.be.true; + }); + + it('validates string', () => { + expect(ParamType.validateType('string')).to.be.true; + }); + + it('throws an error on invalid types', () => { + expect(() => ParamType.validateType('noMatch')).to.throw(/noMatch/); + }); + }); + + describe('constructor', () => { + it('throws an error on invalid types', () => { + expect(() => new ParamType('noMatch')).to.throw(/noMatch/); + }); + + it('sets the type of the object', () => { + expect((new ParamType('bool', null, 1)).type).to.equal('bool'); + }); + + it('sets the subtype of the object', () => { + expect((new ParamType('array', 'bool', 1)).subtype).to.equal('bool'); + }); + + it('sets the length of the object', () => { + expect((new ParamType('array', 'bool', 1)).length).to.equal(1); + }); + }); +}); diff --git a/js/src/abi/spec/paramType/types.js b/js/src/abi/spec/paramType/types.js new file mode 100644 index 00000000000..8b8c56f345a --- /dev/null +++ b/js/src/abi/spec/paramType/types.js @@ -0,0 +1,2 @@ +const TYPES = ['address', 'bytes', 'int', 'uint', 'bool', 'string', 'array', 'fixedBytes', 'fixedArray']; +export default TYPES; diff --git a/js/src/abi/token/index.js b/js/src/abi/token/index.js new file mode 100644 index 00000000000..a02ad51a3c3 --- /dev/null +++ b/js/src/abi/token/index.js @@ -0,0 +1 @@ +export default from './token'; diff --git a/js/src/abi/token/token.js b/js/src/abi/token/token.js new file mode 100644 index 00000000000..46279252553 --- /dev/null +++ b/js/src/abi/token/token.js @@ -0,0 +1,26 @@ +import TYPES from '../spec/paramType/types'; + +export default class Token { + constructor (type, value) { + Token.validateType(type); + + this._type = type; + this._value = value; + } + + get type () { + return this._type; + } + + get value () { + return this._value; + } + + static validateType (type) { + if (TYPES.filter((_type) => type === _type).length) { + return true; + } + + throw new Error(`Invalid type ${type} received for Token`); + } +} diff --git a/js/src/abi/token/token.spec.js b/js/src/abi/token/token.spec.js new file mode 100644 index 00000000000..e5cb797a565 --- /dev/null +++ b/js/src/abi/token/token.spec.js @@ -0,0 +1,59 @@ +import Token from './token'; + +describe('abi/token/token', () => { + describe('validateType', () => { + it('validates address', () => { + expect(Token.validateType('address')).to.be.true; + }); + + it('validates fixedArray', () => { + expect(Token.validateType('fixedArray')).to.be.true; + }); + + it('validates array', () => { + expect(Token.validateType('array')).to.be.true; + }); + + it('validates fixedBytes', () => { + expect(Token.validateType('fixedBytes')).to.be.true; + }); + + it('validates bytes', () => { + expect(Token.validateType('bytes')).to.be.true; + }); + + it('validates bool', () => { + expect(Token.validateType('bool')).to.be.true; + }); + + it('validates int', () => { + expect(Token.validateType('int')).to.be.true; + }); + + it('validates uint', () => { + expect(Token.validateType('uint')).to.be.true; + }); + + it('validates string', () => { + expect(Token.validateType('string')).to.be.true; + }); + + it('throws an error on invalid types', () => { + expect(() => Token.validateType('noMatch')).to.throw(/noMatch/); + }); + }); + + describe('constructor', () => { + it('throws an error on invalid types', () => { + expect(() => new Token('noMatch', '1')).to.throw(/noMatch/); + }); + + it('sets the type of the object', () => { + expect((new Token('bool', '1')).type).to.equal('bool'); + }); + + it('sets the value of the object', () => { + expect((new Token('bool', '1')).value).to.equal('1'); + }); + }); +}); diff --git a/js/src/abi/util/pad.js b/js/src/abi/util/pad.js new file mode 100644 index 00000000000..546626ded4d --- /dev/null +++ b/js/src/abi/util/pad.js @@ -0,0 +1,54 @@ +import BigNumber from 'bignumber.js'; +import utf8 from 'utf8'; + +import { isArray } from './types'; + +const ZERO_64 = '0000000000000000000000000000000000000000000000000000000000000000'; + +export function padAddress (input) { + return `${ZERO_64}${input}`.slice(-64); +} + +export function padBool (input) { + return `${ZERO_64}${input ? '1' : '0'}`.slice(-64); +} + +export function padU32 (input) { + let bn = new BigNumber(input); + + if (bn.lessThan(0)) { + bn = new BigNumber('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 16) + .plus(bn).plus(1); + } + + return `${ZERO_64}${bn.toString(16)}`.slice(-64); +} + +export function padBytes (input) { + const length = isArray(input) ? input.length : (`${input}`.length / 2); + + return `${padU32(length)}${padFixedBytes(input)}`; +} + +export function padFixedBytes (input) { + let sinput; + + if (isArray(input)) { + sinput = input.map((code) => code.toString(16)).join(''); + } else { + sinput = `${input}`; + } + + const max = Math.floor((sinput.length + 63) / 64) * 64; + + return `${sinput}${ZERO_64}`.substr(0, max); +} + +export function padString (input) { + const encoded = utf8.encode(input) + .split('') + .map((char) => char.charCodeAt(0).toString(16)) + .join(''); + + return padBytes(encoded); +} diff --git a/js/src/abi/util/pad.spec.js b/js/src/abi/util/pad.spec.js new file mode 100644 index 00000000000..a34219e705d --- /dev/null +++ b/js/src/abi/util/pad.spec.js @@ -0,0 +1,100 @@ +import BigNumber from 'bignumber.js'; +import { padAddress, padBool, padBytes, padFixedBytes, padString, padU32 } from './pad'; + +describe('abi/util/pad', () => { + const SHORT15 = '1234567890abcdef'; + const BYTES15 = [0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef]; + const LONG15 = `${SHORT15}000000000000000000000000000000000000000000000000`; + const PAD123 = '0000000000000000000000000000000000000000000000000000000000000123'; + + describe('padAddress', () => { + it('pads to 64 characters', () => { + expect(padAddress('123')).to.equal(PAD123); + }); + }); + + describe('padBool', () => { + const TRUE = '0000000000000000000000000000000000000000000000000000000000000001'; + const FALSE = '0000000000000000000000000000000000000000000000000000000000000000'; + + it('pads true to 64 characters', () => { + expect(padBool(true)).to.equal(TRUE); + }); + + it('pads false to 64 characters', () => { + expect(padBool(false)).to.equal(FALSE); + }); + }); + + describe('padU32', () => { + it('left pads length < 64 bytes to 64 bytes', () => { + expect(padU32(1)).to.equal('0000000000000000000000000000000000000000000000000000000000000001'); + }); + + it('pads hex representation', () => { + expect(padU32(0x123)).to.equal(PAD123); + }); + + it('pads decimal representation', () => { + expect(padU32(291)).to.equal(PAD123); + }); + + it('pads string representation', () => { + expect(padU32('0x123')).to.equal(PAD123); + }); + + it('pads BigNumber representation', () => { + expect(padU32(new BigNumber(0x123))).to.equal(PAD123); + }); + + it('converts negative numbers to 2s complement', () => { + expect(padU32(-123)).to.equal('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85'); + }); + }); + + describe('padFixedBytes', () => { + it('right pads length < 64 bytes to 64 bytes (string)', () => { + expect(padFixedBytes(SHORT15)).to.equal(LONG15); + }); + + it('right pads length < 64 bytes to 64 bytes (array)', () => { + expect(padFixedBytes(BYTES15)).to.equal(LONG15); + }); + + it('right pads length > 64 bytes (64 byte multiples)', () => { + expect(padFixedBytes(`${LONG15}${SHORT15}`)).to.equal(`${LONG15}${LONG15}`); + }); + }); + + describe('padBytes', () => { + it('right pads length < 64, adding the length (string)', () => { + const result = padBytes(SHORT15); + + expect(result.length).to.equal(128); + expect(result).to.equal(`${padU32(8)}${LONG15}`); + }); + + it('right pads length < 64, adding the length (array)', () => { + const result = padBytes(BYTES15); + + expect(result.length).to.equal(128); + expect(result).to.equal(`${padU32(8)}${LONG15}`); + }); + + it('right pads length > 64, adding the length', () => { + const result = padBytes(`${LONG15}${SHORT15}`); + + expect(result.length).to.equal(192); + expect(result).to.equal(`${padU32(0x28)}${LONG15}${LONG15}`); + }); + }); + + describe('padString', () => { + it('correctly converts & pads strings', () => { + const result = padString('gavofyork'); + + expect(result.length).to.equal(128); + expect(result).to.equal(padBytes('6761766f66796f726b')); + }); + }); +}); diff --git a/js/src/abi/util/signature.js b/js/src/abi/util/signature.js new file mode 100644 index 00000000000..07384987264 --- /dev/null +++ b/js/src/abi/util/signature.js @@ -0,0 +1,13 @@ +import { keccak_256 } from 'js-sha3'; // eslint-disable-line camelcase +import { fromParamType } from '../spec/paramType/format'; + +export function eventSignature (name, params) { + const types = (params || []).map(fromParamType).join(','); + const id = `${name || ''}(${types})`; + + return keccak_256(id); +} + +export function methodSignature (name, params) { + return eventSignature(name, params).substr(0, 8); +} diff --git a/js/src/abi/util/signature.spec.js b/js/src/abi/util/signature.spec.js new file mode 100644 index 00000000000..dd520b96ea3 --- /dev/null +++ b/js/src/abi/util/signature.spec.js @@ -0,0 +1,52 @@ +import { eventSignature, methodSignature } from './signature'; + +describe('abi/util/signature', () => { + describe('eventSignature', () => { + it('encodes signature baz() correctly', () => { + expect(eventSignature('baz', [])) + .to.equal('a7916fac4f538170f7cd12c148552e2cba9fcd72329a2dd5b07a6fa906488ddf'); + }); + + it('encodes signature baz(uint32) correctly', () => { + expect(eventSignature('baz', [{ type: 'uint', length: 32 }])) + .to.equal('7d68785e8fc871be024b75964bd86d093511d4bc2dc7cf7bea32c48a0efaecb1'); + }); + + it('encodes signature baz(uint32, bool) correctly', () => { + expect(eventSignature('baz', [{ type: 'uint', length: 32 }, { type: 'bool' }])) + .to.equal('cdcd77c0992ec5bbfc459984220f8c45084cc24d9b6efed1fae540db8de801d2'); + }); + + it('encodes no-name signature correctly as ()', () => { + expect(eventSignature(undefined, [])) + .to.equal('861731d50c3880a2ca1994d5ec287b94b2f4bd832a67d3e41c08177bdd5674fe'); + }); + + it('encodes no-params signature correctly as ()', () => { + expect(eventSignature(undefined, undefined)) + .to.equal('861731d50c3880a2ca1994d5ec287b94b2f4bd832a67d3e41c08177bdd5674fe'); + }); + }); + + describe('methodSignature', () => { + it('encodes signature baz() correctly', () => { + expect(methodSignature('baz', [])).to.equal('a7916fac'); + }); + + it('encodes signature baz(uint32) correctly', () => { + expect(methodSignature('baz', [{ type: 'uint', length: 32 }])).to.equal('7d68785e'); + }); + + it('encodes signature baz(uint32, bool) correctly', () => { + expect(methodSignature('baz', [{ type: 'uint', length: 32 }, { type: 'bool' }])).to.equal('cdcd77c0'); + }); + + it('encodes no-name signature correctly as ()', () => { + expect(methodSignature(undefined, [])).to.equal('861731d5'); + }); + + it('encodes no-params signature correctly as ()', () => { + expect(methodSignature(undefined, undefined)).to.equal('861731d5'); + }); + }); +}); diff --git a/js/src/abi/util/slice.js b/js/src/abi/util/slice.js new file mode 100644 index 00000000000..8455b248129 --- /dev/null +++ b/js/src/abi/util/slice.js @@ -0,0 +1,13 @@ +export function sliceData (_data) { + if (!_data || !_data.length) { + return []; + } + + let data = (_data.substr(0, 2) === '0x') ? _data.substr(2) : _data; + + if (data.length % 64) { + throw new Error('Invalid data length (not mod 64) passed to sliceData'); + } + + return data.match(/.{1,64}/g); +} diff --git a/js/src/abi/util/slice.spec.js b/js/src/abi/util/slice.spec.js new file mode 100644 index 00000000000..6fe9adb9a16 --- /dev/null +++ b/js/src/abi/util/slice.spec.js @@ -0,0 +1,32 @@ +import { sliceData } from './slice'; + +describe('abi/util/slice', () => { + describe('sliceData', () => { + const slice1 = '131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'; + const slice2 = '2124768576358735263578356373526387638357635873563586353756358763'; + + it('throws an error on mod 64 != 0', () => { + expect(() => sliceData('123')).to.throw(/sliceData/); + }); + + it('returns an empty array when length === 0', () => { + expect(sliceData('')).to.deep.equal([]); + }); + + it('returns an array with the slices otherwise', () => { + const sliced = sliceData(`${slice1}${slice2}`); + + expect(sliced.length).to.equal(2); + expect(sliced[0]).to.equal(slice1); + expect(sliced[1]).to.equal(slice2); + }); + + it('removes leading 0x when passed in', () => { + const sliced = sliceData(`0x${slice1}${slice2}`); + + expect(sliced.length).to.equal(2); + expect(sliced[0]).to.equal(slice1); + expect(sliced[1]).to.equal(slice2); + }); + }); +}); diff --git a/js/src/abi/util/sliceAs.js b/js/src/abi/util/sliceAs.js new file mode 100644 index 00000000000..25ed2231082 --- /dev/null +++ b/js/src/abi/util/sliceAs.js @@ -0,0 +1,29 @@ +import BigNumber from 'bignumber.js'; + +export function asU32 (slice) { + // TODO: validation + + return new BigNumber(slice, 16); +} + +export function asI32 (slice) { + if (new BigNumber(slice.substr(0, 1), 16).toString(2)[0] === '1') { + return new BigNumber(slice, 16) + .minus(new BigNumber('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 16)) + .minus(1); + } + + return new BigNumber(slice, 16); +} + +export function asAddress (slice) { + // TODO: address validation? + + return slice.slice(-40); +} + +export function asBool (slice) { + // TODO: everything else should be 0 + + return new BigNumber(slice[63]).eq(1); +} diff --git a/js/src/abi/util/sliceAs.spec.js b/js/src/abi/util/sliceAs.spec.js new file mode 100644 index 00000000000..78801aface9 --- /dev/null +++ b/js/src/abi/util/sliceAs.spec.js @@ -0,0 +1,38 @@ +import { asAddress, asBool, asI32, asU32 } from './sliceAs'; + +describe('abi/util/sliceAs', () => { + const MAX_INT = 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'; + + describe('asAddress', () => { + it('correctly returns the last 40 characters', () => { + const address = '1111111111222222222233333333334444444444'; + expect(asAddress(`000000000000000000000000${address}`)).to.equal(address); + }); + }); + + describe('asBool', () => { + it('correctly returns true', () => { + expect(asBool('0000000000000000000000000000000000000000000000000000000000000001')).to.be.true; + }); + + it('correctly returns false', () => { + expect(asBool('0000000000000000000000000000000000000000000000000000000000000000')).to.be.false; + }); + }); + + describe('asI32', () => { + it('correctly decodes positive numbers', () => { + expect(asI32('000000000000000000000000000000000000000000000000000000000000007b').toString()).to.equal('123'); + }); + + it('correctly decodes negative numbers', () => { + expect(asI32('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85').toString()).to.equal('-123'); + }); + }); + + describe('asU32', () => { + it('returns a maxium U32', () => { + expect(asU32(MAX_INT).toString(16)).to.equal(MAX_INT); + }); + }); +}); diff --git a/js/src/abi/util/types.js b/js/src/abi/util/types.js new file mode 100644 index 00000000000..cf3a89fec9f --- /dev/null +++ b/js/src/abi/util/types.js @@ -0,0 +1,11 @@ +export function isArray (test) { + return Object.prototype.toString.call(test) === '[object Array]'; +} + +export function isString (test) { + return Object.prototype.toString.call(test) === '[object String]'; +} + +export function isInstanceOf (test, clazz) { + return test instanceof clazz; +} diff --git a/js/src/abi/util/types.spec.js b/js/src/abi/util/types.spec.js new file mode 100644 index 00000000000..bc2ceb118c9 --- /dev/null +++ b/js/src/abi/util/types.spec.js @@ -0,0 +1,46 @@ +import { isArray, isString, isInstanceOf } from './types'; +import Token from '../token'; + +describe('abi/util/types', () => { + describe('isArray', () => { + it('correctly identifies empty arrays as Array', () => { + expect(isArray([])).to.be.true; + }); + + it('correctly identifies non-empty arrays as Array', () => { + expect(isArray([1, 2, 3])).to.be.true; + }); + + it('correctly identifies strings as non-Array', () => { + expect(isArray('not an array')).to.be.false; + }); + + it('correctly identifies objects as non-Array', () => { + expect(isArray({})).to.be.false; + }); + }); + + describe('isString', () => { + it('correctly identifies empty string as string', () => { + expect(isString('')).to.be.true; + }); + + it('correctly identifies string as string', () => { + expect(isString('123')).to.be.true; + }); + }); + + describe('isInstanceOf', () => { + it('correctly identifies build-in instanceof', () => { + expect(isInstanceOf(new String('123'), String)).to.be.true; // eslint-disable-line no-new-wrappers + }); + + it('correctly identifies own instanceof', () => { + expect(isInstanceOf(new Token('int', 123), Token)).to.be.true; + }); + + it('correctly reports false for own', () => { + expect(isInstanceOf({ type: 'int' }, Token)).to.be.false; + }); + }); +}); diff --git a/js/src/api/README.md b/js/src/api/README.md new file mode 100644 index 00000000000..e3b32431a92 --- /dev/null +++ b/js/src/api/README.md @@ -0,0 +1,145 @@ +# ethapi-js + +A thin, fast, low-level Promise-based wrapper around the Ethereum APIs. + +[![Build Status](https://travis-ci.org/jacogr/ethapi-js.svg?branch=master)](https://travis-ci.org/jacogr/ethapi-js) +[![Coverage Status](https://coveralls.io/repos/github/jacogr/ethapi-js/badge.svg?branch=master)](https://coveralls.io/github/jacogr/ethapi-js?branch=master) +[![Dependency Status](https://david-dm.org/jacogr/ethapi-js.svg)](https://david-dm.org/jacogr/ethapi-js) +[![devDependency Status](https://david-dm.org/jacogr/ethapi-js/dev-status.svg)](https://david-dm.org/jacogr/ethapi-js#info=devDependencies) + +## contributing + +Clone the repo and install dependencies via `npm install`. Tests can be executed via + +- `npm run testOnce` (100% covered unit tests) +- `npm run testE2E` (E2E against a running RPC-enabled testnet Parity/Geth instance, `parity --testnet` and for WebScokets, `geth --testnet --ws --wsorigins '*' --rpc`) +- setting the environment `DEBUG=true` will display the RPC POST bodies and responses on E2E tests + +## installation + +Install the package with `npm install --save ethapi-js` from the [npm registry ethapi-js](https://www.npmjs.com/package/ethapi-js) + +## usage + +### initialisation + +```javascript +// import the actual EthApi class +import EthApi from 'ethapi-js'; + +// do the setup +const transport = new EthApi.Transport.Http('http://localhost:8545'); // or .Ws('ws://localhost:8546') +const ethapi = new EthApi(transport); +``` + +You will require native Promises and fetch support (latest browsers only), they can be utilised by + +```javascript +import 'isomorphic-fetch'; + +import es6Promise from 'es6-promise'; +es6Promise.polyfill(); +``` + +### making calls + +perform a call + +```javascript +ethapi.eth + .coinbase() + .then((coinbase) => { + console.log(`The coinbase is ${coinbase}`); + }); +``` + +multiple promises + +```javascript +Promise + .all([ + ethapi.eth.coinbase(), + ethapi.net.listening() + ]) + .then(([coinbase, listening]) => { + // do stuff here + }); +``` + +chaining promises + +```javascript +ethapi.eth + .newFilter({...}) + .then((filterId) => ethapi.eth.getFilterChanges(filterId)) + .then((changes) => { + console.log(changes); + }); +``` + +### contracts + +attach contract + +```javascript +const abi = [{ name: 'callMe', inputs: [{ type: 'bool', ...}, { type: 'string', ...}]}, ...abi...]; +const contract = new EthApi.Contract(ethapi, abi); +``` + +deploy + +```javascript +contract + .deploy('0xc0de', [params], 'superPassword') + .then((address) => { + console.log(`the contract was deployed at ${address}`); + }); +``` + +attach a contract at address + +```javascript +// via the constructor & .at function +const contract = new EthApi.Contract(ethapi, abi).at('0xa9280...7347b'); +// or on an already initialised contract +contract.at('0xa9280...7347b'); +// perform calls here +``` + +find & call a function + +```javascript +contract.functions + .find((func) => func.name === 'callMe') + .call({ gas: 21000 }, [true, 'someString']) // or estimateGas or sendTransaction + .then((result) => { + console.log(`the result was ${result}`); + }); +``` + +parse events from transaction receipt + +```javascript +contract + .parseTransactionEvents(txReceipt) + .then((receipt) => { + receipt.logs.forEach((log) => { + console.log('log parameters', log.params); + }); + }); +``` + +## apis + +APIs implement the calls as exposed in the [Ethcore JSON Ethereum RPC](https://github.com/ethcore/ethereum-rpc-json/) definitions. Mapping follows the naming conventions of the originals, i.e. `eth_call` becomes `eth.call`, `personal_accounts` becomes `personal.accounts`, etc. + +- [ethapi.db](https://github.com/ethcore/ethereum-rpc-json/blob/master/interfaces.md#db) +- [ethapi.eth](https://github.com/ethcore/ethereum-rpc-json/blob/master/interfaces.md#eth) +- [ethapi.ethcore](https://github.com/ethcore/ethereum-rpc-json/blob/master/interfaces.md#ethcore) +- [ethapi.net](https://github.com/ethcore/ethereum-rpc-json/blob/master/interfaces.md#net) +- [ethapi.personal](https://github.com/ethcore/ethereum-rpc-json/blob/master/interfaces.md#personal) +- [ethapi.shh](https://github.com/ethcore/ethereum-rpc-json/blob/master/interfaces.md#shh) +- [ethapi.trace](https://github.com/ethcore/ethereum-rpc-json/blob/master/interfaces.md#trace) +- [ethapi.web3](https://github.com/ethcore/ethereum-rpc-json/blob/master/interfaces.md#web3) + +As a verification step, all exposed interfaces are tested for existing and pointing to the correct endpoints by using the generated interfaces from the above repo. diff --git a/js/src/api/api.js b/js/src/api/api.js new file mode 100644 index 00000000000..097413433ee --- /dev/null +++ b/js/src/api/api.js @@ -0,0 +1,64 @@ +import { Http, Ws } from './transport/index'; +import Contract from './contract/index'; + +import { Db, Eth, Ethcore, Net, Personal, Shh, Trace, Web3 } from './rpc/index'; +import format from './format/index'; +import { isFunction } from './util/types'; + +export default class Api { + constructor (transport) { + if (!transport || !isFunction(transport.execute)) { + throw new Error('EthApi needs transport with execute() function defined'); + } + + this._db = new Db(transport); + this._eth = new Eth(transport); + this._ethcore = new Ethcore(transport); + this._net = new Net(transport); + this._personal = new Personal(transport); + this._shh = new Shh(transport); + this._trace = new Trace(transport); + this._web3 = new Web3(transport); + } + + get db () { + return this._db; + } + + get eth () { + return this._eth; + } + + get ethcore () { + return this._ethcore; + } + + get net () { + return this._net; + } + + get personal () { + return this._personal; + } + + get shh () { + return this._shh; + } + + get trace () { + return this._trace; + } + + get web3 () { + return this._web3; + } + + static format = format; + + static Contract = Contract + + static Transport = { + Http: Http, + Ws: Ws + } +} diff --git a/js/src/api/api.spec.js b/js/src/api/api.spec.js new file mode 100644 index 00000000000..6b316afdbf2 --- /dev/null +++ b/js/src/api/api.spec.js @@ -0,0 +1,31 @@ +import { TEST_HTTP_URL, endpointTest } from '../../test/mockRpc'; + +import Api from './api'; + +import ethereumRpc from '../jsonrpc/'; + +describe('api/Api', () => { + describe('constructor', () => { + it('requires defined/non-null transport object', () => { + expect(() => new Api()).to.throw(/Api needs transport/); + expect(() => new Api(null)).to.throw(/Api needs transport/); + }); + + it('requires an execute function on the transport object', () => { + expect(() => new Api({})).to.throw(/Api needs transport/); + expect(() => new Api({ execute: true })).to.throw(/Api needs transport/); + }); + }); + + describe('interface', () => { + const api = new Api(new Api.Transport.Http(TEST_HTTP_URL)); + + Object.keys(ethereumRpc).sort().forEach((endpoint) => { + describe(endpoint, () => { + Object.keys(ethereumRpc[endpoint]).sort().forEach((method) => { + endpointTest(api, endpoint, method); + }); + }); + }); + }); +}); diff --git a/js/src/api/contract/contract.js b/js/src/api/contract/contract.js new file mode 100644 index 00000000000..c50616adef0 --- /dev/null +++ b/js/src/api/contract/contract.js @@ -0,0 +1,162 @@ +import Abi from '../../abi'; +import Api from '../api'; +import { isInstanceOf } from '../util/types'; + +export default class Contract { + constructor (eth, abi) { + if (!isInstanceOf(eth, Api)) { + throw new Error('EthApi needs to be provided to Contract instance'); + } else if (!abi) { + throw new Error('Object ABI needs to be provided to Contract instance'); + } + + this._eth = eth; + this._abi = new Abi(abi); + + this._constructors = this._abi.constructors.map((cons) => this._bindFunction(cons)); + this._functions = this._abi.functions.map((func) => this._bindFunction(func)); + this._events = this._abi.events; + } + + get address () { + return this._address; + } + + get constructors () { + return this._constructors; + } + + get events () { + return this._events; + } + + get functions () { + return this._functions; + } + + get eth () { + return this._eth; + } + + get abi () { + return this._abi; + } + + at (address) { + this._address = address; + return this; + } + + deploy (code, values, password) { + const options = { + data: code, + gas: 900000 + }; + + return this._eth.personal + .signAndSendTransaction(this._encodeOptions(this.constructors[0], options, values), password) + .then((txhash) => this.pollTransactionReceipt(txhash)) + .then((receipt) => { + this._address = receipt.contractAddress; + return this._eth.eth.getCode(this._address); + }) + .then((code) => { + if (code === '0x') { + throw new Error('Contract not deployed, getCode returned 0x'); + } + + return this.address; + }); + } + + parseTransactionEvents (receipt) { + receipt.logs = receipt.logs.map((log) => { + const signature = log.topics[0].substr(2); + const event = this.events.find((evt) => evt.signature === signature); + + if (!event) { + throw new Error(`Unable to find event matching signature ${signature}`); + } + + const decoded = event.decodeLog(log.topics, log.data); + + log.params = {}; + log.address = decoded.address; + + decoded.params.forEach((param) => { + log.params[param.name] = param.token.value; + }); + + return log; + }); + + return receipt; + } + + pollTransactionReceipt (txhash) { + return new Promise((resolve, reject) => { + const timeout = () => { + this._eth.eth + .getTransactionReceipt(txhash) + .then((receipt) => { + if (receipt) { + resolve(receipt); + } else { + setTimeout(timeout, 500); + } + }) + .catch((error) => { + reject(error); + }); + }; + + timeout(); + }); + } + + _encodeOptions (func, options, values) { + const tokens = this._abi.encodeTokens(func.inputParamTypes(), values); + + if (options.data && options.data.substr(0, 2) === '0x') { + options.data = options.data.substr(2); + } + + options.data = `0x${options.data || ''}${func.encodeCall(tokens)}`; + + return options; + } + + _bindFunction (func) { + const addAddress = (options) => { + options.to = options.to || this._address; + return options; + }; + + func.call = (options, values) => { + return this._eth.eth + .call(this._encodeOptions(func, addAddress(options), values)) + .then((encoded) => func.decodeOutput(encoded)) + .then((tokens) => tokens.map((token) => token.value)) + .then((returns) => returns.length === 1 ? returns[0] : returns); + }; + + if (!func.constant) { + func.sendTransaction = (options, values) => { + return this._eth.eth + .sendTransaction(this._encodeOptions(func, addAddress(options), values)); + }; + + func.signAndSendTransaction = (options, values, password) => { + return this._eth.personal + .signAndSendTransaction(this._encodeOptions(func, addAddress(options), values), password); + }; + + func.estimateGas = (options, values) => { + return this._eth.eth + .estimateGas(this._encodeOptions(func, addAddress(options), values)); + }; + } + + return func; + } +} diff --git a/js/src/api/contract/contract.spec.js b/js/src/api/contract/contract.spec.js new file mode 100644 index 00000000000..e112f3ded81 --- /dev/null +++ b/js/src/api/contract/contract.spec.js @@ -0,0 +1,371 @@ +import BigNumber from 'bignumber.js'; + +import { TEST_HTTP_URL, mockHttp } from '../../../test/mockRpc'; + +import Abi from '../../abi'; + +import Api from '../api'; +import Contract from './contract'; +import { isInstanceOf, isFunction } from '../util/types'; + +const transport = new Api.Transport.Http(TEST_HTTP_URL); +const eth = new Api(transport); + +describe('api/contract/Contract', () => { + const ADDR = '0x0123456789'; + const ABI = [ + { + type: 'function', name: 'test', + inputs: [{ name: 'boolin', type: 'bool' }, { name: 'stringin', type: 'string' }], + outputs: [{ type: 'uint' }] + }, + { + type: 'function', name: 'test2', + outputs: [{ type: 'uint' }, { type: 'uint' }] + }, + { type: 'constructor' }, + { type: 'event', name: 'baz' }, + { type: 'event', name: 'foo' } + ]; + const VALUES = [true, 'jacogr']; + const ENCODED = '0x023562050000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000066a61636f67720000000000000000000000000000000000000000000000000000'; + const RETURN1 = '0000000000000000000000000000000000000000000000000000000000123456'; + const RETURN2 = '0000000000000000000000000000000000000000000000000000000000456789'; + let scope; + + describe('constructor', () => { + it('needs an EthAbi instance', () => { + expect(() => new Contract()).to.throw(/EthApi needs to be provided/); + }); + + it('needs an ABI', () => { + expect(() => new Contract(eth)).to.throw(/Object ABI needs/); + }); + + describe('internal setup', () => { + const contract = new Contract(eth, ABI); + + it('sets EthApi & parsed interface', () => { + expect(contract.address).to.not.be.ok; + expect(contract.eth).to.deep.equal(eth); + expect(isInstanceOf(contract.abi, Abi)).to.be.ok; + }); + + it('attaches functions', () => { + expect(contract.functions.length).to.equal(2); + expect(contract.functions[0].name).to.equal('test'); + }); + + it('attaches constructors', () => { + expect(contract.constructors.length).to.equal(1); + }); + + it('attaches events', () => { + expect(contract.events.length).to.equal(2); + expect(contract.events[0].name).to.equal('baz'); + }); + }); + }); + + describe('at', () => { + it('sets returns the instance & sets the address', () => { + const contract = new Contract(eth, []); + + expect(contract.at('123')).to.deep.equal(contract); + expect(contract.at('456').address).to.equal('456'); + }); + }); + + describe('parseTransactionEvents', () => { + it('checks for unmatched signatures', () => { + const contract = new Contract(eth, [{ anonymous: false, name: 'Message', type: 'event' }]); + expect(() => contract.parseTransactionEvents({ + logs: [{ + data: '0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063cf90d3f0410092fc0fca41846f5962239791950000000000000000000000000000000000000000000000000000000056e6c85f0000000000000000000000000000000000000000000000000001000000004fcd00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000d706f7374286d6573736167652900000000000000000000000000000000000000', + topics: [ + '0x954ba6c157daf8a26539574ffa64203c044691aa57251af95f4b48d85ec00dd5', + '0x0000000000000000000000000000000000000000000000000001000000004fe0' + ] + }] + })).to.throw(/event matching signature/); + }); + + it('parses a transaction log into the data', () => { + const contract = new Contract(eth, [ + { + anonymous: false, name: 'Message', type: 'event', + inputs: [ + { indexed: true, name: 'postId', type: 'uint256' }, + { indexed: false, name: 'parentId', type: 'uint256' }, + { indexed: false, name: 'sender', type: 'address' }, + { indexed: false, name: 'at', type: 'uint256' }, + { indexed: false, name: 'messageId', type: 'uint256' }, + { indexed: false, name: 'message', type: 'string' } + ] + } + ]); + const decoded = contract.parseTransactionEvents({ + blockHash: '0xa9280530a3b47bee2fc80f2862fd56502ae075350571d724d6442ea4c597347b', + blockNumber: '0x4fcd', + cumulativeGasUsed: '0xb57f', + gasUsed: '0xb57f', + logs: [{ + address: '0x22bff18ec62281850546a664bb63a5c06ac5f76c', + blockHash: '0xa9280530a3b47bee2fc80f2862fd56502ae075350571d724d6442ea4c597347b', + blockNumber: '0x4fcd', + data: '0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063cf90d3f0410092fc0fca41846f5962239791950000000000000000000000000000000000000000000000000000000056e6c85f0000000000000000000000000000000000000000000000000001000000004fcd00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000d706f7374286d6573736167652900000000000000000000000000000000000000', + logIndex: '0x0', + topics: [ + '0x954ba6c157daf8a26539574ffa64203c044691aa57251af95f4b48d85ec00dd5', + '0x0000000000000000000000000000000000000000000000000001000000004fe0' + ], + transactionHash: '0xca16f537d761d13e4e80953b754e2b15541f267d6cad9381f750af1bae1e4917', + transactionIndex: '0x0' + }], + to: '0x22bff18ec62281850546a664bb63a5c06ac5f76c', + transactionHash: '0xca16f537d761d13e4e80953b754e2b15541f267d6cad9381f750af1bae1e4917', + transactionIndex: '0x0' + }); + + expect(decoded.logs[0].params).to.deep.equal({ + at: new BigNumber('1457965151'), + message: 'post(message)', + messageId: new BigNumber('281474976731085'), + parentId: new BigNumber(0), + postId: new BigNumber('281474976731104'), + sender: '63cf90d3f0410092fc0fca41846f596223979195' + }); + }); + }); + + describe('pollTransactionReceipt', () => { + const contract = new Contract(eth, ABI); + const RECEIPT = { contractAddress: '0xd337e80eedbdf86edbba021797d7e4e00bb78351' }; + const EXPECT = { contractAddress: '0xD337e80eEdBdf86eDBba021797d7e4e00Bb78351' }; + + let scope; + let receipt; + + describe('success', () => { + before(() => { + scope = mockHttp([ + { method: 'eth_getTransactionReceipt', reply: { result: null } }, + { method: 'eth_getTransactionReceipt', reply: { result: null } }, + { method: 'eth_getTransactionReceipt', reply: { result: RECEIPT } } + ]); + + return contract + .pollTransactionReceipt('0x123') + .then((_receipt) => { + receipt = _receipt; + }); + }); + + it('sends multiple getTransactionReceipt calls', () => { + expect(scope.isDone()).to.be.true; + }); + + it('passes the txhash through', () => { + expect(scope.body.eth_getTransactionReceipt.params[0]).to.equal('0x123'); + }); + + it('receives the final receipt', () => { + expect(receipt).to.deep.equal(EXPECT); + }); + }); + + describe('error', () => { + before(() => { + scope = mockHttp([{ method: 'eth_getTransactionReceipt', reply: { error: { code: -1, message: 'failure' } } }]); + }); + + it('returns the errors', () => { + return contract + .pollTransactionReceipt('0x123') + .catch((error) => { + expect(error.message).to.match(/failure/); + }); + }); + }); + }); + + describe('deploy', () => { + const contract = new Contract(eth, ABI); + const RECEIPT = { contractAddress: '0xd337e80eedbdf86edbba021797d7e4e00bb78351' }; + const ADDRESS = '0xD337e80eEdBdf86eDBba021797d7e4e00Bb78351'; + + let scope; + + describe('success', () => { + before(() => { + scope = mockHttp([ + { method: 'personal_signAndSendTransaction', reply: { result: '0x678' } }, + { method: 'eth_getTransactionReceipt', reply: { result: null } }, + { method: 'eth_getTransactionReceipt', reply: { result: RECEIPT } }, + { method: 'eth_getCode', reply: { result: '0x456' } } + ]); + + return contract.deploy('0x123', [], 'xxx'); + }); + + it('calls sendTransaction, getTransactionReceipt & getCode in order', () => { + expect(scope.isDone()).to.be.true; + }); + + it('passes the options & password through to sendTransaction', () => { + expect(scope.body.personal_signAndSendTransaction.params).to.deep.equal([ + { data: '0x123', gas: '0xdbba0' }, + 'xxx' + ]); + }); + + it('sets the address of the contract', () => { + expect(contract.address).to.equal(ADDRESS); + }); + }); + + describe('error', () => { + before(() => { + scope = mockHttp([ + { method: 'personal_signAndSendTransaction', reply: { result: '0x678' } }, + { method: 'eth_getTransactionReceipt', reply: { result: RECEIPT } }, + { method: 'eth_getCode', reply: { result: '0x' } } + ]); + }); + + it('fails when no code was deployed', () => { + return contract + .deploy('0x123', [], 'xxx') + .catch((error) => { + expect(error.message).to.match(/not deployed/); + }); + }); + }); + }); + + describe('bindings', () => { + let contract; + let cons; + let func; + + beforeEach(() => { + contract = new Contract(eth, ABI).at(ADDR); + cons = contract.constructors[0]; + func = contract.functions.find((fn) => fn.name === 'test'); + }); + + describe('attachments', () => { + it('attaches .call, .sendTransaction, .signAndSend & .estimateGas to constructors', () => { + expect(isFunction(cons.call)).to.be.true; + expect(isFunction(cons.sendTransaction)).to.be.true; + expect(isFunction(cons.signAndSendTransaction)).to.be.true; + expect(isFunction(cons.estimateGas)).to.be.true; + }); + + it('attaches .call, .sendTransaction, .signAndSend & .estimateGas to functions', () => { + expect(isFunction(func.call)).to.be.true; + expect(isFunction(func.sendTransaction)).to.be.true; + expect(isFunction(func.signAndSendTransaction)).to.be.true; + expect(isFunction(func.estimateGas)).to.be.true; + }); + + it('attaches .call only to constant functions', () => { + func = (new Contract(eth, [{ type: 'function', name: 'test', constant: true }])).functions[0]; + + expect(isFunction(func.call)).to.be.true; + expect(isFunction(func.sendTransaction)).to.be.false; + expect(isFunction(func.signAndSendTransaction)).to.be.false; + expect(isFunction(func.estimateGas)).to.be.false; + }); + }); + + describe('sendTransaction', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_sendTransaction', reply: { result: ['hashId'] } }]); + }); + + it('encodes options and mades an eth_sendTransaction call', () => { + return func + .sendTransaction({ someExtras: 'foo' }, VALUES) + .then(() => { + expect(scope.isDone()).to.be.true; + expect(scope.body.eth_sendTransaction.params[0]).to.deep.equal({ + someExtras: 'foo', + to: ADDR, + data: ENCODED + }); + }); + }); + }); + + describe('signAndSendTransaction', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'personal_signAndSendTransaction', reply: { result: ['hashId'] } }]); + }); + + it('encodes options and mades an personal_signAndSendTransaction call', () => { + return func + .signAndSendTransaction({ someExtras: 'foo' }, VALUES, 'xxx') + .then(() => { + expect(scope.isDone()).to.be.true; + expect(scope.body.personal_signAndSendTransaction.params).to.deep.equal([{ + someExtras: 'foo', + to: ADDR, + data: ENCODED + }, 'xxx']); + }); + }); + }); + + describe('estimateGas', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_estimateGas', reply: { result: ['0x123'] } }]); + }); + + it('encodes options and mades an eth_estimateGas call', () => { + return func + .estimateGas({ someExtras: 'foo' }, VALUES) + .then((amount) => { + expect(scope.isDone()).to.be.true; + expect(amount.toString(16)).to.equal('123'); + expect(scope.body.eth_estimateGas.params).to.deep.equal([{ + someExtras: 'foo', + to: ADDR, + data: ENCODED + }]); + }); + }); + }); + + describe('call', () => { + it('encodes options and mades an eth_call call', () => { + scope = mockHttp([{ method: 'eth_call', reply: { result: RETURN1 } }]); + + return func + .call({ someExtras: 'foo' }, VALUES) + .then((result) => { + expect(scope.isDone()).to.be.true; + expect(scope.body.eth_call.params).to.deep.equal([{ + someExtras: 'foo', + to: ADDR, + data: ENCODED + }, 'latest']); + expect(result.toString(16)).to.equal('123456'); + }); + }); + + it('encodes options and mades an eth_call call (multiple returns)', () => { + scope = mockHttp([{ method: 'eth_call', reply: { result: `${RETURN1}${RETURN2}` } }]); + + return contract.functions[1] + .call({}, []) + .then((result) => { + expect(scope.isDone()).to.be.true; + expect(result.length).to.equal(2); + expect(result[0].toString(16)).to.equal('123456'); + expect(result[1].toString(16)).to.equal('456789'); + }); + }); + }); + }); +}); diff --git a/js/src/api/contract/index.js b/js/src/api/contract/index.js new file mode 100644 index 00000000000..4834a374db7 --- /dev/null +++ b/js/src/api/contract/index.js @@ -0,0 +1 @@ +export default from './contract'; diff --git a/js/src/api/format/address.js b/js/src/api/format/address.js new file mode 100644 index 00000000000..6cc523872c6 --- /dev/null +++ b/js/src/api/format/address.js @@ -0,0 +1,49 @@ +import { keccak_256 } from 'js-sha3'; // eslint-disable-line camelcase + +export function isChecksumValid (_address) { + const address = _address.replace('0x', ''); + const hash = keccak_256(address.toLowerCase(address)); + + for (let n = 0; n < 40; n++) { + const hashval = parseInt(hash[n], 16); + const isLower = address[n].toUpperCase() !== address[n]; + const isUpper = address[n].toLowerCase() !== address[n]; + + if ((hashval > 7 && isLower) || (hashval <= 7 && isUpper)) { + return false; + } + } + + return true; +} + +export function isAddress (address) { + if (address && address.length === 42) { + if (!/^(0x)?[0-9a-f]{40}$/i.test(address)) { + return false; + } else if (/^(0x)?[0-9a-f]{40}$/.test(address) || /^(0x)?[0-9A-F]{40}$/.test(address)) { + return true; + } + + return isChecksumValid(address); + } + + return false; +} + +export function toChecksumAddress (_address) { + const address = (_address || '').toLowerCase(); + + if (!isAddress(address)) { + return ''; + } + + const hash = keccak_256(address.slice(-40)); + let result = '0x'; + + for (let n = 0; n < 40; n++) { + result = `${result}${parseInt(hash[n], 16) > 7 ? address[n + 2].toUpperCase() : address[n + 2]}`; + } + + return result; +} diff --git a/js/src/api/format/address.spec.js b/js/src/api/format/address.spec.js new file mode 100644 index 00000000000..dbbd2a9616d --- /dev/null +++ b/js/src/api/format/address.spec.js @@ -0,0 +1,84 @@ +import { isChecksumValid, isAddress, toChecksumAddress } from './address'; + +describe('api/format/address', () => { + const value = '63Cf90D3f0410092FC0fca41846f596223979195'; + const address = `0x${value}`; + const lowercase = `0x${value.toLowerCase()}`; + const uppercase = `0x${value.toUpperCase()}`; + const invalid = '0x' + value.split('').map((char) => { + if (char >= 'a' && char <= 'f') { + return char.toUpperCase(); + } else if (char >= 'A' && char <= 'F') { + return char.toLowerCase(); + } + + return char; + }).join(''); + const invalidhex = '0x01234567890123456789012345678901234567gh'; + + describe('isChecksumValid', () => { + it('returns false when fully lowercase', () => { + expect(isChecksumValid(lowercase)).to.be.false; + }); + + it('returns false when fully uppercase', () => { + expect(isChecksumValid(uppercase)).to.be.false; + }); + + it('returns false on a mixed-case address', () => { + expect(isChecksumValid(invalid)).to.be.false; + }); + + it('returns true on a checksummed address', () => { + expect(isChecksumValid(address)).to.be.true; + }); + }); + + describe('isAddress', () => { + it('returns true when fully lowercase', () => { + expect(isAddress(lowercase)).to.be.true; + }); + + it('returns true when fully uppercase', () => { + expect(isAddress(uppercase)).to.be.true; + }); + + it('returns true when checksummed', () => { + expect(isAddress(address)).to.be.true; + }); + + it('returns false when invalid checksum', () => { + expect(isAddress(invalid)).to.be.false; + }); + + it('returns false on valid length, non-hex', () => { + expect(isAddress(invalidhex)).to.be.false; + }); + }); + + describe('toChecksumAddress', () => { + it('returns empty when no address specified', () => { + expect(toChecksumAddress()).to.equal(''); + }); + + it('returns empty on invalid address structure', () => { + expect(toChecksumAddress('0xnotaddress')).to.equal(''); + }); + + it('returns formatted address on checksum input', () => { + expect(toChecksumAddress(address)).to.equal(address); + }); + + it('returns formatted address on lowercase input', () => { + expect(toChecksumAddress(lowercase)).to.equal(address); + }); + + it('returns formatted address on uppercase input', () => { + expect(toChecksumAddress(uppercase)).to.equal(address); + }); + + it('returns formatted address on mixed input', () => { + expect(toChecksumAddress(invalid)).to.equal(address); + }); + }); +}); diff --git a/js/src/api/format/index.js b/js/src/api/format/index.js new file mode 100644 index 00000000000..00be8673881 --- /dev/null +++ b/js/src/api/format/index.js @@ -0,0 +1,9 @@ +import { isAddress, toChecksumAddress } from './address'; +import { fromWei, toWei } from './wei'; + +export default { + isAddressValid: isAddress, + fromWei: fromWei, + toChecksumAddress: toChecksumAddress, + toWei: toWei +}; diff --git a/js/src/api/format/input.js b/js/src/api/format/input.js new file mode 100644 index 00000000000..3b01760e5f8 --- /dev/null +++ b/js/src/api/format/input.js @@ -0,0 +1,94 @@ +import BigNumber from 'bignumber.js'; + +import { isInstanceOf, isString } from '../util/types'; + +export function inAddress (address) { + // TODO: address validation if we have upper-lower addresses + return inHex(address); +} + +export function inBlockNumber (blockNumber) { + if (isString(blockNumber)) { + switch (blockNumber) { + case 'earliest': + case 'latest': + case 'pending': + return blockNumber; + } + } + + return inNumber16(blockNumber); +} + +export function inData (data) { + return inHex(data); +} + +export function inFilter (options) { + if (options) { + Object.keys(options).forEach((key) => { + switch (key) { + case 'address': + options[key] = inAddress(options[key]); + break; + + case 'fromBlock': + case 'toBlock': + options[key] = inBlockNumber(options[key]); + break; + } + }); + } + + return options; +} + +export function inHex (str) { + if (str && str.substr(0, 2) === '0x') { + return str.toLowerCase(); + } + + return `0x${(str || '').toLowerCase()}`; +} + +export function inNumber10 (number) { + if (isInstanceOf(number, BigNumber)) { + return number.toNumber(); + } + + return (new BigNumber(number || 0)).toNumber(); +} + +export function inNumber16 (number) { + if (isInstanceOf(number, BigNumber)) { + return inHex(number.toString(16)); + } + + return inHex((new BigNumber(number || 0)).toString(16)); +} + +export function inOptions (options) { + if (options) { + Object.keys(options).forEach((key) => { + switch (key) { + case 'from': + case 'to': + options[key] = inAddress(options[key]); + break; + + case 'gas': + case 'gasPrice': + case 'value': + case 'nonce': + options[key] = inNumber16(options[key]); + break; + + case 'data': + options[key] = inData(options[key]); + break; + } + }); + } + + return options; +} diff --git a/js/src/api/format/input.spec.js b/js/src/api/format/input.spec.js new file mode 100644 index 00000000000..1be4e1a1589 --- /dev/null +++ b/js/src/api/format/input.spec.js @@ -0,0 +1,223 @@ +import BigNumber from 'bignumber.js'; + +import { inAddress, inBlockNumber, inData, inFilter, inHex, inNumber10, inNumber16, inOptions } from './input'; +import { isAddress } from '../../../test/types'; + +describe('api/format/input', () => { + const address = '0x63cf90d3f0410092fc0fca41846f596223979195'; + + describe('inAddress', () => { + const address = '63cf90d3f0410092fc0fca41846f596223979195'; + + it('adds the leading 0x as required', () => { + expect(inAddress(address)).to.equal(`0x${address}`); + }); + + it('returns verified addresses as-is', () => { + expect(inAddress(`0x${address}`)).to.equal(`0x${address}`); + }); + + it('returns lowercase equivalents', () => { + expect(inAddress(address.toUpperCase())).to.equal(`0x${address}`); + }); + + it('returns 0x on null addresses', () => { + expect(inAddress()).to.equal('0x'); + }); + }); + + describe('inBlockNumber()', () => { + it('returns earliest as-is', () => { + expect(inBlockNumber('earliest')).to.equal('earliest'); + }); + + it('returns latest as-is', () => { + expect(inBlockNumber('latest')).to.equal('latest'); + }); + + it('returns pending as-is', () => { + expect(inBlockNumber('pending')).to.equal('pending'); + }); + + it('formats existing BigNumber into hex', () => { + expect(inBlockNumber(new BigNumber(0x123456))).to.equal('0x123456'); + }); + + it('formats hex strings into hex', () => { + expect(inBlockNumber('0x123456')).to.equal('0x123456'); + }); + + it('formats numbers into hex', () => { + expect(inBlockNumber(0x123456)).to.equal('0x123456'); + }); + }); + + describe('inData', () => { + it('formats to hex', () => { + expect(inData('123456')).to.equal('0x123456'); + }); + }); + + describe('inHex', () => { + it('leaves leading 0x as-is', () => { + expect(inHex('0x123456')).to.equal('0x123456'); + }); + + it('adds a leading 0x', () => { + expect(inHex('123456')).to.equal('0x123456'); + }); + + it('returns uppercase as lowercase (leading 0x)', () => { + expect(inHex('0xABCDEF')).to.equal('0xabcdef'); + }); + + it('returns uppercase as lowercase (no leading 0x)', () => { + expect(inHex('ABCDEF')).to.equal('0xabcdef'); + }); + + it('handles empty & null', () => { + expect(inHex()).to.equal('0x'); + expect(inHex('')).to.equal('0x'); + }); + }); + + describe('inFilter', () => { + ['address'].forEach((input) => { + it(`formats ${input} address as address`, () => { + const block = {}; + block[input] = address; + const formatted = inFilter(block)[input]; + + expect(isAddress(formatted)).to.be.true; + expect(formatted).to.equal(address); + }); + }); + + ['fromBlock', 'toBlock'].forEach((input) => { + it(`formats ${input} number as blockNumber`, () => { + const block = {}; + block[input] = 0x123; + const formatted = inFilter(block)[input]; + + expect(formatted).to.equal('0x123'); + }); + }); + + it('ignores and passes through unknown keys', () => { + expect(inFilter({ someRandom: 'someRandom' })).to.deep.equal({ someRandom: 'someRandom' }); + }); + + it('formats an filter options object with relevant entries converted', () => { + expect( + inFilter({ + address: address, + fromBlock: 'latest', + toBlock: 0x101, + extraData: 'someExtraStuffInHere' + }) + ).to.deep.equal({ + address: address, + fromBlock: 'latest', + toBlock: '0x101', + extraData: 'someExtraStuffInHere' + }); + }); + }); + + describe('inNumber10()', () => { + it('formats existing BigNumber into number', () => { + expect(inNumber10(new BigNumber(123))).to.equal(123); + }); + + it('formats hex strings into decimal', () => { + expect(inNumber10('0x0a')).to.equal(10); + }); + + it('formats numbers into number', () => { + expect(inNumber10(123)).to.equal(123); + }); + + it('formats undefined into 0', () => { + expect(inNumber10()).to.equal(0); + }); + }); + + describe('inNumber16()', () => { + it('formats existing BigNumber into hex', () => { + expect(inNumber16(new BigNumber(0x123456))).to.equal('0x123456'); + }); + + it('formats hex strings into hex', () => { + expect(inNumber16('0x123456')).to.equal('0x123456'); + }); + + it('formats numbers into hex', () => { + expect(inNumber16(0x123456)).to.equal('0x123456'); + }); + + it('formats undefined into 0', () => { + expect(inNumber16()).to.equal('0x0'); + }); + }); + + describe('inOptions', () => { + ['data'].forEach((input) => { + it(`converts ${input} to hex data`, () => { + const block = {}; + block[input] = '1234'; + const formatted = inData(block[input]); + + expect(formatted).to.equal('0x1234'); + }); + }); + + ['from', 'to'].forEach((input) => { + it(`formats ${input} address as address`, () => { + const block = {}; + block[input] = address; + const formatted = inOptions(block)[input]; + + expect(isAddress(formatted)).to.be.true; + expect(formatted).to.equal(address); + }); + }); + + ['gas', 'gasPrice', 'value', 'nonce'].forEach((input) => { + it(`formats ${input} number as hexnumber`, () => { + const block = {}; + block[input] = 0x123; + const formatted = inOptions(block)[input]; + + expect(formatted).to.equal('0x123'); + }); + }); + + it('ignores and passes through unknown keys', () => { + expect(inOptions({ someRandom: 'someRandom' })).to.deep.equal({ someRandom: 'someRandom' }); + }); + + it('formats an options object with relevant entries converted', () => { + expect( + inOptions({ + from: address, + to: address, + gas: new BigNumber('0x100'), + gasPrice: 0x101, + value: 258, + nonce: '0x104', + data: '0123456789', + extraData: 'someExtraStuffInHere' + }) + ).to.deep.equal({ + from: address, + to: address, + gas: '0x100', + gasPrice: '0x101', + value: '0x102', + nonce: '0x104', + data: '0x0123456789', + extraData: 'someExtraStuffInHere' + }); + }); + }); +}); diff --git a/js/src/api/format/output.js b/js/src/api/format/output.js new file mode 100644 index 00000000000..ba5fb3dde5a --- /dev/null +++ b/js/src/api/format/output.js @@ -0,0 +1,112 @@ +import BigNumber from 'bignumber.js'; + +import { toChecksumAddress } from './address'; + +export function outAccountInfo (infos) { + const ret = {}; + + Object.keys(infos).forEach((address) => { + const info = infos[address]; + + ret[outAddress(address)] = { + name: info.name, + uuid: info.uuid, + meta: JSON.parse(info.meta) + }; + }); + + return ret; +} + +export function outAddress (address) { + return toChecksumAddress(address); +} + +export function outBlock (block) { + if (block) { + Object.keys(block).forEach((key) => { + switch (key) { + case 'author': + case 'miner': + block[key] = outAddress(block[key]); + break; + + case 'difficulty': + case 'gasLimit': + case 'gasUsed': + case 'nonce': + case 'number': + case 'totalDifficulty': + block[key] = outNumber(block[key]); + break; + + case 'timestamp': + block[key] = outDate(block[key]); + break; + } + }); + } + + return block; +} + +export function outDate (date) { + return new Date(outNumber(date).toNumber() * 1000); +} + +export function outNumber (number) { + return new BigNumber(number || 0); +} + +export function outPeers (peers) { + return { + active: outNumber(peers.active), + connected: outNumber(peers.connected), + max: outNumber(peers.max) + }; +} + +export function outReceipt (receipt) { + if (receipt) { + Object.keys(receipt).forEach((key) => { + switch (key) { + case 'blockNumber': + case 'cumulativeGasUsed': + case 'gasUsed': + case 'transactionIndex': + receipt[key] = outNumber(receipt[key]); + break; + + case 'contractAddress': + receipt[key] = outAddress(receipt[key]); + break; + } + }); + } + + return receipt; +} + +export function outTransaction (tx) { + if (tx) { + Object.keys(tx).forEach((key) => { + switch (key) { + case 'blockNumber': + case 'gasPrice': + case 'gas': + case 'nonce': + case 'transactionIndex': + case 'value': + tx[key] = outNumber(tx[key]); + break; + + case 'from': + case 'to': + tx[key] = outAddress(tx[key]); + break; + } + }); + } + + return tx; +} diff --git a/js/src/api/format/output.spec.js b/js/src/api/format/output.spec.js new file mode 100644 index 00000000000..39370b175ba --- /dev/null +++ b/js/src/api/format/output.spec.js @@ -0,0 +1,231 @@ +import BigNumber from 'bignumber.js'; + +import { outBlock, outAccountInfo, outAddress, outDate, outNumber, outPeers, outReceipt, outTransaction } from './output'; +import { isAddress, isBigNumber, isInstanceOf } from '../../../test/types'; + +describe('api/format/output', () => { + const address = '0x63cf90d3f0410092fc0fca41846f596223979195'; + const checksum = '0x63Cf90D3f0410092FC0fca41846f596223979195'; + + describe('outAccountInfo', () => { + it('returns meta objects parsed', () => { + expect(outAccountInfo( + { '0x63cf90d3f0410092fc0fca41846f596223979195': { + name: 'name', uuid: 'uuid', meta: '{"name":"456"}' } + } + )).to.deep.equal({ + '0x63Cf90D3f0410092FC0fca41846f596223979195': { + name: 'name', uuid: 'uuid', meta: { name: '456' } + } + }); + }); + }); + + describe('outAddress', () => { + it('retuns the address as checksummed', () => { + expect(outAddress(address)).to.equal(checksum); + }); + + it('retuns the checksum as checksummed', () => { + expect(outAddress(checksum)).to.equal(checksum); + }); + }); + + describe('outBlock', () => { + ['author', 'miner'].forEach((input) => { + it(`formats ${input} address as address`, () => { + const block = {}; + block[input] = address; + const formatted = outBlock(block)[input]; + + expect(isAddress(formatted)).to.be.true; + expect(formatted).to.equal(checksum); + }); + }); + + ['difficulty', 'gasLimit', 'gasUsed', 'number', 'nonce', 'totalDifficulty'].forEach((input) => { + it(`formats ${input} number as hexnumber`, () => { + const block = {}; + block[input] = 0x123; + const formatted = outBlock(block)[input]; + + expect(isInstanceOf(formatted, BigNumber)).to.be.true; + expect(formatted.toString(16)).to.equal('123'); + }); + }); + + ['timestamp'].forEach((input) => { + it(`formats ${input} number as Date`, () => { + const block = {}; + block[input] = 0x57513668; + const formatted = outBlock(block)[input]; + + expect(isInstanceOf(formatted, Date)).to.be.true; + expect(formatted.getTime()).to.equal(1464940136000); + }); + }); + + it('ignores and passes through unknown keys', () => { + expect(outBlock({ someRandom: 'someRandom' })).to.deep.equal({ someRandom: 'someRandom' }); + }); + + it('formats a block with all the info converted', () => { + expect( + outBlock({ + author: address, + miner: address, + difficulty: '0x100', + gasLimit: '0x101', + gasUsed: '0x102', + number: '0x103', + nonce: '0x104', + totalDifficulty: '0x105', + timestamp: '0x57513668', + extraData: 'someExtraStuffInHere' + }) + ).to.deep.equal({ + author: checksum, + miner: checksum, + difficulty: new BigNumber('0x100'), + gasLimit: new BigNumber('0x101'), + gasUsed: new BigNumber('0x102'), + number: new BigNumber('0x103'), + nonce: new BigNumber('0x104'), + totalDifficulty: new BigNumber('0x105'), + timestamp: new Date('2016-06-03T07:48:56.000Z'), + extraData: 'someExtraStuffInHere' + }); + }); + }); + + describe('outDate', () => { + it('converts a second date in unix timestamp', () => { + expect(outDate(0x57513668)).to.deep.equal(new Date('2016-06-03T07:48:56.000Z')); + }); + }); + + describe('outNumber', () => { + it('returns a BigNumber equalling the value', () => { + const bn = outNumber('0x123456'); + + expect(isBigNumber(bn)).to.be.true; + expect(bn.eq(0x123456)).to.be.true; + }); + + it('assumes 0 when ivalid input', () => { + expect(outNumber().eq(0)).to.be.true; + }); + }); + + describe('outPeers', () => { + it('converts all internal numbers to BigNumbers', () => { + expect(outPeers({ active: 789, connected: '456', max: 0x7b })).to.deep.equal({ + active: new BigNumber(789), + connected: new BigNumber(456), + max: new BigNumber(123) + }); + }); + }); + + describe('outReceipt', () => { + ['contractAddress'].forEach((input) => { + it(`formats ${input} address as address`, () => { + const block = {}; + block[input] = address; + const formatted = outReceipt(block)[input]; + + expect(isAddress(formatted)).to.be.true; + expect(formatted).to.equal(checksum); + }); + }); + + ['blockNumber', 'cumulativeGasUsed', 'cumulativeGasUsed', 'gasUsed', 'transactionIndex'].forEach((input) => { + it(`formats ${input} number as hexnumber`, () => { + const block = {}; + block[input] = 0x123; + const formatted = outReceipt(block)[input]; + + expect(isInstanceOf(formatted, BigNumber)).to.be.true; + expect(formatted.toString(16)).to.equal('123'); + }); + }); + + it('ignores and passes through unknown keys', () => { + expect(outReceipt({ someRandom: 'someRandom' })).to.deep.equal({ someRandom: 'someRandom' }); + }); + + it('formats a receipt with all the info converted', () => { + expect( + outReceipt({ + contractAddress: address, + blockNumber: '0x100', + cumulativeGasUsed: '0x101', + gasUsed: '0x102', + transactionIndex: '0x103', + extraData: 'someExtraStuffInHere' + }) + ).to.deep.equal({ + contractAddress: checksum, + blockNumber: new BigNumber('0x100'), + cumulativeGasUsed: new BigNumber('0x101'), + gasUsed: new BigNumber('0x102'), + transactionIndex: new BigNumber('0x103'), + extraData: 'someExtraStuffInHere' + }); + }); + }); + + describe('outTransaction', () => { + ['from', 'to'].forEach((input) => { + it(`formats ${input} address as address`, () => { + const block = {}; + block[input] = address; + const formatted = outTransaction(block)[input]; + + expect(isAddress(formatted)).to.be.true; + expect(formatted).to.equal(checksum); + }); + }); + + ['blockNumber', 'gasPrice', 'gas', 'nonce', 'transactionIndex', 'value'].forEach((input) => { + it(`formats ${input} number as hexnumber`, () => { + const block = {}; + block[input] = 0x123; + const formatted = outTransaction(block)[input]; + + expect(isInstanceOf(formatted, BigNumber)).to.be.true; + expect(formatted.toString(16)).to.equal('123'); + }); + }); + + it('ignores and passes through unknown keys', () => { + expect(outTransaction({ someRandom: 'someRandom' })).to.deep.equal({ someRandom: 'someRandom' }); + }); + + it('formats a transaction with all the info converted', () => { + expect( + outTransaction({ + from: address, + to: address, + blockNumber: '0x100', + gasPrice: '0x101', + gas: '0x102', + nonce: '0x103', + transactionIndex: '0x104', + value: '0x105', + extraData: 'someExtraStuffInHere' + }) + ).to.deep.equal({ + from: checksum, + to: checksum, + blockNumber: new BigNumber('0x100'), + gasPrice: new BigNumber('0x101'), + gas: new BigNumber('0x102'), + nonce: new BigNumber('0x103'), + transactionIndex: new BigNumber('0x104'), + value: new BigNumber('0x105'), + extraData: 'someExtraStuffInHere' + }); + }); + }); +}); diff --git a/js/src/api/format/wei.js b/js/src/api/format/wei.js new file mode 100644 index 00000000000..d1f6745d57d --- /dev/null +++ b/js/src/api/format/wei.js @@ -0,0 +1,21 @@ +import BigNumber from 'bignumber.js'; + +const UNITS = ['wei', 'ada', 'babbage', 'shannon', 'szabo', 'finney', 'ether', 'kether', 'mether', 'gether', 'tether']; + +export function _getUnitMultiplier (unit) { + const position = UNITS.indexOf(unit.toLowerCase()); + + if (position === -1) { + throw new Error(`Unknown unit ${unit} passed to wei formatter`); + } + + return 10 ** (position * 3); +} + +export function fromWei (value, unit = 'ether') { + return new BigNumber(value).div(_getUnitMultiplier(unit)); +} + +export function toWei (value, unit = 'ether') { + return new BigNumber(value).mul(_getUnitMultiplier(unit)); +} diff --git a/js/src/api/format/wei.spec.js b/js/src/api/format/wei.spec.js new file mode 100644 index 00000000000..d70b0fa2951 --- /dev/null +++ b/js/src/api/format/wei.spec.js @@ -0,0 +1,41 @@ +import { _getUnitMultiplier, fromWei, toWei } from './wei'; + +describe('api/format/wei', () => { + describe('_getUnitMultiplier', () => { + it('returns 10^0 for wei', () => { + expect(_getUnitMultiplier('wei')).to.equal(10 ** 0); + }); + + it('returns 10^15 for finney', () => { + expect(_getUnitMultiplier('finney')).to.equal(10 ** 15); + }); + + it('returns 10^18 for ether', () => { + expect(_getUnitMultiplier('ether')).to.equal(10 ** 18); + }); + + it('throws an error on invalid units', () => { + expect(() => _getUnitMultiplier('invalid')).to.throw(/passed to wei formatter/); + }); + }); + + describe('fromWei', () => { + it('formats into ether when nothing specified', () => { + expect(fromWei('1230000000000000000').toString()).to.equal('1.23'); + }); + + it('formats into finney when specified', () => { + expect(fromWei('1230000000000000000', 'finney').toString()).to.equal('1230'); + }); + }); + + describe('toWei', () => { + it('formats from ether when nothing specified', () => { + expect(toWei(1.23).toString()).to.equal('1230000000000000000'); + }); + + it('formats from finney when specified', () => { + expect(toWei(1230, 'finney').toString()).to.equal('1230000000000000000'); + }); + }); +}); diff --git a/js/src/api/index.js b/js/src/api/index.js new file mode 100644 index 00000000000..d549adfe91a --- /dev/null +++ b/js/src/api/index.js @@ -0,0 +1 @@ +export default from './api'; diff --git a/js/src/api/rpc/db/db.js b/js/src/api/rpc/db/db.js new file mode 100644 index 00000000000..f13c69b2f32 --- /dev/null +++ b/js/src/api/rpc/db/db.js @@ -0,0 +1,27 @@ +import { inHex } from '../../format/input'; + +export default class Db { + constructor (transport) { + this._transport = transport; + } + + getHex (dbName, keyName) { + return this._transport + .execute('db_getHex', dbName, keyName); + } + + getString (dbName, keyName) { + return this._transport + .execute('db_getString', dbName, keyName); + } + + putHex (dbName, keyName, hexData) { + return this._transport + .execute('db_putHex', dbName, keyName, inHex(hexData)); + } + + putString (dbName, keyName, stringData) { + return this._transport + .execute('db_putString', dbName, keyName, stringData); + } +} diff --git a/js/src/api/rpc/db/db.spec.js b/js/src/api/rpc/db/db.spec.js new file mode 100644 index 00000000000..56cb201d7e8 --- /dev/null +++ b/js/src/api/rpc/db/db.spec.js @@ -0,0 +1,22 @@ +import { TEST_HTTP_URL, mockHttp } from '../../../../test/mockRpc'; + +import Http from '../../transport/http'; +import Db from './db'; + +const instance = new Db(new Http(TEST_HTTP_URL)); + +describe('api/rpc/Db', () => { + let scope; + + describe('putHex', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'db_putHex', reply: { result: [] } }]); + }); + + it('formats the inputs correctly', () => { + return instance.putHex('db', 'key', '1234').then(() => { + expect(scope.body.db_putHex.params).to.deep.equal(['db', 'key', '0x1234']); + }); + }); + }); +}); diff --git a/js/src/api/rpc/db/index.js b/js/src/api/rpc/db/index.js new file mode 100644 index 00000000000..cfcb94c67ee --- /dev/null +++ b/js/src/api/rpc/db/index.js @@ -0,0 +1 @@ +export default from './db'; diff --git a/js/src/api/rpc/eth/eth.e2e.js b/js/src/api/rpc/eth/eth.e2e.js new file mode 100644 index 00000000000..7ae441a139f --- /dev/null +++ b/js/src/api/rpc/eth/eth.e2e.js @@ -0,0 +1,154 @@ +import { createHttpApi } from '../../../test/e2e/ethapi'; +import { isAddress } from '../../../../test/types'; + +describe('ethapi.eth', () => { + const ethapi = createHttpApi(); + const address = '0x63cf90d3f0410092fc0fca41846f596223979195'; + + let latestBlockNumber; + let latestBlockHash; + + describe('accounts', () => { + it('returns the available accounts', () => { + return ethapi.eth.accounts().then((accounts) => { + accounts.forEach((account) => { + expect(isAddress(account)).to.be.true; + }); + }); + }); + }); + + describe('blockNumber', () => { + it('returns the current blockNumber', () => { + return ethapi.eth.blockNumber().then((blockNumber) => { + latestBlockNumber = blockNumber; + expect(blockNumber.gt(0xabcde)).to.be.true; + }); + }); + }); + + describe('coinbase', () => { + it('returns the coinbase', () => { + return ethapi.eth.coinbase().then((coinbase) => { + expect(isAddress(coinbase)).to.be.true; + }); + }); + }); + + describe('gasPrice', () => { + it('returns the current gasPrice', () => { + return ethapi.eth.gasPrice().then((gasPrice) => { + expect(gasPrice.gt(0)).to.be.true; + }); + }); + }); + + describe('getBalance', () => { + it('returns the balance for latest block', () => { + return ethapi.eth.getBalance(address).then((balance) => { + expect(balance.gt(0)).to.be.true; + }); + }); + + it('returns the balance for a very early block', () => { + const atBlock = '0x65432'; + const atValue = '18e07120a6e164fee1b'; + + return ethapi.eth + .getBalance(address, atBlock) + .then((balance) => { + expect(balance.toString(16)).to.equal(atValue); + }) + .catch((error) => { + // Parity doesn't support pruned-before-block balance lookups + expect(error.message).to.match(/Unsupported request/); + }); + }); + + it('returns the balance for a recent/out-of-pruning-range block', () => { + return ethapi.eth + .getBalance(address, latestBlockNumber.minus(1000)) + .then((balance) => { + expect(balance.gt(0)).to.be.true; + }); + }); + }); + + describe('getBlockByNumber', () => { + it('returns the latest block', () => { + return ethapi.eth.getBlockByNumber().then((block) => { + expect(block).to.be.ok; + }); + }); + + it('returns a block by blockNumber', () => { + return ethapi.eth.getBlockByNumber(latestBlockNumber).then((block) => { + latestBlockHash = block.hash; + expect(block).to.be.ok; + }); + }); + + it('returns a block by blockNumber (full)', () => { + return ethapi.eth.getBlockByNumber(latestBlockNumber, true).then((block) => { + expect(block).to.be.ok; + }); + }); + }); + + describe('getBlockByHash', () => { + it('returns the specified block', () => { + return ethapi.eth.getBlockByHash(latestBlockHash).then((block) => { + expect(block).to.be.ok; + expect(block.hash).to.equal(latestBlockHash); + }); + }); + + it('returns the specified block (full)', () => { + return ethapi.eth.getBlockByHash(latestBlockHash, true).then((block) => { + expect(block).to.be.ok; + expect(block.hash).to.equal(latestBlockHash); + }); + }); + }); + + describe('getBlockTransactionCountByHash', () => { + it('returns the transactions of the specified hash', () => { + return ethapi.eth.getBlockTransactionCountByHash(latestBlockHash).then((count) => { + expect(count).to.be.ok; + expect(count.gte(0)).to.be.true; + }); + }); + }); + + describe('getBlockTransactionCountByNumber', () => { + it('returns the transactions of latest', () => { + return ethapi.eth.getBlockTransactionCountByNumber().then((count) => { + expect(count).to.be.ok; + expect(count.gte(0)).to.be.true; + }); + }); + + it('returns the transactions of a specified number', () => { + return ethapi.eth.getBlockTransactionCountByNumber(latestBlockNumber).then((count) => { + expect(count).to.be.ok; + expect(count.gte(0)).to.be.true; + }); + }); + }); + + describe('getTransactionCount', () => { + it('returns the count for an address', () => { + return ethapi.eth.getTransactionCount(address).then((count) => { + expect(count).to.be.ok; + expect(count.gte(0x1000c2)).to.be.ok; + }); + }); + + it('returns the count for an address at specified blockNumber', () => { + return ethapi.eth.getTransactionCount(address, latestBlockNumber).then((count) => { + expect(count).to.be.ok; + expect(count.gte(0x1000c2)).to.be.ok; + }); + }); + }); +}); diff --git a/js/src/api/rpc/eth/eth.js b/js/src/api/rpc/eth/eth.js new file mode 100644 index 00000000000..f1cf56609a7 --- /dev/null +++ b/js/src/api/rpc/eth/eth.js @@ -0,0 +1,301 @@ +import { inAddress, inBlockNumber, inData, inFilter, inHex, inNumber16, inOptions } from '../../format/input'; +import { outAddress, outBlock, outNumber, outReceipt, outTransaction } from '../../format/output'; + +export default class Eth { + constructor (transport) { + this._transport = transport; + } + + accounts () { + return this._transport + .execute('eth_accounts') + .then((accounts) => (accounts || []).map(outAddress)); + } + + blockNumber () { + return this._transport + .execute('eth_blockNumber') + .then(outNumber); + } + + call (options, blockNumber = 'latest') { + return this._transport + .execute('eth_call', inOptions(options), inBlockNumber(blockNumber)); + } + + coinbase () { + return this._transport + .execute('eth_coinbase') + .then(outAddress); + } + + compileLLL (code) { + return this._transport + .execute('eth_compileLLL', inData(code)); + } + + compileSerpent (code) { + return this._transport + .execute('eth_compileSerpent', inData(code)); + } + + compileSolidity (code) { + return this._transport + .execute('eth_compileSolidity', inData(code)); + } + + estimateGas (options) { + return this._transport + .execute('eth_estimateGas', inOptions(options)) + .then(outNumber); + } + + fetchQueuedTransactions () { + return this._transport + .execute('eth_fetchQueuedTransactions'); + } + + flush () { + return this._transport + .execute('eth_flush'); + } + + gasPrice () { + return this._transport + .execute('eth_gasPrice') + .then(outNumber); + } + + getBalance (address, blockNumber = 'latest') { + return this._transport + .execute('eth_getBalance', inAddress(address), inBlockNumber(blockNumber)) + .then(outNumber); + } + + getBlockByHash (hash, full = false) { + return this._transport + .execute('eth_getBlockByHash', inHex(hash), full) + .then(outBlock); + } + + getBlockByNumber (blockNumber = 'latest', full = false) { + return this._transport + .execute('eth_getBlockByNumber', inBlockNumber(blockNumber), full) + .then(outBlock); + } + + getBlockTransactionCountByHash (hash) { + return this._transport + .execute('eth_getBlockTransactionCountByHash', inHex(hash)) + .then(outNumber); + } + + getBlockTransactionCountByNumber (blockNumber = 'latest') { + return this._transport + .execute('eth_getBlockTransactionCountByNumber', inBlockNumber(blockNumber)) + .then(outNumber); + } + + getCode (address, blockNumber = 'latest') { + return this._transport + .execute('eth_getCode', inAddress(address), inBlockNumber(blockNumber)); + } + + getCompilers () { + return this._transport + .execute('eth_getCompilers'); + } + + getFilterChanges (filterId) { + return this._transport + .execute('eth_getFilterChanges', inNumber16(filterId)); + } + + getFilterChangesEx (filterId) { + return this._transport + .execute('eth_getFilterChangesEx', inNumber16(filterId)); + } + + getFilterLogs (filterId) { + return this._transport + .execute('eth_getFilterLogs', inNumber16(filterId)); + } + + getFilterLogsEx (filterId) { + return this._transport + .execute('eth_getFilterLogsEx', inNumber16(filterId)); + } + + getLogs (options) { + return this._transport + .execute('eth_getLogs', inFilter(options)); + } + + getLogsEx (options) { + return this._transport + .execute('eth_getLogsEx', inFilter(options)); + } + + getStorageAt (address, index = 0, blockNumber = 'latest') { + return this._transport + .execute('eth_getStorageAt', inAddress(address), inNumber16(index), inBlockNumber(blockNumber)); + } + + getTransactionByBlockHashAndIndex (hash, index = 0) { + return this._transport + .execute('eth_getTransactionByBlockHashAndIndex', inHex(hash), inNumber16(index)) + .then(outTransaction); + } + + getTransactionByBlockNumberAndIndex (blockNumber = 'latest', index = 0) { + return this._transport + .execute('eth_getTransactionByBlockNumberAndIndex', inBlockNumber(blockNumber), inNumber16(index)) + .then(outTransaction); + } + + getTransactionByHash (hash) { + return this._transport + .execute('eth_getTransactionByHash', inHex(hash)) + .then(outTransaction); + } + + getTransactionCount (address, blockNumber = 'latest') { + return this._transport + .execute('eth_getTransactionCount', inAddress(address), inBlockNumber(blockNumber)) + .then(outNumber); + } + + getTransactionReceipt (txhash) { + return this._transport + .execute('eth_getTransactionReceipt', inHex(txhash)) + .then(outReceipt); + } + + getUncleByBlockHashAndIndex (hash, index = 0) { + return this._transport + .execute('eth_getUncleByBlockHashAndIndex', inHex(hash), inNumber16(index)); + } + + getUncleByBlockNumberAndIndex (blockNumber = 'latest', index = 0) { + return this._transport + .execute('eth_getUncleByBlockNumberAndIndex', inBlockNumber(blockNumber), inNumber16(index)); + } + + getUncleCountByBlockHash (hash) { + return this._transport + .execute('eth_getUncleCountByBlockHash', inHex(hash)) + .then(outNumber); + } + + getUncleCountByBlockNumber (blockNumber = 'latest') { + return this._transport + .execute('eth_getUncleCountByBlockNumber', inBlockNumber(blockNumber)) + .then(outNumber); + } + + getWork () { + return this._transport + .execute('eth_getWork'); + } + + hashrate () { + return this._transport + .execute('eth_hashrate') + .then(outNumber); + } + + inspectTransaction () { + return this._transport + .execute('eth_inspectTransaction'); + } + + mining () { + return this._transport + .execute('eth_mining'); + } + + newBlockFilter () { + return this._transport + .execute('eth_newBlockFilter'); + } + + newFilter (options) { + return this._transport + .execute('eth_newFilter', inFilter(options)); + } + + newFilterEx (options) { + return this._transport + .execute('eth_newFilterEx', inFilter(options)); + } + + newPendingTransactionFilter () { + return this._transport + .execute('eth_newPendingTransactionFilter'); + } + + notePassword () { + return this._transport + .execute('eth_notePassword'); + } + + pendingTransactions () { + return this._transport + .execute('eth_pendingTransactions'); + } + + protocolVersion () { + return this._transport + .execute('eth_protocolVersion'); + } + + register () { + return this._transport + .execute('eth_register'); + } + + sendRawTransaction (data) { + return this._transport + .execute('eth_sendRawTransaction', inData(data)); + } + + sendTransaction (options) { + return this._transport + .execute('eth_sendTransaction', inOptions(options)); + } + + sign () { + return this._transport + .execute('eth_sign'); + } + + signTransaction () { + return this._transport + .execute('eth_signTransaction'); + } + + submitHashrate (hashrate, clientId) { + return this._transport + .execute('eth_submitHashrate', inNumber16(hashrate), clientId); + } + + submitWork (nonce, powHash, mixDigest) { + return this._transport + .execute('eth_submitWork', inNumber16(nonce), powHash, mixDigest); + } + + syncing () { + return this._transport + .execute('eth_syncing'); + } + + uninstallFilter (filterId) { + return this._transport + .execute('eth_uninstallFilter', inHex(filterId)); + } + + unregister () { + return this._transport + .execute('eth_unregister'); + } +} diff --git a/js/src/api/rpc/eth/eth.spec.js b/js/src/api/rpc/eth/eth.spec.js new file mode 100644 index 00000000000..8f2b59d118d --- /dev/null +++ b/js/src/api/rpc/eth/eth.spec.js @@ -0,0 +1,458 @@ +import { TEST_HTTP_URL, mockHttp } from '../../../../test/mockRpc'; +import { isBigNumber } from '../../../../test/types'; + +import Http from '../../transport/http'; +import Eth from './eth'; + +const instance = new Eth(new Http(TEST_HTTP_URL)); + +describe('rpc/Eth', () => { + const address = '0x63Cf90D3f0410092FC0fca41846f596223979195'; + let scope; + + describe('accounts', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_accounts', reply: { result: [address.toLowerCase()] } }]); + }); + + it('returns a list of accounts, formatted', () => { + return instance.accounts().then((accounts) => { + expect(accounts).to.deep.equal([address]); + }); + }); + }); + + describe('blockNumber', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_blockNumber', reply: { result: '0x123456' } }]); + }); + + it('returns the current blockNumber, formatted', () => { + return instance.blockNumber().then((blockNumber) => { + expect(isBigNumber(blockNumber)).to.be.true; + expect(blockNumber.toString(16)).to.equal('123456'); + }); + }); + }); + + describe('call', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_call', reply: { result: [] } }]); + }); + + it('formats the input options & blockNumber', () => { + return instance.call({ data: '12345678' }, 'earliest').then(() => { + expect(scope.body.eth_call.params).to.deep.equal([{ data: '0x12345678' }, 'earliest']); + }); + }); + + it('provides a latest blockNumber when not specified', () => { + return instance.call({ data: '12345678' }).then(() => { + expect(scope.body.eth_call.params).to.deep.equal([{ data: '0x12345678' }, 'latest']); + }); + }); + }); + + describe('coinbase', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_coinbase', reply: { result: address.toLowerCase() } }]); + }); + + it('returns the coinbase, formatted', () => { + return instance.coinbase().then((account) => { + expect(account).to.deep.equal(address); + }); + }); + }); + + ['LLL', 'Serpent', 'Solidity'].forEach((type) => { + const method = `compile${type}`; + + describe(method, () => { + beforeEach(() => { + scope = mockHttp([{ method: `eth_${method}`, reply: { result: '0x123' } }]); + }); + + it('formats the input as data, returns the output', () => { + return instance[method]('0xabcdef').then((result) => { + expect(scope.body[`eth_${method}`].params).to.deep.equal(['0xabcdef']); + expect(result).to.equal('0x123'); + }); + }); + }); + }); + + describe('estimateGas', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_estimateGas', reply: { result: '0x123' } }]); + }); + + it('converts the options correctly', () => { + return instance.estimateGas({ gas: 21000 }).then(() => { + expect(scope.body.eth_estimateGas.params).to.deep.equal([{ gas: '0x5208' }]); + }); + }); + + it('returns the gas used', () => { + return instance.estimateGas({}).then((gas) => { + expect(isBigNumber(gas)).to.be.true; + expect(gas.toString(16)).to.deep.equal('123'); + }); + }); + }); + + describe('gasPrice', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_gasPrice', reply: { result: '0x123' } }]); + }); + + it('returns the fomratted price', () => { + return instance.gasPrice().then((price) => { + expect(isBigNumber(price)).to.be.true; + expect(price.toString(16)).to.deep.equal('123'); + }); + }); + }); + + describe('getBalance', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getBalance', reply: { result: '0x123' } }]); + }); + + it('passes in the address (default blockNumber)', () => { + return instance.getBalance(address).then(() => { + expect(scope.body.eth_getBalance.params).to.deep.equal([address.toLowerCase(), 'latest']); + }); + }); + + it('passes in the address & blockNumber', () => { + return instance.getBalance(address, 0x456).then(() => { + expect(scope.body.eth_getBalance.params).to.deep.equal([address.toLowerCase(), '0x456']); + }); + }); + + it('returns the balance', () => { + return instance.getBalance(address, 0x123).then((balance) => { + expect(isBigNumber(balance)).to.be.true; + expect(balance.toString(16)).to.deep.equal('123'); + }); + }); + }); + + describe('getBlockByHash', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getBlockByHash', reply: { result: { miner: address.toLowerCase() } } }]); + }); + + it('formats the input hash as a hash, default full', () => { + return instance.getBlockByHash('1234').then(() => { + expect(scope.body.eth_getBlockByHash.params).to.deep.equal(['0x1234', false]); + }); + }); + + it('formats the input hash as a hash, full true', () => { + return instance.getBlockByHash('1234', true).then(() => { + expect(scope.body.eth_getBlockByHash.params).to.deep.equal(['0x1234', true]); + }); + }); + + it('formats the output into block', () => { + return instance.getBlockByHash('1234').then((block) => { + expect(block.miner).to.equal(address); + }); + }); + }); + + describe('getBlockByNumber', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getBlockByNumber', reply: { result: { miner: address.toLowerCase() } } }]); + }); + + it('assumes blockNumber latest & full false', () => { + return instance.getBlockByNumber().then(() => { + expect(scope.body.eth_getBlockByNumber.params).to.deep.equal(['latest', false]); + }); + }); + + it('uses input blockNumber & full false', () => { + return instance.getBlockByNumber('0x1234').then(() => { + expect(scope.body.eth_getBlockByNumber.params).to.deep.equal(['0x1234', false]); + }); + }); + + it('formats the input blockNumber, full true', () => { + return instance.getBlockByNumber(0x1234, true).then(() => { + expect(scope.body.eth_getBlockByNumber.params).to.deep.equal(['0x1234', true]); + }); + }); + + it('formats the output into block', () => { + return instance.getBlockByNumber(0x1234).then((block) => { + expect(block.miner).to.equal(address); + }); + }); + }); + + describe('getBlockTransactionCountByHash', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getBlockTransactionCountByHash', reply: { result: '0x123' } }]); + }); + + it('formats input hash properly', () => { + return instance.getBlockTransactionCountByHash('abcdef').then(() => { + expect(scope.body.eth_getBlockTransactionCountByHash.params).to.deep.equal(['0xabcdef']); + }); + }); + + it('formats the output number', () => { + return instance.getBlockTransactionCountByHash('0x1234').then((count) => { + expect(isBigNumber(count)).to.be.true; + expect(count.toString(16)).to.equal('123'); + }); + }); + }); + + describe('getBlockTransactionCountByNumber', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getBlockTransactionCountByNumber', reply: { result: '0x123' } }]); + }); + + it('specified blockNumber latest when none specified', () => { + return instance.getBlockTransactionCountByNumber().then(() => { + expect(scope.body.eth_getBlockTransactionCountByNumber.params).to.deep.equal(['latest']); + }); + }); + + it('formats input blockNumber properly', () => { + return instance.getBlockTransactionCountByNumber(0xabcdef).then(() => { + expect(scope.body.eth_getBlockTransactionCountByNumber.params).to.deep.equal(['0xabcdef']); + }); + }); + + it('formats the output number', () => { + return instance.getBlockTransactionCountByNumber('0x1234').then((count) => { + expect(isBigNumber(count)).to.be.true; + expect(count.toString(16)).to.equal('123'); + }); + }); + }); + + describe('getCode', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getCode', reply: { result: '0x1234567890' } }]); + }); + + it('passes in the address (default blockNumber)', () => { + return instance.getCode(address).then(() => { + expect(scope.body.eth_getCode.params).to.deep.equal([address.toLowerCase(), 'latest']); + }); + }); + + it('passes in the address & blockNumber', () => { + return instance.getCode(address, 0x456).then(() => { + expect(scope.body.eth_getCode.params).to.deep.equal([address.toLowerCase(), '0x456']); + }); + }); + + it('returns the code', () => { + return instance.getCode(address, 0x123).then((code) => { + expect(code).to.equal('0x1234567890'); + }); + }); + }); + + describe('getStorageAt', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getStorageAt', reply: { result: '0x1234567890' } }]); + }); + + it('passes in the address (default index& blockNumber)', () => { + return instance.getStorageAt(address).then(() => { + expect(scope.body.eth_getStorageAt.params).to.deep.equal([address.toLowerCase(), '0x0', 'latest']); + }); + }); + + it('passes in the address, index & blockNumber', () => { + return instance.getStorageAt(address, 15, 0x456).then(() => { + expect(scope.body.eth_getStorageAt.params).to.deep.equal([address.toLowerCase(), '0xf', '0x456']); + }); + }); + + it('returns the storage', () => { + return instance.getStorageAt(address, 0x123).then((storage) => { + expect(storage).to.equal('0x1234567890'); + }); + }); + }); + + describe('getTransactionByBlockHashAndIndex', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getTransactionByBlockHashAndIndex', reply: { result: { to: address.toLowerCase() } } }]); + }); + + it('passes in the hash (default index)', () => { + return instance.getTransactionByBlockHashAndIndex('12345').then(() => { + expect(scope.body.eth_getTransactionByBlockHashAndIndex.params).to.deep.equal(['0x12345', '0x0']); + }); + }); + + it('passes in the hash & specified index', () => { + return instance.getTransactionByBlockHashAndIndex('6789', 0x456).then(() => { + expect(scope.body.eth_getTransactionByBlockHashAndIndex.params).to.deep.equal(['0x6789', '0x456']); + }); + }); + + it('returns the formatted transaction', () => { + return instance.getTransactionByBlockHashAndIndex('6789', 0x123).then((tx) => { + expect(tx).to.deep.equal({ to: address }); + }); + }); + }); + + describe('getTransactionByBlockNumberAndIndex', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getTransactionByBlockNumberAndIndex', reply: { result: { to: address.toLowerCase() } } }]); + }); + + it('passes in the default parameters', () => { + return instance.getTransactionByBlockNumberAndIndex().then(() => { + expect(scope.body.eth_getTransactionByBlockNumberAndIndex.params).to.deep.equal(['latest', '0x0']); + }); + }); + + it('passes in the blockNumber & specified index', () => { + return instance.getTransactionByBlockNumberAndIndex('0x6789', 0x456).then(() => { + expect(scope.body.eth_getTransactionByBlockNumberAndIndex.params).to.deep.equal(['0x6789', '0x456']); + }); + }); + + it('returns the formatted transaction', () => { + return instance.getTransactionByBlockNumberAndIndex('0x6789', 0x123).then((tx) => { + expect(tx).to.deep.equal({ to: address }); + }); + }); + }); + + describe('getTransactionByHash', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getTransactionByHash', reply: { result: { to: address.toLowerCase() } } }]); + }); + + it('passes in the hash', () => { + return instance.getTransactionByHash('12345').then(() => { + expect(scope.body.eth_getTransactionByHash.params).to.deep.equal(['0x12345']); + }); + }); + + it('returns the formatted transaction', () => { + return instance.getTransactionByHash('6789').then((tx) => { + expect(tx).to.deep.equal({ to: address }); + }); + }); + }); + + describe('getTransactionCount', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getTransactionCount', reply: { result: '0x123' } }]); + }); + + it('passes in the address (default blockNumber)', () => { + return instance.getTransactionCount(address).then(() => { + expect(scope.body.eth_getTransactionCount.params).to.deep.equal([address.toLowerCase(), 'latest']); + }); + }); + + it('passes in the address & blockNumber', () => { + return instance.getTransactionCount(address, 0x456).then(() => { + expect(scope.body.eth_getTransactionCount.params).to.deep.equal([address.toLowerCase(), '0x456']); + }); + }); + + it('returns the count, formatted', () => { + return instance.getTransactionCount(address, 0x123).then((count) => { + expect(isBigNumber(count)).to.be.true; + expect(count.toString(16)).to.equal('123'); + }); + }); + }); + + describe('getUncleByBlockHashAndIndex', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getUncleByBlockHashAndIndex', reply: { result: [] } }]); + }); + + it('passes in the hash (default index)', () => { + return instance.getUncleByBlockHashAndIndex('12345').then(() => { + expect(scope.body.eth_getUncleByBlockHashAndIndex.params).to.deep.equal(['0x12345', '0x0']); + }); + }); + + it('passes in the hash & specified index', () => { + return instance.getUncleByBlockHashAndIndex('6789', 0x456).then(() => { + expect(scope.body.eth_getUncleByBlockHashAndIndex.params).to.deep.equal(['0x6789', '0x456']); + }); + }); + }); + + describe('getUncleByBlockNumberAndIndex', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getUncleByBlockNumberAndIndex', reply: { result: [] } }]); + }); + + it('passes in the default parameters', () => { + return instance.getUncleByBlockNumberAndIndex().then(() => { + expect(scope.body.eth_getUncleByBlockNumberAndIndex.params).to.deep.equal(['latest', '0x0']); + }); + }); + + it('passes in the blockNumber & specified index', () => { + return instance.getUncleByBlockNumberAndIndex('0x6789', 0x456).then(() => { + expect(scope.body.eth_getUncleByBlockNumberAndIndex.params).to.deep.equal(['0x6789', '0x456']); + }); + }); + }); + + describe('getUncleCountByBlockHash', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getUncleCountByBlockHash', reply: { result: '0x123' } }]); + }); + + it('passes in the hash', () => { + return instance.getUncleCountByBlockHash('12345').then(() => { + expect(scope.body.eth_getUncleCountByBlockHash.params).to.deep.equal(['0x12345']); + }); + }); + + it('formats the output number', () => { + return instance.getUncleCountByBlockHash('0x1234').then((count) => { + expect(isBigNumber(count)).to.be.true; + expect(count.toString(16)).to.equal('123'); + }); + }); + }); + + describe('getUncleCountByBlockNumber', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getUncleCountByBlockNumber', reply: { result: '0x123' } }]); + }); + + it('passes in the default parameters', () => { + return instance.getUncleCountByBlockNumber().then(() => { + expect(scope.body.eth_getUncleCountByBlockNumber.params).to.deep.equal(['latest']); + }); + }); + + it('passes in the blockNumber', () => { + return instance.getUncleCountByBlockNumber('0x6789').then(() => { + expect(scope.body.eth_getUncleCountByBlockNumber.params).to.deep.equal(['0x6789']); + }); + }); + + it('formats the output number', () => { + return instance.getUncleCountByBlockNumber('0x1234').then((count) => { + expect(isBigNumber(count)).to.be.true; + expect(count.toString(16)).to.equal('123'); + }); + }); + }); +}); diff --git a/js/src/api/rpc/eth/index.js b/js/src/api/rpc/eth/index.js new file mode 100644 index 00000000000..bea81bad4f1 --- /dev/null +++ b/js/src/api/rpc/eth/index.js @@ -0,0 +1 @@ +export default from './eth'; diff --git a/js/src/api/rpc/ethcore/ethcore.e2e.js b/js/src/api/rpc/ethcore/ethcore.e2e.js new file mode 100644 index 00000000000..ba357995a7d --- /dev/null +++ b/js/src/api/rpc/ethcore/ethcore.e2e.js @@ -0,0 +1,61 @@ +import { createHttpApi } from '../../../test/e2e/ethapi'; + +describe('ethapi.ethcore', () => { + const ethapi = createHttpApi(); + + describe('gasFloorTarget', () => { + it('returns and translates the target', () => { + return ethapi.ethcore.gasFloorTarget().then((value) => { + expect(value.gt(0)).to.be.true; + }); + }); + }); + + describe('minGasPrice', () => { + it('returns and translates the price', () => { + return ethapi.ethcore.minGasPrice().then((value) => { + expect(value.gt(0)).to.be.true; + }); + }); + }); + + describe('netChain', () => { + it('returns and the chain', () => { + return ethapi.ethcore.netChain().then((value) => { + expect(value).to.equal('morden'); + }); + }); + }); + + describe('netMaxPeers', () => { + it('returns and translates the peers', () => { + return ethapi.ethcore.netMaxPeers().then((value) => { + expect(value.gt(0)).to.be.true; + }); + }); + }); + + describe('netPort', () => { + it('returns and translates the port', () => { + return ethapi.ethcore.netPort().then((value) => { + expect(value.gt(0)).to.be.true; + }); + }); + }); + + describe('transactionsLimit', () => { + it('returns and translates the limit', () => { + return ethapi.ethcore.transactionsLimit().then((value) => { + expect(value.gt(0)).to.be.true; + }); + }); + }); + + describe('rpcSettings', () => { + it('returns and translates the settings', () => { + return ethapi.ethcore.rpcSettings().then((value) => { + expect(value).to.be.ok; + }); + }); + }); +}); diff --git a/js/src/api/rpc/ethcore/ethcore.js b/js/src/api/rpc/ethcore/ethcore.js new file mode 100644 index 00000000000..090386aa267 --- /dev/null +++ b/js/src/api/rpc/ethcore/ethcore.js @@ -0,0 +1,141 @@ +import { inAddress, inData, inNumber16 } from '../../format/input'; +import { outAddress, outNumber, outPeers } from '../../format/output'; + +export default class Ethcore { + constructor (transport) { + this._transport = transport; + } + + acceptNonReservedPeers () { + return this._transport + .execute('ethcore_acceptNonReservedPeers'); + } + + addReservedPeer (encode) { + return this._transport + .execute('ethcore_addReservedPeer', encode); + } + + defaultExtraData () { + return this._transport + .execute('ethcore_defaultExtraData'); + } + + devLogs () { + return this._transport + .execute('ethcore_devLogs'); + } + + devLogsLevels () { + return this._transport + .execute('ethcore_devLogsLevels'); + } + + dropNonReservedPeers () { + return this._transport + .execute('ethcore_dropNonReservedPeers'); + } + + extraData () { + return this._transport + .execute('ethcore_extraData'); + } + + gasFloorTarget () { + return this._transport + .execute('ethcore_gasFloorTarget') + .then(outNumber); + } + + generateSecretPhrase () { + return this._transport + .execute('ethcore_generateSecretPhrase'); + } + + minGasPrice () { + return this._transport + .execute('ethcore_minGasPrice') + .then(outNumber); + } + + netChain () { + return this._transport + .execute('ethcore_netChain'); + } + + netPeers () { + return this._transport + .execute('ethcore_netPeers') + .then(outPeers); + } + + netMaxPeers () { + return this._transport + .execute('ethcore_netMaxPeers') + .then(outNumber); + } + + netPort () { + return this._transport + .execute('ethcore_netPort') + .then(outNumber); + } + + nodeName () { + return this._transport + .execute('ethcore_nodeName'); + } + + phraseToAddress (phrase) { + return this._transport + .execute('ethcore_phraseToAddress', phrase) + .then(outAddress); + } + + removeReservedPeer (encode) { + return this._transport + .execute('ethcore_removeReservedPeer', encode); + } + + rpcSettings () { + return this._transport + .execute('ethcore_rpcSettings'); + } + + setAuthor (address) { + return this._transport + .execute('ethcore_setAuthor', inAddress(address)); + } + + setExtraData (data) { + return this._transport + .execute('ethcore_setExtraData', inData(data)); + } + + setGasFloorTarget (quantity) { + return this._transport + .execute('ethcore_setGasFloorTarget', inNumber16(quantity)); + } + + setMinGasPrice (quantity) { + return this._transport + .execute('ethcore_setMinGasPrice', inNumber16(quantity)); + } + + setTransactionsLimit (quantity) { + return this._transport + .execute('ethcore_setTransactionsLimit', inNumber16(quantity)); + } + + transactionsLimit () { + return this._transport + .execute('ethcore_transactionsLimit') + .then(outNumber); + } + + unsignedTransactionsCount () { + return this._transport + .execute('ethcore_unsignedTransactionsCount') + .then(outNumber); + } +} diff --git a/js/src/api/rpc/ethcore/ethcore.spec.js b/js/src/api/rpc/ethcore/ethcore.spec.js new file mode 100644 index 00000000000..ed2204e1bf6 --- /dev/null +++ b/js/src/api/rpc/ethcore/ethcore.spec.js @@ -0,0 +1,76 @@ +import { TEST_HTTP_URL, mockHttp } from '../../../../test/mockRpc'; +import { isBigNumber } from '../../../../test/types'; + +import Http from '../../transport/http'; +import Ethcore from './ethcore'; + +const instance = new Ethcore(new Http(TEST_HTTP_URL)); + +describe('api/rpc/Ethcore', () => { + describe('gasFloorTarget', () => { + it('returns the gasfloor, formatted', () => { + mockHttp([{ method: 'ethcore_gasFloorTarget', reply: { result: '0x123456' } }]); + + return instance.gasFloorTarget().then((count) => { + expect(isBigNumber(count)).to.be.true; + expect(count.eq(0x123456)).to.be.true; + }); + }); + }); + + describe('minGasPrice', () => { + it('returns the min gasprice, formatted', () => { + mockHttp([{ method: 'ethcore_minGasPrice', reply: { result: '0x123456' } }]); + + return instance.minGasPrice().then((count) => { + expect(isBigNumber(count)).to.be.true; + expect(count.eq(0x123456)).to.be.true; + }); + }); + }); + + describe('netMaxPeers', () => { + it('returns the max peers, formatted', () => { + mockHttp([{ method: 'ethcore_netMaxPeers', reply: { result: 25 } }]); + + return instance.netMaxPeers().then((count) => { + expect(isBigNumber(count)).to.be.true; + expect(count.eq(25)).to.be.true; + }); + }); + }); + + describe('newPeers', () => { + it('returns the peer structure, formatted', () => { + mockHttp([{ method: 'ethcore_netPeers', reply: { result: { active: 123, connected: 456, max: 789 } } }]); + + return instance.netPeers().then((peers) => { + expect(peers.active.eq(123)).to.be.true; + expect(peers.connected.eq(456)).to.be.true; + expect(peers.max.eq(789)).to.be.true; + }); + }); + }); + + describe('netPort', () => { + it('returns the connected port, formatted', () => { + mockHttp([{ method: 'ethcore_netPort', reply: { result: 33030 } }]); + + return instance.netPort().then((count) => { + expect(isBigNumber(count)).to.be.true; + expect(count.eq(33030)).to.be.true; + }); + }); + }); + + describe('transactionsLimit', () => { + it('returns the tx limit, formatted', () => { + mockHttp([{ method: 'ethcore_transactionsLimit', reply: { result: 1024 } }]); + + return instance.transactionsLimit().then((count) => { + expect(isBigNumber(count)).to.be.true; + expect(count.eq(1024)).to.be.true; + }); + }); + }); +}); diff --git a/js/src/api/rpc/ethcore/index.js b/js/src/api/rpc/ethcore/index.js new file mode 100644 index 00000000000..cb63d6fdc3f --- /dev/null +++ b/js/src/api/rpc/ethcore/index.js @@ -0,0 +1 @@ +export default from './ethcore'; diff --git a/js/src/api/rpc/index.js b/js/src/api/rpc/index.js new file mode 100644 index 00000000000..bdc41705726 --- /dev/null +++ b/js/src/api/rpc/index.js @@ -0,0 +1,8 @@ +export Db from './db/index'; +export Eth from './eth/index'; +export Ethcore from './ethcore/index'; +export Net from './net/index'; +export Personal from './personal/index'; +export Shh from './shh/index'; +export Trace from './trace/index'; +export Web3 from './web3/index'; diff --git a/js/src/api/rpc/net/index.js b/js/src/api/rpc/net/index.js new file mode 100644 index 00000000000..d4142b5dd48 --- /dev/null +++ b/js/src/api/rpc/net/index.js @@ -0,0 +1 @@ +export default from './net'; diff --git a/js/src/api/rpc/net/net.e2e.js b/js/src/api/rpc/net/net.e2e.js new file mode 100644 index 00000000000..c2d440bb8d9 --- /dev/null +++ b/js/src/api/rpc/net/net.e2e.js @@ -0,0 +1,30 @@ +import { createHttpApi } from '../../../test/e2e/ethapi'; +import { isBoolean } from '../../../../test/types'; + +describe('ethapi.net', () => { + const ethapi = createHttpApi(); + + describe('listening', () => { + it('returns the listening status', () => { + return ethapi.net.listening().then((status) => { + expect(isBoolean(status)).to.be.true; + }); + }); + }); + + describe('peerCount', () => { + it('returns the peer count', () => { + return ethapi.net.peerCount().then((count) => { + expect(count.gte(0)).to.be.true; + }); + }); + }); + + describe('version', () => { + it('returns the version', () => { + return ethapi.net.version().then((version) => { + expect(version).to.be.ok; + }); + }); + }); +}); diff --git a/js/src/api/rpc/net/net.js b/js/src/api/rpc/net/net.js new file mode 100644 index 00000000000..c17ff5b2fb1 --- /dev/null +++ b/js/src/api/rpc/net/net.js @@ -0,0 +1,23 @@ +import { outNumber } from '../../format/output'; + +export default class Net { + constructor (transport) { + this._transport = transport; + } + + listening () { + return this._transport + .execute('net_listening'); + } + + peerCount () { + return this._transport + .execute('net_peerCount') + .then(outNumber); + } + + version () { + return this._transport + .execute('net_version'); + } +} diff --git a/js/src/api/rpc/net/net.spec.js b/js/src/api/rpc/net/net.spec.js new file mode 100644 index 00000000000..30c65b5c8e2 --- /dev/null +++ b/js/src/api/rpc/net/net.spec.js @@ -0,0 +1,20 @@ +import { TEST_HTTP_URL, mockHttp } from '../../../../test/mockRpc'; +import { isBigNumber } from '../../../../test/types'; + +import Http from '../../transport/http'; +import Net from './net'; + +const instance = new Net(new Http(TEST_HTTP_URL)); + +describe('api/rpc/Net', () => { + describe('peerCount', () => { + it('returns the connected peers, formatted', () => { + mockHttp([{ method: 'net_peerCount', reply: { result: '0x123456' } }]); + + return instance.peerCount().then((count) => { + expect(isBigNumber(count)).to.be.true; + expect(count.eq(0x123456)).to.be.true; + }); + }); + }); +}); diff --git a/js/src/api/rpc/personal/index.js b/js/src/api/rpc/personal/index.js new file mode 100644 index 00000000000..fbb50ecc8a3 --- /dev/null +++ b/js/src/api/rpc/personal/index.js @@ -0,0 +1 @@ +export default from './personal'; diff --git a/js/src/api/rpc/personal/personal.e2e.js b/js/src/api/rpc/personal/personal.e2e.js new file mode 100644 index 00000000000..d46d5ca2e01 --- /dev/null +++ b/js/src/api/rpc/personal/personal.e2e.js @@ -0,0 +1,37 @@ +import { createHttpApi } from '../../../test/e2e/ethapi'; +import { isAddress, isBoolean } from '../../../../test/types'; + +describe.skip('ethapi.personal', () => { + const ethapi = createHttpApi(); + const password = 'P@55word'; + let address; + + describe('newAccount', () => { + it('creates a new account', () => { + return ethapi.personal.newAccount(password).then((_address) => { + address = _address; + expect(isAddress(address)).to.be.ok; + }); + }); + }); + + describe('listAccounts', () => { + it('has the newly-created account', () => { + return ethapi.personal.listAccounts(password).then((accounts) => { + expect(accounts.filter((_address) => _address === address)).to.deep.equal([address]); + accounts.forEach((account) => { + expect(isAddress(account)).to.be.true; + }); + }); + }); + }); + + describe('unlockAccount', () => { + it('unlocks the newly-created account', () => { + return ethapi.personal.unlockAccount(address, password).then((result) => { + expect(isBoolean(result)).to.be.true; + expect(result).to.be.true; + }); + }); + }); +}); diff --git a/js/src/api/rpc/personal/personal.js b/js/src/api/rpc/personal/personal.js new file mode 100644 index 00000000000..a593523eea3 --- /dev/null +++ b/js/src/api/rpc/personal/personal.js @@ -0,0 +1,63 @@ +import { inAddress, inNumber10, inOptions } from '../../format/input'; +import { outAccountInfo, outAddress } from '../../format/output'; + +export default class Personal { + constructor (transport) { + this._transport = transport; + } + + accountsInfo () { + return this._transport + .execute('personal_accountsInfo') + .then(outAccountInfo); + } + + listAccounts () { + return this._transport + .execute('personal_listAccounts') + .then((accounts) => (accounts || []).map(outAddress)); + } + + newAccount (password) { + return this._transport + .execute('personal_newAccount', password) + .then(outAddress); + } + + newAccountFromPhrase (phrase, password) { + return this._transport + .execute('personal_newAccountFromPhrase', phrase, password) + .then(outAddress); + } + + newAccountFromWallet (json, password) { + return this._transport + .execute('personal_newAccountFromWallet', json, password) + .then(outAddress); + } + + setAccountName (address, name) { + return this._transport + .execute('personal_setAccountName', inAddress(address), name); + } + + setAccountMeta (address, meta) { + return this._transport + .execute('personal_setAccountMeta', inAddress(address), JSON.stringify(meta)); + } + + signAndSendTransaction (options, password) { + return this._transport + .execute('personal_signAndSendTransaction', inOptions(options), password); + } + + signerEnabled () { + return this._transport + .execute('personal_signerEnabled'); + } + + unlockAccount (account, password, duration = 1) { + return this._transport + .execute('personal_unlockAccount', inAddress(account), password, inNumber10(duration)); + } +} diff --git a/js/src/api/rpc/personal/personal.spec.js b/js/src/api/rpc/personal/personal.spec.js new file mode 100644 index 00000000000..a17d37a5aab --- /dev/null +++ b/js/src/api/rpc/personal/personal.spec.js @@ -0,0 +1,81 @@ +import { TEST_HTTP_URL, mockHttp } from '../../../../test/mockRpc'; + +import Http from '../../transport/http'; +import Personal from './personal'; + +const instance = new Personal(new Http(TEST_HTTP_URL)); + +describe('rpc/Personal', () => { + const account = '0x63cf90d3f0410092fc0fca41846f596223979195'; + const checksum = '0x63Cf90D3f0410092FC0fca41846f596223979195'; + let scope; + + describe('accountsInfo', () => { + it('retrieves the available account info', () => { + scope = mockHttp([{ method: 'personal_accountsInfo', reply: { + result: { + '0x63cf90d3f0410092fc0fca41846f596223979195': { + name: 'name', uuid: 'uuid', meta: '{"data":"data"}' + } + } + } }]); + + return instance.accountsInfo().then((result) => { + expect(result).to.deep.equal({ + '0x63Cf90D3f0410092FC0fca41846f596223979195': { + name: 'name', uuid: 'uuid', meta: { + data: 'data' + } + } + }); + }); + }); + }); + + describe('listAccounts', () => { + it('retrieves a list of available accounts', () => { + scope = mockHttp([{ method: 'personal_listAccounts', reply: { result: [account] } }]); + + return instance.listAccounts().then((result) => { + expect(result).to.deep.equal([checksum]); + }); + }); + + it('returns an empty list when none available', () => { + scope = mockHttp([{ method: 'personal_listAccounts', reply: { result: null } }]); + + return instance.listAccounts().then((result) => { + expect(result).to.deep.equal([]); + }); + }); + }); + + describe('newAccount', () => { + it('passes the password, returning the address', () => { + scope = mockHttp([{ method: 'personal_newAccount', reply: { result: account } }]); + + return instance.newAccount('password').then((result) => { + expect(scope.body.personal_newAccount.params).to.deep.equal(['password']); + expect(result).to.equal(checksum); + }); + }); + }); + + describe('unlockAccount', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'personal_unlockAccount', reply: { result: [] } }]); + }); + + it('passes account, password & duration', () => { + return instance.unlockAccount(account, 'password', 0xf).then(() => { + expect(scope.body.personal_unlockAccount.params).to.deep.equal([account, 'password', 15]); + }); + }); + + it('provides a default duration when not specified', () => { + return instance.unlockAccount(account, 'password').then(() => { + expect(scope.body.personal_unlockAccount.params).to.deep.equal([account, 'password', 1]); + }); + }); + }); +}); diff --git a/js/src/api/rpc/shh/index.js b/js/src/api/rpc/shh/index.js new file mode 100644 index 00000000000..8ae0de51fcf --- /dev/null +++ b/js/src/api/rpc/shh/index.js @@ -0,0 +1 @@ +export default from './shh'; diff --git a/js/src/api/rpc/shh/shh.js b/js/src/api/rpc/shh/shh.js new file mode 100644 index 00000000000..422f63b9294 --- /dev/null +++ b/js/src/api/rpc/shh/shh.js @@ -0,0 +1,55 @@ +export default class Personal { + constructor (transport) { + this._transport = transport; + } + + addToGroup (identity) { + return this._transport + .execute('shh_addToGroup', identity); + } + + getFilterChanges (filterId) { + return this._transport + .execute('shh_getFilterChanges', filterId); + } + + getMessages (filterId) { + return this._transport + .execute('shh_getMessages', filterId); + } + + hasIdentity (identity) { + return this._transport + .execute('shh_hasIdentity', identity); + } + + newFilter (options) { + return this._transport + .execute('shh_newFilter', options); + } + + newGroup () { + return this._transport + .execute('shh_newGroup'); + } + + newIdentity () { + return this._transport + .execute('shh_newIdentity'); + } + + post (options) { + return this._transport + .execute('shh_post', options); + } + + uninstallFilter (filterId) { + return this._transport + .execute('shh_uninstallFilter', filterId); + } + + version () { + return this._transport + .execute('shh_version'); + } +} diff --git a/js/src/api/rpc/trace/index.js b/js/src/api/rpc/trace/index.js new file mode 100644 index 00000000000..5d6af73284b --- /dev/null +++ b/js/src/api/rpc/trace/index.js @@ -0,0 +1 @@ +export default from './trace'; diff --git a/js/src/api/rpc/trace/trace.e2e.js b/js/src/api/rpc/trace/trace.e2e.js new file mode 100644 index 00000000000..0a541a83be1 --- /dev/null +++ b/js/src/api/rpc/trace/trace.e2e.js @@ -0,0 +1,19 @@ +import { createHttpApi } from '../../../test/e2e/ethapi'; + +describe('ethapi.trace', () => { + const ethapi = createHttpApi(); + + describe('block', () => { + it('returns the latest block', () => { + return ethapi.trace.block().then((block) => { + expect(block).to.be.ok; + }); + }); + + it('returns a specified block', () => { + return ethapi.trace.block('0x65432').then((block) => { + expect(block).to.be.ok; + }); + }); + }); +}); diff --git a/js/src/api/rpc/trace/trace.js b/js/src/api/rpc/trace/trace.js new file mode 100644 index 00000000000..b60ae1156a5 --- /dev/null +++ b/js/src/api/rpc/trace/trace.js @@ -0,0 +1,27 @@ +import { inBlockNumber, inHex, inNumber16 } from '../../format/input'; + +export default class Trace { + constructor (transport) { + this._transport = transport; + } + + filter (filterObj) { + return this._transport + .execute('trace_filter', filterObj); + } + + get (txHash, position) { + return this._transport + .execute('trace_get', inHex(txHash), inNumber16(position)); + } + + transaction (txHash) { + return this._transport + .execute('trace_transaction', inHex(txHash)); + } + + block (blockNumber = 'latest') { + return this._transport + .execute('trace_block', inBlockNumber(blockNumber)); + } +} diff --git a/js/src/api/rpc/trace/trace.spec.js b/js/src/api/rpc/trace/trace.spec.js new file mode 100644 index 00000000000..4528d8a60b7 --- /dev/null +++ b/js/src/api/rpc/trace/trace.spec.js @@ -0,0 +1,28 @@ +import { TEST_HTTP_URL, mockHttp } from '../../../../test/mockRpc'; + +import Http from '../../transport/http'; +import Trace from './trace'; + +const instance = new Trace(new Http(TEST_HTTP_URL)); + +describe('api/rpc/Trace', () => { + let scope; + + describe('block', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'trace_block', reply: { result: [] } }]); + }); + + it('assumes latest blockNumber when not specified', () => { + return instance.block().then(() => { + expect(scope.body.trace_block.params).to.deep.equal(['latest']); + }); + }); + + it('passed specified blockNumber', () => { + return instance.block(0x123).then(() => { + expect(scope.body.trace_block.params).to.deep.equal(['0x123']); + }); + }); + }); +}); diff --git a/js/src/api/rpc/web3/index.js b/js/src/api/rpc/web3/index.js new file mode 100644 index 00000000000..6ea8df283e1 --- /dev/null +++ b/js/src/api/rpc/web3/index.js @@ -0,0 +1 @@ +export default from './web3'; diff --git a/js/src/api/rpc/web3/web3.e2e.js b/js/src/api/rpc/web3/web3.e2e.js new file mode 100644 index 00000000000..514944fafb0 --- /dev/null +++ b/js/src/api/rpc/web3/web3.e2e.js @@ -0,0 +1,28 @@ +import { createHttpApi } from '../../../test/e2e/ethapi'; +import { isHexNumber } from '../../../../test/types'; + +describe('ethapi.web3', () => { + const ethapi = createHttpApi(); + + describe('clientVersion', () => { + it('returns the client version', () => { + return ethapi.web3.clientVersion().then((version) => { + const [client] = version.split('/'); + + expect(client === 'Parity' || client === 'Geth').to.be.ok; + }); + }); + }); + + describe('sha3', () => { + it('returns a keccak256 sha', () => { + const sha = '0xa7916fac4f538170f7cd12c148552e2cba9fcd72329a2dd5b07a6fa906488ddf'; + const hexStr = 'baz()'.split('').map((char) => char.charCodeAt(0).toString(16)).join(''); + + return ethapi.web3.sha3(`0x${hexStr}`).then((hash) => { + expect(isHexNumber(hash)).to.be.true; + expect(hash).to.equal(sha); + }); + }); + }); +}); diff --git a/js/src/api/rpc/web3/web3.js b/js/src/api/rpc/web3/web3.js new file mode 100644 index 00000000000..81925b9b1d6 --- /dev/null +++ b/js/src/api/rpc/web3/web3.js @@ -0,0 +1,17 @@ +import { inHex } from '../../format/input'; + +export default class Web3 { + constructor (transport) { + this._transport = transport; + } + + clientVersion () { + return this._transport + .execute('web3_clientVersion'); + } + + sha3 (hexStr) { + return this._transport + .execute('web3_sha3', inHex(hexStr)); + } +} diff --git a/js/src/api/rpc/web3/web3.spec.js b/js/src/api/rpc/web3/web3.spec.js new file mode 100644 index 00000000000..0b893841471 --- /dev/null +++ b/js/src/api/rpc/web3/web3.spec.js @@ -0,0 +1,22 @@ +import { TEST_HTTP_URL, mockHttp } from '../../../../test/mockRpc'; + +import Http from '../../transport/http'; +import Web3 from './web3'; + +const instance = new Web3(new Http(TEST_HTTP_URL)); + +describe('api/rpc/Web3', () => { + let scope; + + describe('sha3', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'web3_sha3', reply: { result: [] } }]); + }); + + it('formats the inputs correctly', () => { + return instance.sha3('1234').then(() => { + expect(scope.body.web3_sha3.params).to.deep.equal(['0x1234']); + }); + }); + }); +}); diff --git a/js/src/api/transport/http/http.e2e.js b/js/src/api/transport/http/http.e2e.js new file mode 100644 index 00000000000..02b7ca370ae --- /dev/null +++ b/js/src/api/transport/http/http.e2e.js @@ -0,0 +1,13 @@ +import Http from './http'; + +const http = new Http('http://localhost:8545'); + +describe('transport/Http', () => { + it('connects and makes a call to web3_clientVersion', () => { + return http.execute('web3_clientVersion').then((version) => { + const [client] = version.split('/'); + + expect(client === 'Geth' || client === 'Parity').to.be.ok; + }); + }); +}); diff --git a/js/src/api/transport/http/http.js b/js/src/api/transport/http/http.js new file mode 100644 index 00000000000..d5fa961e261 --- /dev/null +++ b/js/src/api/transport/http/http.js @@ -0,0 +1,47 @@ +import JsonRpcBase from '../jsonRpcBase'; + +/* global fetch */ +export default class Http extends JsonRpcBase { + constructor (url) { + super(); + + this._url = url; + } + + _encodeOptions (method, params) { + const json = this.encode(method, params); + + this.log(json); + + return { + method: 'POST', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Content-Length': json.length + }, + body: json + }; + } + + execute (method, ...params) { + return fetch(this._url, this._encodeOptions(method, params)) + .then((response) => { + if (response.status !== 200) { + this.error(JSON.stringify({ status: response.status, statusText: response.statusText })); + throw new Error(`${response.status}: ${response.statusText}`); + } + + return response.json(); + }) + .then((result) => { + if (result.error) { + this.error(JSON.stringify(result)); + throw new Error(`${result.error.code}: ${result.error.message}`); + } + + this.log(JSON.stringify(result)); + return result.result; + }); + } +} diff --git a/js/src/api/transport/http/http.spec.js b/js/src/api/transport/http/http.spec.js new file mode 100644 index 00000000000..0aa2f2d1bd8 --- /dev/null +++ b/js/src/api/transport/http/http.spec.js @@ -0,0 +1,106 @@ +import { TEST_HTTP_URL, mockHttp } from '../../../../test/mockRpc'; +import Http from './http'; + +const transport = new Http(TEST_HTTP_URL); + +describe('api/transport/Http', () => { + describe('instance', () => { + it('encodes the options correctly', () => { + const opt = transport._encodeOptions('someMethod', ['param']); + const enc = { + method: 'POST', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Content-Length': 65 + }, + body: `{"jsonrpc":"2.0","method":"someMethod","params":["param"],"id":${transport._id - 1}}` + }; + + expect(opt).to.deep.equal(enc); + }); + }); + + describe('transport', () => { + const RESULT = ['this is some result']; + + let scope; + let result; + + beforeEach(() => { + scope = mockHttp([{ method: 'eth_call', reply: { result: RESULT } }]); + + return transport + .execute('eth_call', 1, 2, 3, 'test') + .then((_result) => { + result = _result; + }); + }); + + it('makes POST', () => { + expect(scope.isDone()).to.be.true; + }); + + it('sets jsonrpc', () => { + expect(scope.body.eth_call.jsonrpc).to.equal('2.0'); + }); + + it('sets the method', () => { + expect(scope.body.eth_call.method).to.equal('eth_call'); + }); + + it('passes the params', () => { + expect(scope.body.eth_call.params).to.deep.equal([1, 2, 3, 'test']); + }); + + it('increments the id', () => { + expect(scope.body.eth_call.id).not.to.equal(0); + }); + + it('passes the actual result back', () => { + expect(result).to.deep.equal(RESULT); + }); + }); + + describe('HTTP errors', () => { + let scope; + let error; + + beforeEach(() => { + scope = mockHttp([{ method: 'eth_call', reply: {}, code: 500 }]); + + return transport + .execute('eth_call') + .catch((_error) => { + error = _error; + }); + }); + + it('returns HTTP errors as throws', () => { + expect(scope.isDone()).to.be.true; + expect(error.message).to.match(/Internal Server Error/); + }); + }); + + describe('RPC errors', () => { + const ERROR = { code: -1, message: 'ERROR: RPC failure' }; + + let scope; + let error; + + beforeEach(() => { + scope = mockHttp([{ method: 'eth_call', reply: { error: ERROR } }]); + + return transport + .execute('eth_call') + .catch((_error) => { + error = _error; + }); + }); + + it('returns RPC errors as throws', () => { + expect(scope.isDone()).to.be.true; + expect(error.message).to.match(/RPC failure/); + }); + }); +}); diff --git a/js/src/api/transport/http/index.js b/js/src/api/transport/http/index.js new file mode 100644 index 00000000000..2cfe539e607 --- /dev/null +++ b/js/src/api/transport/http/index.js @@ -0,0 +1 @@ +export default from './http'; diff --git a/js/src/api/transport/index.js b/js/src/api/transport/index.js new file mode 100644 index 00000000000..2030aac81c6 --- /dev/null +++ b/js/src/api/transport/index.js @@ -0,0 +1,2 @@ +export Http from './http/index'; +export Ws from './ws/index'; diff --git a/js/src/api/transport/jsonRpcBase.js b/js/src/api/transport/jsonRpcBase.js new file mode 100644 index 00000000000..f41a31ab7d2 --- /dev/null +++ b/js/src/api/transport/jsonRpcBase.js @@ -0,0 +1,39 @@ +export default class JsonRpcBase { + constructor () { + this._id = 1; + this._debug = false; + } + + encode (method, params) { + return JSON.stringify({ + jsonrpc: '2.0', + method: method, + params: params, + id: this._id++ + }); + } + + get id () { + return this._id; + } + + get isDebug () { + return this._debug; + } + + setDebug (flag) { + this._debug = flag; + } + + error (error) { + if (this.isDebug) { + console.error(error); + } + } + + log (log) { + if (this.isDebug) { + console.log(log); + } + } +} diff --git a/js/src/api/transport/jsonRpcBase.spec.js b/js/src/api/transport/jsonRpcBase.spec.js new file mode 100644 index 00000000000..295d7e8dc61 --- /dev/null +++ b/js/src/api/transport/jsonRpcBase.spec.js @@ -0,0 +1,72 @@ +import sinon from 'sinon'; + +import JsonRpcBase from './jsonRpcBase'; + +const base = new JsonRpcBase(); + +describe('api/transport/JsonRpcBase', () => { + describe('encode', () => { + it('encodes the body correctly, incrementing id', () => { + const id = base.id; + const bdy = base.encode('someMethod', ['param1', 'param2']); + const enc = `{"jsonrpc":"2.0","method":"someMethod","params":["param1","param2"],"id":${id}}`; + + expect(bdy).to.equal(enc); + expect(base.id - id).to.equal(1); + }); + }); + + describe('setDebug', () => { + it('starts with disabled flag', () => { + expect(base.isDebug).to.be.false; + }); + + it('true flag switches on', () => { + base.setDebug(true); + expect(base.isDebug).to.be.true; + }); + + it('false flag switches off', () => { + base.setDebug(true); + expect(base.isDebug).to.be.true; + base.setDebug(false); + expect(base.isDebug).to.be.false; + }); + + describe('logging', () => { + beforeEach(() => { + sinon.spy(console, 'log'); + sinon.spy(console, 'error'); + }); + + afterEach(() => { + console.log.restore(); + console.error.restore(); + }); + + it('does not log errors with flag off', () => { + base.setDebug(false); + base.log('error'); + expect(console.log).to.not.be.called; + }); + + it('does not log errors with flag off', () => { + base.setDebug(false); + base.error('error'); + expect(console.error).to.not.be.called; + }); + + it('does log errors with flag on', () => { + base.setDebug(true); + base.log('error'); + expect(console.log).to.be.called; + }); + + it('does log errors with flag on', () => { + base.setDebug(true); + base.error('error'); + expect(console.error).to.be.called; + }); + }); + }); +}); diff --git a/js/src/api/transport/ws/index.js b/js/src/api/transport/ws/index.js new file mode 100644 index 00000000000..30c6c0d3a50 --- /dev/null +++ b/js/src/api/transport/ws/index.js @@ -0,0 +1 @@ +export default from './ws'; diff --git a/js/src/api/transport/ws/ws.e2e.js b/js/src/api/transport/ws/ws.e2e.js new file mode 100644 index 00000000000..7af34cf9797 --- /dev/null +++ b/js/src/api/transport/ws/ws.e2e.js @@ -0,0 +1,13 @@ +import Ws from './ws'; + +const ws = new Ws('ws://localhost:8546/'); + +describe('transport/Ws', () => { + it('connects and makes a call to web3_clientVersion', () => { + return ws.execute('web3_clientVersion').then((version) => { + const [client] = version.split('/'); + + expect(client === 'Geth' || client === 'Parity').to.be.ok; + }); + }); +}); diff --git a/js/src/api/transport/ws/ws.js b/js/src/api/transport/ws/ws.js new file mode 100644 index 00000000000..786b405ecad --- /dev/null +++ b/js/src/api/transport/ws/ws.js @@ -0,0 +1,45 @@ +import JsonRpcBase from '../jsonRpcBase'; + +/* global WebSocket */ +export default class Ws extends JsonRpcBase { + constructor (url, protocols) { + super(); + + this._messages = {}; + + this._ws = new WebSocket(url, protocols); + this._ws.onerror = this._onError; + this._ws.onopen = this._onOpen; + this._ws.onclose = this._onClose; + this._ws.onmessage = this._onMessage; + } + + _onMessage = (event) => { + const result = JSON.parse(event.data); + const {resolve, reject} = this._messages[result.id]; + + if (result.error) { + this.error(event.data); + + reject(new Error(`${result.error.code}: ${result.error.message}`)); + delete this._messages[result.id]; + return; + } + + this.log(event.data); + + resolve(result.result); + delete this._messages[result.id]; + } + + execute (method, ...params) { + return new Promise((resolve, reject) => { + this._messages[this.id] = { resolve: resolve, reject: reject }; + const json = this.encode(method, params); + + this.log(json); + + this._ws.send(json); + }); + } +} diff --git a/js/src/api/transport/ws/ws.spec.js b/js/src/api/transport/ws/ws.spec.js new file mode 100644 index 00000000000..419d5a62182 --- /dev/null +++ b/js/src/api/transport/ws/ws.spec.js @@ -0,0 +1,69 @@ +import { TEST_WS_URL, mockWs } from '../../../../test/mockRpc'; +import Ws from './ws'; + +describe('api/transport/Ws', () => { + let transport; + let scope; + + describe('transport', () => { + let result; + + beforeEach(() => { + scope = mockWs([{ method: 'test_anyCall', reply: 'TestResult' }]); + transport = new Ws(TEST_WS_URL); + + return transport + .execute('test_anyCall', 1, 2, 3) + .then((_result) => { + result = _result; + }); + }); + + afterEach(() => { + scope.stop(); + }); + + it('makes call', () => { + expect(scope.isDone()).to.be.true; + }); + + it('sets jsonrpc', () => { + expect(scope.body.test_anyCall.jsonrpc).to.equal('2.0'); + }); + + it('sets the method', () => { + expect(scope.body.test_anyCall.method).to.equal('test_anyCall'); + }); + + it('passes the params', () => { + expect(scope.body.test_anyCall.params).to.deep.equal([1, 2, 3]); + }); + + it('increments the id', () => { + expect(scope.body.test_anyCall.id).not.to.equal(0); + }); + + it('passes the actual result back', () => { + expect(result).to.equal('TestResult'); + }); + }); + + describe('errors', () => { + beforeEach(() => { + scope = mockWs([{ method: 'test_anyCall', reply: { error: { code: 1, message: 'TestError' } } }]); + transport = new Ws(TEST_WS_URL); + }); + + afterEach(() => { + scope.stop(); + }); + + it('returns RPC errors when encountered', () => { + return transport + .execute('test_anyCall') + .catch((error) => { + expect(error).to.match(/TestError/); + }); + }); + }); +}); diff --git a/js/src/api/util/types.js b/js/src/api/util/types.js new file mode 100644 index 00000000000..533ab9d9251 --- /dev/null +++ b/js/src/api/util/types.js @@ -0,0 +1,15 @@ +export function isArray (test) { + return Object.prototype.toString.call(test) === '[object Array]'; +} + +export function isFunction (test) { + return Object.prototype.toString.call(test) === '[object Function]'; +} + +export function isString (test) { + return Object.prototype.toString.call(test) === '[object String]'; +} + +export function isInstanceOf (test, clazz) { + return test instanceof clazz; +} diff --git a/js/src/api/util/types.spec.js b/js/src/api/util/types.spec.js new file mode 100644 index 00000000000..700d1be8e06 --- /dev/null +++ b/js/src/api/util/types.spec.js @@ -0,0 +1,54 @@ +import sinon from 'sinon'; + +import { isArray, isFunction, isInstanceOf, isString } from './types'; +import Eth from '../rpc/eth'; + +describe('api/util/types', () => { + describe('isArray', () => { + it('correctly identifies null as false', () => { + expect(isArray(null)).to.be.false; + }); + + it('correctly identifies empty array as true', () => { + expect(isArray([])).to.be.true; + }); + + it('correctly identifies array as true', () => { + expect(isArray([1, 2, 3])).to.be.true; + }); + }); + + describe('isFunction', () => { + it('correctly identifies null as false', () => { + expect(isFunction(null)).to.be.false; + }); + + it('correctly identifies function as true', () => { + expect(isFunction(sinon.stub())).to.be.true; + }); + }); + + describe('isInstanceOf', () => { + it('correctly identifies build-in instanceof', () => { + expect(isInstanceOf(new String('123'), String)).to.be.true; // eslint-disable-line no-new-wrappers + }); + + it('correctly identifies own instanceof', () => { + expect(isInstanceOf(new Eth({}), Eth)).to.be.true; + }); + + it('correctly reports false for own', () => { + expect(isInstanceOf({}, Eth)).to.be.false; + }); + }); + + describe('isString', () => { + it('correctly identifies empty string as string', () => { + expect(isString('')).to.be.true; + }); + + it('correctly identifies string as string', () => { + expect(isString('123')).to.be.true; + }); + }); +}); diff --git a/js/src/app.js b/js/src/app.js new file mode 100644 index 00000000000..1ac721e97ae --- /dev/null +++ b/js/src/app.js @@ -0,0 +1,36 @@ +import ReactDOM from 'react-dom'; +import React from 'react'; + +import 'isomorphic-fetch'; + +import es6Promise from 'es6-promise'; +es6Promise.polyfill(); + +import injectTapEventPlugin from 'react-tap-event-plugin'; +injectTapEventPlugin(); + +import { Redirect, Router, Route, useRouterHistory } from 'react-router'; +import { createHashHistory } from 'history'; + +import Accounts from './ui/Accounts'; +import Account from './ui/Account'; +import Application from './ui/Application'; +import Apps from './ui/Apps'; +import Tokens from './ui/Tokens'; + +import styles from './reset.css'; + +const routerHistory = useRouterHistory(createHashHistory)({}); + +ReactDOM.render( + + + + + + + + + , + document.querySelector('#container') +); diff --git a/js/src/images/ethcore-logo-white-square.png b/js/src/images/ethcore-logo-white-square.png new file mode 100644 index 0000000000000000000000000000000000000000..a300b5a0a891c31fbf7ff3c43a5afdf3f00fa4ba GIT binary patch literal 41621 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�x`nw}$NspLLtEcr|txk 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 + + + + + + Parity + + + +
+ + + diff --git a/js/src/index.js b/js/src/index.js new file mode 100644 index 00000000000..db0551425ab --- /dev/null +++ b/js/src/index.js @@ -0,0 +1,2 @@ +export Abi from './abi'; +export Api from './api'; diff --git a/js/src/jsonrpc/README.md b/js/src/jsonrpc/README.md new file mode 100644 index 00000000000..8f16ec3ca77 --- /dev/null +++ b/js/src/jsonrpc/README.md @@ -0,0 +1,20 @@ +# jsonrpc + +JSON file of all ethereum's rpc methods supported by parity + +## interfaces + +[interfaces.md](release/interfaces.md) contains the auto-generated list of interfaces exposed, along with their relevant documentation + +## contributing + +0. Clone the repo +0. Branch +0. Add the missing interfaces only into `src/interfaces/*.js` +0. Parameters (array) & Returns take objects of type + - `{ type: [Array|Boolean|Object|String|...], desc: 'some description' }` + - Types are built-in JS types or those defined in `src/types.js` (e.g. `BlockNumber`, `Quantity`, etc.) + - If a formatter is required, add it as `format: 'string-type'` +0. Run the lint & tests, `npm run lint && npm run testOnce` +0. Generate via `npm run build` which outputs `index.js`, `index.json` & `interfaces.md` (Only required until Travis is fully in-place) +0. Check-in and make a PR diff --git a/js/src/jsonrpc/generator/build-json.js b/js/src/jsonrpc/generator/build-json.js new file mode 100644 index 00000000000..4982855c894 --- /dev/null +++ b/js/src/jsonrpc/generator/build-json.js @@ -0,0 +1,51 @@ +import fs from 'fs'; +import path from 'path'; + +import interfaces from '../'; + +const INDEX_JSON = path.join(__dirname, '../../release/index.json'); +const methods = []; + +function formatDescription (obj) { + const optional = obj.optional ? '(optional) ' : ''; + const defaults = obj.default ? `(default: ${obj.default}) ` : ''; + + return `${obj.type.name} - ${optional}${defaults}${obj.desc}`; +} + +function formatType (obj) { + if (obj.type === Object && obj.details) { + const formatted = {}; + + Object.keys(obj.details).sort().forEach((key) => { + formatted[key] = formatType(obj.details[key]); + }); + + return { + desc: formatDescription(obj), + details: formatted + }; + } else if (obj.type && obj.type.name) { + return formatDescription(obj); + } + + return obj; +} + +Object.keys(interfaces).sort().forEach((group) => { + Object.keys(interfaces[group]).sort().forEach((name) => { + const method = interfaces[group][name]; + const deprecated = method.deprecated ? ' (Deprecated and not supported, to be removed in a future version)' : ''; + + methods.push({ + name: `${group}_${name}`, + desc: `${method.desc}${deprecated}`, + params: method.params.map(formatType), + returns: formatType(method.returns), + inputFormatters: method.params.map((param) => param.format || null), + outputFormatter: method.returns.format || null + }); + }); +}); + +fs.writeFileSync(INDEX_JSON, JSON.stringify({ methods: methods }, null, 2), 'utf8'); diff --git a/js/src/jsonrpc/generator/build-markdown.js b/js/src/jsonrpc/generator/build-markdown.js new file mode 100644 index 00000000000..9781b5db083 --- /dev/null +++ b/js/src/jsonrpc/generator/build-markdown.js @@ -0,0 +1,53 @@ +import fs from 'fs'; +import path from 'path'; + +import interfaces from '../'; + +const MARKDOWN = path.join(__dirname, '../../release/interfaces.md'); + +let preamble = '# interfaces\n'; +let markdown = ''; + +function formatDescription (obj, prefix = '', indent = '') { + const optional = obj.optional ? '(optional) ' : ''; + const defaults = obj.default ? `(default: ${obj.default}) ` : ''; + + return `${indent}- ${prefix}\`${obj.type.name}\` - ${optional}${defaults}${obj.desc}`; +} + +function formatType (obj) { + if (obj.type === Object && obj.details) { + const sub = Object.keys(obj.details).sort().map((key) => { + return formatDescription(obj.details[key], `\`${key}\`/`, ' '); + }).join('\n'); + + return `${formatDescription(obj)}\n${sub}`; + } else if (obj.type && obj.type.name) { + return formatDescription(obj); + } + + return obj; +} + +Object.keys(interfaces).sort().forEach((group) => { + let content = ''; + + preamble = `${preamble}\n- [${group}](#${group})`; + markdown = `${markdown}\n## ${group}\n`; + + Object.keys(interfaces[group]).sort().forEach((iname) => { + const method = interfaces[group][iname]; + const name = `${group}_${iname}`; + const deprecated = method.deprecated ? ' (Deprecated and not supported, to be removed in a future version)' : ''; + const desc = `${method.desc}${deprecated}`; + const params = method.params.map(formatType).join('\n'); + const returns = formatType(method.returns); + + markdown = `${markdown}\n- [${name}](#${name})`; + content = `${content}### ${name}\n\n${desc}\n\n#### parameters\n\n${params || 'none'}\n\n#### returns\n\n${returns || 'none'}\n\n`; + }); + + markdown = `${markdown}\n\n${content}`; +}); + +fs.writeFileSync(MARKDOWN, `${preamble}\n\n${markdown}`, 'utf8'); diff --git a/js/src/jsonrpc/index.js b/js/src/jsonrpc/index.js new file mode 100644 index 00000000000..f9d6fd61ca0 --- /dev/null +++ b/js/src/jsonrpc/index.js @@ -0,0 +1,19 @@ +import db from './interfaces/db'; +import eth from './interfaces/eth'; +import ethcore from './interfaces/ethcore'; +import net from './interfaces/net'; +import personal from './interfaces/personal'; +import shh from './interfaces/shh'; +import trace from './interfaces/trace'; +import web3 from './interfaces/web3'; + +export default { + db: db, + eth: eth, + ethcore: ethcore, + net: net, + personal: personal, + shh: shh, + trace: trace, + web3: web3 +}; diff --git a/js/src/jsonrpc/index.spec.js b/js/src/jsonrpc/index.spec.js new file mode 100644 index 00000000000..32e2a0b8935 --- /dev/null +++ b/js/src/jsonrpc/index.spec.js @@ -0,0 +1,46 @@ +import interfaces from './'; +import { Address, BlockNumber, Data, Hash, Integer, Quantity } from './types'; + +const flatlist = {}; + +function verifyType (obj) { + if (typeof obj !== 'string') { + expect(obj).to.satisfy(() => { + return obj.type === Array || + obj.type === Boolean || + obj.type === Object || + obj.type === String || + obj.type === Address || + obj.type === BlockNumber || + obj.type === Data || + obj.type === Hash || + obj.type === Integer || + obj.type === Quantity; + }); + } +} + +describe('jsonrpc/interfaces', () => { + Object.keys(interfaces).forEach((group) => { + describe(group, () => { + Object.keys(interfaces[group]).forEach((name) => { + const method = interfaces[group][name]; + + flatlist[`${group}_${name}`] = true; + + describe(name, () => { + it('has the correct interface', () => { + expect(method.desc).to.be.a('string'); + expect(method.params).to.be.an('array'); + expect(method.returns).to.satisfy((returns) => { + return typeof returns === 'string' || typeof returns === 'object'; + }); + + method.params.forEach(verifyType); + verifyType(method.returns); + }); + }); + }); + }); + }); +}); diff --git a/js/src/jsonrpc/interfaces/db.js b/js/src/jsonrpc/interfaces/db.js new file mode 100644 index 00000000000..ecf8b7bb07f --- /dev/null +++ b/js/src/jsonrpc/interfaces/db.js @@ -0,0 +1,87 @@ +import { Data } from '../types'; + +export default { + getHex: { + desc: 'Returns binary data from the local database.', + params: [ + { + type: String, + desc: 'Database name' + }, + { + type: String, + desc: 'Key name' + } + ], + returns: { + type: Data, + desc: 'The previously stored data' + }, + deprecated: true + }, + + getString: { + desc: 'Returns string from the local database.', + params: [ + { + type: String, + desc: 'Database name' + }, + { + type: String, + desc: 'Key name' + } + ], + returns: { + type: String, + desc: 'The previously stored string' + }, + deprecated: true + }, + + putHex: { + desc: 'Stores binary data in the local database.', + params: [ + { + type: String, + desc: 'Database name' + }, + { + type: String, + desc: 'Key name' + }, + { + type: Data, + desc: 'The data to store' + } + ], + returns: { + type: Boolean, + desc: '`true` if the value was stored, otherwise `false`' + }, + deprecated: true + }, + + putString: { + desc: 'Stores a string in the local database.', + params: [ + { + type: String, + desc: 'Database name' + }, + { + type: String, + desc: 'Key name' + }, + { + type: String, + desc: 'The string to store' + } + ], + returns: { + type: Boolean, + desc: '`true` if the value was stored, otherwise `false`' + }, + deprecated: true + } +}; diff --git a/js/src/jsonrpc/interfaces/eth.js b/js/src/jsonrpc/interfaces/eth.js new file mode 100644 index 00000000000..90458e7e841 --- /dev/null +++ b/js/src/jsonrpc/interfaces/eth.js @@ -0,0 +1,990 @@ +import { Address, BlockNumber, Data, Hash, Quantity } from '../types'; + +export default { + accounts: { + desc: 'Returns a list of addresses owned by client.', + params: [], + returns: { + type: Array, + desc: '20 Bytes - addresses owned by the client' + } + }, + + blockNumber: { + desc: 'Returns the number of most recent block.', + params: [], + returns: { + type: Quantity, + desc: 'integer of the current block number the client is on' + } + }, + + call: { + desc: 'Executes a new message call immediately without creating a transaction on the block chain.', + params: [ + { + type: Object, + desc: 'The transaction call object', + format: 'inputCallFormatter', + details: { + from: { + type: Address, + desc: '20 Bytes - The address the transaction is send from', + optional: true + }, + to: { + type: Address, + desc: '20 Bytes - The address the transaction is directed to' + }, + gas: { + type: Quantity, + desc: 'Integer of the gas provided for the transaction execution. eth_call consumes zero gas, but this parameter may be needed by some executions', + optional: true + }, + gasPrice: { + type: Quantity, + desc: 'Integer of the gasPrice used for each paid gas', + optional: true + }, + value: { + type: Quantity, + desc: 'Integer of the value send with this transaction', + optional: true + }, + data: { + type: Data, + desc: 'Hash of the method signature and encoded parameters. For details see [Ethereum Contract ABI](https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI)', + optional: true + } + } + }, + { + type: BlockNumber, + desc: 'integer block number, or the string `\'latest\'`, `\'earliest\'` or `\'pending\'`, see the [default block parameter](#the-default-block-parameter)', + format: 'inputDefaultBlockNumberFormatter' + } + ], + returns: { + type: Data, + desc: 'the return value of executed contract' + } + }, + + coinbase: { + desc: 'Returns the client coinbase address.', + params: [], + returns: { + type: Address, + desc: 'The current coinbase address' + } + }, + + compileSerpent: { + desc: 'Returns compiled serpent code.', + params: [ + { + type: String, + desc: 'The source code' + } + ], + returns: { + type: Data, + desc: 'The compiled source code' + } + }, + + compileSolidity: { + desc: 'Returns compiled solidity code.', + params: [ + { + type: String, + desc: 'The source code' + } + ], + returns: { + type: Data, + desc: 'The compiled source code' + } + }, + + compileLLL: { + desc: 'Returns compiled LLL code.', + params: [ + { + type: String, + desc: 'The source code' + } + ], + returns: { + type: Data, + desc: 'The compiled source code' + } + }, + + estimateGas: { + desc: 'Makes a call or transaction, which won\'t be added to the blockchain and returns the used gas, which can be used for estimating the used gas.', + params: [ + { + type: Object, + desc: 'see [eth_sendTransaction](#eth_sendTransaction)', + format: 'inputCallFormatter' + } + ], + returns: { + type: Quantity, + desc: 'The amount of gas used', + format: 'utils.toDecimal' + } + }, + + fetchQueuedTransactions: { + desc: '?', + params: [ + '?' + ], + returns: { + type: Boolean, + desc: 'whether the call was successful' + } + }, + + flush: { + desc: '?', + params: [], + returns: { + type: Boolean, + desc: 'whether the call was successful' + } + }, + + gasPrice: { + desc: 'Returns the current price per gas in wei.', + params: [], + returns: { + type: Quantity, + desc: 'integer of the current gas price in wei' + } + }, + + getBalance: { + desc: 'Returns the balance of the account of given address.', + params: [ + { + type: Address, + desc: '20 Bytes - address to check for balance', + format: 'inputAddressFormatter' + }, + { + type: BlockNumber, + desc: 'integer block number, or the string `\'latest\'`, `\'earliest\'` or `\'pending\'`, see the [default block parameter](#the-default-block-parameter)', + format: 'inputDefaultBlockNumberFormatter' + } + ], + returns: { + type: Quantity, + desc: 'integer of the current balance in wei', + format: 'outputBigNumberFormatter' + } + }, + + getBlockByHash: { + desc: 'Returns information about a block by hash.', + params: [ + { + type: Hash, + desc: 'Hash of a block' + }, + { + type: Boolean, + desc: 'If `true` it returns the full transaction objects, if `false` only the hashes of the transactions' + } + ], + returns: { + type: Object, + desc: 'A block object, or `null` when no block was found', + details: { + number: { + type: Quantity, + desc: 'The block number. `null` when its pending block' + }, + hash: { + type: Hash, + desc: '32 Bytes - hash of the block. `null` when its pending block' + }, + parentHash: { + type: Hash, + desc: '32 Bytes - hash of the parent block' + }, + nonce: { + type: Data, + desc: '8 Bytes - hash of the generated proof-of-work. `null` when its pending block' + }, + sha3Uncles: { + type: Data, + desc: '32 Bytes - SHA3 of the uncles data in the block' + }, + logsBloom: { + type: Data, + desc: '256 Bytes - the bloom filter for the logs of the block. `null` when its pending block' + }, + transactionsRoot: { + type: Data, + desc: '32 Bytes - the root of the transaction trie of the block' + }, + stateRoot: { + type: Data, + desc: '32 Bytes - the root of the final state trie of the block' + }, + receiptsRoot: { + type: Data, desc: '32 Bytes - the root of the receipts trie of the block' + }, + miner: { + type: Address, + desc: '20 Bytes - the address of the beneficiary to whom the mining rewards were given' + }, + difficulty: { + type: Quantity, + desc: 'integer of the difficulty for this block' + }, + totalDifficulty: { + type: Quantity, + desc: 'integer of the total difficulty of the chain until this block' + }, + extraData: { + type: Data, + desc: 'the \'extra data\' field of this block' + }, + size: { + type: Quantity, + desc: 'integer the size of this block in bytes' + }, + gasLimit: { + type: Quantity, + desc: 'the maximum gas allowed in this block' + }, + gasUsed: { + type: Quantity, + desc: 'the total used gas by all transactions in this block' + }, + timestamp: { + type: Quantity, + desc: 'the unix timestamp for when the block was collated' + }, + transactions: { + type: Array, + desc: 'Array of transaction objects, or 32 Bytes transaction hashes depending on the last given parameter' + }, + uncles: { + type: Array, + desc: 'Array of uncle hashes' + } + } + } + }, + + getBlockByNumber: { + desc: 'Returns information about a block by block number.', + params: [ + { + type: BlockNumber, + desc: 'integer of a block number, or the string `\'earliest\'`, `\'latest\'` or `\'pending\'`, as in the [default block parameter](#the-default-block-parameter)' + }, + { + type: Boolean, + desc: 'If `true` it returns the full transaction objects, if `false` only the hashes of the transactions' + } + ], + returns: 'See [eth_getBlockByHash](#eth_getblockbyhash)' + }, + + getBlockTransactionCountByHash: { + desc: 'Returns the number of transactions in a block from a block matching the given block hash.', + params: [ + { + type: Hash, + desc: '32 Bytes - hash of a block' + } + ], + returns: { + type: Quantity, + desc: 'integer of the number of transactions in this block' + } + }, + + getBlockTransactionCountByNumber: { + desc: 'Returns the number of transactions in a block from a block matching the given block number.', + params: [ + { + type: BlockNumber, + desc: 'integer of a block number, or the string `\'earliest\'`, `\'latest\'` or `\'pending\'`, as in the [default block parameter](#the-default-block-parameter)' + } + ], + returns: { + type: Quantity, + desc: 'integer of the number of transactions in this block' + } + }, + + getCode: { + desc: 'Returns code at a given address.', + params: [ + { + type: Address, + desc: '20 Bytes - address', + format: 'inputAddressFormatter' + }, + { + type: BlockNumber, + desc: 'integer block number, or the string `\'latest\'`, `\'earliest\'` or `\'pending\'`, see the [default block parameter](#the-default-block-parameter)', + format: 'inputDefaultBlockNumberFormatter' + } + ], + returns: { + type: Data, + desc: 'the code from the given address' + } + }, + + getCompilers: { + desc: 'Returns a list of available compilers in the client.', + params: [], + returns: { + type: Array, + desc: 'Array of available compilers' + } + }, + + getFilterChanges: { + desc: 'Polling method for a filter, which returns an array of logs which occurred since last poll.', + params: [ + { + type: Quantity, + desc: 'The filter id' + } + ], + returns: { + type: Array, + desc: 'Array of log objects, or an empty array if nothing has changed since last poll' + } + }, + + getFilterChangesEx: { + desc: '?', + params: [ + '?' + ], + returns: { + type: Boolean, + desc: 'whether the call was successful' + } + }, + + getFilterLogs: { + desc: 'Returns an array of all logs matching filter with given id.', + params: [ + { + type: Quantity, + desc: 'The filter id' + } + ], + returns: 'See [eth_getFilterChanges](#eth_getfilterchanges)' + }, + + getFilterLogsEx: { + desc: '?', + params: [ + '?' + ], + returns: { + type: Boolean, + desc: 'whether the call was successful' + } + }, + + getLogs: { + desc: 'Returns an array of all logs matching a given filter object.', + params: [ + { + type: Object, + desc: 'The filter object, see [eth_newFilter parameters](#eth_newfilter)' + } + ], + returns: 'See [eth_getFilterChanges](#eth_getfilterchanges)' + }, + + getLogsEx: { + desc: '?', + params: [ + '?' + ], + returns: { + type: Boolean, + desc: 'whether the call was successful' + } + }, + + getStorageAt: { + desc: 'Returns the value from a storage position at a given address.', + params: [ + { + type: Address, + desc: '20 Bytes - address of the storage' + }, + { + type: Quantity, + desc: 'integer of the position in the storage', + format: 'utils.toHex' + }, + { + type: BlockNumber, + desc: 'integer block number, or the string `\'latest\'`, `\'earliest\'` or `\'pending\'`, see the [default block parameter](#the-default-block-parameter)', + format: 'inputDefaultBlockNumberFormatter' + } + ], + returns: { + type: Data, + desc: 'the value at this storage position' + } + }, + + getTransactionByHash: { + desc: 'Returns the information about a transaction requested by transaction hash.', + params: [ + { + type: Hash, + desc: '32 Bytes - hash of a transaction' + } + ], + returns: { + type: Object, + desc: 'A transaction object, or `null` when no transaction was found:', + format: 'outputTransactionFormatter', + details: { + hash: { + type: Hash, + desc: '32 Bytes - hash of the transaction.' + }, + nonce: { + type: Quantity, + desc: 'the number of transactions made by the sender prior to this one.' + }, + blockHash: { + type: Hash, + desc: '32 Bytes - hash of the block where this transaction was in. `null` when its pending.' + }, + blockNumber: { + type: BlockNumber, + desc: 'block number where this transaction was in. `null` when its pending.' + }, + transactionIndex: { + type: Quantity, + desc: 'integer of the transactions index position in the block. `null` when its pending.' + }, + from: { + type: Address, + desc: '20 Bytes - address of the sender.' + }, + to: { + type: Address, + desc: '20 Bytes - address of the receiver. `null` when its a contract creation transaction.' + }, + value: { + type: Quantity, + desc: 'value transferred in Wei.' + }, + gasPrice: { + type: Quantity, + desc: 'gas price provided by the sender in Wei.' + }, + gas: { + type: Quantity, + desc: 'gas provided by the sender.' + }, + input: { + type: Data, + desc: 'the data send along with the transaction.' + } + } + } + }, + + getTransactionByBlockHashAndIndex: { + desc: 'Returns information about a transaction by block hash and transaction index position.', + params: [ + { + type: Hash, + desc: 'hash of a block' + }, + { + type: Quantity, + desc: 'integer of the transaction index position' + } + ], + returns: 'See [eth_getBlockByHash](#eth_gettransactionbyhash)' + }, + + getTransactionByBlockNumberAndIndex: { + desc: 'Returns information about a transaction by block number and transaction index position.', + params: [ + { + type: BlockNumber, + desc: 'a block number, or the string `\'earliest\'`, `\'latest\'` or `\'pending\'`, as in the [default block parameter](#the-default-block-parameter)' + }, + { + type: Quantity, + desc: 'The transaction index position' + } + ], + returns: 'See [eth_getBlockByHash](#eth_gettransactionbyhash)' + }, + + getTransactionCount: { + desc: 'Returns the number of transactions *sent* from an address.', + params: [ + { + type: Address, + desc: '20 Bytes - address' + }, + { + type: BlockNumber, + desc: 'integer block number, or the string `\'latest\'`, `\'earliest\'` or `\'pending\'`, see the [default block parameter](#the-default-block-parameter)', + format: 'inputDefaultBlockNumberFormatter' + } + ], + returns: { + type: Quantity, + desc: 'integer of the number of transactions send from this address', + format: 'utils.toDecimal' + } + }, + + getTransactionReceipt: { + desc: 'Returns the receipt of a transaction by transaction hash.\n**Note** That the receipt is not available for pending transactions.', + params: [ + { + type: Hash, + desc: 'hash of a transaction' + } + ], + returns: { + type: Object, + desc: 'A transaction receipt object, or `null` when no receipt was found:', + format: 'outputTransactionReceiptFormatter', + details: { + transactionHash: { + type: Hash, + desc: '32 Bytes - hash of the transaction.' + }, + transactionIndex: { + type: Quantity, + desc: 'integer of the transactions index position in the block.' + }, + blockHash: { + type: Hash, + desc: '32 Bytes - hash of the block where this transaction was in.' + }, + blockNumber: { + type: BlockNumber, + desc: 'block number where this transaction was in.' + }, + cumulativeGasUsed: { + type: Quantity, + desc: 'The total amount of gas used when this transaction was executed in the block.' + }, + gasUsed: { + type: Quantity, + desc: 'The amount of gas used by this specific transaction alone.' + }, + contractAddress: { + type: Address, + desc: '20 Bytes - The contract address created, if the transaction was a contract creation, otherwise `null`.' + }, + logs: { + type: Array, + desc: 'Array of log objects, which this transaction generated.' + } + } + } + }, + + getUncleByBlockHashAndIndex: { + desc: 'Returns information about a uncle of a block by hash and uncle index position.', + params: [ + { + type: Hash, + desc: 'Hash a block' + }, + { + type: Quantity, + desc: 'The uncle\'s index position' + } + ], + returns: 'See [eth_getBlockByHash](#eth_getblockbyhash)' + }, + + getUncleByBlockNumberAndIndex: { + desc: 'Returns information about a uncle of a block by number and uncle index position.', + params: [ + { + type: BlockNumber, + desc: 'a block number, or the string `\'earliest\'`, `\'latest\'` or `\'pending\'`, as in the [default block parameter](#the-default-block-parameter)' + }, + { + type: Quantity, + desc: 'The uncle\'s index position' + } + ], + returns: 'See [eth_getBlockByHash](#eth_getblockbyhash)' + }, + + getUncleCountByBlockHash: { + desc: 'Returns the number of uncles in a block from a block matching the given block hash.', + params: [ + { + type: Hash, + desc: '32 Bytes - hash of a block' + } + ], + returns: { + type: Quantity, + desc: 'integer of the number of uncles in this block' + } + }, + + getUncleCountByBlockNumber: { + desc: 'Returns the number of uncles in a block from a block matching the given block number.', + params: [ + { + type: BlockNumber, + desc: 'integer of a block number, or the string \'latest\', \'earliest\' or \'pending\', see the [default block parameter](#the-default-block-parameter)' + } + ], + returns: { + type: Quantity, + desc: 'integer of the number of uncles in this block' + } + }, + + getWork: { + desc: 'Returns the hash of the current block, the seedHash, and the boundary condition to be met (\'target\').', + params: [], + returns: { + type: Array, + desc: 'Array with the following properties:' + } + }, + + hashrate: { + desc: 'Returns the number of hashes per second that the node is mining with.', + params: [], + returns: { + type: Quantity, + desc: 'number of hashes per second' + } + }, + + inspectTransaction: { + desc: '?', + params: [ + '?' + ], + returns: { + type: Boolean, + desc: 'whether the call was successful' + } + }, + + mining: { + desc: 'Returns `true` if client is actively mining new blocks.', + params: [], + returns: { + type: Boolean, + desc: '`true` of the client is mining, otherwise `false`' + } + }, + + newBlockFilter: { + desc: 'Creates a filter in the node, to notify when a new block arrives.\nTo check if the state has changed, call [eth_getFilterChanges](#eth_getfilterchanges).', + params: [], + returns: { + type: Quantity, + desc: 'A filter id' + } + }, + + newFilter: { + desc: 'Creates a filter object, based on filter options, to notify when the state changes (logs).\nTo check if the state has changed, call [eth_getFilterChanges](#eth_getfilterchanges).', + params: [], + returns: { + type: Object, + desc: 'The filter options:', + details: { + fromBlock: { + type: BlockNumber, + desc: 'Integer block number, or `\'latest\'` for the last mined block or `\'pending\'`, `\'earliest\'` for not yet mined transactions.', + optional: true, + default: 'latest' + }, + toBlock: { + type: BlockNumber, + desc: 'Integer block number, or `\'latest\'` for the last mined block or `\'pending\'`, `\'earliest\'` for not yet mined transactions.', + optional: true, + default: 'latest' + }, + address: { + type: Address, + desc: '20 Bytes - Contract address or a list of addresses from which logs should originate.', + optional: true + }, + topics: { + type: Array, + desc: 'Array of 32 Bytes `DATA` topics. Topics are order-dependent. Each topic can also be an array of DATA with \'or\' options.', + optional: true + } + } + } + }, + + newFilterEx: { + desc: '?', + params: [ + '?' + ], + returns: { + type: Boolean, + desc: 'whether the call was successful' + } + }, + + newPendingTransactionFilter: { + desc: 'Creates a filter in the node, to notify when new pending transactions arrive.\nTo check if the state has changed, call [eth_getFilterChanges](#eth_getfilterchanges).', + params: [], + returns: { + type: Quantity, + desc: 'A filter id' + } + }, + + notePassword: { + desc: '?', + params: [ + '?' + ], + returns: { + type: Boolean, + desc: 'whether the call was successful' + } + }, + + pendingTransactions: { + desc: '?', + params: [], + returns: { + type: Boolean, + desc: 'whether the call was successful' + } + }, + + protocolVersion: { + desc: 'Returns the current ethereum protocol version.', + params: [], + returns: { + type: String, + desc: 'The current ethereum protocol version' + } + }, + + register: { + desc: '?', + params: [ + '?' + ], + returns: { + type: Boolean, + desc: 'whether the call was successful' + } + }, + + sendRawTransaction: { + desc: 'Creates new message call transaction or a contract creation for signed transactions.', + params: [ + { + type: Data, + desc: 'The signed transaction data' + } + ], + returns: { + type: Hash, + desc: '32 Bytes - the transaction hash, or the zero hash if the transaction is not yet available' + } + }, + + sendTransaction: { + desc: 'Creates new message call transaction or a contract creation, if the data field contains code.', + params: [ + { + type: Object, desc: 'The transaction object', + format: 'inputTransactionFormatter', + details: { + from: { + type: Address, + desc: '20 Bytes - The address the transaction is send from' + }, + to: { + type: Address, + desc: '20 Bytes - (optional when creating new contract) The address the transaction is directed to' + }, + gas: { + type: Quantity, + desc: 'Integer of the gas provided for the transaction execution. It will return unused gas.', + optional: true, + default: 90000 + }, + gasPrice: { + type: Quantity, + desc: 'Integer of the gasPrice used for each paid gas', + optional: true, + default: 'To-Be-Determined' + }, + value: { + type: Quantity, + desc: 'Integer of the value send with this transaction', + optional: true + }, + data: { + type: Data, + desc: 'The compiled code of a contract OR the hash of the invoked method signature and encoded parameters. For details see [Ethereum Contract ABI](https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI)' + }, + nonce: { + type: Quantity, + desc: 'Integer of a nonce. This allows to overwrite your own pending transactions that use the same nonce.', + optional: true + } + } + } + ], + returns: { + type: Hash, + desc: '32 Bytes - the transaction hash, or the zero hash if the transaction is not yet available' + } + }, + + sign: { + desc: 'Signs data with a given address.\n**Note** the address to sign must be unlocked.', + params: [ + { + type: Address, + desc: '20 Bytes - address', + format: 'inputAddressFormatter' + }, + { + type: Data, + desc: 'Data to sign' + } + ], + returns: { + type: Data, + desc: 'Signed data' + } + }, + + signTransaction: { + desc: '?', + params: [ + '?' + ], + returns: { + type: Boolean, + desc: 'whether the call was successful' + } + }, + + submitWork: { + desc: 'Used for submitting a proof-of-work solution.', + params: [ + { + type: Data, + desc: '8 Bytes - The nonce found (64 bits)' + }, + { + type: Data, + desc: '32 Bytes - The header\'s pow-hash (256 bits)' + }, + { + type: Data, + desc: '32 Bytes - The mix digest (256 bits)' + } + ], + returns: { + type: Boolean, + desc: '`true` if the provided solution is valid, otherwise `false`' + } + }, + + submitHashrate: { + desc: 'Used for submitting mining hashrate.', + params: [ + { + type: Data, + desc: 'a hexadecimal string representation (32 bytes) of the hash rate' + }, + { + type: String, + desc: 'A random hexadecimal(32 bytes) ID identifying the client' + } + ], + returns: { + type: Boolean, + desc: '`true` if submitting went through succesfully and `false` otherwise' + } + }, + + syncing: { + desc: 'Returns an object with data about the sync status or `false`.', + params: [], + returns: { + type: Object, + desc: 'An object with sync status data or `FALSE`, when not syncing', + format: 'outputSyncingFormatter', + details: { + startingBlock: { + type: Quantity, + desc: 'The block at which the import started (will only be reset, after the sync reached his head)' + }, + currentBlock: { + type: Quantity, + desc: 'The current block, same as eth_blockNumber' + }, + highestBlock: { + type: Quantity, + desc: 'The estimated highest block' + } + } + } + }, + + uninstallFilter: { + desc: 'Uninstalls a filter with given id. Should always be called when watch is no longer needed.\nAdditonally Filters timeout when they aren\'t requested with [eth_getFilterChanges](#eth_getfilterchanges) for a period of time.', + params: [ + { + type: Quantity, + desc: 'The filter id' + } + ], + returns: { + type: Boolean, + desc: '`true` if the filter was successfully uninstalled, otherwise `false`' + } + }, + + unregister: { + desc: '?', + params: [ + '?' + ], + returns: { + type: Boolean, + desc: 'whether the call was successful' + } + } +}; diff --git a/js/src/jsonrpc/interfaces/ethcore.js b/js/src/jsonrpc/interfaces/ethcore.js new file mode 100644 index 00000000000..8d81d265933 --- /dev/null +++ b/js/src/jsonrpc/interfaces/ethcore.js @@ -0,0 +1,267 @@ +import { Address, Data, Quantity } from '../types'; + +export default { + acceptNonReservedPeers: { + desc: '?', + params: [], + returns: { + type: Boolean, + desc: '?' + } + }, + + addReservedPeer: { + desc: '?', + params: [ + { + type: String, + desc: 'Enode' + } + ], + returns: { + type: Boolean, + desc: '?' + } + }, + + defaultExtraData: { + desc: 'Returns the default extra data', + params: [], + returns: { + type: Data, + desc: 'Extra data' + } + }, + + devLogs: { + desc: 'Returns latest logs of your node', + params: [], + returns: { + type: Array, + desc: 'Development logs' + } + }, + + devLogsLevels: { + desc: 'Returns current log level settings', + params: [], + returns: { + type: String, + decs: 'Current log level' + } + }, + + dropNonReservedPeers: { + desc: '?', + params: [], + returns: { + type: Boolean, + desc: '?' + } + }, + + extraData: { + desc: 'Returns currently set extra data', + params: [], + returns: { + type: Data, + desc: 'Extra data' + } + }, + + gasFloorTarget: { + desc: 'Returns current target for gas floor', + params: [], + returns: { + type: Quantity, + desc: 'Gas Floor Target', + format: 'outputBigNumberFormatter' + } + }, + + generateSecretPhrase: { + desc: 'Creates a secret phrase that can be associated with an account', + params: [], + returns: { + type: String, + desc: 'The secret phrase' + } + }, + + minGasPrice: { + desc: 'Returns currently set minimal gas price', + params: [], + returns: { + type: Quantity, + desc: 'Minimal Gas Price', + format: 'outputBigNumberFormatter' + } + }, + + netChain: { + desc: 'Returns the name of the connected chain.', + params: [], + returns: { + type: String, + desc: 'chain name' + } + }, + + netMaxPeers: { + desc: 'Returns maximal number of peers.', + params: [], + returns: { + type: Quantity, + desc: 'Maximal number of peers' + } + }, + + netPort: { + desc: 'Returns network port the node is listening on.', + params: [], + returns: { + type: Quantity, + desc: 'Port Number' + } + }, + + nodeName: { + desc: 'Returns node name (identity)', + params: [], + returns: { + type: String, + desc: 'Node name' + } + }, + + phraseToAddress: { + desc: 'Converts a secret phrase into the corresponting address', + params: [ + { + type: String, + desc: 'The secret' + } + ], + returns: { + type: Address, + desc: 'Corresponding address' + } + }, + + removeReservedPeer: { + desc: '?', + params: [ + { + type: String, + desc: 'Encode' + } + ], + returns: { + type: Boolean, + desc: '?' + } + }, + + rpcSettings: { + desc: 'Returns basic settings of rpc (enabled, port, interface).', + params: [], + returns: { + type: Object, + desc: 'JSON object containing rpc settings' + } + }, + + setAuthor: { + desc: 'Changes author (coinbase) for mined blocks.', + params: [ + { + type: Address, + desc: '20 Bytes - Address', + format: 'inputAddressFormatter' + } + ], + returns: { + type: Boolean, + desc: 'whether the call was successful' + } + }, + + setExtraData: { + desc: 'Changes extra data for newly mined blocks', + params: [ + { + type: Data, + desc: 'Extra Data', + format: 'utils.toHex' + } + ], + returns: { + type: Boolean, + desc: 'whether the call was successful' + } + }, + + setGasFloorTarget: { + desc: 'Changes current gas floor target.', + params: [ + { + type: Quantity, + desc: 'Gas Floor Target', + format: 'utils.toHex' + } + ], + returns: { + type: Boolean, + desc: 'whether the call was successful' + } + }, + + setMinGasPrice: { + desc: 'Changes minimal gas price for transaction to be accepted to the queue.', + params: [ + { + type: Quantity, + desc: 'Minimal gas price', + format: 'utils.toHex' + } + ], + returns: { + type: Boolean, + desc: 'whether the call was successful' + } + }, + + setTransactionsLimit: { + desc: 'Changes limit for transactions in queue.', + params: [ + { + type: Quantity, + desc: 'New Limit', + format: 'utils.toHex' + } + ], + returns: { + type: Boolean, + desc: 'whether the call was successful' + } + }, + + transactionsLimit: { + desc: 'Changes limit for transactions in queue.', + params: [], + returns: { + type: Quantity, + desc: 'Current max number of transactions in queue', + format: 'outputBigNumberFormatter' + } + }, + + unsignedTransactionsCount: { + desc: 'Returns number of unsigned transactions when running with Trusted Signer. Error otherwise', + params: [], + returns: { + type: Quantity, + desc: 'Number of unsigned transactions' + } + } +}; diff --git a/js/src/jsonrpc/interfaces/net.js b/js/src/jsonrpc/interfaces/net.js new file mode 100644 index 00000000000..5cd23fd771c --- /dev/null +++ b/js/src/jsonrpc/interfaces/net.js @@ -0,0 +1,30 @@ +import { Quantity } from '../types'; + +export default { + listening: { + desc: 'Returns `true` if client is actively listening for network connections.', + params: [], + returns: { + type: Boolean, + desc: '`true` when listening, otherwise `false`.' + } + }, + + peerCount: { + desc: 'Returns number of peers currenly connected to the client.', + params: [], + returns: { + type: Quantity, + desc: 'Integer of the number of connected peers', + format: 'utils.toDecimal' + } + }, + version: { + desc: 'Returns the current network protocol version.', + params: [], + returns: { + type: String, + desc: 'The current network protocol version' + } + } +}; diff --git a/js/src/jsonrpc/interfaces/personal.js b/js/src/jsonrpc/interfaces/personal.js new file mode 100644 index 00000000000..5c76b8c8938 --- /dev/null +++ b/js/src/jsonrpc/interfaces/personal.js @@ -0,0 +1,195 @@ +import { Address, Data, Quantity } from '../types'; + +export default { + accountsInfo: { + desc: 'returns a map of accounts as an object', + params: [], + returns: { + type: Array, + desc: 'Account metadata', + details: { + name: { + type: String, + desc: 'Account name' + }, + meta: { + type: String, + desc: 'Encoded JSON string the defines additional account metadata' + }, + uuid: { + type: String, + desc: 'The account UUID, or null if not available/unknown/not applicable.' + } + } + } + }, + + listAccounts: { + desc: 'Returns a list of addresses owned by client.', + params: [], + returns: { + type: Array, + desc: '20 Bytes addresses owned by the client.' + } + }, + + newAccount: { + desc: 'Creates new account', + params: [ + { + type: String, + desc: 'Password' + } + ], + returns: { + type: Address, + desc: 'The created address' + } + }, + + newAccountFromPhrase: { + desc: 'Creates a new account from a brainwallet passphrase', + params: [ + { + type: String, + desc: 'Phrase' + }, + { + type: String, + desc: 'Password' + } + ], + returns: { + type: Address, + desc: 'The created address' + } + }, + + newAccountFromWallet: { + desc: 'Creates a new account from a JSON import', + params: [ + { + type: String, + desc: 'JSON' + }, + { + type: String, + desc: 'Password' + } + ], + returns: { + type: Address, + desc: 'The created address' + } + }, + + setAccountName: { + desc: 'Sets a name for the account', + params: [ + { + type: Address, + desc: 'Address' + }, + { + type: String, + desc: 'Name' + } + ], + returns: { + type: Object, + desc: 'Returns null in all cases' + } + }, + + setAccountMeta: { + desc: 'Sets metadata for the account', + params: [ + { + type: Address, + desc: 'Address' + }, + { + type: String, + desc: 'Metadata (JSON encoded)' + } + ], + returns: { + type: Object, + desc: 'Returns null in all cases' + } + }, + + signAndSendTransaction: { + desc: 'Sends and signs a transaction given account passphrase. Does not require the account to be unlocked nor unlocks the account for future transactions. ', + params: [ + { + type: Object, + desc: 'The transaction object', + details: { + from: { + type: Address, + desc: '20 Bytes - The address the transaction is send from' + }, + to: { + type: Address, + desc: '20 Bytes - (optional when creating new contract) The address the transaction is directed to' + }, + gas: { + type: Quantity, + desc: 'Integer of the gas provided for the transaction execution. It will return unused gas', + optional: true, + default: 90000 + }, + gasPrice: { + type: Quantity, + desc: 'Integer of the gasPrice used for each paid gas', + optional: true, + default: 'To-Be-Determined' + }, + value: { + type: Quantity, + desc: 'Integer of the value send with this transaction', + optional: true + }, + data: { + type: Data, + desc: 'The compiled code of a contract OR the hash of the invoked method signature and encoded parameters. For details see [Ethereum Contract ABI](https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI)' + }, + nonce: { + type: Quantity, + desc: 'Integer of a nonce. This allows to overwrite your own pending transactions that use the same nonce.', + optional: true + } + } + }, + { + type: String, + desc: 'Passphrase to unlock `from` account.' + } + ], + returns: { + type: Data, + desc: '32 Bytes - the transaction hash, or the zero hash if the transaction is not yet available' + } + }, + + signerEnabled: { + desc: 'Returns whether signer is enabled/disabled.', + params: [], + returns: { + type: Boolean, + desc: 'true when enabled, false when disabled' + } + }, + + unlockAccount: { + desc: '?', + params: [ + '?', '?', '?' + ], + returns: { + type: Boolean, + desc: 'whether the call was successful' + } + } +}; diff --git a/js/src/jsonrpc/interfaces/shh.js b/js/src/jsonrpc/interfaces/shh.js new file mode 100644 index 00000000000..99ce6dee254 --- /dev/null +++ b/js/src/jsonrpc/interfaces/shh.js @@ -0,0 +1,153 @@ +import { Data, Quantity } from '../types'; + +export default { + version: { + desc: 'Returns the current whisper protocol version.', + params: [], + returns: { + type: String, + desc: 'The current whisper protocol version' + } + }, + + post: { + desc: 'Sends a whisper message.', + params: [ + { + type: Object, desc: 'The whisper post object:', format: 'inputPostFormatter', + details: { + from: { + type: Data, desc: '60 Bytes - The identity of the sender', + optional: true + }, + to: { + type: Data, desc: '60 Bytes - The identity of the receiver. When present whisper will encrypt the message so that only the receiver can decrypt it', + optional: true + }, + topics: { + type: Array, desc: 'Array of `DATA` topics, for the receiver to identify messages' + }, + payload: { + type: Data, desc: 'The payload of the message' + }, + priority: { + type: Quantity, desc: 'The integer of the priority in a rang from ... (?)' + }, + ttl: { + type: Quantity, desc: 'Integer of the time to live in seconds.' + } + } + } + ], + returns: { + type: Boolean, + desc: '`true` if the message was send, otherwise `false`' + } + }, + + newIdentity: { + desc: 'Creates new whisper identity in the client.', + params: [], + returns: { + type: Data, + desc: '60 Bytes - the address of the new identiy' + } + }, + + hasIdentity: { + desc: 'Checks if the client hold the private keys for a given identity.', + params: [ + { + type: Data, + desc: '60 Bytes - The identity address to check' + } + ], + returns: { + type: Boolean, + desc: '`true` if the client holds the privatekey for that identity, otherwise `false`' + } + }, + + newGroup: { + desc: '(?)', + params: [], + returns: { + type: Data, desc: '60 Bytes - the address of the new group. (?)' + } + }, + + addToGroup: { + desc: '(?)', + params: [ + { + type: Data, + desc: '60 Bytes - The identity address to add to a group (?)' + } + ], + returns: { + type: Boolean, + desc: '`true` if the identity was successfully added to the group, otherwise `false` (?)' + } + }, + + newFilter: { + desc: 'Creates filter to notify, when client receives whisper message matching the filter options.', + params: [ + { + type: Object, desc: 'The filter options:', + details: { + to: { + type: Data, desc: '60 Bytes - Identity of the receiver. *When present it will try to decrypt any incoming message if the client holds the private key to this identity.*', + optional: true + }, + topics: { + type: Array, desc: 'Array of `DATA` topics which the incoming message\'s topics should match. You can use the following combinations' + } + } + } + ], + returns: { + type: Quantity, + desc: 'The newly created filter' + } + }, + + uninstallFilter: { + desc: 'Uninstalls a filter with given id. Should always be called when watch is no longer needed.\nAdditonally Filters timeout when they aren\'t requested with [shh_getFilterChanges](#shh_getfilterchanges) for a period of time.', + params: [ + { + type: Quantity, + desc: 'The filter id' + } + ], + returns: { + type: Boolean, + desc: '`true` if the filter was successfully uninstalled, otherwise `false`' + } + }, + + getFilterChanges: { + desc: 'Polling method for whisper filters. Returns new messages since the last call of this method.\n**Note** calling the [shh_getMessages](#shh_getmessages) method, will reset the buffer for this method, so that you won\'t receive duplicate messages.', + params: [ + { + type: Quantity, + desc: 'The filter id' + } + ], + returns: { + type: Array, + desc: 'Array of messages received since last poll' + } + }, + + getMessages: { + desc: 'Get all messages matching a filter. Unlike `shh_getFilterChanges` this returns all messages.', + params: [ + { + type: Quantity, + desc: 'The filter id' + } + ], + returns: 'See [shh_getFilterChanges](#shh_getfilterchanges)' + } +}; diff --git a/js/src/jsonrpc/interfaces/trace.js b/js/src/jsonrpc/interfaces/trace.js new file mode 100644 index 00000000000..b603eb95a6b --- /dev/null +++ b/js/src/jsonrpc/interfaces/trace.js @@ -0,0 +1,63 @@ +import { BlockNumber, Hash, Integer } from '../types'; + +export default { + filter: { + desc: 'Returns traces matching given filter', + params: [ + { + type: Object, + desc: 'The filter object' + } + ], + returns: { + type: Array, + desc: 'Traces matching given filter' + } + }, + + get: { + desc: 'Returns trace at given position.', + params: [ + { + type: Hash, + desc: 'Transaction hash' + }, + { + type: Integer, + desc: 'Trace position witing transaction' + } + ], + returns: { + type: Object, + desc: 'Trace object' + } + }, + + transaction: { + desc: 'Returns all traces of given transaction', + params: [ + { + type: Hash, + desc: 'Transaction hash' + } + ], + returns: { + type: Array, + desc: 'Traces of given transaction' + } + }, + + block: { + desc: 'Returns traces created at given block', + params: [ + { + type: BlockNumber, + desc: 'Integer block number, or \'latest\' for the last mined block or \'pending\', \'earliest\' for not yet mined transactions' + } + ], + returns: { + type: Array, + desc: 'Block traces' + } + } +}; diff --git a/js/src/jsonrpc/interfaces/web3.js b/js/src/jsonrpc/interfaces/web3.js new file mode 100644 index 00000000000..07ee6b967f1 --- /dev/null +++ b/js/src/jsonrpc/interfaces/web3.js @@ -0,0 +1,26 @@ +import { Data } from '../types'; + +export default { + clientVersion: { + desc: 'Returns the current client version.', + params: [], + returns: { + type: String, + desc: 'The current client version' + } + }, + + sha3: { + desc: 'Returns Keccak-256 (*not* the standardized SHA3-256) of the given data.', + params: [ + { + type: String, + desc: 'The data to convert into a SHA3 hash' + } + ], + returns: { + type: Data, + desc: 'The SHA3 result of the given string' + } + } +}; diff --git a/js/src/jsonrpc/rollup.config.js b/js/src/jsonrpc/rollup.config.js new file mode 100644 index 00000000000..cc4f8c9314c --- /dev/null +++ b/js/src/jsonrpc/rollup.config.js @@ -0,0 +1,12 @@ +import babel from 'rollup-plugin-babel'; + +export default { + entry: 'src/index.js', + dest: 'release/index.js', + format: 'cjs', + plugins: [babel({ + babelrc: false, + presets: ['es2015-rollup', 'stage-0'], + runtimeHelpers: true + })] +}; diff --git a/js/src/jsonrpc/types.js b/js/src/jsonrpc/types.js new file mode 100644 index 00000000000..8d7223ab000 --- /dev/null +++ b/js/src/jsonrpc/types.js @@ -0,0 +1,11 @@ +export class Address {} + +export class BlockNumber {} + +export class Data {} + +export class Hash {} + +export class Integer {} + +export class Quantity {} diff --git a/js/src/reset.css b/js/src/reset.css new file mode 100644 index 00000000000..23b5cb7ca9c --- /dev/null +++ b/js/src/reset.css @@ -0,0 +1,83 @@ +:root html, :root body { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; + background: rgb(95, 95, 95); + color: rgba(255, 255, 255, 0.75); +} + +:root a, :root a:visited { + text-decoration: none; + cursor: pointer; + color: rgb(0, 151, 167); /* #f80 */ +} + +:root a:hover { + color: rgb(0, 174, 193); +} + +:root .reset { font-size: initial; width: 100%; height: 100%; } +/* shame:on */ +/* Material-ui is changing input properties with inline styles. */ +/* because of that https://github.com/ethcore/eth-node-status-page is overriding all inputs with !important +/* We want to keep it consistent and we use material ui, so we set the default color according to material ui */ +:root .reset input { + margin-top: 0; + color: rgba(0, 0, 0, 0.870588) !important; +} +:root .reset input[disabled] { + color: rgba(0, 0, 0, 0.298039) !important; +} +/* shame:off */ + +// Prefixed version of +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ +:root .reset div, :root .reset span, :root .reset applet, :root .reset object, :root .reset iframe, +:root .reset h1, :root .reset h2, :root .reset h3, :root .reset h4, :root .reset h5, :root .reset h6, :root .reset p, :root .reset blockquote, :root .reset pre, +:root .reset a, :root .reset abbr, :root .reset acronym, :root .reset address, :root .reset big, :root .reset cite, :root .reset code, +:root .reset del, :root .reset dfn, :root .reset em, :root .reset img, :root .reset ins, :root .reset kbd, :root .reset q, :root .reset s, :root .reset samp, +:root .reset small, :root .reset strike, :root .reset strong, :root .reset sub, :root .reset sup, :root .reset tt, :root .reset var, +:root .reset b, :root .reset u, :root .reset i, :root .reset center, +:root .reset dl, :root .reset dt, :root .reset dd, :root .reset ol, :root .reset ul, :root .reset li, +:root .reset fieldset, :root .reset form, :root .reset label, :root .reset legend, +:root .reset table, :root .reset caption, :root .reset tbody, :root .reset tfoot, :root .reset thead, :root .reset tr, :root .reset th, :root .reset td, +:root .reset article, :root .reset aside, :root .reset canvas, :root .reset details, :root .reset embed, +:root .reset figure, :root .reset figcaption, :root .reset footer, :root .reset header, :root .reset hgroup, +:root .reset menu, :root .reset nav, :root .reset output, :root .reset ruby, :root .reset section, :root .reset summary, +:root .reset time, :root .reset mark, :root .reset audio, :root .reset video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +:root .reset article, :root .reset aside, :root .reset details, :root .reset figcaption, :root .reset figure, +:root .reset footer, :root .reset header, :root .reset hgroup, :root .reset menu, :root .reset nav, :root .reset section { + display: block; +} +:root .reset body { + line-height: 1; +} +:root .reset ol, :root .reset ul { + list-style: none; +} +:root .reset blockquote, :root .reset q { + quotes: none; +} +:root .reset blockquote:before, :root .reset blockquote:after, +:root .reset q:before, :root .reset q:after { + content: ''; + content: none; +} +:root .reset table { + border-collapse: collapse; + border-spacing: 0; +} diff --git a/js/src/ui/Account/Actions/actions.js b/js/src/ui/Account/Actions/actions.js new file mode 100644 index 00000000000..0f3cb1c9dd0 --- /dev/null +++ b/js/src/ui/Account/Actions/actions.js @@ -0,0 +1,27 @@ +import React, { Component } from 'react'; + +import { FlatButton } from 'material-ui'; +import { Toolbar, ToolbarGroup } from 'material-ui/Toolbar'; +import ActionAccountBalance from 'material-ui/svg-icons/action/account-balance'; +import ContentSend from 'material-ui/svg-icons/content/send'; + +export default class Actions extends Component { + render () { + return ( + + + } + label='transfer' + primary + onTouchTap={ this.onBtnClose } /> + } + label='fund account' + primary + onTouchTap={ this.onBtnClose } /> + + + ); + } +} diff --git a/js/src/ui/Account/Actions/index.js b/js/src/ui/Account/Actions/index.js new file mode 100644 index 00000000000..8d77c6173ec --- /dev/null +++ b/js/src/ui/Account/Actions/index.js @@ -0,0 +1 @@ +export default from './actions'; diff --git a/js/src/ui/Account/account.js b/js/src/ui/Account/account.js new file mode 100644 index 00000000000..f77741ccd63 --- /dev/null +++ b/js/src/ui/Account/account.js @@ -0,0 +1,91 @@ +import React, { Component, PropTypes } from 'react'; + +import { TextField } from 'material-ui'; +import { Card, CardText } from 'material-ui/Card'; + +import Balances from '../Balances'; +import Form from '../Form'; +import FormWrap from '../FormWrap'; +import IdentityIcon from '../IdentityIcon'; + +import Actions from './actions'; + +export default class Account extends Component { + static contextTypes = { + api: React.PropTypes.object + } + + static propTypes = { + params: PropTypes.object + } + + state = { + name: 'Unnamed' + } + + componentWillMount () { + this.retrieveMeta(); + } + + render () { + const address = this.props.params.address; + + return ( +
+ + + + +
+ + + + + + +
+ +
+
+
+ ); + } + + onEditName = (event) => { + const api = this.context.api; + const name = event.target.value; + + this.setState({ + name: name + }, () => { + api.personal.setAccountName(this.props.params.address, name); + }); + } + + retrieveMeta () { + this.context.api.personal + .accountsInfo() + .then((infos) => { + const info = infos[this.props.params.address]; + this.setState({ + name: info.name, + uuid: info.uuid, + meta: info.meta + }); + }); + } +} diff --git a/js/src/ui/Account/index.js b/js/src/ui/Account/index.js new file mode 100644 index 00000000000..4a50165b949 --- /dev/null +++ b/js/src/ui/Account/index.js @@ -0,0 +1 @@ +export default from './account'; diff --git a/js/src/ui/Accounts/AccountSummary/accountSummary.js b/js/src/ui/Accounts/AccountSummary/accountSummary.js new file mode 100644 index 00000000000..5c0ba18aec8 --- /dev/null +++ b/js/src/ui/Accounts/AccountSummary/accountSummary.js @@ -0,0 +1,42 @@ +import React, { Component, PropTypes } from 'react'; +import { Link } from 'react-router'; + +import { Card, CardText, CardTitle } from 'material-ui/Card'; + +import Balances from '../../Balances'; +import IdentityIcon from '../../IdentityIcon'; + +const TITLE_STYLE = { textTransform: 'uppercase', paddingBottom: 0 }; + +export default class AccountSummary extends Component { + static contextTypes = { + api: React.PropTypes.object + } + + static propTypes = { + account: PropTypes.object.isRequired + } + + state = { + name: 'Unnamed' + } + + render () { + const account = this.props.account; + const viewLink = `/account/${account.address}`; + + return ( + + + { account.name || 'Unnamed' } } /> + + + + + ); + } +} diff --git a/js/src/ui/Accounts/AccountSummary/index.js b/js/src/ui/Accounts/AccountSummary/index.js new file mode 100644 index 00000000000..877faae8b71 --- /dev/null +++ b/js/src/ui/Accounts/AccountSummary/index.js @@ -0,0 +1 @@ +export default from './accountSummary'; diff --git a/js/src/ui/Accounts/Actions/actions.js b/js/src/ui/Accounts/Actions/actions.js new file mode 100644 index 00000000000..6ac941c30df --- /dev/null +++ b/js/src/ui/Accounts/Actions/actions.js @@ -0,0 +1,39 @@ +import React, { Component, PropTypes } from 'react'; + +import { FlatButton } from 'material-ui'; +import { Toolbar, ToolbarGroup } from 'material-ui/Toolbar'; +import ActionAccountBalance from 'material-ui/svg-icons/action/account-balance'; +import ContentAdd from 'material-ui/svg-icons/content/add'; +import ContentSend from 'material-ui/svg-icons/content/send'; + +export default class Actions extends Component { + static propTypes = { + onTransfer: PropTypes.func.isRequired, + onNewAccount: PropTypes.func.isRequired, + onFundAccount: PropTypes.func.isRequired + } + + render () { + return ( + + + } + label='transfer' + primary + onTouchTap={ this.props.onTransfer } /> + } + label='new account' + primary + onTouchTap={ this.props.onNewAccount } /> + } + label='fund account' + primary + onTouchTap={ this.props.onFundAccount } /> + + + ); + } +} diff --git a/js/src/ui/Accounts/Actions/index.js b/js/src/ui/Accounts/Actions/index.js new file mode 100644 index 00000000000..8d77c6173ec --- /dev/null +++ b/js/src/ui/Accounts/Actions/index.js @@ -0,0 +1 @@ +export default from './actions'; diff --git a/js/src/ui/Accounts/accounts.js b/js/src/ui/Accounts/accounts.js new file mode 100644 index 00000000000..06ad2cd88b1 --- /dev/null +++ b/js/src/ui/Accounts/accounts.js @@ -0,0 +1,103 @@ +import React, { Component } from 'react'; + +import AccountSummary from './AccountSummary'; +import Actions from './Actions'; +import NewAccount from '../NewAccount'; + +import styles from './style.css'; + +export default class Accounts extends Component { + static contextTypes = { + api: React.PropTypes.object + } + + state = { + accounts: [], + fundDialog: false, + newDialog: false, + transferDialog: false + } + + componentWillMount () { + this.retrieveAccounts(); + } + + render () { + return ( +
+ + +
+ { this.renderAccounts() } +
+
+ ); + } + + renderAccounts () { + if (!this.state.accounts.length) { + return null; + } + + return this.state.accounts.map((account) => { + return ( +
+ +
+ ); + }); + } + + onFundAccountClick = () => { + this.setState({ fundDialog: !this.state.fundDialog }); + } + + onNewAccountClick = () => { + this.setState({ newDialog: !this.state.newDialog }); + } + + onNewAccountClose = () => { + this.onNewAccountClick(); + } + + onNewAccountUpdate = () => { + this.retrieveAccounts(); + } + + onTransferClick = () => { + this.setState({ transferDialog: !this.state.transferDialog }); + } + + retrieveAccounts () { + const api = this.context.api; + + Promise + .all([ + api.personal.listAccounts(), + api.personal.accountsInfo() + ]) + .then(([addresses, infos]) => { + this.setState({ + accounts: addresses.map((address) => { + const info = infos[address]; + + return { + address: address, + name: info.name, + uuid: info.uuid, + meta: info.meta + }; + }) + }); + }); + } +} diff --git a/js/src/ui/Accounts/index.js b/js/src/ui/Accounts/index.js new file mode 100644 index 00000000000..09e26c97282 --- /dev/null +++ b/js/src/ui/Accounts/index.js @@ -0,0 +1 @@ +export default from './accounts'; diff --git a/js/src/ui/Accounts/style.css b/js/src/ui/Accounts/style.css new file mode 100644 index 00000000000..592697fde09 --- /dev/null +++ b/js/src/ui/Accounts/style.css @@ -0,0 +1,13 @@ +.account { + flex: 0 1 50%; + width: 50%; +} + +.account>div { + height: 100%; +} + +.accounts { + display: flex; + flex-wrap: wrap; +} diff --git a/js/src/ui/Application/Status/index.js b/js/src/ui/Application/Status/index.js new file mode 100644 index 00000000000..60aae301478 --- /dev/null +++ b/js/src/ui/Application/Status/index.js @@ -0,0 +1 @@ +export default from './status'; diff --git a/js/src/ui/Application/Status/status.js b/js/src/ui/Application/Status/status.js new file mode 100644 index 00000000000..70535c9534a --- /dev/null +++ b/js/src/ui/Application/Status/status.js @@ -0,0 +1,52 @@ +import React, { Component } from 'react'; + +import styles from './style.css'; + +export default class Status extends Component { + static contextTypes = { + api: React.PropTypes.object + } + + state = { + clientVersion: '', + peerCount: 0, + blockNumber: 0, + syncing: false + } + + componentWillMount () { + this.poll(); + } + + render () { + return ( +
+
{ this.state.clientVersion }
+
{ this.state.peerCount } peers
+
{ this.state.blockNumber }
+
+ ); + } + + poll () { + const api = this.context.api; + + Promise + .all([ + api.web3.clientVersion(), + api.net.peerCount(), + api.eth.blockNumber(), + api.eth.syncing() + ]) + .then(([clientVersion, peerCount, blockNumber, syncing]) => { + this.setState({ + blockNumber: blockNumber.toFormat(0), + clientVersion: clientVersion, + peerCount: peerCount.toString(), + syncing: syncing + }); + }); + + setTimeout(() => this.poll(), 2500); + } +} diff --git a/js/src/ui/Application/Status/style.css b/js/src/ui/Application/Status/style.css new file mode 100644 index 00000000000..c6d3f7895ef --- /dev/null +++ b/js/src/ui/Application/Status/style.css @@ -0,0 +1,5 @@ +.status { + clear: both; + padding: 1em; + margin: 1em 0; +} diff --git a/js/src/ui/Application/TabBar/index.js b/js/src/ui/Application/TabBar/index.js new file mode 100644 index 00000000000..1a0535838e8 --- /dev/null +++ b/js/src/ui/Application/TabBar/index.js @@ -0,0 +1 @@ +export default from './tabBar'; diff --git a/js/src/ui/Application/TabBar/tabBar.js b/js/src/ui/Application/TabBar/tabBar.js new file mode 100644 index 00000000000..e7632156f3d --- /dev/null +++ b/js/src/ui/Application/TabBar/tabBar.js @@ -0,0 +1,39 @@ +import React, { Component, PropTypes } from 'react'; + +import { Tabs, Tab } from 'material-ui/Tabs'; + +import ActionAccountBalanceWallet from 'material-ui/svg-icons/action/account-balance-wallet'; +import ActionDashboard from 'material-ui/svg-icons/action/dashboard'; +import NavigationApps from 'material-ui/svg-icons/navigation/apps'; + +export default class TabBar extends Component { + static contextTypes = { + router: PropTypes.object + } + + render () { + return ( + + } + label='accounts' + onActive={ this.onActivate } /> + } + label='tokens' + onActive={ this.onActivate } /> + } + label='apps' + onActive={ this.onActivate } /> + + ); + } + + onActivate = (tab) => { + this.context.router.push(tab.props['data-route']); + } +} diff --git a/js/src/ui/Application/application.js b/js/src/ui/Application/application.js new file mode 100644 index 00000000000..bf98b701b17 --- /dev/null +++ b/js/src/ui/Application/application.js @@ -0,0 +1,82 @@ +import React, { Component, PropTypes } from 'react'; + +import getMuiTheme from 'material-ui/styles/getMuiTheme'; +import darkBaseTheme from 'material-ui/styles/baseThemes/darkBaseTheme'; +import lightBaseTheme from 'material-ui/styles/baseThemes/lightBaseTheme'; + +import Api from '../../api'; + +import FirstRun from '../FirstRun'; +import Status from './Status'; +import TabBar from './TabBar'; + +import styles from './style.css'; + +const lightTheme = getMuiTheme(lightBaseTheme); +const muiTheme = getMuiTheme(darkBaseTheme); +const api = new Api(new Api.Transport.Http('/rpc/')); + +muiTheme.stepper.textColor = '#eee'; +muiTheme.stepper.disabledTextColor = '#777'; +muiTheme.inkBar.backgroundColor = 'rgb(0, 151, 167)'; +muiTheme.tabs = lightTheme.tabs; +muiTheme.tabs.backgroundColor = 'rgb(65, 65, 65)'; +muiTheme.toolbar = lightTheme.toolbar; +muiTheme.toolbar.backgroundColor = 'rgb(80, 80, 80)'; + +export default class Application extends Component { + static childContextTypes = { + api: PropTypes.object, + muiTheme: PropTypes.object + } + + static propTypes = { + children: PropTypes.node + } + + state = { + showFirst: false, + accounts: [] + } + + componentWillMount () { + this.retrieveAccounts(); + } + + render () { + return ( +
+ + + { this.props.children } + +
+ ); + } + + getChildContext () { + return { + api: api, + muiTheme: muiTheme + }; + } + + retrieveAccounts () { + api.personal + .listAccounts() + .then((accounts) => { + this.setState({ + accounts: accounts, + showFirst: accounts.length === 0 + }); + }); + } + + onCloseFirst = () => { + this.setState({ + showFirst: false + }); + } +} diff --git a/js/src/ui/Application/index.js b/js/src/ui/Application/index.js new file mode 100644 index 00000000000..e586e404a90 --- /dev/null +++ b/js/src/ui/Application/index.js @@ -0,0 +1 @@ +export default from './application'; diff --git a/js/src/ui/Application/style.css b/js/src/ui/Application/style.css new file mode 100644 index 00000000000..cbe226cbcd5 --- /dev/null +++ b/js/src/ui/Application/style.css @@ -0,0 +1,4 @@ +.container { + width: 100%; + height: 100%; +} diff --git a/js/src/ui/Apps/apps.js b/js/src/ui/Apps/apps.js new file mode 100644 index 00000000000..934794ac736 --- /dev/null +++ b/js/src/ui/Apps/apps.js @@ -0,0 +1,9 @@ +import React, { Component } from 'react'; + +export default class Apps extends Component { + render () { + return ( +

managing contracts (adding, calling, etc) should go in here, next steps...

+ ); + } +} diff --git a/js/src/ui/Apps/index.js b/js/src/ui/Apps/index.js new file mode 100644 index 00000000000..0ce6d33a9c5 --- /dev/null +++ b/js/src/ui/Apps/index.js @@ -0,0 +1 @@ +export default from './apps'; diff --git a/js/src/ui/Balances/balances.js b/js/src/ui/Balances/balances.js new file mode 100644 index 00000000000..f619dafba7f --- /dev/null +++ b/js/src/ui/Balances/balances.js @@ -0,0 +1,67 @@ +import React, { Component, PropTypes } from 'react'; + +import Api from '../../api'; + +import styles from './style.css'; + +export default class Balances extends Component { + static contextTypes = { + api: React.PropTypes.object + } + + static propTypes = { + address: PropTypes.string.isRequired + } + + state = { + balances: [] + } + + componentWillMount () { + this.getBalances(); + } + + render () { + const balances = this.state.balances + .filter((balance) => balance.value.gt(0)) + .map((balance) => { + return ( +
+ { +
+ { balance.value.toFormat(8) } { balance.token } +
+
+ ); + }); + + return ( +
{ balances }
+ ); + } + + getBalances () { + const api = this.context.api; + + Promise + .all([ + api.eth.getBalance(this.props.address) + ]) + .then(([balance]) => { + this.setState({ + balances: [ + { + token: 'ΞTH', + value: Api.format.fromWei(balance), + img: 'images/ethereum-32x32.png', + type: 'Ethereum' + } + ] + }); + }); + } +} diff --git a/js/src/ui/Balances/index.js b/js/src/ui/Balances/index.js new file mode 100644 index 00000000000..434a9315efb --- /dev/null +++ b/js/src/ui/Balances/index.js @@ -0,0 +1 @@ +export default from './balances'; diff --git a/js/src/ui/Balances/style.css b/js/src/ui/Balances/style.css new file mode 100644 index 00000000000..8a3d34e50e1 --- /dev/null +++ b/js/src/ui/Balances/style.css @@ -0,0 +1,16 @@ +.balance { + height: 32px; +} + +.balance img { + margin-right: 0.5em; + height: 32px; + width: 32px; +} + +.balance div { + height: 32px; + line-height: 32px; + display: inline-block; + vertical-align: top; +} diff --git a/js/src/ui/FirstRun/Completed/completed.js b/js/src/ui/FirstRun/Completed/completed.js new file mode 100644 index 00000000000..c3264fc0d9f --- /dev/null +++ b/js/src/ui/FirstRun/Completed/completed.js @@ -0,0 +1,19 @@ +import React, { Component, PropTypes } from 'react'; + +export default class Completed extends Component { + static propTypes = { + visible: PropTypes.bool.isRequired + } + + render () { + if (!this.props.visible) { + return null; + } + + return ( +
+

Your node setup has been completed successfully.

+
+ ); + } +} diff --git a/js/src/ui/FirstRun/Completed/index.js b/js/src/ui/FirstRun/Completed/index.js new file mode 100644 index 00000000000..2fafaadb31d --- /dev/null +++ b/js/src/ui/FirstRun/Completed/index.js @@ -0,0 +1 @@ +export default from './completed'; diff --git a/js/src/ui/FirstRun/CreateAccount/createAccount.js b/js/src/ui/FirstRun/CreateAccount/createAccount.js new file mode 100644 index 00000000000..34cf714b02f --- /dev/null +++ b/js/src/ui/FirstRun/CreateAccount/createAccount.js @@ -0,0 +1,80 @@ +import React, { Component, PropTypes } from 'react'; + +import { TextField } from 'material-ui'; + +import Form from '../../Form'; +import FormWrap from '../../FormWrap'; + +export default class CreateAccount extends Component { + static contextTypes = { + api: PropTypes.object.isRequired + } + + static propTypes = { + visible: PropTypes.bool.isRequired + } + + state = { + accountName: '', + password1: '', + password2: '' + } + + render () { + if (!this.props.visible) { + return null; + } + + return ( +
+ + + + + + + + + +
+ ); + } + + onEditAccountName = (event) => { + this.setState({ + accountName: event.target.value + }); + } + + onEditPassword1 = (event) => { + this.setState({ + password1: event.target.value + }); + } + + onEditPassword2 = (event) => { + this.setState({ + password2: event.target.value + }); + } +} diff --git a/js/src/ui/FirstRun/CreateAccount/index.js b/js/src/ui/FirstRun/CreateAccount/index.js new file mode 100644 index 00000000000..b4e993ef4c9 --- /dev/null +++ b/js/src/ui/FirstRun/CreateAccount/index.js @@ -0,0 +1 @@ +export default from './createAccount'; diff --git a/js/src/ui/FirstRun/RecoverAccount/index.js b/js/src/ui/FirstRun/RecoverAccount/index.js new file mode 100644 index 00000000000..eb586d4b6d6 --- /dev/null +++ b/js/src/ui/FirstRun/RecoverAccount/index.js @@ -0,0 +1 @@ +export default from './RecoverAccount'; diff --git a/js/src/ui/FirstRun/RecoverAccount/recoverAccount.js b/js/src/ui/FirstRun/RecoverAccount/recoverAccount.js new file mode 100644 index 00000000000..f72fbb17395 --- /dev/null +++ b/js/src/ui/FirstRun/RecoverAccount/recoverAccount.js @@ -0,0 +1,58 @@ +import React, { Component, PropTypes } from 'react'; + +import { TextField } from 'material-ui'; + +import Form from '../../Form'; +import FormWrap from '../../FormWrap'; +import IdentityIcon from '../../IdentityIcon'; + +export default class RecoverAccount extends Component { + static propTypes = { + accountAddress: PropTypes.string, + accountName: PropTypes.string, + accountPhrase: PropTypes.string, + visible: PropTypes.bool.isRequired + } + + render () { + if (!this.props.visible) { + return null; + } + + return ( +
+ + + + + + + + + + + + ); + } +} diff --git a/js/src/ui/FirstRun/Welcome/index.js b/js/src/ui/FirstRun/Welcome/index.js new file mode 100644 index 00000000000..f4ce986b6a6 --- /dev/null +++ b/js/src/ui/FirstRun/Welcome/index.js @@ -0,0 +1 @@ +export default from './welcome'; diff --git a/js/src/ui/FirstRun/Welcome/welcome.js b/js/src/ui/FirstRun/Welcome/welcome.js new file mode 100644 index 00000000000..b5e9395e62b --- /dev/null +++ b/js/src/ui/FirstRun/Welcome/welcome.js @@ -0,0 +1,31 @@ +import React, { Component, PropTypes } from 'react'; + +const LOGO_STYLE = { + float: 'right', + width: '25%', + height: 'auto' +}; + +export default class FirstRun extends Component { + static propTypes = { + visible: PropTypes.bool.isRequired + } + + render () { + if (!this.props.visible) { + return null; + } + + return ( +
+ Ethcore Ltd. +

Welcome to Parity, the fastest and simplest way to run your node.

+

The next few steps will guide you through the process of setting up you Parity instance and the associated account.

+

Click Next to continue your journey.

+
+ ); + } +} diff --git a/js/src/ui/FirstRun/firstRun.js b/js/src/ui/FirstRun/firstRun.js new file mode 100644 index 00000000000..35f0e06ec38 --- /dev/null +++ b/js/src/ui/FirstRun/firstRun.js @@ -0,0 +1,90 @@ +import React, { Component, PropTypes } from 'react'; + +import { FlatButton } from 'material-ui'; +import ActionDone from 'material-ui/svg-icons/action/done'; +import ActionDoneAll from 'material-ui/svg-icons/action/done-all'; +import NavigationArrowForward from 'material-ui/svg-icons/navigation/arrow-forward'; + +import Overlay from '../Overlay'; + +import Completed from './Completed'; +import CreateAccount from './CreateAccount'; +import RecoverAccount from './RecoverAccount'; +import Welcome from './Welcome'; + +const STAGE_NAMES = ['welcome', 'new account', 'recovery', 'completed']; + +export default class FirstRun extends Component { + static propTypes = { + visible: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired + } + + state = { + stage: 0 + } + + render () { + return ( + + + + + + + ); + } + + renderDialogActions () { + switch (this.state.stage) { + case 0: + case 2: + return ( + } + label='Next' + primary + onTouchTap={ this.onBtnNext } /> + ); + case 1: + return ( + } + label='Create' + primary + onTouchTap={ this.onBtnNext } /> + ); + case 3: + return ( + } + label='Close' + primary + onTouchTap={ this.onBtnClose } /> + ); + } + } + + onBtnClose = () => { + this.setState({ + stage: 0 + }, this.props.onClose); + } + + onBtnNext = () => { + this.setState({ + stage: this.state.stage + 1 + }); + } +} diff --git a/js/src/ui/FirstRun/index.js b/js/src/ui/FirstRun/index.js new file mode 100644 index 00000000000..55155199c06 --- /dev/null +++ b/js/src/ui/FirstRun/index.js @@ -0,0 +1 @@ +export default from './firstRun'; diff --git a/js/src/ui/Form/form.js b/js/src/ui/Form/form.js new file mode 100644 index 00000000000..13a6cb5f643 --- /dev/null +++ b/js/src/ui/Form/form.js @@ -0,0 +1,24 @@ +import React, { Component, PropTypes } from 'react'; + +import styles from './style.css'; + +export default class Form extends Component { + static propTypes = { + children: PropTypes.array + } + + render () { + // HACK: hidden inputs to disable Chrome's autocomplete + return ( +
+
+ + +
+ { this.props.children } +
+ ); + } +} diff --git a/js/src/ui/Form/index.js b/js/src/ui/Form/index.js new file mode 100644 index 00000000000..6685500c652 --- /dev/null +++ b/js/src/ui/Form/index.js @@ -0,0 +1 @@ +export default from './form'; diff --git a/js/src/ui/Form/style.css b/js/src/ui/Form/style.css new file mode 100644 index 00000000000..616080263e1 --- /dev/null +++ b/js/src/ui/Form/style.css @@ -0,0 +1,15 @@ +.form { +} + +.autofill { + height: 0; + width: '1px'; + position: 'absolute'; + left: 0; + top: 0; +} + +:root .form input:-webkit-autofill { + display: none; + opacity: 0; +} diff --git a/js/src/ui/FormWrap/formWrap.js b/js/src/ui/FormWrap/formWrap.js new file mode 100644 index 00000000000..86f3fd0b7dd --- /dev/null +++ b/js/src/ui/FormWrap/formWrap.js @@ -0,0 +1,17 @@ +import React, { Component, PropTypes } from 'react'; + +import styles from './style.css'; + +export default class FormWrap extends Component { + static propTypes = { + children: PropTypes.object + } + + render () { + return ( +
+ { this.props.children } +
+ ); + } +} diff --git a/js/src/ui/FormWrap/index.js b/js/src/ui/FormWrap/index.js new file mode 100644 index 00000000000..b957d641708 --- /dev/null +++ b/js/src/ui/FormWrap/index.js @@ -0,0 +1 @@ +export default from './formWrap'; diff --git a/js/src/ui/FormWrap/style.css b/js/src/ui/FormWrap/style.css new file mode 100644 index 00000000000..4b6fde119aa --- /dev/null +++ b/js/src/ui/FormWrap/style.css @@ -0,0 +1,7 @@ +.stretch { + width: 75%; +} + +.stretch input { + width: 100%; +} diff --git a/js/src/ui/IdentityIcon/identityIcon.js b/js/src/ui/IdentityIcon/identityIcon.js new file mode 100644 index 00000000000..a598886de26 --- /dev/null +++ b/js/src/ui/IdentityIcon/identityIcon.js @@ -0,0 +1,41 @@ +import React, { Component, PropTypes } from 'react'; +import blockies from 'blockies'; + +import styles from './style.css'; + +export default class IdentityIcon extends Component { + static propTypes = { + address: PropTypes.string, + center: PropTypes.bool + } + + state = { + iconsrc: '' + } + + componentDidMount () { + this.updateIcon(this.props.address); + } + + updateIcon (address) { + this.setState({ + iconsrc: blockies({ + seed: address, + size: 8, + scale: 8 + }).toDataURL() + }); + } + + render () { + const className = `${styles.icon} ${this.props.center ? styles.center : styles.right}`; + + return ( +
+ +
+ ); + } +} diff --git a/js/src/ui/IdentityIcon/index.js b/js/src/ui/IdentityIcon/index.js new file mode 100644 index 00000000000..51b592d3146 --- /dev/null +++ b/js/src/ui/IdentityIcon/index.js @@ -0,0 +1 @@ +export default from './identityIcon'; diff --git a/js/src/ui/IdentityIcon/style.css b/js/src/ui/IdentityIcon/style.css new file mode 100644 index 00000000000..48d035cf41d --- /dev/null +++ b/js/src/ui/IdentityIcon/style.css @@ -0,0 +1,16 @@ +.icon { +} + +.center { + text-align: center; +} + +.right { + float: right; + text-align: right; + margin: 1em 1em 0 0; +} + +.icon img { + border-radius: 50%; +} diff --git a/js/src/ui/NewAccount/AccountDetails/accountDetails.js b/js/src/ui/NewAccount/AccountDetails/accountDetails.js new file mode 100644 index 00000000000..f742709ca99 --- /dev/null +++ b/js/src/ui/NewAccount/AccountDetails/accountDetails.js @@ -0,0 +1,73 @@ +import React, { Component, PropTypes } from 'react'; + +import { TextField } from 'material-ui'; + +import Form from '../../Form'; +import FormWrap from '../../FormWrap'; +import IdentityIcon from '../../IdentityIcon'; + +import styles from '../style.css'; + +export default class RecoverAccount extends Component { + static propTypes = { + address: PropTypes.string, + name: PropTypes.string, + phrase: PropTypes.string + } + + render () { + let info = 'The details for your newly created account is displayed below. '; + if (this.props.phrase) { + info += 'Take note of your recovery phrase and store it in a secure location, without it you cannot recover your account should you lose your password.'; + } + + return ( +
+ +
+ { info } +
+ + + + + + + { this.renderPhrase() } + + ); + } + + renderPhrase () { + if (!this.props.phrase) { + return null; + } + + return ( + + + + ); + } +} diff --git a/js/src/ui/NewAccount/AccountDetails/index.js b/js/src/ui/NewAccount/AccountDetails/index.js new file mode 100644 index 00000000000..d9e88fccdbb --- /dev/null +++ b/js/src/ui/NewAccount/AccountDetails/index.js @@ -0,0 +1 @@ +export default from './accountDetails'; diff --git a/js/src/ui/NewAccount/CreateAccount/createAccount.js b/js/src/ui/NewAccount/CreateAccount/createAccount.js new file mode 100644 index 00000000000..314507e19fc --- /dev/null +++ b/js/src/ui/NewAccount/CreateAccount/createAccount.js @@ -0,0 +1,212 @@ +import React, { Component, PropTypes } from 'react'; + +import { TextField } from 'material-ui'; +import { RadioButton, RadioButtonGroup } from 'material-ui/RadioButton'; + +import Form from '../../Form'; +import IdentityIcon from '../../IdentityIcon'; + +import styles from '../style.css'; + +export default class CreateAccount extends Component { + static contextTypes = { + api: PropTypes.object.isRequired + } + + static propTypes = { + onChange: PropTypes.func.isRequired + } + + state = { + accountName: '', + password1: '', + password2: '', + accounts: null, + selectedAddress: '', + isValidPass: false, + isValidName: false + } + + componentWillMount () { + this.createIdentities(); + this.props.onChange(false, {}); + } + + render () { + return ( +
+
+ Provide a descriptive name for the account, a strong password and select your preferred identity icon to create the account +
+ +
+
+ +
+
+ +
+
+ { this.renderIdentitySelector() } + { this.renderIdentities() } + + ); + } + + renderIdentitySelector () { + if (!this.state.accounts) { + return null; + } + + const buttons = Object.keys(this.state.accounts).map((address) => { + return ( + + ); + }); + + return ( + + { buttons } + + ); + } + + renderIdentities () { + if (!this.state.accounts) { + return null; + } + + const identities = Object.keys(this.state.accounts).map((address) => { + return ( +
+ +
+ ); + }); + + return ( +
+ { identities } +
+ ); + } + + createIdentities () { + const api = this.context.api; + + Promise + .all([ + api.ethcore.generateSecretPhrase(), + api.ethcore.generateSecretPhrase(), + api.ethcore.generateSecretPhrase(), + api.ethcore.generateSecretPhrase(), + api.ethcore.generateSecretPhrase() + ]) + .then((phrases) => { + return Promise + .all(phrases.map((phrase) => api.ethcore.phraseToAddress(phrase))) + .then((addresses) => { + const accounts = {}; + + phrases.forEach((phrase, idx) => { + accounts[addresses[idx]] = { + address: addresses[idx], + phrase: phrase + }; + }); + + console.log(accounts); + + this.setState({ + selectedAddress: addresses[0], + accounts: accounts + }); + }); + }); + } + + passChanges = () => { + this.props.onChange(this.state.isValidName && this.state.isValidPass, { + address: this.state.selectedAddress, + name: this.state.accountName, + password: this.state.password1, + phrase: this.state.accounts[this.state.selectedAddress].phrase + }); + } + + onChangeIdentity = (event) => { + const address = event.target.value || event.target.getAttribute('value'); + + if (!address) { + return; + } + + this.setState({ + selectedAddress: address + }, this.passChanges); + } + + onEditAccountName = (event) => { + const value = event.target.value; + const valid = value.length >= 2; + + this.setState({ + accountName: value, + isValidName: valid + }, this.passChanges); + } + + onEditPassword1 = (event) => { + const value = event.target.value; + const valid = value.length >= 8 && this.state.password2 === value; + + this.setState({ + password1: value, + isValidPass: valid + }, this.passChanges); + } + + onEditPassword2 = (event) => { + const value = event.target.value; + const valid = value.length >= 8 && this.state.password1 === value; + + this.setState({ + password2: value, + isValidPass: valid + }, this.passChanges); + } +} diff --git a/js/src/ui/NewAccount/CreateAccount/index.js b/js/src/ui/NewAccount/CreateAccount/index.js new file mode 100644 index 00000000000..b4e993ef4c9 --- /dev/null +++ b/js/src/ui/NewAccount/CreateAccount/index.js @@ -0,0 +1 @@ +export default from './createAccount'; diff --git a/js/src/ui/NewAccount/CreationType/creationType.js b/js/src/ui/NewAccount/CreationType/creationType.js new file mode 100644 index 00000000000..ea7fca859cf --- /dev/null +++ b/js/src/ui/NewAccount/CreationType/creationType.js @@ -0,0 +1,43 @@ +import React, { Component, PropTypes } from 'react'; + +import { RadioButton, RadioButtonGroup } from 'material-ui/RadioButton'; + +import styles from '../style.css'; + +export default class CreationType extends Component { + static propTypes = { + onChange: PropTypes.func.isRequired + } + + componentWillMount () { + this.props.onChange('fromNew'); + } + + render () { + return ( +
+
+ You can create an account either with a password or though an import from a pre-existing resource or export from another system +
+ + + + + +
+ ); + } + + onChange = (event) => { + this.props.onChange(event.target.value); + } +} diff --git a/js/src/ui/NewAccount/CreationType/index.js b/js/src/ui/NewAccount/CreationType/index.js new file mode 100644 index 00000000000..b22783fe8eb --- /dev/null +++ b/js/src/ui/NewAccount/CreationType/index.js @@ -0,0 +1 @@ +export default from './creationType'; diff --git a/js/src/ui/NewAccount/ImportWallet/importWallet.js b/js/src/ui/NewAccount/ImportWallet/importWallet.js new file mode 100644 index 00000000000..11cce6d35ce --- /dev/null +++ b/js/src/ui/NewAccount/ImportWallet/importWallet.js @@ -0,0 +1,137 @@ +import React, { Component, PropTypes } from 'react'; +import ReactDOM from 'react-dom'; + +import { FlatButton, TextField } from 'material-ui'; +import CommunicationImportExport from 'material-ui/svg-icons/communication/import-export'; + +import Form from '../../Form'; + +import styles from '../style.css'; + +export default class ImportWallet extends Component { + static contextTypes = { + api: PropTypes.object.isRequired + } + + static propTypes = { + onChange: PropTypes.func.isRequired + } + + state = { + accountName: '', + password: '', + walletFile: '', + walletJson: '', + isValidPass: false, + isValidName: false, + isValidFile: false + } + + componentWillMount () { + this.props.onChange(false, {}); + } + + render () { + return ( +
+
+ Provide a descriptive name for the account, the password required to unlock the account and the on-disk location of the wallet to be imported. +
+ +
+
+ +
+
+ +
+ } + label='Select file' + primary + onClick={ this.openFileDialog } /> + +
+ + ); + } + + onFileChange = (event) => { + const el = event.target; + + if (el.files.length) { + const reader = new FileReader(); + reader.onload = (event) => { + this.setState({ + walletJson: event.target.result, + isValidFile: true + }, this.passChanges); + }; + reader.readAsText(el.files[0]); + } + + this.setState({ + walletFile: el.value, + isValidFile: false + }, this.passChanges); + } + + openFileDialog = () => { + ReactDOM.findDOMNode(this.refs.fileUpload).click(); + } + + passChanges = () => { + const valid = this.state.isValidName && this.state.isValidPass && this.state.isValidFile; + + this.props.onChange(valid, { + name: this.state.accountName, + password: this.state.password, + phrase: null, + json: this.state.walletJson + }); + } + + onEditAccountName = (event) => { + const value = event.target.value; + const valid = value.length >= 2; + + this.setState({ + accountName: value, + isValidName: valid + }, this.passChanges); + } + + onEditPassword = (event) => { + const value = event.target.value; + const valid = value.length >= 8; + + this.setState({ + password: value, + isValidPass: valid + }, this.passChanges); + } +} diff --git a/js/src/ui/NewAccount/ImportWallet/index.js b/js/src/ui/NewAccount/ImportWallet/index.js new file mode 100644 index 00000000000..1685c2f0565 --- /dev/null +++ b/js/src/ui/NewAccount/ImportWallet/index.js @@ -0,0 +1 @@ +export default from './importWallet'; diff --git a/js/src/ui/NewAccount/index.js b/js/src/ui/NewAccount/index.js new file mode 100644 index 00000000000..c3fbef08be4 --- /dev/null +++ b/js/src/ui/NewAccount/index.js @@ -0,0 +1 @@ +export default from './newAccount'; diff --git a/js/src/ui/NewAccount/newAccount.js b/js/src/ui/NewAccount/newAccount.js new file mode 100644 index 00000000000..861469eeb1f --- /dev/null +++ b/js/src/ui/NewAccount/newAccount.js @@ -0,0 +1,186 @@ +import React, { Component, PropTypes } from 'react'; + +import { FlatButton } from 'material-ui'; +import ActionDone from 'material-ui/svg-icons/action/done'; +import ActionDoneAll from 'material-ui/svg-icons/action/done-all'; +import NavigationArrowBack from 'material-ui/svg-icons/navigation/arrow-back'; +import NavigationArrowForward from 'material-ui/svg-icons/navigation/arrow-forward'; + +import Overlay from '../Overlay'; + +import AccountDetails from './AccountDetails'; +import CreationType from './CreationType'; +import CreateAccount from './CreateAccount'; +import ImportWallet from './ImportWallet'; + +const STAGE_NAMES = ['creation type', 'create account', 'account information']; +const STAGE_IMPORT = ['creation type', 'import wallet', 'account information']; + +export default class NewAccount extends Component { + static contextTypes = { + api: PropTypes.object.isRequired + } + + static propTypes = { + onClose: PropTypes.func, + onUpdate: PropTypes.func, + visible: PropTypes.bool.isRequired + } + + state = { + address: null, + name: null, + password: null, + phrase: null, + json: null, + canCreate: false, + createType: null, + stage: 0 + } + + render () { + return ( + + { this.renderPage() } + + ); + } + + renderPage () { + switch (this.state.stage) { + case 0: + return ( + + ); + + case 1: + if (this.state.createType === 'fromNew') { + return ( + + ); + } else { + return ( + + ); + } + + case 2: + return ( + + ); + } + } + + renderDialogActions () { + switch (this.state.stage) { + case 0: + return ( + } + label='Next' + primary + onTouchTap={ this.onNext } /> + ); + case 1: + return [ + } + label='Back' + primary + onTouchTap={ this.onPrev } />, + } + label='Create' + disabled={ !this.state.canCreate } + primary + onTouchTap={ this.onCreate } /> + ]; + case 2: + return ( + } + label='Close' + primary + onTouchTap={ this.onClose } /> + ); + } + } + + onNext = () => { + this.setState({ + stage: this.state.stage + 1 + }); + } + + onPrev = () => { + this.setState({ + stage: this.state.stage - 1 + }); + } + + onCreate = () => { + const api = this.context.api; + + if (this.state.createType === 'fromNew') { + return api.personal + .newAccountFromPhrase(this.state.phrase, this.state.password) + .then((address) => api.personal.setAccountName(address, this.state.name)) + .then(() => { + this.onNext(); + this.props.onUpdate && this.props.onUpdate(); + }); + } + + return api.personal + .newAccountFromWallet(this.state.json, this.state.password) + .then((address) => api.personal.setAccountName(address, this.state.name)) + .then(() => { + this.onNext(); + this.props.onUpdate && this.props.onUpdate(); + }); + } + + onClose = () => { + this.setState({ + stage: 0, + canCreate: false + }, () => { + this.props.onClose && this.props.onClose(); + }); + } + + onChangeType = (value) => { + this.setState({ + createType: value + }); + } + + onChangeDetails = (valid, { name, address, password, phrase }) => { + this.setState({ + canCreate: valid, + name: name, + address: address, + password: password, + phrase: phrase + }); + } + + onChangeWallet = (valid, { name, password, json }) => { + this.setState({ + canCreate: valid, + name: name, + password: password, + json: json + }); + } +} diff --git a/js/src/ui/NewAccount/style.css b/js/src/ui/NewAccount/style.css new file mode 100644 index 00000000000..83c7eb81e86 --- /dev/null +++ b/js/src/ui/NewAccount/style.css @@ -0,0 +1,33 @@ +.info { + padding-bottom: 1em; + width: 75%; +} + +.password { + flex: 0 1 50%; + width: 50%; +} + +.passwords { + display: flex; + flex-wrap: wrap; +} + +.identities, .selector { + display: flex; +} + +.selector { + margin-top: 1.5em; +} + +.identities .identity, .selector .button { + flex: 0 1 20%; + width: 20% !important; + text-align: center; + cursor: pointer; +} + +.upload { + text-align: right; +} diff --git a/js/src/ui/Overlay/OverlaySteps/index.js b/js/src/ui/Overlay/OverlaySteps/index.js new file mode 100644 index 00000000000..b07a3696063 --- /dev/null +++ b/js/src/ui/Overlay/OverlaySteps/index.js @@ -0,0 +1 @@ +export default from './overlaySteps'; diff --git a/js/src/ui/Overlay/OverlaySteps/overlaySteps.js b/js/src/ui/Overlay/OverlaySteps/overlaySteps.js new file mode 100644 index 00000000000..527191bd1b2 --- /dev/null +++ b/js/src/ui/Overlay/OverlaySteps/overlaySteps.js @@ -0,0 +1,38 @@ +import React, { Component, PropTypes } from 'react'; + +import { Step, Stepper, StepLabel } from 'material-ui/Stepper'; + +import styles from './style.css'; + +export default class OverlaySteps extends Component { + static propTypes = { + current: PropTypes.number, + steps: PropTypes.array.isRequired + } + + render () { + const steps = this.props.steps.map((label) => { + return ( + + + { label } + + + ); + }); + + return ( +
+

+ { this.props.steps[this.props.current] } +

+ + { steps } + +
+ ); + } +} diff --git a/js/src/ui/Overlay/OverlaySteps/style.css b/js/src/ui/Overlay/OverlaySteps/style.css new file mode 100644 index 00000000000..220db7eb7d8 --- /dev/null +++ b/js/src/ui/Overlay/OverlaySteps/style.css @@ -0,0 +1,9 @@ +.title { + padding: 1em; +} + +.title h3 { + margin: 0; + text-transform: uppercase; + font-weight: 100; +} diff --git a/js/src/ui/Overlay/index.js b/js/src/ui/Overlay/index.js new file mode 100644 index 00000000000..97520354371 --- /dev/null +++ b/js/src/ui/Overlay/index.js @@ -0,0 +1 @@ +export default from './overlay'; diff --git a/js/src/ui/Overlay/overlay.js b/js/src/ui/Overlay/overlay.js new file mode 100644 index 00000000000..1ec425c2980 --- /dev/null +++ b/js/src/ui/Overlay/overlay.js @@ -0,0 +1,45 @@ +import React, { Component, PropTypes } from 'react'; + +import { Dialog } from 'material-ui'; + +import OverlaySteps from './OverlaySteps'; + +const TITLE_STYLE = { borderStyle: 'none' }; +const DIALOG_STYLE = { paddingTop: '1px' }; +const CONTENT_STYLE = { transform: 'translate(0px, 0px)' }; + +export default class Overlay extends Component { + static propTypes = { + actions: PropTypes.node, + children: PropTypes.node, + current: PropTypes.number, + steps: PropTypes.array, + title: React.PropTypes.oneOfType([ + PropTypes.node, PropTypes.string + ]), + visible: PropTypes.bool.isRequired + } + + render () { + const title = this.props.steps + ? () + : this.props.title; + + return ( + + { this.props.children } + + ); + } +} diff --git a/js/src/ui/Tokens/index.js b/js/src/ui/Tokens/index.js new file mode 100644 index 00000000000..1d942fa7430 --- /dev/null +++ b/js/src/ui/Tokens/index.js @@ -0,0 +1 @@ +export default from './tokens'; diff --git a/js/src/ui/Tokens/tokens.js b/js/src/ui/Tokens/tokens.js new file mode 100644 index 00000000000..a81e737dfdb --- /dev/null +++ b/js/src/ui/Tokens/tokens.js @@ -0,0 +1,9 @@ +import React, { Component } from 'react'; + +export default class Tokens extends Component { + render () { + return ( +

the token dapp interface should go in here, next steps...

+ ); + } +} diff --git a/js/test/babel.js b/js/test/babel.js new file mode 100644 index 00000000000..04cabb53f4c --- /dev/null +++ b/js/test/babel.js @@ -0,0 +1 @@ +require('babel-register')(); diff --git a/js/test/e2e/ethapi.js b/js/test/e2e/ethapi.js new file mode 100644 index 00000000000..17f7b50a590 --- /dev/null +++ b/js/test/e2e/ethapi.js @@ -0,0 +1,17 @@ +import EthApi from '../../src/api/ethApi'; + +function createApi (transport) { + if (process.env.DEBUG) { + transport.setDebug(true); + } + + return new EthApi(transport); +} + +export function createHttpApi () { + return createApi(new EthApi.Transport.Http('http://localhost:8545')); +} + +export function createWsApi () { + return createApi(new EthApi.Transport.Ws('ws://localhost:8546')); +} diff --git a/js/test/mocha.config.js b/js/test/mocha.config.js new file mode 100644 index 00000000000..ec7d4a9ff2c --- /dev/null +++ b/js/test/mocha.config.js @@ -0,0 +1,29 @@ +import 'isomorphic-fetch'; + +import es6Promise from 'es6-promise'; +es6Promise.polyfill(); + +import 'mock-local-storage'; + +import chai from 'chai'; +import chaiEnzyme from 'chai-enzyme'; +import sinonChai from 'sinon-chai'; +import { w3cwebsocket } from 'websocket'; +import jsdom from 'jsdom'; + +chai.use(chaiEnzyme()); +chai.use(sinonChai); + +// expose expect to global so we won't have to manually import & define it in every test +global.expect = chai.expect; +global.WebSocket = w3cwebsocket; + +// setup jsdom +global.document = jsdom.jsdom(''); +global.window = document.defaultView; +global.navigator = global.window.navigator; + +// attach mocked localStorage onto the window as exposed by jsdom +global.window.localStorage = global.localStorage; + +module.exports = {}; diff --git a/js/test/mocha.opts b/js/test/mocha.opts new file mode 100644 index 00000000000..6a1e05869c4 --- /dev/null +++ b/js/test/mocha.opts @@ -0,0 +1,3 @@ +-r ./test/babel +-r ./test/mocha.config +-r ignore-styles diff --git a/js/test/mockRpc.js b/js/test/mockRpc.js new file mode 100644 index 00000000000..627e5d08375 --- /dev/null +++ b/js/test/mockRpc.js @@ -0,0 +1,79 @@ +import nock from 'nock'; +import { Server as MockWsServer } from 'mock-socket'; + +import { isFunction } from '../src/api/util/types'; + +export const TEST_HTTP_URL = 'http://localhost:6688'; +export const TEST_WS_URL = 'ws://localhost:8866'; + +export function mockHttp (requests) { + let scope = nock(TEST_HTTP_URL); + + requests.forEach((request) => { + scope = scope + .post('/') + .reply(request.code || 200, (uri, body) => { + if (body.method !== request.method) { + return { + error: `Invalid method ${body.method}, expected ${request.method}` + }; + } + + scope.body = scope.body || {}; + scope.body[request.method] = body; + + return request.reply; + }); + }); + + return scope; +} + +export function mockWs (requests) { + const scope = { requests: 0, body: {} }; + let mockServer = new MockWsServer(TEST_WS_URL); + + scope.isDone = () => scope.requests === requests.length; + scope.stop = () => { + if (mockServer) { + mockServer.stop(); + mockServer = null; + } + }; + + mockServer.on('message', (_body) => { + const body = JSON.parse(_body); + const request = requests[scope.requests]; + const reply = request.reply; + const response = reply.error + ? { id: body.id, error: { code: reply.error.code, message: reply.error.message } } + : { id: body.id, result: reply }; + + scope.body[request.method] = body; + scope.requests++; + + mockServer.send(JSON.stringify(response)); + }); + + return scope; +} + +export function endpointTest (instance, moduleId, name) { + describe(name, () => { + it(`has the ${moduleId}.${name} endpoint`, () => { + expect(isFunction(instance[moduleId][name])).to.be.ok; + }); + + it(`maps to ${moduleId}_${name} via RPC`, () => { + const scope = mockHttp([{ method: `${moduleId}_${name}`, reply: {} }]); + + return instance[moduleId][name]() + .then(() => { + expect(scope.isDone()).to.be.true; + }) + .catch(() => { + nock.cleanAll(); + }); + }); + }); +} diff --git a/js/test/types.js b/js/test/types.js new file mode 100644 index 00000000000..577710163e1 --- /dev/null +++ b/js/test/types.js @@ -0,0 +1,26 @@ +import BigNumber from 'bignumber.js'; +import { isInstanceOf } from '../src/api/util/types'; + +export { isFunction, isInstanceOf } from '../src/api/util/types'; +export { isAddress } from '../src/api/format/address'; + +const ZEROS = '000000000000000000000000000000000000000000000000000000000000'; + +export function isBigNumber (test) { + return isInstanceOf(test, BigNumber); +} + +export function isBoolean (test) { + return Object.prototype.toString.call(test) === '[object Boolean]'; +} + +export function isHexNumber (_test) { + if (_test.substr(0, 2) !== '0x') { + return false; + } + + const test = _test.substr(2); + const hex = `${ZEROS}${(new BigNumber(_test, 16)).toString(16)}`.slice(-1 * test.length); + + return hex === test; +} diff --git a/js/webpack.config.js b/js/webpack.config.js new file mode 100644 index 00000000000..2c34b38ab04 --- /dev/null +++ b/js/webpack.config.js @@ -0,0 +1,142 @@ +var rucksack = require('rucksack-css'); +var webpack = require('webpack'); +var path = require('path'); + +var ExtractTextPlugin = require('extract-text-webpack-plugin'); +var WebpackErrorNotificationPlugin = require('webpack-error-notification'); + +var ENV = process.env.NODE_ENV || 'development'; +var isProd = ENV === 'production'; + +module.exports = { + debug: !isProd, + cache: !isProd, + devtool: isProd ? '#eval' : '#cheap-module-eval-source-map', + context: path.join(__dirname, './src'), + entry: { + 'app': ['./app.js'] + }, + output: { + path: path.join(__dirname, 'build'), + filename: '[name].js' + }, + module: { + loaders: [ + { + test: /\.js$/, + exclude: /node_modules/, + loaders: isProd ? ['babel'] : [ + 'react-hot', + 'babel' + ] + }, + { + test: /\.js$/, + include: /dapps-react-components/, + loaders: isProd ? ['babel'] : [ + 'react-hot', + 'babel' + ] + }, + { + test: /\.json$/, + loaders: ['json'] + }, + { + test: /\.html$/, + loader: 'file?name=[name].[ext]' + }, + { + test: /\.css$/, + include: [/src/], + loaders: [ + 'style', + 'css?modules&sourceMap&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]', + 'postcss' + ] + }, + { + test: /\.css$/, + exclude: [/src/], + loader: 'style!css' + }, + { + test: /\.(png|jpg|)$/, + loader: 'file-loader' + }, + { + test: /\.woff(2)?(\?v=[0-9]\.[0-9]\.[0-9])?$/, + loader: 'url-loader?limit=10000&mimetype=application/font-woff' + }, + { + test: /\.(woff(2)|ttf|eot|svg|otf)(\?v=[0-9]\.[0-9]\.[0-9])?$/, + loader: 'url-loader?limit=10000' + } + ], + noParse: [ + /node_modules\/sinon/ + ] + }, + resolve: { + root: path.join(__dirname, 'node_modules'), + fallback: path.join(__dirname, 'node_modules'), + extensions: ['', '.js', '.jsx'], + unsafeCache: true + }, + resolveLoaders: { + root: path.join(__dirname, 'node_modules'), + fallback: path.join(__dirname, 'node_modules') + }, + postcss: [ + rucksack({ + autoprefixer: true + }) + ], + plugins: (function () { + var plugins = [ + new ExtractTextPlugin('[name].css'), + new WebpackErrorNotificationPlugin(), + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: JSON.stringify(ENV), + RPC_ADDRESS: JSON.stringify(process.env.RPC_ADDRESS), + LOGGING: JSON.stringify(!isProd) + } + }) + ]; + + if (isProd) { + plugins.push(new webpack.optimize.OccurrenceOrderPlugin(false)); + plugins.push(new webpack.optimize.DedupePlugin()); + plugins.push(new webpack.optimize.UglifyJsPlugin({ + screwIe8: true, + compress: { + warnings: false + }, + output: { + comments: false + } + })); + } + + return plugins; + }()), + devServer: { + contentBase: './src', + hot: !isProd, + proxy: { + '/rpc/*': { + target: 'http://localhost:8080', + changeOrigin: true + }, + '/api*': { + target: 'http://localhost:8080', + changeOrigin: true + }, + '/wallet/*': { + target: 'http://localhost:8080', + changeOrigin: true + } + } + } +}; From ca2aaed5815ffae5939a3ca6667af12c0d6a3623 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 11 Aug 2016 18:42:54 +0200 Subject: [PATCH 0002/1062] js-minded editorconfig --- js/.editorconfig | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 js/.editorconfig diff --git a/js/.editorconfig b/js/.editorconfig new file mode 100644 index 00000000000..3c229b5dc18 --- /dev/null +++ b/js/.editorconfig @@ -0,0 +1,10 @@ +root = true +[*] +indent_style=space +indent_size=2 +tab_width=2 +end_of_line=lf +charset=utf-8 +trim_trailing_whitespace=true +max_line_length=120 +insert_final_newline=true From 09da6e5b76d5f599e1415de52d8d351bbe620192 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 11 Aug 2016 18:43:06 +0200 Subject: [PATCH 0003/1062] store address as returned --- js/src/ui/NewAccount/newAccount.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/js/src/ui/NewAccount/newAccount.js b/js/src/ui/NewAccount/newAccount.js index 861469eeb1f..418f9cb2ce8 100644 --- a/js/src/ui/NewAccount/newAccount.js +++ b/js/src/ui/NewAccount/newAccount.js @@ -143,7 +143,12 @@ export default class NewAccount extends Component { return api.personal .newAccountFromWallet(this.state.json, this.state.password) - .then((address) => api.personal.setAccountName(address, this.state.name)) + .then((address) => { + this.setState({ + address: address + }); + return api.personal.setAccountName(address, this.state.name); + }) .then(() => { this.onNext(); this.props.onUpdate && this.props.onUpdate(); From 850c5c6d1ca9b1cafdfbe495b25fbc06fb732c4d Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 11 Aug 2016 23:45:36 +0200 Subject: [PATCH 0004/1062] provide padded account list for better layout --- js/src/ui/Accounts/accounts.js | 6 ++++-- js/src/ui/Accounts/style.css | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/js/src/ui/Accounts/accounts.js b/js/src/ui/Accounts/accounts.js index 06ad2cd88b1..c25c188851c 100644 --- a/js/src/ui/Accounts/accounts.js +++ b/js/src/ui/Accounts/accounts.js @@ -50,8 +50,10 @@ export default class Accounts extends Component {
- +
+ +
); }); diff --git a/js/src/ui/Accounts/style.css b/js/src/ui/Accounts/style.css index 592697fde09..7e3e140a0e9 100644 --- a/js/src/ui/Accounts/style.css +++ b/js/src/ui/Accounts/style.css @@ -3,8 +3,8 @@ width: 50%; } -.account>div { - height: 100%; +.padded { + padding: 1em 0.5em 0 0.5em; } .accounts { From c90c718be8e7c2839ea95624e67e9fd5de5f6fe5 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 12 Aug 2016 08:54:35 +0200 Subject: [PATCH 0005/1062] use Container for consistent padded Card displays --- js/src/ui/Account/account.js | 7 ++++--- .../Accounts/AccountSummary/accountSummary.js | 7 ++++--- js/src/ui/Accounts/accounts.js | 6 ++---- js/src/ui/Accounts/style.css | 4 ---- js/src/ui/Container/container.js | 21 +++++++++++++++++++ js/src/ui/Container/index.js | 1 + js/src/ui/Container/style.css | 3 +++ 7 files changed, 35 insertions(+), 14 deletions(-) create mode 100644 js/src/ui/Container/container.js create mode 100644 js/src/ui/Container/index.js create mode 100644 js/src/ui/Container/style.css diff --git a/js/src/ui/Account/account.js b/js/src/ui/Account/account.js index f77741ccd63..fa9eb839951 100644 --- a/js/src/ui/Account/account.js +++ b/js/src/ui/Account/account.js @@ -1,9 +1,10 @@ import React, { Component, PropTypes } from 'react'; import { TextField } from 'material-ui'; -import { Card, CardText } from 'material-ui/Card'; +import { CardText } from 'material-ui/Card'; import Balances from '../Balances'; +import Container from '../Container'; import Form from '../Form'; import FormWrap from '../FormWrap'; import IdentityIcon from '../IdentityIcon'; @@ -33,7 +34,7 @@ export default class Account extends Component { return (
- + @@ -60,7 +61,7 @@ export default class Account extends Component { - +
); } diff --git a/js/src/ui/Accounts/AccountSummary/accountSummary.js b/js/src/ui/Accounts/AccountSummary/accountSummary.js index 5c0ba18aec8..5b479db2313 100644 --- a/js/src/ui/Accounts/AccountSummary/accountSummary.js +++ b/js/src/ui/Accounts/AccountSummary/accountSummary.js @@ -1,9 +1,10 @@ import React, { Component, PropTypes } from 'react'; import { Link } from 'react-router'; -import { Card, CardText, CardTitle } from 'material-ui/Card'; +import { CardText, CardTitle } from 'material-ui/Card'; import Balances from '../../Balances'; +import Container from '../../Container'; import IdentityIcon from '../../IdentityIcon'; const TITLE_STYLE = { textTransform: 'uppercase', paddingBottom: 0 }; @@ -26,7 +27,7 @@ export default class AccountSummary extends Component { const viewLink = `/account/${account.address}`; return ( - + - + ); } } diff --git a/js/src/ui/Accounts/accounts.js b/js/src/ui/Accounts/accounts.js index c25c188851c..06ad2cd88b1 100644 --- a/js/src/ui/Accounts/accounts.js +++ b/js/src/ui/Accounts/accounts.js @@ -50,10 +50,8 @@ export default class Accounts extends Component {
-
- -
+
); }); diff --git a/js/src/ui/Accounts/style.css b/js/src/ui/Accounts/style.css index 7e3e140a0e9..a79f61a9509 100644 --- a/js/src/ui/Accounts/style.css +++ b/js/src/ui/Accounts/style.css @@ -3,10 +3,6 @@ width: 50%; } -.padded { - padding: 1em 0.5em 0 0.5em; -} - .accounts { display: flex; flex-wrap: wrap; diff --git a/js/src/ui/Container/container.js b/js/src/ui/Container/container.js new file mode 100644 index 00000000000..0a33daadee9 --- /dev/null +++ b/js/src/ui/Container/container.js @@ -0,0 +1,21 @@ +import React, { Component, PropTypes } from 'react'; + +import { Card } from 'material-ui/Card'; + +import styles from './style.css'; + +export default class Container extends Component { + static propTypes = { + children: PropTypes.node + } + + render () { + return ( +
+ + { this.props.children } + +
+ ); + } +} diff --git a/js/src/ui/Container/index.js b/js/src/ui/Container/index.js new file mode 100644 index 00000000000..0403d9f1e64 --- /dev/null +++ b/js/src/ui/Container/index.js @@ -0,0 +1 @@ +export default from './container.js'; diff --git a/js/src/ui/Container/style.css b/js/src/ui/Container/style.css new file mode 100644 index 00000000000..52e1ac974f6 --- /dev/null +++ b/js/src/ui/Container/style.css @@ -0,0 +1,3 @@ +.padded { + padding: 1em 0.5em 0 0.5em; +} From c4ec16324e8e07894aa1eac7c1b7b99b226cae6e Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 12 Aug 2016 09:17:06 +0200 Subject: [PATCH 0006/1062] add Cancel button on create dialog --- js/src/ui/NewAccount/newAccount.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/js/src/ui/NewAccount/newAccount.js b/js/src/ui/NewAccount/newAccount.js index 418f9cb2ce8..03898d21a1e 100644 --- a/js/src/ui/NewAccount/newAccount.js +++ b/js/src/ui/NewAccount/newAccount.js @@ -3,6 +3,7 @@ import React, { Component, PropTypes } from 'react'; import { FlatButton } from 'material-ui'; import ActionDone from 'material-ui/svg-icons/action/done'; import ActionDoneAll from 'material-ui/svg-icons/action/done-all'; +import ContentClear from 'material-ui/svg-icons/content/clear'; import NavigationArrowBack from 'material-ui/svg-icons/navigation/arrow-back'; import NavigationArrowForward from 'material-ui/svg-icons/navigation/arrow-forward'; @@ -84,15 +85,25 @@ export default class NewAccount extends Component { renderDialogActions () { switch (this.state.stage) { case 0: - return ( + return [ + } + label='Cancel' + primary + onTouchTap={ this.onClose } />, } label='Next' primary onTouchTap={ this.onNext } /> - ); + ]; case 1: return [ + } + label='Cancel' + primary + onTouchTap={ this.onClose } />, } label='Back' From 068dc4a445d50ad41fdb7dfb85ef11e6f10d577a Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 12 Aug 2016 09:55:54 +0200 Subject: [PATCH 0007/1062] etherscan.io APIs for stop-gap transaction log --- js/src/3rdparty/etherscan/account.js | 45 +++++++++++++++++++ js/src/3rdparty/etherscan/account.spec.js | 53 +++++++++++++++++++++++ js/src/3rdparty/etherscan/call.js | 36 +++++++++++++++ js/src/3rdparty/etherscan/index.js | 9 ++++ js/src/3rdparty/etherscan/stats.js | 20 +++++++++ js/src/3rdparty/etherscan/stats.spec.js | 19 ++++++++ 6 files changed, 182 insertions(+) create mode 100644 js/src/3rdparty/etherscan/account.js create mode 100644 js/src/3rdparty/etherscan/account.spec.js create mode 100644 js/src/3rdparty/etherscan/call.js create mode 100644 js/src/3rdparty/etherscan/index.js create mode 100644 js/src/3rdparty/etherscan/stats.js create mode 100644 js/src/3rdparty/etherscan/stats.spec.js diff --git a/js/src/3rdparty/etherscan/account.js b/js/src/3rdparty/etherscan/account.js new file mode 100644 index 00000000000..51da3adc490 --- /dev/null +++ b/js/src/3rdparty/etherscan/account.js @@ -0,0 +1,45 @@ +const PAGE_SIZE = 25; + +import { call } from './call'; + +function _call (method, params) { + return call('account', method, params); +} + +function balance (address) { + return _call('balance', { + address: address, + tag: 'latest' + }).then((balance) => { + // same format as balancemulti below + return { + account: address, + balance: balance + }; + }); +} + +function balances (addresses) { + return _call('balancemulti', { + address: addresses.join(','), + tag: 'latest' + }); +} + +function transactions (address, page) { + // page offset from 0 + return _call('txlist', { + address: address, + page: (page || 0) + 1, + offset: PAGE_SIZE, + sort: 'desc' + }); +} + +const account = { + balance: balance, + balances: balances, + transactions: transactions +}; + +export { account }; diff --git a/js/src/3rdparty/etherscan/account.spec.js b/js/src/3rdparty/etherscan/account.spec.js new file mode 100644 index 00000000000..73a45222ee6 --- /dev/null +++ b/js/src/3rdparty/etherscan/account.spec.js @@ -0,0 +1,53 @@ +import etherscan from './'; + +const TESTADDR = '0xbf885e2b55c6bcc84556a3c5f07d3040833c8d00'; + +describe('etherscan/account', () => { + const checkBalance = function (balance, addr) { + expect(balance).to.be.ok; + expect(balance.account).to.equal(addr); + expect(balance.balance).to.be.ok; + }; + + it('retrieves an account balance', () => { + return etherscan.account + .balance(TESTADDR) + .then((balance) => { + checkBalance(balance, TESTADDR); + }); + }); + + it('retrieves multi account balances', () => { + const addresses = ['0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae', TESTADDR]; + + return etherscan.account + .balances(addresses) + .then((balances) => { + expect(balances).to.be.ok; + expect(balances.length).to.equal(2); + balances.forEach((balance, idx) => { + checkBalance(balance, addresses[idx]); + }); + }); + }); + + describe('transactions', () => { + it('retrievs a list of transactions (default)', () => { + return etherscan.account + .transactions(TESTADDR) + .then((transactions) => { + expect(transactions).to.be.ok; + expect(transactions.length).to.equal(25); + }); + }); + + it('retrievs a list of transactions (page 1)', () => { + return etherscan.account + .transactions(TESTADDR, 1) + .then((transactions) => { + expect(transactions).to.be.ok; + expect(transactions.length).to.equal(25); + }); + }); + }); +}); diff --git a/js/src/3rdparty/etherscan/call.js b/js/src/3rdparty/etherscan/call.js new file mode 100644 index 00000000000..d1e753d3285 --- /dev/null +++ b/js/src/3rdparty/etherscan/call.js @@ -0,0 +1,36 @@ +const HOST = 'api.etherscan.io'; + +const options = { + method: 'GET', + headers: { + 'Accept': 'application/json' + } +}; + +export function call (module, action, _params) { + let params = ''; + + if (_params) { + Object.keys(_params).map((param) => { + const value = _params[param]; + + params = `${params}&${param}=${value}`; + }); + } + + return fetch(`http://${HOST}/api?module=${module}&action=${action}${params}`, options) + .then((response) => { + if (response.status !== 200) { + throw { code: response.status, message: response.statusText }; // eslint-disable-line + } + + return response.json(); + }) + .then((result) => { + if (result.message === 'NOTOK') { + throw { code: -1, message: result.result }; // eslint-disable-line + } + + return result.result; + }); +} diff --git a/js/src/3rdparty/etherscan/index.js b/js/src/3rdparty/etherscan/index.js new file mode 100644 index 00000000000..5daafa85119 --- /dev/null +++ b/js/src/3rdparty/etherscan/index.js @@ -0,0 +1,9 @@ +import { account } from './account'; +import { stats } from './stats'; + +const etherscan = { + account: account, + stats: stats +}; + +export default etherscan; diff --git a/js/src/3rdparty/etherscan/stats.js b/js/src/3rdparty/etherscan/stats.js new file mode 100644 index 00000000000..140d1eb7b39 --- /dev/null +++ b/js/src/3rdparty/etherscan/stats.js @@ -0,0 +1,20 @@ +import { call } from './call'; + +function _call (action) { + return call('stats', action); +} + +function price () { + return _call('ethprice'); +} + +function supply () { + return _call('ethsupply'); +} + +const stats = { + price: price, + supply: supply +}; + +export { stats }; diff --git a/js/src/3rdparty/etherscan/stats.spec.js b/js/src/3rdparty/etherscan/stats.spec.js new file mode 100644 index 00000000000..ea64774f148 --- /dev/null +++ b/js/src/3rdparty/etherscan/stats.spec.js @@ -0,0 +1,19 @@ +import etherscan from './'; + +describe('etherscan/stats', () => { + it('retrieves the latest price', () => { + return etherscan.stats + .price() + .then((price) => { + expect(price).to.be.ok; + }); + }); + + it('retrieves the ether total', () => { + return etherscan.stats + .supply() + .then((supply) => { + expect(supply).to.be.ok; + }); + }); +}); From a50274b8abcc4bf356c34a43aaec78343d9acfd1 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 12 Aug 2016 10:44:58 +0200 Subject: [PATCH 0008/1062] FormWrap under Form/, Dialogs under Dialogs/ --- js/src/ui/Account/account.js | 3 +-- js/src/ui/Accounts/accounts.js | 2 +- js/src/ui/Application/application.js | 2 +- js/src/ui/{ => Dialogs}/FirstRun/Completed/completed.js | 0 js/src/ui/{ => Dialogs}/FirstRun/Completed/index.js | 0 .../ui/{ => Dialogs}/FirstRun/CreateAccount/createAccount.js | 3 +-- js/src/ui/{ => Dialogs}/FirstRun/CreateAccount/index.js | 0 js/src/ui/{ => Dialogs}/FirstRun/RecoverAccount/index.js | 0 .../{ => Dialogs}/FirstRun/RecoverAccount/recoverAccount.js | 5 ++--- js/src/ui/{ => Dialogs}/FirstRun/Welcome/index.js | 0 js/src/ui/{ => Dialogs}/FirstRun/Welcome/welcome.js | 0 js/src/ui/{ => Dialogs}/FirstRun/firstRun.js | 2 +- js/src/ui/{ => Dialogs}/FirstRun/index.js | 0 .../NewAccount/AccountDetails/accountDetails.js | 5 ++--- js/src/ui/{ => Dialogs}/NewAccount/AccountDetails/index.js | 0 .../{ => Dialogs}/NewAccount/CreateAccount/createAccount.js | 4 ++-- js/src/ui/{ => Dialogs}/NewAccount/CreateAccount/index.js | 0 .../ui/{ => Dialogs}/NewAccount/CreationType/creationType.js | 0 js/src/ui/{ => Dialogs}/NewAccount/CreationType/index.js | 0 .../ui/{ => Dialogs}/NewAccount/ImportWallet/importWallet.js | 2 +- js/src/ui/{ => Dialogs}/NewAccount/ImportWallet/index.js | 0 js/src/ui/{ => Dialogs}/NewAccount/index.js | 0 js/src/ui/{ => Dialogs}/NewAccount/newAccount.js | 2 +- js/src/ui/{ => Dialogs}/NewAccount/style.css | 0 js/src/ui/Dialogs/index.js | 4 ++++ js/src/ui/{ => Form}/FormWrap/formWrap.js | 0 js/src/ui/{ => Form}/FormWrap/index.js | 0 js/src/ui/{ => Form}/FormWrap/style.css | 0 js/src/ui/Form/index.js | 3 +++ 29 files changed, 20 insertions(+), 17 deletions(-) rename js/src/ui/{ => Dialogs}/FirstRun/Completed/completed.js (100%) rename js/src/ui/{ => Dialogs}/FirstRun/Completed/index.js (100%) rename js/src/ui/{ => Dialogs}/FirstRun/CreateAccount/createAccount.js (96%) rename js/src/ui/{ => Dialogs}/FirstRun/CreateAccount/index.js (100%) rename js/src/ui/{ => Dialogs}/FirstRun/RecoverAccount/index.js (100%) rename js/src/ui/{ => Dialogs}/FirstRun/RecoverAccount/recoverAccount.js (92%) rename js/src/ui/{ => Dialogs}/FirstRun/Welcome/index.js (100%) rename js/src/ui/{ => Dialogs}/FirstRun/Welcome/welcome.js (100%) rename js/src/ui/{ => Dialogs}/FirstRun/firstRun.js (98%) rename js/src/ui/{ => Dialogs}/FirstRun/index.js (100%) rename js/src/ui/{ => Dialogs}/NewAccount/AccountDetails/accountDetails.js (93%) rename js/src/ui/{ => Dialogs}/NewAccount/AccountDetails/index.js (100%) rename js/src/ui/{ => Dialogs}/NewAccount/CreateAccount/createAccount.js (98%) rename js/src/ui/{ => Dialogs}/NewAccount/CreateAccount/index.js (100%) rename js/src/ui/{ => Dialogs}/NewAccount/CreationType/creationType.js (100%) rename js/src/ui/{ => Dialogs}/NewAccount/CreationType/index.js (100%) rename js/src/ui/{ => Dialogs}/NewAccount/ImportWallet/importWallet.js (99%) rename js/src/ui/{ => Dialogs}/NewAccount/ImportWallet/index.js (100%) rename js/src/ui/{ => Dialogs}/NewAccount/index.js (100%) rename js/src/ui/{ => Dialogs}/NewAccount/newAccount.js (99%) rename js/src/ui/{ => Dialogs}/NewAccount/style.css (100%) create mode 100644 js/src/ui/Dialogs/index.js rename js/src/ui/{ => Form}/FormWrap/formWrap.js (100%) rename js/src/ui/{ => Form}/FormWrap/index.js (100%) rename js/src/ui/{ => Form}/FormWrap/style.css (100%) diff --git a/js/src/ui/Account/account.js b/js/src/ui/Account/account.js index fa9eb839951..28fe2ce9364 100644 --- a/js/src/ui/Account/account.js +++ b/js/src/ui/Account/account.js @@ -5,8 +5,7 @@ import { CardText } from 'material-ui/Card'; import Balances from '../Balances'; import Container from '../Container'; -import Form from '../Form'; -import FormWrap from '../FormWrap'; +import Form, { FormWrap } from '../Form'; import IdentityIcon from '../IdentityIcon'; import Actions from './actions'; diff --git a/js/src/ui/Accounts/accounts.js b/js/src/ui/Accounts/accounts.js index 06ad2cd88b1..07a404d54ff 100644 --- a/js/src/ui/Accounts/accounts.js +++ b/js/src/ui/Accounts/accounts.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import AccountSummary from './AccountSummary'; import Actions from './Actions'; -import NewAccount from '../NewAccount'; +import { NewAccount } from '../Dialogs'; import styles from './style.css'; diff --git a/js/src/ui/Application/application.js b/js/src/ui/Application/application.js index bf98b701b17..ad6de17506a 100644 --- a/js/src/ui/Application/application.js +++ b/js/src/ui/Application/application.js @@ -6,7 +6,7 @@ import lightBaseTheme from 'material-ui/styles/baseThemes/lightBaseTheme'; import Api from '../../api'; -import FirstRun from '../FirstRun'; +import { FirstRun } from '../Dialogs'; import Status from './Status'; import TabBar from './TabBar'; diff --git a/js/src/ui/FirstRun/Completed/completed.js b/js/src/ui/Dialogs/FirstRun/Completed/completed.js similarity index 100% rename from js/src/ui/FirstRun/Completed/completed.js rename to js/src/ui/Dialogs/FirstRun/Completed/completed.js diff --git a/js/src/ui/FirstRun/Completed/index.js b/js/src/ui/Dialogs/FirstRun/Completed/index.js similarity index 100% rename from js/src/ui/FirstRun/Completed/index.js rename to js/src/ui/Dialogs/FirstRun/Completed/index.js diff --git a/js/src/ui/FirstRun/CreateAccount/createAccount.js b/js/src/ui/Dialogs/FirstRun/CreateAccount/createAccount.js similarity index 96% rename from js/src/ui/FirstRun/CreateAccount/createAccount.js rename to js/src/ui/Dialogs/FirstRun/CreateAccount/createAccount.js index 34cf714b02f..bf1512d63ac 100644 --- a/js/src/ui/FirstRun/CreateAccount/createAccount.js +++ b/js/src/ui/Dialogs/FirstRun/CreateAccount/createAccount.js @@ -2,8 +2,7 @@ import React, { Component, PropTypes } from 'react'; import { TextField } from 'material-ui'; -import Form from '../../Form'; -import FormWrap from '../../FormWrap'; +import Form, { FormWrap } from '../../../Form'; export default class CreateAccount extends Component { static contextTypes = { diff --git a/js/src/ui/FirstRun/CreateAccount/index.js b/js/src/ui/Dialogs/FirstRun/CreateAccount/index.js similarity index 100% rename from js/src/ui/FirstRun/CreateAccount/index.js rename to js/src/ui/Dialogs/FirstRun/CreateAccount/index.js diff --git a/js/src/ui/FirstRun/RecoverAccount/index.js b/js/src/ui/Dialogs/FirstRun/RecoverAccount/index.js similarity index 100% rename from js/src/ui/FirstRun/RecoverAccount/index.js rename to js/src/ui/Dialogs/FirstRun/RecoverAccount/index.js diff --git a/js/src/ui/FirstRun/RecoverAccount/recoverAccount.js b/js/src/ui/Dialogs/FirstRun/RecoverAccount/recoverAccount.js similarity index 92% rename from js/src/ui/FirstRun/RecoverAccount/recoverAccount.js rename to js/src/ui/Dialogs/FirstRun/RecoverAccount/recoverAccount.js index f72fbb17395..9a92df115e8 100644 --- a/js/src/ui/FirstRun/RecoverAccount/recoverAccount.js +++ b/js/src/ui/Dialogs/FirstRun/RecoverAccount/recoverAccount.js @@ -2,9 +2,8 @@ import React, { Component, PropTypes } from 'react'; import { TextField } from 'material-ui'; -import Form from '../../Form'; -import FormWrap from '../../FormWrap'; -import IdentityIcon from '../../IdentityIcon'; +import Form, { FormWrap } from '../../../Form'; +import IdentityIcon from '../../../IdentityIcon'; export default class RecoverAccount extends Component { static propTypes = { diff --git a/js/src/ui/FirstRun/Welcome/index.js b/js/src/ui/Dialogs/FirstRun/Welcome/index.js similarity index 100% rename from js/src/ui/FirstRun/Welcome/index.js rename to js/src/ui/Dialogs/FirstRun/Welcome/index.js diff --git a/js/src/ui/FirstRun/Welcome/welcome.js b/js/src/ui/Dialogs/FirstRun/Welcome/welcome.js similarity index 100% rename from js/src/ui/FirstRun/Welcome/welcome.js rename to js/src/ui/Dialogs/FirstRun/Welcome/welcome.js diff --git a/js/src/ui/FirstRun/firstRun.js b/js/src/ui/Dialogs/FirstRun/firstRun.js similarity index 98% rename from js/src/ui/FirstRun/firstRun.js rename to js/src/ui/Dialogs/FirstRun/firstRun.js index 35f0e06ec38..0f4898c7873 100644 --- a/js/src/ui/FirstRun/firstRun.js +++ b/js/src/ui/Dialogs/FirstRun/firstRun.js @@ -5,7 +5,7 @@ import ActionDone from 'material-ui/svg-icons/action/done'; import ActionDoneAll from 'material-ui/svg-icons/action/done-all'; import NavigationArrowForward from 'material-ui/svg-icons/navigation/arrow-forward'; -import Overlay from '../Overlay'; +import Overlay from '../../Overlay'; import Completed from './Completed'; import CreateAccount from './CreateAccount'; diff --git a/js/src/ui/FirstRun/index.js b/js/src/ui/Dialogs/FirstRun/index.js similarity index 100% rename from js/src/ui/FirstRun/index.js rename to js/src/ui/Dialogs/FirstRun/index.js diff --git a/js/src/ui/NewAccount/AccountDetails/accountDetails.js b/js/src/ui/Dialogs/NewAccount/AccountDetails/accountDetails.js similarity index 93% rename from js/src/ui/NewAccount/AccountDetails/accountDetails.js rename to js/src/ui/Dialogs/NewAccount/AccountDetails/accountDetails.js index f742709ca99..87d1845b642 100644 --- a/js/src/ui/NewAccount/AccountDetails/accountDetails.js +++ b/js/src/ui/Dialogs/NewAccount/AccountDetails/accountDetails.js @@ -2,9 +2,8 @@ import React, { Component, PropTypes } from 'react'; import { TextField } from 'material-ui'; -import Form from '../../Form'; -import FormWrap from '../../FormWrap'; -import IdentityIcon from '../../IdentityIcon'; +import Form, { FormWrap } from '../../../Form'; +import IdentityIcon from '../../../IdentityIcon'; import styles from '../style.css'; diff --git a/js/src/ui/NewAccount/AccountDetails/index.js b/js/src/ui/Dialogs/NewAccount/AccountDetails/index.js similarity index 100% rename from js/src/ui/NewAccount/AccountDetails/index.js rename to js/src/ui/Dialogs/NewAccount/AccountDetails/index.js diff --git a/js/src/ui/NewAccount/CreateAccount/createAccount.js b/js/src/ui/Dialogs/NewAccount/CreateAccount/createAccount.js similarity index 98% rename from js/src/ui/NewAccount/CreateAccount/createAccount.js rename to js/src/ui/Dialogs/NewAccount/CreateAccount/createAccount.js index 314507e19fc..e028b0a4a07 100644 --- a/js/src/ui/NewAccount/CreateAccount/createAccount.js +++ b/js/src/ui/Dialogs/NewAccount/CreateAccount/createAccount.js @@ -3,8 +3,8 @@ import React, { Component, PropTypes } from 'react'; import { TextField } from 'material-ui'; import { RadioButton, RadioButtonGroup } from 'material-ui/RadioButton'; -import Form from '../../Form'; -import IdentityIcon from '../../IdentityIcon'; +import Form from '../../../Form'; +import IdentityIcon from '../../../IdentityIcon'; import styles from '../style.css'; diff --git a/js/src/ui/NewAccount/CreateAccount/index.js b/js/src/ui/Dialogs/NewAccount/CreateAccount/index.js similarity index 100% rename from js/src/ui/NewAccount/CreateAccount/index.js rename to js/src/ui/Dialogs/NewAccount/CreateAccount/index.js diff --git a/js/src/ui/NewAccount/CreationType/creationType.js b/js/src/ui/Dialogs/NewAccount/CreationType/creationType.js similarity index 100% rename from js/src/ui/NewAccount/CreationType/creationType.js rename to js/src/ui/Dialogs/NewAccount/CreationType/creationType.js diff --git a/js/src/ui/NewAccount/CreationType/index.js b/js/src/ui/Dialogs/NewAccount/CreationType/index.js similarity index 100% rename from js/src/ui/NewAccount/CreationType/index.js rename to js/src/ui/Dialogs/NewAccount/CreationType/index.js diff --git a/js/src/ui/NewAccount/ImportWallet/importWallet.js b/js/src/ui/Dialogs/NewAccount/ImportWallet/importWallet.js similarity index 99% rename from js/src/ui/NewAccount/ImportWallet/importWallet.js rename to js/src/ui/Dialogs/NewAccount/ImportWallet/importWallet.js index 11cce6d35ce..2e2f5d7aea4 100644 --- a/js/src/ui/NewAccount/ImportWallet/importWallet.js +++ b/js/src/ui/Dialogs/NewAccount/ImportWallet/importWallet.js @@ -4,7 +4,7 @@ import ReactDOM from 'react-dom'; import { FlatButton, TextField } from 'material-ui'; import CommunicationImportExport from 'material-ui/svg-icons/communication/import-export'; -import Form from '../../Form'; +import Form from '../../../Form'; import styles from '../style.css'; diff --git a/js/src/ui/NewAccount/ImportWallet/index.js b/js/src/ui/Dialogs/NewAccount/ImportWallet/index.js similarity index 100% rename from js/src/ui/NewAccount/ImportWallet/index.js rename to js/src/ui/Dialogs/NewAccount/ImportWallet/index.js diff --git a/js/src/ui/NewAccount/index.js b/js/src/ui/Dialogs/NewAccount/index.js similarity index 100% rename from js/src/ui/NewAccount/index.js rename to js/src/ui/Dialogs/NewAccount/index.js diff --git a/js/src/ui/NewAccount/newAccount.js b/js/src/ui/Dialogs/NewAccount/newAccount.js similarity index 99% rename from js/src/ui/NewAccount/newAccount.js rename to js/src/ui/Dialogs/NewAccount/newAccount.js index 03898d21a1e..037db1b2609 100644 --- a/js/src/ui/NewAccount/newAccount.js +++ b/js/src/ui/Dialogs/NewAccount/newAccount.js @@ -7,7 +7,7 @@ import ContentClear from 'material-ui/svg-icons/content/clear'; import NavigationArrowBack from 'material-ui/svg-icons/navigation/arrow-back'; import NavigationArrowForward from 'material-ui/svg-icons/navigation/arrow-forward'; -import Overlay from '../Overlay'; +import Overlay from '../../Overlay'; import AccountDetails from './AccountDetails'; import CreationType from './CreationType'; diff --git a/js/src/ui/NewAccount/style.css b/js/src/ui/Dialogs/NewAccount/style.css similarity index 100% rename from js/src/ui/NewAccount/style.css rename to js/src/ui/Dialogs/NewAccount/style.css diff --git a/js/src/ui/Dialogs/index.js b/js/src/ui/Dialogs/index.js new file mode 100644 index 00000000000..069109c13c9 --- /dev/null +++ b/js/src/ui/Dialogs/index.js @@ -0,0 +1,4 @@ +import FirstRun from './FirstRun'; +import NewAccount from './NewAccount'; + +export { FirstRun, NewAccount }; diff --git a/js/src/ui/FormWrap/formWrap.js b/js/src/ui/Form/FormWrap/formWrap.js similarity index 100% rename from js/src/ui/FormWrap/formWrap.js rename to js/src/ui/Form/FormWrap/formWrap.js diff --git a/js/src/ui/FormWrap/index.js b/js/src/ui/Form/FormWrap/index.js similarity index 100% rename from js/src/ui/FormWrap/index.js rename to js/src/ui/Form/FormWrap/index.js diff --git a/js/src/ui/FormWrap/style.css b/js/src/ui/Form/FormWrap/style.css similarity index 100% rename from js/src/ui/FormWrap/style.css rename to js/src/ui/Form/FormWrap/style.css diff --git a/js/src/ui/Form/index.js b/js/src/ui/Form/index.js index 6685500c652..5b21a55bbf4 100644 --- a/js/src/ui/Form/index.js +++ b/js/src/ui/Form/index.js @@ -1 +1,4 @@ +import FormWrap from './FormWrap'; + export default from './form'; +export { FormWrap }; From 5de5a0a348877b7a82768bca0043ebec59edb72a Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 12 Aug 2016 11:00:29 +0200 Subject: [PATCH 0009/1062] add all applicable dialogs (placeholders) --- js/src/ui/Accounts/accounts.js | 16 +++++- js/src/ui/Dialogs/FundAccount/fundAccount.js | 51 ++++++++++++++++++++ js/src/ui/Dialogs/FundAccount/index.js | 1 + js/src/ui/Dialogs/Transfer/index.js | 1 + js/src/ui/Dialogs/Transfer/transfer.js | 51 ++++++++++++++++++++ js/src/ui/Dialogs/index.js | 4 +- 6 files changed, 122 insertions(+), 2 deletions(-) create mode 100644 js/src/ui/Dialogs/FundAccount/fundAccount.js create mode 100644 js/src/ui/Dialogs/FundAccount/index.js create mode 100644 js/src/ui/Dialogs/Transfer/index.js create mode 100644 js/src/ui/Dialogs/Transfer/transfer.js diff --git a/js/src/ui/Accounts/accounts.js b/js/src/ui/Accounts/accounts.js index 07a404d54ff..c106b2d686c 100644 --- a/js/src/ui/Accounts/accounts.js +++ b/js/src/ui/Accounts/accounts.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import AccountSummary from './AccountSummary'; import Actions from './Actions'; -import { NewAccount } from '../Dialogs'; +import { FundAccount, NewAccount, Transfer } from '../Dialogs'; import styles from './style.css'; @@ -25,10 +25,16 @@ export default class Accounts extends Component { render () { return (
+ + { + this.onFundAccountClick(); + } + onNewAccountClick = () => { this.setState({ newDialog: !this.state.newDialog }); } @@ -77,6 +87,10 @@ export default class Accounts extends Component { this.setState({ transferDialog: !this.state.transferDialog }); } + onTransferClose = () => { + this.onTransferClick(); + } + retrieveAccounts () { const api = this.context.api; diff --git a/js/src/ui/Dialogs/FundAccount/fundAccount.js b/js/src/ui/Dialogs/FundAccount/fundAccount.js new file mode 100644 index 00000000000..0c474df0f09 --- /dev/null +++ b/js/src/ui/Dialogs/FundAccount/fundAccount.js @@ -0,0 +1,51 @@ +import React, { Component, PropTypes } from 'react'; + +import { FlatButton } from 'material-ui'; +import ContentClear from 'material-ui/svg-icons/content/clear'; + +import Overlay from '../../Overlay'; + +const STAGE_NAMES = ['fund account']; + +export default class FundAccount extends Component { + static propTypes = { + visible: PropTypes.bool.isRequired, + onClose: PropTypes.func + } + + state = { + stage: 0 + } + + render () { + return ( + +
+ Placeholder until such time as we have the ShapeShift.io integration going (just time, a scarce commodity) +
+
+ ); + } + + renderDialogActions () { + return ( + } + label='Cancel' + primary + onTouchTap={ this.onClose } /> + ); + } + + onClose = () => { + this.setState({ + stage: 0 + }, () => { + this.props.onClose && this.props.onClose(); + }); + } +} diff --git a/js/src/ui/Dialogs/FundAccount/index.js b/js/src/ui/Dialogs/FundAccount/index.js new file mode 100644 index 00000000000..be34a36e76a --- /dev/null +++ b/js/src/ui/Dialogs/FundAccount/index.js @@ -0,0 +1 @@ +export default from './fundAccount'; diff --git a/js/src/ui/Dialogs/Transfer/index.js b/js/src/ui/Dialogs/Transfer/index.js new file mode 100644 index 00000000000..4f097a4c526 --- /dev/null +++ b/js/src/ui/Dialogs/Transfer/index.js @@ -0,0 +1 @@ +export default from './transfer'; diff --git a/js/src/ui/Dialogs/Transfer/transfer.js b/js/src/ui/Dialogs/Transfer/transfer.js new file mode 100644 index 00000000000..16f078ea42c --- /dev/null +++ b/js/src/ui/Dialogs/Transfer/transfer.js @@ -0,0 +1,51 @@ +import React, { Component, PropTypes } from 'react'; + +import { FlatButton } from 'material-ui'; +import ContentClear from 'material-ui/svg-icons/content/clear'; + +import Overlay from '../../Overlay'; + +const STAGE_NAMES = ['transfer']; + +export default class Transfer extends Component { + static propTypes = { + visible: PropTypes.bool.isRequired, + onClose: PropTypes.func + } + + state = { + stage: 0 + } + + render () { + return ( + +
+ In progress funds transfer +
+
+ ); + } + + renderDialogActions () { + return ( + } + label='Cancel' + primary + onTouchTap={ this.onClose } /> + ); + } + + onClose = () => { + this.setState({ + stage: 0 + }, () => { + this.props.onClose && this.props.onClose(); + }); + } +} diff --git a/js/src/ui/Dialogs/index.js b/js/src/ui/Dialogs/index.js index 069109c13c9..f9ee026a4f0 100644 --- a/js/src/ui/Dialogs/index.js +++ b/js/src/ui/Dialogs/index.js @@ -1,4 +1,6 @@ import FirstRun from './FirstRun'; +import FundAccount from './FundAccount'; import NewAccount from './NewAccount'; +import Transfer from './Transfer'; -export { FirstRun, NewAccount }; +export { FirstRun, FundAccount, NewAccount, Transfer }; From a57a1dd5b6323d608034eee0cdcf23c6c0ea955f Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 12 Aug 2016 11:01:12 +0200 Subject: [PATCH 0010/1062] dapps & token placeholders uses same containers --- js/src/ui/Apps/apps.js | 10 +++++++++- js/src/ui/Tokens/tokens.js | 10 +++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/js/src/ui/Apps/apps.js b/js/src/ui/Apps/apps.js index 934794ac736..6e17859eca1 100644 --- a/js/src/ui/Apps/apps.js +++ b/js/src/ui/Apps/apps.js @@ -1,9 +1,17 @@ import React, { Component } from 'react'; +import { CardText } from 'material-ui/Card'; + +import Container from '../Container'; + export default class Apps extends Component { render () { return ( -

managing contracts (adding, calling, etc) should go in here, next steps...

+ + + managing contracts (adding, calling, etc) should go in here, next steps... almost there... + + ); } } diff --git a/js/src/ui/Tokens/tokens.js b/js/src/ui/Tokens/tokens.js index a81e737dfdb..b25941c8691 100644 --- a/js/src/ui/Tokens/tokens.js +++ b/js/src/ui/Tokens/tokens.js @@ -1,9 +1,17 @@ import React, { Component } from 'react'; +import { CardText } from 'material-ui/Card'; + +import Container from '../Container'; + export default class Tokens extends Component { render () { return ( -

the token dapp interface should go in here, next steps...

+ + + the token dapp interface should go in here, we need a basic contract, deploy it and then go about playing and seeing what is the best way to pull everything together... + + ); } } From ff559e7d58efb4a5558dff293fe6244d97d89f54 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 12 Aug 2016 11:03:14 +0200 Subject: [PATCH 0011/1062] Dialogs rename, first step --- js/src/ui/{Dialogs => -dialogs}/FirstRun/Completed/completed.js | 0 js/src/ui/{Dialogs => -dialogs}/FirstRun/Completed/index.js | 0 .../{Dialogs => -dialogs}/FirstRun/CreateAccount/createAccount.js | 0 js/src/ui/{Dialogs => -dialogs}/FirstRun/CreateAccount/index.js | 0 js/src/ui/{Dialogs => -dialogs}/FirstRun/RecoverAccount/index.js | 0 .../FirstRun/RecoverAccount/recoverAccount.js | 0 js/src/ui/{Dialogs => -dialogs}/FirstRun/Welcome/index.js | 0 js/src/ui/{Dialogs => -dialogs}/FirstRun/Welcome/welcome.js | 0 js/src/ui/{Dialogs => -dialogs}/FirstRun/firstRun.js | 0 js/src/ui/{Dialogs => -dialogs}/FirstRun/index.js | 0 js/src/ui/{Dialogs => -dialogs}/FundAccount/fundAccount.js | 0 js/src/ui/{Dialogs => -dialogs}/FundAccount/index.js | 0 .../NewAccount/AccountDetails/accountDetails.js | 0 .../ui/{Dialogs => -dialogs}/NewAccount/AccountDetails/index.js | 0 .../NewAccount/CreateAccount/createAccount.js | 0 js/src/ui/{Dialogs => -dialogs}/NewAccount/CreateAccount/index.js | 0 .../{Dialogs => -dialogs}/NewAccount/CreationType/creationType.js | 0 js/src/ui/{Dialogs => -dialogs}/NewAccount/CreationType/index.js | 0 .../{Dialogs => -dialogs}/NewAccount/ImportWallet/importWallet.js | 0 js/src/ui/{Dialogs => -dialogs}/NewAccount/ImportWallet/index.js | 0 js/src/ui/{Dialogs => -dialogs}/NewAccount/index.js | 0 js/src/ui/{Dialogs => -dialogs}/NewAccount/newAccount.js | 0 js/src/ui/{Dialogs => -dialogs}/NewAccount/style.css | 0 js/src/ui/{Dialogs => -dialogs}/Transfer/index.js | 0 js/src/ui/{Dialogs => -dialogs}/Transfer/transfer.js | 0 js/src/ui/{Dialogs => -dialogs}/index.js | 0 26 files changed, 0 insertions(+), 0 deletions(-) rename js/src/ui/{Dialogs => -dialogs}/FirstRun/Completed/completed.js (100%) rename js/src/ui/{Dialogs => -dialogs}/FirstRun/Completed/index.js (100%) rename js/src/ui/{Dialogs => -dialogs}/FirstRun/CreateAccount/createAccount.js (100%) rename js/src/ui/{Dialogs => -dialogs}/FirstRun/CreateAccount/index.js (100%) rename js/src/ui/{Dialogs => -dialogs}/FirstRun/RecoverAccount/index.js (100%) rename js/src/ui/{Dialogs => -dialogs}/FirstRun/RecoverAccount/recoverAccount.js (100%) rename js/src/ui/{Dialogs => -dialogs}/FirstRun/Welcome/index.js (100%) rename js/src/ui/{Dialogs => -dialogs}/FirstRun/Welcome/welcome.js (100%) rename js/src/ui/{Dialogs => -dialogs}/FirstRun/firstRun.js (100%) rename js/src/ui/{Dialogs => -dialogs}/FirstRun/index.js (100%) rename js/src/ui/{Dialogs => -dialogs}/FundAccount/fundAccount.js (100%) rename js/src/ui/{Dialogs => -dialogs}/FundAccount/index.js (100%) rename js/src/ui/{Dialogs => -dialogs}/NewAccount/AccountDetails/accountDetails.js (100%) rename js/src/ui/{Dialogs => -dialogs}/NewAccount/AccountDetails/index.js (100%) rename js/src/ui/{Dialogs => -dialogs}/NewAccount/CreateAccount/createAccount.js (100%) rename js/src/ui/{Dialogs => -dialogs}/NewAccount/CreateAccount/index.js (100%) rename js/src/ui/{Dialogs => -dialogs}/NewAccount/CreationType/creationType.js (100%) rename js/src/ui/{Dialogs => -dialogs}/NewAccount/CreationType/index.js (100%) rename js/src/ui/{Dialogs => -dialogs}/NewAccount/ImportWallet/importWallet.js (100%) rename js/src/ui/{Dialogs => -dialogs}/NewAccount/ImportWallet/index.js (100%) rename js/src/ui/{Dialogs => -dialogs}/NewAccount/index.js (100%) rename js/src/ui/{Dialogs => -dialogs}/NewAccount/newAccount.js (100%) rename js/src/ui/{Dialogs => -dialogs}/NewAccount/style.css (100%) rename js/src/ui/{Dialogs => -dialogs}/Transfer/index.js (100%) rename js/src/ui/{Dialogs => -dialogs}/Transfer/transfer.js (100%) rename js/src/ui/{Dialogs => -dialogs}/index.js (100%) diff --git a/js/src/ui/Dialogs/FirstRun/Completed/completed.js b/js/src/ui/-dialogs/FirstRun/Completed/completed.js similarity index 100% rename from js/src/ui/Dialogs/FirstRun/Completed/completed.js rename to js/src/ui/-dialogs/FirstRun/Completed/completed.js diff --git a/js/src/ui/Dialogs/FirstRun/Completed/index.js b/js/src/ui/-dialogs/FirstRun/Completed/index.js similarity index 100% rename from js/src/ui/Dialogs/FirstRun/Completed/index.js rename to js/src/ui/-dialogs/FirstRun/Completed/index.js diff --git a/js/src/ui/Dialogs/FirstRun/CreateAccount/createAccount.js b/js/src/ui/-dialogs/FirstRun/CreateAccount/createAccount.js similarity index 100% rename from js/src/ui/Dialogs/FirstRun/CreateAccount/createAccount.js rename to js/src/ui/-dialogs/FirstRun/CreateAccount/createAccount.js diff --git a/js/src/ui/Dialogs/FirstRun/CreateAccount/index.js b/js/src/ui/-dialogs/FirstRun/CreateAccount/index.js similarity index 100% rename from js/src/ui/Dialogs/FirstRun/CreateAccount/index.js rename to js/src/ui/-dialogs/FirstRun/CreateAccount/index.js diff --git a/js/src/ui/Dialogs/FirstRun/RecoverAccount/index.js b/js/src/ui/-dialogs/FirstRun/RecoverAccount/index.js similarity index 100% rename from js/src/ui/Dialogs/FirstRun/RecoverAccount/index.js rename to js/src/ui/-dialogs/FirstRun/RecoverAccount/index.js diff --git a/js/src/ui/Dialogs/FirstRun/RecoverAccount/recoverAccount.js b/js/src/ui/-dialogs/FirstRun/RecoverAccount/recoverAccount.js similarity index 100% rename from js/src/ui/Dialogs/FirstRun/RecoverAccount/recoverAccount.js rename to js/src/ui/-dialogs/FirstRun/RecoverAccount/recoverAccount.js diff --git a/js/src/ui/Dialogs/FirstRun/Welcome/index.js b/js/src/ui/-dialogs/FirstRun/Welcome/index.js similarity index 100% rename from js/src/ui/Dialogs/FirstRun/Welcome/index.js rename to js/src/ui/-dialogs/FirstRun/Welcome/index.js diff --git a/js/src/ui/Dialogs/FirstRun/Welcome/welcome.js b/js/src/ui/-dialogs/FirstRun/Welcome/welcome.js similarity index 100% rename from js/src/ui/Dialogs/FirstRun/Welcome/welcome.js rename to js/src/ui/-dialogs/FirstRun/Welcome/welcome.js diff --git a/js/src/ui/Dialogs/FirstRun/firstRun.js b/js/src/ui/-dialogs/FirstRun/firstRun.js similarity index 100% rename from js/src/ui/Dialogs/FirstRun/firstRun.js rename to js/src/ui/-dialogs/FirstRun/firstRun.js diff --git a/js/src/ui/Dialogs/FirstRun/index.js b/js/src/ui/-dialogs/FirstRun/index.js similarity index 100% rename from js/src/ui/Dialogs/FirstRun/index.js rename to js/src/ui/-dialogs/FirstRun/index.js diff --git a/js/src/ui/Dialogs/FundAccount/fundAccount.js b/js/src/ui/-dialogs/FundAccount/fundAccount.js similarity index 100% rename from js/src/ui/Dialogs/FundAccount/fundAccount.js rename to js/src/ui/-dialogs/FundAccount/fundAccount.js diff --git a/js/src/ui/Dialogs/FundAccount/index.js b/js/src/ui/-dialogs/FundAccount/index.js similarity index 100% rename from js/src/ui/Dialogs/FundAccount/index.js rename to js/src/ui/-dialogs/FundAccount/index.js diff --git a/js/src/ui/Dialogs/NewAccount/AccountDetails/accountDetails.js b/js/src/ui/-dialogs/NewAccount/AccountDetails/accountDetails.js similarity index 100% rename from js/src/ui/Dialogs/NewAccount/AccountDetails/accountDetails.js rename to js/src/ui/-dialogs/NewAccount/AccountDetails/accountDetails.js diff --git a/js/src/ui/Dialogs/NewAccount/AccountDetails/index.js b/js/src/ui/-dialogs/NewAccount/AccountDetails/index.js similarity index 100% rename from js/src/ui/Dialogs/NewAccount/AccountDetails/index.js rename to js/src/ui/-dialogs/NewAccount/AccountDetails/index.js diff --git a/js/src/ui/Dialogs/NewAccount/CreateAccount/createAccount.js b/js/src/ui/-dialogs/NewAccount/CreateAccount/createAccount.js similarity index 100% rename from js/src/ui/Dialogs/NewAccount/CreateAccount/createAccount.js rename to js/src/ui/-dialogs/NewAccount/CreateAccount/createAccount.js diff --git a/js/src/ui/Dialogs/NewAccount/CreateAccount/index.js b/js/src/ui/-dialogs/NewAccount/CreateAccount/index.js similarity index 100% rename from js/src/ui/Dialogs/NewAccount/CreateAccount/index.js rename to js/src/ui/-dialogs/NewAccount/CreateAccount/index.js diff --git a/js/src/ui/Dialogs/NewAccount/CreationType/creationType.js b/js/src/ui/-dialogs/NewAccount/CreationType/creationType.js similarity index 100% rename from js/src/ui/Dialogs/NewAccount/CreationType/creationType.js rename to js/src/ui/-dialogs/NewAccount/CreationType/creationType.js diff --git a/js/src/ui/Dialogs/NewAccount/CreationType/index.js b/js/src/ui/-dialogs/NewAccount/CreationType/index.js similarity index 100% rename from js/src/ui/Dialogs/NewAccount/CreationType/index.js rename to js/src/ui/-dialogs/NewAccount/CreationType/index.js diff --git a/js/src/ui/Dialogs/NewAccount/ImportWallet/importWallet.js b/js/src/ui/-dialogs/NewAccount/ImportWallet/importWallet.js similarity index 100% rename from js/src/ui/Dialogs/NewAccount/ImportWallet/importWallet.js rename to js/src/ui/-dialogs/NewAccount/ImportWallet/importWallet.js diff --git a/js/src/ui/Dialogs/NewAccount/ImportWallet/index.js b/js/src/ui/-dialogs/NewAccount/ImportWallet/index.js similarity index 100% rename from js/src/ui/Dialogs/NewAccount/ImportWallet/index.js rename to js/src/ui/-dialogs/NewAccount/ImportWallet/index.js diff --git a/js/src/ui/Dialogs/NewAccount/index.js b/js/src/ui/-dialogs/NewAccount/index.js similarity index 100% rename from js/src/ui/Dialogs/NewAccount/index.js rename to js/src/ui/-dialogs/NewAccount/index.js diff --git a/js/src/ui/Dialogs/NewAccount/newAccount.js b/js/src/ui/-dialogs/NewAccount/newAccount.js similarity index 100% rename from js/src/ui/Dialogs/NewAccount/newAccount.js rename to js/src/ui/-dialogs/NewAccount/newAccount.js diff --git a/js/src/ui/Dialogs/NewAccount/style.css b/js/src/ui/-dialogs/NewAccount/style.css similarity index 100% rename from js/src/ui/Dialogs/NewAccount/style.css rename to js/src/ui/-dialogs/NewAccount/style.css diff --git a/js/src/ui/Dialogs/Transfer/index.js b/js/src/ui/-dialogs/Transfer/index.js similarity index 100% rename from js/src/ui/Dialogs/Transfer/index.js rename to js/src/ui/-dialogs/Transfer/index.js diff --git a/js/src/ui/Dialogs/Transfer/transfer.js b/js/src/ui/-dialogs/Transfer/transfer.js similarity index 100% rename from js/src/ui/Dialogs/Transfer/transfer.js rename to js/src/ui/-dialogs/Transfer/transfer.js diff --git a/js/src/ui/Dialogs/index.js b/js/src/ui/-dialogs/index.js similarity index 100% rename from js/src/ui/Dialogs/index.js rename to js/src/ui/-dialogs/index.js From 2e27fef7a0750d8bef134b7bc4ec24763b39fe17 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 12 Aug 2016 11:03:38 +0200 Subject: [PATCH 0012/1062] s/Dialogs/dialogs/ (completed rename) --- js/src/ui/{-dialogs => dialogs}/FirstRun/Completed/completed.js | 0 js/src/ui/{-dialogs => dialogs}/FirstRun/Completed/index.js | 0 .../{-dialogs => dialogs}/FirstRun/CreateAccount/createAccount.js | 0 js/src/ui/{-dialogs => dialogs}/FirstRun/CreateAccount/index.js | 0 js/src/ui/{-dialogs => dialogs}/FirstRun/RecoverAccount/index.js | 0 .../FirstRun/RecoverAccount/recoverAccount.js | 0 js/src/ui/{-dialogs => dialogs}/FirstRun/Welcome/index.js | 0 js/src/ui/{-dialogs => dialogs}/FirstRun/Welcome/welcome.js | 0 js/src/ui/{-dialogs => dialogs}/FirstRun/firstRun.js | 0 js/src/ui/{-dialogs => dialogs}/FirstRun/index.js | 0 js/src/ui/{-dialogs => dialogs}/FundAccount/fundAccount.js | 0 js/src/ui/{-dialogs => dialogs}/FundAccount/index.js | 0 .../NewAccount/AccountDetails/accountDetails.js | 0 .../ui/{-dialogs => dialogs}/NewAccount/AccountDetails/index.js | 0 .../NewAccount/CreateAccount/createAccount.js | 0 js/src/ui/{-dialogs => dialogs}/NewAccount/CreateAccount/index.js | 0 .../{-dialogs => dialogs}/NewAccount/CreationType/creationType.js | 0 js/src/ui/{-dialogs => dialogs}/NewAccount/CreationType/index.js | 0 .../{-dialogs => dialogs}/NewAccount/ImportWallet/importWallet.js | 0 js/src/ui/{-dialogs => dialogs}/NewAccount/ImportWallet/index.js | 0 js/src/ui/{-dialogs => dialogs}/NewAccount/index.js | 0 js/src/ui/{-dialogs => dialogs}/NewAccount/newAccount.js | 0 js/src/ui/{-dialogs => dialogs}/NewAccount/style.css | 0 js/src/ui/{-dialogs => dialogs}/Transfer/index.js | 0 js/src/ui/{-dialogs => dialogs}/Transfer/transfer.js | 0 js/src/ui/{-dialogs => dialogs}/index.js | 0 26 files changed, 0 insertions(+), 0 deletions(-) rename js/src/ui/{-dialogs => dialogs}/FirstRun/Completed/completed.js (100%) rename js/src/ui/{-dialogs => dialogs}/FirstRun/Completed/index.js (100%) rename js/src/ui/{-dialogs => dialogs}/FirstRun/CreateAccount/createAccount.js (100%) rename js/src/ui/{-dialogs => dialogs}/FirstRun/CreateAccount/index.js (100%) rename js/src/ui/{-dialogs => dialogs}/FirstRun/RecoverAccount/index.js (100%) rename js/src/ui/{-dialogs => dialogs}/FirstRun/RecoverAccount/recoverAccount.js (100%) rename js/src/ui/{-dialogs => dialogs}/FirstRun/Welcome/index.js (100%) rename js/src/ui/{-dialogs => dialogs}/FirstRun/Welcome/welcome.js (100%) rename js/src/ui/{-dialogs => dialogs}/FirstRun/firstRun.js (100%) rename js/src/ui/{-dialogs => dialogs}/FirstRun/index.js (100%) rename js/src/ui/{-dialogs => dialogs}/FundAccount/fundAccount.js (100%) rename js/src/ui/{-dialogs => dialogs}/FundAccount/index.js (100%) rename js/src/ui/{-dialogs => dialogs}/NewAccount/AccountDetails/accountDetails.js (100%) rename js/src/ui/{-dialogs => dialogs}/NewAccount/AccountDetails/index.js (100%) rename js/src/ui/{-dialogs => dialogs}/NewAccount/CreateAccount/createAccount.js (100%) rename js/src/ui/{-dialogs => dialogs}/NewAccount/CreateAccount/index.js (100%) rename js/src/ui/{-dialogs => dialogs}/NewAccount/CreationType/creationType.js (100%) rename js/src/ui/{-dialogs => dialogs}/NewAccount/CreationType/index.js (100%) rename js/src/ui/{-dialogs => dialogs}/NewAccount/ImportWallet/importWallet.js (100%) rename js/src/ui/{-dialogs => dialogs}/NewAccount/ImportWallet/index.js (100%) rename js/src/ui/{-dialogs => dialogs}/NewAccount/index.js (100%) rename js/src/ui/{-dialogs => dialogs}/NewAccount/newAccount.js (100%) rename js/src/ui/{-dialogs => dialogs}/NewAccount/style.css (100%) rename js/src/ui/{-dialogs => dialogs}/Transfer/index.js (100%) rename js/src/ui/{-dialogs => dialogs}/Transfer/transfer.js (100%) rename js/src/ui/{-dialogs => dialogs}/index.js (100%) diff --git a/js/src/ui/-dialogs/FirstRun/Completed/completed.js b/js/src/ui/dialogs/FirstRun/Completed/completed.js similarity index 100% rename from js/src/ui/-dialogs/FirstRun/Completed/completed.js rename to js/src/ui/dialogs/FirstRun/Completed/completed.js diff --git a/js/src/ui/-dialogs/FirstRun/Completed/index.js b/js/src/ui/dialogs/FirstRun/Completed/index.js similarity index 100% rename from js/src/ui/-dialogs/FirstRun/Completed/index.js rename to js/src/ui/dialogs/FirstRun/Completed/index.js diff --git a/js/src/ui/-dialogs/FirstRun/CreateAccount/createAccount.js b/js/src/ui/dialogs/FirstRun/CreateAccount/createAccount.js similarity index 100% rename from js/src/ui/-dialogs/FirstRun/CreateAccount/createAccount.js rename to js/src/ui/dialogs/FirstRun/CreateAccount/createAccount.js diff --git a/js/src/ui/-dialogs/FirstRun/CreateAccount/index.js b/js/src/ui/dialogs/FirstRun/CreateAccount/index.js similarity index 100% rename from js/src/ui/-dialogs/FirstRun/CreateAccount/index.js rename to js/src/ui/dialogs/FirstRun/CreateAccount/index.js diff --git a/js/src/ui/-dialogs/FirstRun/RecoverAccount/index.js b/js/src/ui/dialogs/FirstRun/RecoverAccount/index.js similarity index 100% rename from js/src/ui/-dialogs/FirstRun/RecoverAccount/index.js rename to js/src/ui/dialogs/FirstRun/RecoverAccount/index.js diff --git a/js/src/ui/-dialogs/FirstRun/RecoverAccount/recoverAccount.js b/js/src/ui/dialogs/FirstRun/RecoverAccount/recoverAccount.js similarity index 100% rename from js/src/ui/-dialogs/FirstRun/RecoverAccount/recoverAccount.js rename to js/src/ui/dialogs/FirstRun/RecoverAccount/recoverAccount.js diff --git a/js/src/ui/-dialogs/FirstRun/Welcome/index.js b/js/src/ui/dialogs/FirstRun/Welcome/index.js similarity index 100% rename from js/src/ui/-dialogs/FirstRun/Welcome/index.js rename to js/src/ui/dialogs/FirstRun/Welcome/index.js diff --git a/js/src/ui/-dialogs/FirstRun/Welcome/welcome.js b/js/src/ui/dialogs/FirstRun/Welcome/welcome.js similarity index 100% rename from js/src/ui/-dialogs/FirstRun/Welcome/welcome.js rename to js/src/ui/dialogs/FirstRun/Welcome/welcome.js diff --git a/js/src/ui/-dialogs/FirstRun/firstRun.js b/js/src/ui/dialogs/FirstRun/firstRun.js similarity index 100% rename from js/src/ui/-dialogs/FirstRun/firstRun.js rename to js/src/ui/dialogs/FirstRun/firstRun.js diff --git a/js/src/ui/-dialogs/FirstRun/index.js b/js/src/ui/dialogs/FirstRun/index.js similarity index 100% rename from js/src/ui/-dialogs/FirstRun/index.js rename to js/src/ui/dialogs/FirstRun/index.js diff --git a/js/src/ui/-dialogs/FundAccount/fundAccount.js b/js/src/ui/dialogs/FundAccount/fundAccount.js similarity index 100% rename from js/src/ui/-dialogs/FundAccount/fundAccount.js rename to js/src/ui/dialogs/FundAccount/fundAccount.js diff --git a/js/src/ui/-dialogs/FundAccount/index.js b/js/src/ui/dialogs/FundAccount/index.js similarity index 100% rename from js/src/ui/-dialogs/FundAccount/index.js rename to js/src/ui/dialogs/FundAccount/index.js diff --git a/js/src/ui/-dialogs/NewAccount/AccountDetails/accountDetails.js b/js/src/ui/dialogs/NewAccount/AccountDetails/accountDetails.js similarity index 100% rename from js/src/ui/-dialogs/NewAccount/AccountDetails/accountDetails.js rename to js/src/ui/dialogs/NewAccount/AccountDetails/accountDetails.js diff --git a/js/src/ui/-dialogs/NewAccount/AccountDetails/index.js b/js/src/ui/dialogs/NewAccount/AccountDetails/index.js similarity index 100% rename from js/src/ui/-dialogs/NewAccount/AccountDetails/index.js rename to js/src/ui/dialogs/NewAccount/AccountDetails/index.js diff --git a/js/src/ui/-dialogs/NewAccount/CreateAccount/createAccount.js b/js/src/ui/dialogs/NewAccount/CreateAccount/createAccount.js similarity index 100% rename from js/src/ui/-dialogs/NewAccount/CreateAccount/createAccount.js rename to js/src/ui/dialogs/NewAccount/CreateAccount/createAccount.js diff --git a/js/src/ui/-dialogs/NewAccount/CreateAccount/index.js b/js/src/ui/dialogs/NewAccount/CreateAccount/index.js similarity index 100% rename from js/src/ui/-dialogs/NewAccount/CreateAccount/index.js rename to js/src/ui/dialogs/NewAccount/CreateAccount/index.js diff --git a/js/src/ui/-dialogs/NewAccount/CreationType/creationType.js b/js/src/ui/dialogs/NewAccount/CreationType/creationType.js similarity index 100% rename from js/src/ui/-dialogs/NewAccount/CreationType/creationType.js rename to js/src/ui/dialogs/NewAccount/CreationType/creationType.js diff --git a/js/src/ui/-dialogs/NewAccount/CreationType/index.js b/js/src/ui/dialogs/NewAccount/CreationType/index.js similarity index 100% rename from js/src/ui/-dialogs/NewAccount/CreationType/index.js rename to js/src/ui/dialogs/NewAccount/CreationType/index.js diff --git a/js/src/ui/-dialogs/NewAccount/ImportWallet/importWallet.js b/js/src/ui/dialogs/NewAccount/ImportWallet/importWallet.js similarity index 100% rename from js/src/ui/-dialogs/NewAccount/ImportWallet/importWallet.js rename to js/src/ui/dialogs/NewAccount/ImportWallet/importWallet.js diff --git a/js/src/ui/-dialogs/NewAccount/ImportWallet/index.js b/js/src/ui/dialogs/NewAccount/ImportWallet/index.js similarity index 100% rename from js/src/ui/-dialogs/NewAccount/ImportWallet/index.js rename to js/src/ui/dialogs/NewAccount/ImportWallet/index.js diff --git a/js/src/ui/-dialogs/NewAccount/index.js b/js/src/ui/dialogs/NewAccount/index.js similarity index 100% rename from js/src/ui/-dialogs/NewAccount/index.js rename to js/src/ui/dialogs/NewAccount/index.js diff --git a/js/src/ui/-dialogs/NewAccount/newAccount.js b/js/src/ui/dialogs/NewAccount/newAccount.js similarity index 100% rename from js/src/ui/-dialogs/NewAccount/newAccount.js rename to js/src/ui/dialogs/NewAccount/newAccount.js diff --git a/js/src/ui/-dialogs/NewAccount/style.css b/js/src/ui/dialogs/NewAccount/style.css similarity index 100% rename from js/src/ui/-dialogs/NewAccount/style.css rename to js/src/ui/dialogs/NewAccount/style.css diff --git a/js/src/ui/-dialogs/Transfer/index.js b/js/src/ui/dialogs/Transfer/index.js similarity index 100% rename from js/src/ui/-dialogs/Transfer/index.js rename to js/src/ui/dialogs/Transfer/index.js diff --git a/js/src/ui/-dialogs/Transfer/transfer.js b/js/src/ui/dialogs/Transfer/transfer.js similarity index 100% rename from js/src/ui/-dialogs/Transfer/transfer.js rename to js/src/ui/dialogs/Transfer/transfer.js diff --git a/js/src/ui/-dialogs/index.js b/js/src/ui/dialogs/index.js similarity index 100% rename from js/src/ui/-dialogs/index.js rename to js/src/ui/dialogs/index.js From 2a0371aa3fb750accaf89d9d9f15557e082631dd Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 12 Aug 2016 11:03:48 +0200 Subject: [PATCH 0013/1062] s/Dialogs/dialogs/ --- js/src/ui/Accounts/accounts.js | 2 +- js/src/ui/Application/application.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/ui/Accounts/accounts.js b/js/src/ui/Accounts/accounts.js index c106b2d686c..d396aa3c9b7 100644 --- a/js/src/ui/Accounts/accounts.js +++ b/js/src/ui/Accounts/accounts.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import AccountSummary from './AccountSummary'; import Actions from './Actions'; -import { FundAccount, NewAccount, Transfer } from '../Dialogs'; +import { FundAccount, NewAccount, Transfer } from '../dialogs'; import styles from './style.css'; diff --git a/js/src/ui/Application/application.js b/js/src/ui/Application/application.js index ad6de17506a..92b21797813 100644 --- a/js/src/ui/Application/application.js +++ b/js/src/ui/Application/application.js @@ -6,7 +6,7 @@ import lightBaseTheme from 'material-ui/styles/baseThemes/lightBaseTheme'; import Api from '../../api'; -import { FirstRun } from '../Dialogs'; +import { FirstRun } from '../dialogs'; import Status from './Status'; import TabBar from './TabBar'; From d29a7803cedf5b3261321c7ef88b2c64026f46f7 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 12 Aug 2016 11:12:56 +0200 Subject: [PATCH 0014/1062] move all top-level views to views/ --- js/src/app.js | 10 +++++----- js/src/ui/{ => views}/Account/Actions/actions.js | 0 js/src/ui/{ => views}/Account/Actions/index.js | 0 js/src/ui/{ => views}/Account/account.js | 8 ++++---- js/src/ui/{ => views}/Account/index.js | 0 .../Accounts/AccountSummary/accountSummary.js | 6 +++--- js/src/ui/{ => views}/Accounts/AccountSummary/index.js | 0 js/src/ui/{ => views}/Accounts/Actions/actions.js | 0 js/src/ui/{ => views}/Accounts/Actions/index.js | 0 js/src/ui/{ => views}/Accounts/accounts.js | 2 +- js/src/ui/{ => views}/Accounts/index.js | 0 js/src/ui/{ => views}/Accounts/style.css | 0 js/src/ui/{ => views}/Application/Status/index.js | 0 js/src/ui/{ => views}/Application/Status/status.js | 0 js/src/ui/{ => views}/Application/Status/style.css | 0 js/src/ui/{ => views}/Application/TabBar/index.js | 0 js/src/ui/{ => views}/Application/TabBar/tabBar.js | 0 js/src/ui/{ => views}/Application/application.js | 4 ++-- js/src/ui/{ => views}/Application/index.js | 0 js/src/ui/{ => views}/Application/style.css | 0 js/src/ui/{ => views}/Apps/apps.js | 2 +- js/src/ui/{ => views}/Apps/index.js | 0 js/src/ui/{ => views}/Tokens/index.js | 0 js/src/ui/{ => views}/Tokens/tokens.js | 2 +- 24 files changed, 17 insertions(+), 17 deletions(-) rename js/src/ui/{ => views}/Account/Actions/actions.js (100%) rename js/src/ui/{ => views}/Account/Actions/index.js (100%) rename js/src/ui/{ => views}/Account/account.js (92%) rename js/src/ui/{ => views}/Account/index.js (100%) rename js/src/ui/{ => views}/Accounts/AccountSummary/accountSummary.js (87%) rename js/src/ui/{ => views}/Accounts/AccountSummary/index.js (100%) rename js/src/ui/{ => views}/Accounts/Actions/actions.js (100%) rename js/src/ui/{ => views}/Accounts/Actions/index.js (100%) rename js/src/ui/{ => views}/Accounts/accounts.js (97%) rename js/src/ui/{ => views}/Accounts/index.js (100%) rename js/src/ui/{ => views}/Accounts/style.css (100%) rename js/src/ui/{ => views}/Application/Status/index.js (100%) rename js/src/ui/{ => views}/Application/Status/status.js (100%) rename js/src/ui/{ => views}/Application/Status/style.css (100%) rename js/src/ui/{ => views}/Application/TabBar/index.js (100%) rename js/src/ui/{ => views}/Application/TabBar/tabBar.js (100%) rename js/src/ui/{ => views}/Application/application.js (96%) rename js/src/ui/{ => views}/Application/index.js (100%) rename js/src/ui/{ => views}/Application/style.css (100%) rename js/src/ui/{ => views}/Apps/apps.js (89%) rename js/src/ui/{ => views}/Apps/index.js (100%) rename js/src/ui/{ => views}/Tokens/index.js (100%) rename js/src/ui/{ => views}/Tokens/tokens.js (91%) diff --git a/js/src/app.js b/js/src/app.js index 1ac721e97ae..c4bf44416d2 100644 --- a/js/src/app.js +++ b/js/src/app.js @@ -12,11 +12,11 @@ injectTapEventPlugin(); import { Redirect, Router, Route, useRouterHistory } from 'react-router'; import { createHashHistory } from 'history'; -import Accounts from './ui/Accounts'; -import Account from './ui/Account'; -import Application from './ui/Application'; -import Apps from './ui/Apps'; -import Tokens from './ui/Tokens'; +import Accounts from './ui/views/Accounts'; +import Account from './ui/views/Account'; +import Application from './ui/views/Application'; +import Apps from './ui/views/Apps'; +import Tokens from './ui/views/Tokens'; import styles from './reset.css'; diff --git a/js/src/ui/Account/Actions/actions.js b/js/src/ui/views/Account/Actions/actions.js similarity index 100% rename from js/src/ui/Account/Actions/actions.js rename to js/src/ui/views/Account/Actions/actions.js diff --git a/js/src/ui/Account/Actions/index.js b/js/src/ui/views/Account/Actions/index.js similarity index 100% rename from js/src/ui/Account/Actions/index.js rename to js/src/ui/views/Account/Actions/index.js diff --git a/js/src/ui/Account/account.js b/js/src/ui/views/Account/account.js similarity index 92% rename from js/src/ui/Account/account.js rename to js/src/ui/views/Account/account.js index 28fe2ce9364..c8f11e2331f 100644 --- a/js/src/ui/Account/account.js +++ b/js/src/ui/views/Account/account.js @@ -3,10 +3,10 @@ import React, { Component, PropTypes } from 'react'; import { TextField } from 'material-ui'; import { CardText } from 'material-ui/Card'; -import Balances from '../Balances'; -import Container from '../Container'; -import Form, { FormWrap } from '../Form'; -import IdentityIcon from '../IdentityIcon'; +import Balances from '../../Balances'; +import Container from '../../Container'; +import Form, { FormWrap } from '../../Form'; +import IdentityIcon from '../../IdentityIcon'; import Actions from './actions'; diff --git a/js/src/ui/Account/index.js b/js/src/ui/views/Account/index.js similarity index 100% rename from js/src/ui/Account/index.js rename to js/src/ui/views/Account/index.js diff --git a/js/src/ui/Accounts/AccountSummary/accountSummary.js b/js/src/ui/views/Accounts/AccountSummary/accountSummary.js similarity index 87% rename from js/src/ui/Accounts/AccountSummary/accountSummary.js rename to js/src/ui/views/Accounts/AccountSummary/accountSummary.js index 5b479db2313..cb902287f85 100644 --- a/js/src/ui/Accounts/AccountSummary/accountSummary.js +++ b/js/src/ui/views/Accounts/AccountSummary/accountSummary.js @@ -3,9 +3,9 @@ import { Link } from 'react-router'; import { CardText, CardTitle } from 'material-ui/Card'; -import Balances from '../../Balances'; -import Container from '../../Container'; -import IdentityIcon from '../../IdentityIcon'; +import Balances from '../../../Balances'; +import Container from '../../../Container'; +import IdentityIcon from '../../../IdentityIcon'; const TITLE_STYLE = { textTransform: 'uppercase', paddingBottom: 0 }; diff --git a/js/src/ui/Accounts/AccountSummary/index.js b/js/src/ui/views/Accounts/AccountSummary/index.js similarity index 100% rename from js/src/ui/Accounts/AccountSummary/index.js rename to js/src/ui/views/Accounts/AccountSummary/index.js diff --git a/js/src/ui/Accounts/Actions/actions.js b/js/src/ui/views/Accounts/Actions/actions.js similarity index 100% rename from js/src/ui/Accounts/Actions/actions.js rename to js/src/ui/views/Accounts/Actions/actions.js diff --git a/js/src/ui/Accounts/Actions/index.js b/js/src/ui/views/Accounts/Actions/index.js similarity index 100% rename from js/src/ui/Accounts/Actions/index.js rename to js/src/ui/views/Accounts/Actions/index.js diff --git a/js/src/ui/Accounts/accounts.js b/js/src/ui/views/Accounts/accounts.js similarity index 97% rename from js/src/ui/Accounts/accounts.js rename to js/src/ui/views/Accounts/accounts.js index d396aa3c9b7..591ad2d277c 100644 --- a/js/src/ui/Accounts/accounts.js +++ b/js/src/ui/views/Accounts/accounts.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import AccountSummary from './AccountSummary'; import Actions from './Actions'; -import { FundAccount, NewAccount, Transfer } from '../dialogs'; +import { FundAccount, NewAccount, Transfer } from '../../dialogs'; import styles from './style.css'; diff --git a/js/src/ui/Accounts/index.js b/js/src/ui/views/Accounts/index.js similarity index 100% rename from js/src/ui/Accounts/index.js rename to js/src/ui/views/Accounts/index.js diff --git a/js/src/ui/Accounts/style.css b/js/src/ui/views/Accounts/style.css similarity index 100% rename from js/src/ui/Accounts/style.css rename to js/src/ui/views/Accounts/style.css diff --git a/js/src/ui/Application/Status/index.js b/js/src/ui/views/Application/Status/index.js similarity index 100% rename from js/src/ui/Application/Status/index.js rename to js/src/ui/views/Application/Status/index.js diff --git a/js/src/ui/Application/Status/status.js b/js/src/ui/views/Application/Status/status.js similarity index 100% rename from js/src/ui/Application/Status/status.js rename to js/src/ui/views/Application/Status/status.js diff --git a/js/src/ui/Application/Status/style.css b/js/src/ui/views/Application/Status/style.css similarity index 100% rename from js/src/ui/Application/Status/style.css rename to js/src/ui/views/Application/Status/style.css diff --git a/js/src/ui/Application/TabBar/index.js b/js/src/ui/views/Application/TabBar/index.js similarity index 100% rename from js/src/ui/Application/TabBar/index.js rename to js/src/ui/views/Application/TabBar/index.js diff --git a/js/src/ui/Application/TabBar/tabBar.js b/js/src/ui/views/Application/TabBar/tabBar.js similarity index 100% rename from js/src/ui/Application/TabBar/tabBar.js rename to js/src/ui/views/Application/TabBar/tabBar.js diff --git a/js/src/ui/Application/application.js b/js/src/ui/views/Application/application.js similarity index 96% rename from js/src/ui/Application/application.js rename to js/src/ui/views/Application/application.js index 92b21797813..5a10fee956f 100644 --- a/js/src/ui/Application/application.js +++ b/js/src/ui/views/Application/application.js @@ -4,9 +4,9 @@ import getMuiTheme from 'material-ui/styles/getMuiTheme'; import darkBaseTheme from 'material-ui/styles/baseThemes/darkBaseTheme'; import lightBaseTheme from 'material-ui/styles/baseThemes/lightBaseTheme'; -import Api from '../../api'; +import Api from '../../../api'; -import { FirstRun } from '../dialogs'; +import { FirstRun } from '../../dialogs'; import Status from './Status'; import TabBar from './TabBar'; diff --git a/js/src/ui/Application/index.js b/js/src/ui/views/Application/index.js similarity index 100% rename from js/src/ui/Application/index.js rename to js/src/ui/views/Application/index.js diff --git a/js/src/ui/Application/style.css b/js/src/ui/views/Application/style.css similarity index 100% rename from js/src/ui/Application/style.css rename to js/src/ui/views/Application/style.css diff --git a/js/src/ui/Apps/apps.js b/js/src/ui/views/Apps/apps.js similarity index 89% rename from js/src/ui/Apps/apps.js rename to js/src/ui/views/Apps/apps.js index 6e17859eca1..2146caec55c 100644 --- a/js/src/ui/Apps/apps.js +++ b/js/src/ui/views/Apps/apps.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import { CardText } from 'material-ui/Card'; -import Container from '../Container'; +import Container from '../../Container'; export default class Apps extends Component { render () { diff --git a/js/src/ui/Apps/index.js b/js/src/ui/views/Apps/index.js similarity index 100% rename from js/src/ui/Apps/index.js rename to js/src/ui/views/Apps/index.js diff --git a/js/src/ui/Tokens/index.js b/js/src/ui/views/Tokens/index.js similarity index 100% rename from js/src/ui/Tokens/index.js rename to js/src/ui/views/Tokens/index.js diff --git a/js/src/ui/Tokens/tokens.js b/js/src/ui/views/Tokens/tokens.js similarity index 91% rename from js/src/ui/Tokens/tokens.js rename to js/src/ui/views/Tokens/tokens.js index b25941c8691..dc7641a2c48 100644 --- a/js/src/ui/Tokens/tokens.js +++ b/js/src/ui/views/Tokens/tokens.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import { CardText } from 'material-ui/Card'; -import Container from '../Container'; +import Container from '../../Container'; export default class Tokens extends Component { render () { From 534993bf552e5c461c63ffa4a31e933d122b639c Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 12 Aug 2016 11:58:22 +0200 Subject: [PATCH 0015/1062] update container style padding (consistency) --- js/src/ui/Container/style.css | 2 +- js/src/ui/views/Accounts/style.css | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/js/src/ui/Container/style.css b/js/src/ui/Container/style.css index 52e1ac974f6..da4203f7329 100644 --- a/js/src/ui/Container/style.css +++ b/js/src/ui/Container/style.css @@ -1,3 +1,3 @@ .padded { - padding: 1em 0.5em 0 0.5em; + padding: 1em 1em 0 1em; } diff --git a/js/src/ui/views/Accounts/style.css b/js/src/ui/views/Accounts/style.css index a79f61a9509..28807803975 100644 --- a/js/src/ui/views/Accounts/style.css +++ b/js/src/ui/views/Accounts/style.css @@ -1,9 +1,17 @@ +.accounts { + display: flex; + flex-wrap: wrap; +} + .account { flex: 0 1 50%; width: 50%; } -.accounts { - display: flex; - flex-wrap: wrap; +.account:nth-child(odd)>div { + padding-right: 0.5em !important; +} + +.account:nth-child(even)>div { + padding-left: 0.5em !important; } From 372dc42af72a39be109c7224a52b9edf5a9c716e Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 12 Aug 2016 11:58:55 +0200 Subject: [PATCH 0016/1062] move fund & transfer dialogs to Account view only --- js/src/ui/views/Account/Actions/actions.js | 11 +++++-- js/src/ui/views/Account/account.js | 32 +++++++++++++++++++-- js/src/ui/views/Accounts/Actions/actions.js | 16 +---------- js/src/ui/views/Accounts/accounts.js | 32 ++------------------- 4 files changed, 42 insertions(+), 49 deletions(-) diff --git a/js/src/ui/views/Account/Actions/actions.js b/js/src/ui/views/Account/Actions/actions.js index 0f3cb1c9dd0..b8c4c361af5 100644 --- a/js/src/ui/views/Account/Actions/actions.js +++ b/js/src/ui/views/Account/Actions/actions.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import React, { Component, PropTypes } from 'react'; import { FlatButton } from 'material-ui'; import { Toolbar, ToolbarGroup } from 'material-ui/Toolbar'; @@ -6,6 +6,11 @@ import ActionAccountBalance from 'material-ui/svg-icons/action/account-balance'; import ContentSend from 'material-ui/svg-icons/content/send'; export default class Actions extends Component { + static propTypes = { + onTransfer: PropTypes.func.isRequired, + onFundAccount: PropTypes.func.isRequired + } + render () { return ( @@ -14,12 +19,12 @@ export default class Actions extends Component { icon={ } label='transfer' primary - onTouchTap={ this.onBtnClose } /> + onTouchTap={ this.props.onTransfer } /> } label='fund account' primary - onTouchTap={ this.onBtnClose } /> + onTouchTap={ this.props.onFundAccount } /> ); diff --git a/js/src/ui/views/Account/account.js b/js/src/ui/views/Account/account.js index c8f11e2331f..a8153e490e3 100644 --- a/js/src/ui/views/Account/account.js +++ b/js/src/ui/views/Account/account.js @@ -3,6 +3,8 @@ import React, { Component, PropTypes } from 'react'; import { TextField } from 'material-ui'; import { CardText } from 'material-ui/Card'; +import { FundAccount, Transfer } from '../../dialogs'; + import Balances from '../../Balances'; import Container from '../../Container'; import Form, { FormWrap } from '../../Form'; @@ -20,7 +22,9 @@ export default class Account extends Component { } state = { - name: 'Unnamed' + name: 'Unnamed', + fundDialog: false, + transferDialog: false } componentWillMount () { @@ -32,7 +36,15 @@ export default class Account extends Component { return (
- + + + @@ -65,6 +77,22 @@ export default class Account extends Component { ); } + onFundAccountClick = () => { + this.setState({ fundDialog: !this.state.fundDialog }); + } + + onFundAccountClose = () => { + this.onFundAccountClick(); + } + + onTransferClick = () => { + this.setState({ transferDialog: !this.state.transferDialog }); + } + + onTransferClose = () => { + this.onTransferClick(); + } + onEditName = (event) => { const api = this.context.api; const name = event.target.value; diff --git a/js/src/ui/views/Accounts/Actions/actions.js b/js/src/ui/views/Accounts/Actions/actions.js index 6ac941c30df..78ee9b8d059 100644 --- a/js/src/ui/views/Accounts/Actions/actions.js +++ b/js/src/ui/views/Accounts/Actions/actions.js @@ -2,36 +2,22 @@ import React, { Component, PropTypes } from 'react'; import { FlatButton } from 'material-ui'; import { Toolbar, ToolbarGroup } from 'material-ui/Toolbar'; -import ActionAccountBalance from 'material-ui/svg-icons/action/account-balance'; import ContentAdd from 'material-ui/svg-icons/content/add'; -import ContentSend from 'material-ui/svg-icons/content/send'; export default class Actions extends Component { static propTypes = { - onTransfer: PropTypes.func.isRequired, - onNewAccount: PropTypes.func.isRequired, - onFundAccount: PropTypes.func.isRequired + onNewAccount: PropTypes.func.isRequired } render () { return ( - } - label='transfer' - primary - onTouchTap={ this.props.onTransfer } /> } label='new account' primary onTouchTap={ this.props.onNewAccount } /> - } - label='fund account' - primary - onTouchTap={ this.props.onFundAccount } /> ); diff --git a/js/src/ui/views/Accounts/accounts.js b/js/src/ui/views/Accounts/accounts.js index 591ad2d277c..76ac92b31b1 100644 --- a/js/src/ui/views/Accounts/accounts.js +++ b/js/src/ui/views/Accounts/accounts.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import AccountSummary from './AccountSummary'; import Actions from './Actions'; -import { FundAccount, NewAccount, Transfer } from '../../dialogs'; +import { NewAccount } from '../../dialogs'; import styles from './style.css'; @@ -13,9 +13,7 @@ export default class Accounts extends Component { state = { accounts: [], - fundDialog: false, - newDialog: false, - transferDialog: false + newDialog: false } componentWillMount () { @@ -25,20 +23,12 @@ export default class Accounts extends Component { render () { return (
- - + onNewAccount={ this.onNewAccountClick } />
{ this.renderAccounts() }
@@ -63,14 +53,6 @@ export default class Accounts extends Component { }); } - onFundAccountClick = () => { - this.setState({ fundDialog: !this.state.fundDialog }); - } - - onFundAccountClose = () => { - this.onFundAccountClick(); - } - onNewAccountClick = () => { this.setState({ newDialog: !this.state.newDialog }); } @@ -83,14 +65,6 @@ export default class Accounts extends Component { this.retrieveAccounts(); } - onTransferClick = () => { - this.setState({ transferDialog: !this.state.transferDialog }); - } - - onTransferClose = () => { - this.onTransferClick(); - } - retrieveAccounts () { const api = this.context.api; From a111a26cb558c76cb170dc52d2cbfb547040bb57 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 12 Aug 2016 12:07:53 +0200 Subject: [PATCH 0017/1062] parent update callback consistency --- .../dialogs/NewAccount/CreateAccount/createAccount.js | 10 +++++----- .../ui/dialogs/NewAccount/ImportWallet/importWallet.js | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/js/src/ui/dialogs/NewAccount/CreateAccount/createAccount.js b/js/src/ui/dialogs/NewAccount/CreateAccount/createAccount.js index e028b0a4a07..effbdf7050b 100644 --- a/js/src/ui/dialogs/NewAccount/CreateAccount/createAccount.js +++ b/js/src/ui/dialogs/NewAccount/CreateAccount/createAccount.js @@ -159,7 +159,7 @@ export default class CreateAccount extends Component { }); } - passChanges = () => { + updateParent = () => { this.props.onChange(this.state.isValidName && this.state.isValidPass, { address: this.state.selectedAddress, name: this.state.accountName, @@ -177,7 +177,7 @@ export default class CreateAccount extends Component { this.setState({ selectedAddress: address - }, this.passChanges); + }, this.updateParent); } onEditAccountName = (event) => { @@ -187,7 +187,7 @@ export default class CreateAccount extends Component { this.setState({ accountName: value, isValidName: valid - }, this.passChanges); + }, this.updateParent); } onEditPassword1 = (event) => { @@ -197,7 +197,7 @@ export default class CreateAccount extends Component { this.setState({ password1: value, isValidPass: valid - }, this.passChanges); + }, this.updateParent); } onEditPassword2 = (event) => { @@ -207,6 +207,6 @@ export default class CreateAccount extends Component { this.setState({ password2: value, isValidPass: valid - }, this.passChanges); + }, this.updateParent); } } diff --git a/js/src/ui/dialogs/NewAccount/ImportWallet/importWallet.js b/js/src/ui/dialogs/NewAccount/ImportWallet/importWallet.js index 2e2f5d7aea4..c11759a140b 100644 --- a/js/src/ui/dialogs/NewAccount/ImportWallet/importWallet.js +++ b/js/src/ui/dialogs/NewAccount/ImportWallet/importWallet.js @@ -89,7 +89,7 @@ export default class ImportWallet extends Component { this.setState({ walletJson: event.target.result, isValidFile: true - }, this.passChanges); + }, this.updateParent); }; reader.readAsText(el.files[0]); } @@ -97,14 +97,14 @@ export default class ImportWallet extends Component { this.setState({ walletFile: el.value, isValidFile: false - }, this.passChanges); + }, this.updateParent); } openFileDialog = () => { ReactDOM.findDOMNode(this.refs.fileUpload).click(); } - passChanges = () => { + updateParent = () => { const valid = this.state.isValidName && this.state.isValidPass && this.state.isValidFile; this.props.onChange(valid, { @@ -122,7 +122,7 @@ export default class ImportWallet extends Component { this.setState({ accountName: value, isValidName: valid - }, this.passChanges); + }, this.updateParent); } onEditPassword = (event) => { @@ -132,6 +132,6 @@ export default class ImportWallet extends Component { this.setState({ password: value, isValidPass: valid - }, this.passChanges); + }, this.updateParent); } } From c3c5ef6abde276ebf144af1ebb56dcee1b24cb0f Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 12 Aug 2016 12:17:32 +0200 Subject: [PATCH 0018/1062] remove C:\fakepath\ as added by the browser --- js/src/ui/dialogs/NewAccount/ImportWallet/importWallet.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/ui/dialogs/NewAccount/ImportWallet/importWallet.js b/js/src/ui/dialogs/NewAccount/ImportWallet/importWallet.js index c11759a140b..70ef92352e6 100644 --- a/js/src/ui/dialogs/NewAccount/ImportWallet/importWallet.js +++ b/js/src/ui/dialogs/NewAccount/ImportWallet/importWallet.js @@ -95,7 +95,7 @@ export default class ImportWallet extends Component { } this.setState({ - walletFile: el.value, + walletFile: el.value.replace('C:\\fakepath\\', ''), isValidFile: false }, this.updateParent); } From b35e3d111cc75274a29b7e4f5a9e6ec9e2e7f7bc Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 12 Aug 2016 12:19:51 +0200 Subject: [PATCH 0019/1062] pass origin address through to fund & transfer --- js/src/ui/dialogs/FundAccount/fundAccount.js | 1 + js/src/ui/views/Account/account.js | 2 ++ 2 files changed, 3 insertions(+) diff --git a/js/src/ui/dialogs/FundAccount/fundAccount.js b/js/src/ui/dialogs/FundAccount/fundAccount.js index 0c474df0f09..d61bd4b4686 100644 --- a/js/src/ui/dialogs/FundAccount/fundAccount.js +++ b/js/src/ui/dialogs/FundAccount/fundAccount.js @@ -9,6 +9,7 @@ const STAGE_NAMES = ['fund account']; export default class FundAccount extends Component { static propTypes = { + address: PropTypes.string.isRequired, visible: PropTypes.bool.isRequired, onClose: PropTypes.func } diff --git a/js/src/ui/views/Account/account.js b/js/src/ui/views/Account/account.js index a8153e490e3..aeea2fbd017 100644 --- a/js/src/ui/views/Account/account.js +++ b/js/src/ui/views/Account/account.js @@ -37,9 +37,11 @@ export default class Account extends Component { return (
Date: Fri, 12 Aug 2016 14:19:23 +0200 Subject: [PATCH 0020/1062] basic initial transfer dialog fields --- js/src/ui/dialogs/Transfer/Details/details.js | 153 ++++++++++++++++++ js/src/ui/dialogs/Transfer/Details/index.js | 1 + js/src/ui/dialogs/Transfer/Details/style.css | 11 ++ js/src/ui/dialogs/Transfer/transfer.js | 53 ++++-- 4 files changed, 209 insertions(+), 9 deletions(-) create mode 100644 js/src/ui/dialogs/Transfer/Details/details.js create mode 100644 js/src/ui/dialogs/Transfer/Details/index.js create mode 100644 js/src/ui/dialogs/Transfer/Details/style.css diff --git a/js/src/ui/dialogs/Transfer/Details/details.js b/js/src/ui/dialogs/Transfer/Details/details.js new file mode 100644 index 00000000000..ba4a3795b38 --- /dev/null +++ b/js/src/ui/dialogs/Transfer/Details/details.js @@ -0,0 +1,153 @@ +import React, { Component, PropTypes } from 'react'; +import BigNumber from 'bignumber.js'; +import { Checkbox, TextField } from 'material-ui'; + +import Api from '../../../../api'; +import Form from '../../../Form'; + +import styles from './style.css'; + +const DEFAULT_GAS = '21000'; + +const CHECK_STYLE = { + position: 'absolute', + bottom: '8px', + left: '1em' +}; + +export default class Details extends Component { + static contextTypes = { + api: PropTypes.object.isRequired + } + + static propTypes = { + address: PropTypes.string.isRequired, + onChange: PropTypes.func.isRequired + } + + state = { + recipient: '', + amount: 0.0, + amountFull: false, + amountGas: DEFAULT_GAS, + amountTotal: 0.0, + gasprice: 0, + isValid: false + } + + componentDidMount () { + this.getDefaults(); + } + + render () { + return ( +
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+ + ); + } + + updateParent = () => { + this.props.onChange(this.state.isValid); + } + + onCheckFullAmount = (event) => { + this.setState({ + amountFull: !this.state.amountFull + }); + } + + onEditAmount = (event) => { + const value = event.target.value; + + this.setState({ + amount: value + }, this.calculateTotals); + } + + onEditGas = (event) => { + const value = event.target.value; + + this.setState({ + amount: value + }, this.calculateTotals); + } + + onEditRecipient = (event) => { + const value = event.target.value; + + this.setState({ + recipient: value, + isValid: false + }, this.calculateTotals); + } + + calculateTotals = () => { + const gas = new BigNumber(this.state.gasprice).mul(new BigNumber(this.state.amountGas || 0)); + const amount = Api.format.toWei(this.state.amount || 0); + const total = Api.format.fromWei(amount.plus(gas)); + + this.setState({ + amountTotal: total.toNumber() + }, this.updateParent); + } + + getDefaults = () => { + const api = this.context.api; + + api.eth + .gasPrice() + .then((gasprice) => { + this.setState({ + gasprice: gasprice.toString() + }, this.calculateTotals); + }); + } +} diff --git a/js/src/ui/dialogs/Transfer/Details/index.js b/js/src/ui/dialogs/Transfer/Details/index.js new file mode 100644 index 00000000000..6a9e0f60aa9 --- /dev/null +++ b/js/src/ui/dialogs/Transfer/Details/index.js @@ -0,0 +1 @@ +export default from './details'; diff --git a/js/src/ui/dialogs/Transfer/Details/style.css b/js/src/ui/dialogs/Transfer/Details/style.css new file mode 100644 index 00000000000..0419e25a87e --- /dev/null +++ b/js/src/ui/dialogs/Transfer/Details/style.css @@ -0,0 +1,11 @@ +.columns { + display: flex; + flex-wrap: wrap; + position: relative; +} + +.columns>div { + flex: 0 1 50%; + width: 50%; + position: relative; +} diff --git a/js/src/ui/dialogs/Transfer/transfer.js b/js/src/ui/dialogs/Transfer/transfer.js index 16f078ea42c..eea76ef4a3b 100644 --- a/js/src/ui/dialogs/Transfer/transfer.js +++ b/js/src/ui/dialogs/Transfer/transfer.js @@ -1,20 +1,24 @@ import React, { Component, PropTypes } from 'react'; - import { FlatButton } from 'material-ui'; import ContentClear from 'material-ui/svg-icons/content/clear'; +import NavigationArrowForward from 'material-ui/svg-icons/navigation/arrow-forward'; import Overlay from '../../Overlay'; -const STAGE_NAMES = ['transfer']; +import Details from './Details'; + +const STAGE_NAMES = ['transfer details', 'verify transaction', 'transaction receipt']; export default class Transfer extends Component { static propTypes = { + address: PropTypes.string.isRequired, visible: PropTypes.bool.isRequired, onClose: PropTypes.func } state = { - stage: 0 + stage: 0, + isValid: false } render () { @@ -24,21 +28,52 @@ export default class Transfer extends Component { current={ this.state.stage } steps={ STAGE_NAMES } visible={ this.props.visible }> -
- In progress funds transfer -
+ { this.renderPage() } ); } + renderPage () { + switch (this.state.stage) { + case 0: + return ( +
+ ); + } + } + renderDialogActions () { - return ( + return [ } label='Cancel' primary - onTouchTap={ this.onClose } /> - ); + onTouchTap={ this.onClose } />, + } + label='Next' + primary + onTouchTap={ this.onNext } /> + ]; + } + + onNext = () => { + this.setState({ + stage: this.state.stage + 1 + }); + } + + onPrev = () => { + this.setState({ + stage: this.state.stage - 1 + }); + } + + onChangeDetails = (valid, details) => { + } onClose = () => { From 4112f75157e6945f9208f5c1e032a4b3ac3f0c00 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 12 Aug 2016 14:36:38 +0200 Subject: [PATCH 0021/1062] consistency in label & hint naming --- .../NewAccount/AccountDetails/accountDetails.js | 8 ++++---- .../NewAccount/CreateAccount/createAccount.js | 12 ++++++------ .../dialogs/NewAccount/ImportWallet/importWallet.js | 12 ++++++------ js/src/ui/dialogs/Transfer/transfer.js | 2 +- js/src/ui/views/Account/account.js | 8 ++++---- 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/js/src/ui/dialogs/NewAccount/AccountDetails/accountDetails.js b/js/src/ui/dialogs/NewAccount/AccountDetails/accountDetails.js index 87d1845b642..657cfe6080b 100644 --- a/js/src/ui/dialogs/NewAccount/AccountDetails/accountDetails.js +++ b/js/src/ui/dialogs/NewAccount/AccountDetails/accountDetails.js @@ -31,8 +31,8 @@ export default class RecoverAccount extends Component { @@ -40,8 +40,8 @@ export default class RecoverAccount extends Component { diff --git a/js/src/ui/dialogs/NewAccount/CreateAccount/createAccount.js b/js/src/ui/dialogs/NewAccount/CreateAccount/createAccount.js index effbdf7050b..07c28e71d30 100644 --- a/js/src/ui/dialogs/NewAccount/CreateAccount/createAccount.js +++ b/js/src/ui/dialogs/NewAccount/CreateAccount/createAccount.js @@ -40,9 +40,9 @@ export default class CreateAccount extends Component {
@@ -50,9 +50,9 @@ export default class CreateAccount extends Component { @@ -61,9 +61,9 @@ export default class CreateAccount extends Component { diff --git a/js/src/ui/dialogs/NewAccount/ImportWallet/importWallet.js b/js/src/ui/dialogs/NewAccount/ImportWallet/importWallet.js index 70ef92352e6..cc17d99bcbf 100644 --- a/js/src/ui/dialogs/NewAccount/ImportWallet/importWallet.js +++ b/js/src/ui/dialogs/NewAccount/ImportWallet/importWallet.js @@ -39,9 +39,9 @@ export default class ImportWallet extends Component {
@@ -49,9 +49,9 @@ export default class ImportWallet extends Component { @@ -60,9 +60,9 @@ export default class ImportWallet extends Component {
@@ -65,9 +65,9 @@ export default class Account extends Component { From a2500a8215fc82c8e1d2a6ba7a3bcdd605b9e4d6 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 12 Aug 2016 15:41:22 +0200 Subject: [PATCH 0022/1062] TextField override via Input (DRY) --- js/src/ui/Form/Input/index.js | 1 + js/src/ui/Form/Input/input.js | 44 +++++++++++++++++++ js/src/ui/Form/index.js | 3 +- .../FirstRun/CreateAccount/createAccount.js | 16 ++----- .../FirstRun/RecoverAccount/recoverAccount.js | 28 +++++------- .../AccountDetails/accountDetails.js | 16 ++----- .../NewAccount/CreateAccount/createAccount.js | 15 ++----- .../NewAccount/ImportWallet/importWallet.js | 16 +++---- js/src/ui/dialogs/Transfer/Details/details.js | 20 +++------ js/src/ui/views/Account/account.js | 11 ++--- js/src/ui/views/Application/application.js | 1 + 11 files changed, 84 insertions(+), 87 deletions(-) create mode 100644 js/src/ui/Form/Input/index.js create mode 100644 js/src/ui/Form/Input/input.js diff --git a/js/src/ui/Form/Input/index.js b/js/src/ui/Form/Input/index.js new file mode 100644 index 00000000000..ff7b04a2790 --- /dev/null +++ b/js/src/ui/Form/Input/index.js @@ -0,0 +1 @@ +export default from './input'; diff --git a/js/src/ui/Form/Input/input.js b/js/src/ui/Form/Input/input.js new file mode 100644 index 00000000000..be6db75c408 --- /dev/null +++ b/js/src/ui/Form/Input/input.js @@ -0,0 +1,44 @@ +import React, { Component, PropTypes } from 'react'; + +import { TextField } from 'material-ui'; + +const UNDERLINE_DISABLED = { + borderColor: 'rgba(255, 255, 255, 0.298039)' +}; + +const UNDERLINE_NORMAL = { + borderWidth: '2px' +}; + +export default class Input extends Component { + static propTypes = { + disabled: PropTypes.bool, + floatingLabelText: PropTypes.string, + hintText: PropTypes.string, + multiLine: PropTypes.bool, + onChange: PropTypes.func, + rows: PropTypes.number, + type: PropTypes.string, + value: PropTypes.oneOfType([ + PropTypes.number, PropTypes.string + ]) + } + + render () { + return ( + + ); + } +} diff --git a/js/src/ui/Form/index.js b/js/src/ui/Form/index.js index 5b21a55bbf4..97c46510c78 100644 --- a/js/src/ui/Form/index.js +++ b/js/src/ui/Form/index.js @@ -1,4 +1,5 @@ import FormWrap from './FormWrap'; +import Input from './Input'; export default from './form'; -export { FormWrap }; +export { FormWrap, Input }; diff --git a/js/src/ui/dialogs/FirstRun/CreateAccount/createAccount.js b/js/src/ui/dialogs/FirstRun/CreateAccount/createAccount.js index bf1512d63ac..7c81623ac7d 100644 --- a/js/src/ui/dialogs/FirstRun/CreateAccount/createAccount.js +++ b/js/src/ui/dialogs/FirstRun/CreateAccount/createAccount.js @@ -1,8 +1,6 @@ import React, { Component, PropTypes } from 'react'; -import { TextField } from 'material-ui'; - -import Form, { FormWrap } from '../../../Form'; +import Form, { FormWrap, Input } from '../../../Form'; export default class CreateAccount extends Component { static contextTypes = { @@ -27,29 +25,23 @@ export default class CreateAccount extends Component { return (
- - - - - - diff --git a/js/src/ui/dialogs/NewAccount/AccountDetails/accountDetails.js b/js/src/ui/dialogs/NewAccount/AccountDetails/accountDetails.js index 657cfe6080b..148277c285a 100644 --- a/js/src/ui/dialogs/NewAccount/AccountDetails/accountDetails.js +++ b/js/src/ui/dialogs/NewAccount/AccountDetails/accountDetails.js @@ -1,8 +1,6 @@ import React, { Component, PropTypes } from 'react'; -import { TextField } from 'material-ui'; - -import Form, { FormWrap } from '../../../Form'; +import Form, { FormWrap, Input } from '../../../Form'; import IdentityIcon from '../../../IdentityIcon'; import styles from '../style.css'; @@ -28,21 +26,17 @@ export default class RecoverAccount extends Component { { info }
- - { this.renderPhrase() } @@ -57,12 +51,10 @@ export default class RecoverAccount extends Component { return ( - diff --git a/js/src/ui/dialogs/NewAccount/CreateAccount/createAccount.js b/js/src/ui/dialogs/NewAccount/CreateAccount/createAccount.js index 07c28e71d30..923740de8c3 100644 --- a/js/src/ui/dialogs/NewAccount/CreateAccount/createAccount.js +++ b/js/src/ui/dialogs/NewAccount/CreateAccount/createAccount.js @@ -1,9 +1,8 @@ import React, { Component, PropTypes } from 'react'; -import { TextField } from 'material-ui'; import { RadioButton, RadioButtonGroup } from 'material-ui/RadioButton'; -import Form from '../../../Form'; +import Form, { Input } from '../../../Form'; import IdentityIcon from '../../../IdentityIcon'; import styles from '../style.css'; @@ -38,31 +37,25 @@ export default class CreateAccount extends Component {
Provide a descriptive name for the account, a strong password and select your preferred identity icon to create the account
-
-
- Provide a descriptive name for the account, the password required to unlock the account and the on-disk location of the wallet to be imported.
-
-
-
diff --git a/js/src/ui/dialogs/Transfer/Details/details.js b/js/src/ui/dialogs/Transfer/Details/details.js index ba4a3795b38..352fb7eccf1 100644 --- a/js/src/ui/dialogs/Transfer/Details/details.js +++ b/js/src/ui/dialogs/Transfer/Details/details.js @@ -1,9 +1,9 @@ import React, { Component, PropTypes } from 'react'; import BigNumber from 'bignumber.js'; -import { Checkbox, TextField } from 'material-ui'; +import { Checkbox } from 'material-ui'; import Api from '../../../../api'; -import Form from '../../../Form'; +import Form, { Input } from '../../../Form'; import styles from './style.css'; @@ -42,20 +42,16 @@ export default class Details extends Component { render () { return ( -
- @@ -70,10 +66,8 @@ export default class Details extends Component {
- @@ -81,11 +75,9 @@ export default class Details extends Component {
-
diff --git a/js/src/ui/views/Account/account.js b/js/src/ui/views/Account/account.js index 0c5c0b140a1..b5eca559638 100644 --- a/js/src/ui/views/Account/account.js +++ b/js/src/ui/views/Account/account.js @@ -1,13 +1,12 @@ import React, { Component, PropTypes } from 'react'; -import { TextField } from 'material-ui'; import { CardText } from 'material-ui/Card'; import { FundAccount, Transfer } from '../../dialogs'; import Balances from '../../Balances'; import Container from '../../Container'; -import Form, { FormWrap } from '../../Form'; +import Form, { FormWrap, Input } from '../../Form'; import IdentityIcon from '../../IdentityIcon'; import Actions from './actions'; @@ -53,20 +52,16 @@ export default class Account extends Component { - - diff --git a/js/src/ui/views/Application/application.js b/js/src/ui/views/Application/application.js index 5a10fee956f..ebd8d40fe0b 100644 --- a/js/src/ui/views/Application/application.js +++ b/js/src/ui/views/Application/application.js @@ -21,6 +21,7 @@ muiTheme.stepper.disabledTextColor = '#777'; muiTheme.inkBar.backgroundColor = 'rgb(0, 151, 167)'; muiTheme.tabs = lightTheme.tabs; muiTheme.tabs.backgroundColor = 'rgb(65, 65, 65)'; +muiTheme.textField.disabledTextColor = muiTheme.textField.textColor; muiTheme.toolbar = lightTheme.toolbar; muiTheme.toolbar.backgroundColor = 'rgb(80, 80, 80)'; From 9989b4ef01a5950a74b4ef07826495691d5bc9f2 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 12 Aug 2016 15:44:19 +0200 Subject: [PATCH 0023/1062] label fixed --- js/src/ui/Form/Input/input.js | 1 + 1 file changed, 1 insertion(+) diff --git a/js/src/ui/Form/Input/input.js b/js/src/ui/Form/Input/input.js index be6db75c408..67cd51a6363 100644 --- a/js/src/ui/Form/Input/input.js +++ b/js/src/ui/Form/Input/input.js @@ -29,6 +29,7 @@ export default class Input extends Component { Date: Fri, 12 Aug 2016 15:48:32 +0200 Subject: [PATCH 0024/1062] fix border width when changing from enabled <-> disabled --- js/src/ui/Form/Input/input.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/ui/Form/Input/input.js b/js/src/ui/Form/Input/input.js index 67cd51a6363..de9fe9bbbc9 100644 --- a/js/src/ui/Form/Input/input.js +++ b/js/src/ui/Form/Input/input.js @@ -7,7 +7,7 @@ const UNDERLINE_DISABLED = { }; const UNDERLINE_NORMAL = { - borderWidth: '2px' + borderBottom: 'solid 2px' }; export default class Input extends Component { From f32ef5061c9e0ad27977b3620158d29d2aa3e4ca Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 12 Aug 2016 16:07:43 +0200 Subject: [PATCH 0025/1062] update hint text --- js/src/ui/dialogs/NewAccount/CreateAccount/createAccount.js | 2 +- js/src/ui/dialogs/Transfer/Details/details.js | 5 ++++- js/src/ui/dialogs/Transfer/{Details => }/style.css | 5 +++++ 3 files changed, 10 insertions(+), 2 deletions(-) rename js/src/ui/dialogs/Transfer/{Details => }/style.css (74%) diff --git a/js/src/ui/dialogs/NewAccount/CreateAccount/createAccount.js b/js/src/ui/dialogs/NewAccount/CreateAccount/createAccount.js index 923740de8c3..51201f44704 100644 --- a/js/src/ui/dialogs/NewAccount/CreateAccount/createAccount.js +++ b/js/src/ui/dialogs/NewAccount/CreateAccount/createAccount.js @@ -56,7 +56,7 @@ export default class CreateAccount extends Component { diff --git a/js/src/ui/dialogs/Transfer/Details/details.js b/js/src/ui/dialogs/Transfer/Details/details.js index 352fb7eccf1..921abf13dca 100644 --- a/js/src/ui/dialogs/Transfer/Details/details.js +++ b/js/src/ui/dialogs/Transfer/Details/details.js @@ -5,7 +5,7 @@ import { Checkbox } from 'material-ui'; import Api from '../../../../api'; import Form, { Input } from '../../../Form'; -import styles from './style.css'; +import styles from '../style.css'; const DEFAULT_GAS = '21000'; @@ -42,6 +42,9 @@ export default class Details extends Component { render () { return ( +
+ Complete the information for the transaction with a valid recipient and the amount to be transferred. For normal transactions, the gas value can be left at the default. +
Date: Fri, 12 Aug 2016 16:19:43 +0200 Subject: [PATCH 0026/1062] s/hintText/hint/, s/floatingLabelText/label/ --- js/src/ui/Form/Input/input.js | 8 +++---- js/src/ui/Form/style.css | 4 ++-- .../FirstRun/CreateAccount/createAccount.js | 12 +++++----- .../FirstRun/RecoverAccount/recoverAccount.js | 12 +++++----- .../AccountDetails/accountDetails.js | 12 +++++----- .../NewAccount/CreateAccount/createAccount.js | 12 +++++----- .../NewAccount/ImportWallet/importWallet.js | 12 +++++----- js/src/ui/dialogs/Transfer/Details/details.js | 16 ++++++------- js/src/ui/dialogs/Transfer/Verify/verify.js | 24 +++++++++++++++++++ js/src/ui/views/Account/account.js | 8 +++---- 10 files changed, 72 insertions(+), 48 deletions(-) create mode 100644 js/src/ui/dialogs/Transfer/Verify/verify.js diff --git a/js/src/ui/Form/Input/input.js b/js/src/ui/Form/Input/input.js index de9fe9bbbc9..dd43a588ef2 100644 --- a/js/src/ui/Form/Input/input.js +++ b/js/src/ui/Form/Input/input.js @@ -13,8 +13,8 @@ const UNDERLINE_NORMAL = { export default class Input extends Component { static propTypes = { disabled: PropTypes.bool, - floatingLabelText: PropTypes.string, - hintText: PropTypes.string, + label: PropTypes.string, + hint: PropTypes.string, multiLine: PropTypes.bool, onChange: PropTypes.func, rows: PropTypes.number, @@ -30,9 +30,9 @@ export default class Input extends Component { autoComplete='off' disabled={ this.props.disabled } floatingLabelFixed - floatingLabelText={ this.props.floatingLabelText } + floatingLabelText={ this.props.label } fullWidth - hintText={ this.props.hintText } + hintText={ this.props.hint } multiLine={ this.props.multiLine } rows={ this.props.rows } type={ this.props.type || 'text' } diff --git a/js/src/ui/Form/style.css b/js/src/ui/Form/style.css index 616080263e1..ee8201e00d7 100644 --- a/js/src/ui/Form/style.css +++ b/js/src/ui/Form/style.css @@ -3,8 +3,8 @@ .autofill { height: 0; - width: '1px'; - position: 'absolute'; + width: 1px; + position: absolute; left: 0; top: 0; } diff --git a/js/src/ui/dialogs/FirstRun/CreateAccount/createAccount.js b/js/src/ui/dialogs/FirstRun/CreateAccount/createAccount.js index 7c81623ac7d..9a6344dda62 100644 --- a/js/src/ui/dialogs/FirstRun/CreateAccount/createAccount.js +++ b/js/src/ui/dialogs/FirstRun/CreateAccount/createAccount.js @@ -26,23 +26,23 @@ export default class CreateAccount extends Component { diff --git a/js/src/ui/dialogs/FirstRun/RecoverAccount/recoverAccount.js b/js/src/ui/dialogs/FirstRun/RecoverAccount/recoverAccount.js index 2459d37a919..0a1d9bb4015 100644 --- a/js/src/ui/dialogs/FirstRun/RecoverAccount/recoverAccount.js +++ b/js/src/ui/dialogs/FirstRun/RecoverAccount/recoverAccount.js @@ -23,22 +23,22 @@ export default class RecoverAccount extends Component { diff --git a/js/src/ui/dialogs/NewAccount/AccountDetails/accountDetails.js b/js/src/ui/dialogs/NewAccount/AccountDetails/accountDetails.js index 148277c285a..69abb3e14c6 100644 --- a/js/src/ui/dialogs/NewAccount/AccountDetails/accountDetails.js +++ b/js/src/ui/dialogs/NewAccount/AccountDetails/accountDetails.js @@ -28,15 +28,15 @@ export default class RecoverAccount extends Component { { this.renderPhrase() } @@ -53,8 +53,8 @@ export default class RecoverAccount extends Component { diff --git a/js/src/ui/dialogs/NewAccount/CreateAccount/createAccount.js b/js/src/ui/dialogs/NewAccount/CreateAccount/createAccount.js index 51201f44704..63c1c747295 100644 --- a/js/src/ui/dialogs/NewAccount/CreateAccount/createAccount.js +++ b/js/src/ui/dialogs/NewAccount/CreateAccount/createAccount.js @@ -38,16 +38,16 @@ export default class CreateAccount extends Component { Provide a descriptive name for the account, a strong password and select your preferred identity icon to create the account
@@ -55,8 +55,8 @@ export default class CreateAccount extends Component {
diff --git a/js/src/ui/dialogs/NewAccount/ImportWallet/importWallet.js b/js/src/ui/dialogs/NewAccount/ImportWallet/importWallet.js index 0e6ea9265c2..dd7b386dfea 100644 --- a/js/src/ui/dialogs/NewAccount/ImportWallet/importWallet.js +++ b/js/src/ui/dialogs/NewAccount/ImportWallet/importWallet.js @@ -38,16 +38,16 @@ export default class ImportWallet extends Component { Provide a descriptive name for the account, the password required to unlock the account and the on-disk location of the wallet to be imported.
@@ -55,8 +55,8 @@ export default class ImportWallet extends Component {
@@ -70,8 +70,8 @@ export default class Details extends Component {
@@ -80,8 +80,8 @@ export default class Details extends Component {
diff --git a/js/src/ui/dialogs/Transfer/Verify/verify.js b/js/src/ui/dialogs/Transfer/Verify/verify.js new file mode 100644 index 00000000000..167b591d5d9 --- /dev/null +++ b/js/src/ui/dialogs/Transfer/Verify/verify.js @@ -0,0 +1,24 @@ +import React, { Component, PropTypes } from 'react'; + +import Form, { Input } from '../../../Form'; + +export default class Verify extends Component { + static PropTypes = { + address: PropTypes.string, + recipient: PropTypes.string + } + + state = { + password: '' + } + + render () { + return ( + + + + ); + } +} diff --git a/js/src/ui/views/Account/account.js b/js/src/ui/views/Account/account.js index b5eca559638..77000030430 100644 --- a/js/src/ui/views/Account/account.js +++ b/js/src/ui/views/Account/account.js @@ -53,16 +53,16 @@ export default class Account extends Component {
From e17f21bbac86738450adef8faa5f556cb89a906e Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 12 Aug 2016 16:45:47 +0200 Subject: [PATCH 0027/1062] send verification UI --- js/src/ui/dialogs/Transfer/Verify/index.js | 1 + js/src/ui/dialogs/Transfer/Verify/verify.js | 51 ++++++++++++++++-- js/src/ui/dialogs/Transfer/transfer.js | 59 ++++++++++++++++----- 3 files changed, 93 insertions(+), 18 deletions(-) create mode 100644 js/src/ui/dialogs/Transfer/Verify/index.js diff --git a/js/src/ui/dialogs/Transfer/Verify/index.js b/js/src/ui/dialogs/Transfer/Verify/index.js new file mode 100644 index 00000000000..99330a588eb --- /dev/null +++ b/js/src/ui/dialogs/Transfer/Verify/index.js @@ -0,0 +1 @@ +export default from './verify.js'; diff --git a/js/src/ui/dialogs/Transfer/Verify/verify.js b/js/src/ui/dialogs/Transfer/Verify/verify.js index 167b591d5d9..09505c67ae6 100644 --- a/js/src/ui/dialogs/Transfer/Verify/verify.js +++ b/js/src/ui/dialogs/Transfer/Verify/verify.js @@ -2,10 +2,15 @@ import React, { Component, PropTypes } from 'react'; import Form, { Input } from '../../../Form'; +import styles from '../style.css'; + export default class Verify extends Component { - static PropTypes = { + static propTypes = { address: PropTypes.string, - recipient: PropTypes.string + recipient: PropTypes.string, + signer: PropTypes.bool, + amount: PropTypes.number, + amountTotal: PropTypes.number } state = { @@ -13,11 +18,49 @@ export default class Verify extends Component { } render () { + const info = this.props.signer + ? 'Please verify the transaction information below, once it is posted you can authorise it via the Parity Signer Chrome extension' + : 'Please verify the transaction information below and confirm the transaction with your account password'; return (
+
+ { info } +
+ + disabled + label='recipient address' + hint='the recipient address' + value={ this.props.recipient } /> +
+
+ +
+
+ +
+
+
+
+ +
+
); } diff --git a/js/src/ui/dialogs/Transfer/transfer.js b/js/src/ui/dialogs/Transfer/transfer.js index cf07d43c944..0eb7fe9e9e9 100644 --- a/js/src/ui/dialogs/Transfer/transfer.js +++ b/js/src/ui/dialogs/Transfer/transfer.js @@ -1,11 +1,14 @@ import React, { Component, PropTypes } from 'react'; import { FlatButton } from 'material-ui'; import ContentClear from 'material-ui/svg-icons/content/clear'; +import ContentSend from 'material-ui/svg-icons/content/send'; +import NavigationArrowBack from 'material-ui/svg-icons/navigation/arrow-back'; import NavigationArrowForward from 'material-ui/svg-icons/navigation/arrow-forward'; import Overlay from '../../Overlay'; import Details from './Details'; +import Verify from './Verify'; const STAGE_NAMES = ['transfer', 'verify transaction', 'transaction receipt']; @@ -18,7 +21,7 @@ export default class Transfer extends Component { state = { stage: 0, - isValid: false + isValid: true } render () { @@ -41,23 +44,51 @@ export default class Transfer extends Component { address={ this.props.address } onChange={ this.onChangeDetails } /> ); + case 1: + return ( + + ); } } renderDialogActions () { - return [ - } - label='Cancel' - primary - onTouchTap={ this.onClose } />, - } - label='Next' - primary - onTouchTap={ this.onNext } /> - ]; + switch (this.state.stage) { + case 0: + return [ + } + label='Cancel' + primary + onTouchTap={ this.onClose } />, + } + label='Next' + primary + onTouchTap={ this.onNext } /> + ]; + case 1: + return [ + } + label='Cancel' + primary + onTouchTap={ this.onClose } />, + } + label='Back' + primary + onTouchTap={ this.onPrev } />, + } + label='Send' + primary + onTouchTap={ this.onNext } /> + ]; + } } onNext = () => { From d049859e166b55c61ec95f615dd0929c3ed5a914 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 12 Aug 2016 18:03:48 +0200 Subject: [PATCH 0028/1062] update material-ui --- js/package.json | 2 +- js/src/ui/Form/Input/input.js | 36 ++++++++++++--------- js/src/ui/Form/form.js | 2 +- js/src/ui/dialogs/Transfer/Verify/verify.js | 6 ++-- 4 files changed, 26 insertions(+), 20 deletions(-) diff --git a/js/package.json b/js/package.json index acbccbb2be0..3e4a747c8f9 100644 --- a/js/package.json +++ b/js/package.json @@ -103,7 +103,7 @@ "isomorphic-fetch": "^2.2.1", "js-sha3": "^0.5.2", "lodash": "4.11.1", - "material-ui": "^0.15.2", + "material-ui": "^0.15.4", "react": "^15.2.1", "react-addons-css-transition-group": "^15.2.1", "react-dom": "^15.2.1", diff --git a/js/src/ui/Form/Input/input.js b/js/src/ui/Form/Input/input.js index dd43a588ef2..e1a30797af8 100644 --- a/js/src/ui/Form/Input/input.js +++ b/js/src/ui/Form/Input/input.js @@ -3,7 +3,7 @@ import React, { Component, PropTypes } from 'react'; import { TextField } from 'material-ui'; const UNDERLINE_DISABLED = { - borderColor: 'rgba(255, 255, 255, 0.298039)' + borderColor: 'transparent' // 'rgba(255, 255, 255, 0.298039)' }; const UNDERLINE_NORMAL = { @@ -13,8 +13,9 @@ const UNDERLINE_NORMAL = { export default class Input extends Component { static propTypes = { disabled: PropTypes.bool, - label: PropTypes.string, + error: PropTypes.string, hint: PropTypes.string, + label: PropTypes.string, multiLine: PropTypes.bool, onChange: PropTypes.func, rows: PropTypes.number, @@ -26,20 +27,23 @@ export default class Input extends Component { render () { return ( - +
+ +
); } } diff --git a/js/src/ui/Form/form.js b/js/src/ui/Form/form.js index 13a6cb5f643..4a826a87665 100644 --- a/js/src/ui/Form/form.js +++ b/js/src/ui/Form/form.js @@ -11,7 +11,7 @@ export default class Form extends Component { // HACK: hidden inputs to disable Chrome's autocomplete return (
diff --git a/js/src/ui/dialogs/Transfer/Verify/verify.js b/js/src/ui/dialogs/Transfer/Verify/verify.js index 09505c67ae6..08b60304762 100644 --- a/js/src/ui/dialogs/Transfer/Verify/verify.js +++ b/js/src/ui/dialogs/Transfer/Verify/verify.js @@ -14,7 +14,8 @@ export default class Verify extends Component { } state = { - password: '' + password: '', + errorPassword: '' } render () { @@ -55,8 +56,9 @@ export default class Verify extends Component {
From a8b044e2b1056ca4f46cf612214bd44f0894781f Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 12 Aug 2016 19:43:44 +0200 Subject: [PATCH 0029/1062] ui fixups, icons alignment, container padding, input non-autofill --- js/src/reset.css | 1 + js/src/ui/Container/container.js | 4 +- js/src/ui/Container/style.css | 6 ++- js/src/ui/Form/Input/input.js | 4 ++ js/src/ui/IdentityIcon/identityIcon.js | 2 +- js/src/ui/IdentityIcon/style.css | 2 +- js/src/ui/dialogs/NewAccount/style.css | 3 +- js/src/ui/dialogs/Transfer/Details/details.js | 2 +- js/src/ui/dialogs/Transfer/Verify/verify.js | 12 ++++++ js/src/ui/dialogs/Transfer/style.css | 3 +- js/src/ui/views/Account/account.js | 38 +++++++++---------- .../Accounts/AccountSummary/accountSummary.js | 10 ++--- js/src/ui/views/Apps/apps.js | 6 +-- js/src/ui/views/Tokens/tokens.js | 6 +-- 14 files changed, 54 insertions(+), 45 deletions(-) diff --git a/js/src/reset.css b/js/src/reset.css index 23b5cb7ca9c..5b458e2d164 100644 --- a/js/src/reset.css +++ b/js/src/reset.css @@ -7,6 +7,7 @@ vertical-align: baseline; background: rgb(95, 95, 95); color: rgba(255, 255, 255, 0.75); + font-size: 16px; } :root a, :root a:visited { diff --git a/js/src/ui/Container/container.js b/js/src/ui/Container/container.js index 0a33daadee9..90de3a69182 100644 --- a/js/src/ui/Container/container.js +++ b/js/src/ui/Container/container.js @@ -11,8 +11,8 @@ export default class Container extends Component { render () { return ( -
- +
+ { this.props.children }
diff --git a/js/src/ui/Container/style.css b/js/src/ui/Container/style.css index da4203f7329..a45fd8e50e5 100644 --- a/js/src/ui/Container/style.css +++ b/js/src/ui/Container/style.css @@ -1,3 +1,7 @@ -.padded { +.container { padding: 1em 1em 0 1em; } + +.padded { + padding: 1em; +} diff --git a/js/src/ui/Form/Input/input.js b/js/src/ui/Form/Input/input.js index e1a30797af8..86a700eb5b3 100644 --- a/js/src/ui/Form/Input/input.js +++ b/js/src/ui/Form/Input/input.js @@ -26,6 +26,8 @@ export default class Input extends Component { } render () { + const nameid = ' '; + return (
); } + + updateParent = () => { + } + + onEditPassword = (event) => { + const value = event.target.value; + + this.setState({ + password: value + }, this.updateParent); + } } diff --git a/js/src/ui/dialogs/Transfer/style.css b/js/src/ui/dialogs/Transfer/style.css index 9351ee3ab2e..36f55640a7a 100644 --- a/js/src/ui/dialogs/Transfer/style.css +++ b/js/src/ui/dialogs/Transfer/style.css @@ -1,5 +1,6 @@ .info { - padding-bottom: 1em; + padding-bottom: 1.618em; + line-height: 1.618em; width: 75%; } diff --git a/js/src/ui/views/Account/account.js b/js/src/ui/views/Account/account.js index 77000030430..d32612599d7 100644 --- a/js/src/ui/views/Account/account.js +++ b/js/src/ui/views/Account/account.js @@ -1,7 +1,5 @@ import React, { Component, PropTypes } from 'react'; -import { CardText } from 'material-ui/Card'; - import { FundAccount, Transfer } from '../../dialogs'; import Balances from '../../Balances'; @@ -49,26 +47,24 @@ export default class Account extends Component { - -
- - - - - - -
- + + + + + + + + -
); diff --git a/js/src/ui/views/Accounts/AccountSummary/accountSummary.js b/js/src/ui/views/Accounts/AccountSummary/accountSummary.js index cb902287f85..610a58206c4 100644 --- a/js/src/ui/views/Accounts/AccountSummary/accountSummary.js +++ b/js/src/ui/views/Accounts/AccountSummary/accountSummary.js @@ -1,13 +1,13 @@ import React, { Component, PropTypes } from 'react'; import { Link } from 'react-router'; -import { CardText, CardTitle } from 'material-ui/Card'; +import { CardTitle } from 'material-ui/Card'; import Balances from '../../../Balances'; import Container from '../../../Container'; import IdentityIcon from '../../../IdentityIcon'; -const TITLE_STYLE = { textTransform: 'uppercase', paddingBottom: 0 }; +const TITLE_STYLE = { textTransform: 'uppercase', paddingBottom: 0, paddingTop: 0 }; export default class AccountSummary extends Component { static contextTypes = { @@ -33,10 +33,8 @@ export default class AccountSummary extends Component { { account.name || 'Unnamed' } } /> - - - + ); } diff --git a/js/src/ui/views/Apps/apps.js b/js/src/ui/views/Apps/apps.js index 2146caec55c..3cdb66c0fe1 100644 --- a/js/src/ui/views/Apps/apps.js +++ b/js/src/ui/views/Apps/apps.js @@ -1,16 +1,12 @@ import React, { Component } from 'react'; -import { CardText } from 'material-ui/Card'; - import Container from '../../Container'; export default class Apps extends Component { render () { return ( - - managing contracts (adding, calling, etc) should go in here, next steps... almost there... - + managing contracts (adding, calling, etc) should go in here, next steps... almost there... ); } diff --git a/js/src/ui/views/Tokens/tokens.js b/js/src/ui/views/Tokens/tokens.js index dc7641a2c48..488f4d2ae44 100644 --- a/js/src/ui/views/Tokens/tokens.js +++ b/js/src/ui/views/Tokens/tokens.js @@ -1,16 +1,12 @@ import React, { Component } from 'react'; -import { CardText } from 'material-ui/Card'; - import Container from '../../Container'; export default class Tokens extends Component { render () { return ( - - the token dapp interface should go in here, we need a basic contract, deploy it and then go about playing and seeing what is the best way to pull everything together... - + the token dapp interface should go in here, we need a basic contract, deploy it and then go about playing and seeing what is the best way to pull everything together... ); } From c9be3b4c082151f1f256dcaa5dca07282e39b720 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 12 Aug 2016 19:44:50 +0200 Subject: [PATCH 0030/1062] no title padding for accounts --- js/src/ui/views/Accounts/AccountSummary/accountSummary.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/ui/views/Accounts/AccountSummary/accountSummary.js b/js/src/ui/views/Accounts/AccountSummary/accountSummary.js index 610a58206c4..d8483b7678d 100644 --- a/js/src/ui/views/Accounts/AccountSummary/accountSummary.js +++ b/js/src/ui/views/Accounts/AccountSummary/accountSummary.js @@ -7,7 +7,7 @@ import Balances from '../../../Balances'; import Container from '../../../Container'; import IdentityIcon from '../../../IdentityIcon'; -const TITLE_STYLE = { textTransform: 'uppercase', paddingBottom: 0, paddingTop: 0 }; +const TITLE_STYLE = { textTransform: 'uppercase', padding: 0 }; export default class AccountSummary extends Component { static contextTypes = { From 438f42e81e8e88bab0c473ddf30a84d485ec9b0d Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 12 Aug 2016 21:38:06 +0200 Subject: [PATCH 0031/1062] styles back to material-ui-compatible versions for checkbox --- js/src/ui/dialogs/Transfer/Details/details.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/ui/dialogs/Transfer/Details/details.js b/js/src/ui/dialogs/Transfer/Details/details.js index 0f050766d1d..e30f956f2a2 100644 --- a/js/src/ui/dialogs/Transfer/Details/details.js +++ b/js/src/ui/dialogs/Transfer/Details/details.js @@ -11,7 +11,7 @@ const DEFAULT_GAS = '21000'; const CHECK_STYLE = { position: 'absolute', - top: '1em', + bottom: '8px', left: '1em' }; From 512ea378ba41cb1f93e713f936b0e1b28ce431e8 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 12 Aug 2016 21:38:53 +0200 Subject: [PATCH 0032/1062] default to 30k gas --- js/src/ui/dialogs/Transfer/Details/details.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/ui/dialogs/Transfer/Details/details.js b/js/src/ui/dialogs/Transfer/Details/details.js index e30f956f2a2..07b400acee8 100644 --- a/js/src/ui/dialogs/Transfer/Details/details.js +++ b/js/src/ui/dialogs/Transfer/Details/details.js @@ -7,7 +7,7 @@ import Form, { Input } from '../../../Form'; import styles from '../style.css'; -const DEFAULT_GAS = '21000'; +const DEFAULT_GAS = '30000'; const CHECK_STYLE = { position: 'absolute', From f1ae77caca98bc49eb391d6bc92d34900d51e4c4 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 13 Aug 2016 09:59:39 +0200 Subject: [PATCH 0033/1062] more consistent & attractive account list layout --- js/src/ui/Balances/balances.js | 10 ++++-- js/src/ui/Balances/style.css | 4 +++ js/src/ui/Container/Title/index.js | 1 + js/src/ui/Container/Title/style.css | 3 ++ js/src/ui/Container/Title/title.js | 33 +++++++++++++++++++ js/src/ui/Container/index.js | 3 ++ js/src/ui/views/Account/account.js | 2 +- .../Accounts/AccountSummary/accountSummary.js | 12 +++---- 8 files changed, 57 insertions(+), 11 deletions(-) create mode 100644 js/src/ui/Container/Title/index.js create mode 100644 js/src/ui/Container/Title/style.css create mode 100644 js/src/ui/Container/Title/title.js diff --git a/js/src/ui/Balances/balances.js b/js/src/ui/Balances/balances.js index f619dafba7f..60137f7b10d 100644 --- a/js/src/ui/Balances/balances.js +++ b/js/src/ui/Balances/balances.js @@ -33,14 +33,20 @@ export default class Balances extends Component { src={ balance.img } alt={ balance.type } />
- { balance.value.toFormat(8) } { balance.token } + { balance.value.toFormat() } { balance.token }
); }); + if (!balances.length) { + return null; + } + return ( -
{ balances }
+
+ { balances } +
); } diff --git a/js/src/ui/Balances/style.css b/js/src/ui/Balances/style.css index 8a3d34e50e1..02fe525fdc4 100644 --- a/js/src/ui/Balances/style.css +++ b/js/src/ui/Balances/style.css @@ -1,3 +1,7 @@ +.balances { + margin-top: 1em; +} + .balance { height: 32px; } diff --git a/js/src/ui/Container/Title/index.js b/js/src/ui/Container/Title/index.js new file mode 100644 index 00000000000..1e5dcedbfde --- /dev/null +++ b/js/src/ui/Container/Title/index.js @@ -0,0 +1 @@ +export default from './title'; diff --git a/js/src/ui/Container/Title/style.css b/js/src/ui/Container/Title/style.css new file mode 100644 index 00000000000..340f39f9cd6 --- /dev/null +++ b/js/src/ui/Container/Title/style.css @@ -0,0 +1,3 @@ +.byline { + color: #aaa; +} diff --git a/js/src/ui/Container/Title/title.js b/js/src/ui/Container/Title/title.js new file mode 100644 index 00000000000..f27133dd233 --- /dev/null +++ b/js/src/ui/Container/Title/title.js @@ -0,0 +1,33 @@ +import React, { Component, PropTypes } from 'react'; + +import { CardTitle } from 'material-ui/Card'; + +import styles from './style.css'; + +const TITLE_STYLE = { textTransform: 'uppercase', padding: 0 }; + +export default class Title extends Component { + static propTypes = { + title: PropTypes.oneOfType([ + PropTypes.string, PropTypes.node + ]), + byline: PropTypes.string + } + + state = { + name: 'Unnamed' + } + + render () { + return ( +
+ +
+ { this.props.byline } +
+
+ ); + } +} diff --git a/js/src/ui/Container/index.js b/js/src/ui/Container/index.js index 0403d9f1e64..0d60a2fafc8 100644 --- a/js/src/ui/Container/index.js +++ b/js/src/ui/Container/index.js @@ -1 +1,4 @@ +import Title from './Title'; + export default from './container.js'; +export { Title }; diff --git a/js/src/ui/views/Account/account.js b/js/src/ui/views/Account/account.js index d32612599d7..915c7d66b34 100644 --- a/js/src/ui/views/Account/account.js +++ b/js/src/ui/views/Account/account.js @@ -64,7 +64,7 @@ export default class Account extends Component { + address={ address } />
); diff --git a/js/src/ui/views/Accounts/AccountSummary/accountSummary.js b/js/src/ui/views/Accounts/AccountSummary/accountSummary.js index d8483b7678d..f5dcba281c4 100644 --- a/js/src/ui/views/Accounts/AccountSummary/accountSummary.js +++ b/js/src/ui/views/Accounts/AccountSummary/accountSummary.js @@ -1,14 +1,10 @@ import React, { Component, PropTypes } from 'react'; import { Link } from 'react-router'; -import { CardTitle } from 'material-ui/Card'; - import Balances from '../../../Balances'; -import Container from '../../../Container'; +import Container, { Title } from '../../../Container'; import IdentityIcon from '../../../IdentityIcon'; -const TITLE_STYLE = { textTransform: 'uppercase', padding: 0 }; - export default class AccountSummary extends Component { static contextTypes = { api: React.PropTypes.object @@ -30,9 +26,9 @@ export default class AccountSummary extends Component { - { account.name || 'Unnamed' } } /> + { account.name || 'Unnamed' }</Link> } + byline={ account.address } /> <Balances address={ account.address } /> </Container> From a7b5c26972634102038d42b3d0a83580a3599b48 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Sat, 13 Aug 2016 10:09:54 +0200 Subject: [PATCH 0034/1062] scale-up identity icon to (almost) normal size --- js/src/ui/IdentityIcon/identityIcon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/ui/IdentityIcon/identityIcon.js b/js/src/ui/IdentityIcon/identityIcon.js index e8b50f63376..4f349defb59 100644 --- a/js/src/ui/IdentityIcon/identityIcon.js +++ b/js/src/ui/IdentityIcon/identityIcon.js @@ -22,7 +22,7 @@ export default class IdentityIcon extends Component { iconsrc: blockies({ seed: address, size: 8, - scale: 5 + scale: 7 }).toDataURL() }); } From d186a5b2e307e9f0ef0405659b043141d9733063 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Sat, 13 Aug 2016 10:46:56 +0200 Subject: [PATCH 0035/1062] account name now allows basic inline editing --- js/src/ui/Form/Input/input.js | 6 ++- js/src/ui/Form/InputInline/index.js | 1 + js/src/ui/Form/InputInline/inputInline.js | 61 +++++++++++++++++++++++ js/src/ui/Form/index.js | 3 +- js/src/ui/Form/style.css | 4 ++ js/src/ui/views/Account/account.js | 19 +++++-- js/src/ui/views/Account/style.css | 3 ++ 7 files changed, 92 insertions(+), 5 deletions(-) create mode 100644 js/src/ui/Form/InputInline/index.js create mode 100644 js/src/ui/Form/InputInline/inputInline.js create mode 100644 js/src/ui/views/Account/style.css diff --git a/js/src/ui/Form/Input/input.js b/js/src/ui/Form/Input/input.js index 86a700eb5b3..ed1501b9be3 100644 --- a/js/src/ui/Form/Input/input.js +++ b/js/src/ui/Form/Input/input.js @@ -17,7 +17,9 @@ export default class Input extends Component { hint: PropTypes.string, label: PropTypes.string, multiLine: PropTypes.bool, + onBlur: PropTypes.func, onChange: PropTypes.func, + onKeyDown: PropTypes.func, rows: PropTypes.number, type: PropTypes.string, value: PropTypes.oneOfType([ @@ -46,7 +48,9 @@ export default class Input extends Component { underlineDisabledStyle={ UNDERLINE_DISABLED } underlineStyle={ UNDERLINE_NORMAL } value={ this.props.value } - onChange={ this.props.onChange } /> + onBlur={ this.props.onBlur } + onChange={ this.props.onChange } + onKeyDown={ this.props.onKeyDown } /> </div> ); } diff --git a/js/src/ui/Form/InputInline/index.js b/js/src/ui/Form/InputInline/index.js new file mode 100644 index 00000000000..a298ceb4ff2 --- /dev/null +++ b/js/src/ui/Form/InputInline/index.js @@ -0,0 +1 @@ +export default from './inputInline'; diff --git a/js/src/ui/Form/InputInline/inputInline.js b/js/src/ui/Form/InputInline/inputInline.js new file mode 100644 index 00000000000..27d1d44dc19 --- /dev/null +++ b/js/src/ui/Form/InputInline/inputInline.js @@ -0,0 +1,61 @@ +import React, { Component, PropTypes } from 'react'; + +import Input from '../Input'; + +import styles from '../style.css'; + +export default class InputInline extends Component { + static propTypes = { + error: PropTypes.string, + hint: PropTypes.string, + label: PropTypes.string, + onChange: PropTypes.func, + type: PropTypes.string, + value: PropTypes.oneOfType([ + PropTypes.number, PropTypes.string + ]), + static: PropTypes.oneOfType([ + PropTypes.node, PropTypes.string + ]) + } + + state = { + editing: false + } + + render () { + if (!this.state.editing) { + return ( + <div + className={ styles.inlineedit } + onClick={ this.onEdit }> + { this.props.static || this.props.value } + </div> + ); + } + + return ( + <Input + error={ this.props.error } + label={ this.props.label } + hint={ this.props.hint } + type={ this.props.type } + value={ this.props.value } + onBlur={ this.onEdit } + onChange={ this.props.onChange } + onKeyDown={ this.onKeyDown } /> + ); + } + + onEdit = () => { + this.setState({ + editing: !this.state.editing + }); + } + + onKeyDown = (event) => { + if (event.keyCode === 13) { + this.onEdit(); + } + } +} diff --git a/js/src/ui/Form/index.js b/js/src/ui/Form/index.js index 97c46510c78..beb71f536d3 100644 --- a/js/src/ui/Form/index.js +++ b/js/src/ui/Form/index.js @@ -1,5 +1,6 @@ import FormWrap from './FormWrap'; import Input from './Input'; +import InputInline from './InputInline'; export default from './form'; -export { FormWrap, Input }; +export { FormWrap, Input, InputInline }; diff --git a/js/src/ui/Form/style.css b/js/src/ui/Form/style.css index ee8201e00d7..8b7af966d47 100644 --- a/js/src/ui/Form/style.css +++ b/js/src/ui/Form/style.css @@ -13,3 +13,7 @@ display: none; opacity: 0; } + +.inlineedit { + cursor: pointer; +} diff --git a/js/src/ui/views/Account/account.js b/js/src/ui/views/Account/account.js index 915c7d66b34..c695041285d 100644 --- a/js/src/ui/views/Account/account.js +++ b/js/src/ui/views/Account/account.js @@ -1,14 +1,18 @@ import React, { Component, PropTypes } from 'react'; +import ContentCreate from 'material-ui/svg-icons/content/create'; + import { FundAccount, Transfer } from '../../dialogs'; import Balances from '../../Balances'; -import Container from '../../Container'; -import Form, { FormWrap, Input } from '../../Form'; +import Container, { Title } from '../../Container'; +import Form, { FormWrap, Input, InputInline } from '../../Form'; import IdentityIcon from '../../IdentityIcon'; import Actions from './actions'; +import styles from './style.css'; + export default class Account extends Component { static contextTypes = { api: React.PropTypes.object @@ -30,6 +34,14 @@ export default class Account extends Component { render () { const address = this.props.params.address; + const title = ( + <span> + <span>{ this.state.name }</span> + <ContentCreate + className={ styles.editicon } + color='rgb(0, 151, 167)' /> + </span> + ); return ( <div> @@ -49,10 +61,11 @@ export default class Account extends Component { address={ address } /> <Form> <FormWrap> - <Input + <InputInline label='account name' hint='a descriptive name for the account' value={ this.state.name } + static={ <Title title={ title } /> } onChange={ this.onEditName } /> </FormWrap> <FormWrap> diff --git a/js/src/ui/views/Account/style.css b/js/src/ui/views/Account/style.css new file mode 100644 index 00000000000..18a2d48af36 --- /dev/null +++ b/js/src/ui/views/Account/style.css @@ -0,0 +1,3 @@ +.editicon { + margin-left: 0.5em; +} From 7bc665b67d6cafc624d3cd531df54a3e2589d7cf Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Sat, 13 Aug 2016 23:45:55 +0200 Subject: [PATCH 0036/1062] underline back for static fields --- js/src/ui/Form/Input/input.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/ui/Form/Input/input.js b/js/src/ui/Form/Input/input.js index ed1501b9be3..b6d9490bd38 100644 --- a/js/src/ui/Form/Input/input.js +++ b/js/src/ui/Form/Input/input.js @@ -3,7 +3,7 @@ import React, { Component, PropTypes } from 'react'; import { TextField } from 'material-ui'; const UNDERLINE_DISABLED = { - borderColor: 'transparent' // 'rgba(255, 255, 255, 0.298039)' + borderColor: 'rgba(255, 255, 255, 0.298039)' // 'transparent' // 'rgba(255, 255, 255, 0.298039)' }; const UNDERLINE_NORMAL = { From 1e214d3e2da7f11cc512e83f1fe14a2ba918dbbc Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Sun, 14 Aug 2016 14:52:06 +0200 Subject: [PATCH 0037/1062] make the appbar look more snazzy with logo --- js/src/images/parity-x56.png | Bin 0 -> 5899 bytes js/src/images/parity.xcf | Bin 0 -> 134722 bytes js/src/ui/views/Application/TabBar/tabBar.js | 45 ++++++++++++------- js/src/ui/views/Application/style.css | 14 ++++++ 4 files changed, 42 insertions(+), 17 deletions(-) create mode 100644 js/src/images/parity-x56.png create mode 100644 js/src/images/parity.xcf diff --git a/js/src/images/parity-x56.png b/js/src/images/parity-x56.png new file mode 100644 index 0000000000000000000000000000000000000000..ede5a942e0080912f1803bd43162ee6e67c029b8 GIT binary patch literal 5899 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 literal 0 HcmV?d00001 diff --git a/js/src/images/parity.xcf b/js/src/images/parity.xcf new file mode 100644 index 0000000000000000000000000000000000000000..325dce7265f731e76c78c84a5b89d7ddef36da32 GIT binary patch literal 134722 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≫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 a%Us}}F8w{>nlzJh=lLB9<_UiLW&RB{6O0Z3 literal 0 HcmV?d00001 diff --git a/js/src/ui/views/Application/TabBar/tabBar.js b/js/src/ui/views/Application/TabBar/tabBar.js index e7632156f3d..605b6b2b2eb 100644 --- a/js/src/ui/views/Application/TabBar/tabBar.js +++ b/js/src/ui/views/Application/TabBar/tabBar.js @@ -1,11 +1,14 @@ import React, { Component, PropTypes } from 'react'; +import Toolbar from 'material-ui/Toolbar'; import { Tabs, Tab } from 'material-ui/Tabs'; import ActionAccountBalanceWallet from 'material-ui/svg-icons/action/account-balance-wallet'; import ActionDashboard from 'material-ui/svg-icons/action/dashboard'; import NavigationApps from 'material-ui/svg-icons/navigation/apps'; +import styles from '../style.css'; + export default class TabBar extends Component { static contextTypes = { router: PropTypes.object @@ -13,23 +16,31 @@ export default class TabBar extends Component { render () { return ( - <Tabs> - <Tab - data-route='/accounts' - icon={ <ActionAccountBalanceWallet /> } - label='accounts' - onActive={ this.onActivate } /> - <Tab - data-route='/tokens' - icon={ <ActionDashboard /> } - label='tokens' - onActive={ this.onActivate } /> - <Tab - data-route='/apps' - icon={ <NavigationApps /> } - label='apps' - onActive={ this.onActivate } /> - </Tabs> + <Toolbar + className={ styles.toolbar }> + <img + className={ styles.logo } + src='images/parity-x56.png' + alt='Parity' /> + <Tabs + className={ styles.tabs }> + <Tab + data-route='/accounts' + icon={ <ActionAccountBalanceWallet /> } + label='accounts' + onActive={ this.onActivate } /> + <Tab + data-route='/tokens' + icon={ <ActionDashboard /> } + label='tokens' + onActive={ this.onActivate } /> + <Tab + data-route='/apps' + icon={ <NavigationApps /> } + label='apps' + onActive={ this.onActivate } /> + </Tabs> + </Toolbar> ); } diff --git a/js/src/ui/views/Application/style.css b/js/src/ui/views/Application/style.css index cbe226cbcd5..ae301f7f609 100644 --- a/js/src/ui/views/Application/style.css +++ b/js/src/ui/views/Application/style.css @@ -2,3 +2,17 @@ width: 100%; height: 100%; } + +.toolbar { + background: rgb(65, 65, 65) !important; + height: 72px !important; +} + +.tabs { + min-width: 450px; +} + +.logo { + height: 56px; + padding: 8px 2em 8px 0; +} From b48f5e1500518175aaf0525cece6353460dd3305 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Sun, 14 Aug 2016 14:56:51 +0200 Subject: [PATCH 0038/1062] image updates, slight spacing before text --- js/src/images/parity-x56.png | Bin 5899 -> 5236 bytes js/src/images/parity.xcf | Bin 134722 -> 193504 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/js/src/images/parity-x56.png b/js/src/images/parity-x56.png index ede5a942e0080912f1803bd43162ee6e67c029b8..b07eed291a6be06b83cde0e5114740e47a2549b0 100644 GIT binary patch delta 5233 zcmV-%6prhQF7zlNiBL{Q4GJ0x0000DNk~Le0002%0000u2nGNE034tXRFNSxe>f87 z1GxtP02Bd9L_t(|+U;F=loZv~|K09sVc2GneUlx;fC6qPQ4mmZjV8*6#wCjym!PO| z%cthUEr|P3+%RH5zz=tE#U(BzB*7JdM8zdUc9dlpW`^#nU;e1uCuLb(OLuio19i{o zGiR#q+v>gFyZ7C9-+h8cB$8bKfAj}%3V<I0SPo!1fOi0_5Rq*t10s14fNpstHAUnJ zTRs&4#sSFqq{{%P@ZqTeFkeIrM_mQL2>@OYk?nc5Hwj=YfR~;5`=qM`Fj)I?0DzVN z>Hw?)@HT*jBC@=|zUTvBIDk<AIsixk*aF~V0IvY}SVXpj%yS$70uYb>f7k?IBY<@x zvNB};0^m>p?LErKMGe{y4blh$zZHOA1Na4i9srgAcnHAj0DcJIU<Gd-fHwi$CL#+O z8LUqM_zXaOh-3mFBO=$?^4Sf*BmiC@G675gaF0*NZUAtfh-6%VmI2U4M83_lz0Cpq z3qUs!sSB8941gy9d;(w!e}InwqyZ!Vv;%M=fO7$S3ShK|Yz<kb3IKlsFbKfi03KJ6 zQYW^-04@Ts4}jA}<hc-e6Ts~Na@8r@hP?nB0N_gizYvjyAtt|f0lW|3-ys283*erT z2riP9Bo82YImu-tw~~CD<b@=6SDt<KZ%YL;NRA=-2+1!=ZXx+cf0D<M+@le|I*VkJ z5|;OI0cn#YGudyOXCBQ+u2o4Hg#Q$h8%drNfOoR?=UyS|)05;kB<~EsyT8``|3c)S zA=x?v|9K?Wki0TPpL|Sm2+EO24ktN}<aYfS50UJz;1wI+5J$S9B%9i$5y{ph∓- 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%0AH02%-snaO05c}y(F zYWfTOZXhftiX5yWvRXvi0vHTn0f1}tG{Jn0hCjf@dntfHB+u85tAgeGdtnyf>Uc4V z<n4M)Y9WBm0L~JN;`qO1g1ao1LXMa76+nUALn|sO>R?^PkxC>I_K+``Amt~Mf60vi zvNz0Ko@X2KYOizNaOBnKGiQZHB|MVkn=1CVki1RfC+)4z+NlT2G)*_2<hyzvb-iAA z)H%#q*qBPH2Dj2kAc2=8>2$h+<RN-!BNV9<#c*55+XTr2_5PzE<FZO`v^&t&hSvJ5 zdw}*f*DcF_1z@AMmRDVtovNWpN5^ZNnY9`!W;4m93fjM_x67YNUgH+gFs7JdDm`#T rrR&YQ?eiAN!?W+=FBDTu|E2!`tN#vQY;xHc00000NkvXXu0mjfxRTBa literal 5899 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 diff --git a/js/src/images/parity.xcf b/js/src/images/parity.xcf index 325dce7265f731e76c78c84a5b89d7ddef36da32..67ce23d76bc7476f03a4901ffdce160ff4c6a980 100644 GIT binary patch literal 193504 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%0D?QeGe^Z!E9eClFNdAgBNcf`!2H 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 %d#xL1Xj0>o&(68mtubpmu+m0Ri zA(UX6dViMNPbn8s$cm<ylyT#2m+rW<&E+Y*q+Z@fU;XBe9X&jvy<=K8@`gP78~)w% zrbkMwaw>Y#97DneNjDtLhRtjZo4)dHhRs=S|K=S#^sZXqZ4=$a9pF?quExe3Zl0j| z-E>WqE3&mQp;mL*;e@qvJFOzRO@!@g3vSPj9oun}=0dnAiOBERu}uluiaRdRD2BdJ zVJhD&*D8j7vFg*!(3(2B<1IF2^k8=6WLW#D@nW|bc8;kCSoK`otXmOx!KSN@DVZ%N zd6vcPFzglrv-q`;vX#<i!Mw%vHA!Uf%Ph42X;Ns3Wwx=461#{~xSI)}3wI8`94+y* z7H-v<ZE3NCNNd{7pToa2DRVw9x=FE9WefS8!fz2j4Zg)huEt%;Pwp~)tN8WsTao-U zgRR8BoZm_OLfR$xeHksxdZFxAX1FXfSBtspapyBTok|&qVq(<p)OtJ{@E~l7S>4Hu zd<&Ck3;oo_*wDl_o1V_`n;&mr0zAd7rU}c{nVrm}%jm#vX3*ti$nn4{an<#jIaSDJ z>(~x=niV|Tt)cVOfh%ZJ3;7mPhT1pRo@pWXHS75nxH;zLpzGP^@ga*ompbImp)uZV z=Y@6P&+<Y#s8jw7&zTMpx+xtZ8Y<}!VJM_r<Vd*4UPDVGz=LgmE^QN@=ws90=Gr+4 z-dOKv<b@svtWG9wF2WENTJER!JlA3Xl+c_tfDw(>X8at?Y|l?Wf2DJ$42|p#K&Ttm zx4+zfwdTBx+s`E0AD~YGIoa%ZkAW$hbz9tCn{563?}1Jm<KEhuO{QdSQM0KzTSEoH zW?1y4nLJ=?n6YQsRK6a<M9!m_-HLZ{EZD^TY&6AOn~p(19x+YOFF6Ezewyz{W^Jx` z6ZFf$os)T=6gIDekpP!Kwyp#S;9jhWf1U?VolF=Lh79H;$Y23wfmGX=Wjs`vn<QA| zdsy?d#}4xncZnM}0IOD8rMb`wG>H3{g*~)bkTiNt0x=dQm?dvLv6*+4fSHq$F61T{ z>q^4b??5$s4=a<-S)O2{9xJ$j{_(^@fhTaI$7(B*_AE<kT9wpH!94PIc0JUxOF)$V zNok37#iHcFK;{OLX!&}9r!^Ez`ZlmpMfuhyPef4TXI)YaTH+w8^`RB)WL*pj&>Oo* zyDx1Z0skQEt>i%i{^{sdA$^7IsWBR@ago((!g@7B|MM!_zzF*p6p!JBcjB*H{Q0|C zX;gbvhkZz3b$vZ+!U!~BiC+`|YW?UPH>6Kt38ZdZkhC!D?VIAwhn2}sugmiyyM^WZ zkOe1DdjD|o1p>wNh+nSI#)joeCh4Cx7bWYPI$US`CnMadKG`>fPOw+q>D$?ptYsLR z)+dZ+EvFXw2b`aLLe@-5rgi#+c$@ak@Ky?gW0;w)l=-3<0|s!>RPUAD>R|xB?^jM+ zn0f1hD9N{hxQX4a(VWJV;bja3AbR5bQAw$6l<@Y3OpGII)x1dPHd@#vmAt7^A_Kyv zvLZAdwOcv@Wn$F1qO$Z6Q(;uVXQ&TCL1(c{G(^p4&u`x`(Bgy`9|QY1A5L>FZ$_AW zEB(y}!}4+|Xi*{){}XcbVTn){gD@8wqV!@Pp~@A2-aKGW2)qMeD`egQI9|qA-C+Q8 z4z9#DIovtau^6|D`j(kH7vR?c&*-8Yx$TIOI>_5f8#+Mq8AL=Kw9||J<Tm^D42MIT z6{lU0c0n=<`uGsWW0O5>*Mur*faLeathR}3Y3`TI&}1i@#Fa++d*Qbp4Vbv)G|yU0 z$iP&JU`8w@k)dey9%Krz64EvZDwH!3ut@wtPED-~;;3BILSOl?$}$88w;7Zru^>#8 zFY62=Uo>gNz&YkvVs@~yI1-r`qgE|T#4DJRjE75nFzA^?PiP_BHt$>z9WQBq4i0uE z;$;LK4bmknw3Jj1y;A4qk~3jiB?z3cqEeTPFheCGX?^v^?=cP%YMrgl72d*@NK&7e zfxQYiR#H_bFU3zd94rX6h)LMQge91y2Js8y*~pbb4IKXCF*y*L6n{>w)U)elK}?Fk z7jhz3KOhg$qvFCN43r?!#~0-M6luE!yfvuS`ht9inWwFmXS=V5T?C{tR#8hl!2YQ* zar>t&Ds4|4HnqU$=Q$pO`D5*sR3sU@zzw)xnk-)O`Kf+>_bcpz9WU<u^tn&8_pL2o zw~PIoUGYG7X?lN>E(^Fhb(-JWS_wxjRYU6*BGS_?^YQjuTkG@m2_LQRmUozp)EvOQ z4N30dxsTT8ez10DZEPQ2UxdDUu(BVm@oAqN$iwLqeLs_b?#IU=zkjfC+ru}LKKFrR z<iYyw(HhVDwz=aAEMN2tXFJ{YrkkO=ITJJwfz*5iPTK08i_l3s-E)ZR;+&3tI=`b| zCjzYcPbcWYulXci<LSI`T5oFiT-xGK^!azu=vO-x-`MAq!}U0SI<OvY&bN;7o<92t z`Q91#k4Kcc0r9Ce=2x@7zS6C=;}A>T21KM8&KWG?E11uSpT}tLW~9$yr0dsZzq1+r z{@2N=$j(G8D!&(pYSf;`FSvdbiWWv;-M_s?^Ks#9>tuJj)&4+BA$^`1{(g+tw$zR_ zHy&qhJjUz~*ml;Ks6UeInP;QlGuLJY+Q>LP(^R}?rtDSd#7aA&fAh4l7trWAjVPm> zMh135bk1d3 BfYZ%khb7DWP=edEj2htvZ`~E)McfC6auDc#?yNQjet&GgGIr+4m z4XlN1V9mF+>?$~K2K=$sHpaC1HP^6*K85p~KjC?SiC-m#Wz-JLu0DzjHztARjUGlv zR`q~VbI^CJ9XRm?Kkdlh{0q~L+%WYt`aP|A8VXZTaP^r^=WnAOVd|>8Q_)n1pStSl z0*jD)vKvUB@%VU;wt)B=A8zNgzp2MS<9K*9`nRxnNS}ME_kP^IZyW2oj3>`w5~`or zIF(Zu>sU&h&W7C<j?DMkl3{MLWN2P4c%I$NtNjTI&!6kO`|$Yi;e11rVOj`#%vfK1 zD=eJ3$b_kyi_+)T37r$*ecM>S-Nv=X_Ef*)^E+R_SWln(gnHizUq6(M=xepa;B3o5 z{ta}tx}%$HV0P(%9SR-JI}}}9FEVJ9$$I~x=WP@{guKUw7M=xrRWS!EI}puf?3Ci6 zKTO&YCRloC9d>Nqe)DcZ^NXA`BEqS$!_v#{)uFmlO_zJrbjFMR#GZ7yle52+X~+2T z(*HiDdHN@{ZCGs|;%r<rW{oS<9!Q6jtD}mxJf<V>pXZq7dF1r>dGh1{Aim^KAn!Ds z6oeSg4<5`;z>%r^WBaW~$H4P?9fKTZt+o}VIVjy^Z_gs=D0^vE&{=Mbo6hg|1AKlg zK*eZEw4%Lc9;vZq5{<{KX+^F^PA2Wh$?9#Z$s}#UlMpp6#$Amo?aI}NY8DdbU4`3C z`%nkPrIP7g(G_k%p|m}5eYj5Vh^5Y%pCVl|y`C=6bJU}J^{_NHb+FyL2ctKpYfL|x zzJ~JVQcoj2M_-99SM>SF&eM11-(l!;|IVA=jel3^J4?T_=I>PB-=ThI(xqB21$I*r zLV?{hhzOg05iTk=1>)-(@kE%ayeWZ^V6sNMDSJV0(ugN)YFM~bbg?w(Lq#;8StlQD zp96LBR{;P_H_cSY2$czWl_AXY6=SI=nPSl@6bmpgfx4S%r=8>~gRuosYg#DNe!ZAW zAl8}#`z{kirOjGPupgZ<f;6sMcK;|U3!nBHXG9NSW&i~@>nwr=Ci{i-jXeutP5wbM z&kCCb6ZhJNI?HdcW*GAbNpD(#9z*2pVR}$u@CWTnr1B4hH9?zCM@6yDhLX&yKG#B7 zAPn;>BzrUxg?ScLLwh_(hEw`gl4*H`vSs(dkA!;J<g&-ad|^Y`_M{{#8}`YelIKSX zq&`i${i4{IAzx5lm=_*6l#b9YQTKzAOx93rNMSQO6pqq`JuoCIyr^uZCe~EA*DoZI zfko5Ru;+!+>wy5-?0G}kqbThs{RF9~M17*z*vyAFRaSNOz@hBC64`(aWtWm{7h#;k zx0|xN!}F5LP@olVA5K%@nH|;b$~R=4nWwsn6eP)I?@41|HuGT%KUoZrUkYd3o*Sb^ z*nusG4&-C)Y~*zyH<AWf2S+TVQRZD`(1a?p11FQN8&^PKF27a$<|VGQ)mHFZK$;%h zh5Tepb`ig&{1zwflElA^bc$0NrBxo~4P{8nZ9ahJBxv&iII1&;s|ibnjQr%^nlPyr z(}L?}^4BxSU5`752R_wY9#$*xWG}t08>fZUWPP})XkOCl)7IntE}xI{(%*0ZBpmz@ z5Ddo9WEf4q^mS<LrLQCXI;Q?QYI7VmVU71n<2P!%1f}~LmqXbuS=FQS2K%USJDKUR zDYC3950XibJJl23kLmN0ICTM4`Pvk*ran7SP%@Qpr9zndsMj*}*0^dvJhe76!D_9Z z5n1L<>R}2_>fvZkn2J``>%k07QV)zc#H09^WWsok71S?F^hx1d{vGB*RHzGnqU6GG z%hIb0!9#nO)C$K6Lzs6VhI$s)>OrqCX)xM^Nj(ee^-y|J4>cweBNhdGJ$c&JrWG=` zjt5jCMlD54UP{03X0dGMMKIF{6BI%XEf7u3GR#k6=ICHDi4P@H*j$(<lAYQ#H_ZH) zwQ`x~l5)l3DHlyfm8&|%>?xQx+^ecfvQ8BvSy@*bDkxmWQv9rq5T=7s7*UwK(E=~9 zZ1nv^iHI4JqR=BuhMQC%$Mhs+DHrysrlNeIZ^@GvaZtqM)f~Rs<dLXA9yAYD7|%&s zj+w@O9st{oBLLCFgd_GHhd`;pzT*W-BQu^A8GppceJ>7nAqVxpnj6cSEZa|<W^YP_ z#B(lhCPM&wq?`znn=u!AkeE0%0v?&B(s3Ej0-F67TAU_M{|jjjq}THw7&l%1dY;Dm z50;-HA2U8>G!YNBMDSz)AhJs(SJD_s9a>B((`cV+5pfDH;wzB55Lb4q7TBR0?<zc> z{B>B7_GsFpVa(5@F^Y|qHkhKO6h84C)r&lj%f@~=1H&7IX^cBt_`(Pa7BY)4=eRvX zun=d<%Cns<uQ5(y>uE~t*Zz=SY*WezY{IWwRS2xYuh-6JMPw^?7XGXbx5JmTZtOu2 zkgSD$#6^m*1s1L?y`bBwjIcET*Oqe7ZIMUVBo4T?GK6kxM#8q7#4SuwQ6XtTUT#B0 zp#kefpIlMB0oVX)u4tRm(|`k>sQFQ+s429dTP0eDQ&PPqgckl$FHsF9;_x*sMC4&} zZ_=}%fMFP%@7|?Mmj#8ala~-0C6sivPTboZt+W?m@+D*27~Ygn9#cY0&%>-seZR;C zAa9abdk+d~$|h`$l!00bBenIGPz0?a*4~Z<%Zjy^BnfZe*7XCII&>KhIE2HOVQCkZ zY4v5_)XTYge4Q5`d)nl-YOYD2-|xkonD3u2Z-@_>FRZ|KjWdG72iA{_l@ANdtCQAz ze&^{!D!6myjN$;-OXAr9XxG5(u&4>L76TT*9Tm;s|HF}|Po*1ZJ|v)B6sA7*d5##+ z_iEk@%Qv3<;aWIMuE*YAzxsMu%Onhz`1zandt?Sz7PDT`zUQI*rm}_-Xor%2W~P~+ z_CVSL{(M)q<jzHKKJ{;)>pxMOI0`9r+-=hDc(wm=sE4B0BJK)k@5FS|9`Ke_&OYLC zAl0ntevh6pm1ROd($-G*^r9bWnU8$Fv<DKKC@m##n``ziw05WQGmoq~!gtF(3vAL( z{X0~?JrmOPq&<-KfFUYL;b+2#oURQAQ^~DMyTUU}r+yabl7iL!s`Dh5_CVSLwzlZ{ zoSS;J9S*cib|;V7ppxj^z)UTRxlblCCbxX1g%A9)+c<2+#-ogQnCBpdJ{qDD^B^0@ z)oeLLl)BY`1KC0_g2QDtX?Mv6OWIur8kRW<qieEIL*XSedc+;fJlTP9fhCH;_)Q$o ze5UdT8YZOE9ysB9Kwm=VL+XX8>^ub8%%1}F#cWA?AngHLrmbPw(x^--wPOF1`Acus zQYJ39V(sD#%uney%#B$4&=r_#Tn{J1mvI_=F~$RReXguQh_(v<V$$at3<d_HfwBNH zn>rgUHa*zc??xOIzOb;|3gIJj=W#zp+5;zg4`@zUcgS<XRQ4bO?Z`&qOjsr@NP8gd zf!fyVIp``){Tt}|s%^ba9jjc2n1XL^K*l^8fBtUw3pwy6WuBniqw|{KR78-K)PcXZ zz@SrQVe$(8;EEpnjgwuVwNck*rU6~&yNR?doaxa;Um1QI&E~W2g%38LbxBzllcO#w zn}>NTU2D6Le2Yk{Nl<>>A-{k!xr)u%op!obwv~iZ5X(}Sbi)ukh%lXs6gv-Tchrvv zrrlv9MPpVYCh3koX%6H@^}l4w1bI#Zqf=1ELGPf*DdC`ZKyZ+=#V958dfkLF4hjoJ z4lkWcA=11+k3hN@9BE3FGdLt14w7LFA~`8`G%SD|4a*#}T-04~n`&q3xNWqDBfeZw z7S7vcU9|q<9UP}Fa_5$R#Qnq0wQar>V&&5HZMup}C-%n2^4;5t5TlFpDp6;<qU#Gg zvOA(e51*+&ws*I36${<&3}3_e^*b)z)`l4iUv%ZCm#*iMSGtLtC&x-T?l-3)9r%ax zvUQQ?ip6NSpxlGHHLYCK4Qh0}Zk{aW)b1h|sFBsK2rF}qE2Lf=T4XvhWlGzW)HYGh zm&R!3W`E*sywBzOb;~-9wO7V@v<#ZpBMbpZc^&c_<h*yKFf6_k^k-UiMtKWGj?xPc zS@9;r>2hz1NW62a&QCh-sNAX(l-?t&`AMJ`PX@LtLI(6DH;XH}SnwA7ay?6Kr7yaO zZ^5#lZev#37AzjM!%>xATB+@J<2p5EScJ5r4B8S`9AAPkKDW%XVre)1RvG8ewdT@) zT>|r8i7T~}9$eI`q>iq;zdQJ~Gpp2plf#M=O{YM0KJ)?#8EAPd|GmjtQN_YEXUJUO zT$?Y>U~Z6UL|Ih#KOaU-D@He2*OE)EC+*0zBWKo#tTC2eH-6C$=aQ4Qy>35x4=%6} zg6I}p;!0vUy)eFUsiGtdh)7dQ2rTLhOMEd`LzB2j;{B%K;ygF%O_WVCd|woGhN&rB z1e1YR4eADM&&jK3Eb{e9?Sbnl#mHNvxi1<Ao8kQ3;^g}aJ!r1T{t#@b%-%!Pqq$*^ z7`o#Q+e>^*p3R_Wy`Lap?k#Q)54Tx&SC?2IRNA&FDuUCuyS+SEn~SOT6sq0s=Z_vl zOZ&QIl_S<Q#Zix+MHZqnIj;JpZ4u>FbEUYA8@f&F<B~i|aG}=Cb_X-MADktiJ}dST zq%1C?(^1#8r-?4=flWo-MeJ-uOnaKCy3rS{ZWGyNJ<4y>rQ;3L9ijR>$2{(fVv56W zy-`tb5U6*63aCBvS&h%BJmKN+*Pp4LpGUF$;Th0m+@Y4A=jcOf0-Vssffnw4WR4W@ zkIFiD&&wPs+8O)GC=;ppY-MaPPhs3#Jk;wXkBZ8Dno5W40@5OrSS81V$aS5XdKnwJ z;;4lvm<g`WE-GdA#b2;IOuyvG4_O|~zsghcc_=~lL0mU8=%^~75N3wlSjHw1RCZ%t zqhE4_WyDlVi>YXh%Mmjbv6O<u@|WPQ!d;Ae5`$DG9OTM`!)m%@0j@M8We!3bk1`K& z3a-pWti{#k#_JMyJ+6!)oQf-R6SCMO^Ao4zw&89xw;lA*Vm2$}%8tbuxSD!22{+E& zZLD~->XE^9onh0g=2u?z$C0>DX*9>%$|q|c&DC1*NG(-MBF)!wwcOG&tDQ&mZVSzn zb&M9XETQRJ7ACrIz2%8ui9)Vs@)jPyjqZ?}zL@mIq+iV8d@&J9k|_Nr3P~74*rs5j zsRRoTh6h*!YKe4!B}H2?m?cG<>CKX2u!umOpcHd3D}s~r1XMsC!xsITiUO{n%mh*p zoxllr@@D3{8ZcpYEOs+f1|=ZOLZCsps9p&Cbw{;F79DIs)vGBMgI1i@@=M-9T~f`| zyG_<1tU1i?tED<hxfqcs3a9iX`jZzidnesgW~!IMWe-z^FFFq>KtmH-S(rjdmeXsK zvY~{s*O~rnH=x0HeIG^?q#=7ThBs<upJrvVY^lGB4N2k1kqT;437q2_4kdY~n@qp7 z8w?X(D-<i6g>iVjTMSgK2mI7tGoZ|nO;RwR4As)@E_vZ+TB+Bo(gI6d3Vii$!L=d7 z4XRqYP>226cb}s?dhM0J234I&3svF7R|KV4NtcKj?==KxYw20>{y`7h2&y;tQmf<D zZDv{z?;mAndvjVeTl33Oc?O<dq*Z=01dtn8vB(0F_tfSG1q2l=T-la%Zr!3qM^bcy z&5O>YXsn}H(Roan_(9QVIl~VMtZRg_=OkroGGlCE!U~P(ZUz)RJS-bm_R7|{#|m`} z%qvgrDOyy!*+2*gLGBu+$KVPvtN}cGx0x;^5#og?PNDj4T)`Y63m(Q0g^);==~rlC z75-WH+xf}gP97P%T7h5Fx6<_B%6^Fa%kj%J&r;kK<ngWyShbkJD_Po<;VUUI2aB09 zj5VLI+To{s8OYL<FJn|58VDi?Dg?+N2q7rZk+|)+f*67vjSxhTM9?G)1nI>UR1vhS zW1YGHQc^cTJ#AfTs`XOfN%9OqCqbwd8odQq=D-B4WC_eeE)T)f8G>ZGOa3(60M)vn z2M8xf=U;?>F@k)0k@LwDUTUC)u-xzx)0gaDcKVXjFF9GUH1D>|fG^n?KGqiyTQ3y6 z2vY*~8O%xsq-07W5psy_N|ekkP|SKn0|q(Sgb6^7xwRRPRLqHmTH#ERKBH_U1{ei) zG0PWFG|g6fNi)uze{r`~z+vXZY*#_D55xs?YUN`|is_V9J%aN9Yp7$j+pme&1nm-* z0B`at+3=MKR1i+Dzr;&H+5~K@;(}YrlS>wZv9X#|0~=#Dd5<X8rs}ptbV0s?itR`8 zF=0X%=3t3TRANA&7$P+|gN>>-iEV0jySz=(%`()H)Q)LUYQI==l%z%|)VNTTq$Y1) zbUSUSS?j{4sMP@646q8jqL|d+S~nN47bZMyBFCm#g3qAv1{Z=R1BUZ9F1IuH*T7h} z%I1|KN(yBI7$`e0dtCi``hswVl@0PR00v^ABMe4BN`?@Kg`u#GqsL(gwI?9*v`}_g zKnECW8xTd6-N&2oWdoSP@B~8@1c)IeWdpRVY@k;%JTtBW`b9$Ho4v2>oV_~GS|0_E z7Y&60>{RIZSf9!xlqat8d0Gh=w3qUSQmYR`@Ilo3N!fOT?-3+b+jiVd(O7WUW@F>k zis+|~alNZBIC|Ya8;)V+f{f8d0C3o<m%zx608Hj3V`8(}T0!7ndvD-s8vtyl_=44e zegLpb72X?|-QE&oGkI?Sdm91R#!JS;sY%&<Fa<SOM%DZPz=Yb6(CC<6ydMCJ=ukF` z4J(`Fhm|eaqaOf#)L~4(R_ra+*@_Ish%0Ij!*j>5!}wsdZZMq;fd&jV2lRRh<#h8C zR-23K4T`oS#qzMlV>@lKw1fHD4GS*8T}Hh2TqFToZgIkp?chM+O5s0A!rBe~$nv^i zQNX3DQ?N-QAxXOU!VPQ6@Tw$T+Ab0d+lVU(*CyNy?iO4mT-tBa?NnU`>ik1%!>5z& znmHD?g)M$<=bz3N|EZjD(+xnUaL#QFJ2l$B$`dEthsuvtunM{=UV$qx+=DBew~Tn< zyd}75@M7qCkcGIyY720M?b_2<lD-m+{PZh%kgp_gXl8|kGvhO^dGyS(9ESOxIc(7M zut!wm$t-)pMe7^pX%Ld%Sz=>^IX>a}WUOzV)WHDIE7@P^22a(P|6KN93SqCw+dyZQ zliBiyjT*p7GQ})t+{^*RBy}PaOE!GAcMAX|lMS0p3&XJo<Z5BUS<<*~M4B+`EThgE z##>aY6SJjtY=>wqsS|iq!*sbCbl?$cJ6d&gi(&X=>x&K)2p!X0UWPYT+LFyF`jGxC zYL>K}wt62jRhBhX0)tLz=tO4OUO%U@kyr0SrsD*&tXHLBf3G%i+g@Q(r|k%aI@wvQ z_aX2g)VVR~#Bq?aOKN0u$?v>P0F+f-FLfp7P|ne_ZF9cQtk2JO<Mh;y?{l8xTs8GC z%@Y+=10aV}9c|1{wq2#Yno53fES}Aj7WEEsngnSVDd#a`Y4=K}wQXx`fkwΝrB* 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 literal 134722 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≫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 a%Us}}F8w{>nlzJh=lLB9<_UiLW&RB{6O0Z3 From 5e7f6e0078ff44b14ec94545a63247acb607d274 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Sun, 14 Aug 2016 15:41:07 +0200 Subject: [PATCH 0039/1062] tabs fills available width, logo has additional padding to right --- js/src/ui/views/Application/style.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/ui/views/Application/style.css b/js/src/ui/views/Application/style.css index ae301f7f609..d5ee822a96d 100644 --- a/js/src/ui/views/Application/style.css +++ b/js/src/ui/views/Application/style.css @@ -9,10 +9,10 @@ } .tabs { - min-width: 450px; + width: 100%; } .logo { height: 56px; - padding: 8px 2em 8px 0; + padding: 8px 3em 8px 0; } From 346c9ad3d7f1f2fe7b70fa6106d99094dbff6538 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Sun, 14 Aug 2016 21:58:12 +0200 Subject: [PATCH 0040/1062] some artistic license with the logo (until proper source is found) --- js/src/images/parity-x56.png | Bin 5236 -> 5397 bytes js/src/images/parity.xcf | Bin 193504 -> 17562 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/js/src/images/parity-x56.png b/js/src/images/parity-x56.png index b07eed291a6be06b83cde0e5114740e47a2549b0..e303427a4e69f0c626cc05b77b3fdacd3b80f86a 100644 GIT binary patch delta 5396 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 delta 5234 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 diff --git a/js/src/images/parity.xcf b/js/src/images/parity.xcf index 67ce23d76bc7476f03a4901ffdce160ff4c6a980..37fa206c0f14228e678afdf88291be984594b044 100644 GIT binary patch literal 17562 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 UNeC=?`fpe89tW_oaNy_v08PtwZ2$lO literal 193504 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%0D?QeGe^Z!E9eClFNdAgBNcf`!2H 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 %d#xL1Xj0>o&(68mtubpmu+m0Ri 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ΝrB* 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 From 9dad7f2ab7080be02b3ddcb0a88c57eedd27ee05 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 15 Aug 2016 10:45:55 +0200 Subject: [PATCH 0041/1062] s/Overlay/Modal/, s/dialogs/modals/ --- js/src/ui/Modal/ModalSteps/index.js | 1 + .../overlaySteps.js => Modal/ModalSteps/modalSteps.js} | 2 +- .../ui/{Overlay/OverlaySteps => Modal/ModalSteps}/style.css | 0 js/src/ui/Modal/index.js | 1 + js/src/ui/{Overlay/overlay.js => Modal/modal.js} | 6 +++--- js/src/ui/Overlay/OverlaySteps/index.js | 1 - js/src/ui/Overlay/index.js | 1 - .../ui/{dialogs => modals}/FirstRun/Completed/completed.js | 0 js/src/ui/{dialogs => modals}/FirstRun/Completed/index.js | 0 .../FirstRun/CreateAccount/createAccount.js | 0 .../ui/{dialogs => modals}/FirstRun/CreateAccount/index.js | 0 .../ui/{dialogs => modals}/FirstRun/RecoverAccount/index.js | 0 .../FirstRun/RecoverAccount/recoverAccount.js | 0 js/src/ui/{dialogs => modals}/FirstRun/Welcome/index.js | 0 js/src/ui/{dialogs => modals}/FirstRun/Welcome/welcome.js | 0 js/src/ui/{dialogs => modals}/FirstRun/firstRun.js | 6 +++--- js/src/ui/{dialogs => modals}/FirstRun/index.js | 0 js/src/ui/{dialogs => modals}/FundAccount/fundAccount.js | 6 +++--- js/src/ui/{dialogs => modals}/FundAccount/index.js | 0 .../NewAccount/AccountDetails/accountDetails.js | 0 .../{dialogs => modals}/NewAccount/AccountDetails/index.js | 0 .../NewAccount/CreateAccount/createAccount.js | 0 .../{dialogs => modals}/NewAccount/CreateAccount/index.js | 0 .../NewAccount/CreationType/creationType.js | 0 .../ui/{dialogs => modals}/NewAccount/CreationType/index.js | 0 .../NewAccount/ImportWallet/importWallet.js | 0 .../ui/{dialogs => modals}/NewAccount/ImportWallet/index.js | 0 js/src/ui/{dialogs => modals}/NewAccount/index.js | 0 js/src/ui/{dialogs => modals}/NewAccount/newAccount.js | 6 +++--- js/src/ui/{dialogs => modals}/NewAccount/style.css | 0 js/src/ui/{dialogs => modals}/Transfer/Details/details.js | 0 js/src/ui/{dialogs => modals}/Transfer/Details/index.js | 0 js/src/ui/{dialogs => modals}/Transfer/Verify/index.js | 0 js/src/ui/{dialogs => modals}/Transfer/Verify/verify.js | 0 js/src/ui/{dialogs => modals}/Transfer/index.js | 0 js/src/ui/{dialogs => modals}/Transfer/style.css | 0 js/src/ui/{dialogs => modals}/Transfer/transfer.js | 6 +++--- js/src/ui/{dialogs => modals}/index.js | 0 js/src/ui/views/Account/account.js | 2 +- js/src/ui/views/Accounts/accounts.js | 2 +- js/src/ui/views/Application/application.js | 2 +- 41 files changed, 21 insertions(+), 21 deletions(-) create mode 100644 js/src/ui/Modal/ModalSteps/index.js rename js/src/ui/{Overlay/OverlaySteps/overlaySteps.js => Modal/ModalSteps/modalSteps.js} (93%) rename js/src/ui/{Overlay/OverlaySteps => Modal/ModalSteps}/style.css (100%) create mode 100644 js/src/ui/Modal/index.js rename js/src/ui/{Overlay/overlay.js => Modal/modal.js} (85%) delete mode 100644 js/src/ui/Overlay/OverlaySteps/index.js delete mode 100644 js/src/ui/Overlay/index.js rename js/src/ui/{dialogs => modals}/FirstRun/Completed/completed.js (100%) rename js/src/ui/{dialogs => modals}/FirstRun/Completed/index.js (100%) rename js/src/ui/{dialogs => modals}/FirstRun/CreateAccount/createAccount.js (100%) rename js/src/ui/{dialogs => modals}/FirstRun/CreateAccount/index.js (100%) rename js/src/ui/{dialogs => modals}/FirstRun/RecoverAccount/index.js (100%) rename js/src/ui/{dialogs => modals}/FirstRun/RecoverAccount/recoverAccount.js (100%) rename js/src/ui/{dialogs => modals}/FirstRun/Welcome/index.js (100%) rename js/src/ui/{dialogs => modals}/FirstRun/Welcome/welcome.js (100%) rename js/src/ui/{dialogs => modals}/FirstRun/firstRun.js (97%) rename js/src/ui/{dialogs => modals}/FirstRun/index.js (100%) rename js/src/ui/{dialogs => modals}/FundAccount/fundAccount.js (93%) rename js/src/ui/{dialogs => modals}/FundAccount/index.js (100%) rename js/src/ui/{dialogs => modals}/NewAccount/AccountDetails/accountDetails.js (100%) rename js/src/ui/{dialogs => modals}/NewAccount/AccountDetails/index.js (100%) rename js/src/ui/{dialogs => modals}/NewAccount/CreateAccount/createAccount.js (100%) rename js/src/ui/{dialogs => modals}/NewAccount/CreateAccount/index.js (100%) rename js/src/ui/{dialogs => modals}/NewAccount/CreationType/creationType.js (100%) rename js/src/ui/{dialogs => modals}/NewAccount/CreationType/index.js (100%) rename js/src/ui/{dialogs => modals}/NewAccount/ImportWallet/importWallet.js (100%) rename js/src/ui/{dialogs => modals}/NewAccount/ImportWallet/index.js (100%) rename js/src/ui/{dialogs => modals}/NewAccount/index.js (100%) rename js/src/ui/{dialogs => modals}/NewAccount/newAccount.js (98%) rename js/src/ui/{dialogs => modals}/NewAccount/style.css (100%) rename js/src/ui/{dialogs => modals}/Transfer/Details/details.js (100%) rename js/src/ui/{dialogs => modals}/Transfer/Details/index.js (100%) rename js/src/ui/{dialogs => modals}/Transfer/Verify/index.js (100%) rename js/src/ui/{dialogs => modals}/Transfer/Verify/verify.js (100%) rename js/src/ui/{dialogs => modals}/Transfer/index.js (100%) rename js/src/ui/{dialogs => modals}/Transfer/style.css (100%) rename js/src/ui/{dialogs => modals}/Transfer/transfer.js (97%) rename js/src/ui/{dialogs => modals}/index.js (100%) diff --git a/js/src/ui/Modal/ModalSteps/index.js b/js/src/ui/Modal/ModalSteps/index.js new file mode 100644 index 00000000000..08e0460607f --- /dev/null +++ b/js/src/ui/Modal/ModalSteps/index.js @@ -0,0 +1 @@ +export default from './ModalSteps'; diff --git a/js/src/ui/Overlay/OverlaySteps/overlaySteps.js b/js/src/ui/Modal/ModalSteps/modalSteps.js similarity index 93% rename from js/src/ui/Overlay/OverlaySteps/overlaySteps.js rename to js/src/ui/Modal/ModalSteps/modalSteps.js index 527191bd1b2..d62b98d4486 100644 --- a/js/src/ui/Overlay/OverlaySteps/overlaySteps.js +++ b/js/src/ui/Modal/ModalSteps/modalSteps.js @@ -4,7 +4,7 @@ import { Step, Stepper, StepLabel } from 'material-ui/Stepper'; import styles from './style.css'; -export default class OverlaySteps extends Component { +export default class ModalSteps extends Component { static propTypes = { current: PropTypes.number, steps: PropTypes.array.isRequired diff --git a/js/src/ui/Overlay/OverlaySteps/style.css b/js/src/ui/Modal/ModalSteps/style.css similarity index 100% rename from js/src/ui/Overlay/OverlaySteps/style.css rename to js/src/ui/Modal/ModalSteps/style.css diff --git a/js/src/ui/Modal/index.js b/js/src/ui/Modal/index.js new file mode 100644 index 00000000000..adfcb8f125b --- /dev/null +++ b/js/src/ui/Modal/index.js @@ -0,0 +1 @@ +export default from './Modal'; diff --git a/js/src/ui/Overlay/overlay.js b/js/src/ui/Modal/modal.js similarity index 85% rename from js/src/ui/Overlay/overlay.js rename to js/src/ui/Modal/modal.js index 1ec425c2980..8f5d30b3339 100644 --- a/js/src/ui/Overlay/overlay.js +++ b/js/src/ui/Modal/modal.js @@ -2,13 +2,13 @@ import React, { Component, PropTypes } from 'react'; import { Dialog } from 'material-ui'; -import OverlaySteps from './OverlaySteps'; +import ModalSteps from './ModalSteps'; const TITLE_STYLE = { borderStyle: 'none' }; const DIALOG_STYLE = { paddingTop: '1px' }; const CONTENT_STYLE = { transform: 'translate(0px, 0px)' }; -export default class Overlay extends Component { +export default class Modal extends Component { static propTypes = { actions: PropTypes.node, children: PropTypes.node, @@ -22,7 +22,7 @@ export default class Overlay extends Component { render () { const title = this.props.steps - ? (<OverlaySteps current={ this.props.current } steps={ this.props.steps } />) + ? (<ModalSteps current={ this.props.current } steps={ this.props.steps } />) : this.props.title; return ( diff --git a/js/src/ui/Overlay/OverlaySteps/index.js b/js/src/ui/Overlay/OverlaySteps/index.js deleted file mode 100644 index b07a3696063..00000000000 --- a/js/src/ui/Overlay/OverlaySteps/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './overlaySteps'; diff --git a/js/src/ui/Overlay/index.js b/js/src/ui/Overlay/index.js deleted file mode 100644 index 97520354371..00000000000 --- a/js/src/ui/Overlay/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './overlay'; diff --git a/js/src/ui/dialogs/FirstRun/Completed/completed.js b/js/src/ui/modals/FirstRun/Completed/completed.js similarity index 100% rename from js/src/ui/dialogs/FirstRun/Completed/completed.js rename to js/src/ui/modals/FirstRun/Completed/completed.js diff --git a/js/src/ui/dialogs/FirstRun/Completed/index.js b/js/src/ui/modals/FirstRun/Completed/index.js similarity index 100% rename from js/src/ui/dialogs/FirstRun/Completed/index.js rename to js/src/ui/modals/FirstRun/Completed/index.js diff --git a/js/src/ui/dialogs/FirstRun/CreateAccount/createAccount.js b/js/src/ui/modals/FirstRun/CreateAccount/createAccount.js similarity index 100% rename from js/src/ui/dialogs/FirstRun/CreateAccount/createAccount.js rename to js/src/ui/modals/FirstRun/CreateAccount/createAccount.js diff --git a/js/src/ui/dialogs/FirstRun/CreateAccount/index.js b/js/src/ui/modals/FirstRun/CreateAccount/index.js similarity index 100% rename from js/src/ui/dialogs/FirstRun/CreateAccount/index.js rename to js/src/ui/modals/FirstRun/CreateAccount/index.js diff --git a/js/src/ui/dialogs/FirstRun/RecoverAccount/index.js b/js/src/ui/modals/FirstRun/RecoverAccount/index.js similarity index 100% rename from js/src/ui/dialogs/FirstRun/RecoverAccount/index.js rename to js/src/ui/modals/FirstRun/RecoverAccount/index.js diff --git a/js/src/ui/dialogs/FirstRun/RecoverAccount/recoverAccount.js b/js/src/ui/modals/FirstRun/RecoverAccount/recoverAccount.js similarity index 100% rename from js/src/ui/dialogs/FirstRun/RecoverAccount/recoverAccount.js rename to js/src/ui/modals/FirstRun/RecoverAccount/recoverAccount.js diff --git a/js/src/ui/dialogs/FirstRun/Welcome/index.js b/js/src/ui/modals/FirstRun/Welcome/index.js similarity index 100% rename from js/src/ui/dialogs/FirstRun/Welcome/index.js rename to js/src/ui/modals/FirstRun/Welcome/index.js diff --git a/js/src/ui/dialogs/FirstRun/Welcome/welcome.js b/js/src/ui/modals/FirstRun/Welcome/welcome.js similarity index 100% rename from js/src/ui/dialogs/FirstRun/Welcome/welcome.js rename to js/src/ui/modals/FirstRun/Welcome/welcome.js diff --git a/js/src/ui/dialogs/FirstRun/firstRun.js b/js/src/ui/modals/FirstRun/firstRun.js similarity index 97% rename from js/src/ui/dialogs/FirstRun/firstRun.js rename to js/src/ui/modals/FirstRun/firstRun.js index 0f4898c7873..4679724a153 100644 --- a/js/src/ui/dialogs/FirstRun/firstRun.js +++ b/js/src/ui/modals/FirstRun/firstRun.js @@ -5,7 +5,7 @@ import ActionDone from 'material-ui/svg-icons/action/done'; import ActionDoneAll from 'material-ui/svg-icons/action/done-all'; import NavigationArrowForward from 'material-ui/svg-icons/navigation/arrow-forward'; -import Overlay from '../../Overlay'; +import Modal from '../../Modal'; import Completed from './Completed'; import CreateAccount from './CreateAccount'; @@ -26,7 +26,7 @@ export default class FirstRun extends Component { render () { return ( - <Overlay + <Modal actions={ this.renderDialogActions() } current={ this.state.stage } steps={ STAGE_NAMES } @@ -42,7 +42,7 @@ export default class FirstRun extends Component { visible={ this.state.stage === 2 } /> <Completed visible={ this.state.stage === 3 } /> - </Overlay> + </Modal> ); } diff --git a/js/src/ui/dialogs/FirstRun/index.js b/js/src/ui/modals/FirstRun/index.js similarity index 100% rename from js/src/ui/dialogs/FirstRun/index.js rename to js/src/ui/modals/FirstRun/index.js diff --git a/js/src/ui/dialogs/FundAccount/fundAccount.js b/js/src/ui/modals/FundAccount/fundAccount.js similarity index 93% rename from js/src/ui/dialogs/FundAccount/fundAccount.js rename to js/src/ui/modals/FundAccount/fundAccount.js index d61bd4b4686..b16f25c86bd 100644 --- a/js/src/ui/dialogs/FundAccount/fundAccount.js +++ b/js/src/ui/modals/FundAccount/fundAccount.js @@ -3,7 +3,7 @@ import React, { Component, PropTypes } from 'react'; import { FlatButton } from 'material-ui'; import ContentClear from 'material-ui/svg-icons/content/clear'; -import Overlay from '../../Overlay'; +import Modal from '../../Modal'; const STAGE_NAMES = ['fund account']; @@ -20,7 +20,7 @@ export default class FundAccount extends Component { render () { return ( - <Overlay + <Modal actions={ this.renderDialogActions() } current={ this.state.stage } steps={ STAGE_NAMES } @@ -28,7 +28,7 @@ export default class FundAccount extends Component { <div> Placeholder until such time as we have the ShapeShift.io integration going (just time, a scarce commodity) </div> - </Overlay> + </Modal> ); } diff --git a/js/src/ui/dialogs/FundAccount/index.js b/js/src/ui/modals/FundAccount/index.js similarity index 100% rename from js/src/ui/dialogs/FundAccount/index.js rename to js/src/ui/modals/FundAccount/index.js diff --git a/js/src/ui/dialogs/NewAccount/AccountDetails/accountDetails.js b/js/src/ui/modals/NewAccount/AccountDetails/accountDetails.js similarity index 100% rename from js/src/ui/dialogs/NewAccount/AccountDetails/accountDetails.js rename to js/src/ui/modals/NewAccount/AccountDetails/accountDetails.js diff --git a/js/src/ui/dialogs/NewAccount/AccountDetails/index.js b/js/src/ui/modals/NewAccount/AccountDetails/index.js similarity index 100% rename from js/src/ui/dialogs/NewAccount/AccountDetails/index.js rename to js/src/ui/modals/NewAccount/AccountDetails/index.js diff --git a/js/src/ui/dialogs/NewAccount/CreateAccount/createAccount.js b/js/src/ui/modals/NewAccount/CreateAccount/createAccount.js similarity index 100% rename from js/src/ui/dialogs/NewAccount/CreateAccount/createAccount.js rename to js/src/ui/modals/NewAccount/CreateAccount/createAccount.js diff --git a/js/src/ui/dialogs/NewAccount/CreateAccount/index.js b/js/src/ui/modals/NewAccount/CreateAccount/index.js similarity index 100% rename from js/src/ui/dialogs/NewAccount/CreateAccount/index.js rename to js/src/ui/modals/NewAccount/CreateAccount/index.js diff --git a/js/src/ui/dialogs/NewAccount/CreationType/creationType.js b/js/src/ui/modals/NewAccount/CreationType/creationType.js similarity index 100% rename from js/src/ui/dialogs/NewAccount/CreationType/creationType.js rename to js/src/ui/modals/NewAccount/CreationType/creationType.js diff --git a/js/src/ui/dialogs/NewAccount/CreationType/index.js b/js/src/ui/modals/NewAccount/CreationType/index.js similarity index 100% rename from js/src/ui/dialogs/NewAccount/CreationType/index.js rename to js/src/ui/modals/NewAccount/CreationType/index.js diff --git a/js/src/ui/dialogs/NewAccount/ImportWallet/importWallet.js b/js/src/ui/modals/NewAccount/ImportWallet/importWallet.js similarity index 100% rename from js/src/ui/dialogs/NewAccount/ImportWallet/importWallet.js rename to js/src/ui/modals/NewAccount/ImportWallet/importWallet.js diff --git a/js/src/ui/dialogs/NewAccount/ImportWallet/index.js b/js/src/ui/modals/NewAccount/ImportWallet/index.js similarity index 100% rename from js/src/ui/dialogs/NewAccount/ImportWallet/index.js rename to js/src/ui/modals/NewAccount/ImportWallet/index.js diff --git a/js/src/ui/dialogs/NewAccount/index.js b/js/src/ui/modals/NewAccount/index.js similarity index 100% rename from js/src/ui/dialogs/NewAccount/index.js rename to js/src/ui/modals/NewAccount/index.js diff --git a/js/src/ui/dialogs/NewAccount/newAccount.js b/js/src/ui/modals/NewAccount/newAccount.js similarity index 98% rename from js/src/ui/dialogs/NewAccount/newAccount.js rename to js/src/ui/modals/NewAccount/newAccount.js index 037db1b2609..0c5703e55b6 100644 --- a/js/src/ui/dialogs/NewAccount/newAccount.js +++ b/js/src/ui/modals/NewAccount/newAccount.js @@ -7,7 +7,7 @@ import ContentClear from 'material-ui/svg-icons/content/clear'; import NavigationArrowBack from 'material-ui/svg-icons/navigation/arrow-back'; import NavigationArrowForward from 'material-ui/svg-icons/navigation/arrow-forward'; -import Overlay from '../../Overlay'; +import Modal from '../../Modal'; import AccountDetails from './AccountDetails'; import CreationType from './CreationType'; @@ -41,13 +41,13 @@ export default class NewAccount extends Component { render () { return ( - <Overlay + <Modal actions={ this.renderDialogActions() } current={ this.state.stage } steps={ this.state.createType === 'fromNew' ? STAGE_NAMES : STAGE_IMPORT } visible={ this.props.visible }> { this.renderPage() } - </Overlay> + </Modal> ); } diff --git a/js/src/ui/dialogs/NewAccount/style.css b/js/src/ui/modals/NewAccount/style.css similarity index 100% rename from js/src/ui/dialogs/NewAccount/style.css rename to js/src/ui/modals/NewAccount/style.css diff --git a/js/src/ui/dialogs/Transfer/Details/details.js b/js/src/ui/modals/Transfer/Details/details.js similarity index 100% rename from js/src/ui/dialogs/Transfer/Details/details.js rename to js/src/ui/modals/Transfer/Details/details.js diff --git a/js/src/ui/dialogs/Transfer/Details/index.js b/js/src/ui/modals/Transfer/Details/index.js similarity index 100% rename from js/src/ui/dialogs/Transfer/Details/index.js rename to js/src/ui/modals/Transfer/Details/index.js diff --git a/js/src/ui/dialogs/Transfer/Verify/index.js b/js/src/ui/modals/Transfer/Verify/index.js similarity index 100% rename from js/src/ui/dialogs/Transfer/Verify/index.js rename to js/src/ui/modals/Transfer/Verify/index.js diff --git a/js/src/ui/dialogs/Transfer/Verify/verify.js b/js/src/ui/modals/Transfer/Verify/verify.js similarity index 100% rename from js/src/ui/dialogs/Transfer/Verify/verify.js rename to js/src/ui/modals/Transfer/Verify/verify.js diff --git a/js/src/ui/dialogs/Transfer/index.js b/js/src/ui/modals/Transfer/index.js similarity index 100% rename from js/src/ui/dialogs/Transfer/index.js rename to js/src/ui/modals/Transfer/index.js diff --git a/js/src/ui/dialogs/Transfer/style.css b/js/src/ui/modals/Transfer/style.css similarity index 100% rename from js/src/ui/dialogs/Transfer/style.css rename to js/src/ui/modals/Transfer/style.css diff --git a/js/src/ui/dialogs/Transfer/transfer.js b/js/src/ui/modals/Transfer/transfer.js similarity index 97% rename from js/src/ui/dialogs/Transfer/transfer.js rename to js/src/ui/modals/Transfer/transfer.js index 0eb7fe9e9e9..044768a98f3 100644 --- a/js/src/ui/dialogs/Transfer/transfer.js +++ b/js/src/ui/modals/Transfer/transfer.js @@ -5,7 +5,7 @@ import ContentSend from 'material-ui/svg-icons/content/send'; import NavigationArrowBack from 'material-ui/svg-icons/navigation/arrow-back'; import NavigationArrowForward from 'material-ui/svg-icons/navigation/arrow-forward'; -import Overlay from '../../Overlay'; +import Modal from '../../Modal'; import Details from './Details'; import Verify from './Verify'; @@ -26,13 +26,13 @@ export default class Transfer extends Component { render () { return ( - <Overlay + <Modal actions={ this.renderDialogActions() } current={ this.state.stage } steps={ STAGE_NAMES } visible={ this.props.visible }> { this.renderPage() } - </Overlay> + </Modal> ); } diff --git a/js/src/ui/dialogs/index.js b/js/src/ui/modals/index.js similarity index 100% rename from js/src/ui/dialogs/index.js rename to js/src/ui/modals/index.js diff --git a/js/src/ui/views/Account/account.js b/js/src/ui/views/Account/account.js index c695041285d..b1eb72589bd 100644 --- a/js/src/ui/views/Account/account.js +++ b/js/src/ui/views/Account/account.js @@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'; import ContentCreate from 'material-ui/svg-icons/content/create'; -import { FundAccount, Transfer } from '../../dialogs'; +import { FundAccount, Transfer } from '../../modals'; import Balances from '../../Balances'; import Container, { Title } from '../../Container'; diff --git a/js/src/ui/views/Accounts/accounts.js b/js/src/ui/views/Accounts/accounts.js index 76ac92b31b1..a41ad6b13fe 100644 --- a/js/src/ui/views/Accounts/accounts.js +++ b/js/src/ui/views/Accounts/accounts.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import AccountSummary from './AccountSummary'; import Actions from './Actions'; -import { NewAccount } from '../../dialogs'; +import { NewAccount } from '../../modals'; import styles from './style.css'; diff --git a/js/src/ui/views/Application/application.js b/js/src/ui/views/Application/application.js index ebd8d40fe0b..7171d35c30b 100644 --- a/js/src/ui/views/Application/application.js +++ b/js/src/ui/views/Application/application.js @@ -6,7 +6,7 @@ import lightBaseTheme from 'material-ui/styles/baseThemes/lightBaseTheme'; import Api from '../../../api'; -import { FirstRun } from '../../dialogs'; +import { FirstRun } from '../../modals'; import Status from './Status'; import TabBar from './TabBar'; From 42d117cf9767bcabc88102d64031b92a96b084ac Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 15 Aug 2016 11:16:21 +0200 Subject: [PATCH 0042/1062] basic transfer validations --- js/src/ui/modals/Transfer/Details/details.js | 31 +++++++++++++++----- js/src/ui/modals/Transfer/Verify/verify.js | 28 +++++++++++++++--- js/src/ui/modals/Transfer/transfer.js | 18 ++++++++++-- 3 files changed, 63 insertions(+), 14 deletions(-) diff --git a/js/src/ui/modals/Transfer/Details/details.js b/js/src/ui/modals/Transfer/Details/details.js index 07b400acee8..724db946fd3 100644 --- a/js/src/ui/modals/Transfer/Details/details.js +++ b/js/src/ui/modals/Transfer/Details/details.js @@ -15,6 +15,11 @@ const CHECK_STYLE = { left: '1em' }; +const ERRORS = { + requireRecipient: 'a recipient account is required for the transaction', + invalidAddress: 'the supplied address is an invalid network address' +}; + export default class Details extends Component { static contextTypes = { api: PropTypes.object.isRequired @@ -27,12 +32,12 @@ export default class Details extends Component { state = { recipient: '', + recipientError: ERRORS.requireRecipient, amount: 0.0, amountFull: false, amountGas: DEFAULT_GAS, amountTotal: 0.0, - gasprice: 0, - isValid: false + gasprice: 0 } componentDidMount () { @@ -48,6 +53,7 @@ export default class Details extends Component { <Input label='recipient address' hint='the recipient address' + error={ this.state.recipientError } value={ this.state.recipient } onChange={ this.onEditRecipient } /> <div className={ styles.columns }> @@ -89,10 +95,6 @@ export default class Details extends Component { ); } - updateParent = () => { - this.props.onChange(this.state.isValid); - } - onCheckFullAmount = (event) => { this.setState({ amountFull: !this.state.amountFull @@ -116,14 +118,29 @@ export default class Details extends Component { } onEditRecipient = (event) => { + let error = null; const value = event.target.value; + if (!value || !value.length) { + error = ERRORS.requireRecipient; + } else if (!Api.format.isAddressValid(value)) { + error = ERRORS.invalidAddress; + } + this.setState({ recipient: value, - isValid: false + recipientError: error }, this.calculateTotals); } + updateParent = () => { + const isValid = !this.state.recipientError; + + this.props.onChange(isValid, { + recipient: this.state.recipient + }); + } + calculateTotals = () => { const gas = new BigNumber(this.state.gasprice).mul(new BigNumber(this.state.amountGas || 0)); const amount = Api.format.toWei(this.state.amount || 0); diff --git a/js/src/ui/modals/Transfer/Verify/verify.js b/js/src/ui/modals/Transfer/Verify/verify.js index fa4be4c5324..dd588fb3885 100644 --- a/js/src/ui/modals/Transfer/Verify/verify.js +++ b/js/src/ui/modals/Transfer/Verify/verify.js @@ -4,18 +4,27 @@ import Form, { Input } from '../../../Form'; import styles from '../style.css'; +const ERRORS = { + noPassword: 'supply a valid password to confirm the transaction' +}; + export default class Verify extends Component { static propTypes = { address: PropTypes.string, recipient: PropTypes.string, signer: PropTypes.bool, amount: PropTypes.number, - amountTotal: PropTypes.number + amountTotal: PropTypes.number, + onChange: PropTypes.func.isRequired } state = { password: '', - errorPassword: '' + passwordError: ERRORS.noPassword + } + + componentDidMount () { + this.updateParent(); } render () { @@ -56,7 +65,7 @@ export default class Verify extends Component { <div className={ styles.columns }> <div> <Input - error={ this.state.errorPassword } + error={ this.state.passwordError } label='password' hint='password for the origin account' value={ this.state.password } @@ -69,13 +78,24 @@ export default class Verify extends Component { } updateParent = () => { + const isValid = !this.state.passwordError; + + this.props.onChange(isValid, { + password: this.state.password + }); } onEditPassword = (event) => { + let error = null; const value = event.target.value; + if (!value || !value.length) { + error = ERRORS.noPassword; + } + this.setState({ - password: value + password: value, + passwordError: error }, this.updateParent); } } diff --git a/js/src/ui/modals/Transfer/transfer.js b/js/src/ui/modals/Transfer/transfer.js index 044768a98f3..e78b02740b8 100644 --- a/js/src/ui/modals/Transfer/transfer.js +++ b/js/src/ui/modals/Transfer/transfer.js @@ -21,7 +21,8 @@ export default class Transfer extends Component { state = { stage: 0, - isValid: true + recipient: null, + isValid: false } render () { @@ -48,7 +49,8 @@ export default class Transfer extends Component { return ( <Verify address={ this.props.address } - onChange={ this.onChangeDetails } /> + recipient={ this.state.recipient } + onChange={ this.onChangePassword } /> ); } } @@ -103,8 +105,18 @@ export default class Transfer extends Component { }); } - onChangeDetails = (valid, details) => { + onChangeDetails = (valid, { recipient }) => { + this.setState({ + recipient: recipient, + isValid: valid + }); + } + onChangePassword = (valid, { password }) => { + this.setState({ + password: password, + isValid: valid + }); } onClose = () => { From c6ddaad05c2788fd2193b777a8d26c5f36563685 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 15 Aug 2016 12:33:18 +0200 Subject: [PATCH 0043/1062] input validation for transfer --- js/src/ui/Balances/balances.js | 20 ++++-- js/src/ui/modals/Transfer/Details/details.js | 76 +++++++++++++++----- js/src/ui/modals/Transfer/Verify/verify.js | 13 ++-- js/src/ui/modals/Transfer/transfer.js | 12 +++- js/src/ui/views/Account/account.js | 11 ++- 5 files changed, 103 insertions(+), 29 deletions(-) diff --git a/js/src/ui/Balances/balances.js b/js/src/ui/Balances/balances.js index 60137f7b10d..bde2495eefc 100644 --- a/js/src/ui/Balances/balances.js +++ b/js/src/ui/Balances/balances.js @@ -1,3 +1,4 @@ +import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; import Api from '../../api'; @@ -10,7 +11,8 @@ export default class Balances extends Component { } static propTypes = { - address: PropTypes.string.isRequired + address: PropTypes.string.isRequired, + onChange: PropTypes.func } state = { @@ -23,7 +25,7 @@ export default class Balances extends Component { render () { const balances = this.state.balances - .filter((balance) => balance.value.gt(0)) + .filter((balance) => new BigNumber(balance.value).gt(0)) .map((balance) => { return ( <div @@ -33,7 +35,7 @@ export default class Balances extends Component { src={ balance.img } alt={ balance.type } /> <div> - { balance.value.toFormat() } { balance.token } + { Api.format.fromWei(balance.value).toFormat() } { balance.token } </div> </div> ); @@ -50,6 +52,14 @@ export default class Balances extends Component { ); } + updateParent = () => { + if (!this.props.onChange) { + return; + } + + this.props.onChange(this.state.balances); + } + getBalances () { const api = this.context.api; @@ -62,12 +72,12 @@ export default class Balances extends Component { balances: [ { token: 'ΞTH', - value: Api.format.fromWei(balance), + value: balance.toString(), img: 'images/ethereum-32x32.png', type: 'Ethereum' } ] - }); + }, this.updateParent); }); } } diff --git a/js/src/ui/modals/Transfer/Details/details.js b/js/src/ui/modals/Transfer/Details/details.js index 724db946fd3..bf1998ba24c 100644 --- a/js/src/ui/modals/Transfer/Details/details.js +++ b/js/src/ui/modals/Transfer/Details/details.js @@ -17,7 +17,9 @@ const CHECK_STYLE = { const ERRORS = { requireRecipient: 'a recipient account is required for the transaction', - invalidAddress: 'the supplied address is an invalid network address' + invalidAddress: 'the supplied address is an invalid network address', + invalidAmount: 'the supplied amount should be a valid positive number', + largeAmount: 'the transaction total is higher than the available balance' }; export default class Details extends Component { @@ -27,16 +29,20 @@ export default class Details extends Component { static propTypes = { address: PropTypes.string.isRequired, + balance: PropTypes.object, onChange: PropTypes.func.isRequired } state = { recipient: '', recipientError: ERRORS.requireRecipient, - amount: 0.0, + amount: 0, + accountError: null, amountFull: false, - amountGas: DEFAULT_GAS, - amountTotal: 0.0, + gas: DEFAULT_GAS, + gasError: null, + total: 0, + totalError: null, gasprice: 0 } @@ -78,7 +84,8 @@ export default class Details extends Component { <Input label='gas amount' hint='the amount of gas to use for the transaction' - value={ this.state.amountGas } + error={ this.state.gasError } + value={ this.state.gas } onChange={ this.onEditGas } /> </div> </div> @@ -88,7 +95,8 @@ export default class Details extends Component { disabled label='total amount' hint='the total amount of the transaction' - value={ `${this.state.amountTotal} ΞTH` } /> + error={ this.state.totalError } + value={ `${Api.format.fromWei(this.state.total).toFormat()} ΞTH` } /> </div> </div> </Form> @@ -98,22 +106,48 @@ export default class Details extends Component { onCheckFullAmount = (event) => { this.setState({ amountFull: !this.state.amountFull - }); + }, this.calculateTotals); } onEditAmount = (event) => { - const value = event.target.value; + let value = event.target.value; + let error = null; + let num = null; + + try { + num = new BigNumber(value); + } catch (e) { + num = null; + } + + if (!num || num.lt(0)) { + error = ERRORS.invalidAmount; + } this.setState({ - amount: value + amount: value, + amountError: error }, this.calculateTotals); } onEditGas = (event) => { - const value = event.target.value; + let value = event.target.value; + let error = null; + let num = null; + + try { + num = new BigNumber(value); + } catch (e) { + num = null; + } + + if (!num || num.lt(0)) { + error = ERRORS.invalidAmount; + } this.setState({ - amount: value + gas: value, + gasError: error }, this.calculateTotals); } @@ -134,20 +168,30 @@ export default class Details extends Component { } updateParent = () => { - const isValid = !this.state.recipientError; + const isValid = !this.state.recipientError && !this.state.amountError && !this.state.gasError; this.props.onChange(isValid, { - recipient: this.state.recipient + amount: Api.format.fromWei(this.state.amount).toString(), + gas: this.state.gas, + recipient: this.state.recipient, + total: this.state.total }); } calculateTotals = () => { - const gas = new BigNumber(this.state.gasprice).mul(new BigNumber(this.state.amountGas || 0)); + const gas = new BigNumber(this.state.gasprice).mul(new BigNumber(this.state.gas || 0)); const amount = Api.format.toWei(this.state.amount || 0); - const total = Api.format.fromWei(amount.plus(gas)); + const total = amount.plus(gas); + const balance = new BigNumber(this.props.balance ? this.props.balance.value : 0); + let error = null; + + if (total.gt(balance)) { + error = ERRORS.largeAmount; + } this.setState({ - amountTotal: total.toNumber() + total: total.toString(), + totalError: error }, this.updateParent); } diff --git a/js/src/ui/modals/Transfer/Verify/verify.js b/js/src/ui/modals/Transfer/Verify/verify.js index dd588fb3885..d15d32073a3 100644 --- a/js/src/ui/modals/Transfer/Verify/verify.js +++ b/js/src/ui/modals/Transfer/Verify/verify.js @@ -1,5 +1,6 @@ import React, { Component, PropTypes } from 'react'; +import Api from '../../../../api'; import Form, { Input } from '../../../Form'; import styles from '../style.css'; @@ -13,8 +14,8 @@ export default class Verify extends Component { address: PropTypes.string, recipient: PropTypes.string, signer: PropTypes.bool, - amount: PropTypes.number, - amountTotal: PropTypes.number, + amount: PropTypes.string, + total: PropTypes.string, onChange: PropTypes.func.isRequired } @@ -50,16 +51,16 @@ export default class Verify extends Component { <div> <Input disabled - label='amount to transfer (in ΞTH)' + label='amount to transfer' hint='the amount to transfer to the recipient' - value={ this.props.amount } /> + value={ `${Api.format.fromWei(this.props.amount).toFormat()} ΞTH` } /> </div> <div> <Input disabled - label='total transaction amount (in ΞTH)' + label='total transaction amount' hint='the amount used by this transaction' - value={ this.props.amountTotal } /> + value={ `${Api.format.fromWei(this.props.total).toFormat()} ΞTH` } /> </div> </div> <div className={ styles.columns }> diff --git a/js/src/ui/modals/Transfer/transfer.js b/js/src/ui/modals/Transfer/transfer.js index e78b02740b8..e7b54aa4eac 100644 --- a/js/src/ui/modals/Transfer/transfer.js +++ b/js/src/ui/modals/Transfer/transfer.js @@ -15,13 +15,17 @@ const STAGE_NAMES = ['transfer', 'verify transaction', 'transaction receipt']; export default class Transfer extends Component { static propTypes = { address: PropTypes.string.isRequired, + balance: PropTypes.object, visible: PropTypes.bool.isRequired, onClose: PropTypes.func } state = { stage: 0, + amount: 0, + gas: 0, recipient: null, + total: 0, isValid: false } @@ -43,12 +47,15 @@ export default class Transfer extends Component { return ( <Details address={ this.props.address } + balance={ this.props.balance } onChange={ this.onChangeDetails } /> ); case 1: return ( <Verify address={ this.props.address } + amount={ this.state.amount } + total={ this.state.total } recipient={ this.state.recipient } onChange={ this.onChangePassword } /> ); @@ -105,9 +112,12 @@ export default class Transfer extends Component { }); } - onChangeDetails = (valid, { recipient }) => { + onChangeDetails = (valid, { amount, gas, recipient, total }) => { this.setState({ + amount: amount, + gas: gas, recipient: recipient, + total: total, isValid: valid }); } diff --git a/js/src/ui/views/Account/account.js b/js/src/ui/views/Account/account.js index b1eb72589bd..00bba032352 100644 --- a/js/src/ui/views/Account/account.js +++ b/js/src/ui/views/Account/account.js @@ -24,6 +24,7 @@ export default class Account extends Component { state = { name: 'Unnamed', + balances: [], fundDialog: false, transferDialog: false } @@ -51,6 +52,7 @@ export default class Account extends Component { visible={ this.state.fundDialog } /> <Transfer address={ address } + balance={ this.state.balances[0] } onClose={ this.onTransferClose } visible={ this.state.transferDialog } /> <Actions @@ -77,7 +79,8 @@ export default class Account extends Component { </FormWrap> </Form> <Balances - address={ address } /> + address={ address } + onChange={ this.onChangeBalances } /> </Container> </div> ); @@ -99,6 +102,12 @@ export default class Account extends Component { this.onTransferClick(); } + onChangeBalances = (balances) => { + this.setState({ + balances: balances + }); + } + onEditName = (event) => { const api = this.context.api; const name = event.target.value; From 2987748ada29c5db444d8de0bf1aeabce0cd0bf1 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 15 Aug 2016 12:39:46 +0200 Subject: [PATCH 0044/1062] allow transfer of full balance --- js/src/ui/modals/Transfer/Details/details.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/js/src/ui/modals/Transfer/Details/details.js b/js/src/ui/modals/Transfer/Details/details.js index bf1998ba24c..c541baeb679 100644 --- a/js/src/ui/modals/Transfer/Details/details.js +++ b/js/src/ui/modals/Transfer/Details/details.js @@ -104,7 +104,17 @@ export default class Details extends Component { } onCheckFullAmount = (event) => { + let amount = this.state.amount; + + if (!this.state.amountFull) { + const gas = new BigNumber(this.state.gasprice).mul(new BigNumber(this.state.gas || 0)); + const balance = new BigNumber(this.props.balance ? this.props.balance.value : 0); + + amount = Api.format.fromWei(balance.minus(gas)); + } + this.setState({ + amount: amount.toString(), amountFull: !this.state.amountFull }, this.calculateTotals); } From dbdf2793c11c59323c48b42f2535628a3854306a Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 15 Aug 2016 12:55:17 +0200 Subject: [PATCH 0045/1062] validations --- .../NewAccount/CreateAccount/createAccount.js | 45 ++++++++++++++++--- 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/js/src/ui/modals/NewAccount/CreateAccount/createAccount.js b/js/src/ui/modals/NewAccount/CreateAccount/createAccount.js index 63c1c747295..f59d395b9ed 100644 --- a/js/src/ui/modals/NewAccount/CreateAccount/createAccount.js +++ b/js/src/ui/modals/NewAccount/CreateAccount/createAccount.js @@ -7,6 +7,12 @@ import IdentityIcon from '../../../IdentityIcon'; import styles from '../style.css'; +const ERRORS = { + noName: 'you need to specify a valid name for the account', + invalidPassword: 'you need to specify a password >= 8 characters', + noMatchPassword: 'the supplied passwords does not match' +}; + export default class CreateAccount extends Component { static contextTypes = { api: PropTypes.object.isRequired @@ -18,8 +24,11 @@ export default class CreateAccount extends Component { state = { accountName: '', + accountNameError: ERRORS.noName, password1: '', + password1Error: ERRORS.invalidPassword, password2: '', + password2Error: ERRORS.noMatchPassword, accounts: null, selectedAddress: '', isValidPass: false, @@ -40,6 +49,7 @@ export default class CreateAccount extends Component { <Input label='account name' hint='a descriptive name for the account' + error={ this.state.accountNameError } value={ this.state.accountName } onChange={ this.onEditAccountName } /> <div className={ styles.passwords }> @@ -49,6 +59,7 @@ export default class CreateAccount extends Component { label='password' hint='a strong, unique password' type='password' + error={ this.state.password1Error } value={ this.state.password1 } onChange={ this.onEditPassword1 } /> </div> @@ -58,6 +69,7 @@ export default class CreateAccount extends Component { label='password (repeat)' hint='verify your password' type='password' + error={ this.state.password2Error } value={ this.state.password2 } onChange={ this.onEditPassword2 } /> </div> @@ -175,31 +187,52 @@ export default class CreateAccount extends Component { onEditAccountName = (event) => { const value = event.target.value; - const valid = value.length >= 2; + let error = null; + + if (!value || value.trim().length < 2) { + error = ERRORS.noName; + } this.setState({ accountName: value, - isValidName: valid + accountNameError: error, + isValidName: !error }, this.updateParent); } onEditPassword1 = (event) => { const value = event.target.value; - const valid = value.length >= 8 && this.state.password2 === value; + let error1 = null; + let error2 = null; + + if (!value || value.trim().length < 8) { + error1 = ERRORS.invalidPassword; + } + + if (value !== this.state.password2) { + error2 = ERRORS.noMatchPassword; + } this.setState({ password1: value, - isValidPass: valid + password1Error: error1, + password2Error: error2, + isValidPass: !error1 && !error2 }, this.updateParent); } onEditPassword2 = (event) => { const value = event.target.value; - const valid = value.length >= 8 && this.state.password1 === value; + let error2 = null; + + if (value !== this.state.password1) { + error2 = ERRORS.noMatchPassword; + } this.setState({ password2: value, - isValidPass: valid + password2Error: error2, + isValidPass: !error2 }, this.updateParent); } } From 69d0947771a3d7fbd423d632ea5e4eb5304ebedb Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 15 Aug 2016 12:57:26 +0200 Subject: [PATCH 0046/1062] filter uuid != null for accounts --- js/src/ui/views/Accounts/accounts.js | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/js/src/ui/views/Accounts/accounts.js b/js/src/ui/views/Accounts/accounts.js index a41ad6b13fe..25f4cfcaa1a 100644 --- a/js/src/ui/views/Accounts/accounts.js +++ b/js/src/ui/views/Accounts/accounts.js @@ -75,16 +75,18 @@ export default class Accounts extends Component { ]) .then(([addresses, infos]) => { this.setState({ - accounts: addresses.map((address) => { - const info = infos[address]; + accounts: addresses + .filter((address) => infos[address].uuid) + .map((address) => { + const info = infos[address]; - return { - address: address, - name: info.name, - uuid: info.uuid, - meta: info.meta - }; - }) + return { + address: address, + name: info.name, + uuid: info.uuid, + meta: info.meta + }; + }) }); }); } From 0c67d7b3b9a01ac0d6e9202d9ebd89ffa7c5aed5 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 15 Aug 2016 13:09:28 +0200 Subject: [PATCH 0047/1062] flatter ui structure --- js/src/app.js | 10 +++++----- js/src/{ui => }/modals/FirstRun/Completed/completed.js | 0 js/src/{ui => }/modals/FirstRun/Completed/index.js | 0 .../modals/FirstRun/CreateAccount/createAccount.js | 2 +- js/src/{ui => }/modals/FirstRun/CreateAccount/index.js | 0 .../{ui => }/modals/FirstRun/RecoverAccount/index.js | 0 .../modals/FirstRun/RecoverAccount/recoverAccount.js | 4 ++-- js/src/{ui => }/modals/FirstRun/Welcome/index.js | 0 js/src/{ui => }/modals/FirstRun/Welcome/welcome.js | 0 js/src/{ui => }/modals/FirstRun/firstRun.js | 2 +- js/src/{ui => }/modals/FirstRun/index.js | 0 js/src/{ui => }/modals/FundAccount/fundAccount.js | 2 +- js/src/{ui => }/modals/FundAccount/index.js | 0 .../modals/NewAccount/AccountDetails/accountDetails.js | 4 ++-- .../{ui => }/modals/NewAccount/AccountDetails/index.js | 0 .../modals/NewAccount/CreateAccount/createAccount.js | 4 ++-- .../{ui => }/modals/NewAccount/CreateAccount/index.js | 0 .../modals/NewAccount/CreationType/creationType.js | 0 .../{ui => }/modals/NewAccount/CreationType/index.js | 0 .../modals/NewAccount/ImportWallet/importWallet.js | 2 +- .../{ui => }/modals/NewAccount/ImportWallet/index.js | 0 js/src/{ui => }/modals/NewAccount/index.js | 0 js/src/{ui => }/modals/NewAccount/newAccount.js | 2 +- js/src/{ui => }/modals/NewAccount/style.css | 0 js/src/{ui => }/modals/Transfer/Details/details.js | 4 ++-- js/src/{ui => }/modals/Transfer/Details/index.js | 0 js/src/{ui => }/modals/Transfer/Verify/index.js | 0 js/src/{ui => }/modals/Transfer/Verify/verify.js | 4 ++-- js/src/{ui => }/modals/Transfer/index.js | 0 js/src/{ui => }/modals/Transfer/style.css | 0 js/src/{ui => }/modals/Transfer/transfer.js | 2 +- js/src/{ui => }/modals/index.js | 0 js/src/{ui => }/views/Account/Actions/actions.js | 0 js/src/{ui => }/views/Account/Actions/index.js | 0 js/src/{ui => }/views/Account/account.js | 8 ++++---- js/src/{ui => }/views/Account/index.js | 0 js/src/{ui => }/views/Account/style.css | 0 .../views/Accounts/AccountSummary/accountSummary.js | 6 +++--- js/src/{ui => }/views/Accounts/AccountSummary/index.js | 0 js/src/{ui => }/views/Accounts/Actions/actions.js | 0 js/src/{ui => }/views/Accounts/Actions/index.js | 0 js/src/{ui => }/views/Accounts/accounts.js | 0 js/src/{ui => }/views/Accounts/index.js | 0 js/src/{ui => }/views/Accounts/style.css | 0 js/src/{ui => }/views/Application/Status/index.js | 0 js/src/{ui => }/views/Application/Status/status.js | 0 js/src/{ui => }/views/Application/Status/style.css | 0 js/src/{ui => }/views/Application/TabBar/index.js | 0 js/src/{ui => }/views/Application/TabBar/tabBar.js | 0 js/src/{ui => }/views/Application/application.js | 2 +- js/src/{ui => }/views/Application/index.js | 0 js/src/{ui => }/views/Application/style.css | 0 js/src/{ui => }/views/Apps/apps.js | 2 +- js/src/{ui => }/views/Apps/index.js | 0 js/src/{ui => }/views/Tokens/index.js | 0 js/src/{ui => }/views/Tokens/tokens.js | 2 +- 56 files changed, 31 insertions(+), 31 deletions(-) rename js/src/{ui => }/modals/FirstRun/Completed/completed.js (100%) rename js/src/{ui => }/modals/FirstRun/Completed/index.js (100%) rename js/src/{ui => }/modals/FirstRun/CreateAccount/createAccount.js (96%) rename js/src/{ui => }/modals/FirstRun/CreateAccount/index.js (100%) rename js/src/{ui => }/modals/FirstRun/RecoverAccount/index.js (100%) rename js/src/{ui => }/modals/FirstRun/RecoverAccount/recoverAccount.js (91%) rename js/src/{ui => }/modals/FirstRun/Welcome/index.js (100%) rename js/src/{ui => }/modals/FirstRun/Welcome/welcome.js (100%) rename js/src/{ui => }/modals/FirstRun/firstRun.js (98%) rename js/src/{ui => }/modals/FirstRun/index.js (100%) rename js/src/{ui => }/modals/FundAccount/fundAccount.js (96%) rename js/src/{ui => }/modals/FundAccount/index.js (100%) rename js/src/{ui => }/modals/NewAccount/AccountDetails/accountDetails.js (93%) rename js/src/{ui => }/modals/NewAccount/AccountDetails/index.js (100%) rename js/src/{ui => }/modals/NewAccount/CreateAccount/createAccount.js (98%) rename js/src/{ui => }/modals/NewAccount/CreateAccount/index.js (100%) rename js/src/{ui => }/modals/NewAccount/CreationType/creationType.js (100%) rename js/src/{ui => }/modals/NewAccount/CreationType/index.js (100%) rename js/src/{ui => }/modals/NewAccount/ImportWallet/importWallet.js (98%) rename js/src/{ui => }/modals/NewAccount/ImportWallet/index.js (100%) rename js/src/{ui => }/modals/NewAccount/index.js (100%) rename js/src/{ui => }/modals/NewAccount/newAccount.js (99%) rename js/src/{ui => }/modals/NewAccount/style.css (100%) rename js/src/{ui => }/modals/Transfer/Details/details.js (98%) rename js/src/{ui => }/modals/Transfer/Details/index.js (100%) rename js/src/{ui => }/modals/Transfer/Verify/index.js (100%) rename js/src/{ui => }/modals/Transfer/Verify/verify.js (97%) rename js/src/{ui => }/modals/Transfer/index.js (100%) rename js/src/{ui => }/modals/Transfer/style.css (100%) rename js/src/{ui => }/modals/Transfer/transfer.js (98%) rename js/src/{ui => }/modals/index.js (100%) rename js/src/{ui => }/views/Account/Actions/actions.js (100%) rename js/src/{ui => }/views/Account/Actions/index.js (100%) rename js/src/{ui => }/views/Account/account.js (93%) rename js/src/{ui => }/views/Account/index.js (100%) rename js/src/{ui => }/views/Account/style.css (100%) rename js/src/{ui => }/views/Accounts/AccountSummary/accountSummary.js (82%) rename js/src/{ui => }/views/Accounts/AccountSummary/index.js (100%) rename js/src/{ui => }/views/Accounts/Actions/actions.js (100%) rename js/src/{ui => }/views/Accounts/Actions/index.js (100%) rename js/src/{ui => }/views/Accounts/accounts.js (100%) rename js/src/{ui => }/views/Accounts/index.js (100%) rename js/src/{ui => }/views/Accounts/style.css (100%) rename js/src/{ui => }/views/Application/Status/index.js (100%) rename js/src/{ui => }/views/Application/Status/status.js (100%) rename js/src/{ui => }/views/Application/Status/style.css (100%) rename js/src/{ui => }/views/Application/TabBar/index.js (100%) rename js/src/{ui => }/views/Application/TabBar/tabBar.js (100%) rename js/src/{ui => }/views/Application/application.js (98%) rename js/src/{ui => }/views/Application/index.js (100%) rename js/src/{ui => }/views/Application/style.css (100%) rename js/src/{ui => }/views/Apps/apps.js (85%) rename js/src/{ui => }/views/Apps/index.js (100%) rename js/src/{ui => }/views/Tokens/index.js (100%) rename js/src/{ui => }/views/Tokens/tokens.js (88%) diff --git a/js/src/app.js b/js/src/app.js index c4bf44416d2..9e6226c4cc2 100644 --- a/js/src/app.js +++ b/js/src/app.js @@ -12,11 +12,11 @@ injectTapEventPlugin(); import { Redirect, Router, Route, useRouterHistory } from 'react-router'; import { createHashHistory } from 'history'; -import Accounts from './ui/views/Accounts'; -import Account from './ui/views/Account'; -import Application from './ui/views/Application'; -import Apps from './ui/views/Apps'; -import Tokens from './ui/views/Tokens'; +import Accounts from './views/Accounts'; +import Account from './views/Account'; +import Application from './views/Application'; +import Apps from './views/Apps'; +import Tokens from './views/Tokens'; import styles from './reset.css'; diff --git a/js/src/ui/modals/FirstRun/Completed/completed.js b/js/src/modals/FirstRun/Completed/completed.js similarity index 100% rename from js/src/ui/modals/FirstRun/Completed/completed.js rename to js/src/modals/FirstRun/Completed/completed.js diff --git a/js/src/ui/modals/FirstRun/Completed/index.js b/js/src/modals/FirstRun/Completed/index.js similarity index 100% rename from js/src/ui/modals/FirstRun/Completed/index.js rename to js/src/modals/FirstRun/Completed/index.js diff --git a/js/src/ui/modals/FirstRun/CreateAccount/createAccount.js b/js/src/modals/FirstRun/CreateAccount/createAccount.js similarity index 96% rename from js/src/ui/modals/FirstRun/CreateAccount/createAccount.js rename to js/src/modals/FirstRun/CreateAccount/createAccount.js index 9a6344dda62..b8f8e3bf936 100644 --- a/js/src/ui/modals/FirstRun/CreateAccount/createAccount.js +++ b/js/src/modals/FirstRun/CreateAccount/createAccount.js @@ -1,6 +1,6 @@ import React, { Component, PropTypes } from 'react'; -import Form, { FormWrap, Input } from '../../../Form'; +import Form, { FormWrap, Input } from '../../../ui/Form'; export default class CreateAccount extends Component { static contextTypes = { diff --git a/js/src/ui/modals/FirstRun/CreateAccount/index.js b/js/src/modals/FirstRun/CreateAccount/index.js similarity index 100% rename from js/src/ui/modals/FirstRun/CreateAccount/index.js rename to js/src/modals/FirstRun/CreateAccount/index.js diff --git a/js/src/ui/modals/FirstRun/RecoverAccount/index.js b/js/src/modals/FirstRun/RecoverAccount/index.js similarity index 100% rename from js/src/ui/modals/FirstRun/RecoverAccount/index.js rename to js/src/modals/FirstRun/RecoverAccount/index.js diff --git a/js/src/ui/modals/FirstRun/RecoverAccount/recoverAccount.js b/js/src/modals/FirstRun/RecoverAccount/recoverAccount.js similarity index 91% rename from js/src/ui/modals/FirstRun/RecoverAccount/recoverAccount.js rename to js/src/modals/FirstRun/RecoverAccount/recoverAccount.js index 0a1d9bb4015..ed34a23b1e8 100644 --- a/js/src/ui/modals/FirstRun/RecoverAccount/recoverAccount.js +++ b/js/src/modals/FirstRun/RecoverAccount/recoverAccount.js @@ -1,7 +1,7 @@ import React, { Component, PropTypes } from 'react'; -import Form, { FormWrap, Input } from '../../../Form'; -import IdentityIcon from '../../../IdentityIcon'; +import Form, { FormWrap, Input } from '../../../ui/Form'; +import IdentityIcon from '../../../ui/IdentityIcon'; export default class RecoverAccount extends Component { static propTypes = { diff --git a/js/src/ui/modals/FirstRun/Welcome/index.js b/js/src/modals/FirstRun/Welcome/index.js similarity index 100% rename from js/src/ui/modals/FirstRun/Welcome/index.js rename to js/src/modals/FirstRun/Welcome/index.js diff --git a/js/src/ui/modals/FirstRun/Welcome/welcome.js b/js/src/modals/FirstRun/Welcome/welcome.js similarity index 100% rename from js/src/ui/modals/FirstRun/Welcome/welcome.js rename to js/src/modals/FirstRun/Welcome/welcome.js diff --git a/js/src/ui/modals/FirstRun/firstRun.js b/js/src/modals/FirstRun/firstRun.js similarity index 98% rename from js/src/ui/modals/FirstRun/firstRun.js rename to js/src/modals/FirstRun/firstRun.js index 4679724a153..7bdfc92f3aa 100644 --- a/js/src/ui/modals/FirstRun/firstRun.js +++ b/js/src/modals/FirstRun/firstRun.js @@ -5,7 +5,7 @@ import ActionDone from 'material-ui/svg-icons/action/done'; import ActionDoneAll from 'material-ui/svg-icons/action/done-all'; import NavigationArrowForward from 'material-ui/svg-icons/navigation/arrow-forward'; -import Modal from '../../Modal'; +import Modal from '../../ui/Modal'; import Completed from './Completed'; import CreateAccount from './CreateAccount'; diff --git a/js/src/ui/modals/FirstRun/index.js b/js/src/modals/FirstRun/index.js similarity index 100% rename from js/src/ui/modals/FirstRun/index.js rename to js/src/modals/FirstRun/index.js diff --git a/js/src/ui/modals/FundAccount/fundAccount.js b/js/src/modals/FundAccount/fundAccount.js similarity index 96% rename from js/src/ui/modals/FundAccount/fundAccount.js rename to js/src/modals/FundAccount/fundAccount.js index b16f25c86bd..aa34f90fc61 100644 --- a/js/src/ui/modals/FundAccount/fundAccount.js +++ b/js/src/modals/FundAccount/fundAccount.js @@ -3,7 +3,7 @@ import React, { Component, PropTypes } from 'react'; import { FlatButton } from 'material-ui'; import ContentClear from 'material-ui/svg-icons/content/clear'; -import Modal from '../../Modal'; +import Modal from '../../ui/Modal'; const STAGE_NAMES = ['fund account']; diff --git a/js/src/ui/modals/FundAccount/index.js b/js/src/modals/FundAccount/index.js similarity index 100% rename from js/src/ui/modals/FundAccount/index.js rename to js/src/modals/FundAccount/index.js diff --git a/js/src/ui/modals/NewAccount/AccountDetails/accountDetails.js b/js/src/modals/NewAccount/AccountDetails/accountDetails.js similarity index 93% rename from js/src/ui/modals/NewAccount/AccountDetails/accountDetails.js rename to js/src/modals/NewAccount/AccountDetails/accountDetails.js index 69abb3e14c6..fadf631c36d 100644 --- a/js/src/ui/modals/NewAccount/AccountDetails/accountDetails.js +++ b/js/src/modals/NewAccount/AccountDetails/accountDetails.js @@ -1,7 +1,7 @@ import React, { Component, PropTypes } from 'react'; -import Form, { FormWrap, Input } from '../../../Form'; -import IdentityIcon from '../../../IdentityIcon'; +import Form, { FormWrap, Input } from '../../../ui/Form'; +import IdentityIcon from '../../../ui/IdentityIcon'; import styles from '../style.css'; diff --git a/js/src/ui/modals/NewAccount/AccountDetails/index.js b/js/src/modals/NewAccount/AccountDetails/index.js similarity index 100% rename from js/src/ui/modals/NewAccount/AccountDetails/index.js rename to js/src/modals/NewAccount/AccountDetails/index.js diff --git a/js/src/ui/modals/NewAccount/CreateAccount/createAccount.js b/js/src/modals/NewAccount/CreateAccount/createAccount.js similarity index 98% rename from js/src/ui/modals/NewAccount/CreateAccount/createAccount.js rename to js/src/modals/NewAccount/CreateAccount/createAccount.js index f59d395b9ed..b136d80fd0d 100644 --- a/js/src/ui/modals/NewAccount/CreateAccount/createAccount.js +++ b/js/src/modals/NewAccount/CreateAccount/createAccount.js @@ -2,8 +2,8 @@ import React, { Component, PropTypes } from 'react'; import { RadioButton, RadioButtonGroup } from 'material-ui/RadioButton'; -import Form, { Input } from '../../../Form'; -import IdentityIcon from '../../../IdentityIcon'; +import Form, { Input } from '../../../ui/Form'; +import IdentityIcon from '../../../ui/IdentityIcon'; import styles from '../style.css'; diff --git a/js/src/ui/modals/NewAccount/CreateAccount/index.js b/js/src/modals/NewAccount/CreateAccount/index.js similarity index 100% rename from js/src/ui/modals/NewAccount/CreateAccount/index.js rename to js/src/modals/NewAccount/CreateAccount/index.js diff --git a/js/src/ui/modals/NewAccount/CreationType/creationType.js b/js/src/modals/NewAccount/CreationType/creationType.js similarity index 100% rename from js/src/ui/modals/NewAccount/CreationType/creationType.js rename to js/src/modals/NewAccount/CreationType/creationType.js diff --git a/js/src/ui/modals/NewAccount/CreationType/index.js b/js/src/modals/NewAccount/CreationType/index.js similarity index 100% rename from js/src/ui/modals/NewAccount/CreationType/index.js rename to js/src/modals/NewAccount/CreationType/index.js diff --git a/js/src/ui/modals/NewAccount/ImportWallet/importWallet.js b/js/src/modals/NewAccount/ImportWallet/importWallet.js similarity index 98% rename from js/src/ui/modals/NewAccount/ImportWallet/importWallet.js rename to js/src/modals/NewAccount/ImportWallet/importWallet.js index dd7b386dfea..c22ac6bc2cf 100644 --- a/js/src/ui/modals/NewAccount/ImportWallet/importWallet.js +++ b/js/src/modals/NewAccount/ImportWallet/importWallet.js @@ -4,7 +4,7 @@ import ReactDOM from 'react-dom'; import { FlatButton } from 'material-ui'; import CommunicationImportExport from 'material-ui/svg-icons/communication/import-export'; -import Form, { Input } from '../../../Form'; +import Form, { Input } from '../../../ui/Form'; import styles from '../style.css'; diff --git a/js/src/ui/modals/NewAccount/ImportWallet/index.js b/js/src/modals/NewAccount/ImportWallet/index.js similarity index 100% rename from js/src/ui/modals/NewAccount/ImportWallet/index.js rename to js/src/modals/NewAccount/ImportWallet/index.js diff --git a/js/src/ui/modals/NewAccount/index.js b/js/src/modals/NewAccount/index.js similarity index 100% rename from js/src/ui/modals/NewAccount/index.js rename to js/src/modals/NewAccount/index.js diff --git a/js/src/ui/modals/NewAccount/newAccount.js b/js/src/modals/NewAccount/newAccount.js similarity index 99% rename from js/src/ui/modals/NewAccount/newAccount.js rename to js/src/modals/NewAccount/newAccount.js index 0c5703e55b6..7083d2a5f44 100644 --- a/js/src/ui/modals/NewAccount/newAccount.js +++ b/js/src/modals/NewAccount/newAccount.js @@ -7,7 +7,7 @@ import ContentClear from 'material-ui/svg-icons/content/clear'; import NavigationArrowBack from 'material-ui/svg-icons/navigation/arrow-back'; import NavigationArrowForward from 'material-ui/svg-icons/navigation/arrow-forward'; -import Modal from '../../Modal'; +import Modal from '../../ui/Modal'; import AccountDetails from './AccountDetails'; import CreationType from './CreationType'; diff --git a/js/src/ui/modals/NewAccount/style.css b/js/src/modals/NewAccount/style.css similarity index 100% rename from js/src/ui/modals/NewAccount/style.css rename to js/src/modals/NewAccount/style.css diff --git a/js/src/ui/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js similarity index 98% rename from js/src/ui/modals/Transfer/Details/details.js rename to js/src/modals/Transfer/Details/details.js index c541baeb679..9a7df2b3912 100644 --- a/js/src/ui/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -2,8 +2,8 @@ import React, { Component, PropTypes } from 'react'; import BigNumber from 'bignumber.js'; import { Checkbox } from 'material-ui'; -import Api from '../../../../api'; -import Form, { Input } from '../../../Form'; +import Api from '../../../api'; +import Form, { Input } from '../../../ui/Form'; import styles from '../style.css'; diff --git a/js/src/ui/modals/Transfer/Details/index.js b/js/src/modals/Transfer/Details/index.js similarity index 100% rename from js/src/ui/modals/Transfer/Details/index.js rename to js/src/modals/Transfer/Details/index.js diff --git a/js/src/ui/modals/Transfer/Verify/index.js b/js/src/modals/Transfer/Verify/index.js similarity index 100% rename from js/src/ui/modals/Transfer/Verify/index.js rename to js/src/modals/Transfer/Verify/index.js diff --git a/js/src/ui/modals/Transfer/Verify/verify.js b/js/src/modals/Transfer/Verify/verify.js similarity index 97% rename from js/src/ui/modals/Transfer/Verify/verify.js rename to js/src/modals/Transfer/Verify/verify.js index d15d32073a3..d208b3a7792 100644 --- a/js/src/ui/modals/Transfer/Verify/verify.js +++ b/js/src/modals/Transfer/Verify/verify.js @@ -1,7 +1,7 @@ import React, { Component, PropTypes } from 'react'; -import Api from '../../../../api'; -import Form, { Input } from '../../../Form'; +import Api from '../../../api'; +import Form, { Input } from '../../../ui/Form'; import styles from '../style.css'; diff --git a/js/src/ui/modals/Transfer/index.js b/js/src/modals/Transfer/index.js similarity index 100% rename from js/src/ui/modals/Transfer/index.js rename to js/src/modals/Transfer/index.js diff --git a/js/src/ui/modals/Transfer/style.css b/js/src/modals/Transfer/style.css similarity index 100% rename from js/src/ui/modals/Transfer/style.css rename to js/src/modals/Transfer/style.css diff --git a/js/src/ui/modals/Transfer/transfer.js b/js/src/modals/Transfer/transfer.js similarity index 98% rename from js/src/ui/modals/Transfer/transfer.js rename to js/src/modals/Transfer/transfer.js index e7b54aa4eac..119d92be49c 100644 --- a/js/src/ui/modals/Transfer/transfer.js +++ b/js/src/modals/Transfer/transfer.js @@ -5,7 +5,7 @@ import ContentSend from 'material-ui/svg-icons/content/send'; import NavigationArrowBack from 'material-ui/svg-icons/navigation/arrow-back'; import NavigationArrowForward from 'material-ui/svg-icons/navigation/arrow-forward'; -import Modal from '../../Modal'; +import Modal from '../../ui/Modal'; import Details from './Details'; import Verify from './Verify'; diff --git a/js/src/ui/modals/index.js b/js/src/modals/index.js similarity index 100% rename from js/src/ui/modals/index.js rename to js/src/modals/index.js diff --git a/js/src/ui/views/Account/Actions/actions.js b/js/src/views/Account/Actions/actions.js similarity index 100% rename from js/src/ui/views/Account/Actions/actions.js rename to js/src/views/Account/Actions/actions.js diff --git a/js/src/ui/views/Account/Actions/index.js b/js/src/views/Account/Actions/index.js similarity index 100% rename from js/src/ui/views/Account/Actions/index.js rename to js/src/views/Account/Actions/index.js diff --git a/js/src/ui/views/Account/account.js b/js/src/views/Account/account.js similarity index 93% rename from js/src/ui/views/Account/account.js rename to js/src/views/Account/account.js index 00bba032352..5e57eeb4b02 100644 --- a/js/src/ui/views/Account/account.js +++ b/js/src/views/Account/account.js @@ -4,10 +4,10 @@ import ContentCreate from 'material-ui/svg-icons/content/create'; import { FundAccount, Transfer } from '../../modals'; -import Balances from '../../Balances'; -import Container, { Title } from '../../Container'; -import Form, { FormWrap, Input, InputInline } from '../../Form'; -import IdentityIcon from '../../IdentityIcon'; +import Balances from '../../ui/Balances'; +import Container, { Title } from '../../ui/Container'; +import Form, { FormWrap, Input, InputInline } from '../../ui/Form'; +import IdentityIcon from '../../ui/IdentityIcon'; import Actions from './actions'; diff --git a/js/src/ui/views/Account/index.js b/js/src/views/Account/index.js similarity index 100% rename from js/src/ui/views/Account/index.js rename to js/src/views/Account/index.js diff --git a/js/src/ui/views/Account/style.css b/js/src/views/Account/style.css similarity index 100% rename from js/src/ui/views/Account/style.css rename to js/src/views/Account/style.css diff --git a/js/src/ui/views/Accounts/AccountSummary/accountSummary.js b/js/src/views/Accounts/AccountSummary/accountSummary.js similarity index 82% rename from js/src/ui/views/Accounts/AccountSummary/accountSummary.js rename to js/src/views/Accounts/AccountSummary/accountSummary.js index f5dcba281c4..45532024b91 100644 --- a/js/src/ui/views/Accounts/AccountSummary/accountSummary.js +++ b/js/src/views/Accounts/AccountSummary/accountSummary.js @@ -1,9 +1,9 @@ import React, { Component, PropTypes } from 'react'; import { Link } from 'react-router'; -import Balances from '../../../Balances'; -import Container, { Title } from '../../../Container'; -import IdentityIcon from '../../../IdentityIcon'; +import Balances from '../../../ui/Balances'; +import Container, { Title } from '../../../ui/Container'; +import IdentityIcon from '../../../ui/IdentityIcon'; export default class AccountSummary extends Component { static contextTypes = { diff --git a/js/src/ui/views/Accounts/AccountSummary/index.js b/js/src/views/Accounts/AccountSummary/index.js similarity index 100% rename from js/src/ui/views/Accounts/AccountSummary/index.js rename to js/src/views/Accounts/AccountSummary/index.js diff --git a/js/src/ui/views/Accounts/Actions/actions.js b/js/src/views/Accounts/Actions/actions.js similarity index 100% rename from js/src/ui/views/Accounts/Actions/actions.js rename to js/src/views/Accounts/Actions/actions.js diff --git a/js/src/ui/views/Accounts/Actions/index.js b/js/src/views/Accounts/Actions/index.js similarity index 100% rename from js/src/ui/views/Accounts/Actions/index.js rename to js/src/views/Accounts/Actions/index.js diff --git a/js/src/ui/views/Accounts/accounts.js b/js/src/views/Accounts/accounts.js similarity index 100% rename from js/src/ui/views/Accounts/accounts.js rename to js/src/views/Accounts/accounts.js diff --git a/js/src/ui/views/Accounts/index.js b/js/src/views/Accounts/index.js similarity index 100% rename from js/src/ui/views/Accounts/index.js rename to js/src/views/Accounts/index.js diff --git a/js/src/ui/views/Accounts/style.css b/js/src/views/Accounts/style.css similarity index 100% rename from js/src/ui/views/Accounts/style.css rename to js/src/views/Accounts/style.css diff --git a/js/src/ui/views/Application/Status/index.js b/js/src/views/Application/Status/index.js similarity index 100% rename from js/src/ui/views/Application/Status/index.js rename to js/src/views/Application/Status/index.js diff --git a/js/src/ui/views/Application/Status/status.js b/js/src/views/Application/Status/status.js similarity index 100% rename from js/src/ui/views/Application/Status/status.js rename to js/src/views/Application/Status/status.js diff --git a/js/src/ui/views/Application/Status/style.css b/js/src/views/Application/Status/style.css similarity index 100% rename from js/src/ui/views/Application/Status/style.css rename to js/src/views/Application/Status/style.css diff --git a/js/src/ui/views/Application/TabBar/index.js b/js/src/views/Application/TabBar/index.js similarity index 100% rename from js/src/ui/views/Application/TabBar/index.js rename to js/src/views/Application/TabBar/index.js diff --git a/js/src/ui/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js similarity index 100% rename from js/src/ui/views/Application/TabBar/tabBar.js rename to js/src/views/Application/TabBar/tabBar.js diff --git a/js/src/ui/views/Application/application.js b/js/src/views/Application/application.js similarity index 98% rename from js/src/ui/views/Application/application.js rename to js/src/views/Application/application.js index 7171d35c30b..f0f91f90809 100644 --- a/js/src/ui/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -4,7 +4,7 @@ import getMuiTheme from 'material-ui/styles/getMuiTheme'; import darkBaseTheme from 'material-ui/styles/baseThemes/darkBaseTheme'; import lightBaseTheme from 'material-ui/styles/baseThemes/lightBaseTheme'; -import Api from '../../../api'; +import Api from '../../api'; import { FirstRun } from '../../modals'; import Status from './Status'; diff --git a/js/src/ui/views/Application/index.js b/js/src/views/Application/index.js similarity index 100% rename from js/src/ui/views/Application/index.js rename to js/src/views/Application/index.js diff --git a/js/src/ui/views/Application/style.css b/js/src/views/Application/style.css similarity index 100% rename from js/src/ui/views/Application/style.css rename to js/src/views/Application/style.css diff --git a/js/src/ui/views/Apps/apps.js b/js/src/views/Apps/apps.js similarity index 85% rename from js/src/ui/views/Apps/apps.js rename to js/src/views/Apps/apps.js index 3cdb66c0fe1..ed22c97df10 100644 --- a/js/src/ui/views/Apps/apps.js +++ b/js/src/views/Apps/apps.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; -import Container from '../../Container'; +import Container from '../../ui/Container'; export default class Apps extends Component { render () { diff --git a/js/src/ui/views/Apps/index.js b/js/src/views/Apps/index.js similarity index 100% rename from js/src/ui/views/Apps/index.js rename to js/src/views/Apps/index.js diff --git a/js/src/ui/views/Tokens/index.js b/js/src/views/Tokens/index.js similarity index 100% rename from js/src/ui/views/Tokens/index.js rename to js/src/views/Tokens/index.js diff --git a/js/src/ui/views/Tokens/tokens.js b/js/src/views/Tokens/tokens.js similarity index 88% rename from js/src/ui/views/Tokens/tokens.js rename to js/src/views/Tokens/tokens.js index 488f4d2ae44..1013381ce0f 100644 --- a/js/src/ui/views/Tokens/tokens.js +++ b/js/src/views/Tokens/tokens.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; -import Container from '../../Container'; +import Container from '../../ui/Container'; export default class Tokens extends Component { render () { From 488946d587457c405bfe68b802641f7d96253e2b Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 15 Aug 2016 13:18:33 +0200 Subject: [PATCH 0048/1062] don't allow sending < 0 --- js/src/modals/Transfer/Details/details.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/js/src/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js index 9a7df2b3912..f26e441cef9 100644 --- a/js/src/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -111,6 +111,10 @@ export default class Details extends Component { const balance = new BigNumber(this.props.balance ? this.props.balance.value : 0); amount = Api.format.fromWei(balance.minus(gas)); + + if (amount.lt(0)) { + amount = new BigNumber(0); + } } this.setState({ From edb11f293650f40cd9ed25ae403381797a24271e Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 15 Aug 2016 13:50:46 +0200 Subject: [PATCH 0049/1062] add refresh to identity icons --- .../modals/NewAccount/CreateAccount/createAccount.js | 11 ++++++++++- js/src/modals/NewAccount/style.css | 9 +++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/js/src/modals/NewAccount/CreateAccount/createAccount.js b/js/src/modals/NewAccount/CreateAccount/createAccount.js index b136d80fd0d..90d9fbd6257 100644 --- a/js/src/modals/NewAccount/CreateAccount/createAccount.js +++ b/js/src/modals/NewAccount/CreateAccount/createAccount.js @@ -1,6 +1,8 @@ import React, { Component, PropTypes } from 'react'; +import IconButton from 'material-ui/IconButton'; import { RadioButton, RadioButtonGroup } from 'material-ui/RadioButton'; +import ActionAutorenew from 'material-ui/svg-icons/action/autorenew'; import Form, { Input } from '../../../ui/Form'; import IdentityIcon from '../../../ui/IdentityIcon'; @@ -126,11 +128,18 @@ export default class CreateAccount extends Component { return ( <div className={ styles.identities }> { identities } + <div className={ styles.refresh }> + <IconButton + onTouchTap={ this.createIdentities }> + <ActionAutorenew + color='rgb(0, 151, 167)' /> + </IconButton> + </div> </div> ); } - createIdentities () { + createIdentities = () => { const api = this.context.api; Promise diff --git a/js/src/modals/NewAccount/style.css b/js/src/modals/NewAccount/style.css index ad578044285..c03ac2e1a67 100644 --- a/js/src/modals/NewAccount/style.css +++ b/js/src/modals/NewAccount/style.css @@ -23,12 +23,17 @@ } .identities .identity, .selector .button { - flex: 0 1 20%; - width: 20% !important; + flex: 0 1 18%; + width: 18% !important; text-align: center; cursor: pointer; } +.refresh { + flex: 0 1 10%; + width: 10% !important; +} + .upload { text-align: right; } From cf6bdaa0b41a9bdf3207133e20388c2af03372c9 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 15 Aug 2016 14:48:46 +0200 Subject: [PATCH 0050/1062] transaction list display --- js/package.json | 1 + js/src/3rdparty/etherscan/account.js | 12 ++ js/src/views/Account/Transactions/index.js | 1 + .../Account/Transactions/transactions.js | 127 ++++++++++++++++++ js/src/views/Account/account.js | 5 +- js/src/views/Account/style.css | 16 +++ 6 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 js/src/views/Account/Transactions/index.js create mode 100644 js/src/views/Account/Transactions/transactions.js diff --git a/js/package.json b/js/package.json index 3e4a747c8f9..e3c29e6fdb4 100644 --- a/js/package.json +++ b/js/package.json @@ -104,6 +104,7 @@ "js-sha3": "^0.5.2", "lodash": "4.11.1", "material-ui": "^0.15.4", + "moment": "^2.14.1", "react": "^15.2.1", "react-addons-css-transition-group": "^15.2.1", "react-dom": "^15.2.1", diff --git a/js/src/3rdparty/etherscan/account.js b/js/src/3rdparty/etherscan/account.js index 51da3adc490..ace2f34a5df 100644 --- a/js/src/3rdparty/etherscan/account.js +++ b/js/src/3rdparty/etherscan/account.js @@ -1,5 +1,6 @@ const PAGE_SIZE = 25; +import Api from '../../api'; import { call } from './call'; function _call (method, params) { @@ -33,6 +34,17 @@ function transactions (address, page) { page: (page || 0) + 1, offset: PAGE_SIZE, sort: 'desc' + }).then((transactions) => { + return transactions.map((tx) => { + return { + from: Api.format.toChecksumAddress(tx.from), + to: Api.format.toChecksumAddress(tx.to), + hash: tx.hash, + blockNumber: tx.blockNumber, + timeStamp: tx.timeStamp, + value: tx.value + }; + }); }); } diff --git a/js/src/views/Account/Transactions/index.js b/js/src/views/Account/Transactions/index.js new file mode 100644 index 00000000000..0fc97ce2f42 --- /dev/null +++ b/js/src/views/Account/Transactions/index.js @@ -0,0 +1 @@ +export default from './transactions'; diff --git a/js/src/views/Account/Transactions/transactions.js b/js/src/views/Account/Transactions/transactions.js new file mode 100644 index 00000000000..64db3ae5539 --- /dev/null +++ b/js/src/views/Account/Transactions/transactions.js @@ -0,0 +1,127 @@ +import BigNumber from 'bignumber.js'; +import React, { Component, PropTypes } from 'react'; +import moment from 'moment'; + +import ContentSend from 'material-ui/svg-icons/content/send'; + +import Api from '../../../api'; +import etherscan from '../../../3rdparty/etherscan'; +import Container from '../../../ui/Container'; + +import styles from '../style.css'; + +function formatHash (hash) { + if (!hash || hash.length <= 25) { + return hash; + } + + return `${hash.substr(2, 11)}...${hash.slice(-11)}`; +} + +function formatNumber (number) { + return new BigNumber(number).toFormat(); +} + +function formatTime (time) { + return moment(parseInt(time, 10) * 1000).fromNow(true); +} + +function formatEther (value) { + const ether = Api.format.fromWei(value); + + if (ether.gt(0)) { + return `${ether.toFormat(8)} ΞTH`; + } + + return null; +} + +export default class Transactions extends Component { + static propTypes = { + address: PropTypes.string.isRequired + } + + state = { + transactions: [] + } + + componentDidMount () { + this.getTransactions(); + } + + render () { + return ( + <Container> + { this.renderTransactions() } + </Container> + ); + } + + renderTransactions () { + let transactions = null; + + if (this.state.transactions && this.state.transactions.length) { + transactions = (this.state.transactions || []).map((tx) => { + const hashLink = `https://etherscan.io/tx/${tx.hash}`; + const fromLink = `https://etherscan.io/address/${tx.from}`; + const toLink = `https://etherscan.io/address/${tx.to}`; + const send = null; // tx.from === this.props.address ? <ContentSend /> : null; + + return ( + <tr key={ tx.hash }> + <td className={ styles.center }> + { send } + </td> + <td className={ styles.center }> + <a href={ fromLink } target='_blank'>{ formatHash(tx.from) }</a> + </td> + <td className={ styles.center }> + <a href={ toLink } target='_blank'>{ formatHash(tx.to) }</a> + </td> + <td className={ styles.center }> + <a href={ hashLink } target='_blank'>{ formatHash(tx.hash) }</a> + </td> + <td className={ styles.right }> + { formatNumber(tx.blockNumber) } + </td> + <td className={ styles.right }> + { formatTime(tx.timeStamp) } + </td> + <td className={ styles.right }> + { formatEther(tx.value) } + </td> + </tr> + ); + }); + } + + return ( + <table className={ styles.transactions }> + <thead> + <tr> + <th> </th> + <th>from</th> + <th>to</th> + <th>txhash</th> + <th className={ styles.right }>block</th> + <th className={ styles.right }>age</th> + <th className={ styles.right }>value</th> + </tr> + </thead> + <tbody> + { transactions } + </tbody> + </table> + ); + } + + getTransactions = () => { + etherscan.account + .transactions(this.props.address) + .then((transactions) => { + this.setState({ + transactions: transactions + }); + }); + } +} diff --git a/js/src/views/Account/account.js b/js/src/views/Account/account.js index 5e57eeb4b02..53b760ad2b1 100644 --- a/js/src/views/Account/account.js +++ b/js/src/views/Account/account.js @@ -9,7 +9,8 @@ import Container, { Title } from '../../ui/Container'; import Form, { FormWrap, Input, InputInline } from '../../ui/Form'; import IdentityIcon from '../../ui/IdentityIcon'; -import Actions from './actions'; +import Actions from './Actions'; +import Transactions from './Transactions'; import styles from './style.css'; @@ -82,6 +83,8 @@ export default class Account extends Component { address={ address } onChange={ this.onChangeBalances } /> </Container> + <Transactions + address={ address } /> </div> ); } diff --git a/js/src/views/Account/style.css b/js/src/views/Account/style.css index 18a2d48af36..f77a132be43 100644 --- a/js/src/views/Account/style.css +++ b/js/src/views/Account/style.css @@ -1,3 +1,19 @@ .editicon { margin-left: 0.5em; } + +.right { + text-align: right; +} + +.center { + text-align: center; +} + +.left { + text-align: left; +} + +.transactions { + width: 100%; +} From 1d1d5f5205500de5c4772231027e7909b608e4ba Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 15 Aug 2016 15:02:41 +0200 Subject: [PATCH 0051/1062] Token & Apps placeholders appear again --- js/src/views/Apps/apps.js | 7 ++++++- js/src/views/Tokens/tokens.js | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/js/src/views/Apps/apps.js b/js/src/views/Apps/apps.js index ed22c97df10..06d25b7a76f 100644 --- a/js/src/views/Apps/apps.js +++ b/js/src/views/Apps/apps.js @@ -6,7 +6,12 @@ export default class Apps extends Component { render () { return ( <Container> - managing contracts (adding, calling, etc) should go in here, next steps... almost there... + <div>managing contracts should go in here</div> + <ul> + <li>adding contracts</li> + <li>viewing waht was added</li> + <li>calling stuff on them</li> + </ul> </Container> ); } diff --git a/js/src/views/Tokens/tokens.js b/js/src/views/Tokens/tokens.js index 1013381ce0f..df16966c9ce 100644 --- a/js/src/views/Tokens/tokens.js +++ b/js/src/views/Tokens/tokens.js @@ -6,7 +6,12 @@ export default class Tokens extends Component { render () { return ( <Container> - the token dapp interface should go in here, we need a basic contract, deploy it and then go about playing and seeing what is the best way to pull everything together... + <div>the token dapp interface should go in here, we need</div> + <ul> + <li>a basic contract</li> + <li>deploy it and</li> + <li>then go about playing and seeing what is the best way to pull everything together...</li> + </ul> </Container> ); } From af025cdc4471ece5b6342c3a39d1044fd1dc8eee Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 15 Aug 2016 15:04:55 +0200 Subject: [PATCH 0052/1062] unused icons removed (could be re-added when pretty) --- js/src/views/Account/Transactions/transactions.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/js/src/views/Account/Transactions/transactions.js b/js/src/views/Account/Transactions/transactions.js index 64db3ae5539..56343d11f1e 100644 --- a/js/src/views/Account/Transactions/transactions.js +++ b/js/src/views/Account/Transactions/transactions.js @@ -2,8 +2,6 @@ import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; import moment from 'moment'; -import ContentSend from 'material-ui/svg-icons/content/send'; - import Api from '../../../api'; import etherscan from '../../../3rdparty/etherscan'; import Container from '../../../ui/Container'; @@ -65,13 +63,10 @@ export default class Transactions extends Component { const hashLink = `https://etherscan.io/tx/${tx.hash}`; const fromLink = `https://etherscan.io/address/${tx.from}`; const toLink = `https://etherscan.io/address/${tx.to}`; - const send = null; // tx.from === this.props.address ? <ContentSend /> : null; return ( <tr key={ tx.hash }> - <td className={ styles.center }> - { send } - </td> + <td className={ styles.center }></td> <td className={ styles.center }> <a href={ fromLink } target='_blank'>{ formatHash(tx.from) }</a> </td> From ccce0b526ed09d808a74e5a4b767fa4f3ff433d1 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 15 Aug 2016 15:36:57 +0200 Subject: [PATCH 0053/1062] signAndSend in-place to be tested --- js/src/modals/Transfer/Details/details.js | 2 +- js/src/modals/Transfer/transfer.js | 30 +++++++++++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/js/src/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js index f26e441cef9..9ac1b7ff2ea 100644 --- a/js/src/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -185,7 +185,7 @@ export default class Details extends Component { const isValid = !this.state.recipientError && !this.state.amountError && !this.state.gasError; this.props.onChange(isValid, { - amount: Api.format.fromWei(this.state.amount).toString(), + amount: Api.format.toWei(this.state.amount).toString(), gas: this.state.gas, recipient: this.state.recipient, total: this.state.total diff --git a/js/src/modals/Transfer/transfer.js b/js/src/modals/Transfer/transfer.js index 119d92be49c..222933a9ab2 100644 --- a/js/src/modals/Transfer/transfer.js +++ b/js/src/modals/Transfer/transfer.js @@ -13,6 +13,10 @@ import Verify from './Verify'; const STAGE_NAMES = ['transfer', 'verify transaction', 'transaction receipt']; export default class Transfer extends Component { + static contextTypes = { + api: PropTypes.object.isRequired + } + static propTypes = { address: PropTypes.string.isRequired, balance: PropTypes.object, @@ -24,9 +28,11 @@ export default class Transfer extends Component { stage: 0, amount: 0, gas: 0, + password: null, recipient: null, total: 0, - isValid: false + isValid: false, + sending: false } render () { @@ -95,7 +101,7 @@ export default class Transfer extends Component { icon={ <ContentSend /> } label='Send' primary - onTouchTap={ this.onNext } /> + onTouchTap={ this.onSend } /> ]; } } @@ -112,6 +118,26 @@ export default class Transfer extends Component { }); } + onSend = () => { + this.setState({ + sending: true + }, () => { + this.context.api.personal + .signAndSendTransaction({ + from: this.props.address, + to: this.state.recipient, + gas: this.state.gas, + value: this.state.amount + }, this.state.password) + .then((txhash) => { + console.log('transaction', txhash); + }) + .catch((error) => { + console.error(error); + }); + }); + } + onChangeDetails = (valid, { amount, gas, recipient, total }) => { this.setState({ amount: amount, From 08aba5d3f855ca79e0f5ba157b6e158a567f0e8c Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 15 Aug 2016 16:04:36 +0200 Subject: [PATCH 0054/1062] quick start --- js/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 js/README.md diff --git a/js/README.md b/js/README.md new file mode 100644 index 00000000000..b3642412717 --- /dev/null +++ b/js/README.md @@ -0,0 +1,10 @@ +# parity.js + +JS interfaces APIs and UIs for Parity. + +## development + +0. Install [Node](https://nodejs.org/) if not already available +0. Install the npm modules inside `parit/js` via `npm install` +0. Start the development environment via `npm start` +0. Connect to the [UI](http://localhost:3000) (ensure that parity is running) From b7fe44472c2846e79d8e5077a1b7b33718363b33 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 15 Aug 2016 16:30:39 +0200 Subject: [PATCH 0055/1062] import min password in 1 character --- js/src/modals/NewAccount/ImportWallet/importWallet.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/modals/NewAccount/ImportWallet/importWallet.js b/js/src/modals/NewAccount/ImportWallet/importWallet.js index c22ac6bc2cf..b5a607f0bbb 100644 --- a/js/src/modals/NewAccount/ImportWallet/importWallet.js +++ b/js/src/modals/NewAccount/ImportWallet/importWallet.js @@ -121,7 +121,7 @@ export default class ImportWallet extends Component { onEditPassword = (event) => { const value = event.target.value; - const valid = value.length >= 8; + const valid = value.length >= 1; this.setState({ password: value, From 2448f242ecf042971572403caad40a6a2dcb9e30 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 15 Aug 2016 17:48:29 +0200 Subject: [PATCH 0056/1062] simple final page (needs UI work, placeholder) --- js/src/modals/Transfer/transfer.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/js/src/modals/Transfer/transfer.js b/js/src/modals/Transfer/transfer.js index 222933a9ab2..cd0502024c6 100644 --- a/js/src/modals/Transfer/transfer.js +++ b/js/src/modals/Transfer/transfer.js @@ -1,5 +1,6 @@ import React, { Component, PropTypes } from 'react'; import { FlatButton } from 'material-ui'; +import ActionDoneAll from 'material-ui/svg-icons/action/done-all'; import ContentClear from 'material-ui/svg-icons/content/clear'; import ContentSend from 'material-ui/svg-icons/content/send'; import NavigationArrowBack from 'material-ui/svg-icons/navigation/arrow-back'; @@ -65,6 +66,10 @@ export default class Transfer extends Component { recipient={ this.state.recipient } onChange={ this.onChangePassword } /> ); + case 2: + return ( + <div>{ this.state.txhash }</div> + ); } } @@ -97,12 +102,20 @@ export default class Transfer extends Component { primary onTouchTap={ this.onPrev } />, <FlatButton - disabled={ !this.state.isValid } + disabled={ !this.state.isValid || this.state.sending } icon={ <ContentSend /> } label='Send' primary onTouchTap={ this.onSend } /> ]; + case 2: + return ( + <FlatButton + icon={ <ActionDoneAll /> } + label='Close' + primary + onTouchTap={ this.onClose } /> + ); } } @@ -131,6 +144,10 @@ export default class Transfer extends Component { }, this.state.password) .then((txhash) => { console.log('transaction', txhash); + this.setState({ + sending: false, + txhash: txhash + }, this.onNext); }) .catch((error) => { console.error(error); From 8229f22e0171c2ddb4637a18ac432dda13315139 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 15 Aug 2016 19:00:42 +0200 Subject: [PATCH 0057/1062] POC tooltip & walk-through - needs global state to tie-in --- js/src/reset.css | 1 + js/src/ui/Tooltip/index.js | 1 + js/src/views/Application/TabBar/tabBar.js | 4 ++++ js/src/views/Application/style.css | 1 + 4 files changed, 7 insertions(+) create mode 100644 js/src/ui/Tooltip/index.js diff --git a/js/src/reset.css b/js/src/reset.css index 5b458e2d164..eb8de8d29ed 100644 --- a/js/src/reset.css +++ b/js/src/reset.css @@ -8,6 +8,7 @@ background: rgb(95, 95, 95); color: rgba(255, 255, 255, 0.75); font-size: 16px; + font-family: Roboto, sans-serif; } :root a, :root a:visited { diff --git a/js/src/ui/Tooltip/index.js b/js/src/ui/Tooltip/index.js new file mode 100644 index 00000000000..7819891f326 --- /dev/null +++ b/js/src/ui/Tooltip/index.js @@ -0,0 +1 @@ +export default from './tooltip'; diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index 605b6b2b2eb..c46c2972ad4 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -7,6 +7,8 @@ import ActionAccountBalanceWallet from 'material-ui/svg-icons/action/account-bal import ActionDashboard from 'material-ui/svg-icons/action/dashboard'; import NavigationApps from 'material-ui/svg-icons/navigation/apps'; +import Tooltip from '../../../ui/Tooltip'; + import styles from '../style.css'; export default class TabBar extends Component { @@ -22,6 +24,8 @@ export default class TabBar extends Component { className={ styles.logo } src='images/parity-x56.png' alt='Parity' /> + <Tooltip + text='navigate between the different parts and views of the application, switching between an account view, token view and distributed application view' /> <Tabs className={ styles.tabs }> <Tab diff --git a/js/src/views/Application/style.css b/js/src/views/Application/style.css index d5ee822a96d..3385a089596 100644 --- a/js/src/views/Application/style.css +++ b/js/src/views/Application/style.css @@ -6,6 +6,7 @@ .toolbar { background: rgb(65, 65, 65) !important; height: 72px !important; + position: relative; } .tabs { From 9aa8402662555aeb812f9c7bd28056fd2ac302ca Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 15 Aug 2016 19:01:46 +0200 Subject: [PATCH 0058/1062] Tooltip --- js/src/ui/Tooltip/style.css | 50 +++++++++++++++++++++++++++++++++++ js/src/ui/Tooltip/tooltip.js | 51 ++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 js/src/ui/Tooltip/style.css create mode 100644 js/src/ui/Tooltip/tooltip.js diff --git a/js/src/ui/Tooltip/style.css b/js/src/ui/Tooltip/style.css new file mode 100644 index 00000000000..ed2ab982cdf --- /dev/null +++ b/js/src/ui/Tooltip/style.css @@ -0,0 +1,50 @@ +.box { + position: absolute; + background: #663600; /* rgba(48, 48, 48, 0.95); #88b7d5; */ + border: 4px solid #f80; /* #c2e1f5; */ + max-width: 450px; + padding: 1em 1em 0 1em; + top: 85%; + left: 20%; + border-radius: 0.5em; + z-index: 500; + opacity: 1; + line-height: 1.618em; +} + +.box:after, .box:before { + bottom: 100%; + left: 25%; + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; + pointer-events: none; +} + +.box:after { + border-color: rgba(136, 183, 213, 0); + border-bottom-color: #663600; /* rgba(48, 48, 48, 0.95); #88b7d5; */ + border-width: 30px; + margin-left: -30px; +} + +.box:before { + border-color: rgba(194, 225, 245, 0); + border-bottom-color: #f80; /* #c2e1f5; */ + border-width: 36px; + margin-left: -36px; +} + +.title { + font-weight: bold; +} + +.text { +} + +.buttons { + margin: 0.5em -1em 0 0; + text-align: right; +} diff --git a/js/src/ui/Tooltip/tooltip.js b/js/src/ui/Tooltip/tooltip.js new file mode 100644 index 00000000000..83a3f45b930 --- /dev/null +++ b/js/src/ui/Tooltip/tooltip.js @@ -0,0 +1,51 @@ +import React, { Component, PropTypes } from 'react'; + +import { FlatButton } from 'material-ui'; +import ContentClear from 'material-ui/svg-icons/content/clear'; +import NavigationArrowForward from 'material-ui/svg-icons/navigation/arrow-forward'; + +import styles from './style.css'; + +export default class Tooltip extends Component { + static propTypes = { + title: PropTypes.string, + text: PropTypes.string + } + + state = { + visible: true + } + + render () { + if (!this.state.visible) { + return null; + } + + return ( + <div className={ styles.box }> + <div className={ styles.title }> + { this.props.title } + </div> + <div className={ styles.text }> + { this.props.text } + </div> + <div className={ styles.buttons }> + <FlatButton + icon={ <ContentClear /> } + label='Skip' + onTouchTap={ this.onClose } /> + <FlatButton + icon={ <NavigationArrowForward /> } + label='Next' + onTouchTap={ this.onNext } /> + </div> + </div> + ); + } + + onClose = () => { + this.setState({ + visible: false + }); + } +} From 864e83c2e57b2fa8b9de50a97ff0dc8fcb895065 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 15 Aug 2016 19:59:55 +0200 Subject: [PATCH 0059/1062] first couple of tooltips in place, next is the hookup --- js/src/ui/Tooltip/style.css | 14 ++++++++------ js/src/views/Accounts/Actions/actions.js | 9 ++++++++- js/src/views/Accounts/accounts.js | 9 ++++++++- js/src/views/Accounts/style.css | 5 +++++ js/src/views/Application/TabBar/tabBar.js | 4 ++-- js/src/views/Application/style.css | 1 + 6 files changed, 32 insertions(+), 10 deletions(-) diff --git a/js/src/ui/Tooltip/style.css b/js/src/ui/Tooltip/style.css index ed2ab982cdf..289ba80f203 100644 --- a/js/src/ui/Tooltip/style.css +++ b/js/src/ui/Tooltip/style.css @@ -4,12 +4,14 @@ border: 4px solid #f80; /* #c2e1f5; */ max-width: 450px; padding: 1em 1em 0 1em; - top: 85%; - left: 20%; + top: 65%; + left: 5%; border-radius: 0.5em; z-index: 500; opacity: 1; line-height: 1.618em; + white-space: normal; + opacity: 0.95; } .box:after, .box:before { @@ -26,15 +28,15 @@ .box:after { border-color: rgba(136, 183, 213, 0); border-bottom-color: #663600; /* rgba(48, 48, 48, 0.95); #88b7d5; */ - border-width: 30px; - margin-left: -30px; + border-width: 20px; + margin-left: -20px; } .box:before { border-color: rgba(194, 225, 245, 0); border-bottom-color: #f80; /* #c2e1f5; */ - border-width: 36px; - margin-left: -36px; + border-width: 26px; + margin-left: -26px; } .title { diff --git a/js/src/views/Accounts/Actions/actions.js b/js/src/views/Accounts/Actions/actions.js index 78ee9b8d059..64bf1c817b0 100644 --- a/js/src/views/Accounts/Actions/actions.js +++ b/js/src/views/Accounts/Actions/actions.js @@ -4,6 +4,10 @@ import { FlatButton } from 'material-ui'; import { Toolbar, ToolbarGroup } from 'material-ui/Toolbar'; import ContentAdd from 'material-ui/svg-icons/content/add'; +import Tooltip from '../../../ui/Tooltip'; + +import styles from '../style.css'; + export default class Actions extends Component { static propTypes = { onNewAccount: PropTypes.func.isRequired @@ -11,7 +15,8 @@ export default class Actions extends Component { render () { return ( - <Toolbar> + <Toolbar + className={ styles.toolbar }> <ToolbarGroup> <FlatButton icon={ <ContentAdd /> } @@ -19,6 +24,8 @@ export default class Actions extends Component { primary onTouchTap={ this.props.onNewAccount } /> </ToolbarGroup> + <Tooltip + text='actions relating to the current view are available on the toolbar for quick access, be it for performing actions or creating a new item' /> </Toolbar> ); } diff --git a/js/src/views/Accounts/accounts.js b/js/src/views/Accounts/accounts.js index 25f4cfcaa1a..7a35c13b390 100644 --- a/js/src/views/Accounts/accounts.js +++ b/js/src/views/Accounts/accounts.js @@ -3,6 +3,7 @@ import React, { Component } from 'react'; import AccountSummary from './AccountSummary'; import Actions from './Actions'; import { NewAccount } from '../../modals'; +import Tooltip from '../../ui/Tooltip'; import styles from './style.css'; @@ -41,13 +42,19 @@ export default class Accounts extends Component { return null; } - return this.state.accounts.map((account) => { + const firstTooltip = ( + <Tooltip + text='your accounts are visible for easy access, allowing you to edit the meta information, make transfers, view transactions and fund the account' /> + ); + + return this.state.accounts.map((account, idx) => { return ( <div className={ styles.account } key={ account.address }> <AccountSummary account={ account } /> + { idx === 0 ? firstTooltip : null } </div> ); }); diff --git a/js/src/views/Accounts/style.css b/js/src/views/Accounts/style.css index 28807803975..c02f7000758 100644 --- a/js/src/views/Accounts/style.css +++ b/js/src/views/Accounts/style.css @@ -6,6 +6,7 @@ .account { flex: 0 1 50%; width: 50%; + position: relative; } .account:nth-child(odd)>div { @@ -15,3 +16,7 @@ .account:nth-child(even)>div { padding-left: 0.5em !important; } + +.toolbar { + position: relative; +} diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index c46c2972ad4..4e58f2f672c 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -24,8 +24,6 @@ export default class TabBar extends Component { className={ styles.logo } src='images/parity-x56.png' alt='Parity' /> - <Tooltip - text='navigate between the different parts and views of the application, switching between an account view, token view and distributed application view' /> <Tabs className={ styles.tabs }> <Tab @@ -43,6 +41,8 @@ export default class TabBar extends Component { icon={ <NavigationApps /> } label='apps' onActive={ this.onActivate } /> + <Tooltip + text='navigate between the different parts and views of the application, switching between an account view, token view and distributed application view' /> </Tabs> </Toolbar> ); diff --git a/js/src/views/Application/style.css b/js/src/views/Application/style.css index 3385a089596..f69e2ff723d 100644 --- a/js/src/views/Application/style.css +++ b/js/src/views/Application/style.css @@ -11,6 +11,7 @@ .tabs { width: 100%; + position: relative; } .logo { From b497bf7640671d2bbb08b1264f1688c49046a1e3 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 15 Aug 2016 21:59:23 +0200 Subject: [PATCH 0060/1062] hacky tooltip walktrhough (state is an issue) --- js/src/ui/Tooltip/TooltipManager/index.js | 1 + .../Tooltip/TooltipManager/tooltipManager.js | 29 ++++++++++ js/src/ui/Tooltip/index.js | 3 + js/src/ui/Tooltip/style.css | 4 +- js/src/ui/Tooltip/tooltip.js | 56 +++++++++++++++---- js/src/views/Application/TabBar/tabBar.js | 7 ++- js/src/views/Application/application.js | 8 ++- 7 files changed, 90 insertions(+), 18 deletions(-) create mode 100644 js/src/ui/Tooltip/TooltipManager/index.js create mode 100644 js/src/ui/Tooltip/TooltipManager/tooltipManager.js diff --git a/js/src/ui/Tooltip/TooltipManager/index.js b/js/src/ui/Tooltip/TooltipManager/index.js new file mode 100644 index 00000000000..37b7d7e753d --- /dev/null +++ b/js/src/ui/Tooltip/TooltipManager/index.js @@ -0,0 +1 @@ +export default from './TooltipManager'; diff --git a/js/src/ui/Tooltip/TooltipManager/tooltipManager.js b/js/src/ui/Tooltip/TooltipManager/tooltipManager.js new file mode 100644 index 00000000000..a782e13212c --- /dev/null +++ b/js/src/ui/Tooltip/TooltipManager/tooltipManager.js @@ -0,0 +1,29 @@ +export default class TooltipManager { + constructor () { + this.currentId = 0; + this.updateCallbacks = []; + } + + register (updateCallback) { + this.updateCallbacks.push(updateCallback); + this.update(); + + return this.updateCallbacks.length - 1; + } + + update () { + this.updateCallbacks.forEach((cb) => { + cb(this.currentId, this.updateCallbacks.length - 1); + }); + } + + next () { + this.currentId++; + this.update(); + } + + close () { + this.currentId = -1; + this.update(); + } +} diff --git a/js/src/ui/Tooltip/index.js b/js/src/ui/Tooltip/index.js index 7819891f326..5ae9b01dc8d 100644 --- a/js/src/ui/Tooltip/index.js +++ b/js/src/ui/Tooltip/index.js @@ -1 +1,4 @@ +import TooltipManager from './TooltipManager'; + export default from './tooltip'; +export { TooltipManager }; diff --git a/js/src/ui/Tooltip/style.css b/js/src/ui/Tooltip/style.css index 289ba80f203..af2aa6959b3 100644 --- a/js/src/ui/Tooltip/style.css +++ b/js/src/ui/Tooltip/style.css @@ -4,7 +4,7 @@ border: 4px solid #f80; /* #c2e1f5; */ max-width: 450px; padding: 1em 1em 0 1em; - top: 65%; + top: 70%; left: 5%; border-radius: 0.5em; z-index: 500; @@ -16,7 +16,7 @@ .box:after, .box:before { bottom: 100%; - left: 25%; + left: 15%; border: solid transparent; content: " "; height: 0; diff --git a/js/src/ui/Tooltip/tooltip.js b/js/src/ui/Tooltip/tooltip.js index 83a3f45b930..00c5c3373e2 100644 --- a/js/src/ui/Tooltip/tooltip.js +++ b/js/src/ui/Tooltip/tooltip.js @@ -1,26 +1,58 @@ import React, { Component, PropTypes } from 'react'; import { FlatButton } from 'material-ui'; +import ActionDoneAll from 'material-ui/svg-icons/action/done-all'; import ContentClear from 'material-ui/svg-icons/content/clear'; import NavigationArrowForward from 'material-ui/svg-icons/navigation/arrow-forward'; import styles from './style.css'; export default class Tooltip extends Component { + static contextTypes = { + tooltips: PropTypes.object + } + static propTypes = { title: PropTypes.string, text: PropTypes.string } state = { - visible: true + tooltipId: 0, + currentId: 0, + maxId: 0 + } + + componentDidMount () { + this.setState({ + tooltipId: this.context.tooltips.register(this.onTooltip) + }); } render () { - if (!this.state.visible) { + if (this.state.tooltipId !== this.state.currentId) { return null; } + const buttons = this.state.tooltipId !== this.state.maxId + ? [ + <FlatButton + key='skipButton' + icon={ <ContentClear /> } + label='Skip' + onTouchTap={ this.onClose } />, + <FlatButton + key='nextButton' + icon={ <NavigationArrowForward /> } + label='Next' + onTouchTap={ this.onNext } /> + ] : ( + <FlatButton + icon={ <ActionDoneAll /> } + label='Done' + onTouchTap={ this.onClose } /> + ); + return ( <div className={ styles.box }> <div className={ styles.title }> @@ -30,22 +62,24 @@ export default class Tooltip extends Component { { this.props.text } </div> <div className={ styles.buttons }> - <FlatButton - icon={ <ContentClear /> } - label='Skip' - onTouchTap={ this.onClose } /> - <FlatButton - icon={ <NavigationArrowForward /> } - label='Next' - onTouchTap={ this.onNext } /> + { buttons } </div> </div> ); } + onNext = () => { + this.context.tooltips.next(); + } + onClose = () => { + this.context.tooltips.close(); + } + + onTooltip = (currentId, maxId) => { this.setState({ - visible: false + currentId: currentId, + maxId: maxId }); } } diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index 4e58f2f672c..f885e5147e4 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -30,7 +30,10 @@ export default class TabBar extends Component { data-route='/accounts' icon={ <ActionAccountBalanceWallet /> } label='accounts' - onActive={ this.onActivate } /> + onActive={ this.onActivate }> + <Tooltip + text='navigate between the different parts and views of the application, switching between an account view, token view and distributed application view' /> + </Tab> <Tab data-route='/tokens' icon={ <ActionDashboard /> } @@ -41,8 +44,6 @@ export default class TabBar extends Component { icon={ <NavigationApps /> } label='apps' onActive={ this.onActivate } /> - <Tooltip - text='navigate between the different parts and views of the application, switching between an account view, token view and distributed application view' /> </Tabs> </Toolbar> ); diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index f0f91f90809..6287f44d2f6 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -5,6 +5,7 @@ import darkBaseTheme from 'material-ui/styles/baseThemes/darkBaseTheme'; import lightBaseTheme from 'material-ui/styles/baseThemes/lightBaseTheme'; import Api from '../../api'; +import { TooltipManager } from '../../ui/Tooltip'; import { FirstRun } from '../../modals'; import Status from './Status'; @@ -15,6 +16,7 @@ import styles from './style.css'; const lightTheme = getMuiTheme(lightBaseTheme); const muiTheme = getMuiTheme(darkBaseTheme); const api = new Api(new Api.Transport.Http('/rpc/')); +const tooltips = new TooltipManager(); muiTheme.stepper.textColor = '#eee'; muiTheme.stepper.disabledTextColor = '#777'; @@ -28,7 +30,8 @@ muiTheme.toolbar.backgroundColor = 'rgb(80, 80, 80)'; export default class Application extends Component { static childContextTypes = { api: PropTypes.object, - muiTheme: PropTypes.object + muiTheme: PropTypes.object, + tooltips: PropTypes.object } static propTypes = { @@ -60,7 +63,8 @@ export default class Application extends Component { getChildContext () { return { api: api, - muiTheme: muiTheme + muiTheme: muiTheme, + tooltips: tooltips }; } From b51a8fb697b8c1131bffbfb4c6f44c927034c08d Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 15 Aug 2016 22:06:18 +0200 Subject: [PATCH 0061/1062] icons now match what is displayed in Mist (all lowercase) --- js/src/ui/IdentityIcon/identityIcon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/ui/IdentityIcon/identityIcon.js b/js/src/ui/IdentityIcon/identityIcon.js index 4f349defb59..8dd730d458e 100644 --- a/js/src/ui/IdentityIcon/identityIcon.js +++ b/js/src/ui/IdentityIcon/identityIcon.js @@ -20,7 +20,7 @@ export default class IdentityIcon extends Component { updateIcon (address) { this.setState({ iconsrc: blockies({ - seed: address, + seed: address.toLowerCase(), size: 8, scale: 7 }).toDataURL() From c6ef91f862d8eb6b2311729fc1f4d4f6aea8ab44 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 15 Aug 2016 22:31:12 +0200 Subject: [PATCH 0062/1062] hide gas until advanced expansion is available --- js/src/modals/Transfer/Details/details.js | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/js/src/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js index 9ac1b7ff2ea..af0273fb6d8 100644 --- a/js/src/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -7,7 +7,7 @@ import Form, { Input } from '../../../ui/Form'; import styles from '../style.css'; -const DEFAULT_GAS = '30000'; +const DEFAULT_GAS = '21000'; const CHECK_STYLE = { position: 'absolute', @@ -51,6 +51,17 @@ export default class Details extends Component { } render () { + // <div className={ styles.columns }> + // <div> + // <Input + // label='gas amount' + // hint='the amount of gas to use for the transaction' + // error={ this.state.gasError } + // value={ this.state.gas } + // onChange={ this.onEditGas } /> + // </div> + // </div> + return ( <Form> <div className={ styles.info }> @@ -79,16 +90,6 @@ export default class Details extends Component { style={ CHECK_STYLE } /> </div> </div> - <div className={ styles.columns }> - <div> - <Input - label='gas amount' - hint='the amount of gas to use for the transaction' - error={ this.state.gasError } - value={ this.state.gas } - onChange={ this.onEditGas } /> - </div> - </div> <div className={ styles.columns }> <div> <Input From eb4c3c0ddf46b1bb0c73edc38c7730e4f75d0476 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 15 Aug 2016 22:49:56 +0200 Subject: [PATCH 0063/1062] slight status line update --- js/src/views/Application/Status/status.js | 2 +- js/src/views/Application/Status/style.css | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/js/src/views/Application/Status/status.js b/js/src/views/Application/Status/status.js index 70535c9534a..cdbc86d83dd 100644 --- a/js/src/views/Application/Status/status.js +++ b/js/src/views/Application/Status/status.js @@ -22,8 +22,8 @@ export default class Status extends Component { return ( <div className={ styles.status }> <div>{ this.state.clientVersion }</div> + <div>{ this.state.blockNumber } blocks</div> <div>{ this.state.peerCount } peers</div> - <div>{ this.state.blockNumber }</div> </div> ); } diff --git a/js/src/views/Application/Status/style.css b/js/src/views/Application/Status/style.css index c6d3f7895ef..a79f2825dab 100644 --- a/js/src/views/Application/Status/style.css +++ b/js/src/views/Application/Status/style.css @@ -2,4 +2,11 @@ clear: both; padding: 1em; margin: 1em 0; + text-align: right; + opacity: 0.75; +} + +.title { + font-weight: bold; + margin: 0 0.5em 0 2em; } From 186ae920969137bc225153c8c13271209d39eff3 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 00:03:45 +0200 Subject: [PATCH 0064/1062] update tooltip styling (still some issues with account nth>div) --- js/src/ui/Tooltip/style.css | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/js/src/ui/Tooltip/style.css b/js/src/ui/Tooltip/style.css index af2aa6959b3..acf92d52cdb 100644 --- a/js/src/ui/Tooltip/style.css +++ b/js/src/ui/Tooltip/style.css @@ -3,9 +3,8 @@ background: #663600; /* rgba(48, 48, 48, 0.95); #88b7d5; */ border: 4px solid #f80; /* #c2e1f5; */ max-width: 450px; - padding: 1em 1em 0 1em; top: 70%; - left: 5%; + left: 11%; border-radius: 0.5em; z-index: 500; opacity: 1; @@ -44,9 +43,10 @@ } .text { + padding: 1em; } .buttons { - margin: 0.5em -1em 0 0; + margin: 0; text-align: right; } From 695d78c8f384ee353a894c40dbe07e7d3f920cab Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 00:08:30 +0200 Subject: [PATCH 0065/1062] fixup toolbar button styling, consistent everywhere --- js/src/ui/Tooltip/style.css | 1 + js/src/views/Accounts/AccountSummary/accountSummary.js | 4 +++- js/src/views/Accounts/accounts.js | 5 +++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/js/src/ui/Tooltip/style.css b/js/src/ui/Tooltip/style.css index acf92d52cdb..384fa14397a 100644 --- a/js/src/ui/Tooltip/style.css +++ b/js/src/ui/Tooltip/style.css @@ -48,5 +48,6 @@ .buttons { margin: 0; + padding: 0 0.5em 0.5em 0; text-align: right; } diff --git a/js/src/views/Accounts/AccountSummary/accountSummary.js b/js/src/views/Accounts/AccountSummary/accountSummary.js index 45532024b91..4bcf90c6683 100644 --- a/js/src/views/Accounts/AccountSummary/accountSummary.js +++ b/js/src/views/Accounts/AccountSummary/accountSummary.js @@ -11,7 +11,8 @@ export default class AccountSummary extends Component { } static propTypes = { - account: PropTypes.object.isRequired + account: PropTypes.object.isRequired, + children: PropTypes.node } state = { @@ -31,6 +32,7 @@ export default class AccountSummary extends Component { byline={ account.address } /> <Balances address={ account.address } /> + { this.props.children } </Container> ); } diff --git a/js/src/views/Accounts/accounts.js b/js/src/views/Accounts/accounts.js index 7a35c13b390..deab7ccf0af 100644 --- a/js/src/views/Accounts/accounts.js +++ b/js/src/views/Accounts/accounts.js @@ -53,8 +53,9 @@ export default class Accounts extends Component { className={ styles.account } key={ account.address }> <AccountSummary - account={ account } /> - { idx === 0 ? firstTooltip : null } + account={ account }> + { idx === 0 ? firstTooltip : null } + </AccountSummary> </div> ); }); From d3a8eeed8e98864abcae694b304a494d42913b65 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 08:10:29 +0200 Subject: [PATCH 0066/1062] rework naming of create modal sections, less confusing --- .../AccountDetails/accountDetails.js | 0 .../AccountDetails/index.js | 0 .../CreationType/creationType.js | 0 .../CreationType/index.js | 0 .../{ => CreateAccount}/NewAccount/index.js | 0 .../NewAccount/newAccount.js} | 0 .../modals/CreateAccount/NewImport/index.js | 1 + .../NewImport/newImport.js} | 37 ++++++++++++++++--- .../createAccount.js} | 10 ++--- .../{NewAccount => }/CreateAccount/index.js | 0 .../{NewAccount => CreateAccount}/style.css | 0 .../modals/NewAccount/ImportWallet/index.js | 1 - js/src/modals/index.js | 4 +- js/src/views/Accounts/accounts.js | 4 +- 14 files changed, 41 insertions(+), 16 deletions(-) rename js/src/modals/{NewAccount => CreateAccount}/AccountDetails/accountDetails.js (100%) rename js/src/modals/{NewAccount => CreateAccount}/AccountDetails/index.js (100%) rename js/src/modals/{NewAccount => CreateAccount}/CreationType/creationType.js (100%) rename js/src/modals/{NewAccount => CreateAccount}/CreationType/index.js (100%) rename js/src/modals/{ => CreateAccount}/NewAccount/index.js (100%) rename js/src/modals/{NewAccount/CreateAccount/createAccount.js => CreateAccount/NewAccount/newAccount.js} (100%) create mode 100644 js/src/modals/CreateAccount/NewImport/index.js rename js/src/modals/{NewAccount/ImportWallet/importWallet.js => CreateAccount/NewImport/newImport.js} (76%) rename js/src/modals/{NewAccount/newAccount.js => CreateAccount/createAccount.js} (96%) rename js/src/modals/{NewAccount => }/CreateAccount/index.js (100%) rename js/src/modals/{NewAccount => CreateAccount}/style.css (100%) delete mode 100644 js/src/modals/NewAccount/ImportWallet/index.js diff --git a/js/src/modals/NewAccount/AccountDetails/accountDetails.js b/js/src/modals/CreateAccount/AccountDetails/accountDetails.js similarity index 100% rename from js/src/modals/NewAccount/AccountDetails/accountDetails.js rename to js/src/modals/CreateAccount/AccountDetails/accountDetails.js diff --git a/js/src/modals/NewAccount/AccountDetails/index.js b/js/src/modals/CreateAccount/AccountDetails/index.js similarity index 100% rename from js/src/modals/NewAccount/AccountDetails/index.js rename to js/src/modals/CreateAccount/AccountDetails/index.js diff --git a/js/src/modals/NewAccount/CreationType/creationType.js b/js/src/modals/CreateAccount/CreationType/creationType.js similarity index 100% rename from js/src/modals/NewAccount/CreationType/creationType.js rename to js/src/modals/CreateAccount/CreationType/creationType.js diff --git a/js/src/modals/NewAccount/CreationType/index.js b/js/src/modals/CreateAccount/CreationType/index.js similarity index 100% rename from js/src/modals/NewAccount/CreationType/index.js rename to js/src/modals/CreateAccount/CreationType/index.js diff --git a/js/src/modals/NewAccount/index.js b/js/src/modals/CreateAccount/NewAccount/index.js similarity index 100% rename from js/src/modals/NewAccount/index.js rename to js/src/modals/CreateAccount/NewAccount/index.js diff --git a/js/src/modals/NewAccount/CreateAccount/createAccount.js b/js/src/modals/CreateAccount/NewAccount/newAccount.js similarity index 100% rename from js/src/modals/NewAccount/CreateAccount/createAccount.js rename to js/src/modals/CreateAccount/NewAccount/newAccount.js diff --git a/js/src/modals/CreateAccount/NewImport/index.js b/js/src/modals/CreateAccount/NewImport/index.js new file mode 100644 index 00000000000..9207fe651f6 --- /dev/null +++ b/js/src/modals/CreateAccount/NewImport/index.js @@ -0,0 +1 @@ +export default from './newImport'; diff --git a/js/src/modals/NewAccount/ImportWallet/importWallet.js b/js/src/modals/CreateAccount/NewImport/newImport.js similarity index 76% rename from js/src/modals/NewAccount/ImportWallet/importWallet.js rename to js/src/modals/CreateAccount/NewImport/newImport.js index b5a607f0bbb..5b25559f12c 100644 --- a/js/src/modals/NewAccount/ImportWallet/importWallet.js +++ b/js/src/modals/CreateAccount/NewImport/newImport.js @@ -8,7 +8,13 @@ import Form, { Input } from '../../../ui/Form'; import styles from '../style.css'; -export default class ImportWallet extends Component { +const ERRORS = { + noName: 'you need to specify a valid name for the account', + noPassword: 'supply a valid password to confirm the transaction', + noFile: 'select a valid wallet file to import' +}; + +export default class NewImport extends Component { static contextTypes = { api: PropTypes.object.isRequired } @@ -19,8 +25,11 @@ export default class ImportWallet extends Component { state = { accountName: '', + accountNameError: ERRORS.noName, password: '', + passwordError: ERRORS.noPassword, walletFile: '', + walletFileError: ERRORS.noFile, walletJson: '', isValidPass: false, isValidName: false, @@ -40,6 +49,7 @@ export default class ImportWallet extends Component { <Input label='account name' hint='a descriptive name for the account' + error={ this.state.accountNameError } value={ this.state.accountName } onChange={ this.onEditAccountName } /> <div className={ styles.passwords }> @@ -49,6 +59,7 @@ export default class ImportWallet extends Component { label='password' hint='the password to unlock the wallet' type='password' + error={ this.state.passwordError } value={ this.state.password } onChange={ this.onEditPassword } /> </div> @@ -56,7 +67,8 @@ export default class ImportWallet extends Component { <Input disabled label='wallet file' - hint='the uploaded file for import' + hint='the wallet file for import' + error={ this.state.walletFileError } value={ this.state.walletFile } /> <div className={ styles.upload }> <FlatButton @@ -76,12 +88,14 @@ export default class ImportWallet extends Component { onFileChange = (event) => { const el = event.target; + const error = ERRORS.noFile; if (el.files.length) { const reader = new FileReader(); reader.onload = (event) => { this.setState({ walletJson: event.target.result, + walletFileError: null, isValidFile: true }, this.updateParent); }; @@ -90,6 +104,7 @@ export default class ImportWallet extends Component { this.setState({ walletFile: el.value.replace('C:\\fakepath\\', ''), + walletFileError: error, isValidFile: false }, this.updateParent); } @@ -111,21 +126,31 @@ export default class ImportWallet extends Component { onEditAccountName = (event) => { const value = event.target.value; - const valid = value.length >= 2; + let error = null; + + if (!value || value.trim().length < 2) { + error = ERRORS.noName; + } this.setState({ accountName: value, - isValidName: valid + accountNameError: error, + isValidName: !error }, this.updateParent); } onEditPassword = (event) => { + let error = null; const value = event.target.value; - const valid = value.length >= 1; + + if (!value || !value.length) { + error = ERRORS.noPassword; + } this.setState({ password: value, - isValidPass: valid + passwordError: error, + isValidPass: !error }, this.updateParent); } } diff --git a/js/src/modals/NewAccount/newAccount.js b/js/src/modals/CreateAccount/createAccount.js similarity index 96% rename from js/src/modals/NewAccount/newAccount.js rename to js/src/modals/CreateAccount/createAccount.js index 7083d2a5f44..e3443e016dd 100644 --- a/js/src/modals/NewAccount/newAccount.js +++ b/js/src/modals/CreateAccount/createAccount.js @@ -11,13 +11,13 @@ import Modal from '../../ui/Modal'; import AccountDetails from './AccountDetails'; import CreationType from './CreationType'; -import CreateAccount from './CreateAccount'; -import ImportWallet from './ImportWallet'; +import NewAccount from './NewAccount'; +import NewImport from './NewImport'; const STAGE_NAMES = ['creation type', 'create account', 'account information']; const STAGE_IMPORT = ['creation type', 'import wallet', 'account information']; -export default class NewAccount extends Component { +export default class CreateAccount extends Component { static contextTypes = { api: PropTypes.object.isRequired } @@ -62,12 +62,12 @@ export default class NewAccount extends Component { case 1: if (this.state.createType === 'fromNew') { return ( - <CreateAccount + <NewAccount onChange={ this.onChangeDetails } /> ); } else { return ( - <ImportWallet + <NewImport onChange={ this.onChangeWallet } /> ); } diff --git a/js/src/modals/NewAccount/CreateAccount/index.js b/js/src/modals/CreateAccount/index.js similarity index 100% rename from js/src/modals/NewAccount/CreateAccount/index.js rename to js/src/modals/CreateAccount/index.js diff --git a/js/src/modals/NewAccount/style.css b/js/src/modals/CreateAccount/style.css similarity index 100% rename from js/src/modals/NewAccount/style.css rename to js/src/modals/CreateAccount/style.css diff --git a/js/src/modals/NewAccount/ImportWallet/index.js b/js/src/modals/NewAccount/ImportWallet/index.js deleted file mode 100644 index 1685c2f0565..00000000000 --- a/js/src/modals/NewAccount/ImportWallet/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './importWallet'; diff --git a/js/src/modals/index.js b/js/src/modals/index.js index f9ee026a4f0..ad63c30410e 100644 --- a/js/src/modals/index.js +++ b/js/src/modals/index.js @@ -1,6 +1,6 @@ import FirstRun from './FirstRun'; import FundAccount from './FundAccount'; -import NewAccount from './NewAccount'; +import CreateAccount from './CreateAccount'; import Transfer from './Transfer'; -export { FirstRun, FundAccount, NewAccount, Transfer }; +export { FirstRun, FundAccount, CreateAccount, Transfer }; diff --git a/js/src/views/Accounts/accounts.js b/js/src/views/Accounts/accounts.js index deab7ccf0af..e64b6ef746e 100644 --- a/js/src/views/Accounts/accounts.js +++ b/js/src/views/Accounts/accounts.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import AccountSummary from './AccountSummary'; import Actions from './Actions'; -import { NewAccount } from '../../modals'; +import { CreateAccount } from '../../modals'; import Tooltip from '../../ui/Tooltip'; import styles from './style.css'; @@ -24,7 +24,7 @@ export default class Accounts extends Component { render () { return ( <div> - <NewAccount + <CreateAccount onClose={ this.onNewAccountClose } onUpdate={ this.onNewAccountUpdate } visible={ this.state.newDialog } /> From f14ca2fb1f5c3d2ed2ab36fe55445ef5d96c8e03 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 08:25:30 +0200 Subject: [PATCH 0067/1062] FirstFun uses create account logic to operate (should be working, untested) --- js/src/modals/CreateAccount/index.js | 4 + js/src/modals/FirstRun/Completed/completed.js | 10 +- .../FirstRun/CreateAccount/createAccount.js | 71 -------------- js/src/modals/FirstRun/CreateAccount/index.js | 1 - .../modals/FirstRun/RecoverAccount/index.js | 1 - .../FirstRun/RecoverAccount/recoverAccount.js | 49 ---------- js/src/modals/FirstRun/Welcome/welcome.js | 10 +- js/src/modals/FirstRun/firstRun.js | 94 +++++++++++++++---- 8 files changed, 83 insertions(+), 157 deletions(-) delete mode 100644 js/src/modals/FirstRun/CreateAccount/createAccount.js delete mode 100644 js/src/modals/FirstRun/CreateAccount/index.js delete mode 100644 js/src/modals/FirstRun/RecoverAccount/index.js delete mode 100644 js/src/modals/FirstRun/RecoverAccount/recoverAccount.js diff --git a/js/src/modals/CreateAccount/index.js b/js/src/modals/CreateAccount/index.js index b4e993ef4c9..f4ec003dae7 100644 --- a/js/src/modals/CreateAccount/index.js +++ b/js/src/modals/CreateAccount/index.js @@ -1 +1,5 @@ +import AccountDetails from './AccountDetails'; +import NewAccount from './NewAccount'; + export default from './createAccount'; +export { AccountDetails, NewAccount }; diff --git a/js/src/modals/FirstRun/Completed/completed.js b/js/src/modals/FirstRun/Completed/completed.js index c3264fc0d9f..1c146b94b3d 100644 --- a/js/src/modals/FirstRun/Completed/completed.js +++ b/js/src/modals/FirstRun/Completed/completed.js @@ -1,15 +1,7 @@ -import React, { Component, PropTypes } from 'react'; +import React, { Component } from 'react'; export default class Completed extends Component { - static propTypes = { - visible: PropTypes.bool.isRequired - } - render () { - if (!this.props.visible) { - return null; - } - return ( <div> <p>Your node setup has been completed successfully.</p> diff --git a/js/src/modals/FirstRun/CreateAccount/createAccount.js b/js/src/modals/FirstRun/CreateAccount/createAccount.js deleted file mode 100644 index b8f8e3bf936..00000000000 --- a/js/src/modals/FirstRun/CreateAccount/createAccount.js +++ /dev/null @@ -1,71 +0,0 @@ -import React, { Component, PropTypes } from 'react'; - -import Form, { FormWrap, Input } from '../../../ui/Form'; - -export default class CreateAccount extends Component { - static contextTypes = { - api: PropTypes.object.isRequired - } - - static propTypes = { - visible: PropTypes.bool.isRequired - } - - state = { - accountName: '', - password1: '', - password2: '' - } - - render () { - if (!this.props.visible) { - return null; - } - - return ( - <Form> - <FormWrap> - <Input - label='Account Name' - hint='A descriptive name for the account' - value={ this.state.accountName } - onChange={ this.onEditAccountName } /> - </FormWrap> - <FormWrap> - <Input - label='Password' - hint='A strong, unique password' - type='password' - value={ this.state.password1 } - onChange={ this.onEditPassword1 } /> - </FormWrap> - <FormWrap> - <Input - label='Password (repeat)' - hint='A strong, unique password' - type='password' - value={ this.state.password2 } - onChange={ this.onEditPassword2 } /> - </FormWrap> - </Form> - ); - } - - onEditAccountName = (event) => { - this.setState({ - accountName: event.target.value - }); - } - - onEditPassword1 = (event) => { - this.setState({ - password1: event.target.value - }); - } - - onEditPassword2 = (event) => { - this.setState({ - password2: event.target.value - }); - } -} diff --git a/js/src/modals/FirstRun/CreateAccount/index.js b/js/src/modals/FirstRun/CreateAccount/index.js deleted file mode 100644 index b4e993ef4c9..00000000000 --- a/js/src/modals/FirstRun/CreateAccount/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './createAccount'; diff --git a/js/src/modals/FirstRun/RecoverAccount/index.js b/js/src/modals/FirstRun/RecoverAccount/index.js deleted file mode 100644 index eb586d4b6d6..00000000000 --- a/js/src/modals/FirstRun/RecoverAccount/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './RecoverAccount'; diff --git a/js/src/modals/FirstRun/RecoverAccount/recoverAccount.js b/js/src/modals/FirstRun/RecoverAccount/recoverAccount.js deleted file mode 100644 index ed34a23b1e8..00000000000 --- a/js/src/modals/FirstRun/RecoverAccount/recoverAccount.js +++ /dev/null @@ -1,49 +0,0 @@ -import React, { Component, PropTypes } from 'react'; - -import Form, { FormWrap, Input } from '../../../ui/Form'; -import IdentityIcon from '../../../ui/IdentityIcon'; - -export default class RecoverAccount extends Component { - static propTypes = { - accountAddress: PropTypes.string, - accountName: PropTypes.string, - accountPhrase: PropTypes.string, - visible: PropTypes.bool.isRequired - } - - render () { - if (!this.props.visible) { - return null; - } - - return ( - <Form> - <IdentityIcon - address={ this.props.accountAddress } /> - <FormWrap> - <Input - disabled - hint='a descriptive name for the account' - label='account name' - value={ this.props.accountName } /> - </FormWrap> - <FormWrap> - <Input - disabled - hint='the network address for the account' - label='address' - value={ this.props.accountAddress } /> - </FormWrap> - <FormWrap> - <Input - disabled - hint='the account recovery phrase' - label='recovery phrase' - multiLine - rows={ 2 } - value={ this.props.accountPhrase } /> - </FormWrap> - </Form> - ); - } -} diff --git a/js/src/modals/FirstRun/Welcome/welcome.js b/js/src/modals/FirstRun/Welcome/welcome.js index b5e9395e62b..e931cb73da7 100644 --- a/js/src/modals/FirstRun/Welcome/welcome.js +++ b/js/src/modals/FirstRun/Welcome/welcome.js @@ -1,4 +1,4 @@ -import React, { Component, PropTypes } from 'react'; +import React, { Component } from 'react'; const LOGO_STYLE = { float: 'right', @@ -7,15 +7,7 @@ const LOGO_STYLE = { }; export default class FirstRun extends Component { - static propTypes = { - visible: PropTypes.bool.isRequired - } - render () { - if (!this.props.visible) { - return null; - } - return ( <div> <img diff --git a/js/src/modals/FirstRun/firstRun.js b/js/src/modals/FirstRun/firstRun.js index 7bdfc92f3aa..0be27aeecf6 100644 --- a/js/src/modals/FirstRun/firstRun.js +++ b/js/src/modals/FirstRun/firstRun.js @@ -7,21 +7,30 @@ import NavigationArrowForward from 'material-ui/svg-icons/navigation/arrow-forwa import Modal from '../../ui/Modal'; +import { NewAccount, AccountDetails } from '../CreateAccount'; + import Completed from './Completed'; -import CreateAccount from './CreateAccount'; -import RecoverAccount from './RecoverAccount'; import Welcome from './Welcome'; const STAGE_NAMES = ['welcome', 'new account', 'recovery', 'completed']; export default class FirstRun extends Component { + static contextTypes = { + api: PropTypes.object.isRequired + } + static propTypes = { visible: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired } state = { - stage: 0 + stage: 0, + name: '', + address: '', + password: '', + phrase: '', + canCreate: false } render () { @@ -31,21 +40,36 @@ export default class FirstRun extends Component { current={ this.state.stage } steps={ STAGE_NAMES } visible={ this.props.visible }> - <Welcome - visible={ this.state.stage === 0 } /> - <CreateAccount - visible={ this.state.stage === 1 } /> - <RecoverAccount - accountName='Newly Created Name' - accountAddress='0xF6ABb80F11f269e4500A05721680E0a3AB075Ecf' - accountPhrase='twenty never horse quick battery foot staple rabbit skate chair' - visible={ this.state.stage === 2 } /> - <Completed - visible={ this.state.stage === 3 } /> + { this.renderStage() } </Modal> ); } + renderStage () { + switch (this.state.stage) { + case 0: + return ( + <Welcome /> + ); + case 1: + return ( + <NewAccount + onChange={ this.onChangeDetails } /> + ); + case 2: + return ( + <AccountDetails + address={ this.state.address } + name={ this.state.name } + phrase={ this.state.phrase } /> + ); + case 3: + return ( + <Completed /> + ); + } + } + renderDialogActions () { switch (this.state.stage) { case 0: @@ -55,15 +79,16 @@ export default class FirstRun extends Component { icon={ <NavigationArrowForward /> } label='Next' primary - onTouchTap={ this.onBtnNext } /> + onTouchTap={ this.onNext } /> ); case 1: return ( <FlatButton icon={ <ActionDone /> } label='Create' + disabled={ !this.state.canCreate } primary - onTouchTap={ this.onBtnNext } /> + onTouchTap={ this.onCreate } /> ); case 3: return ( @@ -71,7 +96,7 @@ export default class FirstRun extends Component { icon={ <ActionDoneAll /> } label='Close' primary - onTouchTap={ this.onBtnClose } /> + onTouchTap={ this.onClose } /> ); } } @@ -87,4 +112,39 @@ export default class FirstRun extends Component { stage: this.state.stage + 1 }); } + + onChangeDetails = (valid, { name, address, password, phrase }) => { + this.setState({ + canCreate: valid, + name: name, + address: address, + password: password, + phrase: phrase + }); + } + + onCreate = () => { + const api = this.context.api; + + if (this.state.createType === 'fromNew') { + return api.personal + .newAccountFromPhrase(this.state.phrase, this.state.password) + .then((address) => api.personal.setAccountName(address, this.state.name)) + .then(() => { + this.onNext(); + }); + } + + return api.personal + .newAccountFromWallet(this.state.json, this.state.password) + .then((address) => { + this.setState({ + address: address + }); + return api.personal.setAccountName(address, this.state.name); + }) + .then(() => { + this.onNext(); + }); + } } From 8beb0de6871087c1d909a8f0d4a4d3f24de736da Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 08:50:30 +0200 Subject: [PATCH 0068/1062] firstRun tested end-to-end (small issue remains, account list refresh) --- js/src/modals/FirstRun/Completed/completed.js | 2 +- js/src/modals/FirstRun/firstRun.js | 22 ++++--------------- 2 files changed, 5 insertions(+), 19 deletions(-) diff --git a/js/src/modals/FirstRun/Completed/completed.js b/js/src/modals/FirstRun/Completed/completed.js index 1c146b94b3d..04dac5a1997 100644 --- a/js/src/modals/FirstRun/Completed/completed.js +++ b/js/src/modals/FirstRun/Completed/completed.js @@ -4,7 +4,7 @@ export default class Completed extends Component { render () { return ( <div> - <p>Your node setup has been completed successfully.</p> + <p>Your node setup has been completed successfully and you are ready to use the application. Next you will receive a walk-through of the available functions and the general application interface to get you up and running in record time.</p> </div> ); } diff --git a/js/src/modals/FirstRun/firstRun.js b/js/src/modals/FirstRun/firstRun.js index 0be27aeecf6..f9d410b9720 100644 --- a/js/src/modals/FirstRun/firstRun.js +++ b/js/src/modals/FirstRun/firstRun.js @@ -101,13 +101,13 @@ export default class FirstRun extends Component { } } - onBtnClose = () => { + onClose = () => { this.setState({ stage: 0 }, this.props.onClose); } - onBtnNext = () => { + onNext = () => { this.setState({ stage: this.state.stage + 1 }); @@ -126,23 +126,9 @@ export default class FirstRun extends Component { onCreate = () => { const api = this.context.api; - if (this.state.createType === 'fromNew') { - return api.personal - .newAccountFromPhrase(this.state.phrase, this.state.password) - .then((address) => api.personal.setAccountName(address, this.state.name)) - .then(() => { - this.onNext(); - }); - } - return api.personal - .newAccountFromWallet(this.state.json, this.state.password) - .then((address) => { - this.setState({ - address: address - }); - return api.personal.setAccountName(address, this.state.name); - }) + .newAccountFromPhrase(this.state.phrase, this.state.password) + .then((address) => api.personal.setAccountName(address, this.state.name)) .then(() => { this.onNext(); }); From 82c8cf73c284e5eb24a24e73a9184e1babe299af Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 08:59:33 +0200 Subject: [PATCH 0069/1062] refresh account list on a timer (rough, very rough) --- js/src/views/Accounts/accounts.js | 2 +- js/src/views/Application/Status/status.js | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/js/src/views/Accounts/accounts.js b/js/src/views/Accounts/accounts.js index e64b6ef746e..d37fa2ee409 100644 --- a/js/src/views/Accounts/accounts.js +++ b/js/src/views/Accounts/accounts.js @@ -70,7 +70,6 @@ export default class Accounts extends Component { } onNewAccountUpdate = () => { - this.retrieveAccounts(); } retrieveAccounts () { @@ -82,6 +81,7 @@ export default class Accounts extends Component { api.personal.accountsInfo() ]) .then(([addresses, infos]) => { + setTimeout(() => this.retrieveAccounts(), 2500); this.setState({ accounts: addresses .filter((address) => infos[address].uuid) diff --git a/js/src/views/Application/Status/status.js b/js/src/views/Application/Status/status.js index cdbc86d83dd..ec8adb5f723 100644 --- a/js/src/views/Application/Status/status.js +++ b/js/src/views/Application/Status/status.js @@ -39,6 +39,7 @@ export default class Status extends Component { api.eth.syncing() ]) .then(([clientVersion, peerCount, blockNumber, syncing]) => { + setTimeout(() => this.poll(), 2500); this.setState({ blockNumber: blockNumber.toFormat(0), clientVersion: clientVersion, @@ -46,7 +47,5 @@ export default class Status extends Component { syncing: syncing }); }); - - setTimeout(() => this.poll(), 2500); } } From c918d3607b51f47756aa084fa90a601796d6d1ba Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 10:53:34 +0200 Subject: [PATCH 0070/1062] overlay had cloak on background --- js/src/ui/Tooltip/TooltipManager/index.js | 1 - .../Tooltip/TooltipManager/tooltipManager.js | 29 --------- js/src/ui/Tooltip/TooltipOverlay/index.js | 1 + .../Tooltip/TooltipOverlay/tooltipOverlay.js | 60 +++++++++++++++++++ js/src/ui/Tooltip/index.js | 4 +- js/src/ui/Tooltip/style.css | 10 ++++ js/src/views/Application/application.js | 24 ++++---- 7 files changed, 85 insertions(+), 44 deletions(-) delete mode 100644 js/src/ui/Tooltip/TooltipManager/index.js delete mode 100644 js/src/ui/Tooltip/TooltipManager/tooltipManager.js create mode 100644 js/src/ui/Tooltip/TooltipOverlay/index.js create mode 100644 js/src/ui/Tooltip/TooltipOverlay/tooltipOverlay.js diff --git a/js/src/ui/Tooltip/TooltipManager/index.js b/js/src/ui/Tooltip/TooltipManager/index.js deleted file mode 100644 index 37b7d7e753d..00000000000 --- a/js/src/ui/Tooltip/TooltipManager/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './TooltipManager'; diff --git a/js/src/ui/Tooltip/TooltipManager/tooltipManager.js b/js/src/ui/Tooltip/TooltipManager/tooltipManager.js deleted file mode 100644 index a782e13212c..00000000000 --- a/js/src/ui/Tooltip/TooltipManager/tooltipManager.js +++ /dev/null @@ -1,29 +0,0 @@ -export default class TooltipManager { - constructor () { - this.currentId = 0; - this.updateCallbacks = []; - } - - register (updateCallback) { - this.updateCallbacks.push(updateCallback); - this.update(); - - return this.updateCallbacks.length - 1; - } - - update () { - this.updateCallbacks.forEach((cb) => { - cb(this.currentId, this.updateCallbacks.length - 1); - }); - } - - next () { - this.currentId++; - this.update(); - } - - close () { - this.currentId = -1; - this.update(); - } -} diff --git a/js/src/ui/Tooltip/TooltipOverlay/index.js b/js/src/ui/Tooltip/TooltipOverlay/index.js new file mode 100644 index 00000000000..352754ad77b --- /dev/null +++ b/js/src/ui/Tooltip/TooltipOverlay/index.js @@ -0,0 +1 @@ +export default from './TooltipOverlay'; diff --git a/js/src/ui/Tooltip/TooltipOverlay/tooltipOverlay.js b/js/src/ui/Tooltip/TooltipOverlay/tooltipOverlay.js new file mode 100644 index 00000000000..5b8f3c008f8 --- /dev/null +++ b/js/src/ui/Tooltip/TooltipOverlay/tooltipOverlay.js @@ -0,0 +1,60 @@ +import React, { Component, PropTypes } from 'react'; + +import styles from '../style.css'; + +export default class TooltipOverlay extends Component { + static childContextTypes = { + tooltips: PropTypes.object + } + + static propTypes = { + children: PropTypes.node + } + + state = { + currentId: 0, + updateCallbacks: [] + } + + render () { + const overlay = this.state.currentId === -1 ? null : (<div className={ styles.overlay } />); + + return ( + <div> + { overlay } + { this.props.children } + </div> + ); + } + + getChildContext () { + return { + tooltips: this + }; + } + + register (updateCallback) { + this.state.updateCallbacks.push(updateCallback); + this.update(); + + return this.state.updateCallbacks.length - 1; + } + + update = () => { + this.state.updateCallbacks.forEach((cb) => { + cb(this.state.currentId, this.state.updateCallbacks.length - 1); + }); + } + + next () { + this.setState({ + currentId: this.state.currentId + 1 + }, this.update); + } + + close () { + this.setState({ + currentId: -1 + }, this.update); + } +} diff --git a/js/src/ui/Tooltip/index.js b/js/src/ui/Tooltip/index.js index 5ae9b01dc8d..a1644c1cee3 100644 --- a/js/src/ui/Tooltip/index.js +++ b/js/src/ui/Tooltip/index.js @@ -1,4 +1,4 @@ -import TooltipManager from './TooltipManager'; +import TooltipOverlay from './TooltipOverlay'; export default from './tooltip'; -export { TooltipManager }; +export { TooltipOverlay }; diff --git a/js/src/ui/Tooltip/style.css b/js/src/ui/Tooltip/style.css index 384fa14397a..f3168211a71 100644 --- a/js/src/ui/Tooltip/style.css +++ b/js/src/ui/Tooltip/style.css @@ -1,3 +1,13 @@ +.overlay { + position: fixed; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; + z-index: 499; +} + .box { position: absolute; background: #663600; /* rgba(48, 48, 48, 0.95); #88b7d5; */ diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index 6287f44d2f6..8c85bfa0201 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -5,7 +5,7 @@ import darkBaseTheme from 'material-ui/styles/baseThemes/darkBaseTheme'; import lightBaseTheme from 'material-ui/styles/baseThemes/lightBaseTheme'; import Api from '../../api'; -import { TooltipManager } from '../../ui/Tooltip'; +import { TooltipOverlay } from '../../ui/Tooltip'; import { FirstRun } from '../../modals'; import Status from './Status'; @@ -16,7 +16,6 @@ import styles from './style.css'; const lightTheme = getMuiTheme(lightBaseTheme); const muiTheme = getMuiTheme(darkBaseTheme); const api = new Api(new Api.Transport.Http('/rpc/')); -const tooltips = new TooltipManager(); muiTheme.stepper.textColor = '#eee'; muiTheme.stepper.disabledTextColor = '#777'; @@ -49,22 +48,23 @@ export default class Application extends Component { render () { return ( - <div className={ styles.container }> - <FirstRun - onClose={ this.onCloseFirst } - visible={ this.state.showFirst } /> - <TabBar /> - { this.props.children } - <Status /> - </div> + <TooltipOverlay> + <div className={ styles.container }> + <FirstRun + onClose={ this.onCloseFirst } + visible={ this.state.showFirst } /> + <TabBar /> + { this.props.children } + <Status /> + </div> + </TooltipOverlay> ); } getChildContext () { return { api: api, - muiTheme: muiTheme, - tooltips: tooltips + muiTheme: muiTheme }; } From 14021c5d6f88c7cfe3211c761e4ab7c3df82cc28 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 11:22:52 +0200 Subject: [PATCH 0071/1062] transfer progress bar & explorer link --- js/src/modals/Transfer/Complete/complete.js | 38 ++++++++++++++++++ js/src/modals/Transfer/Complete/index.js | 1 + js/src/modals/Transfer/transfer.js | 43 ++++++++++++--------- 3 files changed, 63 insertions(+), 19 deletions(-) create mode 100644 js/src/modals/Transfer/Complete/complete.js create mode 100644 js/src/modals/Transfer/Complete/index.js diff --git a/js/src/modals/Transfer/Complete/complete.js b/js/src/modals/Transfer/Complete/complete.js new file mode 100644 index 00000000000..c228e3c931d --- /dev/null +++ b/js/src/modals/Transfer/Complete/complete.js @@ -0,0 +1,38 @@ +import React, { Component, PropTypes } from 'react'; + +import LinearProgress from 'material-ui/LinearProgress'; + +import styles from '../style.css'; + +export default class Complete extends Component { + static propTypes = { + txhash: PropTypes.string, + sending: PropTypes.bool + } + + render () { + if (this.props.sending) { + return ( + <div> + <div className={ styles.info }> + The transaction is sending, please wait until the transaction hash is received + </div> + <LinearProgress mode='indeterminate' /> + </div> + ); + } + + const txlink = `https://etherscan.io/tx/${this.props.txhash}`; + + return ( + <div> + <div className={ styles.info }> + The transaction was send with a transaction hash (useful for tracking on a block explorer) of + </div> + <div> + <a href={ txlink } target='_blank'>{ this.props.txhash }</a> + </div> + </div> + ); + } +} diff --git a/js/src/modals/Transfer/Complete/index.js b/js/src/modals/Transfer/Complete/index.js new file mode 100644 index 00000000000..b86b7fba57c --- /dev/null +++ b/js/src/modals/Transfer/Complete/index.js @@ -0,0 +1 @@ +export default from './complete'; diff --git a/js/src/modals/Transfer/transfer.js b/js/src/modals/Transfer/transfer.js index cd0502024c6..4994b053def 100644 --- a/js/src/modals/Transfer/transfer.js +++ b/js/src/modals/Transfer/transfer.js @@ -8,6 +8,7 @@ import NavigationArrowForward from 'material-ui/svg-icons/navigation/arrow-forwa import Modal from '../../ui/Modal'; +import Complete from './Complete'; import Details from './Details'; import Verify from './Verify'; @@ -68,7 +69,9 @@ export default class Transfer extends Component { ); case 2: return ( - <div>{ this.state.txhash }</div> + <Complete + sending={ this.state.sending } + txhash={ this.state.txhash } /> ); } } @@ -132,27 +135,29 @@ export default class Transfer extends Component { } onSend = () => { + this.onNext(); + this.setState({ sending: true - }, () => { - this.context.api.personal - .signAndSendTransaction({ - from: this.props.address, - to: this.state.recipient, - gas: this.state.gas, - value: this.state.amount - }, this.state.password) - .then((txhash) => { - console.log('transaction', txhash); - this.setState({ - sending: false, - txhash: txhash - }, this.onNext); - }) - .catch((error) => { - console.error(error); - }); }); + + this.context.api.personal + .signAndSendTransaction({ + from: this.props.address, + to: this.state.recipient, + gas: this.state.gas, + value: this.state.amount + }, this.state.password) + .then((txhash) => { + console.log('transaction', txhash); + this.setState({ + sending: false, + txhash: txhash + }); + }) + .catch((error) => { + console.error(error); + }); } onChangeDetails = (valid, { amount, gas, recipient, total }) => { From b360a05ff087a142d51b8e78379d27b19babd683 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 11:29:14 +0200 Subject: [PATCH 0072/1062] setState render issues (components non-active, hacky work-arounds needs proper flux) --- js/src/ui/Tooltip/TooltipOverlay/tooltipOverlay.js | 4 ++++ js/src/views/Accounts/accounts.js | 12 +++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/js/src/ui/Tooltip/TooltipOverlay/tooltipOverlay.js b/js/src/ui/Tooltip/TooltipOverlay/tooltipOverlay.js index 5b8f3c008f8..cd4a00db43e 100644 --- a/js/src/ui/Tooltip/TooltipOverlay/tooltipOverlay.js +++ b/js/src/ui/Tooltip/TooltipOverlay/tooltipOverlay.js @@ -34,6 +34,10 @@ export default class TooltipOverlay extends Component { } register (updateCallback) { + if (this.state.currentId === -1) { + return; + } + this.state.updateCallbacks.push(updateCallback); this.update(); diff --git a/js/src/views/Accounts/accounts.js b/js/src/views/Accounts/accounts.js index d37fa2ee409..3dd70e8ba42 100644 --- a/js/src/views/Accounts/accounts.js +++ b/js/src/views/Accounts/accounts.js @@ -17,10 +17,16 @@ export default class Accounts extends Component { newDialog: false } - componentWillMount () { + componentDidMount () { + // TODO: we should be getting data from a provider + this._isMounted = true; this.retrieveAccounts(); } + componentWillUnmount () { + this._isMounted = false; + } + render () { return ( <div> @@ -73,6 +79,10 @@ export default class Accounts extends Component { } retrieveAccounts () { + if (!this._isMounted) { + return; + } + const api = this.context.api; Promise From e623eb880fc6369254d3bd6a702ad17f54807de8 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 11:47:01 +0200 Subject: [PATCH 0073/1062] prep for extended information config --- js/src/modals/Transfer/Details/details.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js index af0273fb6d8..7fa30d7d5ec 100644 --- a/js/src/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -65,7 +65,7 @@ export default class Details extends Component { return ( <Form> <div className={ styles.info }> - Complete the information for the transaction with a valid recipient and the amount to be transferred. For normal transactions, the gas value can be left at the default. + Complete the information for the transaction with a valid recipient and the amount to be transferred. Additional transaction information such as the gas, gasPrice and transaction data can be set via the extended information options. </div> <Input label='recipient address' From a317ad286f4b2d098b06a3fc88ab480bd9fb09af Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 11:53:01 +0200 Subject: [PATCH 0074/1062] settings placeholder tab --- js/src/app.js | 2 ++ js/src/views/Application/TabBar/tabBar.js | 6 ++++++ js/src/views/Settings/index.js | 1 + js/src/views/Settings/settings.js | 13 +++++++++++++ 4 files changed, 22 insertions(+) create mode 100644 js/src/views/Settings/index.js create mode 100644 js/src/views/Settings/settings.js diff --git a/js/src/app.js b/js/src/app.js index 9e6226c4cc2..9cc9fcaa8ad 100644 --- a/js/src/app.js +++ b/js/src/app.js @@ -17,6 +17,7 @@ import Account from './views/Account'; import Application from './views/Application'; import Apps from './views/Apps'; import Tokens from './views/Tokens'; +import Settings from './views/Settings'; import styles from './reset.css'; @@ -30,6 +31,7 @@ ReactDOM.render( <Route path='account/:address' component={ Account } /> <Route path='apps' component={ Apps } /> <Route path='tokens' component={ Tokens } /> + <Route path='settings' component={ Settings } /> </Route> </Router>, document.querySelector('#container') diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index f885e5147e4..a0cb935a24a 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -5,6 +5,7 @@ import { Tabs, Tab } from 'material-ui/Tabs'; import ActionAccountBalanceWallet from 'material-ui/svg-icons/action/account-balance-wallet'; import ActionDashboard from 'material-ui/svg-icons/action/dashboard'; +import ActionSettings from 'material-ui/svg-icons/action/settings'; import NavigationApps from 'material-ui/svg-icons/navigation/apps'; import Tooltip from '../../../ui/Tooltip'; @@ -44,6 +45,11 @@ export default class TabBar extends Component { icon={ <NavigationApps /> } label='apps' onActive={ this.onActivate } /> + <Tab + data-route='/settings' + icon={ <ActionSettings /> } + label='settings' + onActive={ this.onActivate } /> </Tabs> </Toolbar> ); diff --git a/js/src/views/Settings/index.js b/js/src/views/Settings/index.js new file mode 100644 index 00000000000..e86e3d8238d --- /dev/null +++ b/js/src/views/Settings/index.js @@ -0,0 +1 @@ +export default from './settings'; diff --git a/js/src/views/Settings/settings.js b/js/src/views/Settings/settings.js new file mode 100644 index 00000000000..c553c5b254f --- /dev/null +++ b/js/src/views/Settings/settings.js @@ -0,0 +1,13 @@ +import React, { Component } from 'react'; + +import Container from '../../ui/Container'; + +export default class Settings extends Component { + render () { + return ( + <Container> + <div>application settings such as full node overview, secure signer config, etc.</div> + </Container> + ); + } +} From 207ce9abeaffc397801dad7d56be1073bf968e97 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 12:01:29 +0200 Subject: [PATCH 0075/1062] update recipient address missing description --- js/src/modals/Transfer/Details/details.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js index 7fa30d7d5ec..8645adf8800 100644 --- a/js/src/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -16,7 +16,7 @@ const CHECK_STYLE = { }; const ERRORS = { - requireRecipient: 'a recipient account is required for the transaction', + requireRecipient: 'a recipient network address is required for the transaction', invalidAddress: 'the supplied address is an invalid network address', invalidAmount: 'the supplied amount should be a valid positive number', largeAmount: 'the transaction total is higher than the available balance' From 49a3c5af78fb5183007b00b9fa4b4e2dc43ce70f Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 13:54:45 +0200 Subject: [PATCH 0076/1062] Extended details into an own section (WIP, unused atm) --- js/src/modals/Transfer/Details/details.js | 26 +++++++++++++---------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/js/src/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js index 8645adf8800..25bd6ab3115 100644 --- a/js/src/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -51,17 +51,6 @@ export default class Details extends Component { } render () { - // <div className={ styles.columns }> - // <div> - // <Input - // label='gas amount' - // hint='the amount of gas to use for the transaction' - // error={ this.state.gasError } - // value={ this.state.gas } - // onChange={ this.onEditGas } /> - // </div> - // </div> - return ( <Form> <div className={ styles.info }> @@ -104,6 +93,21 @@ export default class Details extends Component { ); } + renderExtended () { + return ( + <div className={ styles.columns }> + <div> + <Input + label='gas amount' + hint='the amount of gas to use for the transaction' + error={ this.state.gasError } + value={ this.state.gas } + onChange={ this.onEditGas } /> + </div> + </div> + ); + } + onCheckFullAmount = (event) => { let amount = this.state.amount; From 574191cde587da5a8410663212d7438c193e4274 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 14:42:31 +0200 Subject: [PATCH 0077/1062] floating button for file selector --- .../CreateAccount/NewImport/newImport.js | 36 ++++++++-------- js/src/modals/CreateAccount/style.css | 3 ++ js/src/ui/Form/Input/input.js | 43 ++++++++++--------- 3 files changed, 44 insertions(+), 38 deletions(-) diff --git a/js/src/modals/CreateAccount/NewImport/newImport.js b/js/src/modals/CreateAccount/NewImport/newImport.js index 5b25559f12c..2f06932ba67 100644 --- a/js/src/modals/CreateAccount/NewImport/newImport.js +++ b/js/src/modals/CreateAccount/NewImport/newImport.js @@ -64,23 +64,25 @@ export default class NewImport extends Component { onChange={ this.onEditPassword } /> </div> </div> - <Input - disabled - label='wallet file' - hint='the wallet file for import' - error={ this.state.walletFileError } - value={ this.state.walletFile } /> - <div className={ styles.upload }> - <FlatButton - icon={ <CommunicationImportExport /> } - label='Select file' - primary - onClick={ this.openFileDialog } /> - <input - ref='fileUpload' - type='file' - style={ { display: 'none' } } - onChange={ this.onFileChange } /> + <div> + <Input + disabled + label='wallet file' + hint='the wallet file for import' + error={ this.state.walletFileError } + value={ this.state.walletFile } /> + <div className={ styles.upload }> + <FlatButton + icon={ <CommunicationImportExport /> } + label='Select file' + primary + onClick={ this.openFileDialog } /> + <input + ref='fileUpload' + type='file' + style={ { display: 'none' } } + onChange={ this.onFileChange } /> + </div> </div> </Form> ); diff --git a/js/src/modals/CreateAccount/style.css b/js/src/modals/CreateAccount/style.css index c03ac2e1a67..7f667ded935 100644 --- a/js/src/modals/CreateAccount/style.css +++ b/js/src/modals/CreateAccount/style.css @@ -36,4 +36,7 @@ .upload { text-align: right; + float: right; + margin-left: -100%; + margin-top: 28px; } diff --git a/js/src/ui/Form/Input/input.js b/js/src/ui/Form/Input/input.js index b6d9490bd38..305898324c0 100644 --- a/js/src/ui/Form/Input/input.js +++ b/js/src/ui/Form/Input/input.js @@ -12,6 +12,7 @@ const UNDERLINE_NORMAL = { export default class Input extends Component { static propTypes = { + children: PropTypes.node, disabled: PropTypes.bool, error: PropTypes.string, hint: PropTypes.string, @@ -31,27 +32,27 @@ export default class Input extends Component { const nameid = ' '; return ( - <div> - <TextField - autoComplete='off' - disabled={ this.props.disabled } - errorText={ this.props.error } - floatingLabelFixed - floatingLabelText={ this.props.label } - fullWidth - hintText={ this.props.hint } - multiLine={ this.props.multiLine } - name={ nameid } - id={ nameid } - rows={ this.props.rows } - type={ this.props.type || 'text' } - underlineDisabledStyle={ UNDERLINE_DISABLED } - underlineStyle={ UNDERLINE_NORMAL } - value={ this.props.value } - onBlur={ this.props.onBlur } - onChange={ this.props.onChange } - onKeyDown={ this.props.onKeyDown } /> - </div> + <TextField + autoComplete='off' + disabled={ this.props.disabled } + errorText={ this.props.error } + floatingLabelFixed + floatingLabelText={ this.props.label } + fullWidth + hintText={ this.props.hint } + multiLine={ this.props.multiLine } + name={ nameid } + id={ nameid } + rows={ this.props.rows } + type={ this.props.type || 'text' } + underlineDisabledStyle={ UNDERLINE_DISABLED } + underlineStyle={ UNDERLINE_NORMAL } + value={ this.props.value } + onBlur={ this.props.onBlur } + onChange={ this.props.onChange } + onKeyDown={ this.props.onKeyDown }> + { this.props.children } + </TextField> ); } } From 5cfeb54df9ee8b0fff8e39a79eab109125b65222 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 14:44:21 +0200 Subject: [PATCH 0078/1062] select file icon update (attachment) --- js/src/modals/CreateAccount/NewImport/newImport.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/modals/CreateAccount/NewImport/newImport.js b/js/src/modals/CreateAccount/NewImport/newImport.js index 2f06932ba67..81bea677d73 100644 --- a/js/src/modals/CreateAccount/NewImport/newImport.js +++ b/js/src/modals/CreateAccount/NewImport/newImport.js @@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'; import ReactDOM from 'react-dom'; import { FlatButton } from 'material-ui'; -import CommunicationImportExport from 'material-ui/svg-icons/communication/import-export'; +import EditorAttachFile from 'material-ui/svg-icons/editor/attach-file'; import Form, { Input } from '../../../ui/Form'; @@ -73,7 +73,7 @@ export default class NewImport extends Component { value={ this.state.walletFile } /> <div className={ styles.upload }> <FlatButton - icon={ <CommunicationImportExport /> } + icon={ <EditorAttachFile /> } label='Select file' primary onClick={ this.openFileDialog } /> From 017a66a17cb55f4af5587885a7acf06eb8e62f0b Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 15:09:45 +0200 Subject: [PATCH 0079/1062] floating tool buttons for overlay on inputs --- .../CreateAccount/NewImport/newImport.js | 12 ++++----- js/src/modals/CreateAccount/style.css | 4 +++ js/src/modals/Transfer/Details/details.js | 27 ++++++++++++++----- js/src/modals/Transfer/style.css | 11 ++++++++ 4 files changed, 41 insertions(+), 13 deletions(-) diff --git a/js/src/modals/CreateAccount/NewImport/newImport.js b/js/src/modals/CreateAccount/NewImport/newImport.js index 81bea677d73..ff7597a44c2 100644 --- a/js/src/modals/CreateAccount/NewImport/newImport.js +++ b/js/src/modals/CreateAccount/NewImport/newImport.js @@ -1,7 +1,7 @@ import React, { Component, PropTypes } from 'react'; import ReactDOM from 'react-dom'; -import { FlatButton } from 'material-ui'; +import { FloatingActionButton } from 'material-ui'; import EditorAttachFile from 'material-ui/svg-icons/editor/attach-file'; import Form, { Input } from '../../../ui/Form'; @@ -72,11 +72,11 @@ export default class NewImport extends Component { error={ this.state.walletFileError } value={ this.state.walletFile } /> <div className={ styles.upload }> - <FlatButton - icon={ <EditorAttachFile /> } - label='Select file' - primary - onClick={ this.openFileDialog } /> + <FloatingActionButton + primary mini + onClick={ this.openFileDialog }> + <EditorAttachFile /> + </FloatingActionButton> <input ref='fileUpload' type='file' diff --git a/js/src/modals/CreateAccount/style.css b/js/src/modals/CreateAccount/style.css index 7f667ded935..72840c7c8dd 100644 --- a/js/src/modals/CreateAccount/style.css +++ b/js/src/modals/CreateAccount/style.css @@ -40,3 +40,7 @@ margin-left: -100%; margin-top: 28px; } + +.upload>div { + margin-right: 0.5em; +} diff --git a/js/src/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js index 25bd6ab3115..8d625ff8037 100644 --- a/js/src/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -1,6 +1,9 @@ import React, { Component, PropTypes } from 'react'; import BigNumber from 'bignumber.js'; -import { Checkbox } from 'material-ui'; +import { Checkbox, FlatButton, FloatingActionButton } from 'material-ui'; + +import ActionAccountBalanceWallet from 'material-ui/svg-icons/action/account-balance-wallet'; +import CommunicationContacts from 'material-ui/svg-icons/communication/contacts'; import Api from '../../../api'; import Form, { Input } from '../../../ui/Form'; @@ -56,12 +59,22 @@ export default class Details extends Component { <div className={ styles.info }> Complete the information for the transaction with a valid recipient and the amount to be transferred. Additional transaction information such as the gas, gasPrice and transaction data can be set via the extended information options. </div> - <Input - label='recipient address' - hint='the recipient address' - error={ this.state.recipientError } - value={ this.state.recipient } - onChange={ this.onEditRecipient } /> + <div> + <Input + label='recipient address' + hint='the recipient address' + error={ this.state.recipientError } + value={ this.state.recipient } + onChange={ this.onEditRecipient } /> + <div className={ styles.floatbutton }> + <FloatingActionButton primary mini> + <CommunicationContacts /> + </FloatingActionButton> + <FloatingActionButton primary mini> + <ActionAccountBalanceWallet /> + </FloatingActionButton> + </div> + </div> <div className={ styles.columns }> <div> <Input diff --git a/js/src/modals/Transfer/style.css b/js/src/modals/Transfer/style.css index 36f55640a7a..cb97398c419 100644 --- a/js/src/modals/Transfer/style.css +++ b/js/src/modals/Transfer/style.css @@ -15,3 +15,14 @@ width: 50%; position: relative; } + +.floatbutton { + text-align: right; + float: right; + margin-left: -100%; + margin-top: 28px; +} + +.floatbutton>div { + margin-right: 0.5em; +} From 278905c2f3a1c5c45d3bf95c5dfb9ff2d61acb06 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 15:11:41 +0200 Subject: [PATCH 0080/1062] magic variables to constants --- js/src/modals/CreateAccount/NewImport/newImport.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/js/src/modals/CreateAccount/NewImport/newImport.js b/js/src/modals/CreateAccount/NewImport/newImport.js index ff7597a44c2..62e0240dc5e 100644 --- a/js/src/modals/CreateAccount/NewImport/newImport.js +++ b/js/src/modals/CreateAccount/NewImport/newImport.js @@ -8,6 +8,9 @@ import Form, { Input } from '../../../ui/Form'; import styles from '../style.css'; +const FAKEPATH = 'C:\\fakepath\\'; +const STYLE_HIDDEN = { display: 'none' }; + const ERRORS = { noName: 'you need to specify a valid name for the account', noPassword: 'supply a valid password to confirm the transaction', @@ -80,7 +83,7 @@ export default class NewImport extends Component { <input ref='fileUpload' type='file' - style={ { display: 'none' } } + style={ STYLE_HIDDEN } onChange={ this.onFileChange } /> </div> </div> @@ -105,7 +108,7 @@ export default class NewImport extends Component { } this.setState({ - walletFile: el.value.replace('C:\\fakepath\\', ''), + walletFile: el.value.replace(FAKEPATH, ''), walletFileError: error, isValidFile: false }, this.updateParent); From 3c4496843159ec1a500c0e40061f4e194b0c97d3 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 15:24:10 +0200 Subject: [PATCH 0081/1062] allow scrollable modals via scroll --- js/src/ui/Modal/modal.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/js/src/ui/Modal/modal.js b/js/src/ui/Modal/modal.js index 8f5d30b3339..613f616b84b 100644 --- a/js/src/ui/Modal/modal.js +++ b/js/src/ui/Modal/modal.js @@ -13,6 +13,7 @@ export default class Modal extends Component { actions: PropTypes.node, children: PropTypes.node, current: PropTypes.number, + scroll: PropTypes.bool, steps: PropTypes.array, title: React.PropTypes.oneOfType([ PropTypes.node, PropTypes.string @@ -30,7 +31,7 @@ export default class Modal extends Component { actions={ this.props.actions } actionsContainerStyle={ TITLE_STYLE } autoDetectWindowHeight={ false } - autoScrollBodyContent={ false } + autoScrollBodyContent={ !!this.props.scroll } contentStyle={ CONTENT_STYLE } modal open={ this.props.visible } From 3a2b30ccb56f0e91d6bf2bb4d07cfb83cf878dba Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 16:08:34 +0200 Subject: [PATCH 0082/1062] onTouchTap for all action buttons --- js/src/modals/CreateAccount/NewImport/newImport.js | 2 +- js/src/modals/Transfer/Details/details.js | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/js/src/modals/CreateAccount/NewImport/newImport.js b/js/src/modals/CreateAccount/NewImport/newImport.js index 62e0240dc5e..ff5813ae465 100644 --- a/js/src/modals/CreateAccount/NewImport/newImport.js +++ b/js/src/modals/CreateAccount/NewImport/newImport.js @@ -77,7 +77,7 @@ export default class NewImport extends Component { <div className={ styles.upload }> <FloatingActionButton primary mini - onClick={ this.openFileDialog }> + onTouchTap={ this.openFileDialog }> <EditorAttachFile /> </FloatingActionButton> <input diff --git a/js/src/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js index 8d625ff8037..20f60cc4221 100644 --- a/js/src/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -1,8 +1,7 @@ import React, { Component, PropTypes } from 'react'; import BigNumber from 'bignumber.js'; -import { Checkbox, FlatButton, FloatingActionButton } from 'material-ui'; +import { Checkbox, FloatingActionButton } from 'material-ui'; -import ActionAccountBalanceWallet from 'material-ui/svg-icons/action/account-balance-wallet'; import CommunicationContacts from 'material-ui/svg-icons/communication/contacts'; import Api from '../../../api'; @@ -67,12 +66,11 @@ export default class Details extends Component { value={ this.state.recipient } onChange={ this.onEditRecipient } /> <div className={ styles.floatbutton }> - <FloatingActionButton primary mini> + <FloatingActionButton + primary mini + onTouchTap={ this.onContacts }> <CommunicationContacts /> </FloatingActionButton> - <FloatingActionButton primary mini> - <ActionAccountBalanceWallet /> - </FloatingActionButton> </div> </div> <div className={ styles.columns }> @@ -199,6 +197,10 @@ export default class Details extends Component { }, this.calculateTotals); } + onContacts = () => { + + } + updateParent = () => { const isValid = !this.state.recipientError && !this.state.amountError && !this.state.gasError; From ff50cd5715c6b937d86199c3659688594d33b4d6 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 16:13:25 +0200 Subject: [PATCH 0083/1062] blank name defaults to 'Unnamed' --- js/src/views/Account/account.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/views/Account/account.js b/js/src/views/Account/account.js index 53b760ad2b1..c15e16c6179 100644 --- a/js/src/views/Account/account.js +++ b/js/src/views/Account/account.js @@ -38,7 +38,7 @@ export default class Account extends Component { const address = this.props.params.address; const title = ( <span> - <span>{ this.state.name }</span> + <span>{ this.state.name || 'Unnamed' }</span> <ContentCreate className={ styles.editicon } color='rgb(0, 151, 167)' /> From 615f0f309d49d42080e74471a6998fcabb2d78ea Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 16:16:55 +0200 Subject: [PATCH 0084/1062] title section has a background --- js/src/ui/Modal/ModalSteps/style.css | 1 + js/src/ui/Modal/modal.js | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/js/src/ui/Modal/ModalSteps/style.css b/js/src/ui/Modal/ModalSteps/style.css index 220db7eb7d8..afcc3174307 100644 --- a/js/src/ui/Modal/ModalSteps/style.css +++ b/js/src/ui/Modal/ModalSteps/style.css @@ -1,5 +1,6 @@ .title { padding: 1em; + background: rgba(0, 0, 0, 0.175); } .title h3 { diff --git a/js/src/ui/Modal/modal.js b/js/src/ui/Modal/modal.js index 613f616b84b..5f6a1c7fb06 100644 --- a/js/src/ui/Modal/modal.js +++ b/js/src/ui/Modal/modal.js @@ -4,6 +4,7 @@ import { Dialog } from 'material-ui'; import ModalSteps from './ModalSteps'; +const ACTIONS_STYLE = { borderStyle: 'none' }; const TITLE_STYLE = { borderStyle: 'none' }; const DIALOG_STYLE = { paddingTop: '1px' }; const CONTENT_STYLE = { transform: 'translate(0px, 0px)' }; @@ -29,7 +30,7 @@ export default class Modal extends Component { return ( <Dialog actions={ this.props.actions } - actionsContainerStyle={ TITLE_STYLE } + actionsContainerStyle={ ACTIONS_STYLE } autoDetectWindowHeight={ false } autoScrollBodyContent={ !!this.props.scroll } contentStyle={ CONTENT_STYLE } From ac3a9dd41a8517f7dffcf404769e1f885dac742c Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 16:31:48 +0200 Subject: [PATCH 0085/1062] simplify modals, fields & inputs should be self-explanatory --- .../AccountDetails/accountDetails.js | 15 +++------------ .../CreateAccount/CreationType/creationType.js | 11 ++++------- .../modals/CreateAccount/NewAccount/newAccount.js | 3 --- .../modals/CreateAccount/NewImport/newImport.js | 3 --- js/src/modals/CreateAccount/style.css | 5 ++--- js/src/modals/Transfer/Details/details.js | 3 --- js/src/modals/Transfer/Verify/verify.js | 6 ------ js/src/modals/Transfer/style.css | 2 +- js/src/ui/IdentityIcon/identityIcon.js | 5 +++-- js/src/ui/IdentityIcon/style.css | 5 ++++- 10 files changed, 17 insertions(+), 41 deletions(-) diff --git a/js/src/modals/CreateAccount/AccountDetails/accountDetails.js b/js/src/modals/CreateAccount/AccountDetails/accountDetails.js index fadf631c36d..5cc15c8ea0c 100644 --- a/js/src/modals/CreateAccount/AccountDetails/accountDetails.js +++ b/js/src/modals/CreateAccount/AccountDetails/accountDetails.js @@ -3,8 +3,6 @@ import React, { Component, PropTypes } from 'react'; import Form, { FormWrap, Input } from '../../../ui/Form'; import IdentityIcon from '../../../ui/IdentityIcon'; -import styles from '../style.css'; - export default class RecoverAccount extends Component { static propTypes = { address: PropTypes.string, @@ -13,18 +11,11 @@ export default class RecoverAccount extends Component { } render () { - let info = 'The details for your newly created account is displayed below. '; - if (this.props.phrase) { - info += 'Take note of your recovery phrase and store it in a secure location, without it you cannot recover your account should you lose your password.'; - } - return ( <Form> <IdentityIcon + padded address={ this.props.address } /> - <div className={ styles.info }> - { info } - </div> <FormWrap> <Input disabled @@ -53,8 +44,8 @@ export default class RecoverAccount extends Component { <FormWrap> <Input disabled - hint='The account recovery phrase' - label='Recovery Phrase' + hint='the account recovery phrase' + label='account recovery phrase (take note)' multiLine rows={ 1 } value={ this.props.phrase } /> diff --git a/js/src/modals/CreateAccount/CreationType/creationType.js b/js/src/modals/CreateAccount/CreationType/creationType.js index ea7fca859cf..2ae6a035c91 100644 --- a/js/src/modals/CreateAccount/CreationType/creationType.js +++ b/js/src/modals/CreateAccount/CreationType/creationType.js @@ -15,22 +15,19 @@ export default class CreationType extends Component { render () { return ( - <div> - <div className={ styles.info }> - You can create an account either with a password or though an import from a pre-existing resource or export from another system - </div> + <div className={ styles.paddedtop }> <RadioButtonGroup defaultSelected='fromNew' name='creationType' onChange={ this.onChange }> <RadioButton - label='Create new account' + label='Create new account via username & password' value='fromNew' /> <RadioButton - label='Import account from JSON file' + label='Import account from a backup JSON file' value='fromJSON' /> <RadioButton - label='Import account from pre-sale wallet' + label='Import account from an Ethereum pre-sale wallet' value='fromPresale' /> </RadioButtonGroup> </div> diff --git a/js/src/modals/CreateAccount/NewAccount/newAccount.js b/js/src/modals/CreateAccount/NewAccount/newAccount.js index 90d9fbd6257..463feb16b36 100644 --- a/js/src/modals/CreateAccount/NewAccount/newAccount.js +++ b/js/src/modals/CreateAccount/NewAccount/newAccount.js @@ -45,9 +45,6 @@ export default class CreateAccount extends Component { render () { return ( <Form> - <div className={ styles.info }> - Provide a descriptive name for the account, a strong password and select your preferred identity icon to create the account - </div> <Input label='account name' hint='a descriptive name for the account' diff --git a/js/src/modals/CreateAccount/NewImport/newImport.js b/js/src/modals/CreateAccount/NewImport/newImport.js index ff5813ae465..5d84220aa7a 100644 --- a/js/src/modals/CreateAccount/NewImport/newImport.js +++ b/js/src/modals/CreateAccount/NewImport/newImport.js @@ -46,9 +46,6 @@ export default class NewImport extends Component { render () { return ( <Form> - <div className={ styles.info }> - Provide a descriptive name for the account, the password required to unlock the account and the on-disk location of the wallet to be imported. - </div> <Input label='account name' hint='a descriptive name for the account' diff --git a/js/src/modals/CreateAccount/style.css b/js/src/modals/CreateAccount/style.css index 72840c7c8dd..c3809765657 100644 --- a/js/src/modals/CreateAccount/style.css +++ b/js/src/modals/CreateAccount/style.css @@ -1,7 +1,6 @@ -.info { - padding-bottom: 1.618em; +.paddedtop { + padding: 1.618em 0 0 0; line-height: 1.618em; - width: 75%; } .password { diff --git a/js/src/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js index 20f60cc4221..1da386f810f 100644 --- a/js/src/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -55,9 +55,6 @@ export default class Details extends Component { render () { return ( <Form> - <div className={ styles.info }> - Complete the information for the transaction with a valid recipient and the amount to be transferred. Additional transaction information such as the gas, gasPrice and transaction data can be set via the extended information options. - </div> <div> <Input label='recipient address' diff --git a/js/src/modals/Transfer/Verify/verify.js b/js/src/modals/Transfer/Verify/verify.js index d208b3a7792..92ec69b6e00 100644 --- a/js/src/modals/Transfer/Verify/verify.js +++ b/js/src/modals/Transfer/Verify/verify.js @@ -29,14 +29,8 @@ export default class Verify extends Component { } render () { - const info = this.props.signer - ? 'Please verify the transaction information below, once it is posted you can authorise it via the Parity Signer Chrome extension' - : 'Please verify the transaction information below and confirm the transaction with your account password'; return ( <Form> - <div className={ styles.info }> - { info } - </div> <Input disabled label='account address' diff --git a/js/src/modals/Transfer/style.css b/js/src/modals/Transfer/style.css index cb97398c419..918d95ac2d4 100644 --- a/js/src/modals/Transfer/style.css +++ b/js/src/modals/Transfer/style.css @@ -1,5 +1,5 @@ .info { - padding-bottom: 1.618em; + padding: 1.618em 0; line-height: 1.618em; width: 75%; } diff --git a/js/src/ui/IdentityIcon/identityIcon.js b/js/src/ui/IdentityIcon/identityIcon.js index 8dd730d458e..ec1640329ea 100644 --- a/js/src/ui/IdentityIcon/identityIcon.js +++ b/js/src/ui/IdentityIcon/identityIcon.js @@ -6,7 +6,8 @@ import styles from './style.css'; export default class IdentityIcon extends Component { static propTypes = { address: PropTypes.string, - center: PropTypes.bool + center: PropTypes.bool, + padded: PropTypes.bool } state = { @@ -28,7 +29,7 @@ export default class IdentityIcon extends Component { } render () { - const className = `${styles.icon} ${this.props.center ? styles.center : styles.right}`; + const className = `${styles.icon} ${this.props.center ? styles.center : styles.right} ${this.props.padded ? styles.padded : null}`; return ( <div className={ className }> diff --git a/js/src/ui/IdentityIcon/style.css b/js/src/ui/IdentityIcon/style.css index 991a652e55f..4851182d642 100644 --- a/js/src/ui/IdentityIcon/style.css +++ b/js/src/ui/IdentityIcon/style.css @@ -8,9 +8,12 @@ .right { float: right; text-align: right; - margin: 0; } .icon img { border-radius: 50%; } + +.padded { + margin: 1em 0 0 0; +} From 665012d353d823aeef73e47459b0845acff46ec4 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 16:37:12 +0200 Subject: [PATCH 0086/1062] adjust padding --- js/src/ui/Modal/ModalSteps/style.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/ui/Modal/ModalSteps/style.css b/js/src/ui/Modal/ModalSteps/style.css index afcc3174307..63da2131dd2 100644 --- a/js/src/ui/Modal/ModalSteps/style.css +++ b/js/src/ui/Modal/ModalSteps/style.css @@ -1,5 +1,5 @@ .title { - padding: 1em; + padding: 1em 1em 0 1em; background: rgba(0, 0, 0, 0.175); } From db930c7c7013c623f06b162ab751b0a7efea2b64 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 16:42:36 +0200 Subject: [PATCH 0087/1062] support for tiny icons, as to be used in any lists --- js/src/ui/IdentityIcon/identityIcon.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/js/src/ui/IdentityIcon/identityIcon.js b/js/src/ui/IdentityIcon/identityIcon.js index ec1640329ea..a994731da24 100644 --- a/js/src/ui/IdentityIcon/identityIcon.js +++ b/js/src/ui/IdentityIcon/identityIcon.js @@ -7,7 +7,8 @@ export default class IdentityIcon extends Component { static propTypes = { address: PropTypes.string, center: PropTypes.bool, - padded: PropTypes.bool + padded: PropTypes.bool, + tiny: PropTypes.bool } state = { @@ -23,7 +24,7 @@ export default class IdentityIcon extends Component { iconsrc: blockies({ seed: address.toLowerCase(), size: 8, - scale: 7 + scale: this.props.tiny ? 3 : 7 }).toDataURL() }); } From dbd16a0eeecaaa19538962e757bf4e52f731fdd2 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 16:54:17 +0200 Subject: [PATCH 0088/1062] inline identity icon support --- js/src/ui/IdentityIcon/identityIcon.js | 6 +++--- js/src/ui/IdentityIcon/style.css | 5 +++++ js/src/views/Account/Transactions/transactions.js | 3 +++ js/src/views/Account/style.css | 5 +++++ 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/js/src/ui/IdentityIcon/identityIcon.js b/js/src/ui/IdentityIcon/identityIcon.js index a994731da24..6dc0c670338 100644 --- a/js/src/ui/IdentityIcon/identityIcon.js +++ b/js/src/ui/IdentityIcon/identityIcon.js @@ -8,7 +8,7 @@ export default class IdentityIcon extends Component { address: PropTypes.string, center: PropTypes.bool, padded: PropTypes.bool, - tiny: PropTypes.bool + inline: PropTypes.bool } state = { @@ -24,13 +24,13 @@ export default class IdentityIcon extends Component { iconsrc: blockies({ seed: address.toLowerCase(), size: 8, - scale: this.props.tiny ? 3 : 7 + scale: this.props.inline ? 2 : 7 }).toDataURL() }); } render () { - const className = `${styles.icon} ${this.props.center ? styles.center : styles.right} ${this.props.padded ? styles.padded : null}`; + const className = `${styles.icon} ${this.props.center ? styles.center : styles.right} ${this.props.padded ? styles.padded : null} ${this.props.inline ? styles.inline : null}`; return ( <div className={ className }> diff --git a/js/src/ui/IdentityIcon/style.css b/js/src/ui/IdentityIcon/style.css index 4851182d642..860fa418522 100644 --- a/js/src/ui/IdentityIcon/style.css +++ b/js/src/ui/IdentityIcon/style.css @@ -17,3 +17,8 @@ .padded { margin: 1em 0 0 0; } + +.inline { + display: inline; + margin-right: 0.75em; +} diff --git a/js/src/views/Account/Transactions/transactions.js b/js/src/views/Account/Transactions/transactions.js index 56343d11f1e..4bd35b76700 100644 --- a/js/src/views/Account/Transactions/transactions.js +++ b/js/src/views/Account/Transactions/transactions.js @@ -5,6 +5,7 @@ import moment from 'moment'; import Api from '../../../api'; import etherscan from '../../../3rdparty/etherscan'; import Container from '../../../ui/Container'; +import IdentityIcon from '../../../ui/IdentityIcon'; import styles from '../style.css'; @@ -68,9 +69,11 @@ export default class Transactions extends Component { <tr key={ tx.hash }> <td className={ styles.center }></td> <td className={ styles.center }> + <IdentityIcon inline center address={ tx.from } /> <a href={ fromLink } target='_blank'>{ formatHash(tx.from) }</a> </td> <td className={ styles.center }> + <IdentityIcon inline center address={ tx.to } /> <a href={ toLink } target='_blank'>{ formatHash(tx.to) }</a> </td> <td className={ styles.center }> diff --git a/js/src/views/Account/style.css b/js/src/views/Account/style.css index f77a132be43..3d8c25a063d 100644 --- a/js/src/views/Account/style.css +++ b/js/src/views/Account/style.css @@ -17,3 +17,8 @@ .transactions { width: 100%; } + +.transactions tr { + line-height: 24px; + vertical-align: middle; +} From ca02e4f84699e42216e283a3f5b8728ec6100d2c Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 17:17:14 +0200 Subject: [PATCH 0089/1062] s/settings/signer/ (how, where, when it opens TBD) --- js/src/app.js | 4 ++-- js/src/views/Application/TabBar/tabBar.js | 8 ++++---- js/src/views/Settings/index.js | 1 - js/src/views/Signer/index.js | 1 + js/src/views/{Settings/settings.js => Signer/signer.js} | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) delete mode 100644 js/src/views/Settings/index.js create mode 100644 js/src/views/Signer/index.js rename js/src/views/{Settings/settings.js => Signer/signer.js} (69%) diff --git a/js/src/app.js b/js/src/app.js index 9cc9fcaa8ad..d66767a0908 100644 --- a/js/src/app.js +++ b/js/src/app.js @@ -17,7 +17,7 @@ import Account from './views/Account'; import Application from './views/Application'; import Apps from './views/Apps'; import Tokens from './views/Tokens'; -import Settings from './views/Settings'; +import Signer from './views/Signer'; import styles from './reset.css'; @@ -31,7 +31,7 @@ ReactDOM.render( <Route path='account/:address' component={ Account } /> <Route path='apps' component={ Apps } /> <Route path='tokens' component={ Tokens } /> - <Route path='settings' component={ Settings } /> + <Route path='signer' component={ Signer } /> </Route> </Router>, document.querySelector('#container') diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index a0cb935a24a..deafff785f1 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -5,7 +5,7 @@ import { Tabs, Tab } from 'material-ui/Tabs'; import ActionAccountBalanceWallet from 'material-ui/svg-icons/action/account-balance-wallet'; import ActionDashboard from 'material-ui/svg-icons/action/dashboard'; -import ActionSettings from 'material-ui/svg-icons/action/settings'; +import ActionFingerprint from 'material-ui/svg-icons/action/fingerprint'; import NavigationApps from 'material-ui/svg-icons/navigation/apps'; import Tooltip from '../../../ui/Tooltip'; @@ -46,9 +46,9 @@ export default class TabBar extends Component { label='apps' onActive={ this.onActivate } /> <Tab - data-route='/settings' - icon={ <ActionSettings /> } - label='settings' + data-route='/signer' + icon={ <ActionFingerprint /> } + label='signer' onActive={ this.onActivate } /> </Tabs> </Toolbar> diff --git a/js/src/views/Settings/index.js b/js/src/views/Settings/index.js deleted file mode 100644 index e86e3d8238d..00000000000 --- a/js/src/views/Settings/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './settings'; diff --git a/js/src/views/Signer/index.js b/js/src/views/Signer/index.js new file mode 100644 index 00000000000..49bc364c43d --- /dev/null +++ b/js/src/views/Signer/index.js @@ -0,0 +1 @@ +export default from './signer'; diff --git a/js/src/views/Settings/settings.js b/js/src/views/Signer/signer.js similarity index 69% rename from js/src/views/Settings/settings.js rename to js/src/views/Signer/signer.js index c553c5b254f..6a5b92d3abc 100644 --- a/js/src/views/Settings/settings.js +++ b/js/src/views/Signer/signer.js @@ -6,7 +6,7 @@ export default class Settings extends Component { render () { return ( <Container> - <div>application settings such as full node overview, secure signer config, etc.</div> + <div>Signer...</div> </Container> ); } From f7b34bbb23b4386d390c9789353697635369b3c7 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 18:47:39 +0200 Subject: [PATCH 0090/1062] very basic address selector --- .../modals/AddressSelector/addressSelector.js | 123 ++++++++++++++++++ js/src/modals/AddressSelector/index.js | 1 + js/src/modals/AddressSelector/style.css | 40 ++++++ js/src/modals/Transfer/Details/details.js | 26 +++- 4 files changed, 186 insertions(+), 4 deletions(-) create mode 100644 js/src/modals/AddressSelector/addressSelector.js create mode 100644 js/src/modals/AddressSelector/index.js create mode 100644 js/src/modals/AddressSelector/style.css diff --git a/js/src/modals/AddressSelector/addressSelector.js b/js/src/modals/AddressSelector/addressSelector.js new file mode 100644 index 00000000000..9c687115e8b --- /dev/null +++ b/js/src/modals/AddressSelector/addressSelector.js @@ -0,0 +1,123 @@ +import React, { Component, PropTypes } from 'react'; +import { FlatButton } from 'material-ui'; +import ContentClear from 'material-ui/svg-icons/content/clear'; + +import IdentityIcon from '../../ui/IdentityIcon'; +import Modal from '../../ui/Modal'; + +import styles from './style.css'; + +export default class AddressSelector extends Component { + static contextTypes = { + api: React.PropTypes.object + } + + static propTypes = { + onSelect: PropTypes.func.isRequired, + visible: PropTypes.bool + } + + state = { + accounts: [], + contacts: [] + } + + componentDidMount () { + this.retrieveAccounts(); + } + + render () { + return ( + <Modal + scroll + actions={ this.renderDialogActions() } + visible={ this.props.visible }> + { this.renderAccounts('accounts') } + { this.renderAccounts('contacts') } + </Modal> + ); + } + + renderAccounts (type) { + const nothing = (<div className={ styles.nothing }>There are no addresses available</div>); + const list = this.state[type].map((acc) => { + return ( + <div + key={ acc.address } + className={ styles.account }> + <IdentityIcon + center inline + address={ acc.address } /> + <div> + <div + className={ styles.name } + data-address={ acc.address } + onTouchTap={ this.onSelect }> + { acc.name } + </div> + <div className={ styles.address }> + { acc.address } + </div> + </div> + </div> + ); + }); + + return ( + <div> + <div className={ styles.header }> + <h3>{ type }</h3> + </div> + <div className={ styles.body }> + { list.length ? list : nothing } + </div> + </div> + ); + } + + renderDialogActions () { + return ( + <FlatButton + icon={ <ContentClear /> } + label='Cancel' + primary + onTouchTap={ this.onClose } /> + ); + } + + onSelect = (event) => { + const address = event.target.getAttribute('data-address'); + + if (address) { + this.props.onSelect(address); + } + } + + onClose = () => { + this.props.onSelect(null); + } + + retrieveAccounts () { + const api = this.context.api; + + api.personal + .accountsInfo() + .then((infos) => { + const all = Object.keys(infos).map((address) => { + const info = infos[address]; + + return { + address: address, + name: info.name, + uuid: info.uuid, + meta: info.meta + }; + }); + + this.setState({ + accounts: all.filter((acc) => acc.uuid), + contacts: all.filter((acc) => !acc.uuid) + }); + }); + } +} diff --git a/js/src/modals/AddressSelector/index.js b/js/src/modals/AddressSelector/index.js new file mode 100644 index 00000000000..c33a8bd548c --- /dev/null +++ b/js/src/modals/AddressSelector/index.js @@ -0,0 +1 @@ +export default from './addressSelector'; diff --git a/js/src/modals/AddressSelector/style.css b/js/src/modals/AddressSelector/style.css new file mode 100644 index 00000000000..e228e3c650b --- /dev/null +++ b/js/src/modals/AddressSelector/style.css @@ -0,0 +1,40 @@ +.header { + margin: -24px -24px 0 -24px; + padding: 1em; + background: rgba(0, 0, 0, 0.175); +} + +.header h3 { + margin: 0; + text-transform: uppercase; + font-weight: 100; +} + +.body { + padding: 1em 1em 2.618em 1em; +} + +.nothing { + opacity: 0.6; +} + +.name { + color: rgb(0, 151, 167); + text-transform: uppercase; + cursor: pointer; +} + +.account { + white-space: nowrap; + padding-bottom: 0.5em; + display: table; +} + +.account>div { + display: table-cell; + padding-right: 1em; +} + +.address { + color: #aaa; +} diff --git a/js/src/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js index 1da386f810f..8b9c701c572 100644 --- a/js/src/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -5,6 +5,7 @@ import { Checkbox, FloatingActionButton } from 'material-ui'; import CommunicationContacts from 'material-ui/svg-icons/communication/contacts'; import Api from '../../../api'; +import AddressSelector from '../../AddressSelector'; import Form, { Input } from '../../../ui/Form'; import styles from '../style.css'; @@ -45,7 +46,8 @@ export default class Details extends Component { gasError: null, total: 0, totalError: null, - gasprice: 0 + gasprice: 0, + showAddresses: false } componentDidMount () { @@ -55,6 +57,9 @@ export default class Details extends Component { render () { return ( <Form> + <AddressSelector + onSelect={ this.onSelectRecipient } + visible={ this.state.showAddresses } /> <div> <Input label='recipient address' @@ -116,6 +121,14 @@ export default class Details extends Component { ); } + onSelectRecipient = (recipient) => { + this.setState({ + showAddresses: false + }, () => { + this.validateRecipient(recipient); + }); + } + onCheckFullAmount = (event) => { let amount = this.state.amount; @@ -178,9 +191,8 @@ export default class Details extends Component { }, this.calculateTotals); } - onEditRecipient = (event) => { + validateRecipient (value) { let error = null; - const value = event.target.value; if (!value || !value.length) { error = ERRORS.requireRecipient; @@ -194,8 +206,14 @@ export default class Details extends Component { }, this.calculateTotals); } - onContacts = () => { + onEditRecipient = (event) => { + this.validateRecipient(event.target.value); + } + onContacts = () => { + this.setState({ + showAddresses: true + }); } updateParent = () => { From 55db7db9964a9a85e4ac97e2440e9c73267bf066 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 21:10:22 +0200 Subject: [PATCH 0091/1062] slightly larger inline Identityicon size, better visibility --- js/src/ui/IdentityIcon/identityIcon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/ui/IdentityIcon/identityIcon.js b/js/src/ui/IdentityIcon/identityIcon.js index 6dc0c670338..198a8751dc5 100644 --- a/js/src/ui/IdentityIcon/identityIcon.js +++ b/js/src/ui/IdentityIcon/identityIcon.js @@ -24,7 +24,7 @@ export default class IdentityIcon extends Component { iconsrc: blockies({ seed: address.toLowerCase(), size: 8, - scale: this.props.inline ? 2 : 7 + scale: this.props.inline ? 3 : 7 }).toDataURL() }); } From ec07183eee8f6b555e5bc4b75d205ed31e8e065c Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 16 Aug 2016 21:20:44 +0200 Subject: [PATCH 0092/1062] align name/address with icon in the selector --- js/src/modals/AddressSelector/style.css | 1 + 1 file changed, 1 insertion(+) diff --git a/js/src/modals/AddressSelector/style.css b/js/src/modals/AddressSelector/style.css index e228e3c650b..62091df1f82 100644 --- a/js/src/modals/AddressSelector/style.css +++ b/js/src/modals/AddressSelector/style.css @@ -33,6 +33,7 @@ .account>div { display: table-cell; padding-right: 1em; + vertical-align: top; } .address { From b391b1318085d8de0b454b40426bcfa32c3c685d Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 17 Aug 2016 08:17:44 +0200 Subject: [PATCH 0093/1062] allow override of tooltip positions --- js/src/ui/Tooltip/style.css | 2 +- js/src/ui/Tooltip/tooltip.js | 16 ++++++++++++++-- js/src/views/Accounts/Actions/actions.js | 1 + js/src/views/Accounts/accounts.js | 1 + js/src/views/Application/TabBar/tabBar.js | 1 + 5 files changed, 18 insertions(+), 3 deletions(-) diff --git a/js/src/ui/Tooltip/style.css b/js/src/ui/Tooltip/style.css index f3168211a71..dd08d6b3347 100644 --- a/js/src/ui/Tooltip/style.css +++ b/js/src/ui/Tooltip/style.css @@ -14,7 +14,7 @@ border: 4px solid #f80; /* #c2e1f5; */ max-width: 450px; top: 70%; - left: 11%; + left: 5%; border-radius: 0.5em; z-index: 500; opacity: 1; diff --git a/js/src/ui/Tooltip/tooltip.js b/js/src/ui/Tooltip/tooltip.js index 00c5c3373e2..8c91b6431cf 100644 --- a/js/src/ui/Tooltip/tooltip.js +++ b/js/src/ui/Tooltip/tooltip.js @@ -14,7 +14,9 @@ export default class Tooltip extends Component { static propTypes = { title: PropTypes.string, - text: PropTypes.string + text: PropTypes.string, + top: PropTypes.string, + left: PropTypes.string } state = { @@ -53,8 +55,18 @@ export default class Tooltip extends Component { onTouchTap={ this.onClose } /> ); + const inlineStyles = {}; + if (this.props.top) { + inlineStyles.top = this.props.top; + } + if (this.props.left) { + inlineStyles.left = this.props.left; + } + return ( - <div className={ styles.box }> + <div + style={ inlineStyles } + className={ styles.box }> <div className={ styles.title }> { this.props.title } </div> diff --git a/js/src/views/Accounts/Actions/actions.js b/js/src/views/Accounts/Actions/actions.js index 64bf1c817b0..0f2da3b7b59 100644 --- a/js/src/views/Accounts/Actions/actions.js +++ b/js/src/views/Accounts/Actions/actions.js @@ -25,6 +25,7 @@ export default class Actions extends Component { onTouchTap={ this.props.onNewAccount } /> </ToolbarGroup> <Tooltip + left='5%' top='85%' text='actions relating to the current view are available on the toolbar for quick access, be it for performing actions or creating a new item' /> </Toolbar> ); diff --git a/js/src/views/Accounts/accounts.js b/js/src/views/Accounts/accounts.js index 3dd70e8ba42..d501c37ca8a 100644 --- a/js/src/views/Accounts/accounts.js +++ b/js/src/views/Accounts/accounts.js @@ -50,6 +50,7 @@ export default class Accounts extends Component { const firstTooltip = ( <Tooltip + top='80%' text='your accounts are visible for easy access, allowing you to edit the meta information, make transfers, view transactions and fund the account' /> ); diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index deafff785f1..235ef380286 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -33,6 +33,7 @@ export default class TabBar extends Component { label='accounts' onActive={ this.onActivate }> <Tooltip + left='6%' top='65%' text='navigate between the different parts and views of the application, switching between an account view, token view and distributed application view' /> </Tab> <Tab From 6a19b92bc09b1e30d70dd184dfdb1eac7aa319b9 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 17 Aug 2016 08:28:32 +0200 Subject: [PATCH 0094/1062] share titles between different types --- js/src/modals/CreateAccount/createAccount.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/js/src/modals/CreateAccount/createAccount.js b/js/src/modals/CreateAccount/createAccount.js index e3443e016dd..7b017812f74 100644 --- a/js/src/modals/CreateAccount/createAccount.js +++ b/js/src/modals/CreateAccount/createAccount.js @@ -14,8 +14,14 @@ import CreationType from './CreationType'; import NewAccount from './NewAccount'; import NewImport from './NewImport'; -const STAGE_NAMES = ['creation type', 'create account', 'account information']; -const STAGE_IMPORT = ['creation type', 'import wallet', 'account information']; +const TITLES = { + type: 'creation type', + create: 'create account', + info: 'account information', + import: 'import wallet' +}; +const STAGE_NAMES = [TITLES.type, TITLES.create, TITLES.info]; +const STAGE_IMPORT = [TITLES.type, TITLES.import, TITLES.info]; export default class CreateAccount extends Component { static contextTypes = { From 75267d9e57767bd7dc26ef8073e115ab0bc791ca Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 17 Aug 2016 13:13:48 +0200 Subject: [PATCH 0095/1062] send via signer... need to think through the UX flow here --- js/src/modals/Transfer/Complete/complete.js | 7 +- js/src/modals/Transfer/Details/details.js | 203 ++---------- js/src/modals/Transfer/Extras/extras.js | 75 +++++ js/src/modals/Transfer/Extras/index.js | 1 + js/src/modals/Transfer/Verify/index.js | 1 - js/src/modals/Transfer/Verify/verify.js | 96 ------ js/src/modals/Transfer/errors.js | 8 + js/src/modals/Transfer/style.css | 2 +- js/src/modals/Transfer/transfer.js | 331 +++++++++++++++----- 9 files changed, 379 insertions(+), 345 deletions(-) create mode 100644 js/src/modals/Transfer/Extras/extras.js create mode 100644 js/src/modals/Transfer/Extras/index.js delete mode 100644 js/src/modals/Transfer/Verify/index.js delete mode 100644 js/src/modals/Transfer/Verify/verify.js create mode 100644 js/src/modals/Transfer/errors.js diff --git a/js/src/modals/Transfer/Complete/complete.js b/js/src/modals/Transfer/Complete/complete.js index c228e3c931d..02b3b4730ad 100644 --- a/js/src/modals/Transfer/Complete/complete.js +++ b/js/src/modals/Transfer/Complete/complete.js @@ -22,15 +22,10 @@ export default class Complete extends Component { ); } - const txlink = `https://etherscan.io/tx/${this.props.txhash}`; - return ( <div> <div className={ styles.info }> - The transaction was send with a transaction hash (useful for tracking on a block explorer) of - </div> - <div> - <a href={ txlink } target='_blank'>{ this.props.txhash }</a> + The transaction was sent and awaits verification in the signer. <a href='http://127.0.0.1:8180' target='_blank'>Enter the signer</a> and authenticate the correct transactions with your account password. </div> </div> ); diff --git a/js/src/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js index 8b9c701c572..aebfd17e042 100644 --- a/js/src/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -1,59 +1,40 @@ import React, { Component, PropTypes } from 'react'; -import BigNumber from 'bignumber.js'; import { Checkbox, FloatingActionButton } from 'material-ui'; import CommunicationContacts from 'material-ui/svg-icons/communication/contacts'; -import Api from '../../../api'; import AddressSelector from '../../AddressSelector'; import Form, { Input } from '../../../ui/Form'; import styles from '../style.css'; -const DEFAULT_GAS = '21000'; - const CHECK_STYLE = { position: 'absolute', bottom: '8px', left: '1em' }; -const ERRORS = { - requireRecipient: 'a recipient network address is required for the transaction', - invalidAddress: 'the supplied address is an invalid network address', - invalidAmount: 'the supplied amount should be a valid positive number', - largeAmount: 'the transaction total is higher than the available balance' -}; - export default class Details extends Component { static contextTypes = { api: PropTypes.object.isRequired } static propTypes = { - address: PropTypes.string.isRequired, - balance: PropTypes.object, + all: PropTypes.bool, + extras: PropTypes.bool, + recipient: PropTypes.string, + recipientError: PropTypes.string, + total: PropTypes.string, + totalError: PropTypes.string, + value: PropTypes.string, + valueError: PropTypes.string, onChange: PropTypes.func.isRequired } state = { - recipient: '', - recipientError: ERRORS.requireRecipient, - amount: 0, - accountError: null, - amountFull: false, - gas: DEFAULT_GAS, - gasError: null, - total: 0, - totalError: null, - gasprice: 0, showAddresses: false } - componentDidMount () { - this.getDefaults(); - } - render () { return ( <Form> @@ -64,8 +45,8 @@ export default class Details extends Component { <Input label='recipient address' hint='the recipient address' - error={ this.state.recipientError } - value={ this.state.recipient } + error={ this.props.recipientError } + value={ this.props.recipient } onChange={ this.onEditRecipient } /> <div className={ styles.floatbutton }> <FloatingActionButton @@ -78,17 +59,17 @@ export default class Details extends Component { <div className={ styles.columns }> <div> <Input - disabled={ this.state.amountFull } + disabled={ this.props.all } label='amount to transfer (in ΞTH)' hint='the amount to transfer to the recipient' - value={ this.state.amount } - onChange={ this.onEditAmount } /> + value={ this.props.value } + onChange={ this.onEditValue } /> </div> <div> <Checkbox - checked={ this.state.amountFull } + checked={ this.props.all } label='full account balance' - onCheck={ this.onCheckFullAmount } + onCheck={ this.onCheckAll } style={ CHECK_STYLE } /> </div> </div> @@ -98,116 +79,40 @@ export default class Details extends Component { disabled label='total amount' hint='the total amount of the transaction' - error={ this.state.totalError } - value={ `${Api.format.fromWei(this.state.total).toFormat()} ΞTH` } /> + error={ this.props.totalError } + value={ `${this.props.total} ΞTH` } /> + </div> + <div> + <Checkbox + checked={ this.props.extras } + label='advanced sending options' + onCheck={ this.onCheckExtras } + style={ CHECK_STYLE } /> </div> </div> </Form> ); } - renderExtended () { - return ( - <div className={ styles.columns }> - <div> - <Input - label='gas amount' - hint='the amount of gas to use for the transaction' - error={ this.state.gasError } - value={ this.state.gas } - onChange={ this.onEditGas } /> - </div> - </div> - ); - } - onSelectRecipient = (recipient) => { - this.setState({ - showAddresses: false - }, () => { - this.validateRecipient(recipient); - }); - } - - onCheckFullAmount = (event) => { - let amount = this.state.amount; - - if (!this.state.amountFull) { - const gas = new BigNumber(this.state.gasprice).mul(new BigNumber(this.state.gas || 0)); - const balance = new BigNumber(this.props.balance ? this.props.balance.value : 0); - - amount = Api.format.fromWei(balance.minus(gas)); - - if (amount.lt(0)) { - amount = new BigNumber(0); - } - } - - this.setState({ - amount: amount.toString(), - amountFull: !this.state.amountFull - }, this.calculateTotals); + this.setState({ showAddresses: false }); + this.props.onChange('recipient', recipient); } - onEditAmount = (event) => { - let value = event.target.value; - let error = null; - let num = null; - - try { - num = new BigNumber(value); - } catch (e) { - num = null; - } - - if (!num || num.lt(0)) { - error = ERRORS.invalidAmount; - } - - this.setState({ - amount: value, - amountError: error - }, this.calculateTotals); + onEditRecipient = (event) => { + this.onSelectRecipient(event.target.value); } - onEditGas = (event) => { - let value = event.target.value; - let error = null; - let num = null; - - try { - num = new BigNumber(value); - } catch (e) { - num = null; - } - - if (!num || num.lt(0)) { - error = ERRORS.invalidAmount; - } - - this.setState({ - gas: value, - gasError: error - }, this.calculateTotals); + onEditValue = (event) => { + this.props.onChange('value', event.target.value); } - validateRecipient (value) { - let error = null; - - if (!value || !value.length) { - error = ERRORS.requireRecipient; - } else if (!Api.format.isAddressValid(value)) { - error = ERRORS.invalidAddress; - } - - this.setState({ - recipient: value, - recipientError: error - }, this.calculateTotals); + onCheckAll = () => { + this.props.onChange('all', !this.props.all); } - onEditRecipient = (event) => { - this.validateRecipient(event.target.value); + onCheckExtras = () => { + this.props.onChange('extras', !this.props.extras); } onContacts = () => { @@ -215,44 +120,4 @@ export default class Details extends Component { showAddresses: true }); } - - updateParent = () => { - const isValid = !this.state.recipientError && !this.state.amountError && !this.state.gasError; - - this.props.onChange(isValid, { - amount: Api.format.toWei(this.state.amount).toString(), - gas: this.state.gas, - recipient: this.state.recipient, - total: this.state.total - }); - } - - calculateTotals = () => { - const gas = new BigNumber(this.state.gasprice).mul(new BigNumber(this.state.gas || 0)); - const amount = Api.format.toWei(this.state.amount || 0); - const total = amount.plus(gas); - const balance = new BigNumber(this.props.balance ? this.props.balance.value : 0); - let error = null; - - if (total.gt(balance)) { - error = ERRORS.largeAmount; - } - - this.setState({ - total: total.toString(), - totalError: error - }, this.updateParent); - } - - getDefaults = () => { - const api = this.context.api; - - api.eth - .gasPrice() - .then((gasprice) => { - this.setState({ - gasprice: gasprice.toString() - }, this.calculateTotals); - }); - } } diff --git a/js/src/modals/Transfer/Extras/extras.js b/js/src/modals/Transfer/Extras/extras.js new file mode 100644 index 00000000000..b65c8888599 --- /dev/null +++ b/js/src/modals/Transfer/Extras/extras.js @@ -0,0 +1,75 @@ +import React, { Component, PropTypes } from 'react'; + +import Form, { Input } from '../../../ui/Form'; + +import styles from '../style.css'; + +export default class Extras extends Component { + static propTypes = { + extraData: PropTypes.string, + extraDataError: PropTypes.string, + gas: PropTypes.string, + gasError: PropTypes.string, + gasPrice: PropTypes.string, + gasPriceError: PropTypes.string, + total: PropTypes.string, + totalError: PropTypes.string, + onChange: PropTypes.func.isRequired + } + + render () { + return ( + <Form> + <div> + <Input + hint='the extraData to pass through with the transaction' + label='transaction extraData' + multiLine + rows={ 1 } + value={ this.props.extraData } + onChange={ this.onEditExtraData } /> + </div> + <div className={ styles.columns }> + <div> + <Input + label='gas amount' + hint='the amount of gas to use for the transaction' + error={ this.props.gasError } + value={ this.props.gas } + onChange={ this.onEditGas } /> + </div> + <div> + <Input + label='gas price' + hint='the price of gas to use for the transaction' + error={ this.props.gasPriceError } + value={ this.props.gasPrice } + onChange={ this.onEditGasPrice } /> + </div> + </div> + <div className={ styles.columns }> + <div> + <Input + disabled + label='total amount' + hint='the total amount of the transaction' + error={ this.props.totalError } + value={ `${this.props.total} ΞTH` } /> + </div> + </div> + </Form> + ); + } + + onEditGas = (event) => { + this.props.onChange('gas', event.target.value); + } + + onEditGasPrice = (event) => { + this.props.onChange('gasPrice', event.target.value); + } + + onEditExtraData = (event) => { + this.props.onChange('extraData', event.target.value); + } +} diff --git a/js/src/modals/Transfer/Extras/index.js b/js/src/modals/Transfer/Extras/index.js new file mode 100644 index 00000000000..5dd7147930f --- /dev/null +++ b/js/src/modals/Transfer/Extras/index.js @@ -0,0 +1 @@ +export default from './extras'; diff --git a/js/src/modals/Transfer/Verify/index.js b/js/src/modals/Transfer/Verify/index.js deleted file mode 100644 index 99330a588eb..00000000000 --- a/js/src/modals/Transfer/Verify/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './verify.js'; diff --git a/js/src/modals/Transfer/Verify/verify.js b/js/src/modals/Transfer/Verify/verify.js deleted file mode 100644 index 92ec69b6e00..00000000000 --- a/js/src/modals/Transfer/Verify/verify.js +++ /dev/null @@ -1,96 +0,0 @@ -import React, { Component, PropTypes } from 'react'; - -import Api from '../../../api'; -import Form, { Input } from '../../../ui/Form'; - -import styles from '../style.css'; - -const ERRORS = { - noPassword: 'supply a valid password to confirm the transaction' -}; - -export default class Verify extends Component { - static propTypes = { - address: PropTypes.string, - recipient: PropTypes.string, - signer: PropTypes.bool, - amount: PropTypes.string, - total: PropTypes.string, - onChange: PropTypes.func.isRequired - } - - state = { - password: '', - passwordError: ERRORS.noPassword - } - - componentDidMount () { - this.updateParent(); - } - - render () { - return ( - <Form> - <Input - disabled - label='account address' - hint='the account address' - value={ this.props.address } /> - <Input - disabled - label='recipient address' - hint='the recipient address' - value={ this.props.recipient } /> - <div className={ styles.columns }> - <div> - <Input - disabled - label='amount to transfer' - hint='the amount to transfer to the recipient' - value={ `${Api.format.fromWei(this.props.amount).toFormat()} ΞTH` } /> - </div> - <div> - <Input - disabled - label='total transaction amount' - hint='the amount used by this transaction' - value={ `${Api.format.fromWei(this.props.total).toFormat()} ΞTH` } /> - </div> - </div> - <div className={ styles.columns }> - <div> - <Input - error={ this.state.passwordError } - label='password' - hint='password for the origin account' - value={ this.state.password } - onChange={ this.onEditPassword } - type='password' /> - </div> - </div> - </Form> - ); - } - - updateParent = () => { - const isValid = !this.state.passwordError; - - this.props.onChange(isValid, { - password: this.state.password - }); - } - - onEditPassword = (event) => { - let error = null; - const value = event.target.value; - - if (!value || !value.length) { - error = ERRORS.noPassword; - } - - this.setState({ - password: value, - passwordError: error - }, this.updateParent); - } -} diff --git a/js/src/modals/Transfer/errors.js b/js/src/modals/Transfer/errors.js new file mode 100644 index 00000000000..000aebe9f5b --- /dev/null +++ b/js/src/modals/Transfer/errors.js @@ -0,0 +1,8 @@ +const ERRORS = { + requireRecipient: 'a recipient network address is required for the transaction', + invalidAddress: 'the supplied address is an invalid network address', + invalidAmount: 'the supplied amount should be a valid positive number', + largeAmount: 'the transaction total is higher than the available balance' +}; + +export default ERRORS; diff --git a/js/src/modals/Transfer/style.css b/js/src/modals/Transfer/style.css index 918d95ac2d4..feb8b9a6826 100644 --- a/js/src/modals/Transfer/style.css +++ b/js/src/modals/Transfer/style.css @@ -1,7 +1,7 @@ .info { padding: 1.618em 0; line-height: 1.618em; - width: 75%; + width: 100%; } .columns { diff --git a/js/src/modals/Transfer/transfer.js b/js/src/modals/Transfer/transfer.js index 4994b053def..44dca778bab 100644 --- a/js/src/modals/Transfer/transfer.js +++ b/js/src/modals/Transfer/transfer.js @@ -1,3 +1,4 @@ +import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; import { FlatButton } from 'material-ui'; import ActionDoneAll from 'material-ui/svg-icons/action/done-all'; @@ -6,13 +7,23 @@ import ContentSend from 'material-ui/svg-icons/content/send'; import NavigationArrowBack from 'material-ui/svg-icons/navigation/arrow-back'; import NavigationArrowForward from 'material-ui/svg-icons/navigation/arrow-forward'; +import Api from '../../api'; import Modal from '../../ui/Modal'; import Complete from './Complete'; import Details from './Details'; -import Verify from './Verify'; +import Extras from './Extras'; +import ERRORS from './errors'; -const STAGE_NAMES = ['transfer', 'verify transaction', 'transaction receipt']; +const DEFAULT_GAS = '21000'; +const DEFAULT_GASPRICE = '20000000000'; +const TITLES = { + transfer: 'transfer details', + complete: 'complete', + extras: 'extra information' +}; +const STAGES_BASIC = [TITLES.transfer, TITLES.complete]; +const STAGES_EXTRA = [TITLES.transfer, TITLES.extras, TITLES.complete]; export default class Transfer extends Component { static contextTypes = { @@ -28,13 +39,25 @@ export default class Transfer extends Component { state = { stage: 0, - amount: 0, - gas: 0, - password: null, - recipient: null, - total: 0, - isValid: false, - sending: false + extraData: '', + extraDataError: null, + extras: false, + gas: DEFAULT_GAS, + gasError: null, + gasPrice: DEFAULT_GASPRICE, + gasPriceError: null, + recipient: '', + recipientError: ERRORS.requireRecipient, + sending: false, + total: '0.0', + totalError: null, + value: '0.0', + valueAll: false, + valueError: null + } + + componentDidMount () { + this.getDefaults(); } render () { @@ -42,7 +65,7 @@ export default class Transfer extends Component { <Modal actions={ this.renderDialogActions() } current={ this.state.stage } - steps={ STAGE_NAMES } + steps={ this.state.extras ? STAGES_EXTRA : STAGES_BASIC } visible={ this.props.visible }> { this.renderPage() } </Modal> @@ -54,20 +77,32 @@ export default class Transfer extends Component { case 0: return ( <Details - address={ this.props.address } - balance={ this.props.balance } - onChange={ this.onChangeDetails } /> - ); - case 1: - return ( - <Verify - address={ this.props.address } - amount={ this.state.amount } - total={ this.state.total } + all={ this.state.valueAll } + extras={ this.state.extras } recipient={ this.state.recipient } - onChange={ this.onChangePassword } /> + recipientError={ this.state.recipientError } + total={ this.state.total } + totalError={ this.state.totalError } + value={ this.state.value } + valueError={ this.state.valueError } + onChange={ this.onUpdateDetails } /> ); - case 2: + + default: + if (this.state.stage === 1 && this.state.extras) { + return ( + <Extras + extraData={ this.state.extraData } + gas={ this.state.gas } + gasError={ this.state.gasError } + gasPrice={ this.state.gasPrice } + gasPriceError={ this.state.gasPriceError } + total={ this.state.total } + totalError={ this.state.totalError } + onChange={ this.onUpdateDetails } /> + ); + } + return ( <Complete sending={ this.state.sending } @@ -77,48 +112,67 @@ export default class Transfer extends Component { } renderDialogActions () { + const cancelBtn = ( + <FlatButton + icon={ <ContentClear /> } + label='Cancel' primary + onTouchTap={ this.onClose } /> + ); + const nextBtn = ( + <FlatButton + disabled={ !this.isValid() } + icon={ <NavigationArrowForward /> } + label='Next' primary + onTouchTap={ this.onNext } /> + ); + const prevBtn = ( + <FlatButton + icon={ <NavigationArrowBack /> } + label='Back' primary + onTouchTap={ this.onPrev } /> + ); + const sendBtn = ( + <FlatButton + disabled={ !this.isValid() || this.state.sending } + icon={ <ContentSend /> } + label='Send' primary + onTouchTap={ this.onSend } /> + ); + const doneBtn = ( + <FlatButton + icon={ <ActionDoneAll /> } + label='Close' primary + onTouchTap={ this.onClose } /> + ); + switch (this.state.stage) { case 0: - return [ - <FlatButton - icon={ <ContentClear /> } - label='Cancel' - primary - onTouchTap={ this.onClose } />, - <FlatButton - disabled={ !this.state.isValid } - icon={ <NavigationArrowForward /> } - label='Next' - primary - onTouchTap={ this.onNext } /> - ]; + return this.state.extras + ? [cancelBtn, nextBtn] + : [cancelBtn, sendBtn]; case 1: - return [ - <FlatButton - icon={ <ContentClear /> } - label='Cancel' - primary - onTouchTap={ this.onClose } />, - <FlatButton - icon={ <NavigationArrowBack /> } - label='Back' - primary - onTouchTap={ this.onPrev } />, - <FlatButton - disabled={ !this.state.isValid || this.state.sending } - icon={ <ContentSend /> } - label='Send' - primary - onTouchTap={ this.onSend } /> - ]; + return this.state.extras + ? [cancelBtn, prevBtn, sendBtn] + : [doneBtn]; + default: + return [doneBtn]; + } + } + + isValid () { + const detailsValid = !this.state.recipientError && !this.state.valueError && !this.state.totalError; + const extrasValid = !this.state.gasError && !this.state.gasPriceError && !this.state.totalError; + const verifyValid = !this.state.passwordError; + + switch (this.state.stage) { + case 0: + return detailsValid; + + case 1: + return this.state.extras ? extrasValid : verifyValid; + case 2: - return ( - <FlatButton - icon={ <ActionDoneAll /> } - label='Close' - primary - onTouchTap={ this.onClose } /> - ); + return verifyValid; } } @@ -134,6 +188,104 @@ export default class Transfer extends Component { }); } + _onUpdateAll (valueAll) { + this.setState({ + valueAll + }, this.recalculate); + } + + _onUpdateExtras (extras) { + this.setState({ + extras + }); + } + + _onUpdateExtraData (extraData) { + this.setState({ + extraData + }); + } + + validatePositiveNumber (num) { + try { + const v = new BigNumber(num); + if (v.lt(0)) { + return ERRORS.invalidAmount; + } + } catch (e) { + return ERRORS.invalidAmount; + } + + return null; + } + + _onUpdateGas (gas) { + const gasError = this.validatePositiveNumber(gas); + + this.setState({ + gas, + gasError + }, this.recalculate); + } + + _onUpdateGasPrice (gasPrice) { + const gasPriceError = this.validatePositiveNumber(gasPrice); + + this.setState({ + gasPrice, + gasPriceError + }, this.recalculate); + } + + _onUpdateRecipient (recipient) { + let recipientError = null; + + if (!recipient || !recipient.length) { + recipientError = ERRORS.requireRecipient; + } else if (!Api.format.isAddressValid(recipient)) { + recipientError = ERRORS.invalidAddress; + } + + this.setState({ + recipient, + recipientError + }); + } + + _onUpdateValue (value) { + const valueError = this.validatePositiveNumber(value); + + this.setState({ + value, + valueError + }, this.recalculate); + } + + onUpdateDetails = (type, value) => { + switch (type) { + case 'all': + return this._onUpdateAll(value); + + case 'extras': + return this._onUpdateExtras(value); + + case 'extraData': + return this._onUpdateExtraData(value); + + case 'gas': + return this._onUpdateGas(value); + + case 'gasPrice': + return this._onUpdateGasPrice(value); + + case 'recipient': + return this._onUpdateRecipient(value); + + case 'value': + return this._onUpdateValue(value); + } + } + onSend = () => { this.onNext(); @@ -141,13 +293,14 @@ export default class Transfer extends Component { sending: true }); - this.context.api.personal - .signAndSendTransaction({ + this.context.api.eth + .sendTransaction({ from: this.props.address, to: this.state.recipient, gas: this.state.gas, - value: this.state.amount - }, this.state.password) + gasPrice: this.state.gasPrice, + value: Api.format.toWei(this.state.value) + }) .then((txhash) => { console.log('transaction', txhash); this.setState({ @@ -160,20 +313,18 @@ export default class Transfer extends Component { }); } - onChangeDetails = (valid, { amount, gas, recipient, total }) => { + onChangeDetails = (valid, { value, recipient, total, extras }) => { this.setState({ - amount: amount, - gas: gas, - recipient: recipient, - total: total, - isValid: valid + value, + extras, + recipient, + total }); } onChangePassword = (valid, { password }) => { this.setState({ - password: password, - isValid: valid + password }); } @@ -184,4 +335,40 @@ export default class Transfer extends Component { this.props.onClose && this.props.onClose(); }); } + + recalculate = () => { + let value = this.state.value; + const gas = new BigNumber(this.state.gasPrice || 0).mul(new BigNumber(this.state.gas || 0)); + const balance = new BigNumber(this.props.balance.value || 0); + + if (this.state.valueAll) { + value = Api.format.fromWei(balance.minus(gas)).toString(); + } + + const amount = Api.format.toWei(value || 0); + const total = amount.plus(gas); + let totalError = null; + + if (total.gt(balance)) { + totalError = ERRORS.largeAmount; + } + + this.setState({ + total: Api.format.fromWei(total).toString(), + totalError, + value + }); + } + + getDefaults = () => { + const api = this.context.api; + + api.eth + .gasPrice() + .then((gasprice) => { + this.setState({ + gasprice: gasprice.toString() + }, this.recalculate); + }); + } } From 0f024437f9799d80994baba8b0fc17423c5f9e2a Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 17 Aug 2016 13:27:05 +0200 Subject: [PATCH 0096/1062] fix negative number calculation for full wallet transfer --- js/src/modals/Transfer/Details/details.js | 2 +- js/src/modals/Transfer/transfer.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/js/src/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js index aebfd17e042..51c59872d9c 100644 --- a/js/src/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -10,7 +10,7 @@ import styles from '../style.css'; const CHECK_STYLE = { position: 'absolute', - bottom: '8px', + top: '38px', left: '1em' }; diff --git a/js/src/modals/Transfer/transfer.js b/js/src/modals/Transfer/transfer.js index 44dca778bab..18ba8fa06e2 100644 --- a/js/src/modals/Transfer/transfer.js +++ b/js/src/modals/Transfer/transfer.js @@ -342,7 +342,8 @@ export default class Transfer extends Component { const balance = new BigNumber(this.props.balance.value || 0); if (this.state.valueAll) { - value = Api.format.fromWei(balance.minus(gas)).toString(); + const bn = Api.format.fromWei(balance.minus(gas)); + value = bn.lt(0) ? '0.0' : bn.toString(); } const amount = Api.format.toWei(value || 0); From 4246327ef2ada8a9c5c264fe84db02a569787dca Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 17 Aug 2016 13:43:46 +0200 Subject: [PATCH 0097/1062] info when no transactions are available as well as loading bar --- .../Account/Transactions/transactions.js | 49 ++++++++++++------- js/src/views/Account/style.css | 4 ++ 2 files changed, 35 insertions(+), 18 deletions(-) diff --git a/js/src/views/Account/Transactions/transactions.js b/js/src/views/Account/Transactions/transactions.js index 4bd35b76700..685d6bb788e 100644 --- a/js/src/views/Account/Transactions/transactions.js +++ b/js/src/views/Account/Transactions/transactions.js @@ -1,6 +1,7 @@ import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; import moment from 'moment'; +import LinearProgress from 'material-ui/LinearProgress'; import Api from '../../../api'; import etherscan from '../../../3rdparty/etherscan'; @@ -41,7 +42,8 @@ export default class Transactions extends Component { } state = { - transactions: [] + transactions: [], + loading: true } componentDidMount () { @@ -91,25 +93,35 @@ export default class Transactions extends Component { </tr> ); }); + + return ( + <table className={ styles.transactions }> + <thead> + <tr> + <th> </th> + <th>from</th> + <th>to</th> + <th>txhash</th> + <th className={ styles.right }>block</th> + <th className={ styles.right }>age</th> + <th className={ styles.right }>value</th> + </tr> + </thead> + <tbody> + { transactions } + </tbody> + </table> + ); + } else if (this.state.loading) { + return ( + <LinearProgress mode='indeterminate' /> + ); } return ( - <table className={ styles.transactions }> - <thead> - <tr> - <th> </th> - <th>from</th> - <th>to</th> - <th>txhash</th> - <th className={ styles.right }>block</th> - <th className={ styles.right }>age</th> - <th className={ styles.right }>value</th> - </tr> - </thead> - <tbody> - { transactions } - </tbody> - </table> + <div className={ styles.info }> + No transactions were found for this account + </div> ); } @@ -118,7 +130,8 @@ export default class Transactions extends Component { .transactions(this.props.address) .then((transactions) => { this.setState({ - transactions: transactions + transactions: transactions, + loading: false }); }); } diff --git a/js/src/views/Account/style.css b/js/src/views/Account/style.css index 3d8c25a063d..59929537930 100644 --- a/js/src/views/Account/style.css +++ b/js/src/views/Account/style.css @@ -22,3 +22,7 @@ line-height: 24px; vertical-align: middle; } + +.info { + color: #aaa; +} From 3618668d6dc5ef67cebb053263a18eb60ad01c00 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 17 Aug 2016 15:32:29 +0200 Subject: [PATCH 0098/1062] browser apps, proper eslint overrides --- js/.eslintrc.json | 1 + 1 file changed, 1 insertion(+) diff --git a/js/.eslintrc.json b/js/.eslintrc.json index 5f7f20196b1..b649a1beaf8 100644 --- a/js/.eslintrc.json +++ b/js/.eslintrc.json @@ -2,6 +2,7 @@ "extends": ["semistandard", "standard-react"], "parser": "babel-eslint", "env": { + "browser": true, "mocha": true, "node": true }, From dfe53278b66458581851ec7d9ce1115d4c38c7a6 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 17 Aug 2016 15:32:47 +0200 Subject: [PATCH 0099/1062] disable tooltips by user --- .../Tooltip/TooltipOverlay/tooltipOverlay.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/js/src/ui/Tooltip/TooltipOverlay/tooltipOverlay.js b/js/src/ui/Tooltip/TooltipOverlay/tooltipOverlay.js index cd4a00db43e..7f6b6934272 100644 --- a/js/src/ui/Tooltip/TooltipOverlay/tooltipOverlay.js +++ b/js/src/ui/Tooltip/TooltipOverlay/tooltipOverlay.js @@ -2,6 +2,8 @@ import React, { Component, PropTypes } from 'react'; import styles from '../style.css'; +const LS_KEY = 'tooltips'; + export default class TooltipOverlay extends Component { static childContextTypes = { tooltips: PropTypes.object @@ -12,10 +14,18 @@ export default class TooltipOverlay extends Component { } state = { - currentId: 0, + currentId: -1, updateCallbacks: [] } + componentDidMount () { + const ls = window.localStorage.getItem('tooltips'); + + this.setState({ + currentId: ls ? -1 : 0 + }); + } + render () { const overlay = this.state.currentId === -1 ? null : (<div className={ styles.overlay } />); @@ -34,10 +44,6 @@ export default class TooltipOverlay extends Component { } register (updateCallback) { - if (this.state.currentId === -1) { - return; - } - this.state.updateCallbacks.push(updateCallback); this.update(); @@ -57,6 +63,8 @@ export default class TooltipOverlay extends Component { } close () { + window.localStorage.setItem(LS_KEY, '{"state":"off"}'); + this.setState({ currentId: -1 }, this.update); From c319a670dcbf6b30565daec7bc2e5e33a88b2f1f Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 17 Aug 2016 16:22:10 +0200 Subject: [PATCH 0100/1062] contract deployment only via sendTransaction & remove signAndSendTransaction binding on contract --- js/src/api/contract/contract.js | 11 +++----- js/src/api/contract/contract.spec.js | 39 ++++++---------------------- 2 files changed, 11 insertions(+), 39 deletions(-) diff --git a/js/src/api/contract/contract.js b/js/src/api/contract/contract.js index c50616adef0..5e3e495c6bc 100644 --- a/js/src/api/contract/contract.js +++ b/js/src/api/contract/contract.js @@ -47,14 +47,14 @@ export default class Contract { return this; } - deploy (code, values, password) { + deploy (code, values) { const options = { data: code, gas: 900000 }; - return this._eth.personal - .signAndSendTransaction(this._encodeOptions(this.constructors[0], options, values), password) + return this._eth.eth + .sendTransaction(this._encodeOptions(this.constructors[0], options, values)) .then((txhash) => this.pollTransactionReceipt(txhash)) .then((receipt) => { this._address = receipt.contractAddress; @@ -146,11 +146,6 @@ export default class Contract { .sendTransaction(this._encodeOptions(func, addAddress(options), values)); }; - func.signAndSendTransaction = (options, values, password) => { - return this._eth.personal - .signAndSendTransaction(this._encodeOptions(func, addAddress(options), values), password); - }; - func.estimateGas = (options, values) => { return this._eth.eth .estimateGas(this._encodeOptions(func, addAddress(options), values)); diff --git a/js/src/api/contract/contract.spec.js b/js/src/api/contract/contract.spec.js index e112f3ded81..dced8825dc6 100644 --- a/js/src/api/contract/contract.spec.js +++ b/js/src/api/contract/contract.spec.js @@ -199,13 +199,13 @@ describe('api/contract/Contract', () => { describe('success', () => { before(() => { scope = mockHttp([ - { method: 'personal_signAndSendTransaction', reply: { result: '0x678' } }, + { method: 'eth_sendTransaction', reply: { result: '0x678' } }, { method: 'eth_getTransactionReceipt', reply: { result: null } }, { method: 'eth_getTransactionReceipt', reply: { result: RECEIPT } }, { method: 'eth_getCode', reply: { result: '0x456' } } ]); - return contract.deploy('0x123', [], 'xxx'); + return contract.deploy('0x123', []); }); it('calls sendTransaction, getTransactionReceipt & getCode in order', () => { @@ -213,9 +213,8 @@ describe('api/contract/Contract', () => { }); it('passes the options & password through to sendTransaction', () => { - expect(scope.body.personal_signAndSendTransaction.params).to.deep.equal([ - { data: '0x123', gas: '0xdbba0' }, - 'xxx' + expect(scope.body.eth_sendTransaction.params).to.deep.equal([ + { data: '0x123', gas: '0xdbba0' } ]); }); @@ -227,7 +226,7 @@ describe('api/contract/Contract', () => { describe('error', () => { before(() => { scope = mockHttp([ - { method: 'personal_signAndSendTransaction', reply: { result: '0x678' } }, + { method: 'eth_sendTransaction', reply: { result: '0x678' } }, { method: 'eth_getTransactionReceipt', reply: { result: RECEIPT } }, { method: 'eth_getCode', reply: { result: '0x' } } ]); @@ -235,7 +234,7 @@ describe('api/contract/Contract', () => { it('fails when no code was deployed', () => { return contract - .deploy('0x123', [], 'xxx') + .deploy('0x123', []) .catch((error) => { expect(error.message).to.match(/not deployed/); }); @@ -255,17 +254,15 @@ describe('api/contract/Contract', () => { }); describe('attachments', () => { - it('attaches .call, .sendTransaction, .signAndSend & .estimateGas to constructors', () => { + it('attaches .call, .sendTransaction & .estimateGas to constructors', () => { expect(isFunction(cons.call)).to.be.true; expect(isFunction(cons.sendTransaction)).to.be.true; - expect(isFunction(cons.signAndSendTransaction)).to.be.true; expect(isFunction(cons.estimateGas)).to.be.true; }); - it('attaches .call, .sendTransaction, .signAndSend & .estimateGas to functions', () => { + it('attaches .call, .sendTransaction & .estimateGas to functions', () => { expect(isFunction(func.call)).to.be.true; expect(isFunction(func.sendTransaction)).to.be.true; - expect(isFunction(func.signAndSendTransaction)).to.be.true; expect(isFunction(func.estimateGas)).to.be.true; }); @@ -274,7 +271,6 @@ describe('api/contract/Contract', () => { expect(isFunction(func.call)).to.be.true; expect(isFunction(func.sendTransaction)).to.be.false; - expect(isFunction(func.signAndSendTransaction)).to.be.false; expect(isFunction(func.estimateGas)).to.be.false; }); }); @@ -298,25 +294,6 @@ describe('api/contract/Contract', () => { }); }); - describe('signAndSendTransaction', () => { - beforeEach(() => { - scope = mockHttp([{ method: 'personal_signAndSendTransaction', reply: { result: ['hashId'] } }]); - }); - - it('encodes options and mades an personal_signAndSendTransaction call', () => { - return func - .signAndSendTransaction({ someExtras: 'foo' }, VALUES, 'xxx') - .then(() => { - expect(scope.isDone()).to.be.true; - expect(scope.body.personal_signAndSendTransaction.params).to.deep.equal([{ - someExtras: 'foo', - to: ADDR, - data: ENCODED - }, 'xxx']); - }); - }); - }); - describe('estimateGas', () => { beforeEach(() => { scope = mockHttp([{ method: 'eth_estimateGas', reply: { result: ['0x123'] } }]); From 3ac976fcfdf287a6205f961149e7c021859c8eec Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 17 Aug 2016 19:02:53 +0200 Subject: [PATCH 0101/1062] minor api updates --- js/src/abi/util/slice.js | 6 ++++++ js/src/api/README.md | 6 +++--- js/src/api/api.js | 4 ++++ js/src/api/contract/contract.js | 11 ++++++++++- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/js/src/abi/util/slice.js b/js/src/abi/util/slice.js index 8455b248129..620154e8334 100644 --- a/js/src/abi/util/slice.js +++ b/js/src/abi/util/slice.js @@ -1,3 +1,5 @@ +import { padAddress } from './pad'; + export function sliceData (_data) { if (!_data || !_data.length) { return []; @@ -5,6 +7,10 @@ export function sliceData (_data) { let data = (_data.substr(0, 2) === '0x') ? _data.substr(2) : _data; + if (!data.length) { + data = padAddress(''); + } + if (data.length % 64) { throw new Error('Invalid data length (not mod 64) passed to sliceData'); } diff --git a/js/src/api/README.md b/js/src/api/README.md index e3b32431a92..0eca9b5f4f5 100644 --- a/js/src/api/README.md +++ b/js/src/api/README.md @@ -100,7 +100,7 @@ attach a contract at address ```javascript // via the constructor & .at function -const contract = new EthApi.Contract(ethapi, abi).at('0xa9280...7347b'); +const contract = api.newContract(abi).at('0xa9280...7347b'); // or on an already initialised contract contract.at('0xa9280...7347b'); // perform calls here @@ -109,8 +109,8 @@ contract.at('0xa9280...7347b'); find & call a function ```javascript -contract.functions - .find((func) => func.name === 'callMe') +contract.named + .callMe .call({ gas: 21000 }, [true, 'someString']) // or estimateGas or sendTransaction .then((result) => { console.log(`the result was ${result}`); diff --git a/js/src/api/api.js b/js/src/api/api.js index 097413433ee..cd472eaf056 100644 --- a/js/src/api/api.js +++ b/js/src/api/api.js @@ -53,6 +53,10 @@ export default class Api { return this._web3; } + newContract (abi) { + return new Contract(this, abi); + } + static format = format; static Contract = Contract diff --git a/js/src/api/contract/contract.js b/js/src/api/contract/contract.js index 5e3e495c6bc..599a9576628 100644 --- a/js/src/api/contract/contract.js +++ b/js/src/api/contract/contract.js @@ -16,6 +16,11 @@ export default class Contract { this._constructors = this._abi.constructors.map((cons) => this._bindFunction(cons)); this._functions = this._abi.functions.map((func) => this._bindFunction(func)); this._events = this._abi.events; + + this._named = {}; + this._functions.forEach((fn) => { + this._named[fn.name] = fn; + }); } get address () { @@ -34,6 +39,10 @@ export default class Contract { return this._functions; } + get named () { + return this._named; + } + get eth () { return this._eth; } @@ -127,7 +136,7 @@ export default class Contract { } _bindFunction (func) { - const addAddress = (options) => { + const addAddress = (options = {}) => { options.to = options.to || this._address; return options; }; From db39ffa0d23afe490630eb878c3701a84dbe62e9 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 17 Aug 2016 19:03:04 +0200 Subject: [PATCH 0102/1062] GavCoin icons --- js/src/images/gavcoin-32x32.png | Bin 0 -> 5269 bytes js/src/images/gavcoin.png | Bin 0 -> 94229 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 js/src/images/gavcoin-32x32.png create mode 100644 js/src/images/gavcoin.png diff --git a/js/src/images/gavcoin-32x32.png b/js/src/images/gavcoin-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..4d79483dad80a60fd4dd4d15dbad42ae56859904 GIT binary patch literal 5269 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 b|1b6LF-7(2X!Tu~00000NkvXXu0mjfb!;yM literal 0 HcmV?d00001 diff --git a/js/src/images/gavcoin.png b/js/src/images/gavcoin.png new file mode 100644 index 0000000000000000000000000000000000000000..20e686f209e88e4fbd138393b8bcee7f6a6359ad GIT binary patch literal 94229 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∨C&AqC(bY=YT>qm&8Bd9vf%ur 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°Y*`2#lBJ9ZuW8><=gGM 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 literal 0 HcmV?d00001 From 5c0f83e26735f52561b5c6fd2e3f2b47f26986c8 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 17 Aug 2016 19:03:19 +0200 Subject: [PATCH 0103/1062] abis for contracts --- js/src/services/contracts/eip20.json | 142 +++++++ js/src/services/contracts/index.js | 9 + js/src/services/contracts/registry.json | 499 ++++++++++++++++++++++++ js/src/services/contracts/tokenreg.json | 213 ++++++++++ 4 files changed, 863 insertions(+) create mode 100644 js/src/services/contracts/eip20.json create mode 100644 js/src/services/contracts/index.js create mode 100644 js/src/services/contracts/registry.json create mode 100644 js/src/services/contracts/tokenreg.json diff --git a/js/src/services/contracts/eip20.json b/js/src/services/contracts/eip20.json new file mode 100644 index 00000000000..8482e2f5a66 --- /dev/null +++ b/js/src/services/contracts/eip20.json @@ -0,0 +1,142 @@ +[ + { + "constant": false, + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_who", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": true, + "name": "to", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + } +] diff --git a/js/src/services/contracts/index.js b/js/src/services/contracts/index.js new file mode 100644 index 00000000000..bae7643de51 --- /dev/null +++ b/js/src/services/contracts/index.js @@ -0,0 +1,9 @@ +import EIP20 from './eip20.json'; +import REGISTRY from './registry.json'; +import TOKENREG from './tokenreg.json'; + +const eip20 = EIP20; +const registry = REGISTRY; +const tokenreg = TOKENREG; + +export { eip20, registry, tokenreg }; diff --git a/js/src/services/contracts/registry.json b/js/src/services/contracts/registry.json new file mode 100644 index 00000000000..11883230d5f --- /dev/null +++ b/js/src/services/contracts/registry.json @@ -0,0 +1,499 @@ +[ + { + "constant": false, + "inputs": [ + { + "name": "_new", + "type": "address" + } + ], + "name": "setOwner", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "string" + } + ], + "name": "confirmReverse", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + } + ], + "name": "reserve", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_key", + "type": "string" + }, + { + "name": "_value", + "type": "bytes32" + } + ], + "name": "set", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + } + ], + "name": "drop", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_key", + "type": "string" + } + ], + "name": "getAddress", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_amount", + "type": "uint256" + } + ], + "name": "setFee", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_to", + "type": "address" + } + ], + "name": "transfer", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "owner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + } + ], + "name": "reserved", + "outputs": [ + { + "name": "reserved", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "drain", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "string" + }, + { + "name": "_who", + "type": "address" + } + ], + "name": "proposeReverse", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_key", + "type": "string" + } + ], + "name": "getUint", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_key", + "type": "string" + } + ], + "name": "get", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "fee", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "reverse", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_key", + "type": "string" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "setUint", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "removeReverse", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_key", + "type": "string" + }, + { + "name": "_value", + "type": "address" + } + ], + "name": "setAddress", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "amount", + "type": "uint256" + } + ], + "name": "Drained", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "amount", + "type": "uint256" + } + ], + "name": "FeeChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "bytes32" + }, + { + "indexed": true, + "name": "owner", + "type": "address" + } + ], + "name": "Reserved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "bytes32" + }, + { + "indexed": true, + "name": "oldOwner", + "type": "address" + }, + { + "indexed": true, + "name": "newOwner", + "type": "address" + } + ], + "name": "Transferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "bytes32" + }, + { + "indexed": true, + "name": "owner", + "type": "address" + } + ], + "name": "Dropped", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "bytes32" + }, + { + "indexed": true, + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "name": "key", + "type": "string" + } + ], + "name": "DataChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "string" + }, + { + "indexed": true, + "name": "reverse", + "type": "address" + } + ], + "name": "ReverseProposed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "string" + }, + { + "indexed": true, + "name": "reverse", + "type": "address" + } + ], + "name": "ReverseConfirmed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "string" + }, + { + "indexed": true, + "name": "reverse", + "type": "address" + } + ], + "name": "ReverseRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "old", + "type": "address" + }, + { + "indexed": true, + "name": "current", + "type": "address" + } + ], + "name": "NewOwner", + "type": "event" + } +] diff --git a/js/src/services/contracts/tokenreg.json b/js/src/services/contracts/tokenreg.json new file mode 100644 index 00000000000..fc813bc1cf9 --- /dev/null +++ b/js/src/services/contracts/tokenreg.json @@ -0,0 +1,213 @@ +[ + { + "constant": true, + "inputs": [ + { + "name": "_id", + "type": "uint256" + } + ], + "name": "token", + "outputs": [ + { + "name": "o_addr", + "type": "address" + }, + { + "name": "o_tla", + "type": "string" + }, + { + "name": "o_base", + "type": "uint256" + }, + { + "name": "o_name", + "type": "string" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_new", + "type": "address" + } + ], + "name": "setOwner", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_addr", + "type": "address" + }, + { + "name": "_tla", + "type": "string" + }, + { + "name": "_base", + "type": "uint256" + }, + { + "name": "_name", + "type": "string" + } + ], + "name": "register", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_fee", + "type": "uint256" + } + ], + "name": "setFee", + "outputs": [], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_id", + "type": "uint256" + }, + { + "name": "_key", + "type": "bytes32" + } + ], + "name": "meta", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_tla", + "type": "string" + } + ], + "name": "fromTLA", + "outputs": [ + { + "name": "o_id", + "type": "uint256" + }, + { + "name": "o_addr", + "type": "address" + }, + { + "name": "o_base", + "type": "uint256" + }, + { + "name": "o_name", + "type": "string" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "owner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "drain", + "outputs": [], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "tokenCount", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_id", + "type": "uint256" + } + ], + "name": "unregister", + "outputs": [], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_addr", + "type": "address" + } + ], + "name": "fromAddress", + "outputs": [ + { + "name": "o_id", + "type": "uint256" + }, + { + "name": "o_tla", + "type": "string" + }, + { + "name": "o_base", + "type": "uint256" + }, + { + "name": "o_name", + "type": "string" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "fee", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + } +] From f1b7cfd2874c7ddb141ff16ae24014c672273ec3 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 17 Aug 2016 21:45:47 +0200 Subject: [PATCH 0104/1062] add the ethcore_registryAddress endpint --- js/src/api/rpc/ethcore/ethcore.js | 6 ++++++ js/src/jsonrpc/interfaces/ethcore.js | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/js/src/api/rpc/ethcore/ethcore.js b/js/src/api/rpc/ethcore/ethcore.js index 090386aa267..17f7e125aeb 100644 --- a/js/src/api/rpc/ethcore/ethcore.js +++ b/js/src/api/rpc/ethcore/ethcore.js @@ -92,6 +92,12 @@ export default class Ethcore { .then(outAddress); } + registryAddress () { + return this._transport + .execute('ethcore_registryAddress') + .then(outAddress); + } + removeReservedPeer (encode) { return this._transport .execute('ethcore_removeReservedPeer', encode); diff --git a/js/src/jsonrpc/interfaces/ethcore.js b/js/src/jsonrpc/interfaces/ethcore.js index 8d81d265933..0759d4ecaa5 100644 --- a/js/src/jsonrpc/interfaces/ethcore.js +++ b/js/src/jsonrpc/interfaces/ethcore.js @@ -162,6 +162,15 @@ export default { } }, + registryAddress: { + desc: 'The address for the global registry', + params: [], + returns: { + type: Address, + desc: 'The registry address' + } + }, + rpcSettings: { desc: 'Returns basic settings of rpc (enabled, port, interface).', params: [], From 7d1d753d5ede505c73956ea3d524b8e404cecb24 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 18 Aug 2016 07:49:00 +0200 Subject: [PATCH 0105/1062] web3 for checking (in-case needed, development only) --- js/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/js/package.json b/js/package.json index e3c29e6fdb4..2be60899ed6 100644 --- a/js/package.json +++ b/js/package.json @@ -89,6 +89,7 @@ "sinon-chai": "^2.8.0", "style-loader": "^0.13.0", "url-loader": "^0.5.7", + "web3": "^0.17.0-alpha", "webpack": "^1.12.14", "webpack-dev-server": "^1.14.1", "webpack-error-notification": "0.1.6", From 8aedb4d26a5428f21c0df3febf50b6f30bfde766 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 18 Aug 2016 07:49:27 +0200 Subject: [PATCH 0106/1062] sha3 implementation, non-0x prefixed, not a brilliant idea --- js/src/api/format/index.js | 4 +++- js/src/api/format/sha3.js | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 js/src/api/format/sha3.js diff --git a/js/src/api/format/index.js b/js/src/api/format/index.js index 00be8673881..873ba3830d4 100644 --- a/js/src/api/format/index.js +++ b/js/src/api/format/index.js @@ -1,9 +1,11 @@ import { isAddress, toChecksumAddress } from './address'; import { fromWei, toWei } from './wei'; +import { sha3 } from './sha3'; export default { isAddressValid: isAddress, fromWei: fromWei, toChecksumAddress: toChecksumAddress, - toWei: toWei + toWei: toWei, + sha3: sha3 }; diff --git a/js/src/api/format/sha3.js b/js/src/api/format/sha3.js new file mode 100644 index 00000000000..c26dd637031 --- /dev/null +++ b/js/src/api/format/sha3.js @@ -0,0 +1,5 @@ +import { keccak_256 } from 'js-sha3'; // eslint-disable-line camelcase + +export function sha3 (value) { + return keccak_256(value); +} From e67ac4ab128a52ad34d9c837bac9f2fe90fe0a9a Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 18 Aug 2016 07:50:11 +0200 Subject: [PATCH 0107/1062] poll the registry for tokenreg, get tokens from reg, get totalSupply for them all (POC, console-only) --- js/src/views/Tokens/tokens.js | 70 +++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/js/src/views/Tokens/tokens.js b/js/src/views/Tokens/tokens.js index df16966c9ce..01190c0e128 100644 --- a/js/src/views/Tokens/tokens.js +++ b/js/src/views/Tokens/tokens.js @@ -1,8 +1,78 @@ import React, { Component } from 'react'; +import Api from '../../api'; import Container from '../../ui/Container'; +import { eip20, registry, tokenreg } from '../../services/contracts'; + export default class Tokens extends Component { + static contextTypes = { + api: React.PropTypes.object + } + + componentDidMount () { + const api = this.context.api; + + api.ethcore + .registryAddress() + .then((address) => { + console.log('registry', address); + + this.registry = api.newContract(registry).at(address); + return this.registry.named + .getAddress + .call({}, [Api.format.sha3('tokenreg'), 'A']); + }) + .then((address) => { + console.log('tokenreg', address); + + this.tokenreg = api.newContract(tokenreg).at(address); + return this.tokenreg.named + .tokenCount + .call(); + }) + .then((tokenCount) => { + console.log('tokenCount', tokenCount.toNumber()); + + const promises = []; + + while (promises.length < tokenCount.toNumber()) { + promises.push(this.tokenreg.named.token.call({}, [promises.length])); + } + + return Promise.all(promises); + }) + .then((tokens) => { + console.log('tokens', tokens); + + const eip20s = []; + const promises = []; + + tokens.forEach((token) => { + console.log(token[0], token[1], token[2].toFormat(), token[3]); + + const contract = api.newContract(eip20).at(token[0]); + + eip20s.push(contract); + promises.push(contract.named.totalSupply.call()); + }); + + return Promise.all(promises); + }) + .then((supplies) => { + console.log('supplies', supplies.map((supply) => supply.toFormat())); + }) + .catch((error) => { + console.error(error); + }); + + // this.unicorns = api.newContract(eip20).at(UNICORNS); + // this.unicorns.named + // .totalSupply + // .call() + // .then((totalSupply) => console.log('totalSupply', totalSupply.toString())); + } + render () { return ( <Container> From 52d5b9d192987f74bafeb785fbdb00a2ff06eabe Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 18 Aug 2016 08:06:55 +0200 Subject: [PATCH 0108/1062] cleanup POC for tokens, make it somewhat re-usable elsewhere --- js/src/views/Tokens/tokens.js | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/js/src/views/Tokens/tokens.js b/js/src/views/Tokens/tokens.js index 01190c0e128..25f502d99be 100644 --- a/js/src/views/Tokens/tokens.js +++ b/js/src/views/Tokens/tokens.js @@ -12,40 +12,33 @@ export default class Tokens extends Component { componentDidMount () { const api = this.context.api; + this.contracts = {}; api.ethcore .registryAddress() .then((address) => { - console.log('registry', address); - - this.registry = api.newContract(registry).at(address); - return this.registry.named + this.contracts.registry = api.newContract(registry).at(address); + return this.contracts.registry.named .getAddress .call({}, [Api.format.sha3('tokenreg'), 'A']); }) .then((address) => { - console.log('tokenreg', address); - - this.tokenreg = api.newContract(tokenreg).at(address); - return this.tokenreg.named + this.contracts.tokenreg = api.newContract(tokenreg).at(address); + return this.contracts.tokenreg.named .tokenCount .call(); }) .then((tokenCount) => { - console.log('tokenCount', tokenCount.toNumber()); - const promises = []; while (promises.length < tokenCount.toNumber()) { - promises.push(this.tokenreg.named.token.call({}, [promises.length])); + promises.push(this.contracts.tokenreg.named.token.call({}, [promises.length])); } return Promise.all(promises); }) .then((tokens) => { - console.log('tokens', tokens); - - const eip20s = []; + this.eip20s = []; const promises = []; tokens.forEach((token) => { @@ -53,7 +46,12 @@ export default class Tokens extends Component { const contract = api.newContract(eip20).at(token[0]); - eip20s.push(contract); + this.eip20s.push({ + token: token[1], + type: token[3], + image: `images/${token[3].toLowerCase()}-32x32.png`, + contract + }); promises.push(contract.named.totalSupply.call()); }); From ddaa109b314a06f43de9481d9d5f5bdf5c18138a Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 18 Aug 2016 08:09:20 +0200 Subject: [PATCH 0109/1062] move token images to images/tokens, update references --- js/src/images/{ => tokens}/ethereum-32x32.png | Bin js/src/images/{ => tokens}/gavcoin-32x32.png | Bin js/src/ui/Balances/balances.js | 2 +- js/src/views/Tokens/tokens.js | 2 +- 4 files changed, 2 insertions(+), 2 deletions(-) rename js/src/images/{ => tokens}/ethereum-32x32.png (100%) rename js/src/images/{ => tokens}/gavcoin-32x32.png (100%) diff --git a/js/src/images/ethereum-32x32.png b/js/src/images/tokens/ethereum-32x32.png similarity index 100% rename from js/src/images/ethereum-32x32.png rename to js/src/images/tokens/ethereum-32x32.png diff --git a/js/src/images/gavcoin-32x32.png b/js/src/images/tokens/gavcoin-32x32.png similarity index 100% rename from js/src/images/gavcoin-32x32.png rename to js/src/images/tokens/gavcoin-32x32.png diff --git a/js/src/ui/Balances/balances.js b/js/src/ui/Balances/balances.js index bde2495eefc..2e202f522cf 100644 --- a/js/src/ui/Balances/balances.js +++ b/js/src/ui/Balances/balances.js @@ -73,7 +73,7 @@ export default class Balances extends Component { { token: 'ΞTH', value: balance.toString(), - img: 'images/ethereum-32x32.png', + img: 'images/tokens/ethereum-32x32.png', type: 'Ethereum' } ] diff --git a/js/src/views/Tokens/tokens.js b/js/src/views/Tokens/tokens.js index 25f502d99be..c7c55a52c14 100644 --- a/js/src/views/Tokens/tokens.js +++ b/js/src/views/Tokens/tokens.js @@ -49,7 +49,7 @@ export default class Tokens extends Component { this.eip20s.push({ token: token[1], type: token[3], - image: `images/${token[3].toLowerCase()}-32x32.png`, + image: `images/tokens/${token[3].toLowerCase()}-32x32.png`, contract }); promises.push(contract.named.totalSupply.call()); From 2e18c08ce8499f346f4ae1daed56ad6be71d3abd Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 18 Aug 2016 09:23:58 +0200 Subject: [PATCH 0110/1062] fix fixedBytes encoding when with leading 0x --- js/src/abi/util/pad.js | 2 ++ js/src/api/format/sha3.js | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/js/src/abi/util/pad.js b/js/src/abi/util/pad.js index 546626ded4d..ba3b21f2082 100644 --- a/js/src/abi/util/pad.js +++ b/js/src/abi/util/pad.js @@ -35,6 +35,8 @@ export function padFixedBytes (input) { if (isArray(input)) { sinput = input.map((code) => code.toString(16)).join(''); + } else if (input.substr(0, 2) === '0x') { + sinput = `${input.substr(2)}`; } else { sinput = `${input}`; } diff --git a/js/src/api/format/sha3.js b/js/src/api/format/sha3.js index c26dd637031..38056fe3c9b 100644 --- a/js/src/api/format/sha3.js +++ b/js/src/api/format/sha3.js @@ -1,5 +1,5 @@ import { keccak_256 } from 'js-sha3'; // eslint-disable-line camelcase export function sha3 (value) { - return keccak_256(value); + return `0x${keccak_256(value)}`; } From 1dca4ff589604e1996dd82f6ed0195860666fde4 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 18 Aug 2016 12:58:52 +0200 Subject: [PATCH 0111/1062] tests for recently-added functions to get back on-track --- js/src/abi/util/pad.spec.js | 4 ++++ js/src/api/format/sha3.spec.js | 9 +++++++++ 2 files changed, 13 insertions(+) create mode 100644 js/src/api/format/sha3.spec.js diff --git a/js/src/abi/util/pad.spec.js b/js/src/abi/util/pad.spec.js index a34219e705d..48fd269a9ac 100644 --- a/js/src/abi/util/pad.spec.js +++ b/js/src/abi/util/pad.spec.js @@ -64,6 +64,10 @@ describe('abi/util/pad', () => { it('right pads length > 64 bytes (64 byte multiples)', () => { expect(padFixedBytes(`${LONG15}${SHORT15}`)).to.equal(`${LONG15}${LONG15}`); }); + + it('strips leading 0x when passed in', () => { + expect(padFixedBytes(`0x${SHORT15}`)).to.equal(LONG15); + }); }); describe('padBytes', () => { diff --git a/js/src/api/format/sha3.spec.js b/js/src/api/format/sha3.spec.js new file mode 100644 index 00000000000..d8f964b8ced --- /dev/null +++ b/js/src/api/format/sha3.spec.js @@ -0,0 +1,9 @@ +import { sha3 } from './sha3'; + +describe('api/format/sha3', () => { + describe('sha3', () => { + it('constructs a correct sha3 value', () => { + expect(sha3('jacogr')).to.equal('0x2f4ff4b5a87abbd2edfed699db48a97744e028c7f7ce36444d40d29d792aa4dc'); + }); + }); +}); From 4014da82460c77cf6dfd1202d0fbb1a145a700ec Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 18 Aug 2016 13:19:38 +0200 Subject: [PATCH 0112/1062] .at returns a map of functions & events --- js/src/api/contract/contract.js | 6 ++++- js/src/api/contract/contract.spec.js | 36 ++++++++++++++++++++++++---- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/js/src/api/contract/contract.js b/js/src/api/contract/contract.js index 599a9576628..d4668050961 100644 --- a/js/src/api/contract/contract.js +++ b/js/src/api/contract/contract.js @@ -18,6 +18,10 @@ export default class Contract { this._events = this._abi.events; this._named = {}; + + this._events.forEach((evt) => { + this._named[evt.name] = evt; + }); this._functions.forEach((fn) => { this._named[fn.name] = fn; }); @@ -53,7 +57,7 @@ export default class Contract { at (address) { this._address = address; - return this; + return this._named; } deploy (code, values) { diff --git a/js/src/api/contract/contract.spec.js b/js/src/api/contract/contract.spec.js index dced8825dc6..a5b3813885b 100644 --- a/js/src/api/contract/contract.spec.js +++ b/js/src/api/contract/contract.spec.js @@ -68,11 +68,36 @@ describe('api/contract/Contract', () => { }); describe('at', () => { - it('sets returns the instance & sets the address', () => { - const contract = new Contract(eth, []); + it('sets returns the functions, events & sets the address', () => { + const contract = new Contract(eth, [ + { + constant: true, + inputs: [{ + name: '_who', + type: 'address' + }], + name: 'balanceOf', + outputs: [{ + name: '', + type: 'uint256' + }], + type: 'function' + }, + { + anonymous: false, + inputs: [{ + indexed: false, + name: 'amount', + type: 'uint256' + }], + name: 'Drained', + type: 'event' + } + ]); + const instance = contract.at('6789'); - expect(contract.at('123')).to.deep.equal(contract); - expect(contract.at('456').address).to.equal('456'); + expect(Object.keys(instance)).to.deep.equal(['Drained', 'balanceOf']); + expect(contract.address).to.equal('6789'); }); }); @@ -248,7 +273,8 @@ describe('api/contract/Contract', () => { let func; beforeEach(() => { - contract = new Contract(eth, ABI).at(ADDR); + contract = new Contract(eth, ABI); + contract.at(ADDR); cons = contract.constructors[0]; func = contract.functions.find((fn) => fn.name === 'test'); }); From 67a50ce87a7c2eee37c7986b7aa6fe4c64ce116f Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 18 Aug 2016 13:20:04 +0200 Subject: [PATCH 0113/1062] move abis to descriptive location with proper naming, no confusion --- js/src/services/{contracts => abi}/eip20.json | 0 js/src/services/abi/index.js | 9 +++++++ .../services/{contracts => abi}/registry.json | 0 .../services/{contracts => abi}/tokenreg.json | 0 js/src/services/contracts/index.js | 9 ------- js/src/views/Tokens/tokens.js | 24 ++++++++++++------- 6 files changed, 24 insertions(+), 18 deletions(-) rename js/src/services/{contracts => abi}/eip20.json (100%) create mode 100644 js/src/services/abi/index.js rename js/src/services/{contracts => abi}/registry.json (100%) rename js/src/services/{contracts => abi}/tokenreg.json (100%) delete mode 100644 js/src/services/contracts/index.js diff --git a/js/src/services/contracts/eip20.json b/js/src/services/abi/eip20.json similarity index 100% rename from js/src/services/contracts/eip20.json rename to js/src/services/abi/eip20.json diff --git a/js/src/services/abi/index.js b/js/src/services/abi/index.js new file mode 100644 index 00000000000..9a897f7aa32 --- /dev/null +++ b/js/src/services/abi/index.js @@ -0,0 +1,9 @@ +import ABI_EIP20 from './eip20.json'; +import ABI_REGISTRY from './registry.json'; +import ABI_TOKENREG from './tokenreg.json'; + +const eip20Abi = ABI_EIP20; +const registryAbi = ABI_REGISTRY; +const tokenRegAbi = ABI_TOKENREG; + +export { eip20Abi, registryAbi, tokenRegAbi }; diff --git a/js/src/services/contracts/registry.json b/js/src/services/abi/registry.json similarity index 100% rename from js/src/services/contracts/registry.json rename to js/src/services/abi/registry.json diff --git a/js/src/services/contracts/tokenreg.json b/js/src/services/abi/tokenreg.json similarity index 100% rename from js/src/services/contracts/tokenreg.json rename to js/src/services/abi/tokenreg.json diff --git a/js/src/services/contracts/index.js b/js/src/services/contracts/index.js deleted file mode 100644 index bae7643de51..00000000000 --- a/js/src/services/contracts/index.js +++ /dev/null @@ -1,9 +0,0 @@ -import EIP20 from './eip20.json'; -import REGISTRY from './registry.json'; -import TOKENREG from './tokenreg.json'; - -const eip20 = EIP20; -const registry = REGISTRY; -const tokenreg = TOKENREG; - -export { eip20, registry, tokenreg }; diff --git a/js/src/views/Tokens/tokens.js b/js/src/views/Tokens/tokens.js index c7c55a52c14..3b26a9564b7 100644 --- a/js/src/views/Tokens/tokens.js +++ b/js/src/views/Tokens/tokens.js @@ -3,7 +3,7 @@ import React, { Component } from 'react'; import Api from '../../api'; import Container from '../../ui/Container'; -import { eip20, registry, tokenreg } from '../../services/contracts'; +import { eip20Abi, registryAbi, tokenRegAbi } from '../../services/abi'; export default class Tokens extends Component { static contextTypes = { @@ -17,14 +17,14 @@ export default class Tokens extends Component { api.ethcore .registryAddress() .then((address) => { - this.contracts.registry = api.newContract(registry).at(address); - return this.contracts.registry.named + this.contracts.registry = api.newContract(registryAbi).at(address); + return this.contracts.registry .getAddress .call({}, [Api.format.sha3('tokenreg'), 'A']); }) .then((address) => { - this.contracts.tokenreg = api.newContract(tokenreg).at(address); - return this.contracts.tokenreg.named + this.contracts.tokenreg = api.newContract(tokenRegAbi).at(address); + return this.contracts.tokenreg .tokenCount .call(); }) @@ -32,7 +32,7 @@ export default class Tokens extends Component { const promises = []; while (promises.length < tokenCount.toNumber()) { - promises.push(this.contracts.tokenreg.named.token.call({}, [promises.length])); + promises.push(this.contracts.tokenreg.token.call({}, [promises.length])); } return Promise.all(promises); @@ -44,21 +44,27 @@ export default class Tokens extends Component { tokens.forEach((token) => { console.log(token[0], token[1], token[2].toFormat(), token[3]); - const contract = api.newContract(eip20).at(token[0]); + const contract = api.newContract(eip20Abi).at(token[0]); this.eip20s.push({ + address: token[0], + image: `images/tokens/${token[3].toLowerCase()}-32x32.png`, + supply: '0', token: token[1], type: token[3], - image: `images/tokens/${token[3].toLowerCase()}-32x32.png`, contract }); - promises.push(contract.named.totalSupply.call()); + promises.push(contract.totalSupply.call()); }); return Promise.all(promises); }) .then((supplies) => { console.log('supplies', supplies.map((supply) => supply.toFormat())); + + supplies.forEach((supply, idx) => { + this.eip20s[idx].supply = supply.toString(); + }); }) .catch((error) => { console.error(error); From 8dfdf077975e8ed842840dc37ce661f5785566b7 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 18 Aug 2016 14:00:45 +0200 Subject: [PATCH 0114/1062] spelling --- js/src/3rdparty/etherscan/account.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/3rdparty/etherscan/account.spec.js b/js/src/3rdparty/etherscan/account.spec.js index 73a45222ee6..590c34d87ab 100644 --- a/js/src/3rdparty/etherscan/account.spec.js +++ b/js/src/3rdparty/etherscan/account.spec.js @@ -32,7 +32,7 @@ describe('etherscan/account', () => { }); describe('transactions', () => { - it('retrievs a list of transactions (default)', () => { + it('retrieves a list of transactions (default)', () => { return etherscan.account .transactions(TESTADDR) .then((transactions) => { @@ -41,7 +41,7 @@ describe('etherscan/account', () => { }); }); - it('retrievs a list of transactions (page 1)', () => { + it('retrieves a list of transactions (page 1)', () => { return etherscan.account .transactions(TESTADDR, 1) .then((transactions) => { From 3f5f52a7ab544857b404c1416a6aa238118538a8 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 18 Aug 2016 14:01:10 +0200 Subject: [PATCH 0115/1062] abi encodes addresses correctly, with checksums throughout --- js/src/abi/decoder/decoder.spec.js | 8 ++++---- js/src/abi/spec/event/event.spec.js | 6 +++--- js/src/{api/format => abi/util}/address.js | 0 js/src/{api/format => abi/util}/address.spec.js | 2 +- js/src/abi/util/sliceAs.js | 4 +++- js/src/abi/util/sliceAs.spec.js | 4 ++-- js/src/api/contract/contract.spec.js | 2 +- js/src/api/format/index.js | 2 +- js/src/api/format/output.js | 2 +- js/test/types.js | 2 +- 10 files changed, 17 insertions(+), 15 deletions(-) rename js/src/{api/format => abi/util}/address.js (100%) rename js/src/{api/format => abi/util}/address.spec.js (98%) diff --git a/js/src/abi/decoder/decoder.spec.js b/js/src/abi/decoder/decoder.spec.js index 02181a6bc8d..29387d538d8 100644 --- a/js/src/abi/decoder/decoder.spec.js +++ b/js/src/abi/decoder/decoder.spec.js @@ -22,10 +22,10 @@ describe('abi/decoder/Decoder', () => { const int1 = '0111111111111111111111111111111111111111111111111111111111111111'; const intn = 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85'; const string1 = '6761766f66796f726b0000000000000000000000000000000000000000000000'; - const tokenAddress1 = new Token('address', address1.slice(-40)); - const tokenAddress2 = new Token('address', address2.slice(-40)); - const tokenAddress3 = new Token('address', address3.slice(-40)); - const tokenAddress4 = new Token('address', address4.slice(-40)); + const tokenAddress1 = new Token('address', `0x${address1.slice(-40)}`); + const tokenAddress2 = new Token('address', `0x${address2.slice(-40)}`); + const tokenAddress3 = new Token('address', `0x${address3.slice(-40)}`); + const tokenAddress4 = new Token('address', `0x${address4.slice(-40)}`); const tokenBool1 = new Token('bool', true); const tokenFixedBytes1 = new Token('fixedBytes', [0x12, 0x34]); const tokenBytes1 = new Token('bytes', [0x12, 0x34]); diff --git a/js/src/abi/spec/event/event.spec.js b/js/src/abi/spec/event/event.spec.js index 4c0325deeee..dd71c302fab 100644 --- a/js/src/abi/spec/event/event.spec.js +++ b/js/src/abi/spec/event/event.spec.js @@ -67,12 +67,12 @@ describe('abi/spec/event/Event', () => { '0000000000000000000000001111111111111111111111111111111111111111' ], '00000000000000000000000000000000000000000000000000000000000000030000000000000000000000002222222222222222222222222222222222222222'); - expect(decoded.address).to.equal('4444444444444444444444444444444444444444'); + expect(decoded.address).to.equal('0x4444444444444444444444444444444444444444'); expect(decoded.params).to.deep.equal([ new DecodedLogParam('a', new ParamType('int', null, 256), new Token('int', new BigNumber(3))), new DecodedLogParam('b', new ParamType('int', null, 256), new Token('int', new BigNumber(2))), - new DecodedLogParam('c', new ParamType('address'), new Token('address', '2222222222222222222222222222222222222222')), - new DecodedLogParam('d', new ParamType('address'), new Token('address', '1111111111111111111111111111111111111111')) + new DecodedLogParam('c', new ParamType('address'), new Token('address', '0x2222222222222222222222222222222222222222')), + new DecodedLogParam('d', new ParamType('address'), new Token('address', '0x1111111111111111111111111111111111111111')) ]); }); diff --git a/js/src/api/format/address.js b/js/src/abi/util/address.js similarity index 100% rename from js/src/api/format/address.js rename to js/src/abi/util/address.js diff --git a/js/src/api/format/address.spec.js b/js/src/abi/util/address.spec.js similarity index 98% rename from js/src/api/format/address.spec.js rename to js/src/abi/util/address.spec.js index dbbd2a9616d..105aee87b7f 100644 --- a/js/src/api/format/address.spec.js +++ b/js/src/abi/util/address.spec.js @@ -1,6 +1,6 @@ import { isChecksumValid, isAddress, toChecksumAddress } from './address'; -describe('api/format/address', () => { +describe('abi/util/address', () => { const value = '63Cf90D3f0410092FC0fca41846f596223979195'; const address = `0x${value}`; const lowercase = `0x${value.toLowerCase()}`; diff --git a/js/src/abi/util/sliceAs.js b/js/src/abi/util/sliceAs.js index 25ed2231082..1d4e0653c0e 100644 --- a/js/src/abi/util/sliceAs.js +++ b/js/src/abi/util/sliceAs.js @@ -1,5 +1,7 @@ import BigNumber from 'bignumber.js'; +import { toChecksumAddress } from './address'; + export function asU32 (slice) { // TODO: validation @@ -19,7 +21,7 @@ export function asI32 (slice) { export function asAddress (slice) { // TODO: address validation? - return slice.slice(-40); + return toChecksumAddress(`0x${slice.slice(-40)}`); } export function asBool (slice) { diff --git a/js/src/abi/util/sliceAs.spec.js b/js/src/abi/util/sliceAs.spec.js index 78801aface9..54017e4784a 100644 --- a/js/src/abi/util/sliceAs.spec.js +++ b/js/src/abi/util/sliceAs.spec.js @@ -4,9 +4,9 @@ describe('abi/util/sliceAs', () => { const MAX_INT = 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'; describe('asAddress', () => { - it('correctly returns the last 40 characters', () => { + it('correctly returns the last 0x40 characters', () => { const address = '1111111111222222222233333333334444444444'; - expect(asAddress(`000000000000000000000000${address}`)).to.equal(address); + expect(asAddress(`000000000000000000000000${address}`)).to.equal(`0x${address}`); }); }); diff --git a/js/src/api/contract/contract.spec.js b/js/src/api/contract/contract.spec.js index a5b3813885b..2aed9605d85 100644 --- a/js/src/api/contract/contract.spec.js +++ b/js/src/api/contract/contract.spec.js @@ -158,7 +158,7 @@ describe('api/contract/Contract', () => { messageId: new BigNumber('281474976731085'), parentId: new BigNumber(0), postId: new BigNumber('281474976731104'), - sender: '63cf90d3f0410092fc0fca41846f596223979195' + sender: '0x63Cf90D3f0410092FC0fca41846f596223979195' }); }); }); diff --git a/js/src/api/format/index.js b/js/src/api/format/index.js index 873ba3830d4..2f7497e2f84 100644 --- a/js/src/api/format/index.js +++ b/js/src/api/format/index.js @@ -1,4 +1,4 @@ -import { isAddress, toChecksumAddress } from './address'; +import { isAddress, toChecksumAddress } from '../../abi/util/address'; import { fromWei, toWei } from './wei'; import { sha3 } from './sha3'; diff --git a/js/src/api/format/output.js b/js/src/api/format/output.js index ba5fb3dde5a..f8b4441c921 100644 --- a/js/src/api/format/output.js +++ b/js/src/api/format/output.js @@ -1,6 +1,6 @@ import BigNumber from 'bignumber.js'; -import { toChecksumAddress } from './address'; +import { toChecksumAddress } from '../../abi/util/address'; export function outAccountInfo (infos) { const ret = {}; diff --git a/js/test/types.js b/js/test/types.js index 577710163e1..175200792a6 100644 --- a/js/test/types.js +++ b/js/test/types.js @@ -2,7 +2,7 @@ import BigNumber from 'bignumber.js'; import { isInstanceOf } from '../src/api/util/types'; export { isFunction, isInstanceOf } from '../src/api/util/types'; -export { isAddress } from '../src/api/format/address'; +export { isAddress } from '../src/abi/util/address'; const ZEROS = '000000000000000000000000000000000000000000000000000000000000'; From c661eea37daf5833995f5c4ea1b7f464765ca274 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 18 Aug 2016 14:18:28 +0200 Subject: [PATCH 0116/1062] tokens incorporation into accounts (can split functioanlity in the future, if required) --- js/src/app.js | 2 - js/src/views/Application/TabBar/tabBar.js | 7 +- js/src/views/Application/application.js | 63 +++++++++++++++- js/src/views/Tokens/index.js | 1 - js/src/views/Tokens/tokens.js | 92 ----------------------- 5 files changed, 61 insertions(+), 104 deletions(-) delete mode 100644 js/src/views/Tokens/index.js delete mode 100644 js/src/views/Tokens/tokens.js diff --git a/js/src/app.js b/js/src/app.js index d66767a0908..6793e7983fb 100644 --- a/js/src/app.js +++ b/js/src/app.js @@ -16,7 +16,6 @@ import Accounts from './views/Accounts'; import Account from './views/Account'; import Application from './views/Application'; import Apps from './views/Apps'; -import Tokens from './views/Tokens'; import Signer from './views/Signer'; import styles from './reset.css'; @@ -30,7 +29,6 @@ ReactDOM.render( <Route path='accounts' component={ Accounts } /> <Route path='account/:address' component={ Account } /> <Route path='apps' component={ Apps } /> - <Route path='tokens' component={ Tokens } /> <Route path='signer' component={ Signer } /> </Route> </Router>, diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index 235ef380286..9fa7240eb64 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -4,7 +4,7 @@ import Toolbar from 'material-ui/Toolbar'; import { Tabs, Tab } from 'material-ui/Tabs'; import ActionAccountBalanceWallet from 'material-ui/svg-icons/action/account-balance-wallet'; -import ActionDashboard from 'material-ui/svg-icons/action/dashboard'; +// import ActionDashboard from 'material-ui/svg-icons/action/dashboard'; import ActionFingerprint from 'material-ui/svg-icons/action/fingerprint'; import NavigationApps from 'material-ui/svg-icons/navigation/apps'; @@ -36,11 +36,6 @@ export default class TabBar extends Component { left='6%' top='65%' text='navigate between the different parts and views of the application, switching between an account view, token view and distributed application view' /> </Tab> - <Tab - data-route='/tokens' - icon={ <ActionDashboard /> } - label='tokens' - onActive={ this.onActivate } /> <Tab data-route='/apps' icon={ <NavigationApps /> } diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index 8c85bfa0201..55b158ed023 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -5,6 +5,7 @@ import darkBaseTheme from 'material-ui/styles/baseThemes/darkBaseTheme'; import lightBaseTheme from 'material-ui/styles/baseThemes/lightBaseTheme'; import Api from '../../api'; +import { eip20Abi, registryAbi, tokenRegAbi } from '../../services/abi'; import { TooltipOverlay } from '../../ui/Tooltip'; import { FirstRun } from '../../modals'; @@ -43,7 +44,7 @@ export default class Application extends Component { } componentWillMount () { - this.retrieveAccounts(); + this.retrieveInfo(); } render () { @@ -68,14 +69,70 @@ export default class Application extends Component { }; } - retrieveAccounts () { + retrieveInfo () { + const contracts = {}; + const tokens = []; + api.personal .listAccounts() .then((accounts) => { this.setState({ - accounts: accounts, + accounts, + contracts, + tokens, showFirst: accounts.length === 0 }); + + return api.ethcore.registryAddress(); + }) + .then((address) => { + contracts.registry = api.newContract(registryAbi).at(address); + return contracts.registry + .getAddress + .call({}, [Api.format.sha3('tokenreg'), 'A']); + }) + .then((address) => { + contracts.tokenreg = api.newContract(tokenRegAbi).at(address); + return contracts.tokenreg + .tokenCount + .call(); + }) + .then((tokenCount) => { + const promises = []; + + while (promises.length < tokenCount.toNumber()) { + promises.push(contracts.tokenreg.token.call({}, [promises.length])); + } + + return Promise.all(promises); + }) + .then((_tokens) => { + return Promise.all(_tokens.map((token) => { + console.log(token[0], token[1], token[2].toFormat(), token[3]); + + const contract = api.newContract(eip20Abi).at(token[0]); + + tokens.push({ + address: token[0], + image: `images/tokens/${token[3].toLowerCase()}-32x32.png`, + supply: '0', + token: token[1], + type: token[3], + contract + }); + + return contract.totalSupply.call(); + })); + }) + .then((supplies) => { + console.log('supplies', supplies.map((supply) => supply.toFormat())); + + supplies.forEach((supply, idx) => { + tokens[idx].supply = supply.toString(); + }); + }) + .catch((error) => { + console.error(error); }); } diff --git a/js/src/views/Tokens/index.js b/js/src/views/Tokens/index.js deleted file mode 100644 index 1d942fa7430..00000000000 --- a/js/src/views/Tokens/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './tokens'; diff --git a/js/src/views/Tokens/tokens.js b/js/src/views/Tokens/tokens.js deleted file mode 100644 index 3b26a9564b7..00000000000 --- a/js/src/views/Tokens/tokens.js +++ /dev/null @@ -1,92 +0,0 @@ -import React, { Component } from 'react'; - -import Api from '../../api'; -import Container from '../../ui/Container'; - -import { eip20Abi, registryAbi, tokenRegAbi } from '../../services/abi'; - -export default class Tokens extends Component { - static contextTypes = { - api: React.PropTypes.object - } - - componentDidMount () { - const api = this.context.api; - this.contracts = {}; - - api.ethcore - .registryAddress() - .then((address) => { - this.contracts.registry = api.newContract(registryAbi).at(address); - return this.contracts.registry - .getAddress - .call({}, [Api.format.sha3('tokenreg'), 'A']); - }) - .then((address) => { - this.contracts.tokenreg = api.newContract(tokenRegAbi).at(address); - return this.contracts.tokenreg - .tokenCount - .call(); - }) - .then((tokenCount) => { - const promises = []; - - while (promises.length < tokenCount.toNumber()) { - promises.push(this.contracts.tokenreg.token.call({}, [promises.length])); - } - - return Promise.all(promises); - }) - .then((tokens) => { - this.eip20s = []; - const promises = []; - - tokens.forEach((token) => { - console.log(token[0], token[1], token[2].toFormat(), token[3]); - - const contract = api.newContract(eip20Abi).at(token[0]); - - this.eip20s.push({ - address: token[0], - image: `images/tokens/${token[3].toLowerCase()}-32x32.png`, - supply: '0', - token: token[1], - type: token[3], - contract - }); - promises.push(contract.totalSupply.call()); - }); - - return Promise.all(promises); - }) - .then((supplies) => { - console.log('supplies', supplies.map((supply) => supply.toFormat())); - - supplies.forEach((supply, idx) => { - this.eip20s[idx].supply = supply.toString(); - }); - }) - .catch((error) => { - console.error(error); - }); - - // this.unicorns = api.newContract(eip20).at(UNICORNS); - // this.unicorns.named - // .totalSupply - // .call() - // .then((totalSupply) => console.log('totalSupply', totalSupply.toString())); - } - - render () { - return ( - <Container> - <div>the token dapp interface should go in here, we need</div> - <ul> - <li>a basic contract</li> - <li>deploy it and</li> - <li>then go about playing and seeing what is the best way to pull everything together...</li> - </ul> - </Container> - ); - } -} From ea6eda09b0582290e9ac0c82109ca7cd348acdd0 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 18 Aug 2016 15:40:49 +0200 Subject: [PATCH 0117/1062] address padding should not pass any leading 0x through --- js/src/abi/util/pad.js | 4 +++- js/src/abi/util/pad.spec.js | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/js/src/abi/util/pad.js b/js/src/abi/util/pad.js index ba3b21f2082..ca5ab154170 100644 --- a/js/src/abi/util/pad.js +++ b/js/src/abi/util/pad.js @@ -5,7 +5,9 @@ import { isArray } from './types'; const ZERO_64 = '0000000000000000000000000000000000000000000000000000000000000000'; -export function padAddress (input) { +export function padAddress (_input) { + const input = _input.substr(0, 2) === '0x' ? _input.substr(2) : _input; + return `${ZERO_64}${input}`.slice(-64); } diff --git a/js/src/abi/util/pad.spec.js b/js/src/abi/util/pad.spec.js index 48fd269a9ac..296984fd707 100644 --- a/js/src/abi/util/pad.spec.js +++ b/js/src/abi/util/pad.spec.js @@ -11,6 +11,10 @@ describe('abi/util/pad', () => { it('pads to 64 characters', () => { expect(padAddress('123')).to.equal(PAD123); }); + + it('strips leading 0x when passed in', () => { + expect(padFixedBytes(`0x${PAD123}`)).to.equal(PAD123); + }); }); describe('padBool', () => { From b05732a9eceb2917e334b56ba27ad0a719dbbd95 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 18 Aug 2016 15:41:11 +0200 Subject: [PATCH 0118/1062] show additional coin token balances on accounts page --- js/src/ui/Balances/balances.js | 55 +++++++---- js/src/ui/Balances/style.css | 1 + .../Accounts/AccountSummary/accountSummary.js | 4 +- js/src/views/Accounts/accounts.js | 95 +++++++++++++++---- js/src/views/Application/application.js | 57 ----------- 5 files changed, 122 insertions(+), 90 deletions(-) diff --git a/js/src/ui/Balances/balances.js b/js/src/ui/Balances/balances.js index 2e202f522cf..38d69a4edda 100644 --- a/js/src/ui/Balances/balances.js +++ b/js/src/ui/Balances/balances.js @@ -12,6 +12,7 @@ export default class Balances extends Component { static propTypes = { address: PropTypes.string.isRequired, + tokens: PropTypes.array, onChange: PropTypes.func } @@ -27,15 +28,18 @@ export default class Balances extends Component { const balances = this.state.balances .filter((balance) => new BigNumber(balance.value).gt(0)) .map((balance) => { + const value = balance.format + ? Api.format.fromWei(balance.value).toFormat() + : new BigNumber(balance.value).toFormat(); return ( <div className={ styles.balance } key={ balance.token }> <img - src={ balance.img } + src={ balance.image } alt={ balance.type } /> <div> - { Api.format.fromWei(balance.value).toFormat() } { balance.token } + { value } { balance.token } </div> </div> ); @@ -62,22 +66,41 @@ export default class Balances extends Component { getBalances () { const api = this.context.api; + const calls = (this.props.tokens || []).map((token) => token.contract.balanceOf.call({}, [this.props.address])); - Promise - .all([ - api.eth.getBalance(this.props.address) - ]) - .then(([balance]) => { - this.setState({ - balances: [ - { - token: 'ΞTH', - value: balance.toString(), - img: 'images/tokens/ethereum-32x32.png', - type: 'Ethereum' + api.eth + .getBalance(this.props.address) + .then((balance) => { + const balances = [{ + format: true, + image: 'images/tokens/ethereum-32x32.png', + token: 'ΞTH', + type: 'Ethereum', + value: balance.toString() + }]; + + return Promise + .all(calls) + .then((tokenBalances) => { + if (tokenBalances && tokenBalances.length) { + tokenBalances.forEach((balance, idx) => { + const token = this.props.tokens[idx]; + + if (token) { + balances.push({ + image: token.image, + token: token.token, + type: token.type, + value: balance.toString() + }); + } + }); } - ] - }, this.updateParent); + + this.setState({ + balances + }, this.updateParent); + }); }); } } diff --git a/js/src/ui/Balances/style.css b/js/src/ui/Balances/style.css index 02fe525fdc4..2952a4615ac 100644 --- a/js/src/ui/Balances/style.css +++ b/js/src/ui/Balances/style.css @@ -4,6 +4,7 @@ .balance { height: 32px; + margin-top: 0.25em; } .balance img { diff --git a/js/src/views/Accounts/AccountSummary/accountSummary.js b/js/src/views/Accounts/AccountSummary/accountSummary.js index 4bcf90c6683..e0dcd749af5 100644 --- a/js/src/views/Accounts/AccountSummary/accountSummary.js +++ b/js/src/views/Accounts/AccountSummary/accountSummary.js @@ -12,6 +12,7 @@ export default class AccountSummary extends Component { static propTypes = { account: PropTypes.object.isRequired, + tokens: PropTypes.array, children: PropTypes.node } @@ -31,7 +32,8 @@ export default class AccountSummary extends Component { title={ <Link to={ viewLink }>{ account.name || 'Unnamed' }</Link> } byline={ account.address } /> <Balances - address={ account.address } /> + address={ account.address } + tokens={ this.props.tokens } /> { this.props.children } </Container> ); diff --git a/js/src/views/Accounts/accounts.js b/js/src/views/Accounts/accounts.js index d501c37ca8a..7aa515a47af 100644 --- a/js/src/views/Accounts/accounts.js +++ b/js/src/views/Accounts/accounts.js @@ -1,8 +1,10 @@ import React, { Component } from 'react'; +import Api from '../../api'; import AccountSummary from './AccountSummary'; import Actions from './Actions'; import { CreateAccount } from '../../modals'; +import { eip20Abi, registryAbi, tokenRegAbi } from '../../services/abi'; import Tooltip from '../../ui/Tooltip'; import styles from './style.css'; @@ -14,6 +16,7 @@ export default class Accounts extends Component { state = { accounts: [], + tokens: [], newDialog: false } @@ -60,7 +63,8 @@ export default class Accounts extends Component { className={ styles.account } key={ account.address }> <AccountSummary - account={ account }> + account={ account } + tokens={ this.state.tokens }> { idx === 0 ? firstTooltip : null } </AccountSummary> </div> @@ -85,28 +89,87 @@ export default class Accounts extends Component { } const api = this.context.api; + let accounts = []; + const contracts = {}; + const tokens = []; Promise .all([ api.personal.listAccounts(), - api.personal.accountsInfo() + api.personal.accountsInfo(), + api.ethcore.registryAddress() ]) - .then(([addresses, infos]) => { - setTimeout(() => this.retrieveAccounts(), 2500); + .then(([addresses, infos, registryAddress]) => { + accounts = addresses + .filter((address) => infos[address].uuid) + .map((address) => { + const info = infos[address]; + + return { + address: address, + name: info.name, + uuid: info.uuid, + meta: info.meta + }; + }); + + contracts.registry = api.newContract(registryAbi).at(registryAddress); + + return contracts.registry + .getAddress + .call({}, [Api.format.sha3('tokenreg'), 'A']); + }) + .then((tokenregAddress) => { + contracts.tokenreg = api.newContract(tokenRegAbi).at(tokenregAddress); + + return contracts.tokenreg + .tokenCount + .call(); + }) + .then((tokenCount) => { + const promises = []; + + while (promises.length < tokenCount.toNumber()) { + promises.push(contracts.tokenreg.token.call({}, [promises.length])); + } + + return Promise.all(promises); + }) + .then((_tokens) => { + return Promise.all(_tokens.map((token) => { + console.log(token[0], token[1], token[2].toFormat(), token[3]); + + const contract = api.newContract(eip20Abi).at(token[0]); + + tokens.push({ + address: token[0], + image: `images/tokens/${token[3].toLowerCase()}-32x32.png`, + supply: '0', + token: token[1], + type: token[3], + contract + }); + + return contract.totalSupply.call(); + })); + }) + .then((supplies) => { + console.log('supplies', supplies.map((supply) => supply.toFormat())); + + supplies.forEach((supply, idx) => { + tokens[idx].supply = supply.toString(); + }); + this.setState({ - accounts: addresses - .filter((address) => infos[address].uuid) - .map((address) => { - const info = infos[address]; - - return { - address: address, - name: info.name, - uuid: info.uuid, - meta: info.meta - }; - }) + accounts, + contracts, + tokens }); + + setTimeout(() => this.retrieveAccounts(), 2500); + }) + .catch((error) => { + console.error(error); }); } } diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index 55b158ed023..42a1346754a 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -5,7 +5,6 @@ import darkBaseTheme from 'material-ui/styles/baseThemes/darkBaseTheme'; import lightBaseTheme from 'material-ui/styles/baseThemes/lightBaseTheme'; import Api from '../../api'; -import { eip20Abi, registryAbi, tokenRegAbi } from '../../services/abi'; import { TooltipOverlay } from '../../ui/Tooltip'; import { FirstRun } from '../../modals'; @@ -70,69 +69,13 @@ export default class Application extends Component { } retrieveInfo () { - const contracts = {}; - const tokens = []; - api.personal .listAccounts() .then((accounts) => { this.setState({ accounts, - contracts, - tokens, showFirst: accounts.length === 0 }); - - return api.ethcore.registryAddress(); - }) - .then((address) => { - contracts.registry = api.newContract(registryAbi).at(address); - return contracts.registry - .getAddress - .call({}, [Api.format.sha3('tokenreg'), 'A']); - }) - .then((address) => { - contracts.tokenreg = api.newContract(tokenRegAbi).at(address); - return contracts.tokenreg - .tokenCount - .call(); - }) - .then((tokenCount) => { - const promises = []; - - while (promises.length < tokenCount.toNumber()) { - promises.push(contracts.tokenreg.token.call({}, [promises.length])); - } - - return Promise.all(promises); - }) - .then((_tokens) => { - return Promise.all(_tokens.map((token) => { - console.log(token[0], token[1], token[2].toFormat(), token[3]); - - const contract = api.newContract(eip20Abi).at(token[0]); - - tokens.push({ - address: token[0], - image: `images/tokens/${token[3].toLowerCase()}-32x32.png`, - supply: '0', - token: token[1], - type: token[3], - contract - }); - - return contract.totalSupply.call(); - })); - }) - .then((supplies) => { - console.log('supplies', supplies.map((supply) => supply.toFormat())); - - supplies.forEach((supply, idx) => { - tokens[idx].supply = supply.toString(); - }); - }) - .catch((error) => { - console.error(error); }); } From 8ec3370f295f09cc756df4f23b44d594df5ae808 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 18 Aug 2016 15:52:56 +0200 Subject: [PATCH 0119/1062] divide by token format adjustment --- js/src/ui/Balances/balances.js | 6 +++--- js/src/views/Accounts/accounts.js | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/js/src/ui/Balances/balances.js b/js/src/ui/Balances/balances.js index 38d69a4edda..09c81f35192 100644 --- a/js/src/ui/Balances/balances.js +++ b/js/src/ui/Balances/balances.js @@ -29,8 +29,8 @@ export default class Balances extends Component { .filter((balance) => new BigNumber(balance.value).gt(0)) .map((balance) => { const value = balance.format - ? Api.format.fromWei(balance.value).toFormat() - : new BigNumber(balance.value).toFormat(); + ? new BigNumber(balance.value).div(new BigNumber(balance.format)).toFormat() + : Api.format.fromWei(balance.value).toFormat(); return ( <div className={ styles.balance } @@ -72,7 +72,6 @@ export default class Balances extends Component { .getBalance(this.props.address) .then((balance) => { const balances = [{ - format: true, image: 'images/tokens/ethereum-32x32.png', token: 'ΞTH', type: 'Ethereum', @@ -88,6 +87,7 @@ export default class Balances extends Component { if (token) { balances.push({ + format: token.format, image: token.image, token: token.token, type: token.type, diff --git a/js/src/views/Accounts/accounts.js b/js/src/views/Accounts/accounts.js index 7aa515a47af..3db22bc84e1 100644 --- a/js/src/views/Accounts/accounts.js +++ b/js/src/views/Accounts/accounts.js @@ -143,6 +143,7 @@ export default class Accounts extends Component { tokens.push({ address: token[0], + format: token[2].toString(), image: `images/tokens/${token[3].toLowerCase()}-32x32.png`, supply: '0', token: token[1], From fe957bae77d67156801ae10ca7bfbc423c0a802b Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 18 Aug 2016 16:25:23 +0200 Subject: [PATCH 0120/1062] token balance now shows for both the account summary and account full list --- js/src/ui/Balances/balances.js | 14 ++-- js/src/views/Accounts/accounts.js | 88 ++++--------------------- js/src/views/Application/application.js | 80 +++++++++++++++++++--- 3 files changed, 93 insertions(+), 89 deletions(-) diff --git a/js/src/ui/Balances/balances.js b/js/src/ui/Balances/balances.js index 09c81f35192..6a26558bbc6 100644 --- a/js/src/ui/Balances/balances.js +++ b/js/src/ui/Balances/balances.js @@ -7,12 +7,12 @@ import styles from './style.css'; export default class Balances extends Component { static contextTypes = { - api: React.PropTypes.object + api: PropTypes.object, + tokens: PropTypes.array } static propTypes = { address: PropTypes.string.isRequired, - tokens: PropTypes.array, onChange: PropTypes.func } @@ -20,7 +20,7 @@ export default class Balances extends Component { balances: [] } - componentWillMount () { + componentDidMount () { this.getBalances(); } @@ -64,13 +64,15 @@ export default class Balances extends Component { this.props.onChange(this.state.balances); } - getBalances () { + getBalances = () => { const api = this.context.api; - const calls = (this.props.tokens || []).map((token) => token.contract.balanceOf.call({}, [this.props.address])); + const calls = this.context.tokens.map((token) => token.contract.balanceOf.call({}, [this.props.address])); api.eth .getBalance(this.props.address) .then((balance) => { + setTimeout(this.getBalances, 2500); + const balances = [{ image: 'images/tokens/ethereum-32x32.png', token: 'ΞTH', @@ -83,7 +85,7 @@ export default class Balances extends Component { .then((tokenBalances) => { if (tokenBalances && tokenBalances.length) { tokenBalances.forEach((balance, idx) => { - const token = this.props.tokens[idx]; + const token = this.context.tokens[idx]; if (token) { balances.push({ diff --git a/js/src/views/Accounts/accounts.js b/js/src/views/Accounts/accounts.js index 3db22bc84e1..b330382dd65 100644 --- a/js/src/views/Accounts/accounts.js +++ b/js/src/views/Accounts/accounts.js @@ -1,10 +1,8 @@ import React, { Component } from 'react'; -import Api from '../../api'; import AccountSummary from './AccountSummary'; import Actions from './Actions'; import { CreateAccount } from '../../modals'; -import { eip20Abi, registryAbi, tokenRegAbi } from '../../services/abi'; import Tooltip from '../../ui/Tooltip'; import styles from './style.css'; @@ -16,7 +14,6 @@ export default class Accounts extends Component { state = { accounts: [], - tokens: [], newDialog: false } @@ -89,88 +86,29 @@ export default class Accounts extends Component { } const api = this.context.api; - let accounts = []; - const contracts = {}; - const tokens = []; Promise .all([ api.personal.listAccounts(), - api.personal.accountsInfo(), - api.ethcore.registryAddress() + api.personal.accountsInfo() ]) .then(([addresses, infos, registryAddress]) => { - accounts = addresses - .filter((address) => infos[address].uuid) - .map((address) => { - const info = infos[address]; - - return { - address: address, - name: info.name, - uuid: info.uuid, - meta: info.meta - }; - }); - - contracts.registry = api.newContract(registryAbi).at(registryAddress); - - return contracts.registry - .getAddress - .call({}, [Api.format.sha3('tokenreg'), 'A']); - }) - .then((tokenregAddress) => { - contracts.tokenreg = api.newContract(tokenRegAbi).at(tokenregAddress); - - return contracts.tokenreg - .tokenCount - .call(); - }) - .then((tokenCount) => { - const promises = []; - - while (promises.length < tokenCount.toNumber()) { - promises.push(contracts.tokenreg.token.call({}, [promises.length])); - } - - return Promise.all(promises); - }) - .then((_tokens) => { - return Promise.all(_tokens.map((token) => { - console.log(token[0], token[1], token[2].toFormat(), token[3]); - - const contract = api.newContract(eip20Abi).at(token[0]); - - tokens.push({ - address: token[0], - format: token[2].toString(), - image: `images/tokens/${token[3].toLowerCase()}-32x32.png`, - supply: '0', - token: token[1], - type: token[3], - contract - }); - - return contract.totalSupply.call(); - })); - }) - .then((supplies) => { - console.log('supplies', supplies.map((supply) => supply.toFormat())); - - supplies.forEach((supply, idx) => { - tokens[idx].supply = supply.toString(); - }); - this.setState({ - accounts, - contracts, - tokens + accounts: addresses + .filter((address) => infos[address].uuid) + .map((address) => { + const info = infos[address]; + + return { + address: address, + name: info.name, + uuid: info.uuid, + meta: info.meta + }; + }) }); setTimeout(() => this.retrieveAccounts(), 2500); - }) - .catch((error) => { - console.error(error); }); } } diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index 42a1346754a..bdf0bd38c46 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -5,6 +5,7 @@ import darkBaseTheme from 'material-ui/styles/baseThemes/darkBaseTheme'; import lightBaseTheme from 'material-ui/styles/baseThemes/lightBaseTheme'; import Api from '../../api'; +import { eip20Abi, registryAbi, tokenRegAbi } from '../../services/abi'; import { TooltipOverlay } from '../../ui/Tooltip'; import { FirstRun } from '../../modals'; @@ -29,8 +30,8 @@ muiTheme.toolbar.backgroundColor = 'rgb(80, 80, 80)'; export default class Application extends Component { static childContextTypes = { api: PropTypes.object, - muiTheme: PropTypes.object, - tooltips: PropTypes.object + tokens: PropTypes.array, + muiTheme: PropTypes.object } static propTypes = { @@ -39,7 +40,8 @@ export default class Application extends Component { state = { showFirst: false, - accounts: [] + accounts: [], + tokens: [] } componentWillMount () { @@ -63,19 +65,81 @@ export default class Application extends Component { getChildContext () { return { - api: api, - muiTheme: muiTheme + api, + tokens: this.state.tokens, + muiTheme }; } retrieveInfo () { - api.personal - .listAccounts() - .then((accounts) => { + const contracts = {}; + const tokens = []; + + Promise + .all([ + api.personal.listAccounts(), + api.ethcore.registryAddress() + ]) + .then(([accounts, registryAddress]) => { this.setState({ accounts, showFirst: accounts.length === 0 }); + + contracts.registry = api.newContract(registryAbi).at(registryAddress); + + return contracts.registry + .getAddress.call({}, [Api.format.sha3('tokenreg'), 'A']); + }) + .then((tokenregAddress) => { + contracts.tokenreg = api.newContract(tokenRegAbi).at(tokenregAddress); + + return contracts.tokenreg + .tokenCount.call(); + }) + .then((tokenCount) => { + const promises = []; + + while (promises.length < tokenCount.toNumber()) { + promises.push(contracts.tokenreg.token.call({}, [promises.length])); + } + + return Promise.all(promises); + }) + .then((_tokens) => { + return Promise + .all(_tokens.map((token) => { + console.log(token[0], token[1], token[2].toFormat(), token[3]); + + const contract = api.newContract(eip20Abi).at(token[0]); + + tokens.push({ + address: token[0], + format: token[2].toString(), + image: `images/tokens/${token[3].toLowerCase()}-32x32.png`, + supply: '0', + token: token[1], + type: token[3], + contract + }); + + return contract.totalSupply.call(); + })); + }) + .then((supplies) => { + console.log('supplies', supplies.map((supply) => supply.toFormat())); + + supplies.forEach((supply, idx) => { + tokens[idx].supply = supply.toString(); + }); + + this.setState({ + tokens, + contracts + }); + }) + .catch((error) => { + console.error(error); }); } From f99d4b05ade32c81f7611995c7402565feb3429f Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 18 Aug 2016 16:33:42 +0200 Subject: [PATCH 0121/1062] adjust number of decimals --- js/src/ui/Balances/balances.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/ui/Balances/balances.js b/js/src/ui/Balances/balances.js index 6a26558bbc6..1cb9dafc74e 100644 --- a/js/src/ui/Balances/balances.js +++ b/js/src/ui/Balances/balances.js @@ -29,8 +29,8 @@ export default class Balances extends Component { .filter((balance) => new BigNumber(balance.value).gt(0)) .map((balance) => { const value = balance.format - ? new BigNumber(balance.value).div(new BigNumber(balance.format)).toFormat() - : Api.format.fromWei(balance.value).toFormat(); + ? new BigNumber(balance.value).div(new BigNumber(balance.format)).toFormat(5) + : Api.format.fromWei(balance.value).toFormat(5); return ( <div className={ styles.balance } From 4e6d0371035a5de5c648f471f75f526dbb13f614 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 18 Aug 2016 16:39:14 +0200 Subject: [PATCH 0122/1062] monospaced font for value --- js/src/ui/Balances/balances.js | 2 +- js/src/ui/Balances/style.css | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/js/src/ui/Balances/balances.js b/js/src/ui/Balances/balances.js index 1cb9dafc74e..789a92a704a 100644 --- a/js/src/ui/Balances/balances.js +++ b/js/src/ui/Balances/balances.js @@ -38,7 +38,7 @@ export default class Balances extends Component { <img src={ balance.image } alt={ balance.type } /> - <div> + <div className={ styles.value }> { value } { balance.token } </div> </div> diff --git a/js/src/ui/Balances/style.css b/js/src/ui/Balances/style.css index 2952a4615ac..f7b323e27e7 100644 --- a/js/src/ui/Balances/style.css +++ b/js/src/ui/Balances/style.css @@ -19,3 +19,7 @@ display: inline-block; vertical-align: top; } + +.value { + font-family: monospace; +} From e3ca110af9998b85889c8f9ff93c29e3d41b29ed Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 18 Aug 2016 16:57:57 +0200 Subject: [PATCH 0123/1062] horizontal balance layouts, 3 balances per row --- js/src/ui/Balances/balances.js | 10 +++++----- js/src/ui/Balances/style.css | 10 ++++++---- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/js/src/ui/Balances/balances.js b/js/src/ui/Balances/balances.js index 789a92a704a..97bbded7232 100644 --- a/js/src/ui/Balances/balances.js +++ b/js/src/ui/Balances/balances.js @@ -29,18 +29,18 @@ export default class Balances extends Component { .filter((balance) => new BigNumber(balance.value).gt(0)) .map((balance) => { const value = balance.format - ? new BigNumber(balance.value).div(new BigNumber(balance.format)).toFormat(5) - : Api.format.fromWei(balance.value).toFormat(5); + ? new BigNumber(balance.value).div(new BigNumber(balance.format)).toFormat(3) + : Api.format.fromWei(balance.value).toFormat(3); return ( <div className={ styles.balance } key={ balance.token }> + <div> + { value } { balance.token } + </div> <img src={ balance.image } alt={ balance.type } /> - <div className={ styles.value }> - { value } { balance.token } - </div> </div> ); }); diff --git a/js/src/ui/Balances/style.css b/js/src/ui/Balances/style.css index f7b323e27e7..84aab8bc0a3 100644 --- a/js/src/ui/Balances/style.css +++ b/js/src/ui/Balances/style.css @@ -1,16 +1,21 @@ .balances { margin-top: 1em; + display: flex; + flex-wrap: wrap; } .balance { height: 32px; margin-top: 0.25em; + flex: 0 1 33%; + width: 33%; + text-align: right; } .balance img { - margin-right: 0.5em; height: 32px; width: 32px; + margin: 0 0.5em; } .balance div { @@ -18,8 +23,5 @@ line-height: 32px; display: inline-block; vertical-align: top; -} - -.value { font-family: monospace; } From 10e0aee81c4b779407180bdad75db27215706934 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 18 Aug 2016 17:59:47 +0200 Subject: [PATCH 0124/1062] move balance polling to application level (really should be done properly) --- js/src/ui/Balances/balances.js | 57 ++--------- js/src/views/Accounts/accounts.js | 76 ++++----------- js/src/views/Application/application.js | 121 ++++++++++++++++++------ 3 files changed, 115 insertions(+), 139 deletions(-) diff --git a/js/src/ui/Balances/balances.js b/js/src/ui/Balances/balances.js index 97bbded7232..0a576585a71 100644 --- a/js/src/ui/Balances/balances.js +++ b/js/src/ui/Balances/balances.js @@ -8,6 +8,7 @@ import styles from './style.css'; export default class Balances extends Component { static contextTypes = { api: PropTypes.object, + accounts: PropTypes.array, tokens: PropTypes.array } @@ -16,16 +17,14 @@ export default class Balances extends Component { onChange: PropTypes.func } - state = { - balances: [] - } + render () { + const account = this.context.accounts.find((acc) => acc.address === this.props.address); - componentDidMount () { - this.getBalances(); - } + if (!account) { + return null; + } - render () { - const balances = this.state.balances + const balances = account.balances .filter((balance) => new BigNumber(balance.value).gt(0)) .map((balance) => { const value = balance.format @@ -63,46 +62,4 @@ export default class Balances extends Component { this.props.onChange(this.state.balances); } - - getBalances = () => { - const api = this.context.api; - const calls = this.context.tokens.map((token) => token.contract.balanceOf.call({}, [this.props.address])); - - api.eth - .getBalance(this.props.address) - .then((balance) => { - setTimeout(this.getBalances, 2500); - - const balances = [{ - image: 'images/tokens/ethereum-32x32.png', - token: 'ΞTH', - type: 'Ethereum', - value: balance.toString() - }]; - - return Promise - .all(calls) - .then((tokenBalances) => { - if (tokenBalances && tokenBalances.length) { - tokenBalances.forEach((balance, idx) => { - const token = this.context.tokens[idx]; - - if (token) { - balances.push({ - format: token.format, - image: token.image, - token: token.token, - type: token.type, - value: balance.toString() - }); - } - }); - } - - this.setState({ - balances - }, this.updateParent); - }); - }); - } } diff --git a/js/src/views/Accounts/accounts.js b/js/src/views/Accounts/accounts.js index b330382dd65..76cc5005af8 100644 --- a/js/src/views/Accounts/accounts.js +++ b/js/src/views/Accounts/accounts.js @@ -9,24 +9,14 @@ import styles from './style.css'; export default class Accounts extends Component { static contextTypes = { - api: React.PropTypes.object + api: React.PropTypes.object, + accounts: React.PropTypes.array } state = { - accounts: [], newDialog: false } - componentDidMount () { - // TODO: we should be getting data from a provider - this._isMounted = true; - this.retrieveAccounts(); - } - - componentWillUnmount () { - this._isMounted = false; - } - render () { return ( <div> @@ -44,7 +34,7 @@ export default class Accounts extends Component { } renderAccounts () { - if (!this.state.accounts.length) { + if (!this.context.accounts.length) { return null; } @@ -54,19 +44,21 @@ export default class Accounts extends Component { text='your accounts are visible for easy access, allowing you to edit the meta information, make transfers, view transactions and fund the account' /> ); - return this.state.accounts.map((account, idx) => { - return ( - <div - className={ styles.account } - key={ account.address }> - <AccountSummary - account={ account } - tokens={ this.state.tokens }> - { idx === 0 ? firstTooltip : null } - </AccountSummary> - </div> - ); - }); + return this.context.accounts + .filter((acc) => acc.uuid) + .map((account, idx) => { + return ( + <div + className={ styles.account } + key={ account.address }> + <AccountSummary + account={ account } + tokens={ this.state.tokens }> + { idx === 0 ? firstTooltip : null } + </AccountSummary> + </div> + ); + }); } onNewAccountClick = () => { @@ -79,36 +71,4 @@ export default class Accounts extends Component { onNewAccountUpdate = () => { } - - retrieveAccounts () { - if (!this._isMounted) { - return; - } - - const api = this.context.api; - - Promise - .all([ - api.personal.listAccounts(), - api.personal.accountsInfo() - ]) - .then(([addresses, infos, registryAddress]) => { - this.setState({ - accounts: addresses - .filter((address) => infos[address].uuid) - .map((address) => { - const info = infos[address]; - - return { - address: address, - name: info.name, - uuid: info.uuid, - meta: info.meta - }; - }) - }); - - setTimeout(() => this.retrieveAccounts(), 2500); - }); - } } diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index bdf0bd38c46..ea029c4e491 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -30,6 +30,7 @@ muiTheme.toolbar.backgroundColor = 'rgb(80, 80, 80)'; export default class Application extends Component { static childContextTypes = { api: PropTypes.object, + accounts: PropTypes.array, tokens: PropTypes.array, muiTheme: PropTypes.object } @@ -45,7 +46,8 @@ export default class Application extends Component { } componentWillMount () { - this.retrieveInfo(); + this.retrieveBalances(); + this.retrieveTokens(); } render () { @@ -66,26 +68,88 @@ export default class Application extends Component { getChildContext () { return { api, + accounts: this.state.accounts, tokens: this.state.tokens, muiTheme }; } - retrieveInfo () { - const contracts = {}; - const tokens = []; + retrieveBalances = () => { + const accounts = []; Promise .all([ api.personal.listAccounts(), - api.ethcore.registryAddress() + api.personal.accountsInfo() ]) - .then(([accounts, registryAddress]) => { + .then(([addresses, infos]) => { + return Promise.all(addresses.map((address) => { + const info = infos[address]; + + accounts.push({ + address: address, + balances: [], + name: info.name, + uuid: info.uuid, + meta: info.meta + }); + + return api.eth.getBalance(address); + })); + }) + .then((balances) => { + const promises = []; + + balances.forEach((balance, idx) => { + accounts[idx].balances.push({ + image: 'images/tokens/ethereum-32x32.png', + token: 'ΞTH', + type: 'Ethereum', + value: balance.toString() + }); + + this.state.tokens.forEach((token) => { + promises.push(token.contract.balanceOf.call({}, [accounts[idx].address])); + }); + }); + + return Promise.all(promises); + }) + .then((balances) => { + let idx = 0; + + accounts.forEach((account) => { + this.state.tokens.forEach((token) => { + const balance = balances[idx]; + + account.balances.push({ + format: token.format, + image: token.image, + token: token.token, + type: token.type, + value: balance.toString() + }); + + idx++; + }); + }); + this.setState({ accounts, showFirst: accounts.length === 0 }); + setTimeout(this.retrieveBalances, 2000); + }); + } + + retrieveTokens = () => { + const contracts = {}; + const tokens = []; + + api.ethcore + .registryAddress() + .then((registryAddress) => { contracts.registry = api.newContract(registryAbi).at(registryAddress); return contracts.registry @@ -94,8 +158,7 @@ export default class Application extends Component { .then((tokenregAddress) => { contracts.tokenreg = api.newContract(tokenRegAbi).at(tokenregAddress); - return contracts.tokenreg - .tokenCount.call(); + return contracts.tokenreg.tokenCount.call(); }) .then((tokenCount) => { const promises = []; @@ -107,24 +170,23 @@ export default class Application extends Component { return Promise.all(promises); }) .then((_tokens) => { - return Promise - .all(_tokens.map((token) => { - console.log(token[0], token[1], token[2].toFormat(), token[3]); - - const contract = api.newContract(eip20Abi).at(token[0]); - - tokens.push({ - address: token[0], - format: token[2].toString(), - image: `images/tokens/${token[3].toLowerCase()}-32x32.png`, - supply: '0', - token: token[1], - type: token[3], - contract - }); - - return contract.totalSupply.call(); - })); + return Promise.all(_tokens.map((token) => { + console.log(token[0], token[1], token[2].toFormat(), token[3]); + + const contract = api.newContract(eip20Abi).at(token[0]); + + tokens.push({ + address: token[0], + format: token[2].toString(), + image: `images/tokens/${token[3].toLowerCase()}-32x32.png`, + supply: '0', + token: token[1], + type: token[3], + contract + }); + + return contract.totalSupply.call(); + })); }) .then((supplies) => { console.log('supplies', supplies.map((supply) => supply.toFormat())); @@ -134,12 +196,9 @@ export default class Application extends Component { }); this.setState({ - tokens, - contracts + contracts, + tokens }); - }) - .catch((error) => { - console.error(error); }); } From 89085f536a3c23f1f217be4407e3ee46a1d80409 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 18 Aug 2016 18:25:46 +0200 Subject: [PATCH 0125/1062] don't display messy to addresses when the actual to is empty --- js/src/views/Account/Transactions/transactions.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/js/src/views/Account/Transactions/transactions.js b/js/src/views/Account/Transactions/transactions.js index 685d6bb788e..132e52b8010 100644 --- a/js/src/views/Account/Transactions/transactions.js +++ b/js/src/views/Account/Transactions/transactions.js @@ -67,6 +67,13 @@ export default class Transactions extends Component { const fromLink = `https://etherscan.io/address/${tx.from}`; const toLink = `https://etherscan.io/address/${tx.to}`; + const tosection = (tx.to && tx.to.length) + ? (<td className={ styles.center }> + <IdentityIcon inline center address={ tx.to } /> + <a href={ toLink } target='_blank'>{ formatHash(tx.to) }</a> + </td>) + : (<td className={ `${styles.center}` }></td>); + return ( <tr key={ tx.hash }> <td className={ styles.center }></td> @@ -74,10 +81,7 @@ export default class Transactions extends Component { <IdentityIcon inline center address={ tx.from } /> <a href={ fromLink } target='_blank'>{ formatHash(tx.from) }</a> </td> - <td className={ styles.center }> - <IdentityIcon inline center address={ tx.to } /> - <a href={ toLink } target='_blank'>{ formatHash(tx.to) }</a> - </td> + { tosection } <td className={ styles.center }> <a href={ hashLink } target='_blank'>{ formatHash(tx.hash) }</a> </td> @@ -97,7 +101,7 @@ export default class Transactions extends Component { return ( <table className={ styles.transactions }> <thead> - <tr> + <tr className={ styles.info }> <th> </th> <th>from</th> <th>to</th> From 5c4d68fe2f145bd87fde2475eedb08b801934ea3 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 18 Aug 2016 19:14:32 +0200 Subject: [PATCH 0126/1062] selection of transfer token type for the transaction dialog --- js/src/modals/Transfer/Details/details.js | 51 ++++++++++++++++++++-- js/src/modals/Transfer/style.css | 18 ++++++++ js/src/modals/Transfer/transfer.js | 12 +++++ js/src/ui/Balances/balances.js | 14 +++--- js/src/ui/Form/Input/input.js | 9 ++-- js/src/ui/Form/Select/index.js | 1 + js/src/ui/Form/Select/select.js | 53 +++++++++++++++++++++++ js/src/ui/Form/index.js | 3 +- js/src/views/Application/application.js | 15 ++++--- 9 files changed, 154 insertions(+), 22 deletions(-) create mode 100644 js/src/ui/Form/Select/index.js create mode 100644 js/src/ui/Form/Select/select.js diff --git a/js/src/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js index 51c59872d9c..54581f9d033 100644 --- a/js/src/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -1,10 +1,10 @@ import React, { Component, PropTypes } from 'react'; -import { Checkbox, FloatingActionButton } from 'material-ui'; +import { Checkbox, FloatingActionButton, MenuItem } from 'material-ui'; import CommunicationContacts from 'material-ui/svg-icons/communication/contacts'; import AddressSelector from '../../AddressSelector'; -import Form, { Input } from '../../../ui/Form'; +import Form, { Input, Select } from '../../../ui/Form'; import styles from '../style.css'; @@ -16,14 +16,17 @@ const CHECK_STYLE = { export default class Details extends Component { static contextTypes = { - api: PropTypes.object.isRequired + api: PropTypes.object.isRequired, + accounts: PropTypes.array } static propTypes = { + address: PropTypes.string, all: PropTypes.bool, extras: PropTypes.bool, recipient: PropTypes.string, recipientError: PropTypes.string, + token: PropTypes.string, total: PropTypes.string, totalError: PropTypes.string, value: PropTypes.string, @@ -36,8 +39,11 @@ export default class Details extends Component { } render () { + const label = `amount to transfer (in ${this.props.token})`; + return ( <Form> + { this.renderTokenSelect() } <AddressSelector onSelect={ this.onSelectRecipient } visible={ this.state.showAddresses } /> @@ -60,7 +66,7 @@ export default class Details extends Component { <div> <Input disabled={ this.props.all } - label='amount to transfer (in ΞTH)' + label={ label } hint='the amount to transfer to the recipient' value={ this.props.value } onChange={ this.onEditValue } /> @@ -94,6 +100,43 @@ export default class Details extends Component { ); } + renderTokenSelect () { + const account = this.context.accounts.find((acc) => acc.address === this.props.address); + const items = account.balances.map((balance) => { + const token = balance.token; + const label = ( + <div className={ styles.token }> + <img src={ token.image } /> + <div>{ token.type }</div> + </div> + ); + + return ( + <MenuItem + key={ token.token } + primaryText={ token.type } + value={ token.token } + label={ label } + leftIcon={ <img src={ token.image } /> } /> + ); + }); + + return ( + <Select + label='type of transfer' + hint='type of token to transfer' + value={ this.props.token } + onChange={ this.onChangeToken }> + { items } + </Select> + ); + } + + onChangeToken = (event, value) => { + const account = this.context.accounts.find((acc) => acc.address === this.props.address); + this.props.onChange('token', account.balances[value].token.token); + } + onSelectRecipient = (recipient) => { this.setState({ showAddresses: false }); this.props.onChange('recipient', recipient); diff --git a/js/src/modals/Transfer/style.css b/js/src/modals/Transfer/style.css index feb8b9a6826..90ff64f49f3 100644 --- a/js/src/modals/Transfer/style.css +++ b/js/src/modals/Transfer/style.css @@ -26,3 +26,21 @@ .floatbutton>div { margin-right: 0.5em; } + +.token { + height: 32px; + margin-top: 14px; +} + +.token img { + height: 32px; + width: 32px; + margin: 0 0.5em; +} + +.token div { + height: 32px; + line-height: 32px; + display: inline-block; + vertical-align: top; +} diff --git a/js/src/modals/Transfer/transfer.js b/js/src/modals/Transfer/transfer.js index 18ba8fa06e2..3d610401370 100644 --- a/js/src/modals/Transfer/transfer.js +++ b/js/src/modals/Transfer/transfer.js @@ -49,6 +49,7 @@ export default class Transfer extends Component { recipient: '', recipientError: ERRORS.requireRecipient, sending: false, + token: 'ΞTH', total: '0.0', totalError: null, value: '0.0', @@ -77,10 +78,12 @@ export default class Transfer extends Component { case 0: return ( <Details + address={ this.props.address } all={ this.state.valueAll } extras={ this.state.extras } recipient={ this.state.recipient } recipientError={ this.state.recipientError } + token={ this.state.token } total={ this.state.total } totalError={ this.state.totalError } value={ this.state.value } @@ -252,6 +255,12 @@ export default class Transfer extends Component { }); } + _onUpdateToken (token) { + this.setState({ + token + }); + } + _onUpdateValue (value) { const valueError = this.validatePositiveNumber(value); @@ -281,6 +290,9 @@ export default class Transfer extends Component { case 'recipient': return this._onUpdateRecipient(value); + case 'token': + return this._onUpdateToken(value); + case 'value': return this._onUpdateValue(value); } diff --git a/js/src/ui/Balances/balances.js b/js/src/ui/Balances/balances.js index 0a576585a71..dcff46f913e 100644 --- a/js/src/ui/Balances/balances.js +++ b/js/src/ui/Balances/balances.js @@ -27,19 +27,21 @@ export default class Balances extends Component { const balances = account.balances .filter((balance) => new BigNumber(balance.value).gt(0)) .map((balance) => { - const value = balance.format - ? new BigNumber(balance.value).div(new BigNumber(balance.format)).toFormat(3) + const token = balance.token; + const value = token.format + ? new BigNumber(balance.value).div(new BigNumber(token.format)).toFormat(3) : Api.format.fromWei(balance.value).toFormat(3); + return ( <div className={ styles.balance } - key={ balance.token }> + key={ token.token }> <div> - { value } { balance.token } + { value } { token.token } </div> <img - src={ balance.image } - alt={ balance.type } /> + src={ token.image } + alt={ token.type } /> </div> ); }); diff --git a/js/src/ui/Form/Input/input.js b/js/src/ui/Form/Input/input.js index 305898324c0..876b4aff596 100644 --- a/js/src/ui/Form/Input/input.js +++ b/js/src/ui/Form/Input/input.js @@ -2,6 +2,7 @@ import React, { Component, PropTypes } from 'react'; import { TextField } from 'material-ui'; +// TODO: duplicated in Select const UNDERLINE_DISABLED = { borderColor: 'rgba(255, 255, 255, 0.298039)' // 'transparent' // 'rgba(255, 255, 255, 0.298039)' }; @@ -10,6 +11,8 @@ const UNDERLINE_NORMAL = { borderBottom: 'solid 2px' }; +const NAME_ID = ' '; + export default class Input extends Component { static propTypes = { children: PropTypes.node, @@ -29,8 +32,6 @@ export default class Input extends Component { } render () { - const nameid = ' '; - return ( <TextField autoComplete='off' @@ -41,8 +42,8 @@ export default class Input extends Component { fullWidth hintText={ this.props.hint } multiLine={ this.props.multiLine } - name={ nameid } - id={ nameid } + name={ NAME_ID } + id={ NAME_ID } rows={ this.props.rows } type={ this.props.type || 'text' } underlineDisabledStyle={ UNDERLINE_DISABLED } diff --git a/js/src/ui/Form/Select/index.js b/js/src/ui/Form/Select/index.js new file mode 100644 index 00000000000..826d94545dd --- /dev/null +++ b/js/src/ui/Form/Select/index.js @@ -0,0 +1 @@ +export default from './select'; diff --git a/js/src/ui/Form/Select/select.js b/js/src/ui/Form/Select/select.js new file mode 100644 index 00000000000..107436117c1 --- /dev/null +++ b/js/src/ui/Form/Select/select.js @@ -0,0 +1,53 @@ +import React, { Component, PropTypes } from 'react'; +import { SelectField } from 'material-ui'; + +// TODO: duplicated in Input +const UNDERLINE_DISABLED = { + borderColor: 'rgba(255, 255, 255, 0.298039)' // 'transparent' // 'rgba(255, 255, 255, 0.298039)' +}; + +const UNDERLINE_NORMAL = { + borderBottom: 'solid 2px' +}; + +const NAME_ID = ' '; + +export default class Select extends Component { + static propTypes = { + children: PropTypes.node, + disabled: PropTypes.bool, + error: PropTypes.string, + hint: PropTypes.string, + label: PropTypes.string, + onBlur: PropTypes.func, + onChange: PropTypes.func, + onKeyDown: PropTypes.func, + type: PropTypes.string, + value: PropTypes.oneOfType([ + PropTypes.number, PropTypes.string + ]) + } + + render () { + return ( + <SelectField + autoComplete='off' + disabled={ this.props.disabled } + errorText={ this.props.error } + floatingLabelFixed + floatingLabelText={ this.props.label } + fullWidth + hintText={ this.props.hint } + name={ NAME_ID } + id={ NAME_ID } + underlineDisabledStyle={ UNDERLINE_DISABLED } + underlineStyle={ UNDERLINE_NORMAL } + value={ this.props.value } + onBlur={ this.props.onBlur } + onChange={ this.props.onChange } + onKeyDown={ this.props.onKeyDown }> + { this.props.children } + </SelectField> + ); + } +} diff --git a/js/src/ui/Form/index.js b/js/src/ui/Form/index.js index beb71f536d3..ad7dc96ae71 100644 --- a/js/src/ui/Form/index.js +++ b/js/src/ui/Form/index.js @@ -1,6 +1,7 @@ import FormWrap from './FormWrap'; import Input from './Input'; import InputInline from './InputInline'; +import Select from './Select'; export default from './form'; -export { FormWrap, Input, InputInline }; +export { FormWrap, Input, InputInline, Select }; diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index ea029c4e491..f4bc031ae5b 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -27,6 +27,12 @@ muiTheme.textField.disabledTextColor = muiTheme.textField.textColor; muiTheme.toolbar = lightTheme.toolbar; muiTheme.toolbar.backgroundColor = 'rgb(80, 80, 80)'; +const ETH_TOKEN = { + image: 'images/tokens/ethereum-32x32.png', + token: 'ΞTH', + type: 'Ethereum' +}; + export default class Application extends Component { static childContextTypes = { api: PropTypes.object, @@ -102,9 +108,7 @@ export default class Application extends Component { balances.forEach((balance, idx) => { accounts[idx].balances.push({ - image: 'images/tokens/ethereum-32x32.png', - token: 'ΞTH', - type: 'Ethereum', + token: ETH_TOKEN, value: balance.toString() }); @@ -123,10 +127,7 @@ export default class Application extends Component { const balance = balances[idx]; account.balances.push({ - format: token.format, - image: token.image, - token: token.token, - type: token.type, + token, value: balance.toString() }); From 4036ddc4dad629ba7acc97856143ce8cd8d1754f Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 18 Aug 2016 23:05:12 +0200 Subject: [PATCH 0127/1062] transfer of tokens in-place, seems to do the trick, may be wonky --- js/src/api/contract/contract.js | 2 + .../modals/AddressSelector/addressSelector.js | 7 +- js/src/modals/FundAccount/fundAccount.js | 3 +- js/src/modals/Transfer/Details/details.js | 80 ++++-- js/src/modals/Transfer/Extras/extras.js | 38 ++- js/src/modals/Transfer/style.css | 20 +- js/src/modals/Transfer/transfer.js | 236 +++++++++++------- js/src/ui/Balances/balances.js | 18 +- js/src/ui/IdentityIcon/identityIcon.js | 10 +- js/src/views/Account/account.js | 50 +++- .../Accounts/AccountSummary/accountSummary.js | 7 +- js/src/views/Accounts/accounts.js | 2 +- js/src/views/Application/application.js | 8 +- 13 files changed, 316 insertions(+), 165 deletions(-) diff --git a/js/src/api/contract/contract.js b/js/src/api/contract/contract.js index d4668050961..2160c7e05ff 100644 --- a/js/src/api/contract/contract.js +++ b/js/src/api/contract/contract.js @@ -57,6 +57,8 @@ export default class Contract { at (address) { this._address = address; + this._named.address = address; + return this._named; } diff --git a/js/src/modals/AddressSelector/addressSelector.js b/js/src/modals/AddressSelector/addressSelector.js index 9c687115e8b..8a945b13eac 100644 --- a/js/src/modals/AddressSelector/addressSelector.js +++ b/js/src/modals/AddressSelector/addressSelector.js @@ -13,8 +13,7 @@ export default class AddressSelector extends Component { } static propTypes = { - onSelect: PropTypes.func.isRequired, - visible: PropTypes.bool + onSelect: PropTypes.func.isRequired } state = { @@ -30,8 +29,8 @@ export default class AddressSelector extends Component { return ( <Modal scroll - actions={ this.renderDialogActions() } - visible={ this.props.visible }> + visible + actions={ this.renderDialogActions() }> { this.renderAccounts('accounts') } { this.renderAccounts('contacts') } </Modal> diff --git a/js/src/modals/FundAccount/fundAccount.js b/js/src/modals/FundAccount/fundAccount.js index aa34f90fc61..b79f6650f9d 100644 --- a/js/src/modals/FundAccount/fundAccount.js +++ b/js/src/modals/FundAccount/fundAccount.js @@ -10,7 +10,6 @@ const STAGE_NAMES = ['fund account']; export default class FundAccount extends Component { static propTypes = { address: PropTypes.string.isRequired, - visible: PropTypes.bool.isRequired, onClose: PropTypes.func } @@ -24,7 +23,7 @@ export default class FundAccount extends Component { actions={ this.renderDialogActions() } current={ this.state.stage } steps={ STAGE_NAMES } - visible={ this.props.visible }> + visible> <div> Placeholder until such time as we have the ShapeShift.io integration going (just time, a scarce commodity) </div> diff --git a/js/src/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js index 54581f9d033..ffa38a31c66 100644 --- a/js/src/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -5,6 +5,7 @@ import CommunicationContacts from 'material-ui/svg-icons/communication/contacts' import AddressSelector from '../../AddressSelector'; import Form, { Input, Select } from '../../../ui/Form'; +import IdentityIcon from '../../../ui/IdentityIcon'; import styles from '../style.css'; @@ -26,7 +27,7 @@ export default class Details extends Component { extras: PropTypes.bool, recipient: PropTypes.string, recipientError: PropTypes.string, - token: PropTypes.string, + tag: PropTypes.string, total: PropTypes.string, totalError: PropTypes.string, value: PropTypes.string, @@ -39,29 +40,13 @@ export default class Details extends Component { } render () { - const label = `amount to transfer (in ${this.props.token})`; + const label = `amount to transfer (in ${this.props.tag})`; return ( <Form> { this.renderTokenSelect() } - <AddressSelector - onSelect={ this.onSelectRecipient } - visible={ this.state.showAddresses } /> - <div> - <Input - label='recipient address' - hint='the recipient address' - error={ this.props.recipientError } - value={ this.props.recipient } - onChange={ this.onEditRecipient } /> - <div className={ styles.floatbutton }> - <FloatingActionButton - primary mini - onTouchTap={ this.onContacts }> - <CommunicationContacts /> - </FloatingActionButton> - </div> - </div> + { this.renderAddressSelect() } + { this.renderAddress() } <div className={ styles.columns }> <div> <Input @@ -69,6 +54,7 @@ export default class Details extends Component { label={ label } hint='the amount to transfer to the recipient' value={ this.props.value } + error={ this.props.valueError } onChange={ this.onEditValue } /> </div> <div> @@ -83,7 +69,7 @@ export default class Details extends Component { <div> <Input disabled - label='total amount' + label='total transaction amount' hint='the total amount of the transaction' error={ this.props.totalError } value={ `${this.props.total} ΞTH` } /> @@ -100,6 +86,50 @@ export default class Details extends Component { ); } + renderAddress () { + const iconClass = this.props.recipientError + ? `${styles.floatimg} ${styles.grayscale}` + : styles.floatimg; + + const iconAddress = this.props.recipientError + ? '0x00' + : this.props.recipient; + + return ( + <div className={ styles.address }> + <Input + label='recipient address' + hint='the recipient address' + error={ this.props.recipientError } + value={ this.props.recipient } + onChange={ this.onEditRecipient } /> + <div className={ iconClass }> + <IdentityIcon + inline center + address={ iconAddress } /> + </div> + <div className={ styles.floatbutton }> + <FloatingActionButton + primary mini + onTouchTap={ this.onContacts }> + <CommunicationContacts /> + </FloatingActionButton> + </div> + </div> + ); + } + + renderAddressSelect () { + if (!this.state.showAddresses) { + return null; + } + + return ( + <AddressSelector + onSelect={ this.onSelectRecipient } /> + ); + } + renderTokenSelect () { const account = this.context.accounts.find((acc) => acc.address === this.props.address); const items = account.balances.map((balance) => { @@ -113,9 +143,9 @@ export default class Details extends Component { return ( <MenuItem - key={ token.token } + key={ token.tag } primaryText={ token.type } - value={ token.token } + value={ token.tag } label={ label } leftIcon={ <img src={ token.image } /> } /> ); @@ -125,7 +155,7 @@ export default class Details extends Component { <Select label='type of transfer' hint='type of token to transfer' - value={ this.props.token } + value={ this.props.tag } onChange={ this.onChangeToken }> { items } </Select> @@ -134,7 +164,7 @@ export default class Details extends Component { onChangeToken = (event, value) => { const account = this.context.accounts.find((acc) => acc.address === this.props.address); - this.props.onChange('token', account.balances[value].token.token); + this.props.onChange('tag', account.balances[value].token.tag); } onSelectRecipient = (recipient) => { diff --git a/js/src/modals/Transfer/Extras/extras.js b/js/src/modals/Transfer/Extras/extras.js index b65c8888599..0028f5d8c07 100644 --- a/js/src/modals/Transfer/Extras/extras.js +++ b/js/src/modals/Transfer/Extras/extras.js @@ -6,9 +6,11 @@ import styles from '../style.css'; export default class Extras extends Component { static propTypes = { + isEth: PropTypes.bool, extraData: PropTypes.string, extraDataError: PropTypes.string, gas: PropTypes.string, + gasEst: PropTypes.string, gasError: PropTypes.string, gasPrice: PropTypes.string, gasPriceError: PropTypes.string, @@ -18,21 +20,17 @@ export default class Extras extends Component { } render () { + const gasLabel = this.props.isEth + ? 'gas amount' + : `gas amount (estimated: ${this.props.gasEst})`; + return ( <Form> - <div> - <Input - hint='the extraData to pass through with the transaction' - label='transaction extraData' - multiLine - rows={ 1 } - value={ this.props.extraData } - onChange={ this.onEditExtraData } /> - </div> + { this.renderExtraData() } <div className={ styles.columns }> <div> <Input - label='gas amount' + label={ gasLabel } hint='the amount of gas to use for the transaction' error={ this.props.gasError } value={ this.props.gas } @@ -51,7 +49,7 @@ export default class Extras extends Component { <div> <Input disabled - label='total amount' + label='total transaction amount' hint='the total amount of the transaction' error={ this.props.totalError } value={ `${this.props.total} ΞTH` } /> @@ -61,6 +59,24 @@ export default class Extras extends Component { ); } + renderExtraData () { + if (!this.props.isEth) { + return null; + } + + return ( + <div> + <Input + hint='the extraData to pass through with the transaction' + label='transaction extraData' + multiLine + rows={ 1 } + value={ this.props.extraData } + onChange={ this.onEditExtraData } /> + </div> + ); + } + onEditGas = (event) => { this.props.onChange('gas', event.target.value); } diff --git a/js/src/modals/Transfer/style.css b/js/src/modals/Transfer/style.css index 90ff64f49f3..9fd85dda90b 100644 --- a/js/src/modals/Transfer/style.css +++ b/js/src/modals/Transfer/style.css @@ -35,7 +35,8 @@ .token img { height: 32px; width: 32px; - margin: 0 0.5em; + margin: 0 8px 0 0; + z-index: 10; } .token div { @@ -44,3 +45,20 @@ display: inline-block; vertical-align: top; } + +.address input { + padding-left: 40px !important; +} + +.floatimg { + float: left; + margin-right: -100%; + margin-top: 34px; + z-index: 10; +} + +.grayscale { + -webkit-filter: grayscale(1); + filter: grayscale(1); + opacity: 0.75; +} diff --git a/js/src/modals/Transfer/transfer.js b/js/src/modals/Transfer/transfer.js index 3d610401370..8e3c51558a1 100644 --- a/js/src/modals/Transfer/transfer.js +++ b/js/src/modals/Transfer/transfer.js @@ -16,6 +16,7 @@ import Extras from './Extras'; import ERRORS from './errors'; const DEFAULT_GAS = '21000'; +const CONTRACT_GAS = '100000'; const DEFAULT_GASPRICE = '20000000000'; const TITLES = { transfer: 'transfer details', @@ -31,9 +32,7 @@ export default class Transfer extends Component { } static propTypes = { - address: PropTypes.string.isRequired, - balance: PropTypes.object, - visible: PropTypes.bool.isRequired, + account: PropTypes.object, onClose: PropTypes.func } @@ -43,18 +42,20 @@ export default class Transfer extends Component { extraDataError: null, extras: false, gas: DEFAULT_GAS, + gasEst: '0', gasError: null, gasPrice: DEFAULT_GASPRICE, gasPriceError: null, recipient: '', recipientError: ERRORS.requireRecipient, sending: false, - token: 'ΞTH', + tag: 'ΞTH', total: '0.0', totalError: null, value: '0.0', valueAll: false, - valueError: null + valueError: null, + isEth: true } componentDidMount () { @@ -67,51 +68,61 @@ export default class Transfer extends Component { actions={ this.renderDialogActions() } current={ this.state.stage } steps={ this.state.extras ? STAGES_EXTRA : STAGES_BASIC } - visible={ this.props.visible }> + visible> { this.renderPage() } </Modal> ); } renderPage () { - switch (this.state.stage) { - case 0: - return ( - <Details - address={ this.props.address } - all={ this.state.valueAll } - extras={ this.state.extras } - recipient={ this.state.recipient } - recipientError={ this.state.recipientError } - token={ this.state.token } - total={ this.state.total } - totalError={ this.state.totalError } - value={ this.state.value } - valueError={ this.state.valueError } - onChange={ this.onUpdateDetails } /> - ); - - default: - if (this.state.stage === 1 && this.state.extras) { - return ( - <Extras - extraData={ this.state.extraData } - gas={ this.state.gas } - gasError={ this.state.gasError } - gasPrice={ this.state.gasPrice } - gasPriceError={ this.state.gasPriceError } - total={ this.state.total } - totalError={ this.state.totalError } - onChange={ this.onUpdateDetails } /> - ); - } - - return ( - <Complete - sending={ this.state.sending } - txhash={ this.state.txhash } /> - ); + if (this.state.stage === 0) { + return this.renderDetailsPage(); + } else if (this.state.stage === 1 && this.state.extras) { + return this.renderExtrasPage(); } + + return this.renderCompletePage(); + } + + renderCompletePage () { + return ( + <Complete + sending={ this.state.sending } + txhash={ this.state.txhash } /> + ); + } + + renderDetailsPage () { + return ( + <Details + address={ this.props.account.address } + all={ this.state.valueAll } + extras={ this.state.extras } + recipient={ this.state.recipient } + recipientError={ this.state.recipientError } + tag={ this.state.tag } + total={ this.state.total } + totalError={ this.state.totalError } + value={ this.state.value } + valueError={ this.state.valueError } + onChange={ this.onUpdateDetails } /> + ); + } + + renderExtrasPage () { + return ( + <Extras + isEth={ this.state.isEth } + extraData={ this.state.extraData } + gas={ this.state.gas } + gasEst={ this.state.gasEst } + gasError={ this.state.gasError } + gasPrice={ this.state.gasPrice } + gasPriceError={ this.state.gasPriceError } + total={ this.state.total } + totalError={ this.state.totalError } + onChange={ this.onUpdateDetails } /> + ); } renderDialogActions () { @@ -255,10 +266,11 @@ export default class Transfer extends Component { }); } - _onUpdateToken (token) { + _onUpdateTag (tag) { this.setState({ - token - }); + tag, + isEth: tag === this.props.account.balances[0].token.tag + }, this.recalculateGas); } _onUpdateValue (value) { @@ -290,53 +302,50 @@ export default class Transfer extends Component { case 'recipient': return this._onUpdateRecipient(value); - case 'token': - return this._onUpdateToken(value); + case 'tag': + return this._onUpdateTag(value); case 'value': return this._onUpdateValue(value); } } - onSend = () => { - this.onNext(); - - this.setState({ - sending: true - }); - - this.context.api.eth + _sendEth () { + return this.context.api.eth .sendTransaction({ - from: this.props.address, + from: this.props.account.address, to: this.state.recipient, gas: this.state.gas, gasPrice: this.state.gasPrice, value: Api.format.toWei(this.state.value) - }) - .then((txhash) => { - console.log('transaction', txhash); - this.setState({ - sending: false, - txhash: txhash - }); - }) - .catch((error) => { - console.error(error); }); } - onChangeDetails = (valid, { value, recipient, total, extras }) => { - this.setState({ - value, - extras, - recipient, - total - }); + _sendToken () { + const token = this.props.account.balances.find((balance) => balance.token.tag === this.state.tag).token; + + return token.contract.transfer + .sendTransaction({ + from: this.props.account.address, + to: token.address + }, [ + this.state.recipient, + new BigNumber(this.state.value).mul(token.format).toString() + ]); } - onChangePassword = (valid, { password }) => { + onSend = () => { + this.onNext(); this.setState({ - password + sending: true + }, () => { + (this.state.isEth ? this._sendEth() : this._sendToken()).then((txhash) => { + console.log('transaction', txhash); + this.setState({ + sending: false, + txhash: txhash + }); + }); }); } @@ -348,28 +357,79 @@ export default class Transfer extends Component { }); } + recalculateGas = () => { + const token = this.props.account.balances.find((balance) => balance.token.tag === this.state.tag).token; + + if (this.state.isEth) { + return this.setState({ + gas: DEFAULT_GAS + }, this.recalculate); + } + + token.contract.transfer + .estimateGas({ + from: this.props.account.address, + to: token.address + }, [ + this.state.recipient, + new BigNumber(this.state.value).mul(token.format).toString() + ]) + .then((gas) => { + this.setState({ + gas: gas.add(CONTRACT_GAS).toString(), + gasEst: gas.toFormat() + }, this.recalculate); + }); + } + recalculate = () => { + if (!this.props.account) { + return; + } + + const gasTotal = new BigNumber(this.state.gasPrice || 0).mul(new BigNumber(this.state.gas || 0)); + const balances = this.props.account.balances; + const balance = balances.find((balance) => this.state.tag === balance.token.tag); + const availableEth = new BigNumber(balances[0].value); + const available = new BigNumber(balance.value); + const format = new BigNumber(balance.token.format || 1); + let value = this.state.value; - const gas = new BigNumber(this.state.gasPrice || 0).mul(new BigNumber(this.state.gas || 0)); - const balance = new BigNumber(this.props.balance.value || 0); + let valueError = this.state.valueError; + let totalEth = gasTotal; + let totalError = null; if (this.state.valueAll) { - const bn = Api.format.fromWei(balance.minus(gas)); - value = bn.lt(0) ? '0.0' : bn.toString(); + let bn; + + if (this.state.isEth) { + bn = Api.format.fromWei(availableEth.minus(gasTotal)); + } else { + bn = available.div(format); + } + + value = (bn.lt(0) ? new BigNumber(0.0) : bn).toString(); } - const amount = Api.format.toWei(value || 0); - const total = amount.plus(gas); - let totalError = null; + if (this.state.isEth) { + totalEth = totalEth.plus(Api.format.toWei(value || 0)); + } - if (total.gt(balance)) { + if (new BigNumber(value || 0).gt(available.div(format))) { + valueError = ERRORS.largeAmount; + } else if (valueError === ERRORS.largeAmount) { + valueError = null; + } + + if (totalEth.gt(availableEth)) { totalError = ERRORS.largeAmount; } this.setState({ - total: Api.format.fromWei(total).toString(), + total: Api.format.fromWei(totalEth).toString(), totalError, - value + value, + valueError }); } @@ -378,9 +438,9 @@ export default class Transfer extends Component { api.eth .gasPrice() - .then((gasprice) => { + .then((gasPrice) => { this.setState({ - gasprice: gasprice.toString() + gasPrice: gasPrice.toString() }, this.recalculate); }); } diff --git a/js/src/ui/Balances/balances.js b/js/src/ui/Balances/balances.js index dcff46f913e..157765d297f 100644 --- a/js/src/ui/Balances/balances.js +++ b/js/src/ui/Balances/balances.js @@ -6,25 +6,17 @@ import Api from '../../api'; import styles from './style.css'; export default class Balances extends Component { - static contextTypes = { - api: PropTypes.object, - accounts: PropTypes.array, - tokens: PropTypes.array - } - static propTypes = { - address: PropTypes.string.isRequired, + account: PropTypes.object, onChange: PropTypes.func } render () { - const account = this.context.accounts.find((acc) => acc.address === this.props.address); - - if (!account) { + if (!this.props.account) { return null; } - const balances = account.balances + const balances = this.props.account.balances .filter((balance) => new BigNumber(balance.value).gt(0)) .map((balance) => { const token = balance.token; @@ -35,9 +27,9 @@ export default class Balances extends Component { return ( <div className={ styles.balance } - key={ token.token }> + key={ token.tag }> <div> - { value } { token.token } + { value } { token.tag } </div> <img src={ token.image } diff --git a/js/src/ui/IdentityIcon/identityIcon.js b/js/src/ui/IdentityIcon/identityIcon.js index 198a8751dc5..c1a7c7e9e1f 100644 --- a/js/src/ui/IdentityIcon/identityIcon.js +++ b/js/src/ui/IdentityIcon/identityIcon.js @@ -19,12 +19,20 @@ export default class IdentityIcon extends Component { this.updateIcon(this.props.address); } + componentWillReceiveProps (newProps) { + if (newProps.address === this.props.address) { + return; + } + + this.updateIcon(newProps.address); + } + updateIcon (address) { this.setState({ iconsrc: blockies({ seed: address.toLowerCase(), size: 8, - scale: this.props.inline ? 3 : 7 + scale: this.props.inline ? 4 : 7 }).toDataURL() }); } diff --git a/js/src/views/Account/account.js b/js/src/views/Account/account.js index c15e16c6179..f292bc0acd0 100644 --- a/js/src/views/Account/account.js +++ b/js/src/views/Account/account.js @@ -16,7 +16,8 @@ import styles from './style.css'; export default class Account extends Component { static contextTypes = { - api: React.PropTypes.object + api: React.PropTypes.object, + accounts: PropTypes.array } static propTypes = { @@ -25,7 +26,6 @@ export default class Account extends Component { state = { name: 'Unnamed', - balances: [], fundDialog: false, transferDialog: false } @@ -36,6 +36,12 @@ export default class Account extends Component { render () { const address = this.props.params.address; + const account = this.context.accounts.find((account) => account.address === address); + + if (!account) { + return null; + } + const title = ( <span> <span>{ this.state.name || 'Unnamed' }</span> @@ -47,15 +53,8 @@ export default class Account extends Component { return ( <div> - <FundAccount - address={ address } - onClose={ this.onFundAccountClose } - visible={ this.state.fundDialog } /> - <Transfer - address={ address } - balance={ this.state.balances[0] } - onClose={ this.onTransferClose } - visible={ this.state.transferDialog } /> + { this.renderFundDialog() } + { this.renderTransferDialog() } <Actions onFundAccount={ this.onFundAccountClick } onTransfer={ this.onTransferClick } /> @@ -80,7 +79,7 @@ export default class Account extends Component { </FormWrap> </Form> <Balances - address={ address } + account={ account } onChange={ this.onChangeBalances } /> </Container> <Transactions @@ -89,6 +88,33 @@ export default class Account extends Component { ); } + renderFundDialog () { + if (!this.state.fundDialog) { + return null; + } + + return ( + <FundAccount + address={ this.props.params.address } + onClose={ this.onFundAccountClose } /> + ); + } + + renderTransferDialog () { + if (!this.state.transferDialog) { + return null; + } + + const address = this.props.params.address; + const account = this.context.accounts.find((account) => account.address === address); + + return ( + <Transfer + account={ account } + onClose={ this.onTransferClose } /> + ); + } + onFundAccountClick = () => { this.setState({ fundDialog: !this.state.fundDialog }); } diff --git a/js/src/views/Accounts/AccountSummary/accountSummary.js b/js/src/views/Accounts/AccountSummary/accountSummary.js index e0dcd749af5..9b95dd82854 100644 --- a/js/src/views/Accounts/AccountSummary/accountSummary.js +++ b/js/src/views/Accounts/AccountSummary/accountSummary.js @@ -22,6 +22,11 @@ export default class AccountSummary extends Component { render () { const account = this.props.account; + + if (!account) { + return null; + } + const viewLink = `/account/${account.address}`; return ( @@ -32,7 +37,7 @@ export default class AccountSummary extends Component { title={ <Link to={ viewLink }>{ account.name || 'Unnamed' }</Link> } byline={ account.address } /> <Balances - address={ account.address } + account={ account } tokens={ this.props.tokens } /> { this.props.children } </Container> diff --git a/js/src/views/Accounts/accounts.js b/js/src/views/Accounts/accounts.js index 76cc5005af8..4255e75a071 100644 --- a/js/src/views/Accounts/accounts.js +++ b/js/src/views/Accounts/accounts.js @@ -34,7 +34,7 @@ export default class Accounts extends Component { } renderAccounts () { - if (!this.context.accounts.length) { + if (!this.context.accounts) { return null; } diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index f4bc031ae5b..da78e713599 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -29,7 +29,7 @@ muiTheme.toolbar.backgroundColor = 'rgb(80, 80, 80)'; const ETH_TOKEN = { image: 'images/tokens/ethereum-32x32.png', - token: 'ΞTH', + tag: 'ΞTH', type: 'Ethereum' }; @@ -172,8 +172,6 @@ export default class Application extends Component { }) .then((_tokens) => { return Promise.all(_tokens.map((token) => { - console.log(token[0], token[1], token[2].toFormat(), token[3]); - const contract = api.newContract(eip20Abi).at(token[0]); tokens.push({ @@ -181,7 +179,7 @@ export default class Application extends Component { format: token[2].toString(), image: `images/tokens/${token[3].toLowerCase()}-32x32.png`, supply: '0', - token: token[1], + tag: token[1], type: token[3], contract }); @@ -190,8 +188,6 @@ export default class Application extends Component { })); }) .then((supplies) => { - console.log('supplies', supplies.map((supply) => supply.toFormat())); - supplies.forEach((supply, idx) => { tokens[idx].supply = supply.toString(); }); From f80c3bf91d5cbead7b7f640a46359e03289da4dc Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 18 Aug 2016 23:22:10 +0200 Subject: [PATCH 0128/1062] adjust alignment of fonts (monospace) with middle icons - some issues remain --- js/src/views/Account/Transactions/transactions.js | 14 +++++++------- js/src/views/Account/style.css | 12 +++++++++++- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/js/src/views/Account/Transactions/transactions.js b/js/src/views/Account/Transactions/transactions.js index 132e52b8010..9c62952aa22 100644 --- a/js/src/views/Account/Transactions/transactions.js +++ b/js/src/views/Account/Transactions/transactions.js @@ -11,11 +11,11 @@ import IdentityIcon from '../../../ui/IdentityIcon'; import styles from '../style.css'; function formatHash (hash) { - if (!hash || hash.length <= 25) { + if (!hash || hash.length <= 21) { return hash; } - return `${hash.substr(2, 11)}...${hash.slice(-11)}`; + return `${hash.substr(2, 9)}...${hash.slice(-9)}`; } function formatNumber (number) { @@ -30,7 +30,7 @@ function formatEther (value) { const ether = Api.format.fromWei(value); if (ether.gt(0)) { - return `${ether.toFormat(8)} ΞTH`; + return `${ether.toFormat(5)} ΞTH`; } return null; @@ -70,7 +70,7 @@ export default class Transactions extends Component { const tosection = (tx.to && tx.to.length) ? (<td className={ styles.center }> <IdentityIcon inline center address={ tx.to } /> - <a href={ toLink } target='_blank'>{ formatHash(tx.to) }</a> + <a href={ toLink } target='_blank' className={ styles.link }>{ formatHash(tx.to) }</a> </td>) : (<td className={ `${styles.center}` }></td>); @@ -79,11 +79,11 @@ export default class Transactions extends Component { <td className={ styles.center }></td> <td className={ styles.center }> <IdentityIcon inline center address={ tx.from } /> - <a href={ fromLink } target='_blank'>{ formatHash(tx.from) }</a> + <a href={ fromLink } target='_blank' className={ styles.link }>{ formatHash(tx.from) }</a> </td> { tosection } <td className={ styles.center }> - <a href={ hashLink } target='_blank'>{ formatHash(tx.hash) }</a> + <a href={ hashLink } target='_blank' className={ styles.link }>{ formatHash(tx.hash) }</a> </td> <td className={ styles.right }> { formatNumber(tx.blockNumber) } @@ -91,7 +91,7 @@ export default class Transactions extends Component { <td className={ styles.right }> { formatTime(tx.timeStamp) } </td> - <td className={ styles.right }> + <td className={ styles.value }> { formatEther(tx.value) } </td> </tr> diff --git a/js/src/views/Account/style.css b/js/src/views/Account/style.css index 59929537930..7f5e5c360b7 100644 --- a/js/src/views/Account/style.css +++ b/js/src/views/Account/style.css @@ -19,10 +19,20 @@ } .transactions tr { - line-height: 24px; + line-height: 32px; vertical-align: middle; } +.transactions .link { + vertical-align: top; + font-family: monospace; +} + +.value { + text-align: right; + font-family: monospace; +} + .info { color: #aaa; } From 771be83257279baaaee8ec21c96ee4aba8e858ad Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 18 Aug 2016 23:45:41 +0200 Subject: [PATCH 0129/1062] update monospace forn to use Roboto Mono (align with other Roboto family) --- js/src/index.html | 1 + js/src/ui/Balances/style.css | 2 +- js/src/views/Account/style.css | 3 +-- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/js/src/index.html b/js/src/index.html index 9c75dd80e11..833668906d5 100644 --- a/js/src/index.html +++ b/js/src/index.html @@ -5,6 +5,7 @@ <meta name="viewport" content="width=device-width"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Parity + + + +
+ + + + diff --git a/js/src/dapps/gavcoin.js b/js/src/dapps/gavcoin.js new file mode 100644 index 00000000000..906d15294db --- /dev/null +++ b/js/src/dapps/gavcoin.js @@ -0,0 +1,12 @@ +import ReactDOM from 'react-dom'; +import React from 'react'; + +import injectTapEventPlugin from 'react-tap-event-plugin'; +injectTapEventPlugin(); + +ReactDOM.render( +
+ Welcome to GAVcoin +
, + document.querySelector('#container') +); diff --git a/js/src/index.html b/js/src/index.html index 617dc2a50ab..027e095d660 100644 --- a/js/src/index.html +++ b/js/src/index.html @@ -15,7 +15,7 @@
- - + + diff --git a/js/src/index.js b/js/src/index.js deleted file mode 100644 index db0551425ab..00000000000 --- a/js/src/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export Abi from './abi'; -export Api from './api'; diff --git a/js/src/views/ParityBar/parityBar.js b/js/src/views/ParityBar/parityBar.js index 59c78fb6671..01542547d99 100644 --- a/js/src/views/ParityBar/parityBar.js +++ b/js/src/views/ParityBar/parityBar.js @@ -21,9 +21,15 @@ export default class ParityBar extends Component {
- + + + diff --git a/js/src/views/ParityBar/style.css b/js/src/views/ParityBar/style.css index 84b7af2c8b5..c1b286335f1 100644 --- a/js/src/views/ParityBar/style.css +++ b/js/src/views/ParityBar/style.css @@ -29,3 +29,7 @@ .button { } + +a.noshow { + +} diff --git a/js/src/views/Wallet/wallet.js b/js/src/views/Wallet/wallet.js index 472c730bfc6..fb17cdfdefc 100644 --- a/js/src/views/Wallet/wallet.js +++ b/js/src/views/Wallet/wallet.js @@ -16,18 +16,13 @@ const api = new Api(new Api.Transport.Http('/rpc/')); const ETH_TOKEN = { images: { - small: 'images/contracts/ethereum-32.png', - normal: 'images/contracts/ethereum-56.png' + small: '/images/contracts/ethereum-32.png', + normal: '/images/contracts/ethereum-56.png' }, name: 'Ethereum', tag: 'ΞTH' }; -const STYLE_ERROR = { - backgroundColor: 'rgba(255, 100, 100, 0.9)', - color: 'rgba(255, 255, 255, 0.9)' -}; - export default class Wallet extends Component { static childContextTypes = { api: PropTypes.object, @@ -223,8 +218,8 @@ export default class Wallet extends Component { address: token[0], format: token[2].toString(), images: { - small: `images/contracts/${token[3].toLowerCase()}-32.png`, - normal: `images/contracts/${token[3].toLowerCase()}-56.png` + small: `/images/contracts/${token[3].toLowerCase()}-32.png`, + normal: `/images/contracts/${token[3].toLowerCase()}-56.png` }, supply: '0', tag: token[1], diff --git a/js/webpack.config.js b/js/webpack.config.js index b3fb9fbacd7..c0c3d765fbe 100644 --- a/js/webpack.config.js +++ b/js/webpack.config.js @@ -14,6 +14,7 @@ module.exports = { devtool: isProd ? '#eval' : '#cheap-module-eval-source-map', context: path.join(__dirname, './src'), entry: { + 'dapps/gavcoin': ['./dapps/gavcoin.js'], 'parity': ['./parity.js'], 'wallet': ['./wallet.js'] }, @@ -124,6 +125,8 @@ module.exports = { }()), devServer: { contentBase: './src', + historyApiFallback: false, + quiet: false, hot: !isProd, proxy: { '/rpc/*': { From 07e721dc4b22ceac051e6f3ecea523238f793a53 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 23 Aug 2016 16:43:52 +0200 Subject: [PATCH 0157/1062] primitive GAVcoin attachment interface - gets the address, attaches contract --- js/src/dapps/gavcoin.js | 6 +- .../dapps/gavcoin/Application/application.js | 58 ++ js/src/dapps/gavcoin/Application/index.js | 1 + js/src/dapps/gavcoin/abi/gavcoin.json | 280 ++++++++++ js/src/dapps/gavcoin/abi/registry.json | 499 ++++++++++++++++++ js/src/jsonrpc/interfaces/net.js | 1 + js/src/parity.js | 7 + 7 files changed, 849 insertions(+), 3 deletions(-) create mode 100644 js/src/dapps/gavcoin/Application/application.js create mode 100644 js/src/dapps/gavcoin/Application/index.js create mode 100644 js/src/dapps/gavcoin/abi/gavcoin.json create mode 100644 js/src/dapps/gavcoin/abi/registry.json diff --git a/js/src/dapps/gavcoin.js b/js/src/dapps/gavcoin.js index 906d15294db..a42c2573925 100644 --- a/js/src/dapps/gavcoin.js +++ b/js/src/dapps/gavcoin.js @@ -4,9 +4,9 @@ import React from 'react'; import injectTapEventPlugin from 'react-tap-event-plugin'; injectTapEventPlugin(); +import Application from './gavcoin/Application'; + ReactDOM.render( -
- Welcome to GAVcoin -
, + , document.querySelector('#container') ); diff --git a/js/src/dapps/gavcoin/Application/application.js b/js/src/dapps/gavcoin/Application/application.js new file mode 100644 index 00000000000..47963f2779c --- /dev/null +++ b/js/src/dapps/gavcoin/Application/application.js @@ -0,0 +1,58 @@ +import React, { Component, PropTypes } from 'react'; + +import registryAbi from '../abi/registry.json'; +import gavcoinAbi from '../abi/gavcoin.json'; + +const { Api } = window.parity; + +const api = new Api(new Api.Transport.Http('/rpc/')); + +export default class Application extends Component { + static childContextTypes = { + contract: PropTypes.object + }; + + state = { + address: null, + contract: null + } + + componentDidMount () { + this.attachInterface(); + } + + render () { + return ( +
+ Welcome to GAVcoin, found at { this.state.address } +
+ ); + } + + getChildContext () { + return { + contract: this.state.contract + }; + } + + attachInterface = () => { + api.ethcore + .registryAddress() + .then((registryAddress) => { + const registry = api.newContract(registryAbi, registryAddress).instance; + + return registry.getAddress.call({}, [Api.format.sha3('gavcoin'), 'A']); + }) + .then((address) => { + const contract = api.newContract(gavcoinAbi, address); + + this.setState({ + address, + contract + }); + }) + .catch((error) => { + console.error(error); + }); + } +} diff --git a/js/src/dapps/gavcoin/Application/index.js b/js/src/dapps/gavcoin/Application/index.js new file mode 100644 index 00000000000..e586e404a90 --- /dev/null +++ b/js/src/dapps/gavcoin/Application/index.js @@ -0,0 +1 @@ +export default from './application'; diff --git a/js/src/dapps/gavcoin/abi/gavcoin.json b/js/src/dapps/gavcoin/abi/gavcoin.json new file mode 100644 index 00000000000..f56d8597f41 --- /dev/null +++ b/js/src/dapps/gavcoin/abi/gavcoin.json @@ -0,0 +1,280 @@ +[ + { + "constant": false, + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_who", + "type": "address" + }, + { + "name": "_maxPrice", + "type": "uint256" + } + ], + "name": "buyin", + "outputs": [], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "remaining", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_price", + "type": "uint256" + }, + { + "name": "_units", + "type": "uint256" + } + ], + "name": "refund", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_who", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "price", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + }, + { + "name": "_spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "name": "remaining", + "type": "uint256" + } + ], + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": true, + "name": "to", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "buyer", + "type": "address" + }, + { + "indexed": true, + "name": "price", + "type": "uint256" + }, + { + "indexed": true, + "name": "amount", + "type": "uint256" + } + ], + "name": "Buyin", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "buyer", + "type": "address" + }, + { + "indexed": true, + "name": "price", + "type": "uint256" + }, + { + "indexed": true, + "name": "amount", + "type": "uint256" + } + ], + "name": "Refund", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "price", + "type": "uint256" + } + ], + "name": "NewTranch", + "type": "event" + } +] diff --git a/js/src/dapps/gavcoin/abi/registry.json b/js/src/dapps/gavcoin/abi/registry.json new file mode 100644 index 00000000000..11883230d5f --- /dev/null +++ b/js/src/dapps/gavcoin/abi/registry.json @@ -0,0 +1,499 @@ +[ + { + "constant": false, + "inputs": [ + { + "name": "_new", + "type": "address" + } + ], + "name": "setOwner", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "string" + } + ], + "name": "confirmReverse", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + } + ], + "name": "reserve", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_key", + "type": "string" + }, + { + "name": "_value", + "type": "bytes32" + } + ], + "name": "set", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + } + ], + "name": "drop", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_key", + "type": "string" + } + ], + "name": "getAddress", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_amount", + "type": "uint256" + } + ], + "name": "setFee", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_to", + "type": "address" + } + ], + "name": "transfer", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "owner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + } + ], + "name": "reserved", + "outputs": [ + { + "name": "reserved", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "drain", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "string" + }, + { + "name": "_who", + "type": "address" + } + ], + "name": "proposeReverse", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_key", + "type": "string" + } + ], + "name": "getUint", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_key", + "type": "string" + } + ], + "name": "get", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "fee", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "reverse", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_key", + "type": "string" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "setUint", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "removeReverse", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_key", + "type": "string" + }, + { + "name": "_value", + "type": "address" + } + ], + "name": "setAddress", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "amount", + "type": "uint256" + } + ], + "name": "Drained", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "amount", + "type": "uint256" + } + ], + "name": "FeeChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "bytes32" + }, + { + "indexed": true, + "name": "owner", + "type": "address" + } + ], + "name": "Reserved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "bytes32" + }, + { + "indexed": true, + "name": "oldOwner", + "type": "address" + }, + { + "indexed": true, + "name": "newOwner", + "type": "address" + } + ], + "name": "Transferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "bytes32" + }, + { + "indexed": true, + "name": "owner", + "type": "address" + } + ], + "name": "Dropped", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "bytes32" + }, + { + "indexed": true, + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "name": "key", + "type": "string" + } + ], + "name": "DataChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "string" + }, + { + "indexed": true, + "name": "reverse", + "type": "address" + } + ], + "name": "ReverseProposed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "string" + }, + { + "indexed": true, + "name": "reverse", + "type": "address" + } + ], + "name": "ReverseConfirmed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "string" + }, + { + "indexed": true, + "name": "reverse", + "type": "address" + } + ], + "name": "ReverseRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "old", + "type": "address" + }, + { + "indexed": true, + "name": "current", + "type": "address" + } + ], + "name": "NewOwner", + "type": "event" + } +] diff --git a/js/src/jsonrpc/interfaces/net.js b/js/src/jsonrpc/interfaces/net.js index 5cd23fd771c..59c83e51bf6 100644 --- a/js/src/jsonrpc/interfaces/net.js +++ b/js/src/jsonrpc/interfaces/net.js @@ -19,6 +19,7 @@ export default { format: 'utils.toDecimal' } }, + version: { desc: 'Returns the current network protocol version.', params: [], diff --git a/js/src/parity.js b/js/src/parity.js index a48655c90d2..73a7946c3d7 100644 --- a/js/src/parity.js +++ b/js/src/parity.js @@ -9,8 +9,13 @@ es6Promise.polyfill(); import injectTapEventPlugin from 'react-tap-event-plugin'; injectTapEventPlugin(); +import Api from './api'; import ParityBar from './views/ParityBar'; +const parity = { + Api: Api +}; + const el = document.createElement('div'); document.querySelector('html').appendChild(el); @@ -18,3 +23,5 @@ ReactDOM.render( , el ); + +window.parity = parity; From 3eab4535087941eeacdf06705ca7a4da776b4a75 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 23 Aug 2016 18:06:35 +0200 Subject: [PATCH 0158/1062] event subscription api, currently only eth.blockNumber available --- js/src/api/api.js | 7 ++++ js/src/api/events/events.js | 71 +++++++++++++++++++++++++++++++++++++ js/src/api/events/index.js | 1 + 3 files changed, 79 insertions(+) create mode 100644 js/src/api/events/events.js create mode 100644 js/src/api/events/index.js diff --git a/js/src/api/api.js b/js/src/api/api.js index b98d55f41fd..9073a3bf195 100644 --- a/js/src/api/api.js +++ b/js/src/api/api.js @@ -2,6 +2,7 @@ import { Http, Ws } from './transport/index'; import Contract from './contract/index'; import { Db, Eth, Ethcore, Net, Personal, Shh, Trace, Web3 } from './rpc/index'; +import Events from './events/index'; import format from './format/index'; import { isFunction } from './util/types'; @@ -19,6 +20,8 @@ export default class Api { this._shh = new Shh(transport); this._trace = new Trace(transport); this._web3 = new Web3(transport); + + this._events = new Events(this); } get db () { @@ -53,6 +56,10 @@ export default class Api { return this._web3; } + get events () { + return this._events; + } + newContract (abi, address) { return new Contract(this, abi).at(address); } diff --git a/js/src/api/events/events.js b/js/src/api/events/events.js new file mode 100644 index 00000000000..fa1b474f34c --- /dev/null +++ b/js/src/api/events/events.js @@ -0,0 +1,71 @@ +const EVENTS = ['eth.blockNumber']; + +export default class Events { + constructor (api) { + this._api = api; + + this._lastBlock = 0; + this.subscriptions = {}; + this.values = {}; + + EVENTS.forEach((eventName) => { + this.subscriptions[eventName] = []; + this.values[eventName] = 0; + }); + + this._pollBlockNumber(); + } + + _validateEvent (eventName) { + if (!EVENTS.includes(eventName)) { + throw new Error(`${eventName} is not a valid eventName, subscribe using one of ${EVENTS.join(', ')}`); + } + } + + subscribe (eventName, callback) { + this._validateEvent(eventName); + + const subscriptionId = this.subscriptions[eventName].length; + + this.subscriptions[eventName].push(callback); + this._sendData(callback, this.values[eventName]); + + return subscriptionId; + } + + unsubscribe (eventName, subscriptionId) { + this._validateEvent(eventName); + + this.subscriptions[eventName].filter((callback, idx) => idx !== subscriptionId); + } + + _sendData (callback, data) { + try { + callback(data); + } catch (error) { + } + } + + _sendEvents (eventName, data) { + this.values[eventName] = data; + this.subscriptions[eventName].forEach((callback) => { + this._sendData(callback, data); + }); + } + + _pollBlockNumber = () => { + const nextTimeout = () => setTimeout(this._pollBlockNumber, 1000); + + this._api.eth + .blockNumber() + .then((blockNumber) => { + if (blockNumber.gt(this._lastBlock)) { + this._lastBlock = blockNumber; + this._sendEvents('eth.blockNumber', blockNumber); + } + + nextTimeout(); + }) + .catch(nextTimeout); + } +} diff --git a/js/src/api/events/index.js b/js/src/api/events/index.js new file mode 100644 index 00000000000..9bc705f2c88 --- /dev/null +++ b/js/src/api/events/index.js @@ -0,0 +1 @@ +export default from './events'; From 8cc944ca9ba7e459be03e120fc5ea07c1fbe2b6b Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 23 Aug 2016 19:32:53 +0200 Subject: [PATCH 0159/1062] very, very, very basic start to GAVcoin status updates (remaining, totalSupply & price) --- .../dapps/gavcoin/Application/application.js | 78 +++++++++++++++++-- 1 file changed, 73 insertions(+), 5 deletions(-) diff --git a/js/src/dapps/gavcoin/Application/application.js b/js/src/dapps/gavcoin/Application/application.js index 47963f2779c..d916d5d2b37 100644 --- a/js/src/dapps/gavcoin/Application/application.js +++ b/js/src/dapps/gavcoin/Application/application.js @@ -9,12 +9,18 @@ const api = new Api(new Api.Transport.Http('/rpc/')); export default class Application extends Component { static childContextTypes = { - contract: PropTypes.object + instance: PropTypes.object }; state = { address: null, - contract: null + contract: null, + instance: null, + loading: true, + blockNumber: 0, + totalSupply: 0, + remaining: 0, + price: 0 } componentDidMount () { @@ -24,32 +30,94 @@ export default class Application extends Component { render () { return (
- Welcome to GAVcoin, found at { this.state.address } + { this.renderLoading() } + { this.renderInterface() }
); } + renderLoading () { + if (!this.state.loading) { + return null; + } + + return ( +
GAVcoin is loading ...
+ ); + } + + renderInterface () { + if (this.state.loading) { + return null; + } + + return ( +
+
Welcome to GAVcoin, found at { this.state.address }
+ { this.renderStatus() } +
+ ); + } + + renderStatus () { + if (!this.state.blockNumber) { + return null; + } + + return ( +
#{ this.state.blockNumber }: { this.state.remaining } coins remaining ({ this.state.totalSupply } total), price of { this.state.price }
+ ); + } + getChildContext () { return { - contract: this.state.contract + instance: this.state.instance }; } + onNewBlockNumber = (blockNumber) => { + const { instance } = this.state; + + Promise + .all([ + instance.totalSupply.call(), + instance.remaining.call(), + instance.price.call() + ]) + .then(([totalSupply, remaining, price]) => { + this.setState({ + blockNumber: blockNumber.toFormat(), + totalSupply: totalSupply.toFormat(), + remaining: remaining.toFormat(), + price: price.div(1000000).toFormat() + }); + }); + } + attachInterface = () => { api.ethcore .registryAddress() .then((registryAddress) => { + console.log(`the registry was found at ${registryAddress}`); + const registry = api.newContract(registryAbi, registryAddress).instance; return registry.getAddress.call({}, [Api.format.sha3('gavcoin'), 'A']); }) .then((address) => { + console.log(`gavcoin was found at ${address}`); + const contract = api.newContract(gavcoinAbi, address); + const instance = contract.instance; this.setState({ address, - contract + contract, + instance, + loading: false }); + + api.events.subscribe('eth.blockNumber', this.onNewBlockNumber); }) .catch((error) => { console.error(error); From fb8663a3b45b270dc0b4b2ccb8764b11eabd4cfa Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 23 Aug 2016 19:43:20 +0200 Subject: [PATCH 0160/1062] break Status & Loading into their own components (easier for proper styling) --- .../dapps/gavcoin/Application/application.js | 29 +++++++++---------- js/src/dapps/gavcoin/Loading/index.js | 1 + js/src/dapps/gavcoin/Loading/loading.js | 9 ++++++ js/src/dapps/gavcoin/Status/index.js | 1 + js/src/dapps/gavcoin/Status/status.js | 20 +++++++++++++ 5 files changed, 44 insertions(+), 16 deletions(-) create mode 100644 js/src/dapps/gavcoin/Loading/index.js create mode 100644 js/src/dapps/gavcoin/Loading/loading.js create mode 100644 js/src/dapps/gavcoin/Status/index.js create mode 100644 js/src/dapps/gavcoin/Status/status.js diff --git a/js/src/dapps/gavcoin/Application/application.js b/js/src/dapps/gavcoin/Application/application.js index d916d5d2b37..a0e2985b1bb 100644 --- a/js/src/dapps/gavcoin/Application/application.js +++ b/js/src/dapps/gavcoin/Application/application.js @@ -3,6 +3,9 @@ import React, { Component, PropTypes } from 'react'; import registryAbi from '../abi/registry.json'; import gavcoinAbi from '../abi/gavcoin.json'; +import Loading from '../Loading'; +import Status from '../Status'; + const { Api } = window.parity; const api = new Api(new Api.Transport.Http('/rpc/')); @@ -17,10 +20,10 @@ export default class Application extends Component { contract: null, instance: null, loading: true, - blockNumber: 0, - totalSupply: 0, - remaining: 0, - price: 0 + blockNumber: null, + totalSupply: null, + remaining: null, + price: null } componentDidMount () { @@ -42,7 +45,7 @@ export default class Application extends Component { } return ( -
GAVcoin is loading ...
+ ); } @@ -54,21 +57,15 @@ export default class Application extends Component { return (
Welcome to GAVcoin, found at { this.state.address }
- { this.renderStatus() } +
); } - renderStatus () { - if (!this.state.blockNumber) { - return null; - } - - return ( -
#{ this.state.blockNumber }: { this.state.remaining } coins remaining ({ this.state.totalSupply } total), price of { this.state.price }
- ); - } - getChildContext () { return { instance: this.state.instance diff --git a/js/src/dapps/gavcoin/Loading/index.js b/js/src/dapps/gavcoin/Loading/index.js new file mode 100644 index 00000000000..25ff460fa67 --- /dev/null +++ b/js/src/dapps/gavcoin/Loading/index.js @@ -0,0 +1 @@ +export default from './loading'; diff --git a/js/src/dapps/gavcoin/Loading/loading.js b/js/src/dapps/gavcoin/Loading/loading.js new file mode 100644 index 00000000000..d934911b014 --- /dev/null +++ b/js/src/dapps/gavcoin/Loading/loading.js @@ -0,0 +1,9 @@ +import React, { Component } from 'react'; + +export default class Loading extends Component { + render () { + return ( +
GAVcoin is loading ...
+ ); + } +} diff --git a/js/src/dapps/gavcoin/Status/index.js b/js/src/dapps/gavcoin/Status/index.js new file mode 100644 index 00000000000..60aae301478 --- /dev/null +++ b/js/src/dapps/gavcoin/Status/index.js @@ -0,0 +1 @@ +export default from './status'; diff --git a/js/src/dapps/gavcoin/Status/status.js b/js/src/dapps/gavcoin/Status/status.js new file mode 100644 index 00000000000..425e7181e40 --- /dev/null +++ b/js/src/dapps/gavcoin/Status/status.js @@ -0,0 +1,20 @@ +import React, { Component, PropTypes } from 'react'; + +export default class Status extends Component { + static propTypes = { + blockNumber: PropTypes.string, + totalSupply: PropTypes.string, + remaining: PropTypes.string, + price: PropTypes.string + } + + render () { + if (!this.props.totalSupply) { + return null; + } + + return ( +
#{ this.props.blockNumber }: { this.props.remaining } coins remaining ({ this.props.totalSupply } total), price of { this.props.price }
+ ); + } +} From 44e1bca81ddbdf8c733435d1e5dd7c581764af15 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 23 Aug 2016 19:55:40 +0200 Subject: [PATCH 0161/1062] move old Dapp/Dapps components to Contract/Contracts for future expansion --- js/src/views/Contract/index.js | 1 + js/src/views/Contracts/Summary/index.js | 1 + js/src/views/Contracts/Summary/summary.js | 37 ++++++++++++++++++++ js/src/views/Contracts/contracts.js | 42 +++++++++++++++++++++++ js/src/views/Contracts/index.js | 1 + js/src/views/Contracts/style.css | 18 ++++++++++ 6 files changed, 100 insertions(+) create mode 100644 js/src/views/Contract/index.js create mode 100644 js/src/views/Contracts/Summary/index.js create mode 100644 js/src/views/Contracts/Summary/summary.js create mode 100644 js/src/views/Contracts/contracts.js create mode 100644 js/src/views/Contracts/index.js create mode 100644 js/src/views/Contracts/style.css diff --git a/js/src/views/Contract/index.js b/js/src/views/Contract/index.js new file mode 100644 index 00000000000..4834a374db7 --- /dev/null +++ b/js/src/views/Contract/index.js @@ -0,0 +1 @@ +export default from './contract'; diff --git a/js/src/views/Contracts/Summary/index.js b/js/src/views/Contracts/Summary/index.js new file mode 100644 index 00000000000..83eeac5270d --- /dev/null +++ b/js/src/views/Contracts/Summary/index.js @@ -0,0 +1 @@ +export default from './summary'; diff --git a/js/src/views/Contracts/Summary/summary.js b/js/src/views/Contracts/Summary/summary.js new file mode 100644 index 00000000000..4c0f71ac317 --- /dev/null +++ b/js/src/views/Contracts/Summary/summary.js @@ -0,0 +1,37 @@ +import React, { Component, PropTypes } from 'react'; +import { Link } from 'react-router'; + +import Container, { Title } from '../../../ui/Container'; +import IdentityIcon from '../../../ui/IdentityIcon'; + +export default class Summary extends Component { + static contextTypes = { + api: React.PropTypes.object + } + + static propTypes = { + contract: PropTypes.object.isRequired, + children: PropTypes.node + } + + render () { + const contract = this.props.contract; + + if (!contract) { + return null; + } + + const viewLink = `/app/${contract.address}`; + + return ( + + + { contract.name || 'Unnamed' }</Link> } + byline={ contract.address } /> + { this.props.children } + </Container> + ); + } +} diff --git a/js/src/views/Contracts/contracts.js b/js/src/views/Contracts/contracts.js new file mode 100644 index 00000000000..a326ec12a4a --- /dev/null +++ b/js/src/views/Contracts/contracts.js @@ -0,0 +1,42 @@ +import React, { Component, PropTypes } from 'react'; + +import Summary from './Summary'; + +import styles from './style.css'; + +export default class Contracts extends Component { + static contextTypes = { + api: PropTypes.object, + contracts: PropTypes.array + } + + state = { + } + + render () { + return ( + <div> + <div className={ styles.contracts }> + { this.renderContracts() } + </div> + </div> + ); + } + + renderContracts () { + if (!this.context.contracts) { + return null; + } + + return this.context.contracts.map((contract, idx) => { + return ( + <div + className={ styles.contract } + key={ contract.address }> + <Summary + contract={ contract } /> + </div> + ); + }); + } +} diff --git a/js/src/views/Contracts/index.js b/js/src/views/Contracts/index.js new file mode 100644 index 00000000000..d7e79911f96 --- /dev/null +++ b/js/src/views/Contracts/index.js @@ -0,0 +1 @@ +export default from './contracts'; diff --git a/js/src/views/Contracts/style.css b/js/src/views/Contracts/style.css new file mode 100644 index 00000000000..b6957859b79 --- /dev/null +++ b/js/src/views/Contracts/style.css @@ -0,0 +1,18 @@ +.contracts { + display: flex; + flex-wrap: wrap; +} + +.contract { + flex: 0 1 50%; + width: 50%; + position: relative; +} + +.contract:nth-child(odd)>div { + padding-right: 0.5em !important; +} + +.contract:nth-child(even)>div { + padding-left: 0.5em !important; +} From 8d19125b4e15fb1f74187ce68f89b84dc7646717 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 23 Aug 2016 19:56:07 +0200 Subject: [PATCH 0162/1062] Add real apps, distributed (currently only GAVcoin), along with click-through --- .../{Dapp/dapp.js => Contract/contract.js} | 2 +- js/src/views/{Dapp => Contract}/style.css | 0 js/src/views/Dapp/index.js | 1 - js/src/views/Dapps/Summary/summary.js | 15 ++++++------- js/src/views/Dapps/dapps.js | 21 +++++++++++-------- js/src/wallet.js | 6 ++++-- 6 files changed, 23 insertions(+), 22 deletions(-) rename js/src/views/{Dapp/dapp.js => Contract/contract.js} (98%) rename js/src/views/{Dapp => Contract}/style.css (100%) delete mode 100644 js/src/views/Dapp/index.js diff --git a/js/src/views/Dapp/dapp.js b/js/src/views/Contract/contract.js similarity index 98% rename from js/src/views/Dapp/dapp.js rename to js/src/views/Contract/contract.js index 49893f0a1cd..c9227bc9415 100644 --- a/js/src/views/Dapp/dapp.js +++ b/js/src/views/Contract/contract.js @@ -8,7 +8,7 @@ function nicename (name) { return name.split(/(?=[A-Z])/).join(' '); } -export default class Dapp extends Component { +export default class Contract extends Component { static contextTypes = { api: React.PropTypes.object, contracts: PropTypes.array diff --git a/js/src/views/Dapp/style.css b/js/src/views/Contract/style.css similarity index 100% rename from js/src/views/Dapp/style.css rename to js/src/views/Contract/style.css diff --git a/js/src/views/Dapp/index.js b/js/src/views/Dapp/index.js deleted file mode 100644 index 1a6b0393e44..00000000000 --- a/js/src/views/Dapp/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './dapp'; diff --git a/js/src/views/Dapps/Summary/summary.js b/js/src/views/Dapps/Summary/summary.js index 4c0f71ac317..3ab32a4ab99 100644 --- a/js/src/views/Dapps/Summary/summary.js +++ b/js/src/views/Dapps/Summary/summary.js @@ -1,5 +1,4 @@ import React, { Component, PropTypes } from 'react'; -import { Link } from 'react-router'; import Container, { Title } from '../../../ui/Container'; import IdentityIcon from '../../../ui/IdentityIcon'; @@ -10,26 +9,24 @@ export default class Summary extends Component { } static propTypes = { - contract: PropTypes.object.isRequired, + app: PropTypes.object.isRequired, children: PropTypes.node } render () { - const contract = this.props.contract; + const { app } = this.props; - if (!contract) { + if (!app) { return null; } - const viewLink = `/app/${contract.address}`; - return ( <Container> <IdentityIcon - address={ contract.address } /> + address={ app.address } /> <Title - title={ <Link to={ viewLink }>{ contract.name || 'Unnamed' }</Link> } - byline={ contract.address } /> + title={ <a href={ app.url }>{ app.name }</a> } + byline={ app.description } /> { this.props.children } </Container> ); diff --git a/js/src/views/Dapps/dapps.js b/js/src/views/Dapps/dapps.js index 35dd9ae181c..7dd80e09971 100644 --- a/js/src/views/Dapps/dapps.js +++ b/js/src/views/Dapps/dapps.js @@ -6,11 +6,18 @@ import styles from './style.css'; export default class Dapps extends Component { static contextTypes = { - api: PropTypes.object, - contracts: PropTypes.array + api: PropTypes.object } state = { + apps: [ + { + name: 'GAVcoin', + address: '0x6C5b287A875298f773225e72ce3fA8B2782e0347', + description: 'Mnage your GAVcoins, the hottest new property in crypto', + url: '/dapps/gavcoin.html' + } + ] } render () { @@ -24,17 +31,13 @@ export default class Dapps extends Component { } renderContracts () { - if (!this.context.contracts) { - return null; - } - - return this.context.contracts.map((contract, idx) => { + return this.state.apps.map((app, idx) => { return ( <div className={ styles.contract } - key={ contract.address }> + key={ app.address }> <Summary - contract={ contract } /> + app={ app } /> </div> ); }); diff --git a/js/src/wallet.js b/js/src/wallet.js index 4ca5d0b009a..674265a3e1e 100644 --- a/js/src/wallet.js +++ b/js/src/wallet.js @@ -9,8 +9,9 @@ import { createHashHistory } from 'history'; import Accounts from './views/Accounts'; import Account from './views/Account'; +import Contracts from './views/Contracts'; +import Contract from './views/Contract'; import Dapps from './views/Dapps'; -import Dapp from './views/Dapp'; import Signer from './views/Signer'; import Wallet from './views/Wallet'; @@ -25,7 +26,8 @@ ReactDOM.render( <Route path='accounts' component={ Accounts } /> <Route path='account/:address' component={ Account } /> <Route path='apps' component={ Dapps } /> - <Route path='app/:address' component={ Dapp } /> + <Route path='contracts' component={ Contracts } /> + <Route path='contract/:address' component={ Contract } /> <Route path='signer' component={ Signer } /> </Route> </Router>, From c0cf495654c6f34bbab48ae32d666e66f02d9e91 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 23 Aug 2016 20:20:15 +0200 Subject: [PATCH 0163/1062] fix typo --- js/src/views/Dapps/dapps.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/views/Dapps/dapps.js b/js/src/views/Dapps/dapps.js index 7dd80e09971..a409213643e 100644 --- a/js/src/views/Dapps/dapps.js +++ b/js/src/views/Dapps/dapps.js @@ -14,7 +14,7 @@ export default class Dapps extends Component { { name: 'GAVcoin', address: '0x6C5b287A875298f773225e72ce3fA8B2782e0347', - description: 'Mnage your GAVcoins, the hottest new property in crypto', + description: 'Manage your GAVcoins, the hottest new property in crypto', url: '/dapps/gavcoin.html' } ] From 13ae31809104ee705bf767dcd673bbc8e21969eb Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 24 Aug 2016 08:19:34 +0200 Subject: [PATCH 0164/1062] topbar showing the relevant status for the application --- js/src/dapps/gavcoin.css | 22 +++++++++++++++++++ js/src/dapps/gavcoin.html | 1 + .../dapps/gavcoin/Application/application.js | 13 ++++++++--- js/src/dapps/gavcoin/Loading/loading.js | 6 ++++- js/src/dapps/gavcoin/Status/status.js | 14 +++++++++++- 5 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 js/src/dapps/gavcoin.css diff --git a/js/src/dapps/gavcoin.css b/js/src/dapps/gavcoin.css new file mode 100644 index 00000000000..d74445caeb4 --- /dev/null +++ b/js/src/dapps/gavcoin.css @@ -0,0 +1,22 @@ +html, body { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; + background: white; + color: #333; + font-size: 16px; + font-family: 'Roboto', sans-serif; +} + +.loading { + width: 100%; + text-align: center; + padding-top: 2em; +} + +.toolbar { + color: rgba(0, 0, 0, 0.4); +} diff --git a/js/src/dapps/gavcoin.html b/js/src/dapps/gavcoin.html index 8af68d55a07..ba23114d359 100644 --- a/js/src/dapps/gavcoin.html +++ b/js/src/dapps/gavcoin.html @@ -7,6 +7,7 @@ <title>GAVcoin + diff --git a/js/src/dapps/gavcoin/AccountSelector/render.js b/js/src/dapps/gavcoin/AccountSelector/render.js index a603f476057..3184c5a0bd1 100644 --- a/js/src/dapps/gavcoin/AccountSelector/render.js +++ b/js/src/dapps/gavcoin/AccountSelector/render.js @@ -2,6 +2,8 @@ import React from 'react'; import { MenuItem } from 'material-ui'; +import styles from './style.css'; + const { IdentityIcon } = window.parity.react; export function renderAccounts (accounts, gavBalance) { @@ -11,20 +13,20 @@ export function renderAccounts (accounts, gavBalance) { : `${account.ethBalance}ΞTH`; const item = ( -
-
+
+
-
-
{ account.name }
-
{ balance }
+
+
{ account.name }
+
{ balance }
); return ( diff --git a/js/src/dapps/gavcoin/AccountSelector/style.css b/js/src/dapps/gavcoin/AccountSelector/style.css new file mode 100644 index 00000000000..3c912c083a2 --- /dev/null +++ b/js/src/dapps/gavcoin/AccountSelector/style.css @@ -0,0 +1,35 @@ +.selectaccount { +} + +.selectedaccount { + padding: 4px 0 !important; +} + +.selectedaccount { + display: inline-block; +} + +.name { + display: inline-block; + margin-right: 1em; + text-transform: uppercase; +} + +.balance { + display: inline-block; + text-align: right; + color: #aaa; + font-family: 'Roboto Mono', monospace; +} + +.details { + display: inline-block; +} + +.image { + display: inline-block; +} + +.image img { + margin: 0 1em -11px 0; +} diff --git a/js/src/dapps/gavcoin/Accounts/accounts.js b/js/src/dapps/gavcoin/Accounts/accounts.js index e66395aa2d4..261fadef679 100644 --- a/js/src/dapps/gavcoin/Accounts/accounts.js +++ b/js/src/dapps/gavcoin/Accounts/accounts.js @@ -4,6 +4,8 @@ import { Chip } from 'material-ui'; const { IdentityIcon } = window.parity.react; +import styles from './style.css'; + export default class Accounts extends Component { static contextTypes = { api: PropTypes.object, @@ -18,7 +20,7 @@ export default class Accounts extends Component { const has = this._hasAccounts(); return ( -
+
{ has ? this.renderAccounts() : this.renderEmpty() }
); @@ -26,7 +28,7 @@ export default class Accounts extends Component { renderEmpty () { return ( -
+
You currently do not have any GAVcoin in any of your addresses, buy some
); @@ -40,13 +42,17 @@ export default class Accounts extends Component { .map((account) => { return ( - { account.name } - { account.gavBalance } + + { account.name } + + + { account.gavBalance } + ); }); diff --git a/js/src/dapps/gavcoin/Accounts/style.css b/js/src/dapps/gavcoin/Accounts/style.css new file mode 100644 index 00000000000..4ff603b7106 --- /dev/null +++ b/js/src/dapps/gavcoin/Accounts/style.css @@ -0,0 +1,31 @@ +.accounts { + padding: 2em 2em 0 2em; + text-align: center; + width: 100%; +} + +.account { + margin: 0.5em !important; + background: rgb(50, 150, 255) !important; + display: inline-block !important; +} + +.account img { + margin-bottom: -11px; + margin-left: -11px; +} + +.balance { + font-family: 'Roboto Mono', monospace; + color: rgba(255, 255, 255, 1) !important; +} + +.name { + color: rgba(255, 255, 255, 0.7) !important; + margin-right: 1em; + text-transform: uppercase; +} + +.none { + color: rgba(255, 255, 255, 0.7); +} diff --git a/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js b/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js index e3ab14debc0..91898667db9 100644 --- a/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js +++ b/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js @@ -3,9 +3,11 @@ import React, { Component, PropTypes } from 'react'; import { Dialog, FlatButton, TextField } from 'material-ui'; import AccountSelector from '../../AccountSelector'; -import { renderComplete } from '../render'; +import StepComplete from '../StepComplete'; import { ERRORS, validateAccount, validatePositiveNumber } from '../validation'; +import styles from '../style.css'; + const { Api } = window.parity; const NAME_ID = ' '; @@ -37,9 +39,9 @@ export default class ActionBuyIn extends Component { - { this.state.complete ? renderComplete() : this.renderFields() } + { this.state.complete ? : this.renderFields() } ); } diff --git a/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js b/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js index cbce1036759..956350e0c5f 100644 --- a/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js +++ b/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js @@ -4,9 +4,11 @@ import React, { Component, PropTypes } from 'react'; import { Dialog, FlatButton, TextField } from 'material-ui'; import AccountSelector from '../../AccountSelector'; -import { renderComplete } from '../render'; +import StepComplete from '../StepComplete'; import { ERRORS, validateAccount, validatePositiveNumber } from '../validation'; +import styles from '../style.css'; + const { Api } = window.parity; const DIVISOR = 10 ** 6; @@ -39,9 +41,9 @@ export default class ActionRefund extends Component { - { this.state.complete ? renderComplete() : this.renderFields() } + { this.state.complete ? : this.renderFields() } ); } diff --git a/js/src/dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js b/js/src/dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js index 56e9dfe8387..eea14239a26 100644 --- a/js/src/dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js +++ b/js/src/dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js @@ -5,9 +5,11 @@ import { Dialog, FlatButton, TextField } from 'material-ui'; import AccountSelector from '../../AccountSelector'; import AccountTextField from '../../AccountTextField'; -import { renderComplete } from '../render'; +import StepComplete from '../StepComplete'; import { ERRORS, validateAccount, validatePositiveNumber } from '../validation'; +import styles from '../style.css'; + const DIVISOR = 10 ** 6; const NAME_ID = ' '; @@ -38,9 +40,9 @@ export default class ActionTransfer extends Component { - { this.state.complete ? renderComplete() : this.renderFields() } + { this.state.complete ? : this.renderFields() } ); } diff --git a/js/src/dapps/gavcoin/Actions/StepComplete/index.js b/js/src/dapps/gavcoin/Actions/StepComplete/index.js new file mode 100644 index 00000000000..3a03c2e121b --- /dev/null +++ b/js/src/dapps/gavcoin/Actions/StepComplete/index.js @@ -0,0 +1 @@ +export default from './stepComplete'; diff --git a/js/src/dapps/gavcoin/Actions/StepComplete/stepComplete.js b/js/src/dapps/gavcoin/Actions/StepComplete/stepComplete.js new file mode 100644 index 00000000000..1bc50475974 --- /dev/null +++ b/js/src/dapps/gavcoin/Actions/StepComplete/stepComplete.js @@ -0,0 +1,13 @@ +import React, { Component } from 'react'; + +import styles from '../style.css'; + +export default class StepComplete extends Component { + render () { + return ( +
+ Your transaction has been posted. Please visit the Parity Signer to authenticate the transfer. +
+ ); + } +} diff --git a/js/src/dapps/gavcoin/Actions/actions.js b/js/src/dapps/gavcoin/Actions/actions.js index dec4900fff7..c1695ef9e0c 100644 --- a/js/src/dapps/gavcoin/Actions/actions.js +++ b/js/src/dapps/gavcoin/Actions/actions.js @@ -5,6 +5,8 @@ import ActionAddShoppingCart from 'material-ui/svg-icons/action/add-shopping-car import AvReplay from 'material-ui/svg-icons/av/replay'; import ContentSend from 'material-ui/svg-icons/content/send'; +import styles from './style.css'; + export default class Actions extends Component { static propTypes = { onAction: PropTypes.func.isRequired @@ -12,21 +14,21 @@ export default class Actions extends Component { render () { return ( -
+
} label='buy coins' primary onTouchTap={ this.onBuyIn } /> } label='send coins' primary onTouchTap={ this.onTransfer } /> } label='claim refund' primary diff --git a/js/src/dapps/gavcoin/Actions/render.js b/js/src/dapps/gavcoin/Actions/render.js deleted file mode 100644 index afc40ce0643..00000000000 --- a/js/src/dapps/gavcoin/Actions/render.js +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react'; - -export function renderComplete () { - return ( -
- Your transaction has been posted. Please visit the Parity Signer to authenticate the transfer. -
- ); -} diff --git a/js/src/dapps/gavcoin/Actions/style.css b/js/src/dapps/gavcoin/Actions/style.css new file mode 100644 index 00000000000..a1c760a4cf8 --- /dev/null +++ b/js/src/dapps/gavcoin/Actions/style.css @@ -0,0 +1,42 @@ +.actions { + text-align: center; + padding: 2em 2em 0 2em; + width: 100%; +} + +.button { + margin: 0 0.5em; +} + +.button button { + background-color: rgba(0, 100, 255, 1) !important; + height: 56px !important; + padding: 0 10px !important; +} + +.button button[disabled] { + background-color: rgba(50, 50, 50, 0.25) !important; +} + +.button button span { + font-weight: 300 !important; +} + +.dialog { +} + +.dialog h3 { + background: rgba(0, 100, 255, 0.7); + color: white !important; + font-weight: 300 !important; + text-transform: uppercase; +} + +.dialogtext { + padding-top: 1em; +} + +.link, .link:hover, .link:visited { + color: rgb(0, 188, 212); + text-decoration: none; +} diff --git a/js/src/dapps/gavcoin/Events/Event/event.js b/js/src/dapps/gavcoin/Events/Event/event.js index 9d3c9fa5e68..8850a695713 100644 --- a/js/src/dapps/gavcoin/Events/Event/event.js +++ b/js/src/dapps/gavcoin/Events/Event/event.js @@ -2,6 +2,8 @@ import React, { Component, PropTypes } from 'react'; import { formatBlockNumber, formatCoins, formatEth } from '../../format'; +import styles from '../style.css'; + const { IdentityIcon } = window.parity.react; const EMPTY_COLUMN = ( @@ -24,7 +26,7 @@ export default class Event extends Component { render () { const { event, fromAddress, toAddress, price, value } = this.props; const { blockNumber, state, type } = event; - const cls = `event ${state} ${type.toLowerCase()}`; + const cls = `${styles.event} ${styles[state]} ${styles[type.toLowerCase()]}`; return ( @@ -40,7 +42,7 @@ export default class Event extends Component { renderBlockNumber (blockNumber) { return ( - + { formatBlockNumber(blockNumber) } ); @@ -52,7 +54,7 @@ export default class Event extends Component { } return ( - + { this.renderAddressName(address) } @@ -64,14 +66,14 @@ export default class Event extends Component { if (account) { return ( -
+
{ account.name }
); } return ( -
+
{ address }
); @@ -83,7 +85,7 @@ export default class Event extends Component { } return ( - + { formatEth(price) }ΞTH ); @@ -95,7 +97,7 @@ export default class Event extends Component { } return ( - + { formatCoins(value) }GAV ); @@ -103,7 +105,7 @@ export default class Event extends Component { renderType (type) { return ( - + { type } ); diff --git a/js/src/dapps/gavcoin/Events/events.js b/js/src/dapps/gavcoin/Events/events.js index 218128fc0b4..f60aa6d95a8 100644 --- a/js/src/dapps/gavcoin/Events/events.js +++ b/js/src/dapps/gavcoin/Events/events.js @@ -5,6 +5,8 @@ import EventNewTranch from './EventNewTranch'; import EventRefund from './EventRefund'; import EventTransfer from './EventTransfer'; +import styles from './style.css'; + export default class Events extends Component { static childContextTypes = { accounts: PropTypes.array @@ -30,8 +32,8 @@ export default class Events extends Component { render () { return ( -
- +
+
{ this.renderEvents() } diff --git a/js/src/dapps/gavcoin/Events/style.css b/js/src/dapps/gavcoin/Events/style.css new file mode 100644 index 00000000000..aa9882f174a --- /dev/null +++ b/js/src/dapps/gavcoin/Events/style.css @@ -0,0 +1,72 @@ +.events { + padding: 2em; +} + +.list { + width: 100%; + border: none; + border-spacing: 0; +} + +.list td { + vertical-align: top; + padding: 4px 0.5em; + max-height: 32px; +} + +.event { + line-height: 32px; + vertical-align: top; +} + +.blocknumber, +.gavvalue { + text-align: right; +} + +.ethvalue { + text-align: center; +} + +.type { +} + +.account { +} + +.account img { + margin-bottom: -11px; +} + +.address { +} + +.name { + text-transform: uppercase; +} + +.event div { + display: inline; + margin-right: 1em; + vertical-align: top; +} + +.mined { +} + +.pending { + opacity: 0.5; +} + +.buyin { +} + +.refund { +} + +.transfer { +} + +.newtranch { + background: rgba(50, 250, 50, 0.1); +} diff --git a/js/src/dapps/gavcoin/Loading/loading.js b/js/src/dapps/gavcoin/Loading/loading.js index e1e979363ae..898eb744019 100644 --- a/js/src/dapps/gavcoin/Loading/loading.js +++ b/js/src/dapps/gavcoin/Loading/loading.js @@ -2,10 +2,12 @@ import React, { Component } from 'react'; import { CircularProgress } from 'material-ui'; +import styles from './style.css'; + export default class Loading extends Component { render () { return ( -
+
); diff --git a/js/src/dapps/gavcoin/Loading/style.css b/js/src/dapps/gavcoin/Loading/style.css new file mode 100644 index 00000000000..cb93aac9d59 --- /dev/null +++ b/js/src/dapps/gavcoin/Loading/style.css @@ -0,0 +1,5 @@ +.loading { + width: 100%; + text-align: center; + padding-top: 2em; +} diff --git a/js/src/dapps/gavcoin/Status/status.js b/js/src/dapps/gavcoin/Status/status.js index 55ffb08d964..955347e1c07 100644 --- a/js/src/dapps/gavcoin/Status/status.js +++ b/js/src/dapps/gavcoin/Status/status.js @@ -2,6 +2,8 @@ import React, { Component, PropTypes } from 'react'; import { formatBlockNumber, formatCoins, formatEth } from '../format'; +import styles from './style.css'; + export default class Status extends Component { static propTypes = { address: PropTypes.string, @@ -21,31 +23,31 @@ export default class Status extends Component { const { blockNumber, gavBalance, totalSupply, remaining, price } = this.props; return ( -
-
-
 
-
+
+
+
 
+
{ formatCoins(remaining, -1) }
-
+
available for { formatEth(price) }ΞTH
-
-
GAVcoin
-
+
+
GAVcoin
+
{ formatCoins(totalSupply, -1) }
-
+
total at { formatBlockNumber(blockNumber) }
-
-
 
-
+
+
 
+
{ formatCoins(gavBalance, -1) }
-
+
coin balance
diff --git a/js/src/dapps/gavcoin/Status/style.css b/js/src/dapps/gavcoin/Status/style.css new file mode 100644 index 00000000000..6833fb5572d --- /dev/null +++ b/js/src/dapps/gavcoin/Status/style.css @@ -0,0 +1,31 @@ +.status { + background: rgba(0, 100, 255, 1); + color: rgba(255, 255, 255, 1); + font-weight: 300; + padding: 3em 0 2em 0; + display: flex; + flex-wrap: wrap; +} + +.item { + flex: 0 1 30%; + width: 30%; + margin: 0 1.5%; + text-align: center; +} + +.byline { + font-size: 1.25em; + color: rgba(255, 255, 255, 0.7); +} + +.heading { + text-transform: uppercase; + letter-spacing: 0.25em; + font-size: 1.5em; + color: rgba(255, 255, 255, 0.7); +} + +.hero { + font-size: 4em; +} From d10b13e1e4a516c43e4d5e04443dbcc2c3643d31 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 26 Aug 2016 16:30:13 +0200 Subject: [PATCH 0213/1062] slightly adjust spacing between components --- js/src/dapps/gavcoin/Accounts/style.css | 2 +- js/src/dapps/gavcoin/Events/style.css | 2 +- js/src/dapps/gavcoin/Status/style.css | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/js/src/dapps/gavcoin/Accounts/style.css b/js/src/dapps/gavcoin/Accounts/style.css index 4ff603b7106..90b90f5f3a8 100644 --- a/js/src/dapps/gavcoin/Accounts/style.css +++ b/js/src/dapps/gavcoin/Accounts/style.css @@ -1,5 +1,5 @@ .accounts { - padding: 2em 2em 0 2em; + padding: 4em 2em 0 2em; text-align: center; width: 100%; } diff --git a/js/src/dapps/gavcoin/Events/style.css b/js/src/dapps/gavcoin/Events/style.css index aa9882f174a..0aab8cbc279 100644 --- a/js/src/dapps/gavcoin/Events/style.css +++ b/js/src/dapps/gavcoin/Events/style.css @@ -1,5 +1,5 @@ .events { - padding: 2em; + padding: 4em 2em; } .list { diff --git a/js/src/dapps/gavcoin/Status/style.css b/js/src/dapps/gavcoin/Status/style.css index 6833fb5572d..4b602eeda97 100644 --- a/js/src/dapps/gavcoin/Status/style.css +++ b/js/src/dapps/gavcoin/Status/style.css @@ -2,7 +2,7 @@ background: rgba(0, 100, 255, 1); color: rgba(255, 255, 255, 1); font-weight: 300; - padding: 3em 0 2em 0; + padding: 4em 0 2em 0; display: flex; flex-wrap: wrap; } From dd8faadb691d9610f272c2e26316c26682e5f788 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 26 Aug 2016 20:43:12 +0200 Subject: [PATCH 0214/1062] add structure for registry & tokenreg dapps --- js/src/dapps/registry.html | 31 +++++++++++++++++++ js/src/dapps/registry.js | 12 +++++++ .../dapps/registry/Application/application.js | 12 +++++++ js/src/dapps/registry/Application/index.js | 1 + js/src/dapps/tokenreg.html | 31 +++++++++++++++++++ js/src/dapps/tokenreg.js | 12 +++++++ .../dapps/tokenreg/Application/application.js | 12 +++++++ js/src/dapps/tokenreg/Application/index.js | 1 + js/webpack.config.js | 6 ++-- 9 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 js/src/dapps/registry.html create mode 100644 js/src/dapps/registry.js create mode 100644 js/src/dapps/registry/Application/application.js create mode 100644 js/src/dapps/registry/Application/index.js create mode 100644 js/src/dapps/tokenreg.html create mode 100644 js/src/dapps/tokenreg.js create mode 100644 js/src/dapps/tokenreg/Application/application.js create mode 100644 js/src/dapps/tokenreg/Application/index.js diff --git a/js/src/dapps/registry.html b/js/src/dapps/registry.html new file mode 100644 index 00000000000..0148b7bb4a7 --- /dev/null +++ b/js/src/dapps/registry.html @@ -0,0 +1,31 @@ + + + + + + + Registry + + + + + +
+ + + + diff --git a/js/src/dapps/registry.js b/js/src/dapps/registry.js new file mode 100644 index 00000000000..32bae1bf9f5 --- /dev/null +++ b/js/src/dapps/registry.js @@ -0,0 +1,12 @@ +import ReactDOM from 'react-dom'; +import React from 'react'; + +import injectTapEventPlugin from 'react-tap-event-plugin'; +injectTapEventPlugin(); + +import Application from './registry/Application'; + +ReactDOM.render( + , + document.querySelector('#container') +); diff --git a/js/src/dapps/registry/Application/application.js b/js/src/dapps/registry/Application/application.js new file mode 100644 index 00000000000..73a0313d5ea --- /dev/null +++ b/js/src/dapps/registry/Application/application.js @@ -0,0 +1,12 @@ +import React, { Component, PropTypes } from'react'; + +export default class Application extends Component { + static propTypes = { + }; + + render () { + return ( +
hello
+ ); + } +} diff --git a/js/src/dapps/registry/Application/index.js b/js/src/dapps/registry/Application/index.js new file mode 100644 index 00000000000..e586e404a90 --- /dev/null +++ b/js/src/dapps/registry/Application/index.js @@ -0,0 +1 @@ +export default from './application'; diff --git a/js/src/dapps/tokenreg.html b/js/src/dapps/tokenreg.html new file mode 100644 index 00000000000..64366a0e08b --- /dev/null +++ b/js/src/dapps/tokenreg.html @@ -0,0 +1,31 @@ + + + + + + + GAVcoin + + + + + +
+ + + + diff --git a/js/src/dapps/tokenreg.js b/js/src/dapps/tokenreg.js new file mode 100644 index 00000000000..ca26435d71d --- /dev/null +++ b/js/src/dapps/tokenreg.js @@ -0,0 +1,12 @@ +import ReactDOM from 'react-dom'; +import React from 'react'; + +import injectTapEventPlugin from 'react-tap-event-plugin'; +injectTapEventPlugin(); + +import Application from './tokenreg/Application'; + +ReactDOM.render( + , + document.querySelector('#container') +); diff --git a/js/src/dapps/tokenreg/Application/application.js b/js/src/dapps/tokenreg/Application/application.js new file mode 100644 index 00000000000..73a0313d5ea --- /dev/null +++ b/js/src/dapps/tokenreg/Application/application.js @@ -0,0 +1,12 @@ +import React, { Component, PropTypes } from'react'; + +export default class Application extends Component { + static propTypes = { + }; + + render () { + return ( +
hello
+ ); + } +} diff --git a/js/src/dapps/tokenreg/Application/index.js b/js/src/dapps/tokenreg/Application/index.js new file mode 100644 index 00000000000..e586e404a90 --- /dev/null +++ b/js/src/dapps/tokenreg/Application/index.js @@ -0,0 +1 @@ +export default from './application'; diff --git a/js/webpack.config.js b/js/webpack.config.js index f14e605a73f..97836af1bd4 100644 --- a/js/webpack.config.js +++ b/js/webpack.config.js @@ -15,9 +15,11 @@ module.exports = { context: path.join(__dirname, './src'), entry: { 'dapps/gavcoin': ['./dapps/gavcoin.js'], + 'dapps/registry': ['./dapps/registry.js'], + 'dapps/tokenreg': ['./dapps/tokenreg.js'], 'parity': ['./parity.js'], - 'wallet': ['./wallet.js'], - 'web3': ['./web3.js'] + 'wallet': ['./wallet.js'] /*, + 'web3': ['./web3.js'] */ }, output: { path: path.join(__dirname, 'build'), From f7c640d2e119f0bff3f0c81bfad580c9cae95450 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 26 Aug 2016 20:43:33 +0200 Subject: [PATCH 0215/1062] signer via iframe (not working due to cross-domain restrictions) --- js/src/views/Signer/signer.js | 7 ++++++- js/src/views/Signer/style.css | 5 +++++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 js/src/views/Signer/style.css diff --git a/js/src/views/Signer/signer.js b/js/src/views/Signer/signer.js index 6a5b92d3abc..0c84dbb9a0c 100644 --- a/js/src/views/Signer/signer.js +++ b/js/src/views/Signer/signer.js @@ -2,11 +2,16 @@ import React, { Component } from 'react'; import Container from '../../ui/Container'; +import styles from './style.css'; + export default class Settings extends Component { render () { return ( -
Signer...
+
); } diff --git a/js/src/views/Signer/style.css b/js/src/views/Signer/style.css new file mode 100644 index 00000000000..c0742e68532 --- /dev/null +++ b/js/src/views/Signer/style.css @@ -0,0 +1,5 @@ +.iframe { + width: 100%; + height: 100%; + border: none; +} From a1785fbd9de3cd119dabe6196a28486201c4936b Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 26 Aug 2016 21:26:00 +0200 Subject: [PATCH 0216/1062] styling updates all round, gavcoin now looks less baby-blue --- js/src/{wallet.js => app.js} | 4 ++-- js/src/dapps/gavcoin.html | 6 +++--- js/src/dapps/gavcoin/Accounts/style.css | 3 ++- js/src/dapps/gavcoin/Actions/style.css | 4 ++-- js/src/dapps/gavcoin/Status/style.css | 2 +- js/src/dapps/registry.html | 2 +- js/src/dapps/tokenreg.html | 2 +- js/src/index.html | 2 +- js/src/views/{Wallet => Application}/Status/index.js | 0 js/src/views/{Wallet => Application}/Status/status.js | 0 js/src/views/{Wallet => Application}/Status/style.css | 0 js/src/views/{Wallet => Application}/TabBar/index.js | 0 js/src/views/{Wallet => Application}/TabBar/tabBar.js | 0 .../{Wallet/wallet.js => Application/application.js} | 2 +- js/src/views/Application/index.js | 1 + js/src/views/{Wallet => Application}/style.css | 0 js/src/views/ParityBar/parityBar.js | 9 +++------ js/src/views/ParityBar/style.css | 9 +++------ js/src/views/Wallet/index.js | 1 - js/webpack.config.js | 2 +- 20 files changed, 22 insertions(+), 27 deletions(-) rename js/src/{wallet.js => app.js} (92%) rename js/src/views/{Wallet => Application}/Status/index.js (100%) rename js/src/views/{Wallet => Application}/Status/status.js (100%) rename js/src/views/{Wallet => Application}/Status/style.css (100%) rename js/src/views/{Wallet => Application}/TabBar/index.js (100%) rename js/src/views/{Wallet => Application}/TabBar/tabBar.js (100%) rename js/src/views/{Wallet/wallet.js => Application/application.js} (99%) create mode 100644 js/src/views/Application/index.js rename js/src/views/{Wallet => Application}/style.css (100%) delete mode 100644 js/src/views/Wallet/index.js diff --git a/js/src/wallet.js b/js/src/app.js similarity index 92% rename from js/src/wallet.js rename to js/src/app.js index 674265a3e1e..2debbdb9067 100644 --- a/js/src/wallet.js +++ b/js/src/app.js @@ -13,7 +13,7 @@ import Contracts from './views/Contracts'; import Contract from './views/Contract'; import Dapps from './views/Dapps'; import Signer from './views/Signer'; -import Wallet from './views/Wallet'; +import Application from './views/Application'; import styles from './reset.css'; @@ -22,7 +22,7 @@ const routerHistory = useRouterHistory(createHashHistory)({}); ReactDOM.render( - + diff --git a/js/src/dapps/gavcoin.html b/js/src/dapps/gavcoin.html index dbf949ac597..7f151048bb5 100644 --- a/js/src/dapps/gavcoin.html +++ b/js/src/dapps/gavcoin.html @@ -15,8 +15,8 @@ font-size: 100%; font: inherit; vertical-align: top; - background: white; - color: #333; + background: #445; + color: #fff; font-size: 16px; font-family: 'Roboto', sans-serif; font-weight: 300; @@ -26,6 +26,6 @@
- + diff --git a/js/src/dapps/gavcoin/Accounts/style.css b/js/src/dapps/gavcoin/Accounts/style.css index 90b90f5f3a8..a1394d1c0c2 100644 --- a/js/src/dapps/gavcoin/Accounts/style.css +++ b/js/src/dapps/gavcoin/Accounts/style.css @@ -6,8 +6,9 @@ .account { margin: 0.5em !important; - background: rgb(50, 150, 255) !important; + background: rgb(50, 100, 150) !important; display: inline-block !important; + font-weight: 300 !important; } .account img { diff --git a/js/src/dapps/gavcoin/Actions/style.css b/js/src/dapps/gavcoin/Actions/style.css index a1c760a4cf8..9858f512d0e 100644 --- a/js/src/dapps/gavcoin/Actions/style.css +++ b/js/src/dapps/gavcoin/Actions/style.css @@ -9,7 +9,7 @@ } .button button { - background-color: rgba(0, 100, 255, 1) !important; + background-color: rgba(50, 100, 150, 1) !important; height: 56px !important; padding: 0 10px !important; } @@ -26,7 +26,7 @@ } .dialog h3 { - background: rgba(0, 100, 255, 0.7); + background: rgba(50, 100, 150, 1); color: white !important; font-weight: 300 !important; text-transform: uppercase; diff --git a/js/src/dapps/gavcoin/Status/style.css b/js/src/dapps/gavcoin/Status/style.css index 4b602eeda97..a29f4e7d7da 100644 --- a/js/src/dapps/gavcoin/Status/style.css +++ b/js/src/dapps/gavcoin/Status/style.css @@ -1,5 +1,5 @@ .status { - background: rgba(0, 100, 255, 1); + background: rgba(25, 75, 125, 1); color: rgba(255, 255, 255, 1); font-weight: 300; padding: 4em 0 2em 0; diff --git a/js/src/dapps/registry.html b/js/src/dapps/registry.html index 0148b7bb4a7..1f577c78bab 100644 --- a/js/src/dapps/registry.html +++ b/js/src/dapps/registry.html @@ -26,6 +26,6 @@
- + diff --git a/js/src/dapps/tokenreg.html b/js/src/dapps/tokenreg.html index 64366a0e08b..5a3ee0e8067 100644 --- a/js/src/dapps/tokenreg.html +++ b/js/src/dapps/tokenreg.html @@ -26,6 +26,6 @@
- + diff --git a/js/src/index.html b/js/src/index.html index 027e095d660..b88bbba457b 100644 --- a/js/src/index.html +++ b/js/src/index.html @@ -16,6 +16,6 @@
- + diff --git a/js/src/views/Wallet/Status/index.js b/js/src/views/Application/Status/index.js similarity index 100% rename from js/src/views/Wallet/Status/index.js rename to js/src/views/Application/Status/index.js diff --git a/js/src/views/Wallet/Status/status.js b/js/src/views/Application/Status/status.js similarity index 100% rename from js/src/views/Wallet/Status/status.js rename to js/src/views/Application/Status/status.js diff --git a/js/src/views/Wallet/Status/style.css b/js/src/views/Application/Status/style.css similarity index 100% rename from js/src/views/Wallet/Status/style.css rename to js/src/views/Application/Status/style.css diff --git a/js/src/views/Wallet/TabBar/index.js b/js/src/views/Application/TabBar/index.js similarity index 100% rename from js/src/views/Wallet/TabBar/index.js rename to js/src/views/Application/TabBar/index.js diff --git a/js/src/views/Wallet/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js similarity index 100% rename from js/src/views/Wallet/TabBar/tabBar.js rename to js/src/views/Application/TabBar/tabBar.js diff --git a/js/src/views/Wallet/wallet.js b/js/src/views/Application/application.js similarity index 99% rename from js/src/views/Wallet/wallet.js rename to js/src/views/Application/application.js index fb17cdfdefc..fbeedcff095 100644 --- a/js/src/views/Wallet/wallet.js +++ b/js/src/views/Application/application.js @@ -23,7 +23,7 @@ const ETH_TOKEN = { tag: 'ΞTH' }; -export default class Wallet extends Component { +export default class Application extends Component { static childContextTypes = { api: PropTypes.object, accounts: PropTypes.array, diff --git a/js/src/views/Application/index.js b/js/src/views/Application/index.js new file mode 100644 index 00000000000..e586e404a90 --- /dev/null +++ b/js/src/views/Application/index.js @@ -0,0 +1 @@ +export default from './application'; diff --git a/js/src/views/Wallet/style.css b/js/src/views/Application/style.css similarity index 100% rename from js/src/views/Wallet/style.css rename to js/src/views/Application/style.css diff --git a/js/src/views/ParityBar/parityBar.js b/js/src/views/ParityBar/parityBar.js index 01542547d99..37b5f55688e 100644 --- a/js/src/views/ParityBar/parityBar.js +++ b/js/src/views/ParityBar/parityBar.js @@ -18,17 +18,14 @@ export default class ParityBar extends Component { render () { return ( -
+
+ href='/'> + src='/images/paritybar.png' /> diff --git a/js/src/views/ParityBar/style.css b/js/src/views/ParityBar/style.css index c1b286335f1..e7841de4673 100644 --- a/js/src/views/ParityBar/style.css +++ b/js/src/views/ParityBar/style.css @@ -1,5 +1,4 @@ .bar { - background: rgba(0, 0, 0, 0.5); position: fixed; bottom: 0; right: 0; @@ -10,16 +9,15 @@ z-index: 10000; display: flex; flex-wrap: wrap; - height: 6px; width: 100%; } .corner { background: rgba(0, 0, 0, 0.5); position: absolute; - bottom: 6px; - right: 0; - border-top-left-radius: 8px; + bottom: 0; + right: 16px; + border-radius: 4px 4px 0 0; } .logo { @@ -31,5 +29,4 @@ } a.noshow { - } diff --git a/js/src/views/Wallet/index.js b/js/src/views/Wallet/index.js deleted file mode 100644 index 02f0ff833f3..00000000000 --- a/js/src/views/Wallet/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './wallet'; diff --git a/js/webpack.config.js b/js/webpack.config.js index 97836af1bd4..046ad89ffe6 100644 --- a/js/webpack.config.js +++ b/js/webpack.config.js @@ -18,7 +18,7 @@ module.exports = { 'dapps/registry': ['./dapps/registry.js'], 'dapps/tokenreg': ['./dapps/tokenreg.js'], 'parity': ['./parity.js'], - 'wallet': ['./wallet.js'] /*, + 'app': ['./app.js'] /*, 'web3': ['./web3.js'] */ }, output: { From 0d7fa41fc971ac3462b68822232c7e250f2789af Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 26 Aug 2016 21:35:03 +0200 Subject: [PATCH 0217/1062] adjust body color, lighter, better contrast with status --- js/src/dapps/gavcoin.html | 2 +- js/src/dapps/gavcoin/Accounts/style.css | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/js/src/dapps/gavcoin.html b/js/src/dapps/gavcoin.html index 7f151048bb5..970a76ef4d2 100644 --- a/js/src/dapps/gavcoin.html +++ b/js/src/dapps/gavcoin.html @@ -15,7 +15,7 @@ font-size: 100%; font: inherit; vertical-align: top; - background: #445; + background: #678; color: #fff; font-size: 16px; font-family: 'Roboto', sans-serif; diff --git a/js/src/dapps/gavcoin/Accounts/style.css b/js/src/dapps/gavcoin/Accounts/style.css index a1394d1c0c2..333c291a6ed 100644 --- a/js/src/dapps/gavcoin/Accounts/style.css +++ b/js/src/dapps/gavcoin/Accounts/style.css @@ -8,7 +8,6 @@ margin: 0.5em !important; background: rgb(50, 100, 150) !important; display: inline-block !important; - font-weight: 300 !important; } .account img { @@ -19,12 +18,14 @@ .balance { font-family: 'Roboto Mono', monospace; color: rgba(255, 255, 255, 1) !important; + font-weight: 300; } .name { color: rgba(255, 255, 255, 0.7) !important; margin-right: 1em; text-transform: uppercase; + font-weight: 300; } .none { From e398f4be5c10b2aefef50a107de99333dc88f861 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 26 Aug 2016 22:20:37 +0200 Subject: [PATCH 0218/1062] adjust default background & font colors --- js/src/dapps/gavcoin.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/dapps/gavcoin.html b/js/src/dapps/gavcoin.html index 970a76ef4d2..ffa63698465 100644 --- a/js/src/dapps/gavcoin.html +++ b/js/src/dapps/gavcoin.html @@ -15,8 +15,8 @@ font-size: 100%; font: inherit; vertical-align: top; - background: #678; - color: #fff; + background: #ddf; + color: #333; font-size: 16px; font-family: 'Roboto', sans-serif; font-weight: 300; From 10a80c6e0411b54c363eb39cb8b8d1236f57da32 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 27 Aug 2016 09:23:53 +0200 Subject: [PATCH 0219/1062] basic constant queries of the registry --- .../dapps/registry/Application/application.js | 81 ++- js/src/dapps/registry/Loading/index.js | 1 + js/src/dapps/registry/Loading/loading.js | 13 + js/src/dapps/registry/Loading/style.css | 5 + js/src/dapps/registry/Status/index.js | 1 + js/src/dapps/registry/Status/status.js | 25 + js/src/dapps/registry/Status/style.css | 12 + js/src/dapps/registry/abi/registry.json | 499 ++++++++++++++++++ 8 files changed, 633 insertions(+), 4 deletions(-) create mode 100644 js/src/dapps/registry/Loading/index.js create mode 100644 js/src/dapps/registry/Loading/loading.js create mode 100644 js/src/dapps/registry/Loading/style.css create mode 100644 js/src/dapps/registry/Status/index.js create mode 100644 js/src/dapps/registry/Status/status.js create mode 100644 js/src/dapps/registry/Status/style.css create mode 100644 js/src/dapps/registry/abi/registry.json diff --git a/js/src/dapps/registry/Application/application.js b/js/src/dapps/registry/Application/application.js index 73a0313d5ea..e7ebca4fe23 100644 --- a/js/src/dapps/registry/Application/application.js +++ b/js/src/dapps/registry/Application/application.js @@ -1,12 +1,85 @@ -import React, { Component, PropTypes } from'react'; +import React, { Component, PropTypes } from 'react'; + +import getMuiTheme from 'material-ui/styles/getMuiTheme'; +import lightBaseTheme from 'material-ui/styles/baseThemes/lightBaseTheme'; + +const muiTheme = getMuiTheme(lightBaseTheme); + +import registryAbi from '../abi/registry.json'; +import Loading from '../Loading'; +import Status from '../Status'; + +const { Api } = window.parity; + +const api = new Api(new Api.Transport.Http('/rpc/')); export default class Application extends Component { - static propTypes = { - }; + static childContextTypes = { + api: PropTypes.object, + instance: PropTypes.object, + muiTheme: PropTypes.object + } + + state = { + address: null, + fee: null, + instance: null, + owner: null + } + + componentDidMount () { + this.attachInterface(); + } render () { + const { address, fee, owner } = this.state; + + if (!address) { + return ( + + ); + } + return ( -
hello
+
+ +
); } + + getChildContext () { + return { + api, + instance: this.state.instance, + muiTheme + }; + } + + attachInterface = () => { + api.ethcore + .registryAddress() + .then((address) => { + const { instance } = api.newContract(registryAbi, address); + + return Promise + .all([ + instance.owner.call(), + instance.fee.call() + ]) + .then(([owner, fee]) => { + this.setState({ + address, + fee, + instance, + owner + }); + }); + }) + .catch((error) => { + console.error(error); + }); + } } diff --git a/js/src/dapps/registry/Loading/index.js b/js/src/dapps/registry/Loading/index.js new file mode 100644 index 00000000000..25ff460fa67 --- /dev/null +++ b/js/src/dapps/registry/Loading/index.js @@ -0,0 +1 @@ +export default from './loading'; diff --git a/js/src/dapps/registry/Loading/loading.js b/js/src/dapps/registry/Loading/loading.js new file mode 100644 index 00000000000..b8eb619a1d9 --- /dev/null +++ b/js/src/dapps/registry/Loading/loading.js @@ -0,0 +1,13 @@ +import React, { Component } from 'react'; + +import styles from './style.css'; + +export default class Loading extends Component { + render () { + return ( +
+ Loading ... +
+ ); + } +} diff --git a/js/src/dapps/registry/Loading/style.css b/js/src/dapps/registry/Loading/style.css new file mode 100644 index 00000000000..6a864120621 --- /dev/null +++ b/js/src/dapps/registry/Loading/style.css @@ -0,0 +1,5 @@ +.loading { + width: 100%; + text-align: center; + padding: 1em; +} diff --git a/js/src/dapps/registry/Status/index.js b/js/src/dapps/registry/Status/index.js new file mode 100644 index 00000000000..60aae301478 --- /dev/null +++ b/js/src/dapps/registry/Status/index.js @@ -0,0 +1 @@ +export default from './status'; diff --git a/js/src/dapps/registry/Status/status.js b/js/src/dapps/registry/Status/status.js new file mode 100644 index 00000000000..4c8fd8cf9fd --- /dev/null +++ b/js/src/dapps/registry/Status/status.js @@ -0,0 +1,25 @@ +import React, { Component, PropTypes } from 'react'; + +import styles from './style.css'; + +const { Api } = window.parity; + +export default class Status extends Component { + static propTypes = { + address: PropTypes.string, + fee: PropTypes.object, + owner: PropTypes.string + }; + + render () { + const { address, fee, owner } = this.props; + + return ( +
+
Registry at { address }
+
Owned by { owner }
+
Registration fee { Api.format.fromWei(fee).toFixed(3) }ΞTH
+
+ ); + } +} diff --git a/js/src/dapps/registry/Status/style.css b/js/src/dapps/registry/Status/style.css new file mode 100644 index 00000000000..bd465f8886d --- /dev/null +++ b/js/src/dapps/registry/Status/style.css @@ -0,0 +1,12 @@ +.status { + padding: 1em 1em 2em 1em; +} + +.address { +} + +.fee { +} + +.owner { +} diff --git a/js/src/dapps/registry/abi/registry.json b/js/src/dapps/registry/abi/registry.json new file mode 100644 index 00000000000..11883230d5f --- /dev/null +++ b/js/src/dapps/registry/abi/registry.json @@ -0,0 +1,499 @@ +[ + { + "constant": false, + "inputs": [ + { + "name": "_new", + "type": "address" + } + ], + "name": "setOwner", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "string" + } + ], + "name": "confirmReverse", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + } + ], + "name": "reserve", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_key", + "type": "string" + }, + { + "name": "_value", + "type": "bytes32" + } + ], + "name": "set", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + } + ], + "name": "drop", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_key", + "type": "string" + } + ], + "name": "getAddress", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_amount", + "type": "uint256" + } + ], + "name": "setFee", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_to", + "type": "address" + } + ], + "name": "transfer", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "owner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + } + ], + "name": "reserved", + "outputs": [ + { + "name": "reserved", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "drain", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "string" + }, + { + "name": "_who", + "type": "address" + } + ], + "name": "proposeReverse", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_key", + "type": "string" + } + ], + "name": "getUint", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_key", + "type": "string" + } + ], + "name": "get", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "fee", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "reverse", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_key", + "type": "string" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "setUint", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "removeReverse", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_key", + "type": "string" + }, + { + "name": "_value", + "type": "address" + } + ], + "name": "setAddress", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "amount", + "type": "uint256" + } + ], + "name": "Drained", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "amount", + "type": "uint256" + } + ], + "name": "FeeChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "bytes32" + }, + { + "indexed": true, + "name": "owner", + "type": "address" + } + ], + "name": "Reserved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "bytes32" + }, + { + "indexed": true, + "name": "oldOwner", + "type": "address" + }, + { + "indexed": true, + "name": "newOwner", + "type": "address" + } + ], + "name": "Transferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "bytes32" + }, + { + "indexed": true, + "name": "owner", + "type": "address" + } + ], + "name": "Dropped", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "bytes32" + }, + { + "indexed": true, + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "name": "key", + "type": "string" + } + ], + "name": "DataChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "string" + }, + { + "indexed": true, + "name": "reverse", + "type": "address" + } + ], + "name": "ReverseProposed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "string" + }, + { + "indexed": true, + "name": "reverse", + "type": "address" + } + ], + "name": "ReverseConfirmed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "string" + }, + { + "indexed": true, + "name": "reverse", + "type": "address" + } + ], + "name": "ReverseRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "old", + "type": "address" + }, + { + "indexed": true, + "name": "current", + "type": "address" + } + ], + "name": "NewOwner", + "type": "event" + } +] From 598972f942cf616564144c76e3a0e753fb0cc7a8 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 27 Aug 2016 09:31:49 +0200 Subject: [PATCH 0220/1062] default background back to white --- js/src/dapps/gavcoin.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/dapps/gavcoin.html b/js/src/dapps/gavcoin.html index ffa63698465..ca5370a4b8b 100644 --- a/js/src/dapps/gavcoin.html +++ b/js/src/dapps/gavcoin.html @@ -15,7 +15,7 @@ font-size: 100%; font: inherit; vertical-align: top; - background: #ddf; + background: #fff; color: #333; font-size: 16px; font-family: 'Roboto', sans-serif; From ee5ac34fda588a10362ea3b4556dcd5b7271bdc7 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 27 Aug 2016 09:32:05 +0200 Subject: [PATCH 0221/1062] tokenreg basics --- js/src/dapps/tokenreg/Loading/index.js | 1 + js/src/dapps/tokenreg/Loading/loading.js | 13 + js/src/dapps/tokenreg/Loading/style.css | 5 + js/src/dapps/tokenreg/abi/registry.json | 499 +++++++++++++++++++++++ js/src/dapps/tokenreg/abi/tokenreg.json | 213 ++++++++++ 5 files changed, 731 insertions(+) create mode 100644 js/src/dapps/tokenreg/Loading/index.js create mode 100644 js/src/dapps/tokenreg/Loading/loading.js create mode 100644 js/src/dapps/tokenreg/Loading/style.css create mode 100644 js/src/dapps/tokenreg/abi/registry.json create mode 100644 js/src/dapps/tokenreg/abi/tokenreg.json diff --git a/js/src/dapps/tokenreg/Loading/index.js b/js/src/dapps/tokenreg/Loading/index.js new file mode 100644 index 00000000000..25ff460fa67 --- /dev/null +++ b/js/src/dapps/tokenreg/Loading/index.js @@ -0,0 +1 @@ +export default from './loading'; diff --git a/js/src/dapps/tokenreg/Loading/loading.js b/js/src/dapps/tokenreg/Loading/loading.js new file mode 100644 index 00000000000..b8eb619a1d9 --- /dev/null +++ b/js/src/dapps/tokenreg/Loading/loading.js @@ -0,0 +1,13 @@ +import React, { Component } from 'react'; + +import styles from './style.css'; + +export default class Loading extends Component { + render () { + return ( +
+ Loading ... +
+ ); + } +} diff --git a/js/src/dapps/tokenreg/Loading/style.css b/js/src/dapps/tokenreg/Loading/style.css new file mode 100644 index 00000000000..6a864120621 --- /dev/null +++ b/js/src/dapps/tokenreg/Loading/style.css @@ -0,0 +1,5 @@ +.loading { + width: 100%; + text-align: center; + padding: 1em; +} diff --git a/js/src/dapps/tokenreg/abi/registry.json b/js/src/dapps/tokenreg/abi/registry.json new file mode 100644 index 00000000000..11883230d5f --- /dev/null +++ b/js/src/dapps/tokenreg/abi/registry.json @@ -0,0 +1,499 @@ +[ + { + "constant": false, + "inputs": [ + { + "name": "_new", + "type": "address" + } + ], + "name": "setOwner", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "string" + } + ], + "name": "confirmReverse", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + } + ], + "name": "reserve", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_key", + "type": "string" + }, + { + "name": "_value", + "type": "bytes32" + } + ], + "name": "set", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + } + ], + "name": "drop", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_key", + "type": "string" + } + ], + "name": "getAddress", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_amount", + "type": "uint256" + } + ], + "name": "setFee", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_to", + "type": "address" + } + ], + "name": "transfer", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "owner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + } + ], + "name": "reserved", + "outputs": [ + { + "name": "reserved", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "drain", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "string" + }, + { + "name": "_who", + "type": "address" + } + ], + "name": "proposeReverse", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_key", + "type": "string" + } + ], + "name": "getUint", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_key", + "type": "string" + } + ], + "name": "get", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "fee", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "reverse", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_key", + "type": "string" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "setUint", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "removeReverse", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "bytes32" + }, + { + "name": "_key", + "type": "string" + }, + { + "name": "_value", + "type": "address" + } + ], + "name": "setAddress", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "amount", + "type": "uint256" + } + ], + "name": "Drained", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "amount", + "type": "uint256" + } + ], + "name": "FeeChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "bytes32" + }, + { + "indexed": true, + "name": "owner", + "type": "address" + } + ], + "name": "Reserved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "bytes32" + }, + { + "indexed": true, + "name": "oldOwner", + "type": "address" + }, + { + "indexed": true, + "name": "newOwner", + "type": "address" + } + ], + "name": "Transferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "bytes32" + }, + { + "indexed": true, + "name": "owner", + "type": "address" + } + ], + "name": "Dropped", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "bytes32" + }, + { + "indexed": true, + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "name": "key", + "type": "string" + } + ], + "name": "DataChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "string" + }, + { + "indexed": true, + "name": "reverse", + "type": "address" + } + ], + "name": "ReverseProposed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "string" + }, + { + "indexed": true, + "name": "reverse", + "type": "address" + } + ], + "name": "ReverseConfirmed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "name", + "type": "string" + }, + { + "indexed": true, + "name": "reverse", + "type": "address" + } + ], + "name": "ReverseRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "old", + "type": "address" + }, + { + "indexed": true, + "name": "current", + "type": "address" + } + ], + "name": "NewOwner", + "type": "event" + } +] diff --git a/js/src/dapps/tokenreg/abi/tokenreg.json b/js/src/dapps/tokenreg/abi/tokenreg.json new file mode 100644 index 00000000000..fc813bc1cf9 --- /dev/null +++ b/js/src/dapps/tokenreg/abi/tokenreg.json @@ -0,0 +1,213 @@ +[ + { + "constant": true, + "inputs": [ + { + "name": "_id", + "type": "uint256" + } + ], + "name": "token", + "outputs": [ + { + "name": "o_addr", + "type": "address" + }, + { + "name": "o_tla", + "type": "string" + }, + { + "name": "o_base", + "type": "uint256" + }, + { + "name": "o_name", + "type": "string" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_new", + "type": "address" + } + ], + "name": "setOwner", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_addr", + "type": "address" + }, + { + "name": "_tla", + "type": "string" + }, + { + "name": "_base", + "type": "uint256" + }, + { + "name": "_name", + "type": "string" + } + ], + "name": "register", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_fee", + "type": "uint256" + } + ], + "name": "setFee", + "outputs": [], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_id", + "type": "uint256" + }, + { + "name": "_key", + "type": "bytes32" + } + ], + "name": "meta", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_tla", + "type": "string" + } + ], + "name": "fromTLA", + "outputs": [ + { + "name": "o_id", + "type": "uint256" + }, + { + "name": "o_addr", + "type": "address" + }, + { + "name": "o_base", + "type": "uint256" + }, + { + "name": "o_name", + "type": "string" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "owner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "drain", + "outputs": [], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "tokenCount", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_id", + "type": "uint256" + } + ], + "name": "unregister", + "outputs": [], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_addr", + "type": "address" + } + ], + "name": "fromAddress", + "outputs": [ + { + "name": "o_id", + "type": "uint256" + }, + { + "name": "o_tla", + "type": "string" + }, + { + "name": "o_base", + "type": "uint256" + }, + { + "name": "o_name", + "type": "string" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "fee", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + } +] From e2043b877f0c1ed6df95c21279e0fd8bd1c2921e Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 27 Aug 2016 09:43:04 +0200 Subject: [PATCH 0222/1062] more parallel calls at startup --- .../dapps/gavcoin/Application/application.js | 27 +++++++------------ .../dapps/registry/Application/application.js | 20 ++++++++++++-- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/js/src/dapps/gavcoin/Application/application.js b/js/src/dapps/gavcoin/Application/application.js index 22b9a8c69c2..11d84b259eb 100644 --- a/js/src/dapps/gavcoin/Application/application.js +++ b/js/src/dapps/gavcoin/Application/application.js @@ -34,7 +34,6 @@ export default class Application extends Component { ethBalance: new BigNumber(0), gavBalance: new BigNumber(0), accounts: [], - contract: null, instance: null, loading: true, blockNumber: null, @@ -193,28 +192,22 @@ export default class Application extends Component { const registry = api.newContract(registryAbi, registryAddress).instance; - return registry.getAddress.call({}, [Api.format.sha3('gavcoin'), 'A']); + return Promise + .all([ + registry.getAddress.call({}, [Api.format.sha3('gavcoin'), 'A']), + api.personal.listAccounts(), + api.personal.accountsInfo() + ]); }) - .then((address) => { + .then(([address, addresses, infos]) => { console.log(`gavcoin was found at ${address}`); - const contract = api.newContract(gavcoinAbi, address); - const instance = contract.instance; + const { instance } = api.newContract(gavcoinAbi, address); - this.setState({ - address, - contract, - instance - }); - - return Promise.all([ - api.personal.listAccounts(), - api.personal.accountsInfo() - ]); - }) - .then(([addresses, infos]) => { this.setState({ loading: false, + address, + instance, accounts: addresses.map((address) => { return { address, diff --git a/js/src/dapps/registry/Application/application.js b/js/src/dapps/registry/Application/application.js index e7ebca4fe23..4077080425f 100644 --- a/js/src/dapps/registry/Application/application.js +++ b/js/src/dapps/registry/Application/application.js @@ -24,6 +24,7 @@ export default class Application extends Component { address: null, fee: null, instance: null, + loading: true, owner: null } @@ -32,9 +33,9 @@ export default class Application extends Component { } render () { - const { address, fee, owner } = this.state; + const { address, fee, loading, owner } = this.state; - if (!address) { + if (!loading) { return ( ); @@ -58,6 +59,18 @@ export default class Application extends Component { }; } + onNewBlockNumber = (blockNumber) => { + const { instance } = this.state; + + instance.fee + .call() + .then((fee) => { + this.setState({ + fee + }); + }); + } + attachInterface = () => { api.ethcore .registryAddress() @@ -70,10 +83,13 @@ export default class Application extends Component { instance.fee.call() ]) .then(([owner, fee]) => { + api.events.subscribe('eth.blockNumber', this.onNewBlockNumber); + this.setState({ address, fee, instance, + loading: false, owner }); }); From c5968b4ab0d729a28d59b8959d096310349108ea Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 27 Aug 2016 09:48:03 +0200 Subject: [PATCH 0223/1062] adjust styling consistency for body, html & container --- js/src/dapps/gavcoin.html | 16 ++++++++++------ js/src/dapps/registry.html | 16 ++++++++++------ js/src/dapps/tokenreg.html | 16 ++++++++++------ 3 files changed, 30 insertions(+), 18 deletions(-) diff --git a/js/src/dapps/gavcoin.html b/js/src/dapps/gavcoin.html index ca5370a4b8b..bd52eccb0d6 100644 --- a/js/src/dapps/gavcoin.html +++ b/js/src/dapps/gavcoin.html @@ -9,17 +9,21 @@ diff --git a/js/src/dapps/registry.html b/js/src/dapps/registry.html index 1f577c78bab..d995ca75278 100644 --- a/js/src/dapps/registry.html +++ b/js/src/dapps/registry.html @@ -9,17 +9,21 @@ diff --git a/js/src/dapps/tokenreg.html b/js/src/dapps/tokenreg.html index 5a3ee0e8067..ffa6b3e53e1 100644 --- a/js/src/dapps/tokenreg.html +++ b/js/src/dapps/tokenreg.html @@ -9,17 +9,21 @@ From 1bd663c467f73e65b7e8b0c7dd3fb2446d204ce0 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 27 Aug 2016 09:48:25 +0200 Subject: [PATCH 0224/1062] subscribe to end of startup phase --- js/src/dapps/registry/Application/application.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/dapps/registry/Application/application.js b/js/src/dapps/registry/Application/application.js index 4077080425f..c74d704c20c 100644 --- a/js/src/dapps/registry/Application/application.js +++ b/js/src/dapps/registry/Application/application.js @@ -83,8 +83,6 @@ export default class Application extends Component { instance.fee.call() ]) .then(([owner, fee]) => { - api.events.subscribe('eth.blockNumber', this.onNewBlockNumber); - this.setState({ address, fee, @@ -92,6 +90,8 @@ export default class Application extends Component { loading: false, owner }); + + api.events.subscribe('eth.blockNumber', this.onNewBlockNumber); }); }) .catch((error) => { From 7656309283c06f3c87e7f38baa83f90493cf1690 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 27 Aug 2016 10:17:04 +0200 Subject: [PATCH 0225/1062] embed dapps via iframe, Parity overlay visible --- js/src/app.js | 2 ++ js/src/parity.js | 15 ---------- .../Tooltip/TooltipOverlay/tooltipOverlay.js | 2 +- js/src/ui/Tooltip/style.css | 5 ++++ js/src/views/Application/application.js | 29 ++++++++++++++++--- js/src/views/Application/style.css | 2 +- js/src/views/Dapp/dapp.js | 21 ++++++++++++++ js/src/views/Dapp/index.js | 1 + js/src/views/Dapp/style.css | 5 ++++ js/src/views/Dapps/Summary/summary.js | 5 +++- js/src/views/Dapps/dapps.js | 2 +- 11 files changed, 66 insertions(+), 23 deletions(-) create mode 100644 js/src/views/Dapp/dapp.js create mode 100644 js/src/views/Dapp/index.js create mode 100644 js/src/views/Dapp/style.css diff --git a/js/src/app.js b/js/src/app.js index 2debbdb9067..3e334f43d18 100644 --- a/js/src/app.js +++ b/js/src/app.js @@ -12,6 +12,7 @@ import Account from './views/Account'; import Contracts from './views/Contracts'; import Contract from './views/Contract'; import Dapps from './views/Dapps'; +import Dapp from './views/Dapp'; import Signer from './views/Signer'; import Application from './views/Application'; @@ -26,6 +27,7 @@ ReactDOM.render( + diff --git a/js/src/parity.js b/js/src/parity.js index fb812074087..3691c3183e4 100644 --- a/js/src/parity.js +++ b/js/src/parity.js @@ -1,27 +1,12 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; - import 'isomorphic-fetch'; import es6Promise from 'es6-promise'; es6Promise.polyfill(); -import injectTapEventPlugin from 'react-tap-event-plugin'; -injectTapEventPlugin(); - import Api from './api'; -import ParityBar from './views/ParityBar'; import IdentityIcon from './ui/IdentityIcon'; -const el = document.createElement('div'); -document.querySelector('html').appendChild(el); - -ReactDOM.render( - , - el -); - window.parity = { Api: Api, react: { diff --git a/js/src/ui/Tooltip/TooltipOverlay/tooltipOverlay.js b/js/src/ui/Tooltip/TooltipOverlay/tooltipOverlay.js index 7f6b6934272..30bedd765b9 100644 --- a/js/src/ui/Tooltip/TooltipOverlay/tooltipOverlay.js +++ b/js/src/ui/Tooltip/TooltipOverlay/tooltipOverlay.js @@ -30,7 +30,7 @@ export default class TooltipOverlay extends Component { const overlay = this.state.currentId === -1 ? null : (
); return ( -
+
{ overlay } { this.props.children }
diff --git a/js/src/ui/Tooltip/style.css b/js/src/ui/Tooltip/style.css index dd08d6b3347..98fd4e1a02b 100644 --- a/js/src/ui/Tooltip/style.css +++ b/js/src/ui/Tooltip/style.css @@ -1,3 +1,8 @@ +.container { + height: 100%; + width: 100%; +} + .overlay { position: fixed; top: 0; diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index fbeedcff095..b98c74c5a05 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -5,6 +5,7 @@ import { Snackbar } from 'material-ui'; import Api from '../../api'; import { eip20Abi, registryAbi, tokenRegAbi } from '../../services/abi'; import muiTheme from '../../ui/Theme'; +import ParityBar from '../ParityBar'; import { TooltipOverlay } from '../../ui/Tooltip'; import { FirstRun } from '../../modals'; @@ -52,14 +53,27 @@ export default class Application extends Component { } render () { + let body = null; + + if (this.isOnApp()) { + body = [ + this.props.children, + + ]; + } else { + body = [ + this.renderFirstRunDialog(), + , + this.props.children, + + ]; + } + return ( { this.renderSnackbar() }
- { this.renderFirstRunDialog() } - - { this.props.children } - + { body }
); @@ -101,6 +115,13 @@ export default class Application extends Component { }; } + isOnApp () { + const [root] = (window.location.hash || '') + .replace('#/', '').split('?')[0].split('/'); + + return root === 'app'; + } + onCloseError = () => { this.setState({ showError: false diff --git a/js/src/views/Application/style.css b/js/src/views/Application/style.css index f69e2ff723d..0b34f30e0c1 100644 --- a/js/src/views/Application/style.css +++ b/js/src/views/Application/style.css @@ -1,6 +1,6 @@ .container { - width: 100%; height: 100%; + width: 100%; } .toolbar { diff --git a/js/src/views/Dapp/dapp.js b/js/src/views/Dapp/dapp.js new file mode 100644 index 00000000000..087ae008f36 --- /dev/null +++ b/js/src/views/Dapp/dapp.js @@ -0,0 +1,21 @@ +import React, { Component, PropTypes } from 'react'; + +import styles from './style.css'; + +export default class Dapp extends Component { + static propTypes = { + params: PropTypes.object + }; + + render () { + const { name } = this.props.params; + const src = `dapps/${name}.html`; + + return ( + + ); + } +} diff --git a/js/src/views/Dapp/index.js b/js/src/views/Dapp/index.js new file mode 100644 index 00000000000..1a6b0393e44 --- /dev/null +++ b/js/src/views/Dapp/index.js @@ -0,0 +1 @@ +export default from './dapp'; diff --git a/js/src/views/Dapp/style.css b/js/src/views/Dapp/style.css new file mode 100644 index 00000000000..a675151b44a --- /dev/null +++ b/js/src/views/Dapp/style.css @@ -0,0 +1,5 @@ +.frame { + border: 0; + height: 100%; + width: 100%; +} diff --git a/js/src/views/Dapps/Summary/summary.js b/js/src/views/Dapps/Summary/summary.js index 3ab32a4ab99..2beeee892ce 100644 --- a/js/src/views/Dapps/Summary/summary.js +++ b/js/src/views/Dapps/Summary/summary.js @@ -1,4 +1,5 @@ import React, { Component, PropTypes } from 'react'; +import { Link } from 'react-router'; import Container, { Title } from '../../../ui/Container'; import IdentityIcon from '../../../ui/IdentityIcon'; @@ -20,12 +21,14 @@ export default class Summary extends Component { return null; } + const url = `/app/${app.url}`; + return ( { app.name }</a> } + title={ <Link to={ url }>{ app.name }</Link> } byline={ app.description } /> { this.props.children } </Container> diff --git a/js/src/views/Dapps/dapps.js b/js/src/views/Dapps/dapps.js index a409213643e..43a05a61f7b 100644 --- a/js/src/views/Dapps/dapps.js +++ b/js/src/views/Dapps/dapps.js @@ -15,7 +15,7 @@ export default class Dapps extends Component { name: 'GAVcoin', address: '0x6C5b287A875298f773225e72ce3fA8B2782e0347', description: 'Manage your GAVcoins, the hottest new property in crypto', - url: '/dapps/gavcoin.html' + url: 'gavcoin' } ] } From 82e3258a9b4bcdf4296bf1c7f29e2b37e0a6ece7 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Sat, 27 Aug 2016 10:29:30 +0200 Subject: [PATCH 0226/1062] sandbox restrictions on iframe url --- js/src/index.html | 1 - js/src/views/Dapp/dapp.js | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/js/src/index.html b/js/src/index.html index b88bbba457b..f7461d1323d 100644 --- a/js/src/index.html +++ b/js/src/index.html @@ -15,7 +15,6 @@ </head> <body> <div id="container"></div> - <script src="/parity.js"></script> <script src="app.js"></script> </body> </html> diff --git a/js/src/views/Dapp/dapp.js b/js/src/views/Dapp/dapp.js index 087ae008f36..c54ef26070c 100644 --- a/js/src/views/Dapp/dapp.js +++ b/js/src/views/Dapp/dapp.js @@ -14,6 +14,10 @@ export default class Dapp extends Component { return ( <iframe className={ styles.frame } + frameBorder={ 0 } + name={ name } + sandbox='allow-scripts' + scrolling='auto' src={ src }> </iframe> ); From 221b112a57486c853c51bfa3a39b5822c0bfb18e Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Sat, 27 Aug 2016 10:46:56 +0200 Subject: [PATCH 0227/1062] simplify rendering of child apps, paritybar returns to apps --- js/src/views/Application/TabBar/tabBar.js | 7 ++++- js/src/views/Application/application.js | 35 +++++++++-------------- js/src/views/Application/style.css | 5 ++-- js/src/views/ParityBar/parityBar.js | 21 ++------------ 4 files changed, 24 insertions(+), 44 deletions(-) diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index 1959fff2720..0ea716951a6 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -1,6 +1,6 @@ import React, { Component, PropTypes } from 'react'; -import Toolbar from 'material-ui/Toolbar'; +import { Toolbar, ToolbarGroup } from 'material-ui/Toolbar'; import { Tabs, Tab } from 'material-ui/Tabs'; import ActionAccountBalanceWallet from 'material-ui/svg-icons/action/account-balance-wallet'; @@ -25,6 +25,11 @@ export default class TabBar extends Component { return ( <Toolbar className={ styles.toolbar }> + <ToolbarGroup> + <img + className={ styles.logo } + src='/images/paritybar.png' /> + </ToolbarGroup> <Tabs className={ styles.tabs } value={ hash }> diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index b98c74c5a05..5da147f6253 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -53,27 +53,25 @@ export default class Application extends Component { } render () { - let body = null; - - if (this.isOnApp()) { - body = [ - this.props.children, - <ParityBar /> - ]; - } else { - body = [ - this.renderFirstRunDialog(), - <TabBar />, - this.props.children, - <Status /> - ]; + const [root] = (window.location.hash || '').replace('#/', '').split('/'); + + if (root === 'app') { + return ( + <div className={ styles.container }> + { this.props.children } + <ParityBar /> + </div> + ); } return ( <TooltipOverlay> { this.renderSnackbar() } <div className={ styles.container }> - { body } + { this.renderFirstRunDialog() } + <TabBar /> + { this.props.children } + <Status /> </div> </TooltipOverlay> ); @@ -115,13 +113,6 @@ export default class Application extends Component { }; } - isOnApp () { - const [root] = (window.location.hash || '') - .replace('#/', '').split('?')[0].split('/'); - - return root === 'app'; - } - onCloseError = () => { this.setState({ showError: false diff --git a/js/src/views/Application/style.css b/js/src/views/Application/style.css index 0b34f30e0c1..1109215a526 100644 --- a/js/src/views/Application/style.css +++ b/js/src/views/Application/style.css @@ -15,6 +15,7 @@ } .logo { - height: 56px; - padding: 8px 3em 8px 0; + height: 28px; + width: 87px; + margin: 22px 3em 0 0; } diff --git a/js/src/views/ParityBar/parityBar.js b/js/src/views/ParityBar/parityBar.js index 37b5f55688e..ce3e78e51cc 100644 --- a/js/src/views/ParityBar/parityBar.js +++ b/js/src/views/ParityBar/parityBar.js @@ -1,28 +1,18 @@ -import React, { Component, PropTypes } from 'react'; +import React, { Component } from 'react'; import { IconButton } from 'material-ui'; import ActionSwapVert from 'material-ui/svg-icons/action/swap-vert'; -import Api from '../../api'; -import muiTheme from '../../ui/Theme'; - import styles from './style.css'; -const api = new Api(new Api.Transport.Http('/rpc/')); - export default class ParityBar extends Component { - static childContextTypes = { - api: PropTypes.object, - muiTheme: PropTypes.object - } - render () { return ( <div className={ styles.bar }> <div className={ styles.corner }> <a className={ styles.noshow } - href='/'> + href='/#/apps'> <img className={ styles.logo } src='/images/paritybar.png' /> @@ -34,11 +24,4 @@ export default class ParityBar extends Component { </div> ); } - - getChildContext () { - return { - api, - muiTheme - }; - } } From bd2d2aa13edc77c1f9a46c92b62ecfff34451bb8 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Sat, 27 Aug 2016 11:23:30 +0200 Subject: [PATCH 0228/1062] ordering & property access --- .../dapps/gavcoin/Application/application.js | 63 ++++++++----------- js/src/dapps/gavcoin/Status/status.js | 6 +- 2 files changed, 28 insertions(+), 41 deletions(-) diff --git a/js/src/dapps/gavcoin/Application/application.js b/js/src/dapps/gavcoin/Application/application.js index 11d84b259eb..4349486908b 100644 --- a/js/src/dapps/gavcoin/Application/application.js +++ b/js/src/dapps/gavcoin/Application/application.js @@ -31,15 +31,15 @@ export default class Application extends Component { state = { action: null, address: null, + accounts: [], + blockNumber: null, ethBalance: new BigNumber(0), gavBalance: new BigNumber(0), - accounts: [], instance: null, loading: true, - blockNumber: null, - totalSupply: null, + price: null, remaining: null, - price: null + totalSupply: null } componentDidMount () { @@ -47,70 +47,57 @@ export default class Application extends Component { } render () { - return ( - <div> - { this.renderLoading() } - { this.renderInterface() } - </div> - ); - } - - renderLoading () { - if (!this.state.loading) { - return null; - } - - return ( - <Loading /> - ); - } + const { accounts, address, blockNumber, gavBalance, loading, price, remaining, totalSupply } = this.state; - renderInterface () { - if (this.state.loading) { - return null; + if (loading) { + return ( + <Loading /> + ); } return ( <div> { this.renderModals() } <Status - gavBalance={ this.state.gavBalance } - address={ this.state.address } - blockNumber={ this.state.blockNumber } - totalSupply={ this.state.totalSupply } - remaining={ this.state.remaining } - price={ this.state.price }> + address={ address } + blockNumber={ blockNumber } + gavBalance={ gavBalance } + price={ price } + remaining={ remaining } + totalSupply={ totalSupply }> <Accounts - accounts={ this.state.accounts } /> + accounts={ accounts } /> </Status> <Actions onAction={ this.onAction } /> <Events - accounts={ this.state.accounts } /> + accounts={ accounts } /> </div> ); } renderModals () { - switch (this.state.action) { + const { action, accounts, price } = this.state; + + switch (action) { case 'BuyIn': return ( <ActionBuyIn - accounts={ this.state.accounts } - price={ this.state.price } + accounts={ accounts } + price={ price } onClose={ this.onActionClose } /> ); case 'Refund': return ( <ActionRefund - accounts={ this.state.accounts } - price={ this.state.price } + accounts={ accounts } + price={ price } onClose={ this.onActionClose } /> ); case 'Transfer': return ( <ActionTransfer - accounts={ this.state.accounts } + accounts={ accounts } onClose={ this.onActionClose } /> ); default: diff --git a/js/src/dapps/gavcoin/Status/status.js b/js/src/dapps/gavcoin/Status/status.js index 955347e1c07..da87c508fc5 100644 --- a/js/src/dapps/gavcoin/Status/status.js +++ b/js/src/dapps/gavcoin/Status/status.js @@ -16,12 +16,12 @@ export default class Status extends Component { } render () { - if (!this.props.totalSupply) { + const { blockNumber, gavBalance, totalSupply, remaining, price } = this.props; + + if (!totalSupply) { return null; } - const { blockNumber, gavBalance, totalSupply, remaining, price } = this.props; - return ( <div className={ styles.status }> <div className={ styles.item }> From 7e2769e3531f985c7d7c5ba36810e3570a6ece05 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Sat, 27 Aug 2016 12:07:50 +0200 Subject: [PATCH 0229/1062] move status polling to the application --- js/src/views/Application/Status/status.js | 48 +++++------------------ js/src/views/Application/Status/style.css | 9 +++++ js/src/views/Application/application.js | 33 +++++++++++++++- 3 files changed, 51 insertions(+), 39 deletions(-) diff --git a/js/src/views/Application/Status/status.js b/js/src/views/Application/Status/status.js index ec8adb5f723..5772a62a249 100644 --- a/js/src/views/Application/Status/status.js +++ b/js/src/views/Application/Status/status.js @@ -1,51 +1,23 @@ -import React, { Component } from 'react'; +import React, { Component, PropTypes } from 'react'; import styles from './style.css'; export default class Status extends Component { - static contextTypes = { - api: React.PropTypes.object - } - - state = { - clientVersion: '', - peerCount: 0, - blockNumber: 0, - syncing: false - } - - componentWillMount () { - this.poll(); + static propTypes = { + blockNumber: PropTypes.object, + clientVersion: PropTypes.string, + peerCount: PropTypes.object } render () { + const { clientVersion, blockNumber, peerCount } = this.props; + return ( <div className={ styles.status }> - <div>{ this.state.clientVersion }</div> - <div>{ this.state.blockNumber } blocks</div> - <div>{ this.state.peerCount } peers</div> + <div className={ styles.version }>{ clientVersion }</div> + <div> className={ styles.block }{ blockNumber.toFormat() } blocks</div> + <div className={ styles.peers }>{ peerCount.toFormat() } peers</div> </div> ); } - - poll () { - const api = this.context.api; - - Promise - .all([ - api.web3.clientVersion(), - api.net.peerCount(), - api.eth.blockNumber(), - api.eth.syncing() - ]) - .then(([clientVersion, peerCount, blockNumber, syncing]) => { - setTimeout(() => this.poll(), 2500); - this.setState({ - blockNumber: blockNumber.toFormat(0), - clientVersion: clientVersion, - peerCount: peerCount.toString(), - syncing: syncing - }); - }); - } } diff --git a/js/src/views/Application/Status/style.css b/js/src/views/Application/Status/style.css index a79f2825dab..f31f98c1301 100644 --- a/js/src/views/Application/Status/style.css +++ b/js/src/views/Application/Status/style.css @@ -10,3 +10,12 @@ font-weight: bold; margin: 0 0.5em 0 2em; } + +.block { +} + +.peers { +} + +.version { +} diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index 5da147f6253..e368b6f9e08 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -1,3 +1,4 @@ +import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; import { Snackbar } from 'material-ui'; @@ -39,6 +40,9 @@ export default class Application extends Component { } state = { + blockNumber: new BigNumber(0), + clientVersion: '', + peerCount: new BigNumber(0), showError: false, showFirst: false, accounts: [], @@ -50,9 +54,11 @@ export default class Application extends Component { componentWillMount () { this.retrieveBalances(); this.retrieveTokens(); + this.pollStatus(); } render () { + const { blockNumber, clientVersion, peerCount } = this.state; const [root] = (window.location.hash || '').replace('#/', '').split('/'); if (root === 'app') { @@ -71,7 +77,10 @@ export default class Application extends Component { { this.renderFirstRunDialog() } <TabBar /> { this.props.children } - <Status /> + <Status + blockNumber={ blockNumber } + clientVersion={ clientVersion } + peerCount={ peerCount } /> </div> </TooltipOverlay> ); @@ -262,6 +271,28 @@ export default class Application extends Component { }); } + pollStatus () { + const nextTimeout = () => setTimeout(() => this.pollStatus(), 2500); + Promise + .all([ + api.web3.clientVersion(), + api.net.peerCount(), + api.eth.blockNumber(), + api.eth.syncing() + ]) + .then(([clientVersion, peerCount, blockNumber, syncing]) => { + this.setState({ + blockNumber, + clientVersion, + peerCount, + syncing + }, nextTimeout); + }) + .catch(() => { + nextTimeout(); + }); + } + onCloseFirst = () => { this.setState({ showFirst: false From 6c952df6e17c610a0713debec620e46537c611a3 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Sat, 27 Aug 2016 12:10:07 +0200 Subject: [PATCH 0230/1062] adjust formatting --- js/src/views/Application/Status/status.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/js/src/views/Application/Status/status.js b/js/src/views/Application/Status/status.js index 5772a62a249..7c5e51de900 100644 --- a/js/src/views/Application/Status/status.js +++ b/js/src/views/Application/Status/status.js @@ -6,7 +6,8 @@ export default class Status extends Component { static propTypes = { blockNumber: PropTypes.object, clientVersion: PropTypes.string, - peerCount: PropTypes.object + peerCount: PropTypes.object, + network: PropTypes.string } render () { @@ -14,9 +15,15 @@ export default class Status extends Component { return ( <div className={ styles.status }> - <div className={ styles.version }>{ clientVersion }</div> - <div> className={ styles.block }{ blockNumber.toFormat() } blocks</div> - <div className={ styles.peers }>{ peerCount.toFormat() } peers</div> + <div className={ styles.version }> + { clientVersion } + </div> + <div className={ styles.block }> + { blockNumber.toFormat() } blocks + </div> + <div className={ styles.peers }> + { peerCount.toFormat() } peers + </div> </div> ); } From e44694ec11234ec164001f55c156e51c382acd90 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Sat, 27 Aug 2016 12:41:27 +0200 Subject: [PATCH 0231/1062] remove primary tag from floating buttons --- js/src/modals/CreateAccount/NewImport/newImport.js | 2 +- js/src/modals/Transfer/Details/details.js | 2 +- js/src/modals/Transfer/style.css | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/js/src/modals/CreateAccount/NewImport/newImport.js b/js/src/modals/CreateAccount/NewImport/newImport.js index 7b81deba324..1f9f82a98cf 100644 --- a/js/src/modals/CreateAccount/NewImport/newImport.js +++ b/js/src/modals/CreateAccount/NewImport/newImport.js @@ -75,7 +75,7 @@ export default class NewImport extends Component { value={ this.state.walletFile } /> <div className={ styles.upload }> <FloatingActionButton - primary mini + mini onTouchTap={ this.openFileDialog }> <EditorAttachFile /> </FloatingActionButton> diff --git a/js/src/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js index bda7c609c43..5a56b7691d2 100644 --- a/js/src/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -109,7 +109,7 @@ export default class Details extends Component { </div> <div className={ styles.floatbutton }> <FloatingActionButton - primary mini + mini onTouchTap={ this.onContacts }> <CommunicationContacts /> </FloatingActionButton> diff --git a/js/src/modals/Transfer/style.css b/js/src/modals/Transfer/style.css index 9fd85dda90b..c2221c90892 100644 --- a/js/src/modals/Transfer/style.css +++ b/js/src/modals/Transfer/style.css @@ -60,5 +60,5 @@ .grayscale { -webkit-filter: grayscale(1); filter: grayscale(1); - opacity: 0.75; + opacity: 0; } From 0951790f51bd26adc5349f846d05e42864b013bd Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Sat, 27 Aug 2016 13:16:09 +0200 Subject: [PATCH 0232/1062] font-weight 300 everywhere, only font imported --- js/src/dapps/gavcoin.html | 5 ++--- js/src/dapps/gavcoin/Accounts/style.css | 2 -- js/src/dapps/gavcoin/Actions/style.css | 5 ----- js/src/dapps/gavcoin/Status/style.css | 1 - js/src/dapps/registry.html | 5 ++--- js/src/dapps/tokenreg.html | 5 ++--- js/src/index.html | 4 ++-- js/src/modals/AddressSelector/style.css | 1 - js/src/ui/Modal/ModalSteps/style.css | 1 - js/src/ui/Tooltip/style.css | 2 +- js/src/views/Application/Status/style.css | 1 - 11 files changed, 9 insertions(+), 23 deletions(-) diff --git a/js/src/dapps/gavcoin.html b/js/src/dapps/gavcoin.html index bd52eccb0d6..272e7ec6465 100644 --- a/js/src/dapps/gavcoin.html +++ b/js/src/dapps/gavcoin.html @@ -5,8 +5,8 @@ <meta name="viewport" content="width=device-width"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>GAVcoin - - + +
diff --git a/js/src/dapps/gavcoin.js b/js/src/dapps/gavcoin.js index a42c2573925..240d533d303 100644 --- a/js/src/dapps/gavcoin.js +++ b/js/src/dapps/gavcoin.js @@ -6,6 +6,9 @@ injectTapEventPlugin(); import Application from './gavcoin/Application'; +import './style.css'; +import './gavcoin.html'; + ReactDOM.render( , document.querySelector('#container') diff --git a/js/src/dapps/registry.html b/js/src/dapps/registry.html index 71ee4abe362..a1bbeb13a59 100644 --- a/js/src/dapps/registry.html +++ b/js/src/dapps/registry.html @@ -7,24 +7,6 @@ Registry -
diff --git a/js/src/dapps/registry.js b/js/src/dapps/registry.js index 32bae1bf9f5..c4f12c7758c 100644 --- a/js/src/dapps/registry.js +++ b/js/src/dapps/registry.js @@ -6,6 +6,9 @@ injectTapEventPlugin(); import Application from './registry/Application'; +import './style.css'; +import './registry.html'; + ReactDOM.render( , document.querySelector('#container') diff --git a/js/src/dapps/style.css b/js/src/dapps/style.css new file mode 100644 index 00000000000..3defa49050f --- /dev/null +++ b/js/src/dapps/style.css @@ -0,0 +1,18 @@ +:root body, +:root html { + background: #fff; + border: 0; + color: #333; + font-size: 16px; + font-family: 'Roboto', sans-serif; + margin: 0; + padding: 0; + vertical-align: top; +} + +:root body, +:root html, +:root #container { + height: 100%; + width: 100%; +} diff --git a/js/src/dapps/tokenreg.html b/js/src/dapps/tokenreg.html index 76bfa8a8d4a..7336753603a 100644 --- a/js/src/dapps/tokenreg.html +++ b/js/src/dapps/tokenreg.html @@ -7,24 +7,6 @@ GAVcoin -
diff --git a/js/src/dapps/tokenreg.js b/js/src/dapps/tokenreg.js index ca26435d71d..1fe54417d3e 100644 --- a/js/src/dapps/tokenreg.js +++ b/js/src/dapps/tokenreg.js @@ -6,6 +6,9 @@ injectTapEventPlugin(); import Application from './tokenreg/Application'; +import './style.css'; +import './tokenreg.html'; + ReactDOM.render( , document.querySelector('#container') From f2c7643057dd5f0ba3ea404a1948a9fb7f3891f2 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 31 Aug 2016 20:47:56 +0200 Subject: [PATCH 0274/1062] rework build to actually output all html & js (not well sorted atm) --- js/src/index.html | 2 +- js/src/{app.js => index.js} | 1 + js/src/views/Dapp/dapp.js | 2 +- js/src/web3.js | 2 ++ js/webpack.config.js | 13 ++++++++----- 5 files changed, 13 insertions(+), 7 deletions(-) rename js/src/{app.js => index.js} (98%) diff --git a/js/src/index.html b/js/src/index.html index 1d00d612cb4..0450813e787 100644 --- a/js/src/index.html +++ b/js/src/index.html @@ -15,6 +15,6 @@
- + diff --git a/js/src/app.js b/js/src/index.js similarity index 98% rename from js/src/app.js rename to js/src/index.js index 3e334f43d18..52a34514eb9 100644 --- a/js/src/app.js +++ b/js/src/index.js @@ -17,6 +17,7 @@ import Signer from './views/Signer'; import Application from './views/Application'; import styles from './reset.css'; +import './index.html'; const routerHistory = useRouterHistory(createHashHistory)({}); diff --git a/js/src/views/Dapp/dapp.js b/js/src/views/Dapp/dapp.js index c54ef26070c..43e631be82d 100644 --- a/js/src/views/Dapp/dapp.js +++ b/js/src/views/Dapp/dapp.js @@ -9,7 +9,7 @@ export default class Dapp extends Component { render () { const { name } = this.props.params; - const src = `dapps/${name}.html`; + const src = `${name}.html`; return ( -
- ); - } -} diff --git a/js/src/views/Signer-new/style.css b/js/src/views/Signer-new/style.css deleted file mode 100644 index c0742e68532..00000000000 --- a/js/src/views/Signer-new/style.css +++ /dev/null @@ -1,5 +0,0 @@ -.iframe { - width: 100%; - height: 100%; - border: none; -} diff --git a/js/src/views/Signer/app.js b/js/src/views/Signer-old/app.js similarity index 100% rename from js/src/views/Signer/app.js rename to js/src/views/Signer-old/app.js diff --git a/js/src/views/Signer/app.spec.js b/js/src/views/Signer-old/app.spec.js similarity index 100% rename from js/src/views/Signer/app.spec.js rename to js/src/views/Signer-old/app.spec.js diff --git a/js/src/views/Signer/index.css b/js/src/views/Signer-old/index.css similarity index 100% rename from js/src/views/Signer/index.css rename to js/src/views/Signer-old/index.css diff --git a/js/src/views/Signer/index.html b/js/src/views/Signer-old/index.html similarity index 100% rename from js/src/views/Signer/index.html rename to js/src/views/Signer-old/index.html diff --git a/js/src/views/Signer-old/index.js b/js/src/views/Signer-old/index.js new file mode 100644 index 00000000000..04d299c58a2 --- /dev/null +++ b/js/src/views/Signer-old/index.js @@ -0,0 +1,16 @@ +import './index.html'; + +const app = window.paritySigner; // exposed by app.js + +initApp(); + +function initApp () { + const initToken = window.localStorage.getItem('sysuiToken'); + // TODO [ToDr] Hardcoded address should replaced with options + const address = process.env.NODE_ENV === 'production' ? window.location.host : '127.0.0.1:8180'; + app(initToken, tokenSetter, address); +} + +function tokenSetter (token, cb) { + window.localStorage.setItem('sysuiToken', token); +} diff --git a/js/src/views/Signer/actions/requests.js b/js/src/views/Signer/actions/requests.js index dcba5f40a2e..35f2fb1a047 100644 --- a/js/src/views/Signer/actions/requests.js +++ b/js/src/views/Signer/actions/requests.js @@ -1,5 +1,5 @@ -import { withToastr } from 'dapps-react-components/src/util/toastr'; -import { identity } from 'dapps-react-components/src/util/util'; +import { withToastr } from '../dappscomponents/util/toastr'; +import { identity } from '../dappscomponents/util/util'; import { createAction } from 'redux-actions'; diff --git a/js/src/views/Signer/components/Requests/Requests.js b/js/src/views/Signer/components/Requests/Requests.js index c135af0fd7e..d952d7e1b5b 100644 --- a/js/src/views/Signer/components/Requests/Requests.js +++ b/js/src/views/Signer/components/Requests/Requests.js @@ -1,5 +1,6 @@ import React, { Component, PropTypes } from 'react'; -import { RequestPendingWeb3, RequestFinishedWeb3 } from 'dapps-react-components'; +import { RequestPendingWeb3, RequestFinishedWeb3 } from '../../dappscomponents'; + import styles from './Requests.css'; export default class Requests extends Component { diff --git a/js/src/views/Signer/dappscomponents/Account/Account.css b/js/src/views/Signer/dappscomponents/Account/Account.css new file mode 100644 index 00000000000..a5720700f5d --- /dev/null +++ b/js/src/views/Signer/dappscomponents/Account/Account.css @@ -0,0 +1,28 @@ +.acc { + text-align: center; + display: inline-block; +} + +.acc > * { + display: block; +} + +.address { + font-family: monospace; +} + +.acc img { + width: 28px; + height: 28px; + vertical-align: middle; + margin-right: 3px; +} + +.name { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + max-width: 110px; + display: inline-block; + vertical-align: middle; +} diff --git a/js/src/views/Signer/dappscomponents/Account/Account.js b/js/src/views/Signer/dappscomponents/Account/Account.js new file mode 100644 index 00000000000..4313f4ae66f --- /dev/null +++ b/js/src/views/Signer/dappscomponents/Account/Account.js @@ -0,0 +1,97 @@ +import React, { Component, PropTypes } from 'react'; + +import styles from './Account.css'; + +import Identicon from '../Identicon'; +import AccountLink from '../AccountLink'; + +export default class Account extends Component { + + static propTypes = { + className: PropTypes.string, + address: PropTypes.string.isRequired, + chain: PropTypes.string.isRequired, + balance: PropTypes.object, // eth BigNumber, not required since it mght take time to fetch + name: PropTypes.string + }; + + state = { + balanceDisplay: '?' + }; + + componentWillMount () { + this.updateBalanceDisplay(this.props.balance); + } + + componentWillReceiveProps (nextProps) { + if (nextProps.balance === this.props.balance) { + return; + } + this.updateBalanceDisplay(nextProps.balance); + } + + updateBalanceDisplay (balance) { + this.setState({ + balanceDisplay: balance ? balance.div(1e18).toFormat(3) : '?' + }); + } + + render () { + const { address, chain, className } = this.props; + return ( +
+ + { this.renderName() } + { this.renderBalance() } +
+ ); + } + + renderTitle () { + const { name, address } = this.props; + if (name) { + return address + ' ' + name; + } + + return address; + } + + renderBalance () { + const { balanceDisplay } = this.state; + return ( + { balanceDisplay } ETH + ); + } + + renderName () { + const { address, name } = this.props; + if (!name) { + return ( + + [{ this.shortAddress(address) }] + + ); + } + return ( + + + { name } + [{ this.tinyAddress(address) }] + + + ); + } + + tinyAddress () { + const { address } = this.props; + const len = address.length; + return address.slice(2, 4) + '..' + address.slice(len - 2); + } + + shortAddress () { + const { address } = this.props; + const len = address.length; + return address.slice(2, 8) + '..' + address.slice(len - 7); + } + +} diff --git a/js/src/views/Signer/dappscomponents/Account/index.js b/js/src/views/Signer/dappscomponents/Account/index.js new file mode 100644 index 00000000000..c394212a501 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/Account/index.js @@ -0,0 +1 @@ +export default from './Account'; diff --git a/js/src/views/Signer/dappscomponents/AccountLink/AccountLink.css b/js/src/views/Signer/dappscomponents/AccountLink/AccountLink.css new file mode 100644 index 00000000000..1e27734b420 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/AccountLink/AccountLink.css @@ -0,0 +1,4 @@ +.container { + text-decoration: none; + color: inherit; +} \ No newline at end of file diff --git a/js/src/views/Signer/dappscomponents/AccountLink/AccountLink.js b/js/src/views/Signer/dappscomponents/AccountLink/AccountLink.js new file mode 100644 index 00000000000..5b2a6fb2b53 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/AccountLink/AccountLink.js @@ -0,0 +1,47 @@ +import React, { Component, PropTypes } from 'react'; + +import { getAccountLink } from '../util/account'; +import styles from './AccountLink.css'; + +export default class AccountLink extends Component { + + static propTypes = { + chain: PropTypes.string.isRequired, + address: PropTypes.string.isRequired, + className: PropTypes.string, + children: PropTypes.node + } + + state = { + link: null + }; + + componentWillMount () { + const { address, chain } = this.props; + this.updateLink(address, chain); + } + + componentWillReceiveProps (nextProps) { + const { address, chain } = nextProps; + this.updateLink(address, chain); + } + + render () { + const { children, address, className } = this.props; + return ( + + { children || address } + + ); + } + + updateLink (address, chain) { + const link = getAccountLink(address, chain); + this.setState({ link }); + } + +} diff --git a/js/src/views/Signer/dappscomponents/AccountLink/index.js b/js/src/views/Signer/dappscomponents/AccountLink/index.js new file mode 100644 index 00000000000..5604e3d48ef --- /dev/null +++ b/js/src/views/Signer/dappscomponents/AccountLink/index.js @@ -0,0 +1 @@ +export default from './AccountLink'; diff --git a/js/src/views/Signer/dappscomponents/AccountWeb3/AccountWeb3.js b/js/src/views/Signer/dappscomponents/AccountWeb3/AccountWeb3.js new file mode 100644 index 00000000000..591944f378f --- /dev/null +++ b/js/src/views/Signer/dappscomponents/AccountWeb3/AccountWeb3.js @@ -0,0 +1,61 @@ +import React, { Component, PropTypes } from 'react'; + +import logger from '../util/logger'; +import Account from '../Account'; +import Web3Compositor from '../Web3Compositor'; + +class AccountWeb3 extends Component { + + static contextTypes = { + web3: PropTypes.object.isRequired + }; + + static propTypes = { + address: PropTypes.string.isRequired, + chain: PropTypes.string.isRequired, + className: PropTypes.object, + name: PropTypes.string + } + + state = { + balance: null + }; + + // from Web3Compositor + onTick (next) { + this.fetchBalance(next); + } + + fetchBalance (next) { + const { address } = this.props; + this.context.web3.eth.getBalance(address, (err, balance) => { + next(err); + + if (err) { + logger.warn('err fetching balance for ', address, err); + return; + } + + this.setState({ + balance + }); + }); + } + + render () { + const { balance } = this.state; + const { address, chain, className, name } = this.props; + return ( + + ); + } + +} + +export default Web3Compositor(AccountWeb3); diff --git a/js/src/views/Signer/dappscomponents/AccountWeb3/index.js b/js/src/views/Signer/dappscomponents/AccountWeb3/index.js new file mode 100644 index 00000000000..3c2dbf6a66a --- /dev/null +++ b/js/src/views/Signer/dappscomponents/AccountWeb3/index.js @@ -0,0 +1 @@ +export default from './AccountWeb3'; diff --git a/js/src/views/Signer/dappscomponents/AnimateChildren/AnimateChildren.css b/js/src/views/Signer/dappscomponents/AnimateChildren/AnimateChildren.css new file mode 100644 index 00000000000..5c32516f23a --- /dev/null +++ b/js/src/views/Signer/dappscomponents/AnimateChildren/AnimateChildren.css @@ -0,0 +1,39 @@ +/* todo [adgo] - make local */ +:global .transition-appear { + opacity: 0.01; +} + +:global .transition-appear.transition-appear-active { + opacity: 1; + transition: opacity .3s ease-in-out; +} + +:global .transition-enter { + opacity: 0.01; +} + +:global .transition-enter.transition-enter-active { + opacity: 1; + transition: opacity .3s ease-in-out; +} + +:global .transition-leave { + opacity: 1; +} + +:global .transition-leave.transition-leave-active { + opacity: 0.01; + transition: opacity .3s ease-in-out; +} + +:global .absoluteAnimationContainer { + position: relative; +} + +:global .absoluteAnimationContainer > .transition-leave { + position: absolute; + top: 0; + left: 0; + right: 0; + width: 100%; +} diff --git a/js/src/views/Signer/dappscomponents/AnimateChildren/AnimateChildren.js b/js/src/views/Signer/dappscomponents/AnimateChildren/AnimateChildren.js new file mode 100644 index 00000000000..272fba7d9db --- /dev/null +++ b/js/src/views/Signer/dappscomponents/AnimateChildren/AnimateChildren.js @@ -0,0 +1,49 @@ +import React, { Component, PropTypes } from 'react'; +import ReactCSSTransitionGroup from 'react-addons-css-transition-group'; + +import { isReactComponent } from '../util/react'; +import './AnimateChildren.css'; + +export default class AnimateChildren extends Component { + + static propTypes = { + children: PropTypes.node.isRequired, + pathname: PropTypes.string, + isView: PropTypes.bool, + absolute: PropTypes.bool + } + + render () { + const className = this.props.absolute ? 'absoluteAnimationContainer' : ''; + return ( + + { this.renderChildren() } + + ); + } + + renderChildren () { + const { children, isView } = this.props; + + if (isView) { + return React.cloneElement(this.props.children, { + key: this.props.pathname + }); + } + + if (isReactComponent(children)) { + return React.cloneElement(this.props.children, { ...this.props }); + } + + return children; + } + +} diff --git a/js/src/views/Signer/dappscomponents/AnimateChildren/index.js b/js/src/views/Signer/dappscomponents/AnimateChildren/index.js new file mode 100644 index 00000000000..f9d11178a7d --- /dev/null +++ b/js/src/views/Signer/dappscomponents/AnimateChildren/index.js @@ -0,0 +1 @@ +export default from './AnimateChildren'; diff --git a/js/src/views/Signer/dappscomponents/Identicon/Identicon.css b/js/src/views/Signer/dappscomponents/Identicon/Identicon.css new file mode 100644 index 00000000000..9f549f38aa4 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/Identicon/Identicon.css @@ -0,0 +1,7 @@ +.icon { + max-width: 100%; + max-height: 100%; + border-radius: 50%; + box-shadow: inset 0 0 20px #555; +} + diff --git a/js/src/views/Signer/dappscomponents/Identicon/Identicon.js b/js/src/views/Signer/dappscomponents/Identicon/Identicon.js new file mode 100644 index 00000000000..fc525dd5ebf --- /dev/null +++ b/js/src/views/Signer/dappscomponents/Identicon/Identicon.js @@ -0,0 +1,57 @@ +import React, { Component, PropTypes } from 'react'; + +import styles from './Identicon.css'; +import AccountLink from '../AccountLink'; + +import blockies from 'blockies'; + +export default class Identicon extends Component { + + static propTypes = { + chain: PropTypes.string.isRequired, + address: PropTypes.string.isRequired, + className: PropTypes.string + }; + + static defaultProps = { + className: '' + }; + + state = { + src: '' + }; + + componentDidMount () { + this.updateIcon(this.props.address); + } + + componentWillReceiveProps (newProps) { + if (newProps.address === this.props.address) { + return; + } + this.updateIcon(newProps.address); + } + + updateIcon (address) { + const dataUrl = blockies({ + seed: address.toLowerCase(), // in case it's a checksummed address + size: 8, + scale: 8 + }).toDataURL(); + + this.setState({ + src: dataUrl + }); + } + + render () { + const { address, chain, className } = this.props; + + return ( + + + + ); + } + +} diff --git a/js/src/views/Signer/dappscomponents/Identicon/index.js b/js/src/views/Signer/dappscomponents/Identicon/index.js new file mode 100644 index 00000000000..e1bb41b7982 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/Identicon/index.js @@ -0,0 +1 @@ +export default from './Identicon'; diff --git a/js/src/views/Signer/dappscomponents/MuiThemeProvider/MuiThemeProvider.js b/js/src/views/Signer/dappscomponents/MuiThemeProvider/MuiThemeProvider.js new file mode 100644 index 00000000000..b4e6ebde3ab --- /dev/null +++ b/js/src/views/Signer/dappscomponents/MuiThemeProvider/MuiThemeProvider.js @@ -0,0 +1,30 @@ + +import React, { Component, PropTypes } from 'react'; + +import { deepOrange500 } from 'material-ui/styles/colors'; +import getMuiTheme from 'material-ui/styles/getMuiTheme'; +import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; + +const muiTheme = getMuiTheme({ + fontFamily: '"Source Sans Pro", "Helvetica Neue", arial, sans-serif', + palette: { + primary1Color: '#6691C2', + accent1Color: deepOrange500 + } +}); + +export default class WrappedMuiThemeProvider extends Component { + + render () { + return ( + + { this.props.children } + + ); + } + + static propTypes = { + children: PropTypes.object.isRequired + } + +} diff --git a/js/src/views/Signer/dappscomponents/MuiThemeProvider/index.js b/js/src/views/Signer/dappscomponents/MuiThemeProvider/index.js new file mode 100644 index 00000000000..84638ececa8 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/MuiThemeProvider/index.js @@ -0,0 +1 @@ +export default from './MuiThemeProvider'; diff --git a/js/src/views/Signer/dappscomponents/RequestFinishedWeb3/RequestFinishedWeb3.js b/js/src/views/Signer/dappscomponents/RequestFinishedWeb3/RequestFinishedWeb3.js new file mode 100644 index 00000000000..60c950b5102 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/RequestFinishedWeb3/RequestFinishedWeb3.js @@ -0,0 +1,70 @@ +import React, { Component, PropTypes } from 'react'; + +import TransactionFinishedWeb3 from '../TransactionFinishedWeb3'; +import SignWeb3 from '../SignRequestWeb3'; +import Web3Compositor from '../Web3Compositor'; + +class RequestFinishedWeb3 extends Component { + + static contextTypes = { + web3: PropTypes.object.isRequired + }; + + static propTypes = { + id: PropTypes.string.isRequired, + result: PropTypes.any.isRequired, + payload: PropTypes.oneOfType([ + PropTypes.shape({ transaction: PropTypes.object.isRequired }), + PropTypes.shape({ sign: PropTypes.object.isRequired }) + ]).isRequired, + msg: PropTypes.string, + status: PropTypes.string, + error: PropTypes.string, + className: PropTypes.string + } + + render () { + const { payload, id, result, msg, status, error, className } = this.props; + + if (payload.sign) { + const { sign } = payload; + return ( + + ); + } + + if (payload.transaction) { + const { transaction } = payload; + return ( + + ); + } + + // Unknown payload + return null; + } +} + +export default Web3Compositor(RequestFinishedWeb3); diff --git a/js/src/views/Signer/dappscomponents/RequestFinishedWeb3/index.js b/js/src/views/Signer/dappscomponents/RequestFinishedWeb3/index.js new file mode 100644 index 00000000000..915ab789bf0 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/RequestFinishedWeb3/index.js @@ -0,0 +1 @@ +export default from './RequestFinishedWeb3'; diff --git a/js/src/views/Signer/dappscomponents/RequestPendingWeb3/RequestPendingWeb3.js b/js/src/views/Signer/dappscomponents/RequestPendingWeb3/RequestPendingWeb3.js new file mode 100644 index 00000000000..eea92dbe37d --- /dev/null +++ b/js/src/views/Signer/dappscomponents/RequestPendingWeb3/RequestPendingWeb3.js @@ -0,0 +1,68 @@ +import React, { Component, PropTypes } from 'react'; + +import TransactionPendingWeb3 from '../TransactionPendingWeb3'; +import SignWeb3 from '../SignRequestWeb3'; +import Web3Compositor from '../Web3Compositor'; + +class RequestPendingWeb3 extends Component { + + static contextTypes = { + web3: PropTypes.object.isRequired + }; + + static propTypes = { + id: PropTypes.string.isRequired, + onConfirm: PropTypes.func.isRequired, + onReject: PropTypes.func.isRequired, + isSending: PropTypes.bool.isRequired, + payload: PropTypes.oneOfType([ + PropTypes.shape({ transaction: PropTypes.object.isRequired }), + PropTypes.shape({ sign: PropTypes.object.isRequired }) + ]).isRequired, + className: PropTypes.string + }; + + render () { + const { payload, id, className, isSending, onConfirm, onReject } = this.props; + + if (payload.sign) { + const { sign } = payload; + return ( + + ); + } + + if (payload.transaction) { + const { transaction } = payload; + return ( + + ); + } + + // Unknown payload + return null; + } +} + +export default Web3Compositor(RequestPendingWeb3); diff --git a/js/src/views/Signer/dappscomponents/RequestPendingWeb3/index.js b/js/src/views/Signer/dappscomponents/RequestPendingWeb3/index.js new file mode 100644 index 00000000000..ecc4053ae90 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/RequestPendingWeb3/index.js @@ -0,0 +1 @@ +export default from './RequestPendingWeb3'; diff --git a/js/src/views/Signer/dappscomponents/RpcAutoComplete/RpcAutoComplete.js b/js/src/views/Signer/dappscomponents/RpcAutoComplete/RpcAutoComplete.js new file mode 100644 index 00000000000..d1b0cd796e4 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/RpcAutoComplete/RpcAutoComplete.js @@ -0,0 +1,37 @@ +import React, { Component, PropTypes } from 'react'; + +import AutoComplete from 'material-ui/AutoComplete'; +import rpcMethods from 'ethereum-rpc-json'; +const rpcMethodsNames = rpcMethods.map(m => m.name); + +export default class RpcAutoComplete extends Component { + + static propTypes = { + onNewRequest: PropTypes.func.isRequired, + className: PropTypes.string, + style: PropTypes.object, + floatingLabelText: PropTypes.string, + filter: PropTypes.func, + openOnFocus: PropTypes.bool + }; + + static defaultProps = { + filter: (searchText, key) => searchText === '' || key.toLowerCase().indexOf(searchText.toLowerCase()) !== -1, + name: 'RpcAutoComplete', // avoid material ui key bug + openOnFocus: true, + floatingLabelText: 'Choose Method' + }; + + shouldComponentUpdate () { + return false; + } + + render () { + return ( + + ); + } +} diff --git a/js/src/views/Signer/dappscomponents/RpcAutoComplete/index.js b/js/src/views/Signer/dappscomponents/RpcAutoComplete/index.js new file mode 100644 index 00000000000..9896464ec22 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/RpcAutoComplete/index.js @@ -0,0 +1 @@ +export default from './RpcAutoComplete'; diff --git a/js/src/views/Signer/dappscomponents/SignRequest/SignRequest.css b/js/src/views/Signer/dappscomponents/SignRequest/SignRequest.css new file mode 100644 index 00000000000..537dbb25d74 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/SignRequest/SignRequest.css @@ -0,0 +1,57 @@ +.container { + padding: 25px 0 15px; +} + +.actions, .signDetails { + display: inline-block; + vertical-align: middle; + min-height: 120px; +} + +.signDetails { + border-right: 1px solid #eee; + margin-right: 2rem; + /* TODO [todr] mess - just to align with transaction */ + width: 430px; +} + +.address, .info { + display: inline-block; +} + +.info { + padding: 0 30px; + width: 250px; + color: #E53935; + vertical-align: top; +} + +.info p:first-child { + margin-top: 0; +} + +/* TODO [todr] copy&paste from transactions */ +.isConfirmed { + color: green; +} + +.isRejected { + opacity: 0.7; +} + +.txHash { + word-break: break-all; +} + +.actions { + width: 180px; + display: inline-block; + min-height: 120px; +} + +.signDetails img { + display: inline-block; + width: 50px; + height: 50px; + margin: 5px; +} diff --git a/js/src/views/Signer/dappscomponents/SignRequest/SignRequest.js b/js/src/views/Signer/dappscomponents/SignRequest/SignRequest.js new file mode 100644 index 00000000000..e9c64f750d0 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/SignRequest/SignRequest.js @@ -0,0 +1,96 @@ +import React, { Component, PropTypes } from 'react'; + +import Account from '../Account'; +import TransactionPendingForm from '../TransactionPendingForm'; +import TxHashLink from '../TxHashLink'; + +import styles from './SignRequest.css'; + +export default class SignRequest extends Component { + + // TODO [todr] re-use proptypes? + static propTypes = { + id: PropTypes.string.isRequired, + address: PropTypes.string.isRequired, + hash: PropTypes.string.isRequired, + isFinished: PropTypes.bool.isRequired, + chain: PropTypes.string.isRequired, + balance: PropTypes.object, + isSending: PropTypes.bool, + onConfirm: PropTypes.func, + onReject: PropTypes.func, + status: PropTypes.string, + className: PropTypes.string + }; + + render () { + const className = this.props.className || ''; + return ( +
+ { this.renderDetails() } + { this.renderActions() } +
+ ); + } + + renderDetails () { + const { address, balance, chain, hash } = this.props; + + return ( +
+
+ +
+
+

Dapp is requesting to sign arbitrary transaction using this account.

+

Confirm the transaction only if you trust the app.

+
+
+ ); + } + + renderActions () { + const { isFinished, status } = this.props; + + if (isFinished) { + if (status === 'confirmed') { + const { chain, hash } = this.props; + + return ( +
+ Confirmed +
+ Transaction hash:
+ +
+
+ ); + } + + return ( +
+ Rejected +
+ ); + } + + return ( + + ); + } + + onConfirm = password => { + const { id } = this.props; + this.props.onConfirm({ id, password }); + } + + onReject = () => { + this.props.onReject(this.props.id); + } + +} diff --git a/js/src/views/Signer/dappscomponents/SignRequest/index.js b/js/src/views/Signer/dappscomponents/SignRequest/index.js new file mode 100644 index 00000000000..d54140c6c14 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/SignRequest/index.js @@ -0,0 +1 @@ +export default from './SignRequest'; diff --git a/js/src/views/Signer/dappscomponents/SignRequestWeb3/SignRequestWeb3.js b/js/src/views/Signer/dappscomponents/SignRequestWeb3/SignRequestWeb3.js new file mode 100644 index 00000000000..e7b22421b4a --- /dev/null +++ b/js/src/views/Signer/dappscomponents/SignRequestWeb3/SignRequestWeb3.js @@ -0,0 +1,85 @@ +import React, { Component, PropTypes } from 'react'; + +import SignRequest from '../SignRequest'; + +import Web3Compositor from '../Web3Compositor'; + +class SignRequestWeb3 extends Component { + + static contextTypes = { + web3: PropTypes.object.isRequired + }; + + static propTypes = { + id: PropTypes.string.isRequired, + address: PropTypes.string.isRequired, + hash: PropTypes.string.isRequired, + isFinished: PropTypes.bool.isRequired, + isSending: PropTypes.bool, + onConfirm: PropTypes.func, + onReject: PropTypes.func, + status: PropTypes.string, + className: PropTypes.string + }; + + state = { + chain: 'homestead', + balance: null // avoid required prop loading warning + } + + render () { + const { web3 } = this.context; + const { balance, chain } = this.state; + const { onConfirm, onReject, isSending, isFinished, hash, className, id, status } = this.props; + + const address = web3.toChecksumAddress(this.props.address); + + return ( + + ); + } + + onTick (next) { + this.fetchChain(); + this.fetchBalance(next); + } + + fetchChain () { + this.context.web3.ethcore.getNetChain((err, chain) => { + if (err) { + return console.warn('err fetching chain', err); + } + this.setState({ chain }); + }); + } + + fetchBalance (next) { + const { address } = this.props; + + this.context.web3.eth.getBalance(address, (err, balance) => { + next(err); + + if (err) { + console.warn('err fetching balance for ', address, err); + return; + } + + this.setState({ balance }); + }); + } + +} + +export default Web3Compositor(SignRequestWeb3); diff --git a/js/src/views/Signer/dappscomponents/SignRequestWeb3/index.js b/js/src/views/Signer/dappscomponents/SignRequestWeb3/index.js new file mode 100644 index 00000000000..db8576565cf --- /dev/null +++ b/js/src/views/Signer/dappscomponents/SignRequestWeb3/index.js @@ -0,0 +1 @@ +export default from './SignRequestWeb3'; diff --git a/js/src/views/Signer/dappscomponents/Toast/Toast.css b/js/src/views/Signer/dappscomponents/Toast/Toast.css new file mode 100644 index 00000000000..1be3f9e181a --- /dev/null +++ b/js/src/views/Signer/dappscomponents/Toast/Toast.css @@ -0,0 +1,49 @@ +.container { + padding: 15px; + position: relative; + font-size: 16px; + line-height: 19px; + margin-bottom: 1.2rem; + animation: fadein .5s; +} + +.container .remove { + opacity: 0; + padding: 0 !important; + width: 24px !important; + height: 24px !important; + transition: opacity .3s ease-in; +} +.container:hover .remove { + opacity: 0.5; +} + +.container.clickable { + cursor: pointer; +} + +.error { + background: #E53935 !important; + color: #fff !important; +} + +.success { + background: #43A047 !important; + color: #fff !important; +} + +.remove { + float: right; + cursor: pointer; + opacity: 0.5; +} + +.error .remove, +.success .remove { + color: #fff !important; +} + +@keyframes fadein { + from {opacity: 0;} + to {opacity: 1;} +} diff --git a/js/src/views/Signer/dappscomponents/Toast/Toast.js b/js/src/views/Signer/dappscomponents/Toast/Toast.js new file mode 100644 index 00000000000..4b5844eed93 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/Toast/Toast.js @@ -0,0 +1,61 @@ + +import React, { Component, PropTypes } from 'react'; +import Paper from 'material-ui/Paper'; +import IconButton from 'material-ui/IconButton'; +import RemoveIcon from 'material-ui/svg-icons/action/delete'; + +import styles from './Toast.css'; + +export default class Toast extends Component { + + static propTypes = { + className: PropTypes.string, + id: PropTypes.number.isRequired, + type: PropTypes.string.isRequired, + msg: PropTypes.string.isRequired, + onClickToast: PropTypes.func, + onRemoveToast: PropTypes.func + } + + render () { + const { msg, type, className, onClickToast } = this.props; + const clickableClass = onClickToast ? styles.clickable : ''; + return ( + + { this.renderActions() } + { msg } + + ); + } + + renderActions () { + if (!this.props.onRemoveToast) { + return; + } + + return ( + + + + ); + } + + onRemoveToast = evt => { + evt.stopPropagation(); + const { id, onRemoveToast } = this.props; + onRemoveToast(id); + } + + onClickToast = evt => { + const { id, onClickToast } = this.props; + if (!onClickToast) { + return; + } + onClickToast(id); + } + +} diff --git a/js/src/views/Signer/dappscomponents/Toast/index.js b/js/src/views/Signer/dappscomponents/Toast/index.js new file mode 100644 index 00000000000..9bc4efc8945 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/Toast/index.js @@ -0,0 +1 @@ +export default from './Toast'; diff --git a/js/src/views/Signer/dappscomponents/Toastr/Toastr.css b/js/src/views/Signer/dappscomponents/Toastr/Toastr.css new file mode 100644 index 00000000000..aa30d33915c --- /dev/null +++ b/js/src/views/Signer/dappscomponents/Toastr/Toastr.css @@ -0,0 +1,6 @@ +.container { + position: absolute; + top: 81px; + right: 10px; + width: 250px; +} diff --git a/js/src/views/Signer/dappscomponents/Toastr/Toastr.js b/js/src/views/Signer/dappscomponents/Toastr/Toastr.js new file mode 100644 index 00000000000..6fbf24675fb --- /dev/null +++ b/js/src/views/Signer/dappscomponents/Toastr/Toastr.js @@ -0,0 +1,37 @@ + +import React, { Component, PropTypes } from 'react'; + +import Toast from '../Toast'; +import styles from './Toastr.css'; + +export default class Toastr extends Component { + + static propTypes = { + className: PropTypes.string, + toasts: PropTypes.arrayOf( + PropTypes.shape({ + id: PropTypes.number.isRequired, + type: PropTypes.string.isRequired, + msg: PropTypes.string.isRequired + }) + ).isRequired, + onRemoveToast: PropTypes.func.isRequired + } + + render () { + const { className } = this.props; + return ( +
+ { this.renderToasts() } +
+ ); + } + + renderToasts () { + const { onRemoveToast } = this.props; + return this.props.toasts.map(t => ( + + )); + } + +} diff --git a/js/src/views/Signer/dappscomponents/Toastr/index.js b/js/src/views/Signer/dappscomponents/Toastr/index.js new file mode 100644 index 00000000000..a801549a883 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/Toastr/index.js @@ -0,0 +1 @@ +export default from './Toastr'; diff --git a/js/src/views/Signer/dappscomponents/TransactionFinished/TransactionFinished.css b/js/src/views/Signer/dappscomponents/TransactionFinished/TransactionFinished.css new file mode 100644 index 00000000000..82b70a5974c --- /dev/null +++ b/js/src/views/Signer/dappscomponents/TransactionFinished/TransactionFinished.css @@ -0,0 +1,30 @@ +.container { + padding: 25px 0 15px; +} + +.mainContainer > * { + display: inline-block; + vertical-align: middle; + min-height: 120px; +} + +.statusContainer { + width: 180px; +} + +.transactionDetails { + border-right: 1px solid #eee; + margin-right: 2rem; +} + +.isConfirmed { + color: green; +} + +.isRejected { + opacity: 0.7; +} + +.txHash { + word-break: break-all; +} diff --git a/js/src/views/Signer/dappscomponents/TransactionFinished/TransactionFinished.js b/js/src/views/Signer/dappscomponents/TransactionFinished/TransactionFinished.js new file mode 100644 index 00000000000..b4e977670d3 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/TransactionFinished/TransactionFinished.js @@ -0,0 +1,84 @@ +import React, { Component, PropTypes } from 'react'; + +import TransactionMainDetails from '../TransactionMainDetails'; +import TxHashLink from '../TxHashLink'; +import styles from './TransactionFinished.css'; + +import * as tUtil from '../util/transaction'; +import { capitalize } from '../util/util'; + +export default class TransactionFinished extends Component { + + static propTypes = { + id: PropTypes.string.isRequired, + from: PropTypes.string.isRequired, + fromBalance: PropTypes.object, // eth BigNumber, not required since it might take time to fetch + value: PropTypes.string.isRequired, // wei hex + chain: PropTypes.string.isRequired, + gasPrice: PropTypes.string.isRequired, // wei hex + gas: PropTypes.string.isRequired, // hex + status: PropTypes.string.isRequired, // rejected, confirmed + to: PropTypes.string, // undefined if it's a contract + toBalance: PropTypes.object, // eth BigNumber - undefined if it's a contract or until it's fetched + txHash: PropTypes.string, // undefined if transacation is rejected + className: PropTypes.string, + data: PropTypes.string + }; + + static defaultProps = { + value: '0x0' // todo [adgo] - remove after resolving https://github.com/ethcore/parity/issues/1458 + }; + + componentWillMount () { + const { gas, gasPrice, value } = this.props; + const fee = tUtil.getFee(gas, gasPrice); // BigNumber object + const totalValue = tUtil.getTotalValue(fee, value); + this.setState({ totalValue }); + } + + render () { + const { className } = this.props; + const { totalValue } = this.state; + + return ( +
+
+ +
+ { this.renderStatus() } +
+
+
+ ); + } + + renderStatus () { + const { status } = this.props; + const klass = status === 'confirmed' ? styles.isConfirmed : styles.isRejected; + return ( +
+ { capitalize(status) } + { this.renderTxHash() } +
+ ); + } + + renderTxHash () { + const { txHash, chain } = this.props; + if (!txHash) { + return; + } + + return ( +
+ Transaction hash:
+ +
+ ); + } + +} diff --git a/js/src/views/Signer/dappscomponents/TransactionFinished/index.js b/js/src/views/Signer/dappscomponents/TransactionFinished/index.js new file mode 100644 index 00000000000..d6a25956232 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/TransactionFinished/index.js @@ -0,0 +1 @@ +export default from './TransactionFinished'; diff --git a/js/src/views/Signer/dappscomponents/TransactionFinishedWeb3/TransactionFinishedWeb3.js b/js/src/views/Signer/dappscomponents/TransactionFinishedWeb3/TransactionFinishedWeb3.js new file mode 100644 index 00000000000..1b0db2c04ff --- /dev/null +++ b/js/src/views/Signer/dappscomponents/TransactionFinishedWeb3/TransactionFinishedWeb3.js @@ -0,0 +1,83 @@ +import React, { Component, PropTypes } from 'react'; + +import TransactionFinished from '../TransactionFinished'; +import Web3Compositor from '../Web3Compositor'; + +class TransactionFinishedWeb3 extends Component { + + static contextTypes = { + web3: PropTypes.object.isRequired + }; + + static propTypes = { + from: PropTypes.string.isRequired, + to: PropTypes.string // undefined if it's a contract + } + + state = { + chain: 'homestead' + }; + + onTick (next) { + this.fetchChain(); + this.fetchBalances(next); + } + + fetchBalances (next) { + const { from, to } = this.props; + this.fetchBalance(from, 'from', next); + + if (!to) { + return; + } + + this.fetchBalance(to, 'to', next); + } + + fetchBalance (address, owner, next) { + this.context.web3.eth.getBalance(address, (err, balance) => { + next(err); + + if (err) { + console.warn('err fetching balance for ', address, err); + return; + } + + this.setState({ + [owner + 'Balance']: balance + }); + }); + } + + fetchChain () { + this.context.web3.ethcore.getNetChain((err, chain) => { + if (err) { + return console.warn('err fetching chain', err); + } + + this.setState({ chain }); + }); + } + + render () { + const { fromBalance, toBalance, chain } = this.state; + const { web3 } = this.context; + + let { from, to } = this.props; + from = web3.toChecksumAddress(from); + to = to ? web3.toChecksumAddress(to) : to; + + return ( + + ); + } +} + +export default Web3Compositor(TransactionFinishedWeb3); diff --git a/js/src/views/Signer/dappscomponents/TransactionFinishedWeb3/index.js b/js/src/views/Signer/dappscomponents/TransactionFinishedWeb3/index.js new file mode 100644 index 00000000000..7ca36900b97 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/TransactionFinishedWeb3/index.js @@ -0,0 +1 @@ +export default from './TransactionFinishedWeb3'; diff --git a/js/src/views/Signer/dappscomponents/TransactionMainDetails/TransactionMainDetails.css b/js/src/views/Signer/dappscomponents/TransactionMainDetails/TransactionMainDetails.css new file mode 100644 index 00000000000..86bc616ea5d --- /dev/null +++ b/js/src/views/Signer/dappscomponents/TransactionMainDetails/TransactionMainDetails.css @@ -0,0 +1,48 @@ +.transaction { + margin-right: 30px; +} + +.transaction > * { + display: inline-block; +} + +.from img, .to img { + display: inline-block; + width: 50px; + height: 50px; + margin: 5px; +} +.from span, .to span { + display: block; +} + +.tx { + position: relative; + text-align: center; + margin-right: 10px; + margin-left: 10px; + width: 150px; + top: -20px; + white-space: nowrap; +} + +.total { + font-size: 0.6em; + opacity: .5; +} + +.contract { + position: relative; + bottom: 15px; + text-align: center; + width: 123px; +} + +.contractIcon { + background: #eee; + width: 50px !important; + height: 50px !important; + box-sizing: border-box; + border-radius: 50%; + padding: 13px; +} diff --git a/js/src/views/Signer/dappscomponents/TransactionMainDetails/TransactionMainDetails.js b/js/src/views/Signer/dappscomponents/TransactionMainDetails/TransactionMainDetails.js new file mode 100644 index 00000000000..4a373fc2162 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/TransactionMainDetails/TransactionMainDetails.js @@ -0,0 +1,143 @@ +import React, { Component, PropTypes } from 'react'; + +import ContractIcon from 'material-ui/svg-icons/action/code'; +import ReactTooltip from 'react-tooltip'; + +import * as tUtil from '../util/transaction'; +import Account from '../Account'; +import styles from './TransactionMainDetails.css'; + +export default class TransactionMainDetails extends Component { + + static propTypes = { + id: PropTypes.string.isRequired, + from: PropTypes.string.isRequired, + fromBalance: PropTypes.object, // eth BigNumber, not required since it might take time to fetch + value: PropTypes.string.isRequired, // wei hex + totalValue: PropTypes.object.isRequired, // wei BigNumber + chain: PropTypes.string.isRequired, + to: PropTypes.string, // undefined if it's a contract + toBalance: PropTypes.object, // eth BigNumber - undefined if it's a contract or until it's fetched + className: PropTypes.string + }; + + componentWillMount () { + const { value, totalValue } = this.props; + this.updateDisplayValues(value, totalValue); + } + + componentWillReceiveProps (nextProps) { + const { value, totalValue } = nextProps; + this.updateDisplayValues(value, totalValue); + } + + updateDisplayValues (value, totalValue) { + this.setState({ + feeEth: tUtil.calcFeeInEth(totalValue, value), + valueDisplay: tUtil.getValueDisplay(value), + valueDisplayWei: tUtil.getValueDisplayWei(value), + totalValueDisplay: tUtil.getTotalValueDisplay(totalValue), + totalValueDisplayWei: tUtil.getTotalValueDisplayWei(totalValue) + }); + } + + render () { + const { className } = this.props; + return ( +
+ { this.renderTransfer() } + { this.renderContract() } +
+ ); + } + + renderTransfer () { + const { from, fromBalance, to, toBalance, chain } = this.props; + if (!to) { + return; + } + + return ( +
+
+ +
+
+ { this.renderValue() } +
+ { this.renderTotalValue() } +
+
+ +
+
+ ); + } + + renderContract () { + const { from, fromBalance, to, chain } = this.props; + if (to) { + return; + } + return ( +
+
+ +
+
+ { this.renderValue() } +
+ { this.renderTotalValue() } +
+
+ +
+ Contract +
+
+ ); + } + + renderValue () { + const { id } = this.props; + const { valueDisplay, valueDisplayWei } = this.state; + return ( +
+
+ { valueDisplay } + ETH +
+ + The value of the transaction.
+ { valueDisplayWei } WEI +
+
+ ); + } + + renderTotalValue () { + const { id } = this.props; + const { totalValueDisplay, totalValueDisplayWei, feeEth } = this.state; + return ( +
+
+ { totalValueDisplay } ETH +
+ + The value of the transaction including the mining fee is { totalValueDisplayWei } WEI.
+ (This includes a mining fee of { feeEth } ETH) +
+
+ ); + } + +} diff --git a/js/src/views/Signer/dappscomponents/TransactionMainDetails/index.js b/js/src/views/Signer/dappscomponents/TransactionMainDetails/index.js new file mode 100644 index 00000000000..ee3c3c40367 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/TransactionMainDetails/index.js @@ -0,0 +1 @@ +export default from './TransactionMainDetails'; diff --git a/js/src/views/Signer/dappscomponents/TransactionPending/TransactionPending.css b/js/src/views/Signer/dappscomponents/TransactionPending/TransactionPending.css new file mode 100644 index 00000000000..e8aad894f55 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/TransactionPending/TransactionPending.css @@ -0,0 +1,90 @@ +.container { + padding: 25px 0 15px; +} + +.transactionDetails { + border-right: 1px solid #eee; + margin-right: 2rem; +} + +.mainContainer > * { + display: inline-block; + vertical-align: middle; + min-height: 120px; +} + +.iconsContainer { + display: inline-block; + min-width: 180px; + color: rgba(0, 0, 0, .3); + font-size: .8em; +} + +.iconsContainer > * { + float: left; + margin-right: 3px; +} + +.iconsContainer:after { + clear: both; +} + +.inputs { + margin-right: 30px; + margin-left: 30px; + width: 180px; + position: relative; + top: -15px; /* due to material ui weird styling */ +} + +.hasInfoIcon svg, +.miningTime svg, +.gasPrice svg, +.data svg { + width: 16px !important; + height: 16px !important; + position: relative; + bottom: -3px; + fill: rgba(0,0,0, 0.35) !important; +} + +/* TODO [ToDr] composes was handling weird errors when linking from other app */ +.miningTime { + /* composes: hasInfoIcon; */ +} + +.gasPrice { + /* composes: hasInfoIcon; */ +} + +.data { + /* composes: hasInfoIcon; */ + cursor: pointer; +} + +.data.noData { + cursor: text; +} + + +.dataTooltip { + word-wrap: break-word; + max-width: 400px; +} + +.expandedData { + display: block; + padding: 15px; + background: gray; + word-wrap: break-word; + color: #fff; +} + +.expandedContainer { + padding: 10px; + border-radius: 4px; +} + +.expandedContainer:empty { + padding: 0; +} diff --git a/js/src/views/Signer/dappscomponents/TransactionPending/TransactionPending.js b/js/src/views/Signer/dappscomponents/TransactionPending/TransactionPending.js new file mode 100644 index 00000000000..d163689ef8e --- /dev/null +++ b/js/src/views/Signer/dappscomponents/TransactionPending/TransactionPending.js @@ -0,0 +1,165 @@ +import React, { Component, PropTypes } from 'react'; + +import ReactTooltip from 'react-tooltip'; +import DescriptionIcon from 'material-ui/svg-icons/action/description'; +import GasIcon from 'material-ui/svg-icons/maps/local-gas-station'; +import TransactionMainDetails from '../TransactionMainDetails'; +import TransactionPendingForm from '../TransactionPendingForm'; +import styles from './TransactionPending.css'; + +import * as tUtil from '../util/transaction'; + +export default class TransactionPending extends Component { + + static propTypes = { + id: PropTypes.string.isRequired, + chain: PropTypes.string.isRequired, + from: PropTypes.string.isRequired, + fromBalance: PropTypes.object, // eth BigNumber, not required since it mght take time to fetch + value: PropTypes.string.isRequired, // wei hex + gasPrice: PropTypes.string.isRequired, // wei hex + gas: PropTypes.string.isRequired, // hex + to: PropTypes.string, // undefined if it's a contract + toBalance: PropTypes.object, // eth BigNumber - undefined if it's a contract or until it's fetched + data: PropTypes.string, // hex + nonce: PropTypes.number, + onConfirm: PropTypes.func.isRequired, + onReject: PropTypes.func.isRequired, + isSending: PropTypes.bool.isRequired, + className: PropTypes.string + }; + + static defaultProps = { + isSending: false + }; + + state = { + isDataExpanded: false + }; + + componentWillMount () { + const { gas, gasPrice, value } = this.props; + const fee = tUtil.getFee(gas, gasPrice); // BigNumber object + const totalValue = tUtil.getTotalValue(fee, value); + const gasPriceEthmDisplay = tUtil.getEthmFromWeiDisplay(gasPrice); + const gasToDisplay = tUtil.getGasDisplay(gas); + this.setState({ gasPriceEthmDisplay, totalValue, gasToDisplay }); + } + + render () { + const { totalValue } = this.state; + const className = this.props.className || ''; + return ( +
+
+ + +
+
+ { this.renderGasPrice() } + { this.renderData() } +
+
+ { this.renderDataExpanded() } +
+
+ ); + } + + renderGasPrice () { + const { id } = this.props; + const { gasPriceEthmDisplay, gasToDisplay } = this.state; + return ( +
+ + + { gasPriceEthmDisplay } ETH/MGAS + + { /* dynamic id required in case there are multple transactions in page */ } + + Cost of 1,000,000 units of gas. This transaction will use up to { gasToDisplay } MGAS. + +
+ ); + } + + renderData () { + const { data, id } = this.props; + let dataToDisplay = this.noData() ? 'no data' : tUtil.getShortData(data); + const noDataClass = this.noData() ? styles.noData : ''; + return ( +
+ + { dataToDisplay } + { /* dynamic id required in case there are multple transactions in page */ } + + Extra data for the transaction: +
+ { dataToDisplay }. +
+ { this.noData() ? '' : Click to expand. } +
+
+ ); + } + + renderDataExpanded () { + const { isDataExpanded } = this.state; + const { data } = this.props; + + if (!isDataExpanded) { + return; + } + + return ( +
+

Transaction's Data

+ { data } +
+ ); + } + + noData () { + return this.props.data === '0x'; + } + + toggleDataExpanded = () => { + if (this.noData()) { + return; + } + this.setState({ + isDataExpanded: !this.state.isDataExpanded + }); + } + + onConfirm = password => { + const { id, gasPrice } = this.props; + this.props.onConfirm({ id, password, gasPrice }); + } + + onReject = () => { + this.props.onReject(this.props.id); + } + +} diff --git a/js/src/views/Signer/dappscomponents/TransactionPending/index.js b/js/src/views/Signer/dappscomponents/TransactionPending/index.js new file mode 100644 index 00000000000..956af9b0e08 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/TransactionPending/index.js @@ -0,0 +1 @@ +export default from './TransactionPending'; diff --git a/js/src/views/Signer/dappscomponents/TransactionPendingForm/TransactionPendingForm.css b/js/src/views/Signer/dappscomponents/TransactionPendingForm/TransactionPendingForm.css new file mode 100644 index 00000000000..23ef45eac9e --- /dev/null +++ b/js/src/views/Signer/dappscomponents/TransactionPendingForm/TransactionPendingForm.css @@ -0,0 +1,22 @@ +.container { + width: 200px; +} +.rejectToggle { + display: block; + cursor: pointer; + color: #00e; + opacity: .7; + transition: opacity .5s; +} + +.rejectToggle:hover { + opacity: 1; + text-decoration: underline; +} + +.rejectToggle svg { + position: relative; + width: 18px !important; + height: 18px !important; + top: 3px; +} diff --git a/js/src/views/Signer/dappscomponents/TransactionPendingForm/TransactionPendingForm.js b/js/src/views/Signer/dappscomponents/TransactionPendingForm/TransactionPendingForm.js new file mode 100644 index 00000000000..ebe68ea0ed0 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/TransactionPendingForm/TransactionPendingForm.js @@ -0,0 +1,71 @@ +import React, { Component, PropTypes } from 'react'; + +import BackIcon from 'material-ui/svg-icons/navigation/arrow-back'; + +import TransactionPendingFormConfirm from '../TransactionPendingFormConfirm'; +import TransactionPendingFormReject from '../TransactionPendingFormReject'; +import styles from './TransactionPendingForm.css'; + +export default class TransactionPendingForm extends Component { + + static propTypes = { + isSending: PropTypes.bool.isRequired, + onConfirm: PropTypes.func.isRequired, + onReject: PropTypes.func.isRequired, + className: PropTypes.string + }; + + state = { + isRejectOpen: false + }; + + render () { + const { className } = this.props; + + return ( +
+ { this.renderForm() } + { this.renderRejectToggle() } +
+ ); + } + + renderForm () { + const { isSending, onConfirm, onReject } = this.props; + if (this.state.isRejectOpen) { + return ( + + ); + } + + return ( + + ); + } + + renderRejectToggle () { + const { isRejectOpen } = this.state; + let html; + + if (!isRejectOpen) { + html = reject; + } else { + html = I've changed my mind; + } + + return ( + + { html } + + ); + } + + onToggleReject = () => { + const { isRejectOpen } = this.state; + this.setState({ isRejectOpen: !isRejectOpen }); + } + +} diff --git a/js/src/views/Signer/dappscomponents/TransactionPendingForm/index.js b/js/src/views/Signer/dappscomponents/TransactionPendingForm/index.js new file mode 100644 index 00000000000..3b014837ce6 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/TransactionPendingForm/index.js @@ -0,0 +1 @@ +export default from './TransactionPendingForm'; diff --git a/js/src/views/Signer/dappscomponents/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css b/js/src/views/Signer/dappscomponents/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css new file mode 100644 index 00000000000..5546aaca2cb --- /dev/null +++ b/js/src/views/Signer/dappscomponents/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css @@ -0,0 +1,9 @@ +.confirmForm { + margin-top: -40px; +} + + +.confirmButton { + display: block !important; + margin-bottom: 10px; +} diff --git a/js/src/views/Signer/dappscomponents/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js b/js/src/views/Signer/dappscomponents/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js new file mode 100644 index 00000000000..8cb9534e3b8 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js @@ -0,0 +1,88 @@ +import React, { Component, PropTypes } from 'react'; + +import TextField from 'material-ui/TextField'; +import RaisedButton from 'material-ui/RaisedButton'; +import ReactTooltip from 'react-tooltip'; + +import styles from './TransactionPendingFormConfirm.css'; + +export default class TransactionPendingFormConfirm extends Component { + + static propTypes = { + isSending: PropTypes.bool.isRequired, + onConfirm: PropTypes.func.isRequired + } + + id = Math.random(); // for tooltip + + state = { + password: '' + } + + render () { + const { isSending } = this.props; + const { password } = this.state; + + return ( +
+ +
+ +
+ { this.renderTooltip() } +
+ ); + } + + renderTooltip () { + if (this.state.password.length) { + return; + } + + return ( + + Please provide a password for this account + + ); + } + + onModifyPassword = evt => { + const password = evt.target.value; + this.setState({ + password + }); + } + + onConfirm = () => { + const { password } = this.state; + this.props.onConfirm(password); + } + + onKeyDown = evt => { + if (evt.which !== 13) { + return; + } + + this.onConfirm(); + } +} diff --git a/js/src/views/Signer/dappscomponents/TransactionPendingFormConfirm/index.js b/js/src/views/Signer/dappscomponents/TransactionPendingFormConfirm/index.js new file mode 100644 index 00000000000..6debf0bb1f6 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/TransactionPendingFormConfirm/index.js @@ -0,0 +1 @@ +export default from './TransactionPendingFormConfirm'; diff --git a/js/src/views/Signer/dappscomponents/TransactionPendingFormReject/TransactionPendingFormReject.css b/js/src/views/Signer/dappscomponents/TransactionPendingFormReject/TransactionPendingFormReject.css new file mode 100644 index 00000000000..593ae3c80e2 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/TransactionPendingFormReject/TransactionPendingFormReject.css @@ -0,0 +1,10 @@ +/* the rejection button itself, once .reject has been pressed */ +.rejectButton { + display: block !important; + margin-bottom: 5px; +} + +.rejectText { + margin-bottom: 10px; +} + diff --git a/js/src/views/Signer/dappscomponents/TransactionPendingFormReject/TransactionPendingFormReject.js b/js/src/views/Signer/dappscomponents/TransactionPendingFormReject/TransactionPendingFormReject.js new file mode 100644 index 00000000000..5dd71630eed --- /dev/null +++ b/js/src/views/Signer/dappscomponents/TransactionPendingFormReject/TransactionPendingFormReject.js @@ -0,0 +1,80 @@ +import React, { Component, PropTypes } from 'react'; + +import RaisedButton from 'material-ui/RaisedButton'; + +import { REJECT_COUNTER_TIME } from '../constants/constants'; +import styles from './TransactionPendingFormReject.css'; + +export default class TransactionPendingFormReject extends Component { + + static propTypes = { + onReject: PropTypes.func.isRequired, + className: PropTypes.string, + rejectCounterTime: PropTypes.number + }; + + static defaultProps = { + rejectCounterTime: REJECT_COUNTER_TIME + }; + + state = { + rejectCounter: this.props.rejectCounterTime + } + + componentWillMount () { + this.onInitCounter(); + } + + componentWillUnmount () { + this.onResetCounter(); + } + + render () { + const { rejectCounter } = this.state; + const { onReject } = this.props; + + return ( +
+
+ Are you sure you want to reject transaction?
+ This cannot be undone +
+ 0 } + fullWidth + > + Reject Transaction { this.renderCounter() } + +
+ ); + } + + renderCounter () { + const { rejectCounter } = this.state; + if (!rejectCounter) { + return; + } + return ( + { `(${rejectCounter})` } + ); + } + + onInitCounter () { + this.rejectInterval = setInterval(() => { + let { rejectCounter } = this.state; + if (rejectCounter === 0) { + return clearInterval(this.rejectInterval); + } + this.setState({ rejectCounter: rejectCounter - 1 }); + }, 1000); + } + + onResetCounter () { + clearInterval(this.rejectInterval); + this.setState({ + rejectCounter: this.props.rejectCounterTime + }); + } +} diff --git a/js/src/views/Signer/dappscomponents/TransactionPendingFormReject/index.js b/js/src/views/Signer/dappscomponents/TransactionPendingFormReject/index.js new file mode 100644 index 00000000000..d1d6a16a218 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/TransactionPendingFormReject/index.js @@ -0,0 +1 @@ +export default from './TransactionPendingFormReject'; diff --git a/js/src/views/Signer/dappscomponents/TransactionPendingWeb3/TransactionPendingWeb3.js b/js/src/views/Signer/dappscomponents/TransactionPendingWeb3/TransactionPendingWeb3.js new file mode 100644 index 00000000000..2630f736c34 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/TransactionPendingWeb3/TransactionPendingWeb3.js @@ -0,0 +1,96 @@ +import React, { Component, PropTypes } from 'react'; + +import TransactionPending from '../TransactionPending'; +import Web3Compositor from '../Web3Compositor'; + +class TransactionPendingWeb3 extends Component { + + static contextTypes = { + web3: PropTypes.object.isRequired + }; + + static propTypes = { + id: PropTypes.string.isRequired, + from: PropTypes.string.isRequired, + value: PropTypes.string.isRequired, // wei hex + gasPrice: PropTypes.string.isRequired, // wei hex + gas: PropTypes.string.isRequired, // hex + onConfirm: PropTypes.func.isRequired, + onReject: PropTypes.func.isRequired, + isSending: PropTypes.bool.isRequired, + to: PropTypes.string, // undefined if it's a contract + data: PropTypes.string, // hex + nonce: PropTypes.number, + className: PropTypes.string + }; + + state = { + chain: 'homestead', + fromBalance: null, // avoid required prop loading warning + toBalance: null // avoid required prop loading warning in case there's a to address + } + + render () { + const { web3 } = this.context; + const { fromBalance, toBalance, chain } = this.state; + let { from, to } = this.props; + + from = web3.toChecksumAddress(from); + to = to ? web3.toChecksumAddress(to) : to; + + return ( + + ); + } + + // todo [adgo] - call next() only after all CBs are executed + onTick (next) { + this.fetchChain(); + this.fetchBalances(next); + } + + fetchChain () { + this.context.web3.ethcore.getNetChain((err, chain) => { + if (err) { + return console.warn('err fetching chain', err); + } + this.setState({ chain }); + }); + } + + fetchBalances (next) { + const { from, to } = this.props; + this.fetchBalance(from, 'from', next); + + if (!to) { + return; + } + + this.fetchBalance(to, 'to', next); + } + + fetchBalance (address, owner, next) { + this.context.web3.eth.getBalance(address, (err, balance) => { + next(err); + + if (err) { + console.warn('err fetching balance for ', address, err); + return; + } + + this.setState({ + [owner + 'Balance']: balance + }); + }); + } + +} + +export default Web3Compositor(TransactionPendingWeb3); diff --git a/js/src/views/Signer/dappscomponents/TransactionPendingWeb3/index.js b/js/src/views/Signer/dappscomponents/TransactionPendingWeb3/index.js new file mode 100644 index 00000000000..4d7f027ada8 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/TransactionPendingWeb3/index.js @@ -0,0 +1 @@ +export default from './TransactionPendingWeb3'; diff --git a/js/src/views/Signer/dappscomponents/TxHashLink/TxHashLink.js b/js/src/views/Signer/dappscomponents/TxHashLink/TxHashLink.js new file mode 100644 index 00000000000..13c51276f0a --- /dev/null +++ b/js/src/views/Signer/dappscomponents/TxHashLink/TxHashLink.js @@ -0,0 +1,47 @@ +import React, { Component, PropTypes } from 'react'; + +import { getTxLink } from '../util/transaction'; + +export default class TxHashLink extends Component { + + static propTypes = { + txHash: PropTypes.string.isRequired, + chain: PropTypes.string.isRequired, + children: PropTypes.node, + className: PropTypes.string + } + + state = { + link: null + }; + + componentWillMount () { + const { txHash, chain } = this.props; + this.updateLink(txHash, chain); + } + + componentWillReceiveProps (nextProps) { + const { txHash, chain } = nextProps; + this.updateLink(txHash, chain); + } + + render () { + const { children, txHash, className } = this.props; + const { link } = this.state; + + return ( + + { children || txHash } + + ); + } + + updateLink (txHash, chain) { + const link = getTxLink(txHash, chain); + this.setState({ link }); + } + +} diff --git a/js/src/views/Signer/dappscomponents/TxHashLink/index.js b/js/src/views/Signer/dappscomponents/TxHashLink/index.js new file mode 100644 index 00000000000..e7311c33dee --- /dev/null +++ b/js/src/views/Signer/dappscomponents/TxHashLink/index.js @@ -0,0 +1 @@ +export default from './TxHashLink'; diff --git a/js/src/views/Signer/dappscomponents/Web3Compositor/Web3Compositor.js b/js/src/views/Signer/dappscomponents/Web3Compositor/Web3Compositor.js new file mode 100644 index 00000000000..06bc9a41654 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/Web3Compositor/Web3Compositor.js @@ -0,0 +1,51 @@ +// no need for react since not using JSX +import React, { Component, PropTypes } from 'react'; + +export default Wrapped => class Web3Compositor extends Component { + + static contextTypes = { + web3: PropTypes.object.isRequired + }; + + tickActive = false + + render () { + return ( + + ); + } + + componentDidMount () { + this.tickActive = true; + setTimeout(this.next); + } + + componentWillUnmount () { + this.tickActive = false; + } + + next = () => { + if (!this.tickActive) { + return; + } + + if (!this.wrapped || !this.wrapped.onTick) { + setTimeout(this.next, 5000); + return; + } + + let nextCalled = false; + this.wrapped.onTick(error => { + if (nextCalled) { + return; + } + nextCalled = true; + setTimeout(this.next, error ? 10000 : 2000); + }); + } + + registerComponent = component => { + this.wrapped = component; + } + +}; diff --git a/js/src/views/Signer/dappscomponents/Web3Compositor/index.js b/js/src/views/Signer/dappscomponents/Web3Compositor/index.js new file mode 100644 index 00000000000..d6612d21d46 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/Web3Compositor/index.js @@ -0,0 +1 @@ +export default from './Web3Compositor'; diff --git a/js/src/views/Signer/dappscomponents/Web3Provider/Web3Provider.js b/js/src/views/Signer/dappscomponents/Web3Provider/Web3Provider.js new file mode 100644 index 00000000000..378b3507d8e --- /dev/null +++ b/js/src/views/Signer/dappscomponents/Web3Provider/Web3Provider.js @@ -0,0 +1,25 @@ +// no need for react since not using JSX +import { Component, PropTypes } from 'react'; + +export default class Web3Provider extends Component { + + static childContextTypes = { + web3: PropTypes.object.isRequired + }; + + static propTypes = { + web3: PropTypes.object.isRequired, + children: PropTypes.element + }; + + getChildContext () { + return { + web3: this.props.web3 + }; + } + + render () { + return this.props.children; + } + +} diff --git a/js/src/views/Signer/dappscomponents/Web3Provider/index.js b/js/src/views/Signer/dappscomponents/Web3Provider/index.js new file mode 100644 index 00000000000..84674944c38 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/Web3Provider/index.js @@ -0,0 +1 @@ +export default from './Web3Provider'; diff --git a/js/src/views/Signer/dappscomponents/actions/toastr.js b/js/src/views/Signer/dappscomponents/actions/toastr.js new file mode 100644 index 00000000000..2992a4f4159 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/actions/toastr.js @@ -0,0 +1,6 @@ + +import { createAction } from 'redux-actions'; + +export const addToast = createAction('add toast'); +export const removeToast = createAction('remove toast'); +export const onClickToast = createAction('on clickToast'); diff --git a/js/src/views/Signer/dappscomponents/constants/constants.js b/js/src/views/Signer/dappscomponents/constants/constants.js new file mode 100644 index 00000000000..eec5c4bbf0f --- /dev/null +++ b/js/src/views/Signer/dappscomponents/constants/constants.js @@ -0,0 +1,10 @@ +// after user clicks 'reject' for the first time, +// a second reject button is rendered and disabled +// for a few seconds to avoid accidential double clicks +export const REJECT_COUNTER_TIME = 3; + +// links to chain explorers +export const BASE_LINK_ACCOUNT_MORDEN = 'https://testnet.etherscan.io/address/'; +export const BASE_LINK_ACCOUNT_HOMESTEAD = 'https://etherscan.io/address/'; +export const BASE_LINK_TX_MORDEN = 'https://testnet.etherscan.io/tx/'; +export const BASE_LINK_TX_HOMESTEAD = 'https://etherscan.io/tx/'; diff --git a/js/src/views/Signer/dappscomponents/docs/actions/toastr.js b/js/src/views/Signer/dappscomponents/docs/actions/toastr.js new file mode 100644 index 00000000000..d63eff527ec --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/actions/toastr.js @@ -0,0 +1,5 @@ + +import { createAction } from 'redux-actions'; + +export const addToast = createAction('add toast'); +export const removeToast = createAction('remove toast'); diff --git a/js/src/views/Signer/dappscomponents/docs/chromeExtension.css b/js/src/views/Signer/dappscomponents/docs/chromeExtension.css new file mode 100644 index 00000000000..a1eb5a05bb0 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/chromeExtension.css @@ -0,0 +1,4 @@ +body { + width: 800px !important; + margin: 0 auto; +} diff --git a/js/src/views/Signer/dappscomponents/docs/components.data.js b/js/src/views/Signer/dappscomponents/docs/components.data.js new file mode 100644 index 00000000000..13cc0931982 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/components.data.js @@ -0,0 +1,11 @@ +export default [ + { name: 'Account' }, + { name: 'AccountLink' }, + { name: 'Identicon' }, + { name: 'RpcAutoComplete' }, + { name: 'Toast' }, + { name: 'TransactionFinished' }, + { name: 'TransactionPending' }, + { name: 'TransactionPendingWeb3' }, + { name: 'TransactionPendingForm' } +]; diff --git a/js/src/views/Signer/dappscomponents/docs/components/Header/Header.css b/js/src/views/Signer/dappscomponents/docs/components/Header/Header.css new file mode 100644 index 00000000000..e113b2c5eeb --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/components/Header/Header.css @@ -0,0 +1,4 @@ +.link { + padding: 3px; + display: inline-block; +} \ No newline at end of file diff --git a/js/src/views/Signer/dappscomponents/docs/components/Header/Header.js b/js/src/views/Signer/dappscomponents/docs/components/Header/Header.js new file mode 100644 index 00000000000..59493ceaf27 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/components/Header/Header.js @@ -0,0 +1,39 @@ +import React, { Component } from 'react'; +import { Link } from 'react-router'; + +import componentsData from '../../components.data.js'; +import AppBar from 'material-ui/AppBar'; +import styles from './Header.css'; + +export default class Header extends Component { + + render () { + return ( +
+ + +
+ ); + } + + renderComponentsLinks () { + return componentsData.map(c => { + return ( + + { c.name } + + ); + }); + } + + getToLink (name) { + return '/' + name[0].toLowerCase() + name.substr(1); + } + +} diff --git a/js/src/views/Signer/dappscomponents/docs/components/Header/index.js b/js/src/views/Signer/dappscomponents/docs/components/Header/index.js new file mode 100644 index 00000000000..2509393d237 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/components/Header/index.js @@ -0,0 +1 @@ +export default from './Header'; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/AccountLinkPage.css b/js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/AccountLinkPage.css new file mode 100644 index 00000000000..dd5d711f02b --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/AccountLinkPage.css @@ -0,0 +1,16 @@ +.accountContainer { + padding: 20px; +} + +.accountContainer:not(:first-child) { + border-top: 1px solid #eee; +} + +.account { + display: inline-block; + margin-right: 20px; +} + +.accountInfo { + display: inline-block; +} \ No newline at end of file diff --git a/js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/AccountLinkPage.data.js b/js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/AccountLinkPage.data.js new file mode 100644 index 00000000000..d1831444a01 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/AccountLinkPage.data.js @@ -0,0 +1,10 @@ +export default [ + { + address: '0x7c0d52faab596c08f484e3478aebc6205f3f5d8c', + chain: 'morden' + }, + { + address: '0x660cdfdf3d0e7443e7935343a1131b961575ccc7', + chain: 'homestead' + } +]; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/AccountLinkPage.js b/js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/AccountLinkPage.js new file mode 100644 index 00000000000..a84a3044cfc --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/AccountLinkPage.js @@ -0,0 +1,41 @@ +import React, { Component } from 'react'; + +import AccountLink from '../../../AccountLink'; +import styles from './AccountLinkPage.css'; + +import AccountLinkPageData from './AccountLinkPage.data'; + +export default class AccountLinkPage extends Component { + + render () { + return ( +
+

Account Link

+ { this.renderAccountsLinks() } +
+ ); + } + + renderAccountsLinks () { + return AccountLinkPageData.map(acc => { + return ( +
+ + { acc.address } + + { this.renderAccountLinkInfo(acc) } +
+ ); + }); + } + + renderAccountLinkInfo (acc) { + return ( +
+
Chain: { acc.chain }
+
Address: { acc.address }
+
+ ); + } + +} diff --git a/js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/index.js b/js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/index.js new file mode 100644 index 00000000000..ef612452b5d --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/index.js @@ -0,0 +1 @@ +export default from './AccountLinkPage'; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/AccountPage/AccountPage.css b/js/src/views/Signer/dappscomponents/docs/containers/AccountPage/AccountPage.css new file mode 100644 index 00000000000..dd5d711f02b --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/AccountPage/AccountPage.css @@ -0,0 +1,16 @@ +.accountContainer { + padding: 20px; +} + +.accountContainer:not(:first-child) { + border-top: 1px solid #eee; +} + +.account { + display: inline-block; + margin-right: 20px; +} + +.accountInfo { + display: inline-block; +} \ No newline at end of file diff --git a/js/src/views/Signer/dappscomponents/docs/containers/AccountPage/AccountPage.data.js b/js/src/views/Signer/dappscomponents/docs/containers/AccountPage/AccountPage.data.js new file mode 100644 index 00000000000..30b06aeef24 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/AccountPage/AccountPage.data.js @@ -0,0 +1,16 @@ +import BigNumber from 'bignumber.js'; + +export default [ + { + address: '0x7c0d52faab596c08f484e3478aebc6205f3f5d8c', + chain: 'morden', + balance: new BigNumber('0x733a8ab53da50c000') + }, + { + address: '0x660cdfdf3d0e7443e7935343a1131b961575ccc7', + chain: 'homestead', + balance: new BigNumber('0x0'), + name: 'awesome account' + } + +]; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/AccountPage/AccountPage.js b/js/src/views/Signer/dappscomponents/docs/containers/AccountPage/AccountPage.js new file mode 100644 index 00000000000..80409672a44 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/AccountPage/AccountPage.js @@ -0,0 +1,41 @@ +import React, { Component } from 'react'; + +import Account from '../../../Account'; +import styles from './AccountPage.css'; + +import accountPageData from './AccountPage.data'; + +export default class AccountPage extends Component { + + render () { + return ( +
+

Account

+ { this.renderAccounts() } +
+ ); + } + + renderAccounts () { + return accountPageData.map(acc => { + return ( +
+ + { this.renderAccountInfo(acc) } +
+ ); + }); + } + + renderAccountInfo (acc) { + return ( +
+
Chain: { acc.chain }
+
Address: { acc.address }
+
Balance: { acc.balance.div(1e18).toFormat(3) } ETH
+
Name: { acc.name || 'empty' }
+
+ ); + } + +} diff --git a/js/src/views/Signer/dappscomponents/docs/containers/AccountPage/index.js b/js/src/views/Signer/dappscomponents/docs/containers/AccountPage/index.js new file mode 100644 index 00000000000..cceaed3f55f --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/AccountPage/index.js @@ -0,0 +1 @@ +export default from './AccountPage'; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/IdenticonPage.css b/js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/IdenticonPage.css new file mode 100644 index 00000000000..dd5d711f02b --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/IdenticonPage.css @@ -0,0 +1,16 @@ +.accountContainer { + padding: 20px; +} + +.accountContainer:not(:first-child) { + border-top: 1px solid #eee; +} + +.account { + display: inline-block; + margin-right: 20px; +} + +.accountInfo { + display: inline-block; +} \ No newline at end of file diff --git a/js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/IdenticonPage.data.js b/js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/IdenticonPage.data.js new file mode 100644 index 00000000000..d1831444a01 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/IdenticonPage.data.js @@ -0,0 +1,10 @@ +export default [ + { + address: '0x7c0d52faab596c08f484e3478aebc6205f3f5d8c', + chain: 'morden' + }, + { + address: '0x660cdfdf3d0e7443e7935343a1131b961575ccc7', + chain: 'homestead' + } +]; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/IdenticonPage.js b/js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/IdenticonPage.js new file mode 100644 index 00000000000..2bcfbde656d --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/IdenticonPage.js @@ -0,0 +1,39 @@ +import React, { Component } from 'react'; + +import Identicon from '../../../Identicon'; +import styles from './IdenticonPage.css'; + +import identiconPageData from './IdenticonPage.data'; + +export default class IdenticonPage extends Component { + + render () { + return ( +
+

Identicon

+ { this.renderIdenticons() } +
+ ); + } + + renderIdenticons () { + return identiconPageData.map(idc => { + return ( +
+ + { this.renderIdenticonInfo(idc) } +
+ ); + }); + } + + renderIdenticonInfo (idc) { + return ( +
+
Chain: { idc.chain }
+
Address: { idc.address }
+
+ ); + } + +} diff --git a/js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/index.js b/js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/index.js new file mode 100644 index 00000000000..c8e76831463 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/index.js @@ -0,0 +1 @@ +export default from './IdenticonPage'; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/Root/Root.css b/js/src/views/Signer/dappscomponents/docs/containers/Root/Root.css new file mode 100644 index 00000000000..09b2a7daf46 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/Root/Root.css @@ -0,0 +1,7 @@ +.container { + background: #fff; +} + +.mainContainer { + padding: 25px; +} diff --git a/js/src/views/Signer/dappscomponents/docs/containers/Root/Root.js b/js/src/views/Signer/dappscomponents/docs/containers/Root/Root.js new file mode 100644 index 00000000000..a07ba517994 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/Root/Root.js @@ -0,0 +1,28 @@ +import React, { Component, PropTypes } from 'react'; +import AnimateChildren from '../../../AnimateChildren'; +import Header from '../../components/Header'; + +import styles from './Root.css'; + +export default class Root extends Component { + + static propTypes = { + children: PropTypes.node.isRequired, + location: PropTypes.shape({ + pathname: PropTypes.string.isRequired + }).isRequired + }; + + render () { + const { location, children } = this.props; + return ( +
+
+ + { children } + +
+ ); + } + +} diff --git a/js/src/views/Signer/dappscomponents/docs/containers/Root/index.js b/js/src/views/Signer/dappscomponents/docs/containers/Root/index.js new file mode 100644 index 00000000000..a3492f3a7ab --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/Root/index.js @@ -0,0 +1 @@ +export default from './Root'; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/RpcAutoCompletePage/RpcAutoCompletePage.js b/js/src/views/Signer/dappscomponents/docs/containers/RpcAutoCompletePage/RpcAutoCompletePage.js new file mode 100644 index 00000000000..4b03691670b --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/RpcAutoCompletePage/RpcAutoCompletePage.js @@ -0,0 +1,40 @@ +import React, { Component } from 'react'; + +import RpcAutoComplete from '../../../RpcAutoComplete'; + +export default class RpcAutoCompletePage extends Component { + + state = { + selected: null + } + + render () { + return ( +
+

RpcAutoComplete

+ + { this.renderSelected() } +
+ ); + } + + renderSelected () { + const { selected } = this.state; + if (!selected) { + return ( +

Select a method above

+ ); + } + + return ( +

You have selected: + { selected } +

+ ); + } + + onNewRequest = selected => { + this.setState({ selected }); + } + +} diff --git a/js/src/views/Signer/dappscomponents/docs/containers/RpcAutoCompletePage/index.js b/js/src/views/Signer/dappscomponents/docs/containers/RpcAutoCompletePage/index.js new file mode 100644 index 00000000000..a9b9fb288a4 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/RpcAutoCompletePage/index.js @@ -0,0 +1 @@ +export default from './RpcAutoCompletePage'; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/ToastPage/ToastPage.css b/js/src/views/Signer/dappscomponents/docs/containers/ToastPage/ToastPage.css new file mode 100644 index 00000000000..44918bbec9c --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/ToastPage/ToastPage.css @@ -0,0 +1,4 @@ +.toastsContainer { + width: 200px; + min-height: 100px; +} \ No newline at end of file diff --git a/js/src/views/Signer/dappscomponents/docs/containers/ToastPage/ToastPage.data.js b/js/src/views/Signer/dappscomponents/docs/containers/ToastPage/ToastPage.data.js new file mode 100644 index 00000000000..1383036c5d1 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/ToastPage/ToastPage.data.js @@ -0,0 +1,22 @@ +export default [ + { + id: 1, + type: 'default', + msg: 'This is a defaut toast' + }, + { + id: 2, + type: 'error', + msg: 'This is an error toast' + }, + { + id: 3, + type: 'success', + msg: 'This is a success toast' + }, + { + id: 4, + type: 'info', + msg: 'This is an info toast' + } +]; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/ToastPage/ToastPage.js b/js/src/views/Signer/dappscomponents/docs/containers/ToastPage/ToastPage.js new file mode 100644 index 00000000000..5799842eb28 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/ToastPage/ToastPage.js @@ -0,0 +1,31 @@ +import React, { Component } from 'react'; + +import Toast from '../../../Toast'; +import styles from './ToastPage.css'; + +import ToastPageData from './ToastPage.data'; + +export default class ToastPage extends Component { + + render () { + return ( +
+

Toast

+
+ { this.renderToasts() } +
+
+ ); + } + + renderToasts () { + return ToastPageData.map(t => ( + + )); + } + + onRemoveToast = id => { + global.alert('remove toast ' + id); + } + +} diff --git a/js/src/views/Signer/dappscomponents/docs/containers/ToastPage/index.js b/js/src/views/Signer/dappscomponents/docs/containers/ToastPage/index.js new file mode 100644 index 00000000000..9e2d08c7d96 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/ToastPage/index.js @@ -0,0 +1 @@ +export default from './ToastPage'; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/TransactionFinishedPage/TransactionFinishedPage.css b/js/src/views/Signer/dappscomponents/docs/containers/TransactionFinishedPage/TransactionFinishedPage.css new file mode 100644 index 00000000000..e69de29bb2d diff --git a/js/src/views/Signer/dappscomponents/docs/containers/TransactionFinishedPage/TransactionFinishedPage.js b/js/src/views/Signer/dappscomponents/docs/containers/TransactionFinishedPage/TransactionFinishedPage.js new file mode 100644 index 00000000000..24506956617 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/TransactionFinishedPage/TransactionFinishedPage.js @@ -0,0 +1,33 @@ +import React, { Component } from 'react'; + +import TransactionFinished from '../../../TransactionFinished'; +import styles from './TransactionFinishedPage.css'; + +import transactionsData from '../../transactions.data'; + +export default class TransactionFinishedPage extends Component { + + render () { + return ( +
+

Transaction Finished

+

Transactions that got rejected / confirmed

+ { this.renderTransactionsFinished() } +
+ ); + } + + renderTransactionsFinished () { + return transactionsData.map(t => ( +
+

{ t._desc }

+ + { this.renderInfo(t) } +
+ )); + } + + renderInfo (t) { + return null; + } +} diff --git a/js/src/views/Signer/dappscomponents/docs/containers/TransactionFinishedPage/index.js b/js/src/views/Signer/dappscomponents/docs/containers/TransactionFinishedPage/index.js new file mode 100644 index 00000000000..c6bc08c34e8 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/TransactionFinishedPage/index.js @@ -0,0 +1 @@ +export default from './TransactionFinishedPage'; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingFormPage/TransactionPendingFormPage.js b/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingFormPage/TransactionPendingFormPage.js new file mode 100644 index 00000000000..91e35faf5fd --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingFormPage/TransactionPendingFormPage.js @@ -0,0 +1,72 @@ +import React, { Component } from 'react'; + +import TransactionPendingForm from '../../../TransactionPendingForm'; + +export default class TransactionPendingFormPage extends Component { + + state = { + chosenAction: null, + password: null + } + + render () { + return ( +
+

Transaction Pending Form

+ { this.renderForm() } + { this.renderChosenAction() } +
+ ); + } + + renderForm () { + return ( + + ); + } + + renderChosenAction () { + const { chosenAction } = this.state; + if (!chosenAction) { + return; + } + + return ( +

+ You have + { chosenAction } + this pending transaction + { this.renderWithPassword() } + . +

+ ); + } + + // rejecting transaction has no password + renderWithPassword () { + const { password } = this.state; + if (!password) { + return; + } + + return ' with password ' + password; + } + + onConfirm = password => { + this.setState({ + password, + chosenAction: 'confirmed' + }); + } + + onReject = () => { + this.setState({ + password: null, + chosenAction: 'rejected' + }); + } + +} diff --git a/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingFormPage/index.js b/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingFormPage/index.js new file mode 100644 index 00000000000..0d504dd7a40 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingFormPage/index.js @@ -0,0 +1 @@ +export default from './TransactionPendingFormPage'; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingPage/TransactionPendingPage.css b/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingPage/TransactionPendingPage.css new file mode 100644 index 00000000000..e69de29bb2d diff --git a/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingPage/TransactionPendingPage.js b/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingPage/TransactionPendingPage.js new file mode 100644 index 00000000000..4a8425d9c1f --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingPage/TransactionPendingPage.js @@ -0,0 +1,79 @@ +import React, { Component } from 'react'; + +import TransactionPending from '../../../TransactionPending'; +import styles from './TransactionPendingPage.css'; + +import transactionsData from '../../transactions.data'; + +export default class TransactionPendingPage extends Component { + + state = {}; + + render () { + return ( +
+

Transaction Pending

+

Transactions that are awaiting confirmaton / rejection

+ { this.renderTransactionsPending() } +
+ ); + } + + renderTransactionsPending () { + return transactionsData.map(t => ( +
+

{ t._desc }

+ + { this.renderChosenAction(t.id) } + { this.renderInfo(t) } +
+ )); + } + + renderInfo (t) { + return null; + } + + renderChosenAction (id) { + const chosenAction = this.state['chosenAction_' + id]; + if (!chosenAction) { + return; + } + + return ( +

+ You have { chosenAction } this pending transaction + { this.renderWithPassword(id) }. +

+ ); + } + + // rejecting doens't require password + renderWithPassword (id) { + const password = this.state['chosenPassword_' + id]; + if (!password) { + return; + } + + return ' with password ' + password; + } + + onConfirm = (id, password, gasPrice) => { + this.setState({ + ['chosenAction_' + id]: 'confirmed', + ['chosenPassword_' + id]: password + }); + } + + onReject = id => { + this.setState({ + ['chosenAction_' + id]: 'rejected', + ['chosenPassword_' + id]: null + }); + } + +} diff --git a/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingPage/index.js b/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingPage/index.js new file mode 100644 index 00000000000..582f0b57234 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingPage/index.js @@ -0,0 +1 @@ +export default from './TransactionPendingPage'; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingWeb3Page/TransactionPendingWeb3Page.css b/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingWeb3Page/TransactionPendingWeb3Page.css new file mode 100644 index 00000000000..e69de29bb2d diff --git a/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingWeb3Page/TransactionPendingWeb3Page.js b/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingWeb3Page/TransactionPendingWeb3Page.js new file mode 100644 index 00000000000..f371dfca08c --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingWeb3Page/TransactionPendingWeb3Page.js @@ -0,0 +1,79 @@ +import React, { Component } from 'react'; + +import TransactionPendingWeb3 from '../../../TransactionPendingWeb3'; +import styles from './TransactionPendingWeb3Page.css'; + +import transactionsData from '../../transactions.data'; + +export default class TransactionPendingWeb3Page extends Component { + + state = {}; + + render () { + return ( +
+

Transaction Pending

+

Transactions that are awaiting confirmaton / rejection

+ { this.renderTransactionsPending() } +
+ ); + } + + renderTransactionsPending () { + return transactionsData.map(t => ( +
+

{ t._desc }

+ + { this.renderChosenAction(t.id) } + { this.renderInfo(t) } +
+ )); + } + + renderInfo (t) { + return null; + } + + renderChosenAction (id) { + const chosenAction = this.state['chosenAction_' + id]; + if (!chosenAction) { + return; + } + + return ( +

+ You have { chosenAction } this pending transaction + { this.renderWithPassword(id) }. +

+ ); + } + + // rejecting doens't require password + renderWithPassword (id) { + const password = this.state['chosenPassword_' + id]; + if (!password) { + return; + } + + return ' with password ' + password; + } + + onConfirm = (id, password, gasPrice) => { + this.setState({ + ['chosenAction_' + id]: 'confirmed', + ['chosenPassword_' + id]: password + }); + } + + onReject = id => { + this.setState({ + ['chosenAction_' + id]: 'rejected', + ['chosenPassword_' + id]: null + }); + } + +} diff --git a/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingWeb3Page/index.js b/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingWeb3Page/index.js new file mode 100644 index 00000000000..042e8965c35 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingWeb3Page/index.js @@ -0,0 +1 @@ +export default from './TransactionPendingWeb3Page'; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/WelcomePage/WelcomePage.js b/js/src/views/Signer/dappscomponents/docs/containers/WelcomePage/WelcomePage.js new file mode 100644 index 00000000000..cbd796829be --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/WelcomePage/WelcomePage.js @@ -0,0 +1,17 @@ +import React, { Component } from 'react'; + +export default class WelcomePage extends Component { + + render () { + return ( +
+

Dapps React UI

+

+ This is a demo of reusable dapps react ui.
+ Select a component from the nav menu above. +

+
+ ); + } + +} diff --git a/js/src/views/Signer/dappscomponents/docs/containers/WelcomePage/index.js b/js/src/views/Signer/dappscomponents/docs/containers/WelcomePage/index.js new file mode 100644 index 00000000000..e4cc55d870b --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/containers/WelcomePage/index.js @@ -0,0 +1 @@ +export default from './WelcomePage'; diff --git a/js/src/views/Signer/dappscomponents/docs/docs.js b/js/src/views/Signer/dappscomponents/docs/docs.js new file mode 100644 index 00000000000..fc7cc096338 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/docs.js @@ -0,0 +1,42 @@ +import React from 'react'; +import { Provider } from 'react-redux'; +import ReactDOM from 'react-dom'; + +import BigNumber from 'bignumber.js'; + +// Needed for onTouchTap +// http://stackoverflow.com/a/34015469/988941 +import injectTapEventPlugin from 'react-tap-event-plugin'; + +import './chromeExtension.css'; +import MuiThemeProvider from '../MuiThemeProvider'; +import Web3Provider from '../Web3Provider'; +import Web3 from 'web3'; +import web3extensions from '../util/web3.extensions'; + +import Routes from './routes'; +import middlewares from './middlewares'; +import createStore from './store'; + +const http = new Web3.providers.HttpProvider(process.env.RPC_ADDRESS || '/rpc/'); +const web3 = new Web3(http); +web3extensions(web3) + .map(extension => web3._extend(extension)); + +const store = createStore(middlewares()); + +injectTapEventPlugin(); + +ReactDOM.render( + + + + + + + , + document.querySelector('#root') +); + +global.web3 = web3; +global.BigNumber = BigNumber; diff --git a/js/src/views/Signer/dappscomponents/docs/index.html b/js/src/views/Signer/dappscomponents/docs/index.html new file mode 100644 index 00000000000..3b12da43f05 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/index.html @@ -0,0 +1,12 @@ + + + + + + Dapps React Ui + + +
+ + + diff --git a/js/src/views/Signer/dappscomponents/docs/middlewares/index.js b/js/src/views/Signer/dappscomponents/docs/middlewares/index.js new file mode 100644 index 00000000000..0c35a1c2ca4 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/middlewares/index.js @@ -0,0 +1 @@ +export default from './middlewares'; diff --git a/js/src/views/Signer/dappscomponents/docs/middlewares/logger.js b/js/src/views/Signer/dappscomponents/docs/middlewares/logger.js new file mode 100644 index 00000000000..63c001bc4d3 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/middlewares/logger.js @@ -0,0 +1,19 @@ + +export default store => next => action => { + if (!store.getState().logger.logging) { + return next(action); + } + + const msg = [`[${now()}] action:`, `${action.type};`, 'payload: ', action.payload]; + // const logMethod = action.type.indexOf('error') > -1 ? 'error' : 'log'; + console.log(...msg); // todo [adgo] - implement error logs + return next(action); +}; + +function now () { + const date = new Date(Date.now()); + const seconds = date.getSeconds(); + const minutes = date.getMinutes(); + const hour = date.getHours(); + return `${hour}::${minutes}::${seconds}`; +} diff --git a/js/src/views/Signer/dappscomponents/docs/middlewares/middlewares.js b/js/src/views/Signer/dappscomponents/docs/middlewares/middlewares.js new file mode 100644 index 00000000000..7c360a5894f --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/middlewares/middlewares.js @@ -0,0 +1,13 @@ +// Middleware classes (except logger) +import Toastr from './toastr'; +import logger from './logger'; + +export default function middlewares (initToken, tokenSetter, wsPath) { + // Middleware instances + const toastr = new Toastr(); + + return [ + logger, + toastr.toMiddleware() + ]; +} diff --git a/js/src/views/Signer/dappscomponents/docs/middlewares/toastr.js b/js/src/views/Signer/dappscomponents/docs/middlewares/toastr.js new file mode 100644 index 00000000000..0bc867ef130 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/middlewares/toastr.js @@ -0,0 +1,53 @@ + +import { addToast, removeToast } from '../actions/toastr'; + +export default class ToastrMiddleware { + + constructor (time = 4000) { + this._time = time; + this._timeouts = {}; + } + + toMiddleware () { + return store => next => action => { + const { type, payload } = action; + if (type === 'remove toast' || type === 'freezeToast') { + this.clearTimeoutFor(payload); + } + + // pass along action + next(action); + + if (!this.shouldToast(action)) { + return; + } + + // if action should toast, call next again with toast values + this.toast(store, next, action); + }; + } + + toast (store, next, action) { + const { toastNo } = store.getState().toastr; + const { msg, type } = action.meta.toastr; + next(addToast({ type, msg, toastNo })); + this.setTimeoutFor(toastNo, next); + } + + setTimeoutFor (toastNo, next) { + this._timeouts[String(toastNo)] = setTimeout(() => { + this.clearTimeoutFor(toastNo); + next(removeToast(toastNo)); + }, this._time); + } + + shouldToast (action) { + return !!(action.meta && action.meta.toastr); + } + + clearTimeoutFor (toastNo) { + clearTimeout(this._timeouts[String(toastNo)]); + delete this._timeouts[String(toastNo)]; + } + +} diff --git a/js/src/views/Signer/dappscomponents/docs/reducers/index.js b/js/src/views/Signer/dappscomponents/docs/reducers/index.js new file mode 100644 index 00000000000..f0d9718ec18 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/reducers/index.js @@ -0,0 +1 @@ +export default from './reducers'; diff --git a/js/src/views/Signer/dappscomponents/docs/reducers/logger.js b/js/src/views/Signer/dappscomponents/docs/reducers/logger.js new file mode 100644 index 00000000000..15657286701 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/reducers/logger.js @@ -0,0 +1,18 @@ + +import { handleActions } from 'redux-actions'; + +const isProd = process.env.NODE_ENV === 'production'; + +const initialState = { + logging: !isProd +}; + +export default handleActions({ + + 'update logging' (state, action) { + return { + logging: action.payload + }; + } + +}, initialState); diff --git a/js/src/views/Signer/dappscomponents/docs/reducers/reducers.js b/js/src/views/Signer/dappscomponents/docs/reducers/reducers.js new file mode 100644 index 00000000000..283f5df7396 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/reducers/reducers.js @@ -0,0 +1,10 @@ +import { routerReducer as routing } from 'react-router-redux'; +import { combineReducers } from 'redux'; +import toastr from './toastr'; +import logger from './logger'; + +export default combineReducers({ + routing, + toastr, + logger +}); diff --git a/js/src/views/Signer/dappscomponents/docs/reducers/toastr.js b/js/src/views/Signer/dappscomponents/docs/reducers/toastr.js new file mode 100644 index 00000000000..193860a6aef --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/reducers/toastr.js @@ -0,0 +1,26 @@ + +import { handleActions } from 'redux-actions'; + +const initialState = { + toasts: [], + toastNo: 1 +}; + +export default handleActions({ + + 'add toast' (state, action) { + return { + ...state, + toastNo: state.toastNo + 1, + toasts: [action.payload].concat(state.toasts) + }; + }, + + 'remove toast' (state, action) { + return { + ...state, + toasts: state.toasts.filter(t => t.toastNo !== action.payload) + }; + } + +}, initialState); diff --git a/js/src/views/Signer/dappscomponents/docs/routes/index.js b/js/src/views/Signer/dappscomponents/docs/routes/index.js new file mode 100644 index 00000000000..761c736c45a --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/routes/index.js @@ -0,0 +1 @@ +export default from './routes'; diff --git a/js/src/views/Signer/dappscomponents/docs/routes/routes.js b/js/src/views/Signer/dappscomponents/docs/routes/routes.js new file mode 100644 index 00000000000..d503522a3e3 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/routes/routes.js @@ -0,0 +1,46 @@ + +import React, { Component, PropTypes } from 'react'; + +import { Router, Route, IndexRedirect, hashHistory } from 'react-router'; +import { syncHistoryWithStore } from 'react-router-redux'; + +import RootContainer from '../containers/Root'; +import WelcomePage from '../containers/WelcomePage'; +import AccountPage from '../containers/AccountPage'; +import AccountLinkPage from '../containers/AccountLinkPage'; +import IdenticonPage from '../containers/IdenticonPage'; +import RpcAutoCompletePage from '../containers/RpcAutoCompletePage'; +import ToastPage from '../containers/ToastPage'; +import TransactionFinishedPage from '../containers/TransactionFinishedPage'; +import TransactionPendingPage from '../containers/TransactionPendingPage'; +import TransactionPendingWeb3Page from '../containers/TransactionPendingWeb3Page'; +import TransactionPendingFormPage from '../containers/TransactionPendingFormPage'; + +export default class Routes extends Component { + + static propTypes = { + store: PropTypes.object.isRequired + }; + + render () { + const { store } = this.props; + const history = syncHistoryWithStore(hashHistory, store); + return ( + + + + + + + + + + + + + + + + ); + } +} diff --git a/js/src/views/Signer/dappscomponents/docs/store/configureStore.js b/js/src/views/Signer/dappscomponents/docs/store/configureStore.js new file mode 100644 index 00000000000..b44a104d718 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/store/configureStore.js @@ -0,0 +1,24 @@ +import { createStore, applyMiddleware } from 'redux'; + +import rootReducer from '../reducers'; + +export default function configure (middlewares) { + const create = window.devToolsExtension + ? window.devToolsExtension()(createStore) + : createStore; + + const createStoreWithMiddleware = applyMiddleware( + ...middlewares + )(create); + + const store = createStoreWithMiddleware(rootReducer); + + if (module.hot) { + module.hot.accept('../reducers', () => { + const nextReducer = require('../reducers'); + store.replaceReducer(nextReducer); + }); + } + + return store; +} diff --git a/js/src/views/Signer/dappscomponents/docs/store/index.js b/js/src/views/Signer/dappscomponents/docs/store/index.js new file mode 100644 index 00000000000..d39189a9641 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/store/index.js @@ -0,0 +1 @@ +export default from './configureStore'; diff --git a/js/src/views/Signer/dappscomponents/docs/transactions.data.js b/js/src/views/Signer/dappscomponents/docs/transactions.data.js new file mode 100644 index 00000000000..95d35971b97 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/docs/transactions.data.js @@ -0,0 +1,63 @@ +import BigNumber from 'bignumber.js'; +export default [ + { + _desc: 'Transaction on morden with no data', + id: '0x01', + from: '0x8704f2c24439592822be3d71d4fca6e87285f673', + fromBalance: new BigNumber('0x0'), + to: '0xbb9bc244d798123fde783fcc1c72d3bb8c189413', + toBalance: new BigNumber('0x0'), + value: '0x7b', // 123 + status: 'rejected', + error: true, + msg: 'Sender account has insufficient funds to process transaction', + gas: '0x0e618d', // 30400 + gasPrice: '0x054ea318cc', // 10000000000000 + chain: 'morden', + data: '0x' + }, + { + _desc: 'Contract on homestead', + id: '0x04', + from: '0x8704f2c24439592822be3d71d4fca6e87285f673', + fromBalance: new BigNumber('0x733a8ab53da50c000'), + value: '0x0', + status: 'confirmed', + msg: 'Confirmed', + txHash: '0xc573fee50fab265ea0bbe1739ebbc595dae0f368380f6165721c2b0693de8a40', + gas: '0x0e618d', // 30400 + gasPrice: '0x054ea318cc', // 10000000000000 + chain: 'homestead', + // greeter contract from https://www.ethereum.org/greeter + data: '0x636f6e7472616374206d6f7274616c207ba202020202f2a20446566696e65207661726961626c65206f776e6572206f6620746865207479706520616464726573732a2fa2020202061646472657373206f776e65723baa202020202f2a20746869732066756e6374696f6e20697320657865637574656420617420696e697469616c697a6174696f6e20616e64207365747320746865206f776e6572206f662074686520636f6e7472616374202a2fa2020202066756e6374696f6e206d6f7274616c2829207b206f776e6572203d206d73672e73656e6465723b207daa202020202f2a2046756e6374696f6e20746f207265636f766572207468652066756e6473206f6e2074686520636f6e7472616374202a2fa2020202066756e6374696f6e206b696c6c2829207b20696620286d73672e73656e646572203d3d206f776e6572292073756963696465286f776e6572293b207da7daa636f6e74726163742067726565746572206973206d6f7274616c207ba202020202f2a20646566696e65207661726961626c65206772656574696e67206f6620746865207479706520737472696e67202a2fa20202020737472696e67206772656574696e673baa202020202f2a20746869732072756e73207768656e2074686520636f6e7472616374206973206578656375746564202a2fa2020202066756e6374696f6e206772656574657228737472696e67205f6772656574696e6729207075626c6963207ba20202020202020206772656574696e67203d205f6772656574696e673ba202020207daa202020202f2a206d61696e2066756e6374696f6e202a2fa2020202066756e6374696f6e206772656574282920636f6e7374616e742072657475726e732028737472696e6729207ba202020202020202072657475726e206772656574696e673ba202020207da7d' + }, + { + _desc: 'rejected transaction on homestead with data', + id: '0x02', + from: '0x8704f2c24439592822be3d71d4fca6e87285f673', + fromBalance: new BigNumber('0x0'), + to: '0x9201f84c4a27ec41115f6fd1a140842e884c4b91', + toBalance: new BigNumber('0x365fc0'), + value: '0xf4240', // 1000000 + status: 'rejected', + msg: 'Rejected', + gas: '0x0e618d', // 30400 + gasPrice: '0x054ea318cc', // 10000000000000 + chain: 'homestead', + data: '0x66726f6d206d7220617765736f6d6521' // from mr awesome! + }, + { + _desc: 'Contract on homestead', + id: '0x03', + from: '0x8704f2c24439592822be3d71d4fca6e87285f673', + fromBalance: new BigNumber('0x0'), + value: '0x100', + status: 'rejected', + msg: 'Rejected', + gas: '0x0e618d', // 30400 + gasPrice: '0x054ea318cc', // 10000000000000 + chain: 'homestead', + // greeter contract from https://www.ethereum.org/greeter + data: '0x636f6e7472616374206d6f7274616c207ba202020202f2a20446566696e65207661726961626c65206f776e6572206f6620746865207479706520616464726573732a2fa2020202061646472657373206f776e65723baa202020202f2a20746869732066756e6374696f6e20697320657865637574656420617420696e697469616c697a6174696f6e20616e64207365747320746865206f776e6572206f662074686520636f6e7472616374202a2fa2020202066756e6374696f6e206d6f7274616c2829207b206f776e6572203d206d73672e73656e6465723b207daa202020202f2a2046756e6374696f6e20746f207265636f766572207468652066756e6473206f6e2074686520636f6e7472616374202a2fa2020202066756e6374696f6e206b696c6c2829207b20696620286d73672e73656e646572203d3d206f776e6572292073756963696465286f776e6572293b207da7daa636f6e74726163742067726565746572206973206d6f7274616c207ba202020202f2a20646566696e65207661726961626c65206772656574696e67206f6620746865207479706520737472696e67202a2fa20202020737472696e67206772656574696e673baa202020202f2a20746869732072756e73207768656e2074686520636f6e7472616374206973206578656375746564202a2fa2020202066756e6374696f6e206772656574657228737472696e67205f6772656574696e6729207075626c6963207ba20202020202020206772656574696e67203d205f6772656574696e673ba202020207daa202020202f2a206d61696e2066756e6374696f6e202a2fa2020202066756e6374696f6e206772656574282920636f6e7374616e742072657475726e732028737472696e6729207ba202020202020202072657475726e206772656574696e673ba202020207da7d' + } +]; diff --git a/js/src/views/Signer/dappscomponents/index.js b/js/src/views/Signer/dappscomponents/index.js new file mode 100644 index 00000000000..cdc00bfcdbc --- /dev/null +++ b/js/src/views/Signer/dappscomponents/index.js @@ -0,0 +1,25 @@ +export Account from './Account'; +export AccountLink from './AccountLink'; +export AnimateChildren from './AnimateChildren'; +export Identicon from './Identicon'; +export MuiThemeProvider from './MuiThemeProvider'; +// export RpcAutoComplete from './RpcAutoComplete'; // TODO: needs json-rpc +export Toastr from './Toastr'; + +// TODO [todr] merge pending + finished (just a flag) +export RequestPendingWeb3 from './RequestPendingWeb3'; +export RequestFinishedWeb3 from './RequestFinishedWeb3'; + +export SignRequestWeb3 from './SignRequestWeb3'; +export SignRequest from './SignRequest'; + +// TODO [todr] Merge with Request +export TransactionFinished from './TransactionFinished'; +export TransactionFinishedWeb3 from './TransactionFinishedWeb3'; +export TransactionPending from './TransactionPending'; +export TransactionPendingWeb3 from './TransactionPendingWeb3'; + +export Web3Compositor from './Web3Compositor'; +export Web3Provider from './Web3Provider'; +export web3Extension from './util/web3.extensions'; +export Web3WebSocketProvider from './util/Web3WebSocketProvider'; diff --git a/js/src/views/Signer/dappscomponents/index.spec.js b/js/src/views/Signer/dappscomponents/index.spec.js new file mode 100644 index 00000000000..6e7e978ce0f --- /dev/null +++ b/js/src/views/Signer/dappscomponents/index.spec.js @@ -0,0 +1,10 @@ +/* eslint-env mocha */ +/** + * Important: This test also serves as a point to + * import the entire lib for coverage reporting + */ + +import { assert } from 'chai'; +import * as DAppsUI from './'; + +describe('Dapps UI', () => it('should have exports', () => assert.ok(DAppsUI))); diff --git a/js/src/views/Signer/dappscomponents/middlewares/Logger.js b/js/src/views/Signer/dappscomponents/middlewares/Logger.js new file mode 100644 index 00000000000..91d1e67638c --- /dev/null +++ b/js/src/views/Signer/dappscomponents/middlewares/Logger.js @@ -0,0 +1,29 @@ +import logger from '../util/logger'; + +export default class LoggerMiddleware { + + toMiddleware () { + return store => next => action => { + const msg = [`[${this.now()}] action:`, `${action.type};`, 'payload:', action.payload]; + if (action.type.match('error')) { + logger.warn(...msg); + } else { + logger.log(...msg); + } + return next(action); + }; + } + + now () { + const date = new Date(Date.now()); + const seconds = this.pad(date.getSeconds()); + const minutes = this.pad(date.getMinutes()); + const hour = this.pad(date.getHours()); + return `${hour}::${minutes}::${seconds}`; + } + + pad (n) { + return n < 10 ? '0' + n : n; + } + +} diff --git a/js/src/views/Signer/dappscomponents/middlewares/Toastr.js b/js/src/views/Signer/dappscomponents/middlewares/Toastr.js new file mode 100644 index 00000000000..efb78b83425 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/middlewares/Toastr.js @@ -0,0 +1,65 @@ + +import { addToast, removeToast } from '../actions/toastr'; + +export default class ToastrMiddleware { + + constructor (time = 6000) { + this._time = time; + this._timeouts = {}; + } + + toMiddleware () { + return store => next => action => { + const { type, payload } = action; + if (type === 'remove toast' || type === 'freezeToast') { + this.clearTimeoutFor(payload); + } + + if (type === 'add toast') { + this.onAddToast(store, next, action); + return; + } + + // pass along action + next(action); + + if (!this.shouldToast(action)) { + return; + } + + // if action should toast, call next again with toast values + this.toast(store, next, action); + }; + } + + toast (store, next, action) { + const { id } = store.getState().toastr; + const { msg, type } = action.meta.toastr; + next(addToast({ type, msg, id })); + this.setTimeoutFor(id, next); + } + + onAddToast (store, next, action) { + const { id } = store.getState().toastr; + action.payload.id = id; + next(action); + this.setTimeoutFor(id, next); + } + + setTimeoutFor (id, next) { + this._timeouts[String(id)] = setTimeout(() => { + this.clearTimeoutFor(id); + next(removeToast(id)); + }, this._time); + } + + shouldToast (action) { + return !!(action.meta && action.meta.toastr); + } + + clearTimeoutFor (id) { + clearTimeout(this._timeouts[String(id)]); + delete this._timeouts[String(id)]; + } + +} diff --git a/js/src/views/Signer/dappscomponents/middlewares/Toastr.spec.js b/js/src/views/Signer/dappscomponents/middlewares/Toastr.spec.js new file mode 100644 index 00000000000..8ab369ff92a --- /dev/null +++ b/js/src/views/Signer/dappscomponents/middlewares/Toastr.spec.js @@ -0,0 +1,174 @@ +import sinon from 'sinon'; +import ToastrMiddleware from './Toastr'; +import { removeToast, addToast } from '../actions/toastr'; + +describe('MIDDLEWARE: TOASTR', () => { + let cut, state; + const time = 20; + let toastNo = 1; + + beforeEach('mock cut', () => { + cut = new ToastrMiddleware(time); + state = { + toastr: { + id: toastNo + } + }; + }); + + describe('TO MIDDLEWARE', () => { + beforeEach('mock methods', () => { + cut.clearTimeoutFor = sinon.spy(); + cut.toast = sinon.spy(); + }); + + it('should call only clearTimeoutFor and next, when respected action is dispatched', () => { + // given + const store = null; + const next = sinon.spy(); + const middleware = cut.toMiddleware()(store)(next); + const action = removeToast(toastNo); + expect(middleware).to.be.a('function'); + expect(action).to.be.an('object'); + + // when + middleware(action); + + // then + expect(cut.clearTimeoutFor.calledWith(toastNo)).to.be.true; + expect(next.calledWith(action)).to.be.true; + expect(cut.toast.called).to.be.false; + }); + + it('should call only next when non-respected action is dispatched', () => { + // given + const store = null; + const next = sinon.spy(); + const middleware = cut.toMiddleware()(store)(next); + const action = { type: 'test' }; + expect(middleware).to.be.a('function'); + expect(action).to.be.an('object'); + + // when + middleware(action); + + // then + expect(cut.clearTimeoutFor.called).to.be.false; + expect(next.calledWith(action)).to.be.true; + expect(cut.toast.called).to.be.false; + }); + + it('should call only next and toast, when action with meta toastr is dispatched', () => { + // given + const msg = 'test'; + const store = null; + const next = sinon.spy(); + const middleware = cut.toMiddleware()(store)(next); + const meta = { toastr: { msg, type: 'default' } }; + const action = { type: 'test', payload: 'test', meta }; + expect(middleware).to.be.a('function'); + expect(action).to.be.an('object'); + + // when + middleware(action); + + // then + expect(cut.clearTimeoutFor.called).to.be.false; + expect(next.calledWith(action)).to.be.true; + expect(cut.toast.calledWith(store, next, action)).to.be.true; + }); + }); + + describe('TOAST', () => { + // using 'before' doesn't work + // it might b overwriten by the global beforeEach + beforeEach('spy on removeToast', () => { + cut.setTimeoutFor = sinon.spy(); + }); + + it('should call next and setTimeoutFor', () => { + // given + const msg = 'text'; + const type = 'default'; + const store = { getState: () => state }; + const next = sinon.spy(); + const action = { meta: { toastr: { + msg, type + } } }; + + // when + cut.toast(store, next, action); + + // then + expect(next.calledWith(addToast({ + msg, type, id: toastNo + }))).to.be.true; + + expect(cut.setTimeoutFor.calledWith(toastNo, next)); + }); + }); + + describe('SET TIMEOUT FOR', () => { + beforeEach('spy on clearTimeoutFor', () => { + cut.clearTimeoutFor = sinon.spy(); + }); + it('should call clearTimeoutFor and next after cut._time', done => { + // given + const next = sinon.spy(); + + // when + cut.setTimeoutFor(toastNo, next); + + // then + expect(cut._timeouts[String(toastNo)]).to.be.an('object'); + setTimeout(() => { + expect(cut.clearTimeoutFor.calledWith(toastNo)).to.be.true; + expect(next.calledWith(removeToast(toastNo))).to.be.true; + done(); + }, time); + }); + }); + + describe('SHOULD TOAST', () => { + it('should return false when action isn\'t toastable', () => { + // given + const action = { meta: {} }; + + // when + const res = cut.shouldToast(action); + + // then + expect(res).to.be.false; + }); + it('should return true when action is toastable', () => { + // given + const action = { meta: { toastr: { msg: 'foo' } } }; + + // when + const res = cut.shouldToast(action); + + // then + expect(res).to.be.true; + }); + }); + describe('CLEAR TIMEOUT FOR', () => { + let mockedTimeoutSpy; + beforeEach('mock timeouts', () => { + mockedTimeoutSpy = sinon.spy(); + cut._timeouts[String(toastNo)] = setTimeout(() => { + mockedTimeoutSpy(); + }, time); + }); + it('should clear and delete timeout', done => { + // when + cut.clearTimeoutFor(toastNo); + + // then + expect(cut._timeouts[String(toastNo)]).to.be.undefined; + setTimeout(() => { + expect(mockedTimeoutSpy.called).to.be.false; + done(); + }, time); + }); + }); +}); diff --git a/js/src/views/Signer/dappscomponents/reducers/logger.js b/js/src/views/Signer/dappscomponents/reducers/logger.js new file mode 100644 index 00000000000..2cd555e1e0b --- /dev/null +++ b/js/src/views/Signer/dappscomponents/reducers/logger.js @@ -0,0 +1,15 @@ +import { handleActions } from 'redux-actions'; + +const initialState = { + logging: process.env.LOGGING +}; + +export default handleActions({ + + 'update logging' (state, action) { + return { + logging: action.payload + }; + } + +}, initialState); diff --git a/js/src/views/Signer/dappscomponents/reducers/toastr.js b/js/src/views/Signer/dappscomponents/reducers/toastr.js new file mode 100644 index 00000000000..47476c7a161 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/reducers/toastr.js @@ -0,0 +1,26 @@ + +import { handleActions } from 'redux-actions'; + +const initialState = { + toasts: [], + id: 1 +}; + +export default handleActions({ + + 'add toast' (state, action) { + return { + ...state, + id: state.id + 1, + toasts: [action.payload].concat(state.toasts) + }; + }, + + 'remove toast' (state, action) { + return { + ...state, + toasts: state.toasts.filter(t => t.id !== action.payload) + }; + } + +}, initialState); diff --git a/js/src/views/Signer/dappscomponents/util/Web3WebSocketProvider/Web3WebSocketProvider.js b/js/src/views/Signer/dappscomponents/util/Web3WebSocketProvider/Web3WebSocketProvider.js new file mode 100644 index 00000000000..ec56c2c2bfa --- /dev/null +++ b/js/src/views/Signer/dappscomponents/util/Web3WebSocketProvider/Web3WebSocketProvider.js @@ -0,0 +1,67 @@ +/* global WebSocket */ +export default class Web3WebSocketProvider { + + constructor (host = 'localhost', port = 8180, path) { + this.path = path || `ws://${host}:${port}`; + this.ws = new WebSocket(this.path); + this.ws.addEventListener('open', this.onOpen); + this.ws.addEventListener('message', this.onMessage); + this.callbacks = {}; + this.queue = []; // hold calls until ws is connected on init or if disconnected + this.id = 0; + } + + onOpen = evt => { + console.log('WS: listening on: ', this.path); + this.isWsConnected = true; + this.executeQueue(); + }; + + onMessage = msg => { + console.log('WS: incoming msg: ', msg); + try { + msg = JSON.parse(msg.data); + } catch (err) { + return console.error('error parsing msg from WS: ', msg, err); + } + const cb = this.callbacks[msg.id]; + delete this.callbacks[msg.id]; + if (!cb) { + return; + } + cb(null, msg); // web3 uses error first cb style + } + + send (payload) { + throw new Error('404: websockets dont support sync calls'); + } + + sendAsync (payload, cb) { + console.log('WS: send async: ', payload, 'with cb: ', !!cb); + if (!this.isWsConnected) { + this.queue.push({ payload, cb }); + return console.log('WS: incoming msg when not connected, adding to queue'); + } + this.id++; + const { id } = this; + this.ws.send(JSON.stringify(payload)); + if (!cb) { + return; + } + + this.callbacks[id] = cb; + } + + executeQueue () { + console.log('WS: executing queue: ', this.queue); + this.queue.forEach(call => { + this.sendAsync(call.payload, call.cb); + }); + } + + // Compatibility with rest of W3 providers + isConnected () { + return this.isWsConnected; + } + +} diff --git a/js/src/views/Signer/dappscomponents/util/Web3WebSocketProvider/index.js b/js/src/views/Signer/dappscomponents/util/Web3WebSocketProvider/index.js new file mode 100644 index 00000000000..df5c7fbbd33 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/util/Web3WebSocketProvider/index.js @@ -0,0 +1 @@ +export default from './Web3WebSocketProvider'; diff --git a/js/src/views/Signer/dappscomponents/util/account.js b/js/src/views/Signer/dappscomponents/util/account.js new file mode 100644 index 00000000000..79058dbf343 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/util/account.js @@ -0,0 +1,9 @@ +import { BASE_LINK_ACCOUNT_MORDEN, BASE_LINK_ACCOUNT_HOMESTEAD } from '../constants/constants'; + +export const getAccountLink = _getAccountLink; + +function _getAccountLink (address, chain) { + const isTestNet = chain === 'morden' || chain === 'testnet'; + const base = isTestNet ? BASE_LINK_ACCOUNT_MORDEN : BASE_LINK_ACCOUNT_HOMESTEAD; + return base + address; +} diff --git a/js/src/views/Signer/dappscomponents/util/logger.js b/js/src/views/Signer/dappscomponents/util/logger.js new file mode 100644 index 00000000000..ec99c756534 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/util/logger.js @@ -0,0 +1,22 @@ +const isLogging = process.env.LOGGING; + +export default logger(); + +function logger () { + return isLogging ? devLogger() : prodLogger(); +} + +function prodLogger () { + return { + log: noop, + info: noop, + error: noop, + warn: noop + }; +} + +function devLogger () { + return console; +} + +function noop () {} diff --git a/js/src/views/Signer/dappscomponents/util/react.js b/js/src/views/Signer/dappscomponents/util/react.js new file mode 100644 index 00000000000..c5a99c70f5e --- /dev/null +++ b/js/src/views/Signer/dappscomponents/util/react.js @@ -0,0 +1,6 @@ + +import { isValidElement } from 'react'; + +export function isReactComponent (componentOrElem) { + return isValidElement(componentOrElem) && typeof componentOrElem.type === 'function'; +} diff --git a/js/src/views/Signer/dappscomponents/util/toastr.js b/js/src/views/Signer/dappscomponents/util/toastr.js new file mode 100644 index 00000000000..cf09a10c454 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/util/toastr.js @@ -0,0 +1,11 @@ +// pass this to action creator's meta (third argument) to make action toastable +export function withToastr (msgFunc, type = 'default') { + return function (msg) { + return { + toastr: { + msg: msgFunc(msg), + type + } + }; + }; +} diff --git a/js/src/views/Signer/dappscomponents/util/toastr.spec.js b/js/src/views/Signer/dappscomponents/util/toastr.spec.js new file mode 100644 index 00000000000..6cbff32131e --- /dev/null +++ b/js/src/views/Signer/dappscomponents/util/toastr.spec.js @@ -0,0 +1,38 @@ +import { withToastr } from './toastr'; + +describe('UTIL TOASTR', () => { + it('should return toastr object with type set to default, when no type is passed', () => { + // given + const msg = 'test'; + const msgFunc = x => `some text and ${x}`; + + // when + const res = withToastr(msgFunc)(msg); + + // then + expect(res).to.eql({ + toastr: { + msg: `some text and ${msg}`, + type: 'default' + } + }); + }); + + it('should return toastr object with type set to success, when success type is passed', () => { + // given + const msg = 'test'; + const type = 'success'; + const msgFunc = x => `some text and ${x}`; + + // when + const res = withToastr(msgFunc, type)(msg); + + // then + expect(res).to.eql({ + toastr: { + msg: `some text and ${msg}`, + type + } + }); + }); +}); diff --git a/js/src/views/Signer/dappscomponents/util/transaction.js b/js/src/views/Signer/dappscomponents/util/transaction.js new file mode 100644 index 00000000000..b3ab3c176a6 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/util/transaction.js @@ -0,0 +1,105 @@ +import BigNumber from 'bignumber.js'; + +const WEI_TO_ETH_MULTIPLIER = 0.000000000000000001; +const WEI_TO_SZABU_MULTIPLIER = 0.000000000001; +import { BASE_LINK_TX_MORDEN, BASE_LINK_TX_HOMESTEAD } from '../constants/constants'; + +export const getShortData = _getShortData; +// calculations +export const getFee = _getFee; +export const calcFeeInEth = _calcFeeInEth; +export const getTotalValue = _getTotalValue; +// displays +export const getSzaboFromWeiDisplay = _getSzaboFromWeiDisplay; +export const getValueDisplay = _getValueDisplay; +export const getValueDisplayWei = _getValueDisplayWei; +export const getTotalValueDisplay = _getTotalValueDisplay; +export const getTotalValueDisplayWei = _getTotalValueDisplayWei; +export const getEthmFromWeiDisplay = _getEthmFromWeiDisplay; +export const getGasDisplay = _getGasDisplay; +// links +export const getTxLink = _getTxLink; + +function _getShortData (data) { + if (data.length <= 3) { + return data; + } + return data.substr(0, 3) + '...'; +} + +/* + * @param {hex string} gas + * @param {wei hex string} gasPrice + * @return {BigNumber} fee in wei + */ +function _getFee (gas, gasPrice) { + gas = new BigNumber(gas); + gasPrice = new BigNumber(gasPrice); + return gasPrice.times(gas); +} + +function _calcFeeInEth (totalValue, value) { + let fee = new BigNumber(totalValue).sub(new BigNumber(value)); + return fee.times(WEI_TO_ETH_MULTIPLIER).toFormat(7); +} + +/* + * @param {wei BigNumber} fee + * @param {wei hex string} value + * @return {BigNumber} total value in wei + */ +function _getTotalValue (fee, value) { + value = new BigNumber(value); + return fee.plus(value); +} + +/* + * @param {wei hex string} gasPrice + * @return {string} szabo gas price with unit [szabo] i.e. 21,423 [szabo] + */ +function _getSzaboFromWeiDisplay (gasPrice) { + gasPrice = new BigNumber(gasPrice); + return gasPrice.times(WEI_TO_SZABU_MULTIPLIER).toPrecision(5); +} + +/* + * @param {wei hex string} value + * @return {string} value in WEI nicely formatted + */ +function _getValueDisplay (value) { + value = new BigNumber(value); + return value.times(WEI_TO_ETH_MULTIPLIER).toFormat(5); +} + +function _getValueDisplayWei (value) { + value = new BigNumber(value); + return value.toFormat(0); +} + +/* + * @param {wei hex string} totalValue + * @return {string} total value (including fee) with units i.e. 1.32 [eth] + */ +function _getTotalValueDisplay (totalValue) { + totalValue = new BigNumber(totalValue); + return totalValue.times(WEI_TO_ETH_MULTIPLIER).toFormat(5); +} + +function _getTotalValueDisplayWei (totalValue) { + totalValue = new BigNumber(totalValue); + return totalValue.toFormat(0); +} + +function _getEthmFromWeiDisplay (weiHexString) { + const value = new BigNumber(weiHexString); + return value.times(WEI_TO_ETH_MULTIPLIER).times(1e7).toFixed(5); +} + +function _getTxLink (txHash, chain) { + const base = chain === 'morden' || chain === 'testnet' ? BASE_LINK_TX_MORDEN : BASE_LINK_TX_HOMESTEAD; + return base + txHash; +} + +function _getGasDisplay (gas) { + return new BigNumber(gas).times(1e-7).toFormat(4); +} diff --git a/js/src/views/Signer/dappscomponents/util/transaction.spec.js b/js/src/views/Signer/dappscomponents/util/transaction.spec.js new file mode 100644 index 00000000000..7ad0bedeea1 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/util/transaction.spec.js @@ -0,0 +1,63 @@ +import BigNumber from 'bignumber.js'; +import { getShortData, getFee, getTotalValue } from './transaction'; + +describe('util/transaction', () => { + describe('getEstimatedMiningTime', () => { + it('should return estimated mining time', () => { + }); + }); + + describe('getShortData', () => { + it('should return short data', () => { + // given + const data = '0xh87dY78'; + + // when + const res = getShortData(data); + + // then + expect(res).to.equal('0xh...'); + }); + + it('should return data as is', () => { + // given + const data = '0x0'; + + // when + const shortData = getShortData(data); + + // then + expect(shortData).to.equal('0x0'); + }); + }); + + describe('getFee', () => { + it('should return wei BigNumber object equals to gas * gasPrice', () => { + // given + const gas = '0x76c0'; // 30400 + const gasPrice = '0x9184e72a000'; // 10000000000000 wei + + // when + const fee = getFee(gas, gasPrice); + + // then + expect(fee).to.be.an.instanceOf(BigNumber); + expect(fee.toString()).to.be.equal('304000000000000000'); // converting to string due to https://github.com/MikeMcl/bignumber.js/issues/11 + }); + }); + + describe('getTotalValue', () => { + it('should return wei BigNumber totalValue equals to value + fee', () => { + // given + const fee = new BigNumber(304000000000000000); // wei + const value = '0x9184e72a'; // 2441406250 wei + + // when + const totalValue = getTotalValue(fee, value); + + // then + expect(totalValue).to.be.an.instanceOf(BigNumber); + expect(totalValue.toString()).to.be.equal('304000002441406250'); // converting to string due to https://github.com/MikeMcl/bignumber.js/issues/11 + }); + }); +}); diff --git a/js/src/views/Signer/dappscomponents/util/util.js b/js/src/views/Signer/dappscomponents/util/util.js new file mode 100644 index 00000000000..352c2c539fa --- /dev/null +++ b/js/src/views/Signer/dappscomponents/util/util.js @@ -0,0 +1,20 @@ + +export function toPromise (fn) { + return new Promise((resolve, reject) => { + fn((err, res) => { + if (err) { + reject(err); + } else { + resolve(res); + } + }); + }); +} + +export function identity (x) { + return x; +} + +export function capitalize (str) { + return str[0].toUpperCase() + str.slice(1).toLowerCase(); +} diff --git a/js/src/views/Signer/dappscomponents/util/web3.extensions.js b/js/src/views/Signer/dappscomponents/util/web3.extensions.js new file mode 100644 index 00000000000..604fb4a67d9 --- /dev/null +++ b/js/src/views/Signer/dappscomponents/util/web3.extensions.js @@ -0,0 +1,51 @@ +export default function web3extensions (web3) { + const { Method, formatters } = web3._extend; + + return [{ + property: 'personal', + methods: [ + new Method({ + name: 'signAndSendTransaction', + call: 'personal_signAndSendTransaction', + params: 2, + inputFormatter: [formatters.inputTransactionFormatter, null] + }), + new Method({ + name: 'signerEnabled', + call: 'personal_signerEnabled', + params: 0, + inputFormatter: [] + }) + ], + properties: [] + }, { + property: 'ethcore', + methods: [ + new Method({ + name: 'getNetPeers', + call: 'ethcore_netPeers', + params: 0, + outputFormatter: x => x + }), + new Method({ + name: 'getNetChain', + call: 'ethcore_netChain', + params: 0, + outputFormatter: x => x + }), + new Method({ + name: 'gasPriceStatistics', + call: 'ethcore_gasPriceStatistics', + params: 0, + outputFormatter: a => a.map(web3.toBigNumber) + }), + new Method({ + name: 'unsignedTransactionsCount', + call: 'ethcore_unsignedTransactionsCount', + params: 0, + inputFormatter: [] + }) + ], + properties: [] + }]; +} diff --git a/js/src/views/Signer/index.js b/js/src/views/Signer/index.js index 04d299c58a2..7d798152e05 100644 --- a/js/src/views/Signer/index.js +++ b/js/src/views/Signer/index.js @@ -1,16 +1,3 @@ -import './index.html'; +const Signer = null; -const app = window.paritySigner; // exposed by app.js - -initApp(); - -function initApp () { - const initToken = window.localStorage.getItem('sysuiToken'); - // TODO [ToDr] Hardcoded address should replaced with options - const address = process.env.NODE_ENV === 'production' ? window.location.host : '127.0.0.1:8180'; - app(initToken, tokenSetter, address); -} - -function tokenSetter (token, cb) { - window.localStorage.setItem('sysuiToken', token); -} +export default Signer; diff --git a/js/src/views/Signer/routes/routes.js b/js/src/views/Signer/routes/routes.js index bbbc844f89e..40882e12bfb 100644 --- a/js/src/views/Signer/routes/routes.js +++ b/js/src/views/Signer/routes/routes.js @@ -1,9 +1,5 @@ - import React, { Component, PropTypes } from 'react'; - -import { Router, Route, useRouterHistory, IndexRedirect } from 'react-router'; -import { createHashHistory } from 'history'; -import { syncHistoryWithStore } from 'react-router-redux'; +import { Route, IndexRedirect } from 'react-router'; import RootContainer from '../containers/Root'; import LoadingPage from '../containers/LoadingPage'; @@ -11,50 +7,43 @@ import RequestsPage from '../containers/RequestsPage'; import UnAuthorizedPage from '../containers/UnAuthorizedPage'; import OfflinePage from '../containers/OfflinePage'; -const routerHistory = useRouterHistory(createHashHistory)({}); - export default class Routes extends Component { + static contextTypes = { + store: PropTypes.object + } + + static propTypes = { + path: PropTypes.string + }; render () { - const { store } = this.props; - const history = syncHistoryWithStore(routerHistory, store); + const { path } = this.props; + console.log('path', path); + return ( - - - - - - - - - + + + + + + + - + ); } - static propTypes = { - store: PropTypes.object.isRequired - }; - requireAuth = (nextState, replace) => { - const appState = this.props.store.getState().app; + const { store } = this.context; + const appState = store.getState().app; const { isLoading, isConnected, isNodeRunning } = appState; if (isLoading) { - replace('/loading'); - return; - } - - if (!isNodeRunning) { - replace('/offline'); - return; - } - - if (!isConnected) { - replace('/unAuthorized'); - return; + replace('loading'); + } else if (!isNodeRunning) { + replace('offline'); + } else if (!isConnected) { + replace('unAuthorized'); } }; - } From f344b0ccd587624199e01e53f0a438cbaa62009c Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 1 Sep 2016 21:23:00 +0200 Subject: [PATCH 0292/1062] consistent actionbar --- js/src/ui/Actionbar/actionbar.js | 49 ++++++++++++++++++++++++ js/src/ui/Actionbar/index.js | 1 + js/src/ui/Actionbar/style.css | 20 ++++++++++ js/src/ui/Theme/theme.js | 2 +- js/src/ui/index.js | 2 + js/src/views/Account/Actions/actions.js | 32 ---------------- js/src/views/Account/Actions/index.js | 1 - js/src/views/Account/account.js | 35 +++++++++++++---- js/src/views/Accounts/Actions/actions.js | 40 ------------------- js/src/views/Accounts/Actions/index.js | 1 - js/src/views/Accounts/accounts.js | 37 +++++++++++++++--- js/src/views/Accounts/style.css | 13 +++++++ 12 files changed, 146 insertions(+), 87 deletions(-) create mode 100644 js/src/ui/Actionbar/actionbar.js create mode 100644 js/src/ui/Actionbar/index.js create mode 100644 js/src/ui/Actionbar/style.css delete mode 100644 js/src/views/Account/Actions/actions.js delete mode 100644 js/src/views/Account/Actions/index.js delete mode 100644 js/src/views/Accounts/Actions/actions.js delete mode 100644 js/src/views/Accounts/Actions/index.js diff --git a/js/src/ui/Actionbar/actionbar.js b/js/src/ui/Actionbar/actionbar.js new file mode 100644 index 00000000000..b1dc0c1067c --- /dev/null +++ b/js/src/ui/Actionbar/actionbar.js @@ -0,0 +1,49 @@ +import React, { Component, PropTypes } from 'react'; +import { Toolbar, ToolbarGroup, ToolbarTitle } from 'material-ui/Toolbar'; + +import styles from './style.css'; + +export default class Actionbar extends Component { + static propTypes = { + title: PropTypes.string, + buttons: PropTypes.array, + children: PropTypes.node + }; + + render () { + const { children } = this.props; + + return ( + + { this.renderTitle() } + { this.renderButtons() } + { children } + + ); + } + + renderButtons () { + const { buttons } = this.props; + + if (!buttons || !buttons.length) { + return null; + } + + return ( + + { buttons } + + ); + } + + renderTitle () { + const { title } = this.props; + + return ( + + ); + } +} diff --git a/js/src/ui/Actionbar/index.js b/js/src/ui/Actionbar/index.js new file mode 100644 index 00000000000..62b3af19cd6 --- /dev/null +++ b/js/src/ui/Actionbar/index.js @@ -0,0 +1 @@ +export default from './actionbar'; diff --git a/js/src/ui/Actionbar/style.css b/js/src/ui/Actionbar/style.css new file mode 100644 index 00000000000..2e0bf358e7d --- /dev/null +++ b/js/src/ui/Actionbar/style.css @@ -0,0 +1,20 @@ +.tooltitle { + text-transform: uppercase; + color: white; +} + +.toolbuttons { +} + +.toolbuttons button { + color: white !important; + margin: 10px 0 10px 16px !important; +} + +.toolbuttons button:hover { + background: rgba(80, 80, 80, 0.5) !important; +} + +.toolbuttons svg { + fill: white !important; +} diff --git a/js/src/ui/Theme/theme.js b/js/src/ui/Theme/theme.js index 080779e3ae3..83cec531655 100644 --- a/js/src/ui/Theme/theme.js +++ b/js/src/ui/Theme/theme.js @@ -14,6 +14,6 @@ muiTheme.tabs = lightTheme.tabs; muiTheme.tabs.backgroundColor = 'rgb(65, 65, 65)'; muiTheme.textField.disabledTextColor = muiTheme.textField.textColor; muiTheme.toolbar = lightTheme.toolbar; -muiTheme.toolbar.backgroundColor = 'rgb(80, 80, 80)'; +muiTheme.toolbar.backgroundColor = 'rgba(255, 136, 0, 0.6)'; // 'rgb(80, 80, 80)'; export default muiTheme; diff --git a/js/src/ui/index.js b/js/src/ui/index.js index 47f9e77b9b3..d71e2ed13af 100644 --- a/js/src/ui/index.js +++ b/js/src/ui/index.js @@ -1,3 +1,4 @@ +import Actionbar from './Actionbar'; import Balances from './Balances'; import Container, { Title as ContainerTitle } from './Container'; import Errors from './Errors'; @@ -8,6 +9,7 @@ import muiTheme from './Theme'; import Tooltips, { Tooltip } from './Tooltips'; export { + Actionbar, Balances, Container, ContainerTitle, diff --git a/js/src/views/Account/Actions/actions.js b/js/src/views/Account/Actions/actions.js deleted file mode 100644 index b8c4c361af5..00000000000 --- a/js/src/views/Account/Actions/actions.js +++ /dev/null @@ -1,32 +0,0 @@ -import React, { Component, PropTypes } from 'react'; - -import { FlatButton } from 'material-ui'; -import { Toolbar, ToolbarGroup } from 'material-ui/Toolbar'; -import ActionAccountBalance from 'material-ui/svg-icons/action/account-balance'; -import ContentSend from 'material-ui/svg-icons/content/send'; - -export default class Actions extends Component { - static propTypes = { - onTransfer: PropTypes.func.isRequired, - onFundAccount: PropTypes.func.isRequired - } - - render () { - return ( - - - } - label='transfer' - primary - onTouchTap={ this.props.onTransfer } /> - } - label='fund account' - primary - onTouchTap={ this.props.onFundAccount } /> - - - ); - } -} diff --git a/js/src/views/Account/Actions/index.js b/js/src/views/Account/Actions/index.js deleted file mode 100644 index 8d77c6173ec..00000000000 --- a/js/src/views/Account/Actions/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './actions'; diff --git a/js/src/views/Account/account.js b/js/src/views/Account/account.js index 2ef223d24dc..27f4e2d35b6 100644 --- a/js/src/views/Account/account.js +++ b/js/src/views/Account/account.js @@ -1,12 +1,12 @@ import React, { Component, PropTypes } from 'react'; - +import { FlatButton } from 'material-ui'; +import ActionAccountBalance from 'material-ui/svg-icons/action/account-balance'; import ContentCreate from 'material-ui/svg-icons/content/create'; +import ContentSend from 'material-ui/svg-icons/content/send'; import { FundAccount, Transfer } from '../../modals'; +import { Actionbar, Balances, Container, ContainerTitle, Form, FormWrap, InputInline, IdentityIcon } from '../../ui'; -import { Balances, Container, ContainerTitle, Form, FormWrap, InputInline, IdentityIcon } from '../../ui'; - -import Actions from './Actions'; import Transactions from './Transactions'; import styles from './style.css'; @@ -61,9 +61,7 @@ export default class Account extends Component {
{ this.renderFundDialog() } { this.renderTransferDialog() } - + { this.renderActionbar() } @@ -95,6 +93,29 @@ export default class Account extends Component { ); } + renderActionbar () { + const buttons = [ + } + label='transfer' + primary + onTouchTap={ this.onTransferClick } />, + } + label='fund account' + primary + onTouchTap={ this.onFundAccountClick } /> + ]; + + return ( + + ); + } + renderFundDialog () { const { fundDialog } = this.state; diff --git a/js/src/views/Accounts/Actions/actions.js b/js/src/views/Accounts/Actions/actions.js deleted file mode 100644 index 7ba8bf956fc..00000000000 --- a/js/src/views/Accounts/Actions/actions.js +++ /dev/null @@ -1,40 +0,0 @@ -import React, { Component, PropTypes } from 'react'; - -import { FlatButton } from 'material-ui'; -import { Toolbar, ToolbarGroup } from 'material-ui/Toolbar'; -import CommunicationContacts from 'material-ui/svg-icons/communication/contacts'; -import ContentAdd from 'material-ui/svg-icons/content/add'; - -import { Tooltip } from '../../../ui/Tooltips'; - -import styles from '../style.css'; - -export default class Actions extends Component { - static propTypes = { - onAddressBook: PropTypes.func.isRequired, - onNewAccount: PropTypes.func.isRequired - } - - render () { - return ( - - - } - label='new account' - primary - onTouchTap={ this.props.onNewAccount } /> - } - label='address book' - primary - onTouchTap={ this.props.onAddressBook } /> - - - - ); - } -} diff --git a/js/src/views/Accounts/Actions/index.js b/js/src/views/Accounts/Actions/index.js deleted file mode 100644 index 8d77c6173ec..00000000000 --- a/js/src/views/Accounts/Actions/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './actions'; diff --git a/js/src/views/Accounts/accounts.js b/js/src/views/Accounts/accounts.js index 6fb1642d3c3..96f84eaeca5 100644 --- a/js/src/views/Accounts/accounts.js +++ b/js/src/views/Accounts/accounts.js @@ -1,9 +1,11 @@ import React, { Component, PropTypes } from 'react'; +import { FlatButton } from 'material-ui'; +import CommunicationContacts from 'material-ui/svg-icons/communication/contacts'; +import ContentAdd from 'material-ui/svg-icons/content/add'; -import Actions from './Actions'; import Summary from './Summary'; import { AddressBook, CreateAccount } from '../../modals'; -import { Tooltip } from '../../ui'; +import { Actionbar, Tooltip } from '../../ui'; import styles from './style.css'; @@ -23,9 +25,7 @@ export default class Accounts extends Component {
{ this.renderAddressBook() } { this.renderNewDialog() } - + { this.renderActionbar() }
{ this.renderAccounts() }
@@ -33,6 +33,33 @@ export default class Accounts extends Component { ); } + renderActionbar () { + const buttons = [ + } + label='new account' + primary + onTouchTap={ this.onNewAccountClick } />, + } + label='address book' + primary + onTouchTap={ this.onAddressBookClick } /> + ]; + + return ( + + + + ); + } + renderAccounts () { const { accounts } = this.context; diff --git a/js/src/views/Accounts/style.css b/js/src/views/Accounts/style.css index c02f7000758..9c1a3a1496c 100644 --- a/js/src/views/Accounts/style.css +++ b/js/src/views/Accounts/style.css @@ -20,3 +20,16 @@ .toolbar { position: relative; } + +.tooltitle { + text-transform: uppercase; +} + +.toolbutton { + color: white !important; + background: rgb(0, 151, 167); +} + +.toolbutton svg { + fill: white !important; +} From 11ab6acdccd4494e649984c90a75f696bdf1522f Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 1 Sep 2016 21:23:20 +0200 Subject: [PATCH 0293/1062] signer starts up, but nothing there at this point in time --- js/src/index.js | 53 +++++++------------ .../views/Signer/components/Header/Header.css | 11 ---- .../views/Signer/components/Header/Header.js | 26 --------- .../views/Signer/components/Header/index.js | 1 - js/src/views/Signer/containers/Root/Root.css | 1 - js/src/views/Signer/containers/Root/Root.js | 45 +++++++++++++--- js/src/views/Signer/middlewares/app.js | 9 ++-- .../{appProvider.js => signerProvider.js} | 2 +- js/src/views/Signer/reducers/index.js | 10 +++- .../Signer/reducers/{app.js => signer.js} | 0 js/src/views/Signer/routes/index.js | 1 - js/src/views/Signer/routes/routes.js | 49 ----------------- 12 files changed, 69 insertions(+), 139 deletions(-) delete mode 100644 js/src/views/Signer/components/Header/Header.css delete mode 100644 js/src/views/Signer/components/Header/Header.js delete mode 100644 js/src/views/Signer/components/Header/index.js rename js/src/views/Signer/providers/{appProvider.js => signerProvider.js} (93%) rename js/src/views/Signer/reducers/{app.js => signer.js} (100%) delete mode 100644 js/src/views/Signer/routes/index.js delete mode 100644 js/src/views/Signer/routes/routes.js diff --git a/js/src/index.js b/js/src/index.js index 9fee1c221dc..fa278bf8fd3 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -12,11 +12,12 @@ import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; import { muiTheme } from './ui'; import { Accounts, Account, Application, Contract, Contracts, Dapp, Dapps } from './views'; -import SignerRoutes from './views/Signer/Routes'; +import Signer from './views/Signer/containers/Root'; import { errorReducer } from './ui/Errors'; import { tooltipReducer } from './ui/Tooltips'; import { statusReducer } from './views/Application/Status'; +import { signer as signerReducer, toastr as signerToastrReducer, requests as signerRequestsReducer } from './views/Signer/reducers'; import styles from './reset.css'; import './index.html'; @@ -24,45 +25,27 @@ import './index.html'; const reducers = combineReducers({ errors: errorReducer, status: statusReducer, - tooltip: tooltipReducer + tooltip: tooltipReducer, + signer: signerReducer, + toastr: signerToastrReducer, + requests: signerRequestsReducer }); const store = createStore(reducers, {}); const routerHistory = useRouterHistory(createHashHistory)({}); ReactDOM.render( - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/js/src/views/Signer/components/Header/Header.css b/js/src/views/Signer/components/Header/Header.css deleted file mode 100644 index 400f5f442c2..00000000000 --- a/js/src/views/Signer/components/Header/Header.css +++ /dev/null @@ -1,11 +0,0 @@ -.bar { - padding: 0 !important; -} -.bar h1 { - box-sizing: border-box; - max-width: 800px !important; - width: 100% !important; - margin: 0 auto !important; - flex: none !important; - padding: 0 25px !important; -} diff --git a/js/src/views/Signer/components/Header/Header.js b/js/src/views/Signer/components/Header/Header.js deleted file mode 100644 index 6ba05b462e9..00000000000 --- a/js/src/views/Signer/components/Header/Header.js +++ /dev/null @@ -1,26 +0,0 @@ -import React, { Component } from 'react'; - -import AppBar from 'material-ui/AppBar'; -import { isExtension } from '../../utils/extension'; - -import styles from './Header.css'; - -export default class Header extends Component { - - title = 'Parity Trusted Signer'; - styles = { - backgroundColor: isExtension() ? '#6691C2' : '#FF5722' - }; - - render () { - return ( - - ); - } - -} diff --git a/js/src/views/Signer/components/Header/index.js b/js/src/views/Signer/components/Header/index.js deleted file mode 100644 index 2509393d237..00000000000 --- a/js/src/views/Signer/components/Header/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './Header'; diff --git a/js/src/views/Signer/containers/Root/Root.css b/js/src/views/Signer/containers/Root/Root.css index c3e91e46526..f487fe21016 100644 --- a/js/src/views/Signer/containers/Root/Root.css +++ b/js/src/views/Signer/containers/Root/Root.css @@ -1,5 +1,4 @@ .container { - background: #fff; } .mainContainer { diff --git a/js/src/views/Signer/containers/Root/Root.js b/js/src/views/Signer/containers/Root/Root.js index d98e44adbf9..d7918056e1d 100644 --- a/js/src/views/Signer/containers/Root/Root.js +++ b/js/src/views/Signer/containers/Root/Root.js @@ -2,32 +2,42 @@ import React, { Component, PropTypes } from 'react'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; +import { Actionbar } from '../../../../ui'; + import ToastrContainer from '../../components/ToastrContainer'; import { removeToast } from '../../actions/toastr'; -import Header from '../../components/Header'; + +import LoadingPage from '../LoadingPage'; +import OfflinePage from '../OfflinePage'; +import RequestsPage from '../RequestsPage'; +import UnAuthorizedPage from '../UnAuthorizedPage'; import styles from './Root.css'; -// todo [adgo] - add animation wrap children export class Root extends Component { - static propTypes = { - children: PropTypes.node.isRequired, toastr: PropTypes.shape({ toasts: PropTypes.array.isRequired }).isRequired, actions: PropTypes.shape({ removeToast: PropTypes.func.isRequired + }).isRequired, + signer: PropTypes.shape({ + isLoading: PropTypes.bool.isRequired, + isConnected: PropTypes.bool.isRequired, + isNodeRunning: PropTypes.bool.isRequired }).isRequired }; render () { - const { children, toastr, actions } = this.props; + const { toastr, actions } = this.props; + return (
-
+
- { children } + { this.renderPage() }
+ ); + } else if (!isNodeRunning) { + return ( + + ); + } else if (!isConnected) { + return ( + + ); + } + + return ( + + ); + } } function mapStateToProps (state) { diff --git a/js/src/views/Signer/middlewares/app.js b/js/src/views/Signer/middlewares/app.js index 7dbe4925f57..ee106fe8863 100644 --- a/js/src/views/Signer/middlewares/app.js +++ b/js/src/views/Signer/middlewares/app.js @@ -1,7 +1,6 @@ import { hashHistory } from 'react-router'; export default class AppMiddleware { - toMiddleware () { return store => next => action => { next(action); @@ -14,14 +13,14 @@ export default class AppMiddleware { } redirect (store) { - const { isLoading, isNodeRunning } = store.getState().app; + const { isLoading, isNodeRunning } = store.getState().signer; if (isLoading) { - hashHistory.push('/loading'); + hashHistory.push('/signer/loading'); } else if (!isNodeRunning) { - hashHistory.push('/offline'); + hashHistory.push('/signer/offline'); } else { - hashHistory.push('/'); + hashHistory.push('/signer'); } } diff --git a/js/src/views/Signer/providers/appProvider.js b/js/src/views/Signer/providers/signerProvider.js similarity index 93% rename from js/src/views/Signer/providers/appProvider.js rename to js/src/views/Signer/providers/signerProvider.js index ee43e9c8369..4a2f759ae9a 100644 --- a/js/src/views/Signer/providers/appProvider.js +++ b/js/src/views/Signer/providers/signerProvider.js @@ -17,7 +17,7 @@ export default class appProvider { checkIfIsRunning () { const url = this.store.getState().app.url; - const { isNodeRunning, isLoading } = this.store.getState().app; + const { isNodeRunning, isLoading } = this.store.getState().signer; isParityRunning(url).then(isRunning => { if (isRunning !== isNodeRunning || isLoading) { diff --git a/js/src/views/Signer/reducers/index.js b/js/src/views/Signer/reducers/index.js index 1121e4892c2..2c9506ba794 100644 --- a/js/src/views/Signer/reducers/index.js +++ b/js/src/views/Signer/reducers/index.js @@ -1,12 +1,18 @@ import { combineReducers } from 'redux'; import { routerReducer as routing } from 'react-router-redux'; -import app from './app'; +import signer from './signer'; import toastr from './toastr'; import requests from './requests'; export default combineReducers({ routing, - app, + signer, toastr, requests }); + +export { + signer, + toastr, + requests +}; diff --git a/js/src/views/Signer/reducers/app.js b/js/src/views/Signer/reducers/signer.js similarity index 100% rename from js/src/views/Signer/reducers/app.js rename to js/src/views/Signer/reducers/signer.js diff --git a/js/src/views/Signer/routes/index.js b/js/src/views/Signer/routes/index.js deleted file mode 100644 index 761c736c45a..00000000000 --- a/js/src/views/Signer/routes/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './routes'; diff --git a/js/src/views/Signer/routes/routes.js b/js/src/views/Signer/routes/routes.js deleted file mode 100644 index 40882e12bfb..00000000000 --- a/js/src/views/Signer/routes/routes.js +++ /dev/null @@ -1,49 +0,0 @@ -import React, { Component, PropTypes } from 'react'; -import { Route, IndexRedirect } from 'react-router'; - -import RootContainer from '../containers/Root'; -import LoadingPage from '../containers/LoadingPage'; -import RequestsPage from '../containers/RequestsPage'; -import UnAuthorizedPage from '../containers/UnAuthorizedPage'; -import OfflinePage from '../containers/OfflinePage'; - -export default class Routes extends Component { - static contextTypes = { - store: PropTypes.object - } - - static propTypes = { - path: PropTypes.string - }; - - render () { - const { path } = this.props; - console.log('path', path); - - return ( - - - - - - - - - - ); - } - - requireAuth = (nextState, replace) => { - const { store } = this.context; - const appState = store.getState().app; - const { isLoading, isConnected, isNodeRunning } = appState; - - if (isLoading) { - replace('loading'); - } else if (!isNodeRunning) { - replace('offline'); - } else if (!isConnected) { - replace('unAuthorized'); - } - }; -} From 1e3bf22b07b464443f78af605f26e2857f4abd24 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 1 Sep 2016 22:41:18 +0200 Subject: [PATCH 0294/1062] ok, signer starts up... enough for now, tomorrow is a new day --- js/package.json | 6 +- js/src/index.js | 60 ++++++++++++++----- .../components/UnAuthorized/UnAuthorized.css | 3 +- .../components/UnAuthorized/UnAuthorized.js | 8 +-- .../containers/LoadingPage/LoadingPage.js | 4 +- .../containers/OfflinePage/OfflinePage.js | 2 +- .../MuiThemeProvider/MuiThemeProvider.js | 30 ---------- .../dappscomponents/MuiThemeProvider/index.js | 1 - js/src/views/Signer/dappscomponents/index.js | 1 - js/src/views/Signer/middlewares/app.js | 27 --------- js/src/views/Signer/middlewares/index.js | 6 +- js/src/views/Signer/middlewares/logger.js | 4 +- js/src/views/Signer/middlewares/signer.js | 15 +++++ js/src/views/Signer/providers/index.js | 2 + ...ignerProvider.js => signerDataProvider.js} | 6 +- .../{wsProvider.js => wsDataProvider.js} | 3 +- ...eb3WebSockets.js => WebSocketsProvider.js} | 0 js/src/views/Signer/utils/index.js | 2 + js/webpack.config.js | 6 +- 19 files changed, 87 insertions(+), 99 deletions(-) delete mode 100644 js/src/views/Signer/dappscomponents/MuiThemeProvider/MuiThemeProvider.js delete mode 100644 js/src/views/Signer/dappscomponents/MuiThemeProvider/index.js delete mode 100644 js/src/views/Signer/middlewares/app.js create mode 100644 js/src/views/Signer/middlewares/signer.js create mode 100644 js/src/views/Signer/providers/index.js rename js/src/views/Signer/providers/{signerProvider.js => signerDataProvider.js} (85%) rename js/src/views/Signer/providers/{wsProvider.js => wsDataProvider.js} (98%) rename js/src/views/Signer/utils/{Web3WebSockets.js => WebSocketsProvider.js} (100%) create mode 100644 js/src/views/Signer/utils/index.js diff --git a/js/package.json b/js/package.json index 4f483840211..c4844182b54 100644 --- a/js/package.json +++ b/js/package.json @@ -30,7 +30,7 @@ "coveralls": "npm run testCoverage && coveralls < coverage/lcov.info", "lint": "eslint --ignore-path .gitignore ./src/", "release": "./scripts/release.sh", - "start": "npm run startApp", + "start": "npm install && npm run startApp", "startApp": "webpack-dev-server -d --history-api-fallback --open --hot --inline --progress --colors --port 3000", "test": "mocha 'src/**/*.spec.js'", "testCoverage": "istanbul cover _mocha -- 'src/**/*.spec.js'", @@ -38,6 +38,7 @@ "watch": "npm run test -- -w" }, "devDependencies": { + "axios": "^0.14.0", "babel-cli": "^6.10.1", "babel-core": "^6.10.4", "babel-eslint": "^6.1.2", @@ -86,8 +87,7 @@ "rollup-plugin-node-resolve": "^2.0.0", "rollup-plugin-replace": "^1.1.1", "rollup-plugin-uglify": "^1.0.1", - "rucksack-css": "^0.8.5", - "sass-loader": "^4.0.0", + "rucksack-css": "^0.8.6", "sinon": "^1.17.4", "sinon-chai": "^2.8.0", "style-loader": "^0.13.0", diff --git a/js/src/index.js b/js/src/index.js index fa278bf8fd3..2e762b9bc1d 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -6,22 +6,41 @@ injectTapEventPlugin(); import { createHashHistory } from 'history'; import { Provider } from 'react-redux'; -import { combineReducers, createStore } from 'redux'; +import { applyMiddleware, combineReducers, createStore } from 'redux'; import { Redirect, Router, Route, useRouterHistory } from 'react-router'; import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; import { muiTheme } from './ui'; import { Accounts, Account, Application, Contract, Contracts, Dapp, Dapps } from './views'; -import Signer from './views/Signer/containers/Root'; import { errorReducer } from './ui/Errors'; import { tooltipReducer } from './ui/Tooltips'; import { statusReducer } from './views/Application/Status'; + +// TODO: This is VERY messy, just dumped here to get the Signer going +import Signer from './views/Signer/containers/Root'; +import signerMiddlewares from './views/Signer/middlewares'; import { signer as signerReducer, toastr as signerToastrReducer, requests as signerRequestsReducer } from './views/Signer/reducers'; +import Web3 from 'web3'; +import { Web3Provider, web3Extension } from './views/Signer/dappscomponents'; +import { WebSocketsProvider, Ws } from './views/Signer/utils'; +import { SignerDataProvider, WsDataProvider } from './views/Signer/providers'; import styles from './reset.css'; import './index.html'; +const initToken = window.localStorage.getItem('sysuiToken'); +const parityUrl = process.env.NODE_ENV === 'production' ? window.location.host : '127.0.0.1:8180'; + +const ws = new Ws(parityUrl); +const web3 = new Web3(new WebSocketsProvider(ws)); + +web3Extension(web3).map((extension) => web3._extend(extension)); + +function tokenSetter (token, cb) { + window.localStorage.setItem('sysuiToken', token); +} + const reducers = combineReducers({ errors: errorReducer, status: statusReducer, @@ -30,25 +49,36 @@ const reducers = combineReducers({ toastr: signerToastrReducer, requests: signerRequestsReducer }); -const store = createStore(reducers, {}); +const store = applyMiddleware(...signerMiddlewares(ws, tokenSetter))( + window.devToolsExtension + ? window.devToolsExtension()(createStore) + : createStore +)(reducers); const routerHistory = useRouterHistory(createHashHistory)({}); ReactDOM.render( - - - - - - - - - - - - + + + + + + + + + + + + + + , document.querySelector('#container') ); + +new WsDataProvider(store, ws); // eslint-disable-line no-new +new SignerDataProvider(store, ws); // eslint-disable-line no-new + +ws.init(initToken); diff --git a/js/src/views/Signer/components/UnAuthorized/UnAuthorized.css b/js/src/views/Signer/components/UnAuthorized/UnAuthorized.css index ec0e0477b21..cf9155547ec 100644 --- a/js/src/views/Signer/components/UnAuthorized/UnAuthorized.css +++ b/js/src/views/Signer/components/UnAuthorized/UnAuthorized.css @@ -12,8 +12,7 @@ } .code { - background: #e4e4e4; + background: rgba(80, 80, 80, 1); padding: 4px; border-radius: 3px; - border: 1px solid #ccc; } diff --git a/js/src/views/Signer/components/UnAuthorized/UnAuthorized.js b/js/src/views/Signer/components/UnAuthorized/UnAuthorized.js index 46c8e3f8ca0..8cb52babc9f 100644 --- a/js/src/views/Signer/components/UnAuthorized/UnAuthorized.js +++ b/js/src/views/Signer/components/UnAuthorized/UnAuthorized.js @@ -8,7 +8,7 @@ import styles from './UnAuthorized.css'; export default class UnAuthorized extends Component { static propTypes = { - app: PropTypes.shape({ + signer: PropTypes.shape({ token: PropTypes.string.isRequired }).isRequired, actions: PropTypes.shape({ @@ -17,17 +17,17 @@ export default class UnAuthorized extends Component { } state = { - token: this.props.app.token, + token: this.props.signer.token, tokenInvalid: null, processing: false }; componentWillReceiveProps (nextProps) { - if (this.props.app.token === nextProps.app.token) { + if (this.props.signer.token === nextProps.signer.token) { return; } this.setState({ - token: nextProps.app.token + token: nextProps.signer.token }); } diff --git a/js/src/views/Signer/containers/LoadingPage/LoadingPage.js b/js/src/views/Signer/containers/LoadingPage/LoadingPage.js index 33668ee4b0a..98334e82b8d 100644 --- a/js/src/views/Signer/containers/LoadingPage/LoadingPage.js +++ b/js/src/views/Signer/containers/LoadingPage/LoadingPage.js @@ -1,12 +1,12 @@ import React, { Component } from 'react'; + import styles from './LoadingPage.css'; export default class LoadingPage extends Component { - render () { return (
-

Connecting...

+

Connecting to Parity...

); } diff --git a/js/src/views/Signer/containers/OfflinePage/OfflinePage.js b/js/src/views/Signer/containers/OfflinePage/OfflinePage.js index 1b0d13b7f2d..8db1e1c0ad8 100644 --- a/js/src/views/Signer/containers/OfflinePage/OfflinePage.js +++ b/js/src/views/Signer/containers/OfflinePage/OfflinePage.js @@ -16,7 +16,7 @@ class OfflinePage extends Component { function mapStateToProps (state) { return { - parityUrl: state.app.url + parityUrl: state.signer.url }; } diff --git a/js/src/views/Signer/dappscomponents/MuiThemeProvider/MuiThemeProvider.js b/js/src/views/Signer/dappscomponents/MuiThemeProvider/MuiThemeProvider.js deleted file mode 100644 index b4e6ebde3ab..00000000000 --- a/js/src/views/Signer/dappscomponents/MuiThemeProvider/MuiThemeProvider.js +++ /dev/null @@ -1,30 +0,0 @@ - -import React, { Component, PropTypes } from 'react'; - -import { deepOrange500 } from 'material-ui/styles/colors'; -import getMuiTheme from 'material-ui/styles/getMuiTheme'; -import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; - -const muiTheme = getMuiTheme({ - fontFamily: '"Source Sans Pro", "Helvetica Neue", arial, sans-serif', - palette: { - primary1Color: '#6691C2', - accent1Color: deepOrange500 - } -}); - -export default class WrappedMuiThemeProvider extends Component { - - render () { - return ( - - { this.props.children } - - ); - } - - static propTypes = { - children: PropTypes.object.isRequired - } - -} diff --git a/js/src/views/Signer/dappscomponents/MuiThemeProvider/index.js b/js/src/views/Signer/dappscomponents/MuiThemeProvider/index.js deleted file mode 100644 index 84638ececa8..00000000000 --- a/js/src/views/Signer/dappscomponents/MuiThemeProvider/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './MuiThemeProvider'; diff --git a/js/src/views/Signer/dappscomponents/index.js b/js/src/views/Signer/dappscomponents/index.js index cdc00bfcdbc..5c27c31a2a0 100644 --- a/js/src/views/Signer/dappscomponents/index.js +++ b/js/src/views/Signer/dappscomponents/index.js @@ -2,7 +2,6 @@ export Account from './Account'; export AccountLink from './AccountLink'; export AnimateChildren from './AnimateChildren'; export Identicon from './Identicon'; -export MuiThemeProvider from './MuiThemeProvider'; // export RpcAutoComplete from './RpcAutoComplete'; // TODO: needs json-rpc export Toastr from './Toastr'; diff --git a/js/src/views/Signer/middlewares/app.js b/js/src/views/Signer/middlewares/app.js deleted file mode 100644 index ee106fe8863..00000000000 --- a/js/src/views/Signer/middlewares/app.js +++ /dev/null @@ -1,27 +0,0 @@ -import { hashHistory } from 'react-router'; - -export default class AppMiddleware { - toMiddleware () { - return store => next => action => { - next(action); - - // redirect to proper url - if (action.type === 'update isConnected' || action.type === 'update isNodeRunning') { - this.redirect(store); - } - }; - } - - redirect (store) { - const { isLoading, isNodeRunning } = store.getState().signer; - - if (isLoading) { - hashHistory.push('/signer/loading'); - } else if (!isNodeRunning) { - hashHistory.push('/signer/offline'); - } else { - hashHistory.push('/signer'); - } - } - -} diff --git a/js/src/views/Signer/middlewares/index.js b/js/src/views/Signer/middlewares/index.js index 0178e9f3227..fb4ea080bc6 100644 --- a/js/src/views/Signer/middlewares/index.js +++ b/js/src/views/Signer/middlewares/index.js @@ -1,19 +1,19 @@ // Middleware classes (except logger) import Ws from './ws'; -import App from './app'; +import Signer from './signer'; import Toastr from './toastr'; import logger from './logger'; export default function middlewares (ws, setToken) { // Middleware instances const wsMiddleware = new Ws(ws, setToken); - const app = new App(); + const signer = new Signer(); const toastr = new Toastr(); return [ logger, wsMiddleware.toMiddleware(), toastr.toMiddleware(), - app.toMiddleware() + signer.toMiddleware() ]; } diff --git a/js/src/views/Signer/middlewares/logger.js b/js/src/views/Signer/middlewares/logger.js index 6a165b181dd..fa61f9fb051 100644 --- a/js/src/views/Signer/middlewares/logger.js +++ b/js/src/views/Signer/middlewares/logger.js @@ -1,7 +1,9 @@ import logger from '../utils/logger'; export default store => next => action => { - if (store.getState().app.logging) { + console.log(store.getState()); + + if (store.getState().signer.logging) { const msg = [`[${now()}] action:`, `${action.type};`, 'payload: ', action.payload]; // const logMethod = action.type.indexOf('error') > -1 ? 'error' : 'log'; logger.log(...msg); // todo [adgo] - implement error logs diff --git a/js/src/views/Signer/middlewares/signer.js b/js/src/views/Signer/middlewares/signer.js new file mode 100644 index 00000000000..6e2af229a66 --- /dev/null +++ b/js/src/views/Signer/middlewares/signer.js @@ -0,0 +1,15 @@ +export default class SignerMiddleware { + toMiddleware () { + return store => next => action => { + next(action); + + // redirect to proper url + if (action.type === 'update isConnected' || action.type === 'update isNodeRunning') { + this.redirect(store); + } + }; + } + + redirect (store) { + } +} diff --git a/js/src/views/Signer/providers/index.js b/js/src/views/Signer/providers/index.js new file mode 100644 index 00000000000..d3452eb3543 --- /dev/null +++ b/js/src/views/Signer/providers/index.js @@ -0,0 +1,2 @@ +export SignerDataProvider from './signerDataProvider'; +export WsDataProvider from './wsDataProvider'; diff --git a/js/src/views/Signer/providers/signerProvider.js b/js/src/views/Signer/providers/signerDataProvider.js similarity index 85% rename from js/src/views/Signer/providers/signerProvider.js rename to js/src/views/Signer/providers/signerDataProvider.js index 4a2f759ae9a..3debd9cedd2 100644 --- a/js/src/views/Signer/providers/signerProvider.js +++ b/js/src/views/Signer/providers/signerDataProvider.js @@ -3,8 +3,7 @@ import { updateIsConnected, updateIsNodeRunning } from '../actions/app'; import { isParityRunning } from '../utils/parity'; -export default class appProvider { - +export default class SignerDataProvider { constructor (store, ws) { this.store = store; this.ws = ws; @@ -16,8 +15,7 @@ export default class appProvider { } checkIfIsRunning () { - const url = this.store.getState().app.url; - const { isNodeRunning, isLoading } = this.store.getState().signer; + const { isNodeRunning, isLoading, url } = this.store.getState().signer; isParityRunning(url).then(isRunning => { if (isRunning !== isNodeRunning || isLoading) { diff --git a/js/src/views/Signer/providers/wsProvider.js b/js/src/views/Signer/providers/wsDataProvider.js similarity index 98% rename from js/src/views/Signer/providers/wsProvider.js rename to js/src/views/Signer/providers/wsDataProvider.js index 44f684b7c74..e4ba2756957 100644 --- a/js/src/views/Signer/providers/wsProvider.js +++ b/js/src/views/Signer/providers/wsDataProvider.js @@ -2,8 +2,7 @@ import { isEqual } from 'lodash'; import logger from '../utils/logger'; import { updatePendingRequests, updateCompatibilityMode } from '../actions/requests'; -export default class WsProvider { - +export default class WsDataProvider { constructor (store, ws) { this.store = store; this.ws = ws; diff --git a/js/src/views/Signer/utils/Web3WebSockets.js b/js/src/views/Signer/utils/WebSocketsProvider.js similarity index 100% rename from js/src/views/Signer/utils/Web3WebSockets.js rename to js/src/views/Signer/utils/WebSocketsProvider.js diff --git a/js/src/views/Signer/utils/index.js b/js/src/views/Signer/utils/index.js new file mode 100644 index 00000000000..12a3fb7ccfa --- /dev/null +++ b/js/src/views/Signer/utils/index.js @@ -0,0 +1,2 @@ +export WebSocketsProvider from './WebSocketsProvider'; +export Ws from './Ws'; diff --git a/js/webpack.config.js b/js/webpack.config.js index 0881f966191..9ced0e24bf0 100644 --- a/js/webpack.config.js +++ b/js/webpack.config.js @@ -139,11 +139,11 @@ module.exports = { target: 'http://localhost:8080', changeOrigin: true }, - '/api*': { - target: 'http://localhost:8080', + '/api/ping': { + forward: 'http://127.0.0.1:8180/index.html', changeOrigin: true }, - '/wallet/*': { + '/api*': { target: 'http://localhost:8080', changeOrigin: true } From 22e5025de073205251772dd034cef8f35fe9d823 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 1 Sep 2016 23:06:49 +0200 Subject: [PATCH 0295/1062] adjust top tabbar styling (first stab) --- js/src/ui/Theme/theme.js | 9 +++++++-- js/src/views/Dapps/dapps.js | 4 ++++ js/src/views/Signer/middlewares/logger.js | 2 -- js/src/views/Signer/reducers/signer.js | 2 +- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/js/src/ui/Theme/theme.js b/js/src/ui/Theme/theme.js index 83cec531655..dab3790faae 100644 --- a/js/src/ui/Theme/theme.js +++ b/js/src/ui/Theme/theme.js @@ -7,13 +7,18 @@ const muiTheme = getMuiTheme(darkBaseTheme); muiTheme.stepper.textColor = '#eee'; muiTheme.stepper.disabledTextColor = '#777'; -muiTheme.inkBar.backgroundColor = 'rgb(0, 151, 167)'; +muiTheme.inkBar.backgroundColor = 'rgba(255, 136, 0, 0.8)'; // 'rgba(255, 136, 0, 0.8)'; // 'rgb(0, 151, 167)'; muiTheme.snackbar.backgroundColor = 'rgba(255, 30, 30, 0.9)'; muiTheme.snackbar.textColor = 'rgba(255, 255, 255, 0.9)'; muiTheme.tabs = lightTheme.tabs; muiTheme.tabs.backgroundColor = 'rgb(65, 65, 65)'; +muiTheme.tabs.selectedTextColor = 'rgba(255, 136, 0, 0.8)'; // 'rgb(0, 151, 167)'; // 'rgba(255, 136, 0, 0.8)'; +muiTheme.tabs.textColor = 'rgba(255, 255, 255, 1)'; // 'rgba(0, 151, 167, 1)'; muiTheme.textField.disabledTextColor = muiTheme.textField.textColor; muiTheme.toolbar = lightTheme.toolbar; -muiTheme.toolbar.backgroundColor = 'rgba(255, 136, 0, 0.6)'; // 'rgb(80, 80, 80)'; +muiTheme.toolbar.backgroundColor = 'rgba(255, 136, 0, 0.5)'; // 'rgb(80, 80, 80)'; + +console.log('inkBar', muiTheme.inkBar); +console.log('tabs', muiTheme.tabs); export default muiTheme; diff --git a/js/src/views/Dapps/dapps.js b/js/src/views/Dapps/dapps.js index 50c40cf7589..72526f557ab 100644 --- a/js/src/views/Dapps/dapps.js +++ b/js/src/views/Dapps/dapps.js @@ -1,5 +1,7 @@ import React, { Component, PropTypes } from 'react'; +import { Actionbar } from '../../ui'; + import Summary from './Summary'; import styles from './style.css'; @@ -35,6 +37,8 @@ export default class Dapps extends Component { render () { return (
+
{ this.renderApps() }
diff --git a/js/src/views/Signer/middlewares/logger.js b/js/src/views/Signer/middlewares/logger.js index fa61f9fb051..78268cd9bff 100644 --- a/js/src/views/Signer/middlewares/logger.js +++ b/js/src/views/Signer/middlewares/logger.js @@ -1,8 +1,6 @@ import logger from '../utils/logger'; export default store => next => action => { - console.log(store.getState()); - if (store.getState().signer.logging) { const msg = [`[${now()}] action:`, `${action.type};`, 'payload: ', action.payload]; // const logMethod = action.type.indexOf('error') > -1 ? 'error' : 'log'; diff --git a/js/src/views/Signer/reducers/signer.js b/js/src/views/Signer/reducers/signer.js index 26711d0a5ec..7089b7a757a 100644 --- a/js/src/views/Signer/reducers/signer.js +++ b/js/src/views/Signer/reducers/signer.js @@ -7,7 +7,7 @@ const initialState = { isLoading: true, isNodeRunning: true, isConnected: false, - logging: !isProd, + logging: false && !isProd, token: '', url: window.location.host, proxyUrl: 'http://localhost:8080/proxy/proxy.pac' From 4795af5ef63f529a99e0a6e0985f317270f9e720 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 1 Sep 2016 23:26:12 +0200 Subject: [PATCH 0296/1062] app -> signer for actions --- js/src/views/Signer/actions/{app.js => signer.js} | 0 js/src/views/Signer/containers/OfflinePage/OfflinePage.js | 2 +- .../Signer/containers/UnAuthorizedPage/UnAuthorizedPage.js | 2 +- js/src/views/Signer/providers/signerDataProvider.js | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename js/src/views/Signer/actions/{app.js => signer.js} (100%) diff --git a/js/src/views/Signer/actions/app.js b/js/src/views/Signer/actions/signer.js similarity index 100% rename from js/src/views/Signer/actions/app.js rename to js/src/views/Signer/actions/signer.js diff --git a/js/src/views/Signer/containers/OfflinePage/OfflinePage.js b/js/src/views/Signer/containers/OfflinePage/OfflinePage.js index 8db1e1c0ad8..c9e532a843c 100644 --- a/js/src/views/Signer/containers/OfflinePage/OfflinePage.js +++ b/js/src/views/Signer/containers/OfflinePage/OfflinePage.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; -import { updateAppState } from '../../actions/app'; +import { updateAppState } from '../../actions/signer'; import Offline from '../../components/Offline'; diff --git a/js/src/views/Signer/containers/UnAuthorizedPage/UnAuthorizedPage.js b/js/src/views/Signer/containers/UnAuthorizedPage/UnAuthorizedPage.js index 77ed12a41b7..d90f4f4f618 100644 --- a/js/src/views/Signer/containers/UnAuthorizedPage/UnAuthorizedPage.js +++ b/js/src/views/Signer/containers/UnAuthorizedPage/UnAuthorizedPage.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; -import { updateToken } from '../../actions/app'; +import { updateToken } from '../../actions/signer'; import UnAuthorized from '../../components/UnAuthorized'; diff --git a/js/src/views/Signer/providers/signerDataProvider.js b/js/src/views/Signer/providers/signerDataProvider.js index 3debd9cedd2..0ba33a0f2ec 100644 --- a/js/src/views/Signer/providers/signerDataProvider.js +++ b/js/src/views/Signer/providers/signerDataProvider.js @@ -1,5 +1,5 @@ import logger from '../utils/logger'; -import { updateIsConnected, updateIsNodeRunning } from '../actions/app'; +import { updateIsConnected, updateIsNodeRunning } from '../actions/signer'; import { isParityRunning } from '../utils/parity'; From 6a8397b72270ac5507a614596f80b579d8246b6e Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 1 Sep 2016 23:49:53 +0200 Subject: [PATCH 0297/1062] update readme for dev-mode parity --- js/README.md | 3 ++- js/webpack.config.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/js/README.md b/js/README.md index b3642412717..3aedb613568 100644 --- a/js/README.md +++ b/js/README.md @@ -7,4 +7,5 @@ JS interfaces APIs and UIs for Parity. 0. Install [Node](https://nodejs.org/) if not already available 0. Install the npm modules inside `parit/js` via `npm install` 0. Start the development environment via `npm start` -0. Connect to the [UI](http://localhost:3000) (ensure that parity is running) +0. Connect to the [UI](http://localhost:3000) (ensure that parity is running) +0. When using the signer in this development mode, Parity should be run with `cargo run --release --features dev` or built with `cargo build --release --features dev` diff --git a/js/webpack.config.js b/js/webpack.config.js index 9ced0e24bf0..328fbde7fe1 100644 --- a/js/webpack.config.js +++ b/js/webpack.config.js @@ -144,7 +144,7 @@ module.exports = { changeOrigin: true }, '/api*': { - target: 'http://localhost:8080', + target: 'http://localhost:8180', changeOrigin: true } } From 72212442c6d014bf8bd78af20b06e315561700af Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 2 Sep 2016 08:13:33 +0200 Subject: [PATCH 0298/1062] fix loading of images (webpack import & build) --- js/src/views/Application/TabBar/tabBar.js | 3 ++- js/src/views/Application/application.js | 24 +++++++++++++++-------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index 80993a54e72..1b72b19ff66 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -10,6 +10,7 @@ import NavigationApps from 'material-ui/svg-icons/navigation/apps'; import { Tooltip } from '../../../ui'; import styles from '../style.css'; +import imagesParitybar from '../../../images/paritybar.png'; export default class TabBar extends Component { static contextTypes = { @@ -27,7 +28,7 @@ export default class TabBar extends Component { + src={ imagesParitybar } /> Date: Fri, 2 Sep 2016 09:42:24 +0200 Subject: [PATCH 0299/1062] --signer-no-validation --- js/README.md | 6 +++--- js/webpack.config.js | 4 ---- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/js/README.md b/js/README.md index 3aedb613568..1d42820c330 100644 --- a/js/README.md +++ b/js/README.md @@ -5,7 +5,7 @@ JS interfaces APIs and UIs for Parity. ## development 0. Install [Node](https://nodejs.org/) if not already available -0. Install the npm modules inside `parit/js` via `npm install` +0. Install the npm modules inside `parity/js` via `npm install` +0. Parity should be run with `parity--signer-no-validation [...options]` 0. Start the development environment via `npm start` -0. Connect to the [UI](http://localhost:3000) (ensure that parity is running) -0. When using the signer in this development mode, Parity should be run with `cargo run --release --features dev` or built with `cargo build --release --features dev` +0. Connect to the [UI](http://localhost:3000) diff --git a/js/webpack.config.js b/js/webpack.config.js index 328fbde7fe1..1f2528b53c3 100644 --- a/js/webpack.config.js +++ b/js/webpack.config.js @@ -142,10 +142,6 @@ module.exports = { '/api/ping': { forward: 'http://127.0.0.1:8180/index.html', changeOrigin: true - }, - '/api*': { - target: 'http://localhost:8180', - changeOrigin: true } } } From db8f5f0a5432f5361de28fb543f99f29cfa07a49 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 2 Sep 2016 09:42:34 +0200 Subject: [PATCH 0300/1062] remove extra debug info --- js/src/ui/Theme/theme.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/js/src/ui/Theme/theme.js b/js/src/ui/Theme/theme.js index dab3790faae..18bdc5cee51 100644 --- a/js/src/ui/Theme/theme.js +++ b/js/src/ui/Theme/theme.js @@ -18,7 +18,4 @@ muiTheme.textField.disabledTextColor = muiTheme.textField.textColor; muiTheme.toolbar = lightTheme.toolbar; muiTheme.toolbar.backgroundColor = 'rgba(255, 136, 0, 0.5)'; // 'rgb(80, 80, 80)'; -console.log('inkBar', muiTheme.inkBar); -console.log('tabs', muiTheme.tabs); - export default muiTheme; From adf94164d17ee510de19469f89ea719b860f3371 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 2 Sep 2016 10:32:34 +0200 Subject: [PATCH 0301/1062] slight rework, consistency --- js/src/index.js | 26 +++++++------- js/src/parity.js | 5 ++- .../views/Application/AppContainer/index.js | 1 - .../views/Application/Container/container.js | 34 +++++++++++++++++++ js/src/views/Application/Container/index.js | 1 + .../dappContainer.js} | 2 +- .../views/Application/DappContainer/index.js | 1 + js/src/views/Application/application.js | 28 ++++++--------- 8 files changed, 62 insertions(+), 36 deletions(-) delete mode 100644 js/src/views/Application/AppContainer/index.js create mode 100644 js/src/views/Application/Container/container.js create mode 100644 js/src/views/Application/Container/index.js rename js/src/views/Application/{AppContainer/appContainer.js => DappContainer/dappContainer.js} (86%) create mode 100644 js/src/views/Application/DappContainer/index.js diff --git a/js/src/index.js b/js/src/index.js index 2e762b9bc1d..838cd409256 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -1,8 +1,8 @@ +import 'isomorphic-fetch'; import ReactDOM from 'react-dom'; import React from 'react'; - import injectTapEventPlugin from 'react-tap-event-plugin'; -injectTapEventPlugin(); +import es6Promise from 'es6-promise'; import { createHashHistory } from 'history'; import { Provider } from 'react-redux'; @@ -20,7 +20,7 @@ import { statusReducer } from './views/Application/Status'; // TODO: This is VERY messy, just dumped here to get the Signer going import Signer from './views/Signer/containers/Root'; import signerMiddlewares from './views/Signer/middlewares'; -import { signer as signerReducer, toastr as signerToastrReducer, requests as signerRequestsReducer } from './views/Signer/reducers'; +import { signer as signerReducer, toastr as toastrReducer, requests as requestsReducer } from './views/Signer/reducers'; import Web3 from 'web3'; import { Web3Provider, web3Extension } from './views/Signer/dappscomponents'; import { WebSocketsProvider, Ws } from './views/Signer/utils'; @@ -29,12 +29,14 @@ import { SignerDataProvider, WsDataProvider } from './views/Signer/providers'; import styles from './reset.css'; import './index.html'; +es6Promise.polyfill(); +injectTapEventPlugin(); + const initToken = window.localStorage.getItem('sysuiToken'); const parityUrl = process.env.NODE_ENV === 'production' ? window.location.host : '127.0.0.1:8180'; - +const routerHistory = useRouterHistory(createHashHistory)({}); const ws = new Ws(parityUrl); const web3 = new Web3(new WebSocketsProvider(ws)); - web3Extension(web3).map((extension) => web3._extend(extension)); function tokenSetter (token, cb) { @@ -46,15 +48,18 @@ const reducers = combineReducers({ status: statusReducer, tooltip: tooltipReducer, signer: signerReducer, - toastr: signerToastrReducer, - requests: signerRequestsReducer + toastr: toastrReducer, + requests: requestsReducer }); const store = applyMiddleware(...signerMiddlewares(ws, tokenSetter))( window.devToolsExtension ? window.devToolsExtension()(createStore) : createStore )(reducers); -const routerHistory = useRouterHistory(createHashHistory)({}); + +new WsDataProvider(store, ws); // eslint-disable-line no-new +new SignerDataProvider(store, ws); // eslint-disable-line no-new +ws.init(initToken); ReactDOM.render( @@ -77,8 +82,3 @@ ReactDOM.render( , document.querySelector('#container') ); - -new WsDataProvider(store, ws); // eslint-disable-line no-new -new SignerDataProvider(store, ws); // eslint-disable-line no-new - -ws.init(initToken); diff --git a/js/src/parity.js b/js/src/parity.js index 3691c3183e4..0b53f31876b 100644 --- a/js/src/parity.js +++ b/js/src/parity.js @@ -1,11 +1,10 @@ import 'isomorphic-fetch'; - import es6Promise from 'es6-promise'; -es6Promise.polyfill(); import Api from './api'; +import { IdentityIcon } from './ui'; -import IdentityIcon from './ui/IdentityIcon'; +es6Promise.polyfill(); window.parity = { Api: Api, diff --git a/js/src/views/Application/AppContainer/index.js b/js/src/views/Application/AppContainer/index.js deleted file mode 100644 index e0fea1d8be6..00000000000 --- a/js/src/views/Application/AppContainer/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './appContainer'; diff --git a/js/src/views/Application/Container/container.js b/js/src/views/Application/Container/container.js new file mode 100644 index 00000000000..fcf4047fc25 --- /dev/null +++ b/js/src/views/Application/Container/container.js @@ -0,0 +1,34 @@ +import React, { Component, PropTypes } from 'react'; + +import { FirstRun } from '../../../modals'; +import { Errors, Tooltips } from '../../../ui'; + +import Status from '../Status'; +import TabBar from '../TabBar'; + +import styles from '../style.css'; + +export default class Container extends Component { + static propTypes = { + children: PropTypes.node, + showFirstRun: PropTypes.bool, + onCloseFirstRun: PropTypes.func + }; + + render () { + const { children, showFirstRun, onCloseFirstRun } = this.props; + + return ( +
+ + + + + { children } + +
+ ); + } +} diff --git a/js/src/views/Application/Container/index.js b/js/src/views/Application/Container/index.js new file mode 100644 index 00000000000..9f6c229eb84 --- /dev/null +++ b/js/src/views/Application/Container/index.js @@ -0,0 +1 @@ +export default from './container'; diff --git a/js/src/views/Application/AppContainer/appContainer.js b/js/src/views/Application/DappContainer/dappContainer.js similarity index 86% rename from js/src/views/Application/AppContainer/appContainer.js rename to js/src/views/Application/DappContainer/dappContainer.js index a455d26e70e..7b4d6fb1cf3 100644 --- a/js/src/views/Application/AppContainer/appContainer.js +++ b/js/src/views/Application/DappContainer/dappContainer.js @@ -4,7 +4,7 @@ import ParityBar from '../../ParityBar'; import styles from '../style.css'; -export default class AppContainer extends Component { +export default class DappContainer extends Component { static propTypes = { children: PropTypes.node }; diff --git a/js/src/views/Application/DappContainer/index.js b/js/src/views/Application/DappContainer/index.js new file mode 100644 index 00000000000..250f184aa0e --- /dev/null +++ b/js/src/views/Application/DappContainer/index.js @@ -0,0 +1 @@ +export default from './dappContainer'; diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index 57cf3a4418d..e5f09a7e732 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -4,16 +4,13 @@ import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import Api from '../../api'; -import { FirstRun } from '../../modals'; import { eip20Abi, registryAbi, tokenRegAbi } from '../../services/abi'; -import { Errors, Tooltips } from '../../ui'; -import AppContainer from './AppContainer'; +import Container from './Container'; +import DappContainer from './DappContainer'; import FrameError from './FrameError'; -import Status, { updateStatus } from './Status'; -import TabBar from './TabBar'; +import { updateStatus } from './Status'; -import styles from './style.css'; import imagesEthereum32 from '../../images/contracts/ethereum-32.png'; import imagesEthereum56 from '../../images/contracts/ethereum-56.png'; import imagesGavcoin32 from '../../images/contracts/gavcoin-32.png'; @@ -22,6 +19,7 @@ import imagesGavcoin56 from '../../images/contracts/gavcoin-56.png'; const api = new Api(new Api.Transport.Http('/rpc/')); const inFrame = window.parent !== window && window.parent.frames.length !== 0; +// TODO: Images should not be imported like this, should be via the content from GitHubHint contract (here until it is ready) const images = { ethereum: { small: imagesEthereum32, @@ -79,22 +77,16 @@ class Application extends Component { ); } else if (root === 'app') { return ( - ); } return ( -
- - - - - { children } - -
+ ); } @@ -319,7 +311,7 @@ class Application extends Component { }); } - onCloseFirst = () => { + onCloseFirstRun = () => { this.setState({ showFirstRun: false }); From 4baf343d2b2a4042aa0bb3c40f94c708d8aadd9f Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 2 Sep 2016 11:07:45 +0200 Subject: [PATCH 0302/1062] signer in and operational --- js/src/index.js | 2 +- js/src/modals/Transfer/Details/details.js | 10 ++++++---- js/src/modals/Transfer/style.css | 4 ++++ js/src/ui/Actionbar/style.css | 6 +++--- js/src/ui/Balances/balances.js | 2 +- js/src/ui/Theme/theme.js | 8 ++++---- js/src/views/Account/Transactions/transactions.js | 4 ++-- 7 files changed, 21 insertions(+), 15 deletions(-) diff --git a/js/src/index.js b/js/src/index.js index 838cd409256..84dbdb20a5d 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -1,6 +1,6 @@ import 'isomorphic-fetch'; -import ReactDOM from 'react-dom'; import React from 'react'; +import ReactDOM from 'react-dom'; import injectTapEventPlugin from 'react-tap-event-plugin'; import es6Promise from 'es6-promise'; diff --git a/js/src/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js index 3ad52c69fc7..aac6fa8099f 100644 --- a/js/src/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -63,9 +63,11 @@ export default class Details extends Component { + error={ totalError }> +
+ { total } ΞTH +
+
- { value } { token.tag } + { value } { token.tag }
); diff --git a/js/src/modals/Transfer/style.css b/js/src/modals/Transfer/style.css index f8451729fb8..f1809d9d226 100644 --- a/js/src/modals/Transfer/style.css +++ b/js/src/modals/Transfer/style.css @@ -109,3 +109,7 @@ color: #aaa; font-size: 0.75em; } + +.inputoverride { + padding-top: 24px !important; +} diff --git a/js/src/ui/Actionbar/style.css b/js/src/ui/Actionbar/style.css index 2e0bf358e7d..7ecdc19cdf5 100644 --- a/js/src/ui/Actionbar/style.css +++ b/js/src/ui/Actionbar/style.css @@ -7,14 +7,14 @@ } .toolbuttons button { - color: white !important; + /*color: white !important;*/ margin: 10px 0 10px 16px !important; } .toolbuttons button:hover { - background: rgba(80, 80, 80, 0.5) !important; + /*background: rgba(80, 80, 80, 0.5) !important;*/ } .toolbuttons svg { - fill: white !important; + /*fill: white !important;*/ } diff --git a/js/src/ui/Balances/balances.js b/js/src/ui/Balances/balances.js index 64bcab9a5fd..d532d25e001 100644 --- a/js/src/ui/Balances/balances.js +++ b/js/src/ui/Balances/balances.js @@ -27,7 +27,7 @@ export default class Balances extends Component { { -
{ value } { token.tag }
+
{ value } { token.tag }
); }); diff --git a/js/src/ui/Theme/theme.js b/js/src/ui/Theme/theme.js index 18bdc5cee51..f391b89901f 100644 --- a/js/src/ui/Theme/theme.js +++ b/js/src/ui/Theme/theme.js @@ -7,15 +7,15 @@ const muiTheme = getMuiTheme(darkBaseTheme); muiTheme.stepper.textColor = '#eee'; muiTheme.stepper.disabledTextColor = '#777'; -muiTheme.inkBar.backgroundColor = 'rgba(255, 136, 0, 0.8)'; // 'rgba(255, 136, 0, 0.8)'; // 'rgb(0, 151, 167)'; +muiTheme.inkBar.backgroundColor = 'rgb(0, 151, 167)'; // 'rgba(255, 136, 0, 0.8)'; // 'rgb(0, 151, 167)'; muiTheme.snackbar.backgroundColor = 'rgba(255, 30, 30, 0.9)'; muiTheme.snackbar.textColor = 'rgba(255, 255, 255, 0.9)'; muiTheme.tabs = lightTheme.tabs; muiTheme.tabs.backgroundColor = 'rgb(65, 65, 65)'; -muiTheme.tabs.selectedTextColor = 'rgba(255, 136, 0, 0.8)'; // 'rgb(0, 151, 167)'; // 'rgba(255, 136, 0, 0.8)'; -muiTheme.tabs.textColor = 'rgba(255, 255, 255, 1)'; // 'rgba(0, 151, 167, 1)'; +muiTheme.tabs.selectedTextColor = 'rgb(255, 255, 255)'; // 'rgb(0, 151, 167)'; // 'rgba(255, 136, 0, 0.8)'; +muiTheme.tabs.textColor = 'rgb(0, 151, 167)'; // 'rgba(255, 255, 255, 1)'; // 'rgba(0, 151, 167, 1)'; muiTheme.textField.disabledTextColor = muiTheme.textField.textColor; muiTheme.toolbar = lightTheme.toolbar; -muiTheme.toolbar.backgroundColor = 'rgba(255, 136, 0, 0.5)'; // 'rgb(80, 80, 80)'; +muiTheme.toolbar.backgroundColor = 'rgb(80, 80, 80)'; // 'rgba(255, 136, 0, 0.5)'; // 'rgb(80, 80, 80)'; export default muiTheme; diff --git a/js/src/views/Account/Transactions/transactions.js b/js/src/views/Account/Transactions/transactions.js index f2169b3a5ce..e9aa2786aac 100644 --- a/js/src/views/Account/Transactions/transactions.js +++ b/js/src/views/Account/Transactions/transactions.js @@ -29,7 +29,7 @@ function formatEther (value) { const ether = Api.format.fromWei(value); if (ether.gt(0)) { - return `${ether.toFormat(5)} ΞTH`; + return `${ether.toFormat(5)}`; } return null; @@ -128,7 +128,7 @@ export default class Transactions extends Component { { formatTime(tx.timeStamp) }
); From 6907b44eb0fe6879ed0e5d1c179cef26e6c200cf Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 2 Sep 2016 11:18:05 +0200 Subject: [PATCH 0303/1062] signer sits inside a container --- js/src/modals/Transfer/Complete/complete.js | 6 ++++-- js/src/views/Signer/containers/Root/Root.js | 20 +++++++++++--------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/js/src/modals/Transfer/Complete/complete.js b/js/src/modals/Transfer/Complete/complete.js index 02b3b4730ad..020f5f1576b 100644 --- a/js/src/modals/Transfer/Complete/complete.js +++ b/js/src/modals/Transfer/Complete/complete.js @@ -11,7 +11,9 @@ export default class Complete extends Component { } render () { - if (this.props.sending) { + const { sending } = this.props; + + if (sending) { return (
@@ -25,7 +27,7 @@ export default class Complete extends Component { return (
- The transaction was sent and awaits verification in the signer. Enter the signer and authenticate the correct transactions with your account password. + The transaction was sent and awaits verification in the signer. Enter the signer and authenticate the correct transactions with your account password.
); diff --git a/js/src/views/Signer/containers/Root/Root.js b/js/src/views/Signer/containers/Root/Root.js index d7918056e1d..99a5a149cdb 100644 --- a/js/src/views/Signer/containers/Root/Root.js +++ b/js/src/views/Signer/containers/Root/Root.js @@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; -import { Actionbar } from '../../../../ui'; +import { Actionbar, Container } from '../../../../ui'; import ToastrContainer from '../../components/ToastrContainer'; import { removeToast } from '../../actions/toastr'; @@ -33,16 +33,18 @@ export class Root extends Component { const { toastr, actions } = this.props; return ( -
+
-
- { this.renderPage() } -
- + +
+ { this.renderPage() } +
+ +
); } From b744d30dc462d9a079c5ef094c4ef9aa98d8b21a Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 2 Sep 2016 11:49:25 +0200 Subject: [PATCH 0304/1062] styling --- js/src/views/ParityBar/parityBar.js | 3 ++- js/src/views/ParityBar/style.css | 2 ++ .../dappscomponents/TransactionPending/TransactionPending.css | 3 +-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/js/src/views/ParityBar/parityBar.js b/js/src/views/ParityBar/parityBar.js index ce3e78e51cc..4d10026a7e5 100644 --- a/js/src/views/ParityBar/parityBar.js +++ b/js/src/views/ParityBar/parityBar.js @@ -3,6 +3,7 @@ import React, { Component } from 'react'; import { IconButton } from 'material-ui'; import ActionSwapVert from 'material-ui/svg-icons/action/swap-vert'; +import imagesParitybar from '../../images/paritybar.png'; import styles from './style.css'; export default class ParityBar extends Component { @@ -15,7 +16,7 @@ export default class ParityBar extends Component { href='/#/apps'> + src={ imagesParitybar } /> diff --git a/js/src/views/ParityBar/style.css b/js/src/views/ParityBar/style.css index e7841de4673..84af3815c1e 100644 --- a/js/src/views/ParityBar/style.css +++ b/js/src/views/ParityBar/style.css @@ -29,4 +29,6 @@ } a.noshow { + border: none; + outline: none !important; } diff --git a/js/src/views/Signer/dappscomponents/TransactionPending/TransactionPending.css b/js/src/views/Signer/dappscomponents/TransactionPending/TransactionPending.css index e8aad894f55..5b27f97adcd 100644 --- a/js/src/views/Signer/dappscomponents/TransactionPending/TransactionPending.css +++ b/js/src/views/Signer/dappscomponents/TransactionPending/TransactionPending.css @@ -16,8 +16,8 @@ .iconsContainer { display: inline-block; min-width: 180px; - color: rgba(0, 0, 0, .3); font-size: .8em; + opacity: 0.5; } .iconsContainer > * { @@ -45,7 +45,6 @@ height: 16px !important; position: relative; bottom: -3px; - fill: rgba(0,0,0, 0.35) !important; } /* TODO [ToDr] composes was handling weird errors when linking from other app */ From bcde5f646d96f5457e4a9e24dd619e11a270723b Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 2 Sep 2016 12:19:50 +0200 Subject: [PATCH 0305/1062] expose format on api --- js/src/3rdparty/etherscan/account.js | 6 +++--- js/src/api/README.md | 2 +- js/src/api/api.js | 8 ++++---- .../AccountItem/accountItem.js | 19 +++++++++++++++---- .../Actions/ActionBuyIn/actionBuyIn.js | 12 ++++++------ .../Actions/ActionRefund/actionRefund.js | 11 ++++++----- js/src/dapps/gavcoin/Actions/validation.js | 6 +++--- .../dapps/gavcoin/Application/application.js | 8 +++----- js/src/dapps/gavcoin/Events/Event/event.js | 7 ++++--- js/src/dapps/gavcoin/format/index.js | 4 ++-- .../dapps/registry/Application/application.js | 5 +---- js/src/dapps/registry/Status/status.js | 10 +++++++--- .../dapps/tokenreg/Application/application.js | 7 ++----- js/src/dapps/tokenreg/Status/status.js | 4 ++-- .../modals/CreateAccount/NewGeth/newGeth.js | 3 +-- js/src/modals/Transfer/Details/details.js | 6 +++--- js/src/modals/Transfer/transfer.js | 17 ++++++++++------- js/src/parity.js | 5 ++++- js/src/services/validation.js | 6 +++--- js/src/ui/Balances/balances.js | 7 ++++--- js/src/ui/IdentityIcon/identityIcon.js | 5 +++-- .../Account/Transactions/transactions.js | 4 ++-- js/src/views/Application/application.js | 2 +- 23 files changed, 90 insertions(+), 74 deletions(-) diff --git a/js/src/3rdparty/etherscan/account.js b/js/src/3rdparty/etherscan/account.js index 26dc1b93ecc..5d3bef451cf 100644 --- a/js/src/3rdparty/etherscan/account.js +++ b/js/src/3rdparty/etherscan/account.js @@ -1,6 +1,6 @@ const PAGE_SIZE = 25; -import Api from '../../api'; +import format from '../../api/format'; import { call } from './call'; function _call (method, params, test) { @@ -37,8 +37,8 @@ function transactions (address, page, test = false) { }, test).then((transactions) => { return transactions.map((tx) => { return { - from: Api.format.toChecksumAddress(tx.from), - to: Api.format.toChecksumAddress(tx.to), + from: format.toChecksumAddress(tx.from), + to: format.toChecksumAddress(tx.to), hash: tx.hash, blockNumber: tx.blockNumber, timeStamp: tx.timeStamp, diff --git a/js/src/api/README.md b/js/src/api/README.md index 0eca9b5f4f5..691a24cca98 100644 --- a/js/src/api/README.md +++ b/js/src/api/README.md @@ -83,7 +83,7 @@ attach contract ```javascript const abi = [{ name: 'callMe', inputs: [{ type: 'bool', ...}, { type: 'string', ...}]}, ...abi...]; -const contract = new EthApi.Contract(ethapi, abi); +const contract = new ethapi.newContract(abi); ``` deploy diff --git a/js/src/api/api.js b/js/src/api/api.js index 9073a3bf195..f0b2556f823 100644 --- a/js/src/api/api.js +++ b/js/src/api/api.js @@ -60,14 +60,14 @@ export default class Api { return this._events; } + get format () { + return format; + } + newContract (abi, address) { return new Contract(this, abi).at(address); } - static format = format; - - static Contract = Contract - static Transport = { Http: Http, Ws: Ws diff --git a/js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.js b/js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.js index 96a4c2dbdc4..21e0a7a6632 100644 --- a/js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.js +++ b/js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.js @@ -13,9 +13,20 @@ export default class AccountItem extends Component { render () { const { account, gavBalance } = this.props; - const balance = gavBalance - ? (account.gavBalance ? `${account.gavBalance}GAV` : '') - : (account.ethBalance ? `${account.ethBalance}ΞTH` : ''); + let balance; + let token; + + if (gavBalance) { + if (account.gavBalance) { + balance = account.gavBalance; + token = 'GAV'; + } + } else { + if (account.ethBalance) { + balance = account.ethBalance; + token = 'ΞTH'; + } + } return (
@@ -29,7 +40,7 @@ export default class AccountItem extends Component { { account.name || account.address }
- { balance } + { balance } { token }
diff --git a/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js b/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js index 6a5edbb08e7..3d0ca3ba8b8 100644 --- a/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js +++ b/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js @@ -9,7 +9,7 @@ import { ERRORS, validateAccount, validatePositiveNumber } from '../validation'; import styles from '../style.css'; -const { Api } = window.parity; +const { api } = window.parity; const NAME_ID = ' '; @@ -29,7 +29,7 @@ export default class ActionBuyIn extends Component { accountError: ERRORS.invalidAccount, amount: 0, amountError: ERRORS.invalidAmount, - maxPrice: Api.format.fromWei(this.props.price.mul(1.2)).toString(), + maxPrice: api.format.fromWei(this.props.price.mul(1.2)).toString(), maxPriceError: null, sending: false, complete: false @@ -78,7 +78,7 @@ export default class ActionBuyIn extends Component { } renderFields () { - const maxPriceLabel = `maximum price in ΞTH (current ${Api.format.fromWei(this.props.price).toFormat(3)})`; + const maxPriceLabel = `maximum price in ΞTH (current ${api.format.fromWei(this.props.price).toFormat(3)})`; return (
@@ -151,12 +151,12 @@ export default class ActionBuyIn extends Component { } onSend = () => { - const maxPrice = Api.format.toWei(this.state.maxPrice); - const { instance } = this.context; + const { api, instance } = this.context; + const maxPrice = api.format.toWei(this.state.maxPrice); const values = [this.state.account.address, maxPrice.toString()]; const options = { from: this.state.account.address, - value: Api.format.toWei(this.state.amount).toString() + value: api.format.toWei(this.state.amount).toString() }; this.setState({ diff --git a/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js b/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js index bb937699d81..1785d8eccce 100644 --- a/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js +++ b/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js @@ -9,7 +9,7 @@ import { ERRORS, validateAccount, validatePositiveNumber } from '../validation'; import styles from '../style.css'; -const { Api } = window.parity; +const { api } = window.parity; const DIVISOR = 10 ** 6; const NAME_ID = ' '; @@ -32,7 +32,7 @@ export default class ActionRefund extends Component { sending: false, amount: 0, amountError: ERRORS.invalidAmount, - price: Api.format.fromWei(this.props.price).toString(), + price: api.format.fromWei(this.props.price).toString(), priceError: null } @@ -74,7 +74,8 @@ export default class ActionRefund extends Component { } renderFields () { - const priceLabel = `price in ΞTH (current ${Api.format.fromWei(this.props.price).toFormat(3)})`; + const priceLabel = `price in ΞTH (current ${api.format.fromWei(this.props.price).toFormat(3)})`; + return (
{ - const { instance } = this.context; - const price = Api.format.toWei(this.state.price); + const { api, instance } = this.context; + const price = api.format.toWei(this.state.price); const amount = new BigNumber(this.state.amount).mul(DIVISOR); const values = [price.toString(), amount.toFixed(0)]; const options = { diff --git a/js/src/dapps/gavcoin/Actions/validation.js b/js/src/dapps/gavcoin/Actions/validation.js index 7fde8312ec8..4f1350aaec9 100644 --- a/js/src/dapps/gavcoin/Actions/validation.js +++ b/js/src/dapps/gavcoin/Actions/validation.js @@ -1,6 +1,6 @@ import BigNumber from 'bignumber.js'; -const { Api } = window.parity; +const { api } = window.parity; export const ERRORS = { invalidAccount: 'please select an account to transact with', @@ -30,11 +30,11 @@ export function validateAccount (account) { return ERRORS.invalidAccount; } - if (!Api.format.isAddressValid(account.address)) { + if (!api.format.isAddressValid(account.address)) { return ERRORS.invalidAddress; } - account.address = Api.format.toChecksumAddress(account.address); + account.address = api.format.toChecksumAddress(account.address); return null; } diff --git a/js/src/dapps/gavcoin/Application/application.js b/js/src/dapps/gavcoin/Application/application.js index b3781ab8c67..b5ad715b1e0 100644 --- a/js/src/dapps/gavcoin/Application/application.js +++ b/js/src/dapps/gavcoin/Application/application.js @@ -15,9 +15,7 @@ import Events from '../Events'; import Loading from '../Loading'; import Status from '../Status'; -const { Api } = window.parity; - -const api = new Api(new Api.Transport.Http('/rpc/')); +const { api } = window.parity; const DIVISOR = 10 ** 6; @@ -161,7 +159,7 @@ export default class Application extends Component { const ethBalance = ethBalances[idx]; const gavBalance = gavBalances[idx]; - account.ethBalance = Api.format.fromWei(ethBalance).toFormat(3); + account.ethBalance = api.format.fromWei(ethBalance).toFormat(3); account.gavBalance = gavBalance.div(DIVISOR).toFormat(6); account.hasGav = gavBalance.gt(0); @@ -181,7 +179,7 @@ export default class Application extends Component { return Promise .all([ - registry.getAddress.call({}, [Api.format.sha3('gavcoin'), 'A']), + registry.getAddress.call({}, [api.format.sha3('gavcoin'), 'A']), api.personal.listAccounts(), api.personal.accountsInfo() ]); diff --git a/js/src/dapps/gavcoin/Events/Event/event.js b/js/src/dapps/gavcoin/Events/Event/event.js index b3fb2dbabff..c8987c7ec98 100644 --- a/js/src/dapps/gavcoin/Events/Event/event.js +++ b/js/src/dapps/gavcoin/Events/Event/event.js @@ -62,7 +62,8 @@ export default class Event extends Component { } renderAddressName (address) { - const account = this.context.accounts.find((_account) => _account.address === address); + const { accounts } = this.context; + const account = accounts.find((_account) => _account.address === address); if (account) { return ( @@ -86,7 +87,7 @@ export default class Event extends Component { return (
); } @@ -98,7 +99,7 @@ export default class Event extends Component { return ( ); } diff --git a/js/src/dapps/gavcoin/format/index.js b/js/src/dapps/gavcoin/format/index.js index 199d4bcb291..252b2099759 100644 --- a/js/src/dapps/gavcoin/format/index.js +++ b/js/src/dapps/gavcoin/format/index.js @@ -1,4 +1,4 @@ -const { Api } = window.parity; +const { api } = window.parity; const DIVISOR = 10 ** 6; @@ -29,5 +29,5 @@ export function formatCoins (amount, decimals = 6) { } export function formatEth (eth, decimals = 3) { - return Api.format.fromWei(eth).toFormat(decimals); + return api.format.fromWei(eth).toFormat(decimals); } diff --git a/js/src/dapps/registry/Application/application.js b/js/src/dapps/registry/Application/application.js index 0af5dc7acc1..eb6b563c849 100644 --- a/js/src/dapps/registry/Application/application.js +++ b/js/src/dapps/registry/Application/application.js @@ -7,14 +7,12 @@ import registryAbi from '../abi/registry.json'; import Loading from '../Loading'; import Status from '../Status'; -const { Api } = window.parity; +const { api } = window.parity; -const api = new Api(new Api.Transport.Http('/rpc/')); const muiTheme = getMuiTheme(lightBaseTheme); export default class Application extends Component { static childContextTypes = { - api: PropTypes.object, instance: PropTypes.object, muiTheme: PropTypes.object } @@ -52,7 +50,6 @@ export default class Application extends Component { getChildContext () { return { - api, instance: this.state.instance, muiTheme }; diff --git a/js/src/dapps/registry/Status/status.js b/js/src/dapps/registry/Status/status.js index 4c8fd8cf9fd..3df7fa40f84 100644 --- a/js/src/dapps/registry/Status/status.js +++ b/js/src/dapps/registry/Status/status.js @@ -2,14 +2,18 @@ import React, { Component, PropTypes } from 'react'; import styles from './style.css'; -const { Api } = window.parity; +const { api } = window.parity; export default class Status extends Component { + static contextTypes = { + api: PropTypes.object + } + static propTypes = { address: PropTypes.string, fee: PropTypes.object, owner: PropTypes.string - }; + } render () { const { address, fee, owner } = this.props; @@ -18,7 +22,7 @@ export default class Status extends Component {
Registry at { address }
Owned by { owner }
-
Registration fee { Api.format.fromWei(fee).toFixed(3) }ΞTH
+
Registration fee { api.format.fromWei(fee).toFixed(3) }ΞTH
); } diff --git a/js/src/dapps/tokenreg/Application/application.js b/js/src/dapps/tokenreg/Application/application.js index 381d934f76e..7122d96f5f7 100644 --- a/js/src/dapps/tokenreg/Application/application.js +++ b/js/src/dapps/tokenreg/Application/application.js @@ -8,14 +8,12 @@ import tokenregAbi from '../abi/tokenreg.json'; import Loading from '../Loading'; import Status from '../Status'; -const { Api } = window.parity; +const { api } = window.parity; -const api = new Api(new Api.Transport.Http('/rpc/')); const muiTheme = getMuiTheme(lightBaseTheme); export default class Application extends Component { static childContextTypes = { - api: PropTypes.object, instance: PropTypes.object, muiTheme: PropTypes.object } @@ -51,7 +49,6 @@ export default class Application extends Component { getChildContext () { return { - api, instance: this.state.instance, muiTheme }; @@ -76,7 +73,7 @@ export default class Application extends Component { console.log(`registry found at ${registryAddress}`); const registry = api.newContract(registryAbi, registryAddress).instance; - return registry.getAddress.call({}, [Api.format.sha3('tokenreg'), 'A']); + return registry.getAddress.call({}, [api.format.sha3('tokenreg'), 'A']); }) .then((address) => { console.log(`tokenreg was found at ${address}`); diff --git a/js/src/dapps/tokenreg/Status/status.js b/js/src/dapps/tokenreg/Status/status.js index 06a8edbd618..b574b56df04 100644 --- a/js/src/dapps/tokenreg/Status/status.js +++ b/js/src/dapps/tokenreg/Status/status.js @@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'; import styles from './style.css'; -const { Api } = window.parity; +const { api } = window.parity; export default class Status extends Component { static propTypes = { @@ -18,7 +18,7 @@ export default class Status extends Component {
Token Registry at { address }
Owned by { owner }
-
Registration fee { Api.format.fromWei(fee).toFixed(3) }ΞTH
+
Registration fee { api.format.fromWei(fee).toFixed(3) }ΞTH
); } diff --git a/js/src/modals/CreateAccount/NewGeth/newGeth.js b/js/src/modals/CreateAccount/NewGeth/newGeth.js index 17f2a2c157b..f478bfedf3f 100644 --- a/js/src/modals/CreateAccount/NewGeth/newGeth.js +++ b/js/src/modals/CreateAccount/NewGeth/newGeth.js @@ -2,7 +2,6 @@ import React, { Component, PropTypes } from 'react'; import { Checkbox } from 'material-ui'; -import Api from '../../../api'; import IdentityIcon from '../../../ui/IdentityIcon'; import styles from './style.css'; @@ -101,7 +100,7 @@ export default class NewGeth extends Component { .map((address, idx) => { return { address, - balance: Api.format.fromWei(balances[idx]).toFormat(5), + balance: api.format.fromWei(balances[idx]).toFormat(5), checked: false }; }) diff --git a/js/src/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js index aac6fa8099f..4a495551423 100644 --- a/js/src/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -2,7 +2,6 @@ import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; import { Checkbox, MenuItem } from 'material-ui'; -import Api from '../../../api'; import Form, { Input, InputAddressSelect, Select } from '../../../ui/Form'; import styles from '../style.css'; @@ -15,6 +14,7 @@ const CHECK_STYLE = { export default class Details extends Component { static contextTypes = { + api: PropTypes.object, accounts: PropTypes.array.isRequired } @@ -97,7 +97,7 @@ export default class Details extends Component { } renderTokenSelect () { - const { accounts } = this.context; + const { accounts, api } = this.context; const { address, tag } = this.props; const account = accounts.find((acc) => acc.address === address); @@ -107,7 +107,7 @@ export default class Details extends Component { let value = 0; if (isEth) { - value = Api.format.fromWei(balance.value).toFormat(3); + value = api.format.fromWei(balance.value).toFormat(3); } else { value = new BigNumber(balance.value).div(balance.token.format || 1).toFormat(3); } diff --git a/js/src/modals/Transfer/transfer.js b/js/src/modals/Transfer/transfer.js index 83909eeaed0..597e76372c0 100644 --- a/js/src/modals/Transfer/transfer.js +++ b/js/src/modals/Transfer/transfer.js @@ -9,7 +9,6 @@ import ContentSend from 'material-ui/svg-icons/content/send'; import NavigationArrowBack from 'material-ui/svg-icons/navigation/arrow-back'; import NavigationArrowForward from 'material-ui/svg-icons/navigation/arrow-forward'; -import Api from '../../api'; import { newError } from '../../ui/Errors'; import { IdentityIcon, Modal } from '../../ui'; @@ -281,11 +280,12 @@ class Transfer extends Component { } _onUpdateRecipient (recipient) { + const { api } = this.context; let recipientError = null; if (!recipient || !recipient.length) { recipientError = ERRORS.requireRecipient; - } else if (!Api.format.isAddressValid(recipient)) { + } else if (!api.format.isAddressValid(recipient)) { recipientError = ERRORS.invalidAddress; } @@ -340,6 +340,7 @@ class Transfer extends Component { } _sendEth () { + const { api } = this.context; const { account } = this.props; const { data, gas, gasPrice, recipient, value } = this.state; const options = { @@ -347,7 +348,7 @@ class Transfer extends Component { to: recipient, gas, gasPrice, - value: Api.format.toWei(value || 0) + value: api.format.toWei(value || 0) }; if (data && data.length) { @@ -419,6 +420,7 @@ class Transfer extends Component { } _estimateGasEth () { + const { api } = this.context; const { account } = this.props; const { data, gas, gasPrice, recipient, value } = this.state; const options = { @@ -426,7 +428,7 @@ class Transfer extends Component { to: recipient, gas, gasPrice, - value: Api.format.toWei(value || 0) + value: api.format.toWei(value || 0) }; if (data && data.length) { @@ -458,6 +460,7 @@ class Transfer extends Component { } recalculate = () => { + const { api } = this.context; const { account } = this.props; if (!account) { @@ -478,7 +481,7 @@ class Transfer extends Component { if (valueAll) { if (isEth) { - const bn = Api.format.fromWei(availableEth.minus(gasTotal)); + const bn = api.format.fromWei(availableEth.minus(gasTotal)); value = (bn.lt(0) ? new BigNumber(0.0) : bn).toString(); } else { value = available.div(format).toString(); @@ -486,7 +489,7 @@ class Transfer extends Component { } if (isEth) { - totalEth = totalEth.plus(Api.format.toWei(value || 0)); + totalEth = totalEth.plus(api.format.toWei(value || 0)); } if (new BigNumber(value || 0).gt(available.div(format))) { @@ -500,7 +503,7 @@ class Transfer extends Component { } this.setState({ - total: Api.format.fromWei(totalEth).toString(), + total: api.format.fromWei(totalEth).toString(), totalError, value, valueError diff --git a/js/src/parity.js b/js/src/parity.js index 0b53f31876b..badbcf230c1 100644 --- a/js/src/parity.js +++ b/js/src/parity.js @@ -6,8 +6,11 @@ import { IdentityIcon } from './ui'; es6Promise.polyfill(); +const api = new Api(new Api.Transport.Http('/rpc/')); + window.parity = { - Api: Api, + Api, + api, react: { IdentityIcon } diff --git a/js/src/services/validation.js b/js/src/services/validation.js index 641f68d86b4..b15e57a78a3 100644 --- a/js/src/services/validation.js +++ b/js/src/services/validation.js @@ -1,4 +1,4 @@ -import Api from '../api'; +import format from '../api/format'; export const ERRORS = { invalidAddress: 'address is an invalid network address', @@ -12,10 +12,10 @@ export function validateAddress (address) { if (!address) { addressError = ERRORS.invalidAddress; - } else if (!Api.format.isAddressValid(address)) { + } else if (!format.isAddressValid(address)) { addressError = ERRORS.invalidAddress; } else { - address = Api.format.toChecksumAddress(address); + address = format.toChecksumAddress(address); } return { diff --git a/js/src/ui/Balances/balances.js b/js/src/ui/Balances/balances.js index d532d25e001..e01cb751403 100644 --- a/js/src/ui/Balances/balances.js +++ b/js/src/ui/Balances/balances.js @@ -1,24 +1,25 @@ import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; -import Api from '../../api'; - import styles from './style.css'; export default class Balances extends Component { static propTypes = { + api: PropTypes.object, account: PropTypes.object, onChange: PropTypes.func } render () { + const { api } = this.context; + let body = this.props.account.balances .filter((balance) => new BigNumber(balance.value).gt(0)) .map((balance) => { const token = balance.token; const value = token.format ? new BigNumber(balance.value).div(new BigNumber(token.format)).toFormat(3) - : Api.format.fromWei(balance.value).toFormat(3); + : api.format.fromWei(balance.value).toFormat(3); return (
c.address.toLowerCase() === address); + const contract = (contracts || []).find((c) => c.address.toLowerCase() === address); if (contract && contract.images) { this.setState({ diff --git a/js/src/views/Account/Transactions/transactions.js b/js/src/views/Account/Transactions/transactions.js index e9aa2786aac..6d2aab7c10b 100644 --- a/js/src/views/Account/Transactions/transactions.js +++ b/js/src/views/Account/Transactions/transactions.js @@ -3,7 +3,7 @@ import React, { Component, PropTypes } from 'react'; import moment from 'moment'; import LinearProgress from 'material-ui/LinearProgress'; -import Api from '../../../api'; +import format from '../../../api/format'; import etherscan from '../../../3rdparty/etherscan'; import { Container, IdentityIcon } from '../../../ui'; @@ -26,7 +26,7 @@ function formatTime (time) { } function formatEther (value) { - const ether = Api.format.fromWei(value); + const ether = format.fromWei(value); if (ether.gt(0)) { return `${ether.toFormat(5)}`; diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index e5f09a7e732..3e135bda3af 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -217,7 +217,7 @@ class Application extends Component { .then((registryAddress) => { contracts.registry = api.newContract(registryAbi, registryAddress); - return contracts.registry.instance.getAddress.call({}, [Api.format.sha3('tokenreg'), 'A']); + return contracts.registry.instance.getAddress.call({}, [api.format.sha3('tokenreg'), 'A']); }) .then((tokenregAddress) => { contracts.tokenreg = api.newContract(tokenRegAbi, tokenregAddress); From 3256df3bd20e10d3510c9c19b6a21c2d45cb3902 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 2 Sep 2016 12:23:37 +0200 Subject: [PATCH 0306/1062] api on context --- js/src/ui/Balances/balances.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/js/src/ui/Balances/balances.js b/js/src/ui/Balances/balances.js index e01cb751403..8e080eff093 100644 --- a/js/src/ui/Balances/balances.js +++ b/js/src/ui/Balances/balances.js @@ -4,8 +4,11 @@ import React, { Component, PropTypes } from 'react'; import styles from './style.css'; export default class Balances extends Component { + static contextTypes = { + api: PropTypes.object + } + static propTypes = { - api: PropTypes.object, account: PropTypes.object, onChange: PropTypes.func } From f4e9d0f971f987c15b9ef9aa182a93ef1d5f5682 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 2 Sep 2016 12:46:37 +0200 Subject: [PATCH 0307/1062] adjust transaction display table --- js/src/views/Account/Transactions/transactions.js | 9 ++++++--- js/src/views/Account/style.css | 6 +++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/js/src/views/Account/Transactions/transactions.js b/js/src/views/Account/Transactions/transactions.js index 6d2aab7c10b..73b27c2b4b8 100644 --- a/js/src/views/Account/Transactions/transactions.js +++ b/js/src/views/Account/Transactions/transactions.js @@ -108,7 +108,8 @@ export default class Transactions extends Component { if (this.state.transactions && this.state.transactions.length) { transactions = (this.state.transactions || []).map((tx) => { const hashLink = `${prefix}tx/${tx.hash}`; - + const value = formatEther(tx.value); + const token = value ? 'ΞTH' : null; const tosection = (tx.to && tx.to.length) ? this.renderAddress(prefix, tx.to) : (
); @@ -119,7 +120,9 @@ export default class Transactions extends Component { { this.renderAddress(prefix, tx.from) } { tosection } ); diff --git a/js/src/views/Account/style.css b/js/src/views/Account/style.css index fb276c2c08b..6cb3cf988cc 100644 --- a/js/src/views/Account/style.css +++ b/js/src/views/Account/style.css @@ -26,7 +26,11 @@ .transactions tr { line-height: 32px; vertical-align: top; - font-family: 'Roboto Mono', monospace; + /*font-family: 'Roboto Mono', monospace;*/ +} + +.transactions th { + color: #aaa; } .transactions tr td { From 6faeb925e516ed719d6a4a4712ac1795be254392 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 2 Sep 2016 12:53:24 +0200 Subject: [PATCH 0308/1062] remove monospace font --- js/src/ui/Balances/style.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/ui/Balances/style.css b/js/src/ui/Balances/style.css index ac4fa6a998b..99d399d5c39 100644 --- a/js/src/ui/Balances/style.css +++ b/js/src/ui/Balances/style.css @@ -27,7 +27,7 @@ .balance div { display: inline-block; - font-family: 'Roboto Mono', monospace; + /*font-family: 'Roboto Mono', monospace;*/ line-height: 24px; margin: 0 1em 0 0; vertical-align: top; From f0139c9bd4fe214348b2a8f0c7c175c2b4e8701a Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 2 Sep 2016 13:42:15 +0200 Subject: [PATCH 0309/1062] float identityicons left --- js/src/ui/Form/FormWrap/style.css | 1 + js/src/ui/IdentityIcon/identityIcon.js | 13 ++++++------- js/src/ui/IdentityIcon/style.css | 6 ++++++ js/src/views/Account/Transactions/transactions.js | 2 +- js/src/views/Account/{style.css => account.css} | 9 +++++++++ js/src/views/Account/account.js | 12 +++++++----- 6 files changed, 30 insertions(+), 13 deletions(-) rename js/src/views/Account/{style.css => account.css} (86%) diff --git a/js/src/ui/Form/FormWrap/style.css b/js/src/ui/Form/FormWrap/style.css index 4b6fde119aa..91cfdf7076a 100644 --- a/js/src/ui/Form/FormWrap/style.css +++ b/js/src/ui/Form/FormWrap/style.css @@ -1,5 +1,6 @@ .stretch { width: 75%; + clear: both; } .stretch input { diff --git a/js/src/ui/IdentityIcon/identityIcon.js b/js/src/ui/IdentityIcon/identityIcon.js index 72a67c6593b..7990103b94c 100644 --- a/js/src/ui/IdentityIcon/identityIcon.js +++ b/js/src/ui/IdentityIcon/identityIcon.js @@ -39,9 +39,7 @@ export default class IdentityIcon extends Component { if (contract && contract.images) { this.setState({ - iconsrc: inline - ? contract.images.small - : contract.images.normal + iconsrc: contract.images[inline ? 'small' : 'normal'] }); return; @@ -57,15 +55,16 @@ export default class IdentityIcon extends Component { } render () { - const { center, inline, padded } = this.props; + const { address, center, inline, padded } = this.props; + const { iconsrc } = this.state; const size = inline ? '32px' : '56px'; - const className = `${styles.icon} ${center ? styles.center : styles.right} ${padded ? styles.padded : null} ${inline ? styles.inline : null}`; + const className = `${styles.icon} ${center ? styles.center : styles.left} ${padded ? styles.padded : null} ${inline ? styles.inline : null}`; return ( ); diff --git a/js/src/ui/IdentityIcon/style.css b/js/src/ui/IdentityIcon/style.css index 513e6a96a04..ddb04fa158c 100644 --- a/js/src/ui/IdentityIcon/style.css +++ b/js/src/ui/IdentityIcon/style.css @@ -7,6 +7,12 @@ text-align: center; } +.left { + float: left; + text-align: left; + margin-right: 1em; +} + .right { float: right; text-align: right; diff --git a/js/src/views/Account/Transactions/transactions.js b/js/src/views/Account/Transactions/transactions.js index 73b27c2b4b8..7b085b477f9 100644 --- a/js/src/views/Account/Transactions/transactions.js +++ b/js/src/views/Account/Transactions/transactions.js @@ -7,7 +7,7 @@ import format from '../../../api/format'; import etherscan from '../../../3rdparty/etherscan'; import { Container, IdentityIcon } from '../../../ui'; -import styles from '../style.css'; +import styles from '../account.css'; function formatHash (hash) { if (!hash || hash.length <= 21) { diff --git a/js/src/views/Account/style.css b/js/src/views/Account/account.css similarity index 86% rename from js/src/views/Account/style.css rename to js/src/views/Account/account.css index 6cb3cf988cc..996d699918e 100644 --- a/js/src/views/Account/style.css +++ b/js/src/views/Account/account.css @@ -7,6 +7,15 @@ line-height: 1.618em; } +.floatleft { + float: left; + margin-bottom: 0.5em; +} + +.balances { + clear: both; +} + .right { text-align: right; } diff --git a/js/src/views/Account/account.js b/js/src/views/Account/account.js index 27f4e2d35b6..1f546aa9b0f 100644 --- a/js/src/views/Account/account.js +++ b/js/src/views/Account/account.js @@ -9,7 +9,7 @@ import { Actionbar, Balances, Container, ContainerTitle, Form, FormWrap, InputIn import Transactions from './Transactions'; -import styles from './style.css'; +import styles from './account.css'; const DEFAULT_NAME = 'Unnamed'; @@ -66,25 +66,27 @@ export default class Account extends Component {
- +
} onChange={ this.onEditName } /> - -
{ address }
{ account.txCount.toFormat() } outgoing transactions
+
+
- +
Date: Fri, 2 Sep 2016 14:03:42 +0200 Subject: [PATCH 0310/1062] optimise style imports, named css files --- js/src/modals/AddressBook/AddEntry/addEntry.js | 2 +- js/src/modals/AddressBook/EditEntry/editEntry.js | 2 +- js/src/modals/AddressBook/{style.css => addressBook.css} | 0 js/src/modals/AddressBook/addressBook.js | 2 +- .../AccountDetailsGeth/{style.css => accountDetailsGeth.css} | 0 .../CreateAccount/AccountDetailsGeth/accountDetailsGeth.js | 2 +- js/src/modals/CreateAccount/CreationType/creationType.js | 2 +- js/src/modals/CreateAccount/NewAccount/newAccount.js | 2 +- .../modals/CreateAccount/NewGeth/{style.css => newGeth.css} | 0 js/src/modals/CreateAccount/NewGeth/newGeth.js | 2 +- js/src/modals/CreateAccount/NewImport/newImport.js | 2 +- js/src/modals/CreateAccount/{style.css => createAccount.css} | 0 js/src/modals/Transfer/Complete/complete.js | 2 +- js/src/modals/Transfer/Details/details.js | 2 +- js/src/modals/Transfer/Extras/extras.js | 2 +- js/src/modals/Transfer/{style.css => transfer.css} | 0 js/src/modals/Transfer/transfer.js | 2 +- js/src/ui/Actionbar/{style.css => actionbar.css} | 0 js/src/ui/Actionbar/actionbar.js | 2 +- js/src/ui/Balances/{style.css => balances.css} | 0 js/src/ui/Balances/balances.js | 2 +- js/src/ui/Container/Title/{style.css => title.css} | 0 js/src/ui/Container/Title/title.js | 2 +- js/src/ui/Container/{style.css => container.css} | 0 js/src/ui/Container/container.js | 2 +- js/src/ui/Form/FormWrap/{style.css => formWrap.css} | 0 js/src/ui/Form/FormWrap/formWrap.js | 2 +- js/src/ui/Form/InputAddress/{style.css => inputAddress.css} | 0 js/src/ui/Form/InputAddress/inputAddress.js | 2 +- .../InputAddressSelect/{style.css => inputAddressSelect.css} | 0 js/src/ui/Form/InputAddressSelect/inputAddressSelect.js | 2 +- js/src/ui/Form/InputInline/inputInline.css | 3 +++ js/src/ui/Form/InputInline/inputInline.js | 2 +- js/src/ui/Form/{style.css => form.css} | 4 ---- js/src/ui/Form/form.js | 2 +- 35 files changed, 24 insertions(+), 25 deletions(-) rename js/src/modals/AddressBook/{style.css => addressBook.css} (100%) rename js/src/modals/CreateAccount/AccountDetailsGeth/{style.css => accountDetailsGeth.css} (100%) rename js/src/modals/CreateAccount/NewGeth/{style.css => newGeth.css} (100%) rename js/src/modals/CreateAccount/{style.css => createAccount.css} (100%) rename js/src/modals/Transfer/{style.css => transfer.css} (100%) rename js/src/ui/Actionbar/{style.css => actionbar.css} (100%) rename js/src/ui/Balances/{style.css => balances.css} (100%) rename js/src/ui/Container/Title/{style.css => title.css} (100%) rename js/src/ui/Container/{style.css => container.css} (100%) rename js/src/ui/Form/FormWrap/{style.css => formWrap.css} (100%) rename js/src/ui/Form/InputAddress/{style.css => inputAddress.css} (100%) rename js/src/ui/Form/InputAddressSelect/{style.css => inputAddressSelect.css} (100%) create mode 100644 js/src/ui/Form/InputInline/inputInline.css rename js/src/ui/Form/{style.css => form.css} (82%) diff --git a/js/src/modals/AddressBook/AddEntry/addEntry.js b/js/src/modals/AddressBook/AddEntry/addEntry.js index 78b2490525b..f42e5066d61 100644 --- a/js/src/modals/AddressBook/AddEntry/addEntry.js +++ b/js/src/modals/AddressBook/AddEntry/addEntry.js @@ -7,7 +7,7 @@ import ContentClear from 'material-ui/svg-icons/content/clear'; import { Modal, Form, Input, InputAddress } from '../../../ui'; import { ERRORS, validateAddress, validateName } from '../../../services/validation'; -import styles from '../style.css'; +import styles from '../addressBook.css'; export default class AddEntry extends Component { static contextTypes = { diff --git a/js/src/modals/AddressBook/EditEntry/editEntry.js b/js/src/modals/AddressBook/EditEntry/editEntry.js index 34c034b3e03..c6527a328f7 100644 --- a/js/src/modals/AddressBook/EditEntry/editEntry.js +++ b/js/src/modals/AddressBook/EditEntry/editEntry.js @@ -7,7 +7,7 @@ import ContentClear from 'material-ui/svg-icons/content/clear'; import { Modal, Form, Input, InputAddress } from '../../../ui'; import { validateName } from '../../../services/validation'; -import styles from '../style.css'; +import styles from '../addressBook.css'; export default class EditEntry extends Component { static propTypes = { diff --git a/js/src/modals/AddressBook/style.css b/js/src/modals/AddressBook/addressBook.css similarity index 100% rename from js/src/modals/AddressBook/style.css rename to js/src/modals/AddressBook/addressBook.css diff --git a/js/src/modals/AddressBook/addressBook.js b/js/src/modals/AddressBook/addressBook.js index 291ec94d2b4..b7eeaad585b 100644 --- a/js/src/modals/AddressBook/addressBook.js +++ b/js/src/modals/AddressBook/addressBook.js @@ -10,7 +10,7 @@ import { IdentityIcon, Modal } from '../../ui'; import AddEntry from './AddEntry'; import EditEntry from './EditEntry'; -import styles from './style.css'; +import styles from './addressBook.css'; const editIconStyle = { color: 'rgb(0, 151, 167)', diff --git a/js/src/modals/CreateAccount/AccountDetailsGeth/style.css b/js/src/modals/CreateAccount/AccountDetailsGeth/accountDetailsGeth.css similarity index 100% rename from js/src/modals/CreateAccount/AccountDetailsGeth/style.css rename to js/src/modals/CreateAccount/AccountDetailsGeth/accountDetailsGeth.css diff --git a/js/src/modals/CreateAccount/AccountDetailsGeth/accountDetailsGeth.js b/js/src/modals/CreateAccount/AccountDetailsGeth/accountDetailsGeth.js index e06d9231b0d..39b47f1cb62 100644 --- a/js/src/modals/CreateAccount/AccountDetailsGeth/accountDetailsGeth.js +++ b/js/src/modals/CreateAccount/AccountDetailsGeth/accountDetailsGeth.js @@ -1,6 +1,6 @@ import React, { Component, PropTypes } from 'react'; -import styles from './style.css'; +import styles from './accountDetailsGeth.css'; export default class AccountDetailsGeth extends Component { static propTypes = { diff --git a/js/src/modals/CreateAccount/CreationType/creationType.js b/js/src/modals/CreateAccount/CreationType/creationType.js index 1dd3b025eb4..955880b30f1 100644 --- a/js/src/modals/CreateAccount/CreationType/creationType.js +++ b/js/src/modals/CreateAccount/CreationType/creationType.js @@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'; import { RadioButton, RadioButtonGroup } from 'material-ui/RadioButton'; -import styles from '../style.css'; +import styles from '../createAccount.css'; export default class CreationType extends Component { static propTypes = { diff --git a/js/src/modals/CreateAccount/NewAccount/newAccount.js b/js/src/modals/CreateAccount/NewAccount/newAccount.js index a13a25eecc4..5c1e8c39d4e 100644 --- a/js/src/modals/CreateAccount/NewAccount/newAccount.js +++ b/js/src/modals/CreateAccount/NewAccount/newAccount.js @@ -9,7 +9,7 @@ import { newError } from '../../../ui/Errors'; import Form, { Input } from '../../../ui/Form'; import IdentityIcon from '../../../ui/IdentityIcon'; -import styles from '../style.css'; +import styles from '../createAccount.css'; const ERRORS = { noName: 'you need to specify a valid name for the account', diff --git a/js/src/modals/CreateAccount/NewGeth/style.css b/js/src/modals/CreateAccount/NewGeth/newGeth.css similarity index 100% rename from js/src/modals/CreateAccount/NewGeth/style.css rename to js/src/modals/CreateAccount/NewGeth/newGeth.css diff --git a/js/src/modals/CreateAccount/NewGeth/newGeth.js b/js/src/modals/CreateAccount/NewGeth/newGeth.js index f478bfedf3f..b2ed97d82f8 100644 --- a/js/src/modals/CreateAccount/NewGeth/newGeth.js +++ b/js/src/modals/CreateAccount/NewGeth/newGeth.js @@ -4,7 +4,7 @@ import { Checkbox } from 'material-ui'; import IdentityIcon from '../../../ui/IdentityIcon'; -import styles from './style.css'; +import styles from './newGeth.css'; export default class NewGeth extends Component { static contextTypes = { diff --git a/js/src/modals/CreateAccount/NewImport/newImport.js b/js/src/modals/CreateAccount/NewImport/newImport.js index 1f9f82a98cf..1e2d591bc2b 100644 --- a/js/src/modals/CreateAccount/NewImport/newImport.js +++ b/js/src/modals/CreateAccount/NewImport/newImport.js @@ -6,7 +6,7 @@ import EditorAttachFile from 'material-ui/svg-icons/editor/attach-file'; import Form, { Input } from '../../../ui/Form'; -import styles from '../style.css'; +import styles from '../createAccount.css'; const FAKEPATH = 'C:\\fakepath\\'; const STYLE_HIDDEN = { display: 'none' }; diff --git a/js/src/modals/CreateAccount/style.css b/js/src/modals/CreateAccount/createAccount.css similarity index 100% rename from js/src/modals/CreateAccount/style.css rename to js/src/modals/CreateAccount/createAccount.css diff --git a/js/src/modals/Transfer/Complete/complete.js b/js/src/modals/Transfer/Complete/complete.js index 020f5f1576b..0e2db69e2cb 100644 --- a/js/src/modals/Transfer/Complete/complete.js +++ b/js/src/modals/Transfer/Complete/complete.js @@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'; import LinearProgress from 'material-ui/LinearProgress'; -import styles from '../style.css'; +import styles from '../transfer.css'; export default class Complete extends Component { static propTypes = { diff --git a/js/src/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js index 4a495551423..140051c7857 100644 --- a/js/src/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -4,7 +4,7 @@ import { Checkbox, MenuItem } from 'material-ui'; import Form, { Input, InputAddressSelect, Select } from '../../../ui/Form'; -import styles from '../style.css'; +import styles from '../transfer.css'; const CHECK_STYLE = { position: 'absolute', diff --git a/js/src/modals/Transfer/Extras/extras.js b/js/src/modals/Transfer/Extras/extras.js index c96aeacc0e3..e634d4a4a01 100644 --- a/js/src/modals/Transfer/Extras/extras.js +++ b/js/src/modals/Transfer/Extras/extras.js @@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'; import Form, { Input } from '../../../ui/Form'; -import styles from '../style.css'; +import styles from '../transfer.css'; export default class Extras extends Component { static propTypes = { diff --git a/js/src/modals/Transfer/style.css b/js/src/modals/Transfer/transfer.css similarity index 100% rename from js/src/modals/Transfer/style.css rename to js/src/modals/Transfer/transfer.css diff --git a/js/src/modals/Transfer/transfer.js b/js/src/modals/Transfer/transfer.js index 597e76372c0..21da76311ec 100644 --- a/js/src/modals/Transfer/transfer.js +++ b/js/src/modals/Transfer/transfer.js @@ -16,7 +16,7 @@ import Complete from './Complete'; import Details from './Details'; import Extras from './Extras'; import ERRORS from './errors'; -import styles from './style.css'; +import styles from './transfer.css'; const DEFAULT_GAS = '21000'; const DEFAULT_GASPRICE = '20000000000'; diff --git a/js/src/ui/Actionbar/style.css b/js/src/ui/Actionbar/actionbar.css similarity index 100% rename from js/src/ui/Actionbar/style.css rename to js/src/ui/Actionbar/actionbar.css diff --git a/js/src/ui/Actionbar/actionbar.js b/js/src/ui/Actionbar/actionbar.js index b1dc0c1067c..9f8c4124e71 100644 --- a/js/src/ui/Actionbar/actionbar.js +++ b/js/src/ui/Actionbar/actionbar.js @@ -1,7 +1,7 @@ import React, { Component, PropTypes } from 'react'; import { Toolbar, ToolbarGroup, ToolbarTitle } from 'material-ui/Toolbar'; -import styles from './style.css'; +import styles from './actionbar.css'; export default class Actionbar extends Component { static propTypes = { diff --git a/js/src/ui/Balances/style.css b/js/src/ui/Balances/balances.css similarity index 100% rename from js/src/ui/Balances/style.css rename to js/src/ui/Balances/balances.css diff --git a/js/src/ui/Balances/balances.js b/js/src/ui/Balances/balances.js index 8e080eff093..181cbb19e89 100644 --- a/js/src/ui/Balances/balances.js +++ b/js/src/ui/Balances/balances.js @@ -1,7 +1,7 @@ import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; -import styles from './style.css'; +import styles from './balances.css'; export default class Balances extends Component { static contextTypes = { diff --git a/js/src/ui/Container/Title/style.css b/js/src/ui/Container/Title/title.css similarity index 100% rename from js/src/ui/Container/Title/style.css rename to js/src/ui/Container/Title/title.css diff --git a/js/src/ui/Container/Title/title.js b/js/src/ui/Container/Title/title.js index f27133dd233..c20bce2fd1e 100644 --- a/js/src/ui/Container/Title/title.js +++ b/js/src/ui/Container/Title/title.js @@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'; import { CardTitle } from 'material-ui/Card'; -import styles from './style.css'; +import styles from './title.css'; const TITLE_STYLE = { textTransform: 'uppercase', padding: 0 }; diff --git a/js/src/ui/Container/style.css b/js/src/ui/Container/container.css similarity index 100% rename from js/src/ui/Container/style.css rename to js/src/ui/Container/container.css diff --git a/js/src/ui/Container/container.js b/js/src/ui/Container/container.js index 90de3a69182..765ad298812 100644 --- a/js/src/ui/Container/container.js +++ b/js/src/ui/Container/container.js @@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'; import { Card } from 'material-ui/Card'; -import styles from './style.css'; +import styles from './container.css'; export default class Container extends Component { static propTypes = { diff --git a/js/src/ui/Form/FormWrap/style.css b/js/src/ui/Form/FormWrap/formWrap.css similarity index 100% rename from js/src/ui/Form/FormWrap/style.css rename to js/src/ui/Form/FormWrap/formWrap.css diff --git a/js/src/ui/Form/FormWrap/formWrap.js b/js/src/ui/Form/FormWrap/formWrap.js index ce82e2d5ba6..79e81e79ab2 100644 --- a/js/src/ui/Form/FormWrap/formWrap.js +++ b/js/src/ui/Form/FormWrap/formWrap.js @@ -1,6 +1,6 @@ import React, { Component, PropTypes } from 'react'; -import styles from './style.css'; +import styles from './formWrap.css'; export default class FormWrap extends Component { static propTypes = { diff --git a/js/src/ui/Form/InputAddress/style.css b/js/src/ui/Form/InputAddress/inputAddress.css similarity index 100% rename from js/src/ui/Form/InputAddress/style.css rename to js/src/ui/Form/InputAddress/inputAddress.css diff --git a/js/src/ui/Form/InputAddress/inputAddress.js b/js/src/ui/Form/InputAddress/inputAddress.js index a2924ee2353..2bbd6888394 100644 --- a/js/src/ui/Form/InputAddress/inputAddress.js +++ b/js/src/ui/Form/InputAddress/inputAddress.js @@ -3,7 +3,7 @@ import React, { Component, PropTypes } from 'react'; import Input from '../Input'; import IdentityIcon from '../../IdentityIcon'; -import styles from './style.css'; +import styles from './inputAddress.css'; export default class InputAddress extends Component { static propTypes = { diff --git a/js/src/ui/Form/InputAddressSelect/style.css b/js/src/ui/Form/InputAddressSelect/inputAddressSelect.css similarity index 100% rename from js/src/ui/Form/InputAddressSelect/style.css rename to js/src/ui/Form/InputAddressSelect/inputAddressSelect.css diff --git a/js/src/ui/Form/InputAddressSelect/inputAddressSelect.js b/js/src/ui/Form/InputAddressSelect/inputAddressSelect.js index dbef5a0be91..3c2c68fe3fa 100644 --- a/js/src/ui/Form/InputAddressSelect/inputAddressSelect.js +++ b/js/src/ui/Form/InputAddressSelect/inputAddressSelect.js @@ -5,7 +5,7 @@ import IdentityIcon from '../../IdentityIcon'; import InputAddress from '../InputAddress'; import Select from '../Select'; -import styles from './style.css'; +import styles from './inputAddressSelect.css'; export default class InputAddressSelect extends Component { static contextTypes = { diff --git a/js/src/ui/Form/InputInline/inputInline.css b/js/src/ui/Form/InputInline/inputInline.css new file mode 100644 index 00000000000..4cc74d62d4f --- /dev/null +++ b/js/src/ui/Form/InputInline/inputInline.css @@ -0,0 +1,3 @@ +.inlineedit { + cursor: pointer; +} diff --git a/js/src/ui/Form/InputInline/inputInline.js b/js/src/ui/Form/InputInline/inputInline.js index 8106e2fdbdd..1e5a73ffdd5 100644 --- a/js/src/ui/Form/InputInline/inputInline.js +++ b/js/src/ui/Form/InputInline/inputInline.js @@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'; import Input from '../Input'; -import styles from '../style.css'; +import styles from './inputInline.css'; export default class InputInline extends Component { static propTypes = { diff --git a/js/src/ui/Form/style.css b/js/src/ui/Form/form.css similarity index 82% rename from js/src/ui/Form/style.css rename to js/src/ui/Form/form.css index 8b7af966d47..ee8201e00d7 100644 --- a/js/src/ui/Form/style.css +++ b/js/src/ui/Form/form.css @@ -13,7 +13,3 @@ display: none; opacity: 0; } - -.inlineedit { - cursor: pointer; -} diff --git a/js/src/ui/Form/form.js b/js/src/ui/Form/form.js index 4a826a87665..8468a8097be 100644 --- a/js/src/ui/Form/form.js +++ b/js/src/ui/Form/form.js @@ -1,6 +1,6 @@ import React, { Component, PropTypes } from 'react'; -import styles from './style.css'; +import styles from './form.css'; export default class Form extends Component { static propTypes = { From 82263b90ae68eccaaad70b0c0182cb465e067b52 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 2 Sep 2016 14:16:43 +0200 Subject: [PATCH 0311/1062] get rid of style.css, named styles --- .../AccountSelector/AccountItem/{style.css => accountItem.css} | 0 js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.js | 2 +- .../AccountSelectorText/{style.css => accountSelectorText.css} | 0 js/src/dapps/gavcoin/AccountSelectorText/accountSelectorText.js | 2 +- js/src/dapps/gavcoin/Accounts/{style.css => accounts.css} | 0 js/src/dapps/gavcoin/Accounts/accounts.js | 2 +- js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js | 2 +- js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js | 2 +- js/src/dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js | 2 +- js/src/dapps/gavcoin/Actions/StepComplete/stepComplete.js | 2 +- js/src/dapps/gavcoin/Actions/{style.css => actions.css} | 0 js/src/dapps/gavcoin/Actions/actions.js | 2 +- js/src/dapps/gavcoin/Events/Event/event.js | 2 +- js/src/dapps/gavcoin/Events/{style.css => events.css} | 0 js/src/dapps/gavcoin/Events/events.js | 2 +- js/src/dapps/gavcoin/Loading/{style.css => loading.css} | 0 js/src/dapps/gavcoin/Loading/loading.js | 2 +- js/src/dapps/gavcoin/Status/{style.css => status.css} | 0 js/src/dapps/gavcoin/Status/status.js | 2 +- js/src/dapps/registry/Loading/{style.css => loading.css} | 0 js/src/dapps/registry/Loading/loading.js | 2 +- js/src/dapps/registry/Status/{style.css => status.css} | 0 js/src/dapps/registry/Status/status.js | 2 +- js/src/dapps/tokenreg/Loading/{style.css => loading.css} | 0 js/src/dapps/tokenreg/Loading/loading.js | 2 +- js/src/dapps/tokenreg/Status/{style.css => status.css} | 0 js/src/dapps/tokenreg/Status/status.js | 2 +- js/src/views/Accounts/{style.css => accounts.css} | 0 js/src/views/Accounts/accounts.js | 2 +- js/src/views/Application/Container/container.js | 2 +- js/src/views/Application/DappContainer/dappContainer.js | 2 +- js/src/views/Application/FrameError/frameError.js | 2 +- js/src/views/Application/Status/{style.css => status.css} | 0 js/src/views/Application/Status/status.js | 2 +- js/src/views/Application/TabBar/tabBar.js | 2 +- js/src/views/Application/{style.css => application.css} | 0 js/src/views/Contract/{style.css => contract.css} | 0 js/src/views/Contract/contract.js | 2 +- js/src/views/Contracts/{style.css => contracts.css} | 0 js/src/views/Contracts/contracts.js | 2 +- js/src/views/Dapp/{style.css => dapp.css} | 0 js/src/views/Dapp/dapp.js | 2 +- js/src/views/Dapps/{style.css => dapps.css} | 0 js/src/views/Dapps/dapps.js | 2 +- js/src/views/ParityBar/{style.css => parityBar.css} | 0 js/src/views/ParityBar/parityBar.js | 2 +- 46 files changed, 27 insertions(+), 27 deletions(-) rename js/src/dapps/gavcoin/AccountSelector/AccountItem/{style.css => accountItem.css} (100%) rename js/src/dapps/gavcoin/AccountSelectorText/{style.css => accountSelectorText.css} (100%) rename js/src/dapps/gavcoin/Accounts/{style.css => accounts.css} (100%) rename js/src/dapps/gavcoin/Actions/{style.css => actions.css} (100%) rename js/src/dapps/gavcoin/Events/{style.css => events.css} (100%) rename js/src/dapps/gavcoin/Loading/{style.css => loading.css} (100%) rename js/src/dapps/gavcoin/Status/{style.css => status.css} (100%) rename js/src/dapps/registry/Loading/{style.css => loading.css} (100%) rename js/src/dapps/registry/Status/{style.css => status.css} (100%) rename js/src/dapps/tokenreg/Loading/{style.css => loading.css} (100%) rename js/src/dapps/tokenreg/Status/{style.css => status.css} (100%) rename js/src/views/Accounts/{style.css => accounts.css} (100%) rename js/src/views/Application/Status/{style.css => status.css} (100%) rename js/src/views/Application/{style.css => application.css} (100%) rename js/src/views/Contract/{style.css => contract.css} (100%) rename js/src/views/Contracts/{style.css => contracts.css} (100%) rename js/src/views/Dapp/{style.css => dapp.css} (100%) rename js/src/views/Dapps/{style.css => dapps.css} (100%) rename js/src/views/ParityBar/{style.css => parityBar.css} (100%) diff --git a/js/src/dapps/gavcoin/AccountSelector/AccountItem/style.css b/js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.css similarity index 100% rename from js/src/dapps/gavcoin/AccountSelector/AccountItem/style.css rename to js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.css diff --git a/js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.js b/js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.js index 21e0a7a6632..1db0fba782a 100644 --- a/js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.js +++ b/js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.js @@ -1,6 +1,6 @@ import React, { Component, PropTypes } from 'react'; -import styles from './style.css'; +import styles from './accountItem.css'; const { IdentityIcon } = window.parity.react; diff --git a/js/src/dapps/gavcoin/AccountSelectorText/style.css b/js/src/dapps/gavcoin/AccountSelectorText/accountSelectorText.css similarity index 100% rename from js/src/dapps/gavcoin/AccountSelectorText/style.css rename to js/src/dapps/gavcoin/AccountSelectorText/accountSelectorText.css diff --git a/js/src/dapps/gavcoin/AccountSelectorText/accountSelectorText.js b/js/src/dapps/gavcoin/AccountSelectorText/accountSelectorText.js index 9d0effbc9f6..30f07662159 100644 --- a/js/src/dapps/gavcoin/AccountSelectorText/accountSelectorText.js +++ b/js/src/dapps/gavcoin/AccountSelectorText/accountSelectorText.js @@ -5,7 +5,7 @@ import AccountSelector from '../AccountSelector'; const { IdentityIcon } = window.parity.react; -import styles from './style.css'; +import styles from './accountSelectorText.css'; const NAME_ID = ' '; diff --git a/js/src/dapps/gavcoin/Accounts/style.css b/js/src/dapps/gavcoin/Accounts/accounts.css similarity index 100% rename from js/src/dapps/gavcoin/Accounts/style.css rename to js/src/dapps/gavcoin/Accounts/accounts.css diff --git a/js/src/dapps/gavcoin/Accounts/accounts.js b/js/src/dapps/gavcoin/Accounts/accounts.js index af123f3f627..c24ab8814f2 100644 --- a/js/src/dapps/gavcoin/Accounts/accounts.js +++ b/js/src/dapps/gavcoin/Accounts/accounts.js @@ -4,7 +4,7 @@ import { Chip } from 'material-ui'; const { IdentityIcon } = window.parity.react; -import styles from './style.css'; +import styles from './accounts.css'; export default class Accounts extends Component { static contextTypes = { diff --git a/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js b/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js index 3d0ca3ba8b8..5c12047da6a 100644 --- a/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js +++ b/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js @@ -7,7 +7,7 @@ import AccountSelector from '../../AccountSelector'; import StepComplete from '../StepComplete'; import { ERRORS, validateAccount, validatePositiveNumber } from '../validation'; -import styles from '../style.css'; +import styles from '../actions.css'; const { api } = window.parity; diff --git a/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js b/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js index 1785d8eccce..e81c1e64ddc 100644 --- a/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js +++ b/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js @@ -7,7 +7,7 @@ import AccountSelector from '../../AccountSelector'; import StepComplete from '../StepComplete'; import { ERRORS, validateAccount, validatePositiveNumber } from '../validation'; -import styles from '../style.css'; +import styles from '../actions.css'; const { api } = window.parity; diff --git a/js/src/dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js b/js/src/dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js index 0bf9793ff95..37d301696d6 100644 --- a/js/src/dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js +++ b/js/src/dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js @@ -8,7 +8,7 @@ import AccountSelectorText from '../../AccountSelectorText'; import StepComplete from '../StepComplete'; import { ERRORS, validateAccount, validatePositiveNumber } from '../validation'; -import styles from '../style.css'; +import styles from '../actions.css'; const DIVISOR = 10 ** 6; const NAME_ID = ' '; diff --git a/js/src/dapps/gavcoin/Actions/StepComplete/stepComplete.js b/js/src/dapps/gavcoin/Actions/StepComplete/stepComplete.js index 1bc50475974..2f9bd555d44 100644 --- a/js/src/dapps/gavcoin/Actions/StepComplete/stepComplete.js +++ b/js/src/dapps/gavcoin/Actions/StepComplete/stepComplete.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; -import styles from '../style.css'; +import styles from '../actions.css'; export default class StepComplete extends Component { render () { diff --git a/js/src/dapps/gavcoin/Actions/style.css b/js/src/dapps/gavcoin/Actions/actions.css similarity index 100% rename from js/src/dapps/gavcoin/Actions/style.css rename to js/src/dapps/gavcoin/Actions/actions.css diff --git a/js/src/dapps/gavcoin/Actions/actions.js b/js/src/dapps/gavcoin/Actions/actions.js index c1695ef9e0c..73658d686c5 100644 --- a/js/src/dapps/gavcoin/Actions/actions.js +++ b/js/src/dapps/gavcoin/Actions/actions.js @@ -5,7 +5,7 @@ import ActionAddShoppingCart from 'material-ui/svg-icons/action/add-shopping-car import AvReplay from 'material-ui/svg-icons/av/replay'; import ContentSend from 'material-ui/svg-icons/content/send'; -import styles from './style.css'; +import styles from './actions.css'; export default class Actions extends Component { static propTypes = { diff --git a/js/src/dapps/gavcoin/Events/Event/event.js b/js/src/dapps/gavcoin/Events/Event/event.js index c8987c7ec98..ddd814c18f8 100644 --- a/js/src/dapps/gavcoin/Events/Event/event.js +++ b/js/src/dapps/gavcoin/Events/Event/event.js @@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'; import { formatBlockNumber, formatCoins, formatEth } from '../../format'; -import styles from '../style.css'; +import styles from '../events.css'; const { IdentityIcon } = window.parity.react; diff --git a/js/src/dapps/gavcoin/Events/style.css b/js/src/dapps/gavcoin/Events/events.css similarity index 100% rename from js/src/dapps/gavcoin/Events/style.css rename to js/src/dapps/gavcoin/Events/events.css diff --git a/js/src/dapps/gavcoin/Events/events.js b/js/src/dapps/gavcoin/Events/events.js index e92e7bf74a6..f1102208b68 100644 --- a/js/src/dapps/gavcoin/Events/events.js +++ b/js/src/dapps/gavcoin/Events/events.js @@ -5,7 +5,7 @@ import EventNewTranch from './EventNewTranch'; import EventRefund from './EventRefund'; import EventTransfer from './EventTransfer'; -import styles from './style.css'; +import styles from './events.css'; export default class Events extends Component { static childContextTypes = { diff --git a/js/src/dapps/gavcoin/Loading/style.css b/js/src/dapps/gavcoin/Loading/loading.css similarity index 100% rename from js/src/dapps/gavcoin/Loading/style.css rename to js/src/dapps/gavcoin/Loading/loading.css diff --git a/js/src/dapps/gavcoin/Loading/loading.js b/js/src/dapps/gavcoin/Loading/loading.js index 898eb744019..f6c34086e72 100644 --- a/js/src/dapps/gavcoin/Loading/loading.js +++ b/js/src/dapps/gavcoin/Loading/loading.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import { CircularProgress } from 'material-ui'; -import styles from './style.css'; +import styles from './loading.css'; export default class Loading extends Component { render () { diff --git a/js/src/dapps/gavcoin/Status/style.css b/js/src/dapps/gavcoin/Status/status.css similarity index 100% rename from js/src/dapps/gavcoin/Status/style.css rename to js/src/dapps/gavcoin/Status/status.css diff --git a/js/src/dapps/gavcoin/Status/status.js b/js/src/dapps/gavcoin/Status/status.js index da87c508fc5..f93ebf5ece0 100644 --- a/js/src/dapps/gavcoin/Status/status.js +++ b/js/src/dapps/gavcoin/Status/status.js @@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'; import { formatBlockNumber, formatCoins, formatEth } from '../format'; -import styles from './style.css'; +import styles from './status.css'; export default class Status extends Component { static propTypes = { diff --git a/js/src/dapps/registry/Loading/style.css b/js/src/dapps/registry/Loading/loading.css similarity index 100% rename from js/src/dapps/registry/Loading/style.css rename to js/src/dapps/registry/Loading/loading.css diff --git a/js/src/dapps/registry/Loading/loading.js b/js/src/dapps/registry/Loading/loading.js index b8eb619a1d9..186cb3833f4 100644 --- a/js/src/dapps/registry/Loading/loading.js +++ b/js/src/dapps/registry/Loading/loading.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; -import styles from './style.css'; +import styles from './loading.css'; export default class Loading extends Component { render () { diff --git a/js/src/dapps/registry/Status/style.css b/js/src/dapps/registry/Status/status.css similarity index 100% rename from js/src/dapps/registry/Status/style.css rename to js/src/dapps/registry/Status/status.css diff --git a/js/src/dapps/registry/Status/status.js b/js/src/dapps/registry/Status/status.js index 3df7fa40f84..dad3f7f02cc 100644 --- a/js/src/dapps/registry/Status/status.js +++ b/js/src/dapps/registry/Status/status.js @@ -1,6 +1,6 @@ import React, { Component, PropTypes } from 'react'; -import styles from './style.css'; +import styles from './status.css'; const { api } = window.parity; diff --git a/js/src/dapps/tokenreg/Loading/style.css b/js/src/dapps/tokenreg/Loading/loading.css similarity index 100% rename from js/src/dapps/tokenreg/Loading/style.css rename to js/src/dapps/tokenreg/Loading/loading.css diff --git a/js/src/dapps/tokenreg/Loading/loading.js b/js/src/dapps/tokenreg/Loading/loading.js index b8eb619a1d9..186cb3833f4 100644 --- a/js/src/dapps/tokenreg/Loading/loading.js +++ b/js/src/dapps/tokenreg/Loading/loading.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; -import styles from './style.css'; +import styles from './loading.css'; export default class Loading extends Component { render () { diff --git a/js/src/dapps/tokenreg/Status/style.css b/js/src/dapps/tokenreg/Status/status.css similarity index 100% rename from js/src/dapps/tokenreg/Status/style.css rename to js/src/dapps/tokenreg/Status/status.css diff --git a/js/src/dapps/tokenreg/Status/status.js b/js/src/dapps/tokenreg/Status/status.js index b574b56df04..4b27e84edd6 100644 --- a/js/src/dapps/tokenreg/Status/status.js +++ b/js/src/dapps/tokenreg/Status/status.js @@ -1,6 +1,6 @@ import React, { Component, PropTypes } from 'react'; -import styles from './style.css'; +import styles from './status.css'; const { api } = window.parity; diff --git a/js/src/views/Accounts/style.css b/js/src/views/Accounts/accounts.css similarity index 100% rename from js/src/views/Accounts/style.css rename to js/src/views/Accounts/accounts.css diff --git a/js/src/views/Accounts/accounts.js b/js/src/views/Accounts/accounts.js index 96f84eaeca5..87d9fca45d2 100644 --- a/js/src/views/Accounts/accounts.js +++ b/js/src/views/Accounts/accounts.js @@ -7,7 +7,7 @@ import Summary from './Summary'; import { AddressBook, CreateAccount } from '../../modals'; import { Actionbar, Tooltip } from '../../ui'; -import styles from './style.css'; +import styles from './accounts.css'; export default class Accounts extends Component { static contextTypes = { diff --git a/js/src/views/Application/Container/container.js b/js/src/views/Application/Container/container.js index fcf4047fc25..360f3e32f27 100644 --- a/js/src/views/Application/Container/container.js +++ b/js/src/views/Application/Container/container.js @@ -6,7 +6,7 @@ import { Errors, Tooltips } from '../../../ui'; import Status from '../Status'; import TabBar from '../TabBar'; -import styles from '../style.css'; +import styles from '../application.css'; export default class Container extends Component { static propTypes = { diff --git a/js/src/views/Application/DappContainer/dappContainer.js b/js/src/views/Application/DappContainer/dappContainer.js index 7b4d6fb1cf3..624cb647b81 100644 --- a/js/src/views/Application/DappContainer/dappContainer.js +++ b/js/src/views/Application/DappContainer/dappContainer.js @@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'; import ParityBar from '../../ParityBar'; -import styles from '../style.css'; +import styles from '../application.css'; export default class DappContainer extends Component { static propTypes = { diff --git a/js/src/views/Application/FrameError/frameError.js b/js/src/views/Application/FrameError/frameError.js index ed3d2b8c154..65c7dd35777 100644 --- a/js/src/views/Application/FrameError/frameError.js +++ b/js/src/views/Application/FrameError/frameError.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; -import styles from '../style.css'; +import styles from '../application.css'; export default class FrameError extends Component { render () { diff --git a/js/src/views/Application/Status/style.css b/js/src/views/Application/Status/status.css similarity index 100% rename from js/src/views/Application/Status/style.css rename to js/src/views/Application/Status/status.css diff --git a/js/src/views/Application/Status/status.js b/js/src/views/Application/Status/status.js index 10dbf6e4d45..df765bb24aa 100644 --- a/js/src/views/Application/Status/status.js +++ b/js/src/views/Application/Status/status.js @@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; -import styles from './style.css'; +import styles from './status.css'; class Status extends Component { static propTypes = { diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index 1b72b19ff66..9b5a8dfa3d7 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -9,7 +9,7 @@ import NavigationApps from 'material-ui/svg-icons/navigation/apps'; import { Tooltip } from '../../../ui'; -import styles from '../style.css'; +import styles from '../application.css'; import imagesParitybar from '../../../images/paritybar.png'; export default class TabBar extends Component { diff --git a/js/src/views/Application/style.css b/js/src/views/Application/application.css similarity index 100% rename from js/src/views/Application/style.css rename to js/src/views/Application/application.css diff --git a/js/src/views/Contract/style.css b/js/src/views/Contract/contract.css similarity index 100% rename from js/src/views/Contract/style.css rename to js/src/views/Contract/contract.css diff --git a/js/src/views/Contract/contract.js b/js/src/views/Contract/contract.js index 82ef117a043..099b2d4b142 100644 --- a/js/src/views/Contract/contract.js +++ b/js/src/views/Contract/contract.js @@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'; import Container from '../../ui/Container'; -import styles from './style.css'; +import styles from './contract.css'; function nicename (name) { return name.split(/(?=[A-Z])/).join(' '); diff --git a/js/src/views/Contracts/style.css b/js/src/views/Contracts/contracts.css similarity index 100% rename from js/src/views/Contracts/style.css rename to js/src/views/Contracts/contracts.css diff --git a/js/src/views/Contracts/contracts.js b/js/src/views/Contracts/contracts.js index b73d960d0a2..a81b92546ad 100644 --- a/js/src/views/Contracts/contracts.js +++ b/js/src/views/Contracts/contracts.js @@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'; import Summary from './Summary'; -import styles from './style.css'; +import styles from './contracts.css'; export default class Contracts extends Component { static contextTypes = { diff --git a/js/src/views/Dapp/style.css b/js/src/views/Dapp/dapp.css similarity index 100% rename from js/src/views/Dapp/style.css rename to js/src/views/Dapp/dapp.css diff --git a/js/src/views/Dapp/dapp.js b/js/src/views/Dapp/dapp.js index 43e631be82d..abe6292b093 100644 --- a/js/src/views/Dapp/dapp.js +++ b/js/src/views/Dapp/dapp.js @@ -1,6 +1,6 @@ import React, { Component, PropTypes } from 'react'; -import styles from './style.css'; +import styles from './dapp.css'; export default class Dapp extends Component { static propTypes = { diff --git a/js/src/views/Dapps/style.css b/js/src/views/Dapps/dapps.css similarity index 100% rename from js/src/views/Dapps/style.css rename to js/src/views/Dapps/dapps.css diff --git a/js/src/views/Dapps/dapps.js b/js/src/views/Dapps/dapps.js index 72526f557ab..a319f9cd062 100644 --- a/js/src/views/Dapps/dapps.js +++ b/js/src/views/Dapps/dapps.js @@ -4,7 +4,7 @@ import { Actionbar } from '../../ui'; import Summary from './Summary'; -import styles from './style.css'; +import styles from './dapps.css'; export default class Dapps extends Component { static contextTypes = { diff --git a/js/src/views/ParityBar/style.css b/js/src/views/ParityBar/parityBar.css similarity index 100% rename from js/src/views/ParityBar/style.css rename to js/src/views/ParityBar/parityBar.css diff --git a/js/src/views/ParityBar/parityBar.js b/js/src/views/ParityBar/parityBar.js index 4d10026a7e5..74e9f426838 100644 --- a/js/src/views/ParityBar/parityBar.js +++ b/js/src/views/ParityBar/parityBar.js @@ -4,7 +4,7 @@ import { IconButton } from 'material-ui'; import ActionSwapVert from 'material-ui/svg-icons/action/swap-vert'; import imagesParitybar from '../../images/paritybar.png'; -import styles from './style.css'; +import styles from './parityBar.css'; export default class ParityBar extends Component { render () { From cb1fadfa59eece6a6b7ce30b2eefd62e3493c9b0 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 2 Sep 2016 14:18:56 +0200 Subject: [PATCH 0312/1062] get rid of style.css, names styles --- js/src/ui/IdentityIcon/{style.css => identityIcon.css} | 0 js/src/ui/IdentityIcon/identityIcon.js | 2 +- js/src/ui/Modal/ModalSteps/{style.css => modalSteps.css} | 0 js/src/ui/Modal/ModalSteps/modalSteps.js | 2 +- js/src/ui/Tooltips/Tooltip/tooltip.js | 2 +- js/src/ui/Tooltips/{style.css => tooltips.css} | 0 js/src/ui/Tooltips/tooltips.js | 2 +- 7 files changed, 4 insertions(+), 4 deletions(-) rename js/src/ui/IdentityIcon/{style.css => identityIcon.css} (100%) rename js/src/ui/Modal/ModalSteps/{style.css => modalSteps.css} (100%) rename js/src/ui/Tooltips/{style.css => tooltips.css} (100%) diff --git a/js/src/ui/IdentityIcon/style.css b/js/src/ui/IdentityIcon/identityIcon.css similarity index 100% rename from js/src/ui/IdentityIcon/style.css rename to js/src/ui/IdentityIcon/identityIcon.css diff --git a/js/src/ui/IdentityIcon/identityIcon.js b/js/src/ui/IdentityIcon/identityIcon.js index 7990103b94c..4d3e10daafa 100644 --- a/js/src/ui/IdentityIcon/identityIcon.js +++ b/js/src/ui/IdentityIcon/identityIcon.js @@ -1,7 +1,7 @@ import React, { Component, PropTypes } from 'react'; import blockies from 'blockies'; -import styles from './style.css'; +import styles from './identityIcon.css'; export default class IdentityIcon extends Component { static contextTypes = { diff --git a/js/src/ui/Modal/ModalSteps/style.css b/js/src/ui/Modal/ModalSteps/modalSteps.css similarity index 100% rename from js/src/ui/Modal/ModalSteps/style.css rename to js/src/ui/Modal/ModalSteps/modalSteps.css diff --git a/js/src/ui/Modal/ModalSteps/modalSteps.js b/js/src/ui/Modal/ModalSteps/modalSteps.js index 70594e6848c..967c4ef2936 100644 --- a/js/src/ui/Modal/ModalSteps/modalSteps.js +++ b/js/src/ui/Modal/ModalSteps/modalSteps.js @@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'; import { Step, Stepper, StepLabel } from 'material-ui/Stepper'; -import styles from './style.css'; +import styles from './modalSteps.css'; export default class ModalSteps extends Component { static propTypes = { diff --git a/js/src/ui/Tooltips/Tooltip/tooltip.js b/js/src/ui/Tooltips/Tooltip/tooltip.js index bd15303c30c..fd471ef92ba 100644 --- a/js/src/ui/Tooltips/Tooltip/tooltip.js +++ b/js/src/ui/Tooltips/Tooltip/tooltip.js @@ -8,7 +8,7 @@ import NavigationArrowForward from 'material-ui/svg-icons/navigation/arrow-forwa import { newTooltip, nextTooltip, closeTooltips } from '../actions'; -import styles from '../style.css'; +import styles from '../tooltips.css'; let tooltipId = 0; diff --git a/js/src/ui/Tooltips/style.css b/js/src/ui/Tooltips/tooltips.css similarity index 100% rename from js/src/ui/Tooltips/style.css rename to js/src/ui/Tooltips/tooltips.css diff --git a/js/src/ui/Tooltips/tooltips.js b/js/src/ui/Tooltips/tooltips.js index 4c8daa874a1..5f84c2f7790 100644 --- a/js/src/ui/Tooltips/tooltips.js +++ b/js/src/ui/Tooltips/tooltips.js @@ -4,7 +4,7 @@ import { bindActionCreators } from 'redux'; import { nextTooltip } from './actions'; -import styles from './style.css'; +import styles from './tooltips.css'; class Tooltips extends Component { static propTypes = { From ae213c3745a9f3136ef272b91b9258ce7df9e0cc Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 2 Sep 2016 16:34:19 +0200 Subject: [PATCH 0313/1062] all used components by the signer included --- js/src/index.js | 2 +- js/src/views/Signer-old/app.js | 59 ------ js/src/views/Signer-old/app.spec.js | 0 js/src/views/Signer-old/index.css | 54 ------ js/src/views/Signer-old/index.html | 14 -- js/src/views/Signer-old/index.js | 16 -- js/src/views/Signer/actions/requests.js | 4 +- .../Account/Account.css | 0 .../Account/Account.js | 6 +- .../Account/index.js | 0 .../AccountLink/AccountLink.css | 0 .../AccountLink/AccountLink.js | 0 .../AccountLink/index.js | 0 .../Signer/components/Offline/Offline.js | 33 ---- .../views/Signer/components/Offline/index.js | 1 - .../RequestFinishedWeb3.js | 0 .../RequestFinishedWeb3/index.js | 0 .../RequestPendingWeb3/RequestPendingWeb3.js | 1 - .../RequestPendingWeb3/index.js | 0 .../Signer/components/Requests/Requests.css | 7 - .../Signer/components/Requests/Requests.js | 104 ----------- .../views/Signer/components/Requests/index.js | 1 - .../SignRequest/SignRequest.css | 0 .../SignRequest/SignRequest.js | 0 .../SignRequest/index.js | 0 .../SignRequestWeb3/SignRequestWeb3.js | 0 .../SignRequestWeb3/index.js | 0 .../ToastrContainer/ToastrContainer.js | 3 - .../TransactionFinished.css | 0 .../TransactionFinished.js | 0 .../TransactionFinished/index.js | 0 .../TransactionFinishedWeb3.js | 0 .../TransactionFinishedWeb3/index.js | 0 .../TransactionMainDetails.css | 0 .../TransactionMainDetails.js | 0 .../TransactionMainDetails/index.js | 0 .../TransactionPending/TransactionPending.css | 0 .../TransactionPending/TransactionPending.js | 0 .../TransactionPending/index.js | 0 .../TransactionPendingForm.css | 0 .../TransactionPendingForm.js | 0 .../TransactionPendingForm/index.js | 0 .../TransactionPendingFormConfirm.css | 0 .../TransactionPendingFormConfirm.js | 0 .../TransactionPendingFormConfirm/index.js | 0 .../TransactionPendingFormReject.css | 0 .../TransactionPendingFormReject.js | 0 .../TransactionPendingFormReject/index.js | 0 .../TransactionPendingWeb3.js | 0 .../TransactionPendingWeb3/index.js | 0 .../TxHashLink/TxHashLink.js | 0 .../TxHashLink/index.js | 0 .../components/UnAuthorized/UnAuthorized.js | 110 ----------- .../Signer/components/UnAuthorized/index.js | 1 - .../Web3Compositor/Web3Compositor.js | 0 .../Web3Compositor/index.js | 0 .../Web3Provider/Web3Provider.js | 0 .../Web3Provider/index.js | 0 .../constants/constants.js | 0 js/src/views/Signer/components/index.js | 5 + .../Web3WebSocketProvider.js | 0 .../util/Web3WebSocketProvider/index.js | 0 .../util/account.js | 0 .../util/logger.js | 0 .../util/react.js | 0 .../util/toastr.js | 0 .../util/toastr.spec.js | 0 .../util/transaction.js | 0 .../util/transaction.spec.js | 0 .../util/util.js | 0 .../util/web3.extensions.js | 0 .../containers/OfflinePage/OfflinePage.js | 27 ++- .../containers/RequestsPage/RequestsPage.css | 7 + .../containers/RequestsPage/RequestsPage.js | 95 +++++++++- js/src/views/Signer/containers/Root/Root.js | 2 +- .../UnAuthorizedPage/UnAuthorizedPage.css} | 0 .../UnAuthorizedPage/UnAuthorizedPage.js | 101 +++++++++- .../AccountWeb3/AccountWeb3.js | 61 ------ .../dappscomponents/AccountWeb3/index.js | 1 - .../AnimateChildren/AnimateChildren.css | 39 ---- .../AnimateChildren/AnimateChildren.js | 49 ----- .../dappscomponents/AnimateChildren/index.js | 1 - .../dappscomponents/Identicon/Identicon.css | 7 - .../dappscomponents/Identicon/Identicon.js | 57 ------ .../Signer/dappscomponents/Identicon/index.js | 1 - .../RpcAutoComplete/RpcAutoComplete.js | 37 ---- .../dappscomponents/RpcAutoComplete/index.js | 1 - .../Signer/dappscomponents/Toast/Toast.css | 49 ----- .../Signer/dappscomponents/Toast/Toast.js | 61 ------ .../Signer/dappscomponents/Toast/index.js | 1 - .../Signer/dappscomponents/Toastr/Toastr.css | 6 - .../Signer/dappscomponents/Toastr/Toastr.js | 37 ---- .../Signer/dappscomponents/Toastr/index.js | 1 - .../Signer/dappscomponents/actions/toastr.js | 6 - .../dappscomponents/docs/actions/toastr.js | 5 - .../dappscomponents/docs/chromeExtension.css | 4 - .../dappscomponents/docs/components.data.js | 11 -- .../docs/components/Header/Header.css | 4 - .../docs/components/Header/Header.js | 39 ---- .../docs/components/Header/index.js | 1 - .../AccountLinkPage/AccountLinkPage.css | 16 -- .../AccountLinkPage/AccountLinkPage.data.js | 10 - .../AccountLinkPage/AccountLinkPage.js | 41 ----- .../docs/containers/AccountLinkPage/index.js | 1 - .../containers/AccountPage/AccountPage.css | 16 -- .../AccountPage/AccountPage.data.js | 16 -- .../containers/AccountPage/AccountPage.js | 41 ----- .../docs/containers/AccountPage/index.js | 1 - .../IdenticonPage/IdenticonPage.css | 16 -- .../IdenticonPage/IdenticonPage.data.js | 10 - .../containers/IdenticonPage/IdenticonPage.js | 39 ---- .../docs/containers/IdenticonPage/index.js | 1 - .../docs/containers/Root/Root.css | 7 - .../docs/containers/Root/Root.js | 28 --- .../docs/containers/Root/index.js | 1 - .../RpcAutoCompletePage.js | 40 ---- .../containers/RpcAutoCompletePage/index.js | 1 - .../docs/containers/ToastPage/ToastPage.css | 4 - .../containers/ToastPage/ToastPage.data.js | 22 --- .../docs/containers/ToastPage/ToastPage.js | 31 ---- .../docs/containers/ToastPage/index.js | 1 - .../TransactionFinishedPage.css | 0 .../TransactionFinishedPage.js | 33 ---- .../TransactionFinishedPage/index.js | 1 - .../TransactionPendingFormPage.js | 72 -------- .../TransactionPendingFormPage/index.js | 1 - .../TransactionPendingPage.css | 0 .../TransactionPendingPage.js | 79 -------- .../TransactionPendingPage/index.js | 1 - .../TransactionPendingWeb3Page.css | 0 .../TransactionPendingWeb3Page.js | 79 -------- .../TransactionPendingWeb3Page/index.js | 1 - .../containers/WelcomePage/WelcomePage.js | 17 -- .../docs/containers/WelcomePage/index.js | 1 - .../views/Signer/dappscomponents/docs/docs.js | 42 ----- .../Signer/dappscomponents/docs/index.html | 12 -- .../dappscomponents/docs/middlewares/index.js | 1 - .../docs/middlewares/logger.js | 19 -- .../docs/middlewares/middlewares.js | 13 -- .../docs/middlewares/toastr.js | 53 ------ .../dappscomponents/docs/reducers/index.js | 1 - .../dappscomponents/docs/reducers/logger.js | 18 -- .../dappscomponents/docs/reducers/reducers.js | 10 - .../dappscomponents/docs/reducers/toastr.js | 26 --- .../dappscomponents/docs/routes/index.js | 1 - .../dappscomponents/docs/routes/routes.js | 46 ----- .../docs/store/configureStore.js | 24 --- .../dappscomponents/docs/store/index.js | 1 - .../dappscomponents/docs/transactions.data.js | 63 ------- js/src/views/Signer/dappscomponents/index.js | 24 --- .../Signer/dappscomponents/index.spec.js | 10 - .../dappscomponents/middlewares/Logger.js | 29 --- .../dappscomponents/middlewares/Toastr.js | 65 ------- .../middlewares/Toastr.spec.js | 174 ------------------ .../Signer/dappscomponents/reducers/logger.js | 15 -- .../Signer/dappscomponents/reducers/toastr.js | 26 --- 156 files changed, 233 insertions(+), 2200 deletions(-) delete mode 100644 js/src/views/Signer-old/app.js delete mode 100644 js/src/views/Signer-old/app.spec.js delete mode 100644 js/src/views/Signer-old/index.css delete mode 100644 js/src/views/Signer-old/index.html delete mode 100644 js/src/views/Signer-old/index.js rename js/src/views/Signer/{dappscomponents => components}/Account/Account.css (100%) rename js/src/views/Signer/{dappscomponents => components}/Account/Account.js (92%) rename js/src/views/Signer/{dappscomponents => components}/Account/index.js (100%) rename js/src/views/Signer/{dappscomponents => components}/AccountLink/AccountLink.css (100%) rename js/src/views/Signer/{dappscomponents => components}/AccountLink/AccountLink.js (100%) rename js/src/views/Signer/{dappscomponents => components}/AccountLink/index.js (100%) delete mode 100644 js/src/views/Signer/components/Offline/Offline.js delete mode 100644 js/src/views/Signer/components/Offline/index.js rename js/src/views/Signer/{dappscomponents => components}/RequestFinishedWeb3/RequestFinishedWeb3.js (100%) rename js/src/views/Signer/{dappscomponents => components}/RequestFinishedWeb3/index.js (100%) rename js/src/views/Signer/{dappscomponents => components}/RequestPendingWeb3/RequestPendingWeb3.js (99%) rename js/src/views/Signer/{dappscomponents => components}/RequestPendingWeb3/index.js (100%) delete mode 100644 js/src/views/Signer/components/Requests/Requests.css delete mode 100644 js/src/views/Signer/components/Requests/Requests.js delete mode 100644 js/src/views/Signer/components/Requests/index.js rename js/src/views/Signer/{dappscomponents => components}/SignRequest/SignRequest.css (100%) rename js/src/views/Signer/{dappscomponents => components}/SignRequest/SignRequest.js (100%) rename js/src/views/Signer/{dappscomponents => components}/SignRequest/index.js (100%) rename js/src/views/Signer/{dappscomponents => components}/SignRequestWeb3/SignRequestWeb3.js (100%) rename js/src/views/Signer/{dappscomponents => components}/SignRequestWeb3/index.js (100%) rename js/src/views/Signer/{dappscomponents => components}/TransactionFinished/TransactionFinished.css (100%) rename js/src/views/Signer/{dappscomponents => components}/TransactionFinished/TransactionFinished.js (100%) rename js/src/views/Signer/{dappscomponents => components}/TransactionFinished/index.js (100%) rename js/src/views/Signer/{dappscomponents => components}/TransactionFinishedWeb3/TransactionFinishedWeb3.js (100%) rename js/src/views/Signer/{dappscomponents => components}/TransactionFinishedWeb3/index.js (100%) rename js/src/views/Signer/{dappscomponents => components}/TransactionMainDetails/TransactionMainDetails.css (100%) rename js/src/views/Signer/{dappscomponents => components}/TransactionMainDetails/TransactionMainDetails.js (100%) rename js/src/views/Signer/{dappscomponents => components}/TransactionMainDetails/index.js (100%) rename js/src/views/Signer/{dappscomponents => components}/TransactionPending/TransactionPending.css (100%) rename js/src/views/Signer/{dappscomponents => components}/TransactionPending/TransactionPending.js (100%) rename js/src/views/Signer/{dappscomponents => components}/TransactionPending/index.js (100%) rename js/src/views/Signer/{dappscomponents => components}/TransactionPendingForm/TransactionPendingForm.css (100%) rename js/src/views/Signer/{dappscomponents => components}/TransactionPendingForm/TransactionPendingForm.js (100%) rename js/src/views/Signer/{dappscomponents => components}/TransactionPendingForm/index.js (100%) rename js/src/views/Signer/{dappscomponents => components}/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css (100%) rename js/src/views/Signer/{dappscomponents => components}/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js (100%) rename js/src/views/Signer/{dappscomponents => components}/TransactionPendingFormConfirm/index.js (100%) rename js/src/views/Signer/{dappscomponents => components}/TransactionPendingFormReject/TransactionPendingFormReject.css (100%) rename js/src/views/Signer/{dappscomponents => components}/TransactionPendingFormReject/TransactionPendingFormReject.js (100%) rename js/src/views/Signer/{dappscomponents => components}/TransactionPendingFormReject/index.js (100%) rename js/src/views/Signer/{dappscomponents => components}/TransactionPendingWeb3/TransactionPendingWeb3.js (100%) rename js/src/views/Signer/{dappscomponents => components}/TransactionPendingWeb3/index.js (100%) rename js/src/views/Signer/{dappscomponents => components}/TxHashLink/TxHashLink.js (100%) rename js/src/views/Signer/{dappscomponents => components}/TxHashLink/index.js (100%) delete mode 100644 js/src/views/Signer/components/UnAuthorized/UnAuthorized.js delete mode 100644 js/src/views/Signer/components/UnAuthorized/index.js rename js/src/views/Signer/{dappscomponents => components}/Web3Compositor/Web3Compositor.js (100%) rename js/src/views/Signer/{dappscomponents => components}/Web3Compositor/index.js (100%) rename js/src/views/Signer/{dappscomponents => components}/Web3Provider/Web3Provider.js (100%) rename js/src/views/Signer/{dappscomponents => components}/Web3Provider/index.js (100%) rename js/src/views/Signer/{dappscomponents => components}/constants/constants.js (100%) create mode 100644 js/src/views/Signer/components/index.js rename js/src/views/Signer/{dappscomponents => components}/util/Web3WebSocketProvider/Web3WebSocketProvider.js (100%) rename js/src/views/Signer/{dappscomponents => components}/util/Web3WebSocketProvider/index.js (100%) rename js/src/views/Signer/{dappscomponents => components}/util/account.js (100%) rename js/src/views/Signer/{dappscomponents => components}/util/logger.js (100%) rename js/src/views/Signer/{dappscomponents => components}/util/react.js (100%) rename js/src/views/Signer/{dappscomponents => components}/util/toastr.js (100%) rename js/src/views/Signer/{dappscomponents => components}/util/toastr.spec.js (100%) rename js/src/views/Signer/{dappscomponents => components}/util/transaction.js (100%) rename js/src/views/Signer/{dappscomponents => components}/util/transaction.spec.js (100%) rename js/src/views/Signer/{dappscomponents => components}/util/util.js (100%) rename js/src/views/Signer/{dappscomponents => components}/util/web3.extensions.js (100%) rename js/src/views/Signer/{components/UnAuthorized/UnAuthorized.css => containers/UnAuthorizedPage/UnAuthorizedPage.css} (100%) delete mode 100644 js/src/views/Signer/dappscomponents/AccountWeb3/AccountWeb3.js delete mode 100644 js/src/views/Signer/dappscomponents/AccountWeb3/index.js delete mode 100644 js/src/views/Signer/dappscomponents/AnimateChildren/AnimateChildren.css delete mode 100644 js/src/views/Signer/dappscomponents/AnimateChildren/AnimateChildren.js delete mode 100644 js/src/views/Signer/dappscomponents/AnimateChildren/index.js delete mode 100644 js/src/views/Signer/dappscomponents/Identicon/Identicon.css delete mode 100644 js/src/views/Signer/dappscomponents/Identicon/Identicon.js delete mode 100644 js/src/views/Signer/dappscomponents/Identicon/index.js delete mode 100644 js/src/views/Signer/dappscomponents/RpcAutoComplete/RpcAutoComplete.js delete mode 100644 js/src/views/Signer/dappscomponents/RpcAutoComplete/index.js delete mode 100644 js/src/views/Signer/dappscomponents/Toast/Toast.css delete mode 100644 js/src/views/Signer/dappscomponents/Toast/Toast.js delete mode 100644 js/src/views/Signer/dappscomponents/Toast/index.js delete mode 100644 js/src/views/Signer/dappscomponents/Toastr/Toastr.css delete mode 100644 js/src/views/Signer/dappscomponents/Toastr/Toastr.js delete mode 100644 js/src/views/Signer/dappscomponents/Toastr/index.js delete mode 100644 js/src/views/Signer/dappscomponents/actions/toastr.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/actions/toastr.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/chromeExtension.css delete mode 100644 js/src/views/Signer/dappscomponents/docs/components.data.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/components/Header/Header.css delete mode 100644 js/src/views/Signer/dappscomponents/docs/components/Header/Header.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/components/Header/index.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/AccountLinkPage.css delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/AccountLinkPage.data.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/AccountLinkPage.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/index.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/AccountPage/AccountPage.css delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/AccountPage/AccountPage.data.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/AccountPage/AccountPage.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/AccountPage/index.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/IdenticonPage.css delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/IdenticonPage.data.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/IdenticonPage.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/index.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/Root/Root.css delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/Root/Root.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/Root/index.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/RpcAutoCompletePage/RpcAutoCompletePage.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/RpcAutoCompletePage/index.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/ToastPage/ToastPage.css delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/ToastPage/ToastPage.data.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/ToastPage/ToastPage.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/ToastPage/index.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/TransactionFinishedPage/TransactionFinishedPage.css delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/TransactionFinishedPage/TransactionFinishedPage.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/TransactionFinishedPage/index.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingFormPage/TransactionPendingFormPage.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingFormPage/index.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingPage/TransactionPendingPage.css delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingPage/TransactionPendingPage.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingPage/index.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingWeb3Page/TransactionPendingWeb3Page.css delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingWeb3Page/TransactionPendingWeb3Page.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingWeb3Page/index.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/WelcomePage/WelcomePage.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/containers/WelcomePage/index.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/docs.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/index.html delete mode 100644 js/src/views/Signer/dappscomponents/docs/middlewares/index.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/middlewares/logger.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/middlewares/middlewares.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/middlewares/toastr.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/reducers/index.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/reducers/logger.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/reducers/reducers.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/reducers/toastr.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/routes/index.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/routes/routes.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/store/configureStore.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/store/index.js delete mode 100644 js/src/views/Signer/dappscomponents/docs/transactions.data.js delete mode 100644 js/src/views/Signer/dappscomponents/index.js delete mode 100644 js/src/views/Signer/dappscomponents/index.spec.js delete mode 100644 js/src/views/Signer/dappscomponents/middlewares/Logger.js delete mode 100644 js/src/views/Signer/dappscomponents/middlewares/Toastr.js delete mode 100644 js/src/views/Signer/dappscomponents/middlewares/Toastr.spec.js delete mode 100644 js/src/views/Signer/dappscomponents/reducers/logger.js delete mode 100644 js/src/views/Signer/dappscomponents/reducers/toastr.js diff --git a/js/src/index.js b/js/src/index.js index 84dbdb20a5d..5e0cecb9873 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -22,7 +22,7 @@ import Signer from './views/Signer/containers/Root'; import signerMiddlewares from './views/Signer/middlewares'; import { signer as signerReducer, toastr as toastrReducer, requests as requestsReducer } from './views/Signer/reducers'; import Web3 from 'web3'; -import { Web3Provider, web3Extension } from './views/Signer/dappscomponents'; +import { Web3Provider, web3Extension } from './views/Signer/components'; import { WebSocketsProvider, Ws } from './views/Signer/utils'; import { SignerDataProvider, WsDataProvider } from './views/Signer/providers'; diff --git a/js/src/views/Signer-old/app.js b/js/src/views/Signer-old/app.js deleted file mode 100644 index f1aef211150..00000000000 --- a/js/src/views/Signer-old/app.js +++ /dev/null @@ -1,59 +0,0 @@ -import 'babel-polyfill'; - -import React from 'react'; -import { Provider } from 'react-redux'; -import ReactDOM from 'react-dom'; - -// Needed for onTouchTap -// http://stackoverflow.com/a/34015469/988941 -import injectTapEventPlugin from 'react-tap-event-plugin'; - -import Web3 from 'web3'; -import { Web3Provider, MuiThemeProvider, web3Extension } from 'dapps-react-components'; - -import 'reset-css/reset.css'; -import './index.css'; -import './utils/logger'; - -import Ws from './utils/Ws'; -import WebSocketsProvider from './utils/Web3WebSockets'; - -import WsDataProvider from './providers/wsProvider'; -import AppDataProvider from './providers/appProvider'; - -import { updateUrl } from './actions/app'; -import middlewares from './middlewares'; -import createStore from './store/configureStore'; -import Routes from './routes'; - -export default function app (token, setToken, parityUrl) { - const ws = new Ws(parityUrl); - const web3 = new Web3(new WebSocketsProvider(ws)); - - web3Extension(web3).map(extension => web3._extend(extension)); - - // TODO [todr] Extend and use Web3 instead of ws directly! - const store = createStore(middlewares(ws, setToken)); - store.dispatch(updateUrl(parityUrl)); - - injectTapEventPlugin(); - - ReactDOM.render( - - - - - - - , - document.querySelector('#root') - ); - - new WsDataProvider(store, ws); // eslint-disable-line no-new - new AppDataProvider(store, ws); // eslint-disable-line no-new - - ws.init(token); -} - -// expose globally for Signer Dapp -global.paritySigner = app; diff --git a/js/src/views/Signer-old/app.spec.js b/js/src/views/Signer-old/app.spec.js deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/js/src/views/Signer-old/index.css b/js/src/views/Signer-old/index.css deleted file mode 100644 index 7af2372cd41..00000000000 --- a/js/src/views/Signer-old/index.css +++ /dev/null @@ -1,54 +0,0 @@ -html * { - font-family: 'Source Sans Pro', 'Helvetica Neue', arial; -} - -a { - cursor: pointer; - text-decoration: none; -} - -a:hover { - text-decoration: underline; -} - -h1 { - font-size: 2em; - margin-top: .67em; - margin-bottom: .67em; -} - -h2 { - font-size: 1.5em; - margin-top: .67em; - margin-bottom: .67em; -} - -h1, h2, h3, h4 { - font-family: 'Source Sans Pro Light', 'Source Sans Pro', 'Helvetica Neue', arial; -} - -strong { - font-family: 'Source Sans Pro Bold', 'Helvetica Neue', arial; -} - -p { - margin-top: 1em; - margin-bottom: 1em; -} - -input { - font-family: 'Source Sans Pro', 'Helvetica Neue', arial !important; /* shame on material ui using inline styles */ -} - -@font-face { - font-family: 'Source Sans Pro Bold'; - src: url('./assets/fonts/sourcesanspro-bold-webfont.woff2') format('woff2'), - url('./assets/fonts/sourcesanspro-bold-webfont.woff') format('woff'); -} - -@font-face { - font-family: 'Source Sans Pro'; - src: url('./assets/fonts/sourcesanspro-regular-webfont.woff2') format('woff2'), - url('./assets/fonts/sourcesanspro-regular-webfont.woff') format('woff'); -} - diff --git a/js/src/views/Signer-old/index.html b/js/src/views/Signer-old/index.html deleted file mode 100644 index 17d1543341a..00000000000 --- a/js/src/views/Signer-old/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - Parity Signer UI - - -
- - - - diff --git a/js/src/views/Signer-old/index.js b/js/src/views/Signer-old/index.js deleted file mode 100644 index 04d299c58a2..00000000000 --- a/js/src/views/Signer-old/index.js +++ /dev/null @@ -1,16 +0,0 @@ -import './index.html'; - -const app = window.paritySigner; // exposed by app.js - -initApp(); - -function initApp () { - const initToken = window.localStorage.getItem('sysuiToken'); - // TODO [ToDr] Hardcoded address should replaced with options - const address = process.env.NODE_ENV === 'production' ? window.location.host : '127.0.0.1:8180'; - app(initToken, tokenSetter, address); -} - -function tokenSetter (token, cb) { - window.localStorage.setItem('sysuiToken', token); -} diff --git a/js/src/views/Signer/actions/requests.js b/js/src/views/Signer/actions/requests.js index 35f2fb1a047..fc3e63f067c 100644 --- a/js/src/views/Signer/actions/requests.js +++ b/js/src/views/Signer/actions/requests.js @@ -1,5 +1,5 @@ -import { withToastr } from '../dappscomponents/util/toastr'; -import { identity } from '../dappscomponents/util/util'; +import { withToastr } from '../components/util/toastr'; +import { identity } from '../components/util/util'; import { createAction } from 'redux-actions'; diff --git a/js/src/views/Signer/dappscomponents/Account/Account.css b/js/src/views/Signer/components/Account/Account.css similarity index 100% rename from js/src/views/Signer/dappscomponents/Account/Account.css rename to js/src/views/Signer/components/Account/Account.css diff --git a/js/src/views/Signer/dappscomponents/Account/Account.js b/js/src/views/Signer/components/Account/Account.js similarity index 92% rename from js/src/views/Signer/dappscomponents/Account/Account.js rename to js/src/views/Signer/components/Account/Account.js index 4313f4ae66f..6fab66adca9 100644 --- a/js/src/views/Signer/dappscomponents/Account/Account.js +++ b/js/src/views/Signer/components/Account/Account.js @@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'; import styles from './Account.css'; -import Identicon from '../Identicon'; +import { IdentityIcon } from '../../../../ui'; import AccountLink from '../AccountLink'; export default class Account extends Component { @@ -40,7 +40,9 @@ export default class Account extends Component { const { address, chain, className } = this.props; return (
- + + + { this.renderName() } { this.renderBalance() }
diff --git a/js/src/views/Signer/dappscomponents/Account/index.js b/js/src/views/Signer/components/Account/index.js similarity index 100% rename from js/src/views/Signer/dappscomponents/Account/index.js rename to js/src/views/Signer/components/Account/index.js diff --git a/js/src/views/Signer/dappscomponents/AccountLink/AccountLink.css b/js/src/views/Signer/components/AccountLink/AccountLink.css similarity index 100% rename from js/src/views/Signer/dappscomponents/AccountLink/AccountLink.css rename to js/src/views/Signer/components/AccountLink/AccountLink.css diff --git a/js/src/views/Signer/dappscomponents/AccountLink/AccountLink.js b/js/src/views/Signer/components/AccountLink/AccountLink.js similarity index 100% rename from js/src/views/Signer/dappscomponents/AccountLink/AccountLink.js rename to js/src/views/Signer/components/AccountLink/AccountLink.js diff --git a/js/src/views/Signer/dappscomponents/AccountLink/index.js b/js/src/views/Signer/components/AccountLink/index.js similarity index 100% rename from js/src/views/Signer/dappscomponents/AccountLink/index.js rename to js/src/views/Signer/components/AccountLink/index.js diff --git a/js/src/views/Signer/components/Offline/Offline.js b/js/src/views/Signer/components/Offline/Offline.js deleted file mode 100644 index dd62217c8f0..00000000000 --- a/js/src/views/Signer/components/Offline/Offline.js +++ /dev/null @@ -1,33 +0,0 @@ -import React, { Component, PropTypes } from 'react'; - -import { isExtension } from '../../utils/extension'; - -export default class Offline extends Component { - - static propTypes = { - parityUrl: PropTypes.string.isRequired - } - - render () { - return ( -
-

Offline

-

Couldn't connect to the node. Make sure Parity is running and Trusted Signer is enabled.

- { this.renderInstallLink() } -
- ); - } - - renderInstallLink () { - if (!isExtension()) { - return; - } - - return ( -

- If you don't have Parity installed yet, get it here. -

- ); - } - -} diff --git a/js/src/views/Signer/components/Offline/index.js b/js/src/views/Signer/components/Offline/index.js deleted file mode 100644 index 5100666072e..00000000000 --- a/js/src/views/Signer/components/Offline/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './Offline'; diff --git a/js/src/views/Signer/dappscomponents/RequestFinishedWeb3/RequestFinishedWeb3.js b/js/src/views/Signer/components/RequestFinishedWeb3/RequestFinishedWeb3.js similarity index 100% rename from js/src/views/Signer/dappscomponents/RequestFinishedWeb3/RequestFinishedWeb3.js rename to js/src/views/Signer/components/RequestFinishedWeb3/RequestFinishedWeb3.js diff --git a/js/src/views/Signer/dappscomponents/RequestFinishedWeb3/index.js b/js/src/views/Signer/components/RequestFinishedWeb3/index.js similarity index 100% rename from js/src/views/Signer/dappscomponents/RequestFinishedWeb3/index.js rename to js/src/views/Signer/components/RequestFinishedWeb3/index.js diff --git a/js/src/views/Signer/dappscomponents/RequestPendingWeb3/RequestPendingWeb3.js b/js/src/views/Signer/components/RequestPendingWeb3/RequestPendingWeb3.js similarity index 99% rename from js/src/views/Signer/dappscomponents/RequestPendingWeb3/RequestPendingWeb3.js rename to js/src/views/Signer/components/RequestPendingWeb3/RequestPendingWeb3.js index eea92dbe37d..b592d45c0ed 100644 --- a/js/src/views/Signer/dappscomponents/RequestPendingWeb3/RequestPendingWeb3.js +++ b/js/src/views/Signer/components/RequestPendingWeb3/RequestPendingWeb3.js @@ -5,7 +5,6 @@ import SignWeb3 from '../SignRequestWeb3'; import Web3Compositor from '../Web3Compositor'; class RequestPendingWeb3 extends Component { - static contextTypes = { web3: PropTypes.object.isRequired }; diff --git a/js/src/views/Signer/dappscomponents/RequestPendingWeb3/index.js b/js/src/views/Signer/components/RequestPendingWeb3/index.js similarity index 100% rename from js/src/views/Signer/dappscomponents/RequestPendingWeb3/index.js rename to js/src/views/Signer/components/RequestPendingWeb3/index.js diff --git a/js/src/views/Signer/components/Requests/Requests.css b/js/src/views/Signer/components/Requests/Requests.css deleted file mode 100644 index 75bcce9097b..00000000000 --- a/js/src/views/Signer/components/Requests/Requests.css +++ /dev/null @@ -1,7 +0,0 @@ -.request:not(:first-child) { - border-top: 1px solid #eee; -} - -.noRequestsMsg { - padding: 25px 0 ; -} diff --git a/js/src/views/Signer/components/Requests/Requests.js b/js/src/views/Signer/components/Requests/Requests.js deleted file mode 100644 index d952d7e1b5b..00000000000 --- a/js/src/views/Signer/components/Requests/Requests.js +++ /dev/null @@ -1,104 +0,0 @@ -import React, { Component, PropTypes } from 'react'; -import { RequestPendingWeb3, RequestFinishedWeb3 } from '../../dappscomponents'; - -import styles from './Requests.css'; - -export default class Requests extends Component { - - static propTypes = { - requests: PropTypes.shape({ - pending: PropTypes.array.isRequired, - finished: PropTypes.array.isRequired - }).isRequired, - actions: PropTypes.shape({ - startConfirmRequest: PropTypes.func.isRequired, - startRejectRequest: PropTypes.func.isRequired - }).isRequired - }; - - render () { - const { pending, finished } = this.props.requests; - - if (!pending.length && !finished.length) { - return this.renderNoRequestsMsg(); - } - - return ( -
- { this.renderFinishedRequests() } - { this.renderPendingRequests() } -
- ); - } - - renderPendingRequests () { - const { requests } = this.props; - if (!requests.pending.length) { - return; - } - - return ( -
-

Pending Requests

-
{ requests.pending.map(data => this.renderPending(data)) }
-
- ); - } - - renderFinishedRequests () { - const { finished } = this.props.requests; - if (!finished.length) { - return; - } - - return ( -
-

Finished Requests

-
{ finished.map(data => this.renderFinished(data)) }
-
- ); - } - - renderPending (data) { - const { actions } = this.props; - const { payload, id, isSending } = data; - - return ( - - ); - } - - renderFinished (data) { - const { payload, id, result, msg, status, error } = data; - - return ( - - ); - } - - renderNoRequestsMsg () { - return ( -
-

There are no requests requiring your confirmation.

-
- ); - } - -} diff --git a/js/src/views/Signer/components/Requests/index.js b/js/src/views/Signer/components/Requests/index.js deleted file mode 100644 index 8ab3b3f5bc6..00000000000 --- a/js/src/views/Signer/components/Requests/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './Requests'; diff --git a/js/src/views/Signer/dappscomponents/SignRequest/SignRequest.css b/js/src/views/Signer/components/SignRequest/SignRequest.css similarity index 100% rename from js/src/views/Signer/dappscomponents/SignRequest/SignRequest.css rename to js/src/views/Signer/components/SignRequest/SignRequest.css diff --git a/js/src/views/Signer/dappscomponents/SignRequest/SignRequest.js b/js/src/views/Signer/components/SignRequest/SignRequest.js similarity index 100% rename from js/src/views/Signer/dappscomponents/SignRequest/SignRequest.js rename to js/src/views/Signer/components/SignRequest/SignRequest.js diff --git a/js/src/views/Signer/dappscomponents/SignRequest/index.js b/js/src/views/Signer/components/SignRequest/index.js similarity index 100% rename from js/src/views/Signer/dappscomponents/SignRequest/index.js rename to js/src/views/Signer/components/SignRequest/index.js diff --git a/js/src/views/Signer/dappscomponents/SignRequestWeb3/SignRequestWeb3.js b/js/src/views/Signer/components/SignRequestWeb3/SignRequestWeb3.js similarity index 100% rename from js/src/views/Signer/dappscomponents/SignRequestWeb3/SignRequestWeb3.js rename to js/src/views/Signer/components/SignRequestWeb3/SignRequestWeb3.js diff --git a/js/src/views/Signer/dappscomponents/SignRequestWeb3/index.js b/js/src/views/Signer/components/SignRequestWeb3/index.js similarity index 100% rename from js/src/views/Signer/dappscomponents/SignRequestWeb3/index.js rename to js/src/views/Signer/components/SignRequestWeb3/index.js diff --git a/js/src/views/Signer/components/ToastrContainer/ToastrContainer.js b/js/src/views/Signer/components/ToastrContainer/ToastrContainer.js index c060d7cb9b9..e8d60fab320 100644 --- a/js/src/views/Signer/components/ToastrContainer/ToastrContainer.js +++ b/js/src/views/Signer/components/ToastrContainer/ToastrContainer.js @@ -1,11 +1,9 @@ - import React, { Component, PropTypes } from 'react'; import Paper from 'material-ui/Paper'; import styles from './ToastrContainer.css'; export default class ToastrContainer extends Component { - static propTypes = { toasts: PropTypes.array.isRequired, actions: PropTypes.shape({ @@ -39,5 +37,4 @@ export default class ToastrContainer extends Component { ); }); } - } diff --git a/js/src/views/Signer/dappscomponents/TransactionFinished/TransactionFinished.css b/js/src/views/Signer/components/TransactionFinished/TransactionFinished.css similarity index 100% rename from js/src/views/Signer/dappscomponents/TransactionFinished/TransactionFinished.css rename to js/src/views/Signer/components/TransactionFinished/TransactionFinished.css diff --git a/js/src/views/Signer/dappscomponents/TransactionFinished/TransactionFinished.js b/js/src/views/Signer/components/TransactionFinished/TransactionFinished.js similarity index 100% rename from js/src/views/Signer/dappscomponents/TransactionFinished/TransactionFinished.js rename to js/src/views/Signer/components/TransactionFinished/TransactionFinished.js diff --git a/js/src/views/Signer/dappscomponents/TransactionFinished/index.js b/js/src/views/Signer/components/TransactionFinished/index.js similarity index 100% rename from js/src/views/Signer/dappscomponents/TransactionFinished/index.js rename to js/src/views/Signer/components/TransactionFinished/index.js diff --git a/js/src/views/Signer/dappscomponents/TransactionFinishedWeb3/TransactionFinishedWeb3.js b/js/src/views/Signer/components/TransactionFinishedWeb3/TransactionFinishedWeb3.js similarity index 100% rename from js/src/views/Signer/dappscomponents/TransactionFinishedWeb3/TransactionFinishedWeb3.js rename to js/src/views/Signer/components/TransactionFinishedWeb3/TransactionFinishedWeb3.js diff --git a/js/src/views/Signer/dappscomponents/TransactionFinishedWeb3/index.js b/js/src/views/Signer/components/TransactionFinishedWeb3/index.js similarity index 100% rename from js/src/views/Signer/dappscomponents/TransactionFinishedWeb3/index.js rename to js/src/views/Signer/components/TransactionFinishedWeb3/index.js diff --git a/js/src/views/Signer/dappscomponents/TransactionMainDetails/TransactionMainDetails.css b/js/src/views/Signer/components/TransactionMainDetails/TransactionMainDetails.css similarity index 100% rename from js/src/views/Signer/dappscomponents/TransactionMainDetails/TransactionMainDetails.css rename to js/src/views/Signer/components/TransactionMainDetails/TransactionMainDetails.css diff --git a/js/src/views/Signer/dappscomponents/TransactionMainDetails/TransactionMainDetails.js b/js/src/views/Signer/components/TransactionMainDetails/TransactionMainDetails.js similarity index 100% rename from js/src/views/Signer/dappscomponents/TransactionMainDetails/TransactionMainDetails.js rename to js/src/views/Signer/components/TransactionMainDetails/TransactionMainDetails.js diff --git a/js/src/views/Signer/dappscomponents/TransactionMainDetails/index.js b/js/src/views/Signer/components/TransactionMainDetails/index.js similarity index 100% rename from js/src/views/Signer/dappscomponents/TransactionMainDetails/index.js rename to js/src/views/Signer/components/TransactionMainDetails/index.js diff --git a/js/src/views/Signer/dappscomponents/TransactionPending/TransactionPending.css b/js/src/views/Signer/components/TransactionPending/TransactionPending.css similarity index 100% rename from js/src/views/Signer/dappscomponents/TransactionPending/TransactionPending.css rename to js/src/views/Signer/components/TransactionPending/TransactionPending.css diff --git a/js/src/views/Signer/dappscomponents/TransactionPending/TransactionPending.js b/js/src/views/Signer/components/TransactionPending/TransactionPending.js similarity index 100% rename from js/src/views/Signer/dappscomponents/TransactionPending/TransactionPending.js rename to js/src/views/Signer/components/TransactionPending/TransactionPending.js diff --git a/js/src/views/Signer/dappscomponents/TransactionPending/index.js b/js/src/views/Signer/components/TransactionPending/index.js similarity index 100% rename from js/src/views/Signer/dappscomponents/TransactionPending/index.js rename to js/src/views/Signer/components/TransactionPending/index.js diff --git a/js/src/views/Signer/dappscomponents/TransactionPendingForm/TransactionPendingForm.css b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.css similarity index 100% rename from js/src/views/Signer/dappscomponents/TransactionPendingForm/TransactionPendingForm.css rename to js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.css diff --git a/js/src/views/Signer/dappscomponents/TransactionPendingForm/TransactionPendingForm.js b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.js similarity index 100% rename from js/src/views/Signer/dappscomponents/TransactionPendingForm/TransactionPendingForm.js rename to js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.js diff --git a/js/src/views/Signer/dappscomponents/TransactionPendingForm/index.js b/js/src/views/Signer/components/TransactionPendingForm/index.js similarity index 100% rename from js/src/views/Signer/dappscomponents/TransactionPendingForm/index.js rename to js/src/views/Signer/components/TransactionPendingForm/index.js diff --git a/js/src/views/Signer/dappscomponents/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css b/js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css similarity index 100% rename from js/src/views/Signer/dappscomponents/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css rename to js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css diff --git a/js/src/views/Signer/dappscomponents/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js b/js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js similarity index 100% rename from js/src/views/Signer/dappscomponents/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js rename to js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js diff --git a/js/src/views/Signer/dappscomponents/TransactionPendingFormConfirm/index.js b/js/src/views/Signer/components/TransactionPendingFormConfirm/index.js similarity index 100% rename from js/src/views/Signer/dappscomponents/TransactionPendingFormConfirm/index.js rename to js/src/views/Signer/components/TransactionPendingFormConfirm/index.js diff --git a/js/src/views/Signer/dappscomponents/TransactionPendingFormReject/TransactionPendingFormReject.css b/js/src/views/Signer/components/TransactionPendingFormReject/TransactionPendingFormReject.css similarity index 100% rename from js/src/views/Signer/dappscomponents/TransactionPendingFormReject/TransactionPendingFormReject.css rename to js/src/views/Signer/components/TransactionPendingFormReject/TransactionPendingFormReject.css diff --git a/js/src/views/Signer/dappscomponents/TransactionPendingFormReject/TransactionPendingFormReject.js b/js/src/views/Signer/components/TransactionPendingFormReject/TransactionPendingFormReject.js similarity index 100% rename from js/src/views/Signer/dappscomponents/TransactionPendingFormReject/TransactionPendingFormReject.js rename to js/src/views/Signer/components/TransactionPendingFormReject/TransactionPendingFormReject.js diff --git a/js/src/views/Signer/dappscomponents/TransactionPendingFormReject/index.js b/js/src/views/Signer/components/TransactionPendingFormReject/index.js similarity index 100% rename from js/src/views/Signer/dappscomponents/TransactionPendingFormReject/index.js rename to js/src/views/Signer/components/TransactionPendingFormReject/index.js diff --git a/js/src/views/Signer/dappscomponents/TransactionPendingWeb3/TransactionPendingWeb3.js b/js/src/views/Signer/components/TransactionPendingWeb3/TransactionPendingWeb3.js similarity index 100% rename from js/src/views/Signer/dappscomponents/TransactionPendingWeb3/TransactionPendingWeb3.js rename to js/src/views/Signer/components/TransactionPendingWeb3/TransactionPendingWeb3.js diff --git a/js/src/views/Signer/dappscomponents/TransactionPendingWeb3/index.js b/js/src/views/Signer/components/TransactionPendingWeb3/index.js similarity index 100% rename from js/src/views/Signer/dappscomponents/TransactionPendingWeb3/index.js rename to js/src/views/Signer/components/TransactionPendingWeb3/index.js diff --git a/js/src/views/Signer/dappscomponents/TxHashLink/TxHashLink.js b/js/src/views/Signer/components/TxHashLink/TxHashLink.js similarity index 100% rename from js/src/views/Signer/dappscomponents/TxHashLink/TxHashLink.js rename to js/src/views/Signer/components/TxHashLink/TxHashLink.js diff --git a/js/src/views/Signer/dappscomponents/TxHashLink/index.js b/js/src/views/Signer/components/TxHashLink/index.js similarity index 100% rename from js/src/views/Signer/dappscomponents/TxHashLink/index.js rename to js/src/views/Signer/components/TxHashLink/index.js diff --git a/js/src/views/Signer/components/UnAuthorized/UnAuthorized.js b/js/src/views/Signer/components/UnAuthorized/UnAuthorized.js deleted file mode 100644 index 8cb52babc9f..00000000000 --- a/js/src/views/Signer/components/UnAuthorized/UnAuthorized.js +++ /dev/null @@ -1,110 +0,0 @@ -import React, { Component, PropTypes } from 'react'; - -import RaisedButton from 'material-ui/RaisedButton'; -import TextField from 'material-ui/TextField'; - -import styles from './UnAuthorized.css'; - -export default class UnAuthorized extends Component { - - static propTypes = { - signer: PropTypes.shape({ - token: PropTypes.string.isRequired - }).isRequired, - actions: PropTypes.shape({ - updateToken: PropTypes.func.isRequired - }).isRequired - } - - state = { - token: this.props.signer.token, - tokenInvalid: null, - processing: false - }; - - componentWillReceiveProps (nextProps) { - if (this.props.signer.token === nextProps.signer.token) { - return; - } - this.setState({ - token: nextProps.signer.token - }); - } - - componentWillUnmount () { - clearTimeout(this.tokenInvalidTimeout); - } - - render () { - const { processing, token } = this.state; - return ( -
-

Not Authorized

-

- Connections used by Trusted Signer are secured. You need to authorize this app. -

-

Make sure Parity is running, generate authorization token:

-

$ parity signer new-token  and paste the token below:

- -
- - { this.renderInvalidToken() } - { this.renderProcessing() } -
- ); - } - - onTokenChange = evt => { - this.setState({ token: evt.target.value, tokenInvalid: false }); - } - - onSubmit = () => { - const token = this.state.token.replace(/[^a-zA-Z0-9]/g, ''); - this.setState({ - processing: true, - tokenInvalid: false - }); - this.props.actions.updateToken(token); - - // todo [adgo] - listen to event instead of timeout - this.tokenInvalidTimeout = setTimeout(this.onTokenInvalid, 4000); // if token is valid this component should unmount. after 4 sconds we assume it's invalid. - } - - renderProcessing () { - if (!this.state.processing) { - return null; - } - - return ( - Processing ... - ); - } - - renderInvalidToken () { - if (!this.state.tokenInvalid) { - return null; - } - - return The token is invalid or your node is not running.; - } - - onTokenInvalid = () => { - this.setState({ - processing: false, - tokenInvalid: true - }); - } - -} diff --git a/js/src/views/Signer/components/UnAuthorized/index.js b/js/src/views/Signer/components/UnAuthorized/index.js deleted file mode 100644 index 462703db92a..00000000000 --- a/js/src/views/Signer/components/UnAuthorized/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './UnAuthorized'; diff --git a/js/src/views/Signer/dappscomponents/Web3Compositor/Web3Compositor.js b/js/src/views/Signer/components/Web3Compositor/Web3Compositor.js similarity index 100% rename from js/src/views/Signer/dappscomponents/Web3Compositor/Web3Compositor.js rename to js/src/views/Signer/components/Web3Compositor/Web3Compositor.js diff --git a/js/src/views/Signer/dappscomponents/Web3Compositor/index.js b/js/src/views/Signer/components/Web3Compositor/index.js similarity index 100% rename from js/src/views/Signer/dappscomponents/Web3Compositor/index.js rename to js/src/views/Signer/components/Web3Compositor/index.js diff --git a/js/src/views/Signer/dappscomponents/Web3Provider/Web3Provider.js b/js/src/views/Signer/components/Web3Provider/Web3Provider.js similarity index 100% rename from js/src/views/Signer/dappscomponents/Web3Provider/Web3Provider.js rename to js/src/views/Signer/components/Web3Provider/Web3Provider.js diff --git a/js/src/views/Signer/dappscomponents/Web3Provider/index.js b/js/src/views/Signer/components/Web3Provider/index.js similarity index 100% rename from js/src/views/Signer/dappscomponents/Web3Provider/index.js rename to js/src/views/Signer/components/Web3Provider/index.js diff --git a/js/src/views/Signer/dappscomponents/constants/constants.js b/js/src/views/Signer/components/constants/constants.js similarity index 100% rename from js/src/views/Signer/dappscomponents/constants/constants.js rename to js/src/views/Signer/components/constants/constants.js diff --git a/js/src/views/Signer/components/index.js b/js/src/views/Signer/components/index.js new file mode 100644 index 00000000000..1a13cd7162e --- /dev/null +++ b/js/src/views/Signer/components/index.js @@ -0,0 +1,5 @@ +export RequestFinishedWeb3 from './RequestFinishedWeb3'; +export RequestPendingWeb3 from './RequestPendingWeb3'; +export ToastrContainer from './ToastrContainer'; +export web3Extension from './util/web3.extensions'; +export Web3Provider from './Web3Provider'; diff --git a/js/src/views/Signer/dappscomponents/util/Web3WebSocketProvider/Web3WebSocketProvider.js b/js/src/views/Signer/components/util/Web3WebSocketProvider/Web3WebSocketProvider.js similarity index 100% rename from js/src/views/Signer/dappscomponents/util/Web3WebSocketProvider/Web3WebSocketProvider.js rename to js/src/views/Signer/components/util/Web3WebSocketProvider/Web3WebSocketProvider.js diff --git a/js/src/views/Signer/dappscomponents/util/Web3WebSocketProvider/index.js b/js/src/views/Signer/components/util/Web3WebSocketProvider/index.js similarity index 100% rename from js/src/views/Signer/dappscomponents/util/Web3WebSocketProvider/index.js rename to js/src/views/Signer/components/util/Web3WebSocketProvider/index.js diff --git a/js/src/views/Signer/dappscomponents/util/account.js b/js/src/views/Signer/components/util/account.js similarity index 100% rename from js/src/views/Signer/dappscomponents/util/account.js rename to js/src/views/Signer/components/util/account.js diff --git a/js/src/views/Signer/dappscomponents/util/logger.js b/js/src/views/Signer/components/util/logger.js similarity index 100% rename from js/src/views/Signer/dappscomponents/util/logger.js rename to js/src/views/Signer/components/util/logger.js diff --git a/js/src/views/Signer/dappscomponents/util/react.js b/js/src/views/Signer/components/util/react.js similarity index 100% rename from js/src/views/Signer/dappscomponents/util/react.js rename to js/src/views/Signer/components/util/react.js diff --git a/js/src/views/Signer/dappscomponents/util/toastr.js b/js/src/views/Signer/components/util/toastr.js similarity index 100% rename from js/src/views/Signer/dappscomponents/util/toastr.js rename to js/src/views/Signer/components/util/toastr.js diff --git a/js/src/views/Signer/dappscomponents/util/toastr.spec.js b/js/src/views/Signer/components/util/toastr.spec.js similarity index 100% rename from js/src/views/Signer/dappscomponents/util/toastr.spec.js rename to js/src/views/Signer/components/util/toastr.spec.js diff --git a/js/src/views/Signer/dappscomponents/util/transaction.js b/js/src/views/Signer/components/util/transaction.js similarity index 100% rename from js/src/views/Signer/dappscomponents/util/transaction.js rename to js/src/views/Signer/components/util/transaction.js diff --git a/js/src/views/Signer/dappscomponents/util/transaction.spec.js b/js/src/views/Signer/components/util/transaction.spec.js similarity index 100% rename from js/src/views/Signer/dappscomponents/util/transaction.spec.js rename to js/src/views/Signer/components/util/transaction.spec.js diff --git a/js/src/views/Signer/dappscomponents/util/util.js b/js/src/views/Signer/components/util/util.js similarity index 100% rename from js/src/views/Signer/dappscomponents/util/util.js rename to js/src/views/Signer/components/util/util.js diff --git a/js/src/views/Signer/dappscomponents/util/web3.extensions.js b/js/src/views/Signer/components/util/web3.extensions.js similarity index 100% rename from js/src/views/Signer/dappscomponents/util/web3.extensions.js rename to js/src/views/Signer/components/util/web3.extensions.js diff --git a/js/src/views/Signer/containers/OfflinePage/OfflinePage.js b/js/src/views/Signer/containers/OfflinePage/OfflinePage.js index c9e532a843c..458a4e77cd5 100644 --- a/js/src/views/Signer/containers/OfflinePage/OfflinePage.js +++ b/js/src/views/Signer/containers/OfflinePage/OfflinePage.js @@ -1,15 +1,34 @@ -import React, { Component } from 'react'; +import React, { Component, PropTypes } from 'react'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; import { updateAppState } from '../../actions/signer'; - -import Offline from '../../components/Offline'; +import { isExtension } from '../../utils/extension'; class OfflinePage extends Component { + static propTypes = { + parityUrl: PropTypes.string.isRequired + } + render () { return ( - +
+

Offline

+

Couldn't connect to the node. Make sure Parity is running and Trusted Signer is enabled.

+ { this.renderInstallLink() } +
+ ); + } + + renderInstallLink () { + if (!isExtension()) { + return; + } + + return ( +

+ If you don't have Parity installed yet, get it here. +

); } } diff --git a/js/src/views/Signer/containers/RequestsPage/RequestsPage.css b/js/src/views/Signer/containers/RequestsPage/RequestsPage.css index e69de29bb2d..75bcce9097b 100644 --- a/js/src/views/Signer/containers/RequestsPage/RequestsPage.css +++ b/js/src/views/Signer/containers/RequestsPage/RequestsPage.css @@ -0,0 +1,7 @@ +.request:not(:first-child) { + border-top: 1px solid #eee; +} + +.noRequestsMsg { + padding: 25px 0 ; +} diff --git a/js/src/views/Signer/containers/RequestsPage/RequestsPage.js b/js/src/views/Signer/containers/RequestsPage/RequestsPage.js index 734e2128b08..a25a38d2142 100644 --- a/js/src/views/Signer/containers/RequestsPage/RequestsPage.js +++ b/js/src/views/Signer/containers/RequestsPage/RequestsPage.js @@ -1,16 +1,105 @@ -import React, { Component } from 'react'; +import React, { Component, PropTypes } from 'react'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; +import { RequestPendingWeb3, RequestFinishedWeb3 } from '../../components'; import * as RequestsActions from '../../actions/requests'; -import Requests from '../../components/Requests'; +import styles from './RequestsPage.css'; class RequestsPage extends Component { + static propTypes = { + requests: PropTypes.shape({ + pending: PropTypes.array.isRequired, + finished: PropTypes.array.isRequired + }).isRequired, + actions: PropTypes.shape({ + startConfirmRequest: PropTypes.func.isRequired, + startRejectRequest: PropTypes.func.isRequired + }).isRequired + }; + render () { + const { pending, finished } = this.props.requests; + + if (!pending.length && !finished.length) { + return this.renderNoRequestsMsg(); + } + return (
- + { this.renderFinishedRequests() } + { this.renderPendingRequests() } +
+ ); + } + + renderPendingRequests () { + const { requests } = this.props; + if (!requests.pending.length) { + return; + } + + return ( +
+

Pending Requests

+
{ requests.pending.map(data => this.renderPending(data)) }
+
+ ); + } + + renderFinishedRequests () { + const { finished } = this.props.requests; + if (!finished.length) { + return; + } + + return ( +
+

Finished Requests

+
{ finished.map(data => this.renderFinished(data)) }
+
+ ); + } + + renderPending (data) { + const { actions } = this.props; + const { payload, id, isSending } = data; + + return ( + + ); + } + + renderFinished (data) { + const { payload, id, result, msg, status, error } = data; + + return ( + + ); + } + + renderNoRequestsMsg () { + return ( +
+

There are no requests requiring your confirmation.

); } diff --git a/js/src/views/Signer/containers/Root/Root.js b/js/src/views/Signer/containers/Root/Root.js index 99a5a149cdb..035a72287f8 100644 --- a/js/src/views/Signer/containers/Root/Root.js +++ b/js/src/views/Signer/containers/Root/Root.js @@ -4,7 +4,7 @@ import { connect } from 'react-redux'; import { Actionbar, Container } from '../../../../ui'; -import ToastrContainer from '../../components/ToastrContainer'; +import { ToastrContainer } from '../../components'; import { removeToast } from '../../actions/toastr'; import LoadingPage from '../LoadingPage'; diff --git a/js/src/views/Signer/components/UnAuthorized/UnAuthorized.css b/js/src/views/Signer/containers/UnAuthorizedPage/UnAuthorizedPage.css similarity index 100% rename from js/src/views/Signer/components/UnAuthorized/UnAuthorized.css rename to js/src/views/Signer/containers/UnAuthorizedPage/UnAuthorizedPage.css diff --git a/js/src/views/Signer/containers/UnAuthorizedPage/UnAuthorizedPage.js b/js/src/views/Signer/containers/UnAuthorizedPage/UnAuthorizedPage.js index d90f4f4f618..627c00921b1 100644 --- a/js/src/views/Signer/containers/UnAuthorizedPage/UnAuthorizedPage.js +++ b/js/src/views/Signer/containers/UnAuthorizedPage/UnAuthorizedPage.js @@ -1,17 +1,112 @@ -import React, { Component } from 'react'; +import React, { Component, PropTypes } from 'react'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; +import { RaisedButton, TextField } from 'material-ui'; import { updateToken } from '../../actions/signer'; -import UnAuthorized from '../../components/UnAuthorized'; +import styles from './UnAuthorizedPage.css'; class UnAuthorizedPage extends Component { + static propTypes = { + signer: PropTypes.shape({ + token: PropTypes.string.isRequired + }).isRequired, + actions: PropTypes.shape({ + updateToken: PropTypes.func.isRequired + }).isRequired + } + + state = { + token: this.props.signer.token, + tokenInvalid: null, + processing: false + }; + + componentWillReceiveProps (nextProps) { + if (this.props.signer.token === nextProps.signer.token) { + return; + } + this.setState({ + token: nextProps.signer.token + }); + } + + componentWillUnmount () { + clearTimeout(this.tokenInvalidTimeout); + } + render () { + const { processing, token } = this.state; return ( - +
+

Not Authorized

+

+ Connections used by Trusted Signer are secured. You need to authorize this app. +

+

Make sure Parity is running, generate authorization token:

+

$ parity signer new-token  and paste the token below:

+ +
+ + { this.renderInvalidToken() } + { this.renderProcessing() } +
); } + + onTokenChange = evt => { + this.setState({ token: evt.target.value, tokenInvalid: false }); + } + + onSubmit = () => { + const token = this.state.token.replace(/[^a-zA-Z0-9]/g, ''); + this.setState({ + processing: true, + tokenInvalid: false + }); + this.props.actions.updateToken(token); + + // todo [adgo] - listen to event instead of timeout + this.tokenInvalidTimeout = setTimeout(this.onTokenInvalid, 4000); // if token is valid this component should unmount. after 4 sconds we assume it's invalid. + } + + renderProcessing () { + if (!this.state.processing) { + return null; + } + + return ( + Processing ... + ); + } + + renderInvalidToken () { + if (!this.state.tokenInvalid) { + return null; + } + + return The token is invalid or your node is not running.; + } + + onTokenInvalid = () => { + this.setState({ + processing: false, + tokenInvalid: true + }); + } } function mapStateToProps (state) { diff --git a/js/src/views/Signer/dappscomponents/AccountWeb3/AccountWeb3.js b/js/src/views/Signer/dappscomponents/AccountWeb3/AccountWeb3.js deleted file mode 100644 index 591944f378f..00000000000 --- a/js/src/views/Signer/dappscomponents/AccountWeb3/AccountWeb3.js +++ /dev/null @@ -1,61 +0,0 @@ -import React, { Component, PropTypes } from 'react'; - -import logger from '../util/logger'; -import Account from '../Account'; -import Web3Compositor from '../Web3Compositor'; - -class AccountWeb3 extends Component { - - static contextTypes = { - web3: PropTypes.object.isRequired - }; - - static propTypes = { - address: PropTypes.string.isRequired, - chain: PropTypes.string.isRequired, - className: PropTypes.object, - name: PropTypes.string - } - - state = { - balance: null - }; - - // from Web3Compositor - onTick (next) { - this.fetchBalance(next); - } - - fetchBalance (next) { - const { address } = this.props; - this.context.web3.eth.getBalance(address, (err, balance) => { - next(err); - - if (err) { - logger.warn('err fetching balance for ', address, err); - return; - } - - this.setState({ - balance - }); - }); - } - - render () { - const { balance } = this.state; - const { address, chain, className, name } = this.props; - return ( - - ); - } - -} - -export default Web3Compositor(AccountWeb3); diff --git a/js/src/views/Signer/dappscomponents/AccountWeb3/index.js b/js/src/views/Signer/dappscomponents/AccountWeb3/index.js deleted file mode 100644 index 3c2dbf6a66a..00000000000 --- a/js/src/views/Signer/dappscomponents/AccountWeb3/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './AccountWeb3'; diff --git a/js/src/views/Signer/dappscomponents/AnimateChildren/AnimateChildren.css b/js/src/views/Signer/dappscomponents/AnimateChildren/AnimateChildren.css deleted file mode 100644 index 5c32516f23a..00000000000 --- a/js/src/views/Signer/dappscomponents/AnimateChildren/AnimateChildren.css +++ /dev/null @@ -1,39 +0,0 @@ -/* todo [adgo] - make local */ -:global .transition-appear { - opacity: 0.01; -} - -:global .transition-appear.transition-appear-active { - opacity: 1; - transition: opacity .3s ease-in-out; -} - -:global .transition-enter { - opacity: 0.01; -} - -:global .transition-enter.transition-enter-active { - opacity: 1; - transition: opacity .3s ease-in-out; -} - -:global .transition-leave { - opacity: 1; -} - -:global .transition-leave.transition-leave-active { - opacity: 0.01; - transition: opacity .3s ease-in-out; -} - -:global .absoluteAnimationContainer { - position: relative; -} - -:global .absoluteAnimationContainer > .transition-leave { - position: absolute; - top: 0; - left: 0; - right: 0; - width: 100%; -} diff --git a/js/src/views/Signer/dappscomponents/AnimateChildren/AnimateChildren.js b/js/src/views/Signer/dappscomponents/AnimateChildren/AnimateChildren.js deleted file mode 100644 index 272fba7d9db..00000000000 --- a/js/src/views/Signer/dappscomponents/AnimateChildren/AnimateChildren.js +++ /dev/null @@ -1,49 +0,0 @@ -import React, { Component, PropTypes } from 'react'; -import ReactCSSTransitionGroup from 'react-addons-css-transition-group'; - -import { isReactComponent } from '../util/react'; -import './AnimateChildren.css'; - -export default class AnimateChildren extends Component { - - static propTypes = { - children: PropTypes.node.isRequired, - pathname: PropTypes.string, - isView: PropTypes.bool, - absolute: PropTypes.bool - } - - render () { - const className = this.props.absolute ? 'absoluteAnimationContainer' : ''; - return ( - - { this.renderChildren() } - - ); - } - - renderChildren () { - const { children, isView } = this.props; - - if (isView) { - return React.cloneElement(this.props.children, { - key: this.props.pathname - }); - } - - if (isReactComponent(children)) { - return React.cloneElement(this.props.children, { ...this.props }); - } - - return children; - } - -} diff --git a/js/src/views/Signer/dappscomponents/AnimateChildren/index.js b/js/src/views/Signer/dappscomponents/AnimateChildren/index.js deleted file mode 100644 index f9d11178a7d..00000000000 --- a/js/src/views/Signer/dappscomponents/AnimateChildren/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './AnimateChildren'; diff --git a/js/src/views/Signer/dappscomponents/Identicon/Identicon.css b/js/src/views/Signer/dappscomponents/Identicon/Identicon.css deleted file mode 100644 index 9f549f38aa4..00000000000 --- a/js/src/views/Signer/dappscomponents/Identicon/Identicon.css +++ /dev/null @@ -1,7 +0,0 @@ -.icon { - max-width: 100%; - max-height: 100%; - border-radius: 50%; - box-shadow: inset 0 0 20px #555; -} - diff --git a/js/src/views/Signer/dappscomponents/Identicon/Identicon.js b/js/src/views/Signer/dappscomponents/Identicon/Identicon.js deleted file mode 100644 index fc525dd5ebf..00000000000 --- a/js/src/views/Signer/dappscomponents/Identicon/Identicon.js +++ /dev/null @@ -1,57 +0,0 @@ -import React, { Component, PropTypes } from 'react'; - -import styles from './Identicon.css'; -import AccountLink from '../AccountLink'; - -import blockies from 'blockies'; - -export default class Identicon extends Component { - - static propTypes = { - chain: PropTypes.string.isRequired, - address: PropTypes.string.isRequired, - className: PropTypes.string - }; - - static defaultProps = { - className: '' - }; - - state = { - src: '' - }; - - componentDidMount () { - this.updateIcon(this.props.address); - } - - componentWillReceiveProps (newProps) { - if (newProps.address === this.props.address) { - return; - } - this.updateIcon(newProps.address); - } - - updateIcon (address) { - const dataUrl = blockies({ - seed: address.toLowerCase(), // in case it's a checksummed address - size: 8, - scale: 8 - }).toDataURL(); - - this.setState({ - src: dataUrl - }); - } - - render () { - const { address, chain, className } = this.props; - - return ( - - - - ); - } - -} diff --git a/js/src/views/Signer/dappscomponents/Identicon/index.js b/js/src/views/Signer/dappscomponents/Identicon/index.js deleted file mode 100644 index e1bb41b7982..00000000000 --- a/js/src/views/Signer/dappscomponents/Identicon/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './Identicon'; diff --git a/js/src/views/Signer/dappscomponents/RpcAutoComplete/RpcAutoComplete.js b/js/src/views/Signer/dappscomponents/RpcAutoComplete/RpcAutoComplete.js deleted file mode 100644 index d1b0cd796e4..00000000000 --- a/js/src/views/Signer/dappscomponents/RpcAutoComplete/RpcAutoComplete.js +++ /dev/null @@ -1,37 +0,0 @@ -import React, { Component, PropTypes } from 'react'; - -import AutoComplete from 'material-ui/AutoComplete'; -import rpcMethods from 'ethereum-rpc-json'; -const rpcMethodsNames = rpcMethods.map(m => m.name); - -export default class RpcAutoComplete extends Component { - - static propTypes = { - onNewRequest: PropTypes.func.isRequired, - className: PropTypes.string, - style: PropTypes.object, - floatingLabelText: PropTypes.string, - filter: PropTypes.func, - openOnFocus: PropTypes.bool - }; - - static defaultProps = { - filter: (searchText, key) => searchText === '' || key.toLowerCase().indexOf(searchText.toLowerCase()) !== -1, - name: 'RpcAutoComplete', // avoid material ui key bug - openOnFocus: true, - floatingLabelText: 'Choose Method' - }; - - shouldComponentUpdate () { - return false; - } - - render () { - return ( - - ); - } -} diff --git a/js/src/views/Signer/dappscomponents/RpcAutoComplete/index.js b/js/src/views/Signer/dappscomponents/RpcAutoComplete/index.js deleted file mode 100644 index 9896464ec22..00000000000 --- a/js/src/views/Signer/dappscomponents/RpcAutoComplete/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './RpcAutoComplete'; diff --git a/js/src/views/Signer/dappscomponents/Toast/Toast.css b/js/src/views/Signer/dappscomponents/Toast/Toast.css deleted file mode 100644 index 1be3f9e181a..00000000000 --- a/js/src/views/Signer/dappscomponents/Toast/Toast.css +++ /dev/null @@ -1,49 +0,0 @@ -.container { - padding: 15px; - position: relative; - font-size: 16px; - line-height: 19px; - margin-bottom: 1.2rem; - animation: fadein .5s; -} - -.container .remove { - opacity: 0; - padding: 0 !important; - width: 24px !important; - height: 24px !important; - transition: opacity .3s ease-in; -} -.container:hover .remove { - opacity: 0.5; -} - -.container.clickable { - cursor: pointer; -} - -.error { - background: #E53935 !important; - color: #fff !important; -} - -.success { - background: #43A047 !important; - color: #fff !important; -} - -.remove { - float: right; - cursor: pointer; - opacity: 0.5; -} - -.error .remove, -.success .remove { - color: #fff !important; -} - -@keyframes fadein { - from {opacity: 0;} - to {opacity: 1;} -} diff --git a/js/src/views/Signer/dappscomponents/Toast/Toast.js b/js/src/views/Signer/dappscomponents/Toast/Toast.js deleted file mode 100644 index 4b5844eed93..00000000000 --- a/js/src/views/Signer/dappscomponents/Toast/Toast.js +++ /dev/null @@ -1,61 +0,0 @@ - -import React, { Component, PropTypes } from 'react'; -import Paper from 'material-ui/Paper'; -import IconButton from 'material-ui/IconButton'; -import RemoveIcon from 'material-ui/svg-icons/action/delete'; - -import styles from './Toast.css'; - -export default class Toast extends Component { - - static propTypes = { - className: PropTypes.string, - id: PropTypes.number.isRequired, - type: PropTypes.string.isRequired, - msg: PropTypes.string.isRequired, - onClickToast: PropTypes.func, - onRemoveToast: PropTypes.func - } - - render () { - const { msg, type, className, onClickToast } = this.props; - const clickableClass = onClickToast ? styles.clickable : ''; - return ( - - { this.renderActions() } - { msg } - - ); - } - - renderActions () { - if (!this.props.onRemoveToast) { - return; - } - - return ( - - - - ); - } - - onRemoveToast = evt => { - evt.stopPropagation(); - const { id, onRemoveToast } = this.props; - onRemoveToast(id); - } - - onClickToast = evt => { - const { id, onClickToast } = this.props; - if (!onClickToast) { - return; - } - onClickToast(id); - } - -} diff --git a/js/src/views/Signer/dappscomponents/Toast/index.js b/js/src/views/Signer/dappscomponents/Toast/index.js deleted file mode 100644 index 9bc4efc8945..00000000000 --- a/js/src/views/Signer/dappscomponents/Toast/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './Toast'; diff --git a/js/src/views/Signer/dappscomponents/Toastr/Toastr.css b/js/src/views/Signer/dappscomponents/Toastr/Toastr.css deleted file mode 100644 index aa30d33915c..00000000000 --- a/js/src/views/Signer/dappscomponents/Toastr/Toastr.css +++ /dev/null @@ -1,6 +0,0 @@ -.container { - position: absolute; - top: 81px; - right: 10px; - width: 250px; -} diff --git a/js/src/views/Signer/dappscomponents/Toastr/Toastr.js b/js/src/views/Signer/dappscomponents/Toastr/Toastr.js deleted file mode 100644 index 6fbf24675fb..00000000000 --- a/js/src/views/Signer/dappscomponents/Toastr/Toastr.js +++ /dev/null @@ -1,37 +0,0 @@ - -import React, { Component, PropTypes } from 'react'; - -import Toast from '../Toast'; -import styles from './Toastr.css'; - -export default class Toastr extends Component { - - static propTypes = { - className: PropTypes.string, - toasts: PropTypes.arrayOf( - PropTypes.shape({ - id: PropTypes.number.isRequired, - type: PropTypes.string.isRequired, - msg: PropTypes.string.isRequired - }) - ).isRequired, - onRemoveToast: PropTypes.func.isRequired - } - - render () { - const { className } = this.props; - return ( -
- { this.renderToasts() } -
- ); - } - - renderToasts () { - const { onRemoveToast } = this.props; - return this.props.toasts.map(t => ( - - )); - } - -} diff --git a/js/src/views/Signer/dappscomponents/Toastr/index.js b/js/src/views/Signer/dappscomponents/Toastr/index.js deleted file mode 100644 index a801549a883..00000000000 --- a/js/src/views/Signer/dappscomponents/Toastr/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './Toastr'; diff --git a/js/src/views/Signer/dappscomponents/actions/toastr.js b/js/src/views/Signer/dappscomponents/actions/toastr.js deleted file mode 100644 index 2992a4f4159..00000000000 --- a/js/src/views/Signer/dappscomponents/actions/toastr.js +++ /dev/null @@ -1,6 +0,0 @@ - -import { createAction } from 'redux-actions'; - -export const addToast = createAction('add toast'); -export const removeToast = createAction('remove toast'); -export const onClickToast = createAction('on clickToast'); diff --git a/js/src/views/Signer/dappscomponents/docs/actions/toastr.js b/js/src/views/Signer/dappscomponents/docs/actions/toastr.js deleted file mode 100644 index d63eff527ec..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/actions/toastr.js +++ /dev/null @@ -1,5 +0,0 @@ - -import { createAction } from 'redux-actions'; - -export const addToast = createAction('add toast'); -export const removeToast = createAction('remove toast'); diff --git a/js/src/views/Signer/dappscomponents/docs/chromeExtension.css b/js/src/views/Signer/dappscomponents/docs/chromeExtension.css deleted file mode 100644 index a1eb5a05bb0..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/chromeExtension.css +++ /dev/null @@ -1,4 +0,0 @@ -body { - width: 800px !important; - margin: 0 auto; -} diff --git a/js/src/views/Signer/dappscomponents/docs/components.data.js b/js/src/views/Signer/dappscomponents/docs/components.data.js deleted file mode 100644 index 13cc0931982..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/components.data.js +++ /dev/null @@ -1,11 +0,0 @@ -export default [ - { name: 'Account' }, - { name: 'AccountLink' }, - { name: 'Identicon' }, - { name: 'RpcAutoComplete' }, - { name: 'Toast' }, - { name: 'TransactionFinished' }, - { name: 'TransactionPending' }, - { name: 'TransactionPendingWeb3' }, - { name: 'TransactionPendingForm' } -]; diff --git a/js/src/views/Signer/dappscomponents/docs/components/Header/Header.css b/js/src/views/Signer/dappscomponents/docs/components/Header/Header.css deleted file mode 100644 index e113b2c5eeb..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/components/Header/Header.css +++ /dev/null @@ -1,4 +0,0 @@ -.link { - padding: 3px; - display: inline-block; -} \ No newline at end of file diff --git a/js/src/views/Signer/dappscomponents/docs/components/Header/Header.js b/js/src/views/Signer/dappscomponents/docs/components/Header/Header.js deleted file mode 100644 index 59493ceaf27..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/components/Header/Header.js +++ /dev/null @@ -1,39 +0,0 @@ -import React, { Component } from 'react'; -import { Link } from 'react-router'; - -import componentsData from '../../components.data.js'; -import AppBar from 'material-ui/AppBar'; -import styles from './Header.css'; - -export default class Header extends Component { - - render () { - return ( -
- - -
- ); - } - - renderComponentsLinks () { - return componentsData.map(c => { - return ( - - { c.name } - - ); - }); - } - - getToLink (name) { - return '/' + name[0].toLowerCase() + name.substr(1); - } - -} diff --git a/js/src/views/Signer/dappscomponents/docs/components/Header/index.js b/js/src/views/Signer/dappscomponents/docs/components/Header/index.js deleted file mode 100644 index 2509393d237..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/components/Header/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './Header'; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/AccountLinkPage.css b/js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/AccountLinkPage.css deleted file mode 100644 index dd5d711f02b..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/AccountLinkPage.css +++ /dev/null @@ -1,16 +0,0 @@ -.accountContainer { - padding: 20px; -} - -.accountContainer:not(:first-child) { - border-top: 1px solid #eee; -} - -.account { - display: inline-block; - margin-right: 20px; -} - -.accountInfo { - display: inline-block; -} \ No newline at end of file diff --git a/js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/AccountLinkPage.data.js b/js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/AccountLinkPage.data.js deleted file mode 100644 index d1831444a01..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/AccountLinkPage.data.js +++ /dev/null @@ -1,10 +0,0 @@ -export default [ - { - address: '0x7c0d52faab596c08f484e3478aebc6205f3f5d8c', - chain: 'morden' - }, - { - address: '0x660cdfdf3d0e7443e7935343a1131b961575ccc7', - chain: 'homestead' - } -]; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/AccountLinkPage.js b/js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/AccountLinkPage.js deleted file mode 100644 index a84a3044cfc..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/AccountLinkPage.js +++ /dev/null @@ -1,41 +0,0 @@ -import React, { Component } from 'react'; - -import AccountLink from '../../../AccountLink'; -import styles from './AccountLinkPage.css'; - -import AccountLinkPageData from './AccountLinkPage.data'; - -export default class AccountLinkPage extends Component { - - render () { - return ( -
-

Account Link

- { this.renderAccountsLinks() } -
- ); - } - - renderAccountsLinks () { - return AccountLinkPageData.map(acc => { - return ( -
- - { acc.address } - - { this.renderAccountLinkInfo(acc) } -
- ); - }); - } - - renderAccountLinkInfo (acc) { - return ( -
-
Chain: { acc.chain }
-
Address: { acc.address }
-
- ); - } - -} diff --git a/js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/index.js b/js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/index.js deleted file mode 100644 index ef612452b5d..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/AccountLinkPage/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './AccountLinkPage'; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/AccountPage/AccountPage.css b/js/src/views/Signer/dappscomponents/docs/containers/AccountPage/AccountPage.css deleted file mode 100644 index dd5d711f02b..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/AccountPage/AccountPage.css +++ /dev/null @@ -1,16 +0,0 @@ -.accountContainer { - padding: 20px; -} - -.accountContainer:not(:first-child) { - border-top: 1px solid #eee; -} - -.account { - display: inline-block; - margin-right: 20px; -} - -.accountInfo { - display: inline-block; -} \ No newline at end of file diff --git a/js/src/views/Signer/dappscomponents/docs/containers/AccountPage/AccountPage.data.js b/js/src/views/Signer/dappscomponents/docs/containers/AccountPage/AccountPage.data.js deleted file mode 100644 index 30b06aeef24..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/AccountPage/AccountPage.data.js +++ /dev/null @@ -1,16 +0,0 @@ -import BigNumber from 'bignumber.js'; - -export default [ - { - address: '0x7c0d52faab596c08f484e3478aebc6205f3f5d8c', - chain: 'morden', - balance: new BigNumber('0x733a8ab53da50c000') - }, - { - address: '0x660cdfdf3d0e7443e7935343a1131b961575ccc7', - chain: 'homestead', - balance: new BigNumber('0x0'), - name: 'awesome account' - } - -]; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/AccountPage/AccountPage.js b/js/src/views/Signer/dappscomponents/docs/containers/AccountPage/AccountPage.js deleted file mode 100644 index 80409672a44..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/AccountPage/AccountPage.js +++ /dev/null @@ -1,41 +0,0 @@ -import React, { Component } from 'react'; - -import Account from '../../../Account'; -import styles from './AccountPage.css'; - -import accountPageData from './AccountPage.data'; - -export default class AccountPage extends Component { - - render () { - return ( -
-

Account

- { this.renderAccounts() } -
- ); - } - - renderAccounts () { - return accountPageData.map(acc => { - return ( -
- - { this.renderAccountInfo(acc) } -
- ); - }); - } - - renderAccountInfo (acc) { - return ( -
-
Chain: { acc.chain }
-
Address: { acc.address }
-
Balance: { acc.balance.div(1e18).toFormat(3) } ETH
-
Name: { acc.name || 'empty' }
-
- ); - } - -} diff --git a/js/src/views/Signer/dappscomponents/docs/containers/AccountPage/index.js b/js/src/views/Signer/dappscomponents/docs/containers/AccountPage/index.js deleted file mode 100644 index cceaed3f55f..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/AccountPage/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './AccountPage'; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/IdenticonPage.css b/js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/IdenticonPage.css deleted file mode 100644 index dd5d711f02b..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/IdenticonPage.css +++ /dev/null @@ -1,16 +0,0 @@ -.accountContainer { - padding: 20px; -} - -.accountContainer:not(:first-child) { - border-top: 1px solid #eee; -} - -.account { - display: inline-block; - margin-right: 20px; -} - -.accountInfo { - display: inline-block; -} \ No newline at end of file diff --git a/js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/IdenticonPage.data.js b/js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/IdenticonPage.data.js deleted file mode 100644 index d1831444a01..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/IdenticonPage.data.js +++ /dev/null @@ -1,10 +0,0 @@ -export default [ - { - address: '0x7c0d52faab596c08f484e3478aebc6205f3f5d8c', - chain: 'morden' - }, - { - address: '0x660cdfdf3d0e7443e7935343a1131b961575ccc7', - chain: 'homestead' - } -]; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/IdenticonPage.js b/js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/IdenticonPage.js deleted file mode 100644 index 2bcfbde656d..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/IdenticonPage.js +++ /dev/null @@ -1,39 +0,0 @@ -import React, { Component } from 'react'; - -import Identicon from '../../../Identicon'; -import styles from './IdenticonPage.css'; - -import identiconPageData from './IdenticonPage.data'; - -export default class IdenticonPage extends Component { - - render () { - return ( -
-

Identicon

- { this.renderIdenticons() } -
- ); - } - - renderIdenticons () { - return identiconPageData.map(idc => { - return ( -
- - { this.renderIdenticonInfo(idc) } -
- ); - }); - } - - renderIdenticonInfo (idc) { - return ( -
-
Chain: { idc.chain }
-
Address: { idc.address }
-
- ); - } - -} diff --git a/js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/index.js b/js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/index.js deleted file mode 100644 index c8e76831463..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/IdenticonPage/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './IdenticonPage'; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/Root/Root.css b/js/src/views/Signer/dappscomponents/docs/containers/Root/Root.css deleted file mode 100644 index 09b2a7daf46..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/Root/Root.css +++ /dev/null @@ -1,7 +0,0 @@ -.container { - background: #fff; -} - -.mainContainer { - padding: 25px; -} diff --git a/js/src/views/Signer/dappscomponents/docs/containers/Root/Root.js b/js/src/views/Signer/dappscomponents/docs/containers/Root/Root.js deleted file mode 100644 index a07ba517994..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/Root/Root.js +++ /dev/null @@ -1,28 +0,0 @@ -import React, { Component, PropTypes } from 'react'; -import AnimateChildren from '../../../AnimateChildren'; -import Header from '../../components/Header'; - -import styles from './Root.css'; - -export default class Root extends Component { - - static propTypes = { - children: PropTypes.node.isRequired, - location: PropTypes.shape({ - pathname: PropTypes.string.isRequired - }).isRequired - }; - - render () { - const { location, children } = this.props; - return ( -
-
- - { children } - -
- ); - } - -} diff --git a/js/src/views/Signer/dappscomponents/docs/containers/Root/index.js b/js/src/views/Signer/dappscomponents/docs/containers/Root/index.js deleted file mode 100644 index a3492f3a7ab..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/Root/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './Root'; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/RpcAutoCompletePage/RpcAutoCompletePage.js b/js/src/views/Signer/dappscomponents/docs/containers/RpcAutoCompletePage/RpcAutoCompletePage.js deleted file mode 100644 index 4b03691670b..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/RpcAutoCompletePage/RpcAutoCompletePage.js +++ /dev/null @@ -1,40 +0,0 @@ -import React, { Component } from 'react'; - -import RpcAutoComplete from '../../../RpcAutoComplete'; - -export default class RpcAutoCompletePage extends Component { - - state = { - selected: null - } - - render () { - return ( -
-

RpcAutoComplete

- - { this.renderSelected() } -
- ); - } - - renderSelected () { - const { selected } = this.state; - if (!selected) { - return ( -

Select a method above

- ); - } - - return ( -

You have selected: - { selected } -

- ); - } - - onNewRequest = selected => { - this.setState({ selected }); - } - -} diff --git a/js/src/views/Signer/dappscomponents/docs/containers/RpcAutoCompletePage/index.js b/js/src/views/Signer/dappscomponents/docs/containers/RpcAutoCompletePage/index.js deleted file mode 100644 index a9b9fb288a4..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/RpcAutoCompletePage/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './RpcAutoCompletePage'; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/ToastPage/ToastPage.css b/js/src/views/Signer/dappscomponents/docs/containers/ToastPage/ToastPage.css deleted file mode 100644 index 44918bbec9c..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/ToastPage/ToastPage.css +++ /dev/null @@ -1,4 +0,0 @@ -.toastsContainer { - width: 200px; - min-height: 100px; -} \ No newline at end of file diff --git a/js/src/views/Signer/dappscomponents/docs/containers/ToastPage/ToastPage.data.js b/js/src/views/Signer/dappscomponents/docs/containers/ToastPage/ToastPage.data.js deleted file mode 100644 index 1383036c5d1..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/ToastPage/ToastPage.data.js +++ /dev/null @@ -1,22 +0,0 @@ -export default [ - { - id: 1, - type: 'default', - msg: 'This is a defaut toast' - }, - { - id: 2, - type: 'error', - msg: 'This is an error toast' - }, - { - id: 3, - type: 'success', - msg: 'This is a success toast' - }, - { - id: 4, - type: 'info', - msg: 'This is an info toast' - } -]; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/ToastPage/ToastPage.js b/js/src/views/Signer/dappscomponents/docs/containers/ToastPage/ToastPage.js deleted file mode 100644 index 5799842eb28..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/ToastPage/ToastPage.js +++ /dev/null @@ -1,31 +0,0 @@ -import React, { Component } from 'react'; - -import Toast from '../../../Toast'; -import styles from './ToastPage.css'; - -import ToastPageData from './ToastPage.data'; - -export default class ToastPage extends Component { - - render () { - return ( -
-

Toast

-
- { this.renderToasts() } -
-
- ); - } - - renderToasts () { - return ToastPageData.map(t => ( - - )); - } - - onRemoveToast = id => { - global.alert('remove toast ' + id); - } - -} diff --git a/js/src/views/Signer/dappscomponents/docs/containers/ToastPage/index.js b/js/src/views/Signer/dappscomponents/docs/containers/ToastPage/index.js deleted file mode 100644 index 9e2d08c7d96..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/ToastPage/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './ToastPage'; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/TransactionFinishedPage/TransactionFinishedPage.css b/js/src/views/Signer/dappscomponents/docs/containers/TransactionFinishedPage/TransactionFinishedPage.css deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/js/src/views/Signer/dappscomponents/docs/containers/TransactionFinishedPage/TransactionFinishedPage.js b/js/src/views/Signer/dappscomponents/docs/containers/TransactionFinishedPage/TransactionFinishedPage.js deleted file mode 100644 index 24506956617..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/TransactionFinishedPage/TransactionFinishedPage.js +++ /dev/null @@ -1,33 +0,0 @@ -import React, { Component } from 'react'; - -import TransactionFinished from '../../../TransactionFinished'; -import styles from './TransactionFinishedPage.css'; - -import transactionsData from '../../transactions.data'; - -export default class TransactionFinishedPage extends Component { - - render () { - return ( -
-

Transaction Finished

-

Transactions that got rejected / confirmed

- { this.renderTransactionsFinished() } -
- ); - } - - renderTransactionsFinished () { - return transactionsData.map(t => ( -
-

{ t._desc }

- - { this.renderInfo(t) } -
- )); - } - - renderInfo (t) { - return null; - } -} diff --git a/js/src/views/Signer/dappscomponents/docs/containers/TransactionFinishedPage/index.js b/js/src/views/Signer/dappscomponents/docs/containers/TransactionFinishedPage/index.js deleted file mode 100644 index c6bc08c34e8..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/TransactionFinishedPage/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './TransactionFinishedPage'; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingFormPage/TransactionPendingFormPage.js b/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingFormPage/TransactionPendingFormPage.js deleted file mode 100644 index 91e35faf5fd..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingFormPage/TransactionPendingFormPage.js +++ /dev/null @@ -1,72 +0,0 @@ -import React, { Component } from 'react'; - -import TransactionPendingForm from '../../../TransactionPendingForm'; - -export default class TransactionPendingFormPage extends Component { - - state = { - chosenAction: null, - password: null - } - - render () { - return ( -
-

Transaction Pending Form

- { this.renderForm() } - { this.renderChosenAction() } -
- ); - } - - renderForm () { - return ( - - ); - } - - renderChosenAction () { - const { chosenAction } = this.state; - if (!chosenAction) { - return; - } - - return ( -

- You have - { chosenAction } - this pending transaction - { this.renderWithPassword() } - . -

- ); - } - - // rejecting transaction has no password - renderWithPassword () { - const { password } = this.state; - if (!password) { - return; - } - - return ' with password ' + password; - } - - onConfirm = password => { - this.setState({ - password, - chosenAction: 'confirmed' - }); - } - - onReject = () => { - this.setState({ - password: null, - chosenAction: 'rejected' - }); - } - -} diff --git a/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingFormPage/index.js b/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingFormPage/index.js deleted file mode 100644 index 0d504dd7a40..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingFormPage/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './TransactionPendingFormPage'; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingPage/TransactionPendingPage.css b/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingPage/TransactionPendingPage.css deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingPage/TransactionPendingPage.js b/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingPage/TransactionPendingPage.js deleted file mode 100644 index 4a8425d9c1f..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingPage/TransactionPendingPage.js +++ /dev/null @@ -1,79 +0,0 @@ -import React, { Component } from 'react'; - -import TransactionPending from '../../../TransactionPending'; -import styles from './TransactionPendingPage.css'; - -import transactionsData from '../../transactions.data'; - -export default class TransactionPendingPage extends Component { - - state = {}; - - render () { - return ( -
-

Transaction Pending

-

Transactions that are awaiting confirmaton / rejection

- { this.renderTransactionsPending() } -
- ); - } - - renderTransactionsPending () { - return transactionsData.map(t => ( -
-

{ t._desc }

- - { this.renderChosenAction(t.id) } - { this.renderInfo(t) } -
- )); - } - - renderInfo (t) { - return null; - } - - renderChosenAction (id) { - const chosenAction = this.state['chosenAction_' + id]; - if (!chosenAction) { - return; - } - - return ( -

- You have { chosenAction } this pending transaction - { this.renderWithPassword(id) }. -

- ); - } - - // rejecting doens't require password - renderWithPassword (id) { - const password = this.state['chosenPassword_' + id]; - if (!password) { - return; - } - - return ' with password ' + password; - } - - onConfirm = (id, password, gasPrice) => { - this.setState({ - ['chosenAction_' + id]: 'confirmed', - ['chosenPassword_' + id]: password - }); - } - - onReject = id => { - this.setState({ - ['chosenAction_' + id]: 'rejected', - ['chosenPassword_' + id]: null - }); - } - -} diff --git a/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingPage/index.js b/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingPage/index.js deleted file mode 100644 index 582f0b57234..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingPage/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './TransactionPendingPage'; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingWeb3Page/TransactionPendingWeb3Page.css b/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingWeb3Page/TransactionPendingWeb3Page.css deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingWeb3Page/TransactionPendingWeb3Page.js b/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingWeb3Page/TransactionPendingWeb3Page.js deleted file mode 100644 index f371dfca08c..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingWeb3Page/TransactionPendingWeb3Page.js +++ /dev/null @@ -1,79 +0,0 @@ -import React, { Component } from 'react'; - -import TransactionPendingWeb3 from '../../../TransactionPendingWeb3'; -import styles from './TransactionPendingWeb3Page.css'; - -import transactionsData from '../../transactions.data'; - -export default class TransactionPendingWeb3Page extends Component { - - state = {}; - - render () { - return ( -
-

Transaction Pending

-

Transactions that are awaiting confirmaton / rejection

- { this.renderTransactionsPending() } -
- ); - } - - renderTransactionsPending () { - return transactionsData.map(t => ( -
-

{ t._desc }

- - { this.renderChosenAction(t.id) } - { this.renderInfo(t) } -
- )); - } - - renderInfo (t) { - return null; - } - - renderChosenAction (id) { - const chosenAction = this.state['chosenAction_' + id]; - if (!chosenAction) { - return; - } - - return ( -

- You have { chosenAction } this pending transaction - { this.renderWithPassword(id) }. -

- ); - } - - // rejecting doens't require password - renderWithPassword (id) { - const password = this.state['chosenPassword_' + id]; - if (!password) { - return; - } - - return ' with password ' + password; - } - - onConfirm = (id, password, gasPrice) => { - this.setState({ - ['chosenAction_' + id]: 'confirmed', - ['chosenPassword_' + id]: password - }); - } - - onReject = id => { - this.setState({ - ['chosenAction_' + id]: 'rejected', - ['chosenPassword_' + id]: null - }); - } - -} diff --git a/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingWeb3Page/index.js b/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingWeb3Page/index.js deleted file mode 100644 index 042e8965c35..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/TransactionPendingWeb3Page/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './TransactionPendingWeb3Page'; diff --git a/js/src/views/Signer/dappscomponents/docs/containers/WelcomePage/WelcomePage.js b/js/src/views/Signer/dappscomponents/docs/containers/WelcomePage/WelcomePage.js deleted file mode 100644 index cbd796829be..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/WelcomePage/WelcomePage.js +++ /dev/null @@ -1,17 +0,0 @@ -import React, { Component } from 'react'; - -export default class WelcomePage extends Component { - - render () { - return ( -
-

Dapps React UI

-

- This is a demo of reusable dapps react ui.
- Select a component from the nav menu above. -

-
- ); - } - -} diff --git a/js/src/views/Signer/dappscomponents/docs/containers/WelcomePage/index.js b/js/src/views/Signer/dappscomponents/docs/containers/WelcomePage/index.js deleted file mode 100644 index e4cc55d870b..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/containers/WelcomePage/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './WelcomePage'; diff --git a/js/src/views/Signer/dappscomponents/docs/docs.js b/js/src/views/Signer/dappscomponents/docs/docs.js deleted file mode 100644 index fc7cc096338..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/docs.js +++ /dev/null @@ -1,42 +0,0 @@ -import React from 'react'; -import { Provider } from 'react-redux'; -import ReactDOM from 'react-dom'; - -import BigNumber from 'bignumber.js'; - -// Needed for onTouchTap -// http://stackoverflow.com/a/34015469/988941 -import injectTapEventPlugin from 'react-tap-event-plugin'; - -import './chromeExtension.css'; -import MuiThemeProvider from '../MuiThemeProvider'; -import Web3Provider from '../Web3Provider'; -import Web3 from 'web3'; -import web3extensions from '../util/web3.extensions'; - -import Routes from './routes'; -import middlewares from './middlewares'; -import createStore from './store'; - -const http = new Web3.providers.HttpProvider(process.env.RPC_ADDRESS || '/rpc/'); -const web3 = new Web3(http); -web3extensions(web3) - .map(extension => web3._extend(extension)); - -const store = createStore(middlewares()); - -injectTapEventPlugin(); - -ReactDOM.render( - - - - - - - , - document.querySelector('#root') -); - -global.web3 = web3; -global.BigNumber = BigNumber; diff --git a/js/src/views/Signer/dappscomponents/docs/index.html b/js/src/views/Signer/dappscomponents/docs/index.html deleted file mode 100644 index 3b12da43f05..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - Dapps React Ui - - -
- - - diff --git a/js/src/views/Signer/dappscomponents/docs/middlewares/index.js b/js/src/views/Signer/dappscomponents/docs/middlewares/index.js deleted file mode 100644 index 0c35a1c2ca4..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/middlewares/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './middlewares'; diff --git a/js/src/views/Signer/dappscomponents/docs/middlewares/logger.js b/js/src/views/Signer/dappscomponents/docs/middlewares/logger.js deleted file mode 100644 index 63c001bc4d3..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/middlewares/logger.js +++ /dev/null @@ -1,19 +0,0 @@ - -export default store => next => action => { - if (!store.getState().logger.logging) { - return next(action); - } - - const msg = [`[${now()}] action:`, `${action.type};`, 'payload: ', action.payload]; - // const logMethod = action.type.indexOf('error') > -1 ? 'error' : 'log'; - console.log(...msg); // todo [adgo] - implement error logs - return next(action); -}; - -function now () { - const date = new Date(Date.now()); - const seconds = date.getSeconds(); - const minutes = date.getMinutes(); - const hour = date.getHours(); - return `${hour}::${minutes}::${seconds}`; -} diff --git a/js/src/views/Signer/dappscomponents/docs/middlewares/middlewares.js b/js/src/views/Signer/dappscomponents/docs/middlewares/middlewares.js deleted file mode 100644 index 7c360a5894f..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/middlewares/middlewares.js +++ /dev/null @@ -1,13 +0,0 @@ -// Middleware classes (except logger) -import Toastr from './toastr'; -import logger from './logger'; - -export default function middlewares (initToken, tokenSetter, wsPath) { - // Middleware instances - const toastr = new Toastr(); - - return [ - logger, - toastr.toMiddleware() - ]; -} diff --git a/js/src/views/Signer/dappscomponents/docs/middlewares/toastr.js b/js/src/views/Signer/dappscomponents/docs/middlewares/toastr.js deleted file mode 100644 index 0bc867ef130..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/middlewares/toastr.js +++ /dev/null @@ -1,53 +0,0 @@ - -import { addToast, removeToast } from '../actions/toastr'; - -export default class ToastrMiddleware { - - constructor (time = 4000) { - this._time = time; - this._timeouts = {}; - } - - toMiddleware () { - return store => next => action => { - const { type, payload } = action; - if (type === 'remove toast' || type === 'freezeToast') { - this.clearTimeoutFor(payload); - } - - // pass along action - next(action); - - if (!this.shouldToast(action)) { - return; - } - - // if action should toast, call next again with toast values - this.toast(store, next, action); - }; - } - - toast (store, next, action) { - const { toastNo } = store.getState().toastr; - const { msg, type } = action.meta.toastr; - next(addToast({ type, msg, toastNo })); - this.setTimeoutFor(toastNo, next); - } - - setTimeoutFor (toastNo, next) { - this._timeouts[String(toastNo)] = setTimeout(() => { - this.clearTimeoutFor(toastNo); - next(removeToast(toastNo)); - }, this._time); - } - - shouldToast (action) { - return !!(action.meta && action.meta.toastr); - } - - clearTimeoutFor (toastNo) { - clearTimeout(this._timeouts[String(toastNo)]); - delete this._timeouts[String(toastNo)]; - } - -} diff --git a/js/src/views/Signer/dappscomponents/docs/reducers/index.js b/js/src/views/Signer/dappscomponents/docs/reducers/index.js deleted file mode 100644 index f0d9718ec18..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/reducers/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './reducers'; diff --git a/js/src/views/Signer/dappscomponents/docs/reducers/logger.js b/js/src/views/Signer/dappscomponents/docs/reducers/logger.js deleted file mode 100644 index 15657286701..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/reducers/logger.js +++ /dev/null @@ -1,18 +0,0 @@ - -import { handleActions } from 'redux-actions'; - -const isProd = process.env.NODE_ENV === 'production'; - -const initialState = { - logging: !isProd -}; - -export default handleActions({ - - 'update logging' (state, action) { - return { - logging: action.payload - }; - } - -}, initialState); diff --git a/js/src/views/Signer/dappscomponents/docs/reducers/reducers.js b/js/src/views/Signer/dappscomponents/docs/reducers/reducers.js deleted file mode 100644 index 283f5df7396..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/reducers/reducers.js +++ /dev/null @@ -1,10 +0,0 @@ -import { routerReducer as routing } from 'react-router-redux'; -import { combineReducers } from 'redux'; -import toastr from './toastr'; -import logger from './logger'; - -export default combineReducers({ - routing, - toastr, - logger -}); diff --git a/js/src/views/Signer/dappscomponents/docs/reducers/toastr.js b/js/src/views/Signer/dappscomponents/docs/reducers/toastr.js deleted file mode 100644 index 193860a6aef..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/reducers/toastr.js +++ /dev/null @@ -1,26 +0,0 @@ - -import { handleActions } from 'redux-actions'; - -const initialState = { - toasts: [], - toastNo: 1 -}; - -export default handleActions({ - - 'add toast' (state, action) { - return { - ...state, - toastNo: state.toastNo + 1, - toasts: [action.payload].concat(state.toasts) - }; - }, - - 'remove toast' (state, action) { - return { - ...state, - toasts: state.toasts.filter(t => t.toastNo !== action.payload) - }; - } - -}, initialState); diff --git a/js/src/views/Signer/dappscomponents/docs/routes/index.js b/js/src/views/Signer/dappscomponents/docs/routes/index.js deleted file mode 100644 index 761c736c45a..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/routes/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './routes'; diff --git a/js/src/views/Signer/dappscomponents/docs/routes/routes.js b/js/src/views/Signer/dappscomponents/docs/routes/routes.js deleted file mode 100644 index d503522a3e3..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/routes/routes.js +++ /dev/null @@ -1,46 +0,0 @@ - -import React, { Component, PropTypes } from 'react'; - -import { Router, Route, IndexRedirect, hashHistory } from 'react-router'; -import { syncHistoryWithStore } from 'react-router-redux'; - -import RootContainer from '../containers/Root'; -import WelcomePage from '../containers/WelcomePage'; -import AccountPage from '../containers/AccountPage'; -import AccountLinkPage from '../containers/AccountLinkPage'; -import IdenticonPage from '../containers/IdenticonPage'; -import RpcAutoCompletePage from '../containers/RpcAutoCompletePage'; -import ToastPage from '../containers/ToastPage'; -import TransactionFinishedPage from '../containers/TransactionFinishedPage'; -import TransactionPendingPage from '../containers/TransactionPendingPage'; -import TransactionPendingWeb3Page from '../containers/TransactionPendingWeb3Page'; -import TransactionPendingFormPage from '../containers/TransactionPendingFormPage'; - -export default class Routes extends Component { - - static propTypes = { - store: PropTypes.object.isRequired - }; - - render () { - const { store } = this.props; - const history = syncHistoryWithStore(hashHistory, store); - return ( - - - - - - - - - - - - - - - - ); - } -} diff --git a/js/src/views/Signer/dappscomponents/docs/store/configureStore.js b/js/src/views/Signer/dappscomponents/docs/store/configureStore.js deleted file mode 100644 index b44a104d718..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/store/configureStore.js +++ /dev/null @@ -1,24 +0,0 @@ -import { createStore, applyMiddleware } from 'redux'; - -import rootReducer from '../reducers'; - -export default function configure (middlewares) { - const create = window.devToolsExtension - ? window.devToolsExtension()(createStore) - : createStore; - - const createStoreWithMiddleware = applyMiddleware( - ...middlewares - )(create); - - const store = createStoreWithMiddleware(rootReducer); - - if (module.hot) { - module.hot.accept('../reducers', () => { - const nextReducer = require('../reducers'); - store.replaceReducer(nextReducer); - }); - } - - return store; -} diff --git a/js/src/views/Signer/dappscomponents/docs/store/index.js b/js/src/views/Signer/dappscomponents/docs/store/index.js deleted file mode 100644 index d39189a9641..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/store/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './configureStore'; diff --git a/js/src/views/Signer/dappscomponents/docs/transactions.data.js b/js/src/views/Signer/dappscomponents/docs/transactions.data.js deleted file mode 100644 index 95d35971b97..00000000000 --- a/js/src/views/Signer/dappscomponents/docs/transactions.data.js +++ /dev/null @@ -1,63 +0,0 @@ -import BigNumber from 'bignumber.js'; -export default [ - { - _desc: 'Transaction on morden with no data', - id: '0x01', - from: '0x8704f2c24439592822be3d71d4fca6e87285f673', - fromBalance: new BigNumber('0x0'), - to: '0xbb9bc244d798123fde783fcc1c72d3bb8c189413', - toBalance: new BigNumber('0x0'), - value: '0x7b', // 123 - status: 'rejected', - error: true, - msg: 'Sender account has insufficient funds to process transaction', - gas: '0x0e618d', // 30400 - gasPrice: '0x054ea318cc', // 10000000000000 - chain: 'morden', - data: '0x' - }, - { - _desc: 'Contract on homestead', - id: '0x04', - from: '0x8704f2c24439592822be3d71d4fca6e87285f673', - fromBalance: new BigNumber('0x733a8ab53da50c000'), - value: '0x0', - status: 'confirmed', - msg: 'Confirmed', - txHash: '0xc573fee50fab265ea0bbe1739ebbc595dae0f368380f6165721c2b0693de8a40', - gas: '0x0e618d', // 30400 - gasPrice: '0x054ea318cc', // 10000000000000 - chain: 'homestead', - // greeter contract from https://www.ethereum.org/greeter - data: '0x636f6e7472616374206d6f7274616c207ba202020202f2a20446566696e65207661726961626c65206f776e6572206f6620746865207479706520616464726573732a2fa2020202061646472657373206f776e65723baa202020202f2a20746869732066756e6374696f6e20697320657865637574656420617420696e697469616c697a6174696f6e20616e64207365747320746865206f776e6572206f662074686520636f6e7472616374202a2fa2020202066756e6374696f6e206d6f7274616c2829207b206f776e6572203d206d73672e73656e6465723b207daa202020202f2a2046756e6374696f6e20746f207265636f766572207468652066756e6473206f6e2074686520636f6e7472616374202a2fa2020202066756e6374696f6e206b696c6c2829207b20696620286d73672e73656e646572203d3d206f776e6572292073756963696465286f776e6572293b207da7daa636f6e74726163742067726565746572206973206d6f7274616c207ba202020202f2a20646566696e65207661726961626c65206772656574696e67206f6620746865207479706520737472696e67202a2fa20202020737472696e67206772656574696e673baa202020202f2a20746869732072756e73207768656e2074686520636f6e7472616374206973206578656375746564202a2fa2020202066756e6374696f6e206772656574657228737472696e67205f6772656574696e6729207075626c6963207ba20202020202020206772656574696e67203d205f6772656574696e673ba202020207daa202020202f2a206d61696e2066756e6374696f6e202a2fa2020202066756e6374696f6e206772656574282920636f6e7374616e742072657475726e732028737472696e6729207ba202020202020202072657475726e206772656574696e673ba202020207da7d' - }, - { - _desc: 'rejected transaction on homestead with data', - id: '0x02', - from: '0x8704f2c24439592822be3d71d4fca6e87285f673', - fromBalance: new BigNumber('0x0'), - to: '0x9201f84c4a27ec41115f6fd1a140842e884c4b91', - toBalance: new BigNumber('0x365fc0'), - value: '0xf4240', // 1000000 - status: 'rejected', - msg: 'Rejected', - gas: '0x0e618d', // 30400 - gasPrice: '0x054ea318cc', // 10000000000000 - chain: 'homestead', - data: '0x66726f6d206d7220617765736f6d6521' // from mr awesome! - }, - { - _desc: 'Contract on homestead', - id: '0x03', - from: '0x8704f2c24439592822be3d71d4fca6e87285f673', - fromBalance: new BigNumber('0x0'), - value: '0x100', - status: 'rejected', - msg: 'Rejected', - gas: '0x0e618d', // 30400 - gasPrice: '0x054ea318cc', // 10000000000000 - chain: 'homestead', - // greeter contract from https://www.ethereum.org/greeter - data: '0x636f6e7472616374206d6f7274616c207ba202020202f2a20446566696e65207661726961626c65206f776e6572206f6620746865207479706520616464726573732a2fa2020202061646472657373206f776e65723baa202020202f2a20746869732066756e6374696f6e20697320657865637574656420617420696e697469616c697a6174696f6e20616e64207365747320746865206f776e6572206f662074686520636f6e7472616374202a2fa2020202066756e6374696f6e206d6f7274616c2829207b206f776e6572203d206d73672e73656e6465723b207daa202020202f2a2046756e6374696f6e20746f207265636f766572207468652066756e6473206f6e2074686520636f6e7472616374202a2fa2020202066756e6374696f6e206b696c6c2829207b20696620286d73672e73656e646572203d3d206f776e6572292073756963696465286f776e6572293b207da7daa636f6e74726163742067726565746572206973206d6f7274616c207ba202020202f2a20646566696e65207661726961626c65206772656574696e67206f6620746865207479706520737472696e67202a2fa20202020737472696e67206772656574696e673baa202020202f2a20746869732072756e73207768656e2074686520636f6e7472616374206973206578656375746564202a2fa2020202066756e6374696f6e206772656574657228737472696e67205f6772656574696e6729207075626c6963207ba20202020202020206772656574696e67203d205f6772656574696e673ba202020207daa202020202f2a206d61696e2066756e6374696f6e202a2fa2020202066756e6374696f6e206772656574282920636f6e7374616e742072657475726e732028737472696e6729207ba202020202020202072657475726e206772656574696e673ba202020207da7d' - } -]; diff --git a/js/src/views/Signer/dappscomponents/index.js b/js/src/views/Signer/dappscomponents/index.js deleted file mode 100644 index 5c27c31a2a0..00000000000 --- a/js/src/views/Signer/dappscomponents/index.js +++ /dev/null @@ -1,24 +0,0 @@ -export Account from './Account'; -export AccountLink from './AccountLink'; -export AnimateChildren from './AnimateChildren'; -export Identicon from './Identicon'; -// export RpcAutoComplete from './RpcAutoComplete'; // TODO: needs json-rpc -export Toastr from './Toastr'; - -// TODO [todr] merge pending + finished (just a flag) -export RequestPendingWeb3 from './RequestPendingWeb3'; -export RequestFinishedWeb3 from './RequestFinishedWeb3'; - -export SignRequestWeb3 from './SignRequestWeb3'; -export SignRequest from './SignRequest'; - -// TODO [todr] Merge with Request -export TransactionFinished from './TransactionFinished'; -export TransactionFinishedWeb3 from './TransactionFinishedWeb3'; -export TransactionPending from './TransactionPending'; -export TransactionPendingWeb3 from './TransactionPendingWeb3'; - -export Web3Compositor from './Web3Compositor'; -export Web3Provider from './Web3Provider'; -export web3Extension from './util/web3.extensions'; -export Web3WebSocketProvider from './util/Web3WebSocketProvider'; diff --git a/js/src/views/Signer/dappscomponents/index.spec.js b/js/src/views/Signer/dappscomponents/index.spec.js deleted file mode 100644 index 6e7e978ce0f..00000000000 --- a/js/src/views/Signer/dappscomponents/index.spec.js +++ /dev/null @@ -1,10 +0,0 @@ -/* eslint-env mocha */ -/** - * Important: This test also serves as a point to - * import the entire lib for coverage reporting - */ - -import { assert } from 'chai'; -import * as DAppsUI from './'; - -describe('Dapps UI', () => it('should have exports', () => assert.ok(DAppsUI))); diff --git a/js/src/views/Signer/dappscomponents/middlewares/Logger.js b/js/src/views/Signer/dappscomponents/middlewares/Logger.js deleted file mode 100644 index 91d1e67638c..00000000000 --- a/js/src/views/Signer/dappscomponents/middlewares/Logger.js +++ /dev/null @@ -1,29 +0,0 @@ -import logger from '../util/logger'; - -export default class LoggerMiddleware { - - toMiddleware () { - return store => next => action => { - const msg = [`[${this.now()}] action:`, `${action.type};`, 'payload:', action.payload]; - if (action.type.match('error')) { - logger.warn(...msg); - } else { - logger.log(...msg); - } - return next(action); - }; - } - - now () { - const date = new Date(Date.now()); - const seconds = this.pad(date.getSeconds()); - const minutes = this.pad(date.getMinutes()); - const hour = this.pad(date.getHours()); - return `${hour}::${minutes}::${seconds}`; - } - - pad (n) { - return n < 10 ? '0' + n : n; - } - -} diff --git a/js/src/views/Signer/dappscomponents/middlewares/Toastr.js b/js/src/views/Signer/dappscomponents/middlewares/Toastr.js deleted file mode 100644 index efb78b83425..00000000000 --- a/js/src/views/Signer/dappscomponents/middlewares/Toastr.js +++ /dev/null @@ -1,65 +0,0 @@ - -import { addToast, removeToast } from '../actions/toastr'; - -export default class ToastrMiddleware { - - constructor (time = 6000) { - this._time = time; - this._timeouts = {}; - } - - toMiddleware () { - return store => next => action => { - const { type, payload } = action; - if (type === 'remove toast' || type === 'freezeToast') { - this.clearTimeoutFor(payload); - } - - if (type === 'add toast') { - this.onAddToast(store, next, action); - return; - } - - // pass along action - next(action); - - if (!this.shouldToast(action)) { - return; - } - - // if action should toast, call next again with toast values - this.toast(store, next, action); - }; - } - - toast (store, next, action) { - const { id } = store.getState().toastr; - const { msg, type } = action.meta.toastr; - next(addToast({ type, msg, id })); - this.setTimeoutFor(id, next); - } - - onAddToast (store, next, action) { - const { id } = store.getState().toastr; - action.payload.id = id; - next(action); - this.setTimeoutFor(id, next); - } - - setTimeoutFor (id, next) { - this._timeouts[String(id)] = setTimeout(() => { - this.clearTimeoutFor(id); - next(removeToast(id)); - }, this._time); - } - - shouldToast (action) { - return !!(action.meta && action.meta.toastr); - } - - clearTimeoutFor (id) { - clearTimeout(this._timeouts[String(id)]); - delete this._timeouts[String(id)]; - } - -} diff --git a/js/src/views/Signer/dappscomponents/middlewares/Toastr.spec.js b/js/src/views/Signer/dappscomponents/middlewares/Toastr.spec.js deleted file mode 100644 index 8ab369ff92a..00000000000 --- a/js/src/views/Signer/dappscomponents/middlewares/Toastr.spec.js +++ /dev/null @@ -1,174 +0,0 @@ -import sinon from 'sinon'; -import ToastrMiddleware from './Toastr'; -import { removeToast, addToast } from '../actions/toastr'; - -describe('MIDDLEWARE: TOASTR', () => { - let cut, state; - const time = 20; - let toastNo = 1; - - beforeEach('mock cut', () => { - cut = new ToastrMiddleware(time); - state = { - toastr: { - id: toastNo - } - }; - }); - - describe('TO MIDDLEWARE', () => { - beforeEach('mock methods', () => { - cut.clearTimeoutFor = sinon.spy(); - cut.toast = sinon.spy(); - }); - - it('should call only clearTimeoutFor and next, when respected action is dispatched', () => { - // given - const store = null; - const next = sinon.spy(); - const middleware = cut.toMiddleware()(store)(next); - const action = removeToast(toastNo); - expect(middleware).to.be.a('function'); - expect(action).to.be.an('object'); - - // when - middleware(action); - - // then - expect(cut.clearTimeoutFor.calledWith(toastNo)).to.be.true; - expect(next.calledWith(action)).to.be.true; - expect(cut.toast.called).to.be.false; - }); - - it('should call only next when non-respected action is dispatched', () => { - // given - const store = null; - const next = sinon.spy(); - const middleware = cut.toMiddleware()(store)(next); - const action = { type: 'test' }; - expect(middleware).to.be.a('function'); - expect(action).to.be.an('object'); - - // when - middleware(action); - - // then - expect(cut.clearTimeoutFor.called).to.be.false; - expect(next.calledWith(action)).to.be.true; - expect(cut.toast.called).to.be.false; - }); - - it('should call only next and toast, when action with meta toastr is dispatched', () => { - // given - const msg = 'test'; - const store = null; - const next = sinon.spy(); - const middleware = cut.toMiddleware()(store)(next); - const meta = { toastr: { msg, type: 'default' } }; - const action = { type: 'test', payload: 'test', meta }; - expect(middleware).to.be.a('function'); - expect(action).to.be.an('object'); - - // when - middleware(action); - - // then - expect(cut.clearTimeoutFor.called).to.be.false; - expect(next.calledWith(action)).to.be.true; - expect(cut.toast.calledWith(store, next, action)).to.be.true; - }); - }); - - describe('TOAST', () => { - // using 'before' doesn't work - // it might b overwriten by the global beforeEach - beforeEach('spy on removeToast', () => { - cut.setTimeoutFor = sinon.spy(); - }); - - it('should call next and setTimeoutFor', () => { - // given - const msg = 'text'; - const type = 'default'; - const store = { getState: () => state }; - const next = sinon.spy(); - const action = { meta: { toastr: { - msg, type - } } }; - - // when - cut.toast(store, next, action); - - // then - expect(next.calledWith(addToast({ - msg, type, id: toastNo - }))).to.be.true; - - expect(cut.setTimeoutFor.calledWith(toastNo, next)); - }); - }); - - describe('SET TIMEOUT FOR', () => { - beforeEach('spy on clearTimeoutFor', () => { - cut.clearTimeoutFor = sinon.spy(); - }); - it('should call clearTimeoutFor and next after cut._time', done => { - // given - const next = sinon.spy(); - - // when - cut.setTimeoutFor(toastNo, next); - - // then - expect(cut._timeouts[String(toastNo)]).to.be.an('object'); - setTimeout(() => { - expect(cut.clearTimeoutFor.calledWith(toastNo)).to.be.true; - expect(next.calledWith(removeToast(toastNo))).to.be.true; - done(); - }, time); - }); - }); - - describe('SHOULD TOAST', () => { - it('should return false when action isn\'t toastable', () => { - // given - const action = { meta: {} }; - - // when - const res = cut.shouldToast(action); - - // then - expect(res).to.be.false; - }); - it('should return true when action is toastable', () => { - // given - const action = { meta: { toastr: { msg: 'foo' } } }; - - // when - const res = cut.shouldToast(action); - - // then - expect(res).to.be.true; - }); - }); - describe('CLEAR TIMEOUT FOR', () => { - let mockedTimeoutSpy; - beforeEach('mock timeouts', () => { - mockedTimeoutSpy = sinon.spy(); - cut._timeouts[String(toastNo)] = setTimeout(() => { - mockedTimeoutSpy(); - }, time); - }); - it('should clear and delete timeout', done => { - // when - cut.clearTimeoutFor(toastNo); - - // then - expect(cut._timeouts[String(toastNo)]).to.be.undefined; - setTimeout(() => { - expect(mockedTimeoutSpy.called).to.be.false; - done(); - }, time); - }); - }); -}); diff --git a/js/src/views/Signer/dappscomponents/reducers/logger.js b/js/src/views/Signer/dappscomponents/reducers/logger.js deleted file mode 100644 index 2cd555e1e0b..00000000000 --- a/js/src/views/Signer/dappscomponents/reducers/logger.js +++ /dev/null @@ -1,15 +0,0 @@ -import { handleActions } from 'redux-actions'; - -const initialState = { - logging: process.env.LOGGING -}; - -export default handleActions({ - - 'update logging' (state, action) { - return { - logging: action.payload - }; - } - -}, initialState); diff --git a/js/src/views/Signer/dappscomponents/reducers/toastr.js b/js/src/views/Signer/dappscomponents/reducers/toastr.js deleted file mode 100644 index 47476c7a161..00000000000 --- a/js/src/views/Signer/dappscomponents/reducers/toastr.js +++ /dev/null @@ -1,26 +0,0 @@ - -import { handleActions } from 'redux-actions'; - -const initialState = { - toasts: [], - id: 1 -}; - -export default handleActions({ - - 'add toast' (state, action) { - return { - ...state, - id: state.id + 1, - toasts: [action.payload].concat(state.toasts) - }; - }, - - 'remove toast' (state, action) { - return { - ...state, - toasts: state.toasts.filter(t => t.id !== action.payload) - }; - } - -}, initialState); From c66291119e1f07fcf3c23e508b9795be2d3adee3 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 2 Sep 2016 17:14:51 +0200 Subject: [PATCH 0314/1062] unused files --- js/src/views/Signer/store/configureStore.js | 24 --------------------- js/src/views/Signer/store/index.js | 1 - 2 files changed, 25 deletions(-) delete mode 100644 js/src/views/Signer/store/configureStore.js delete mode 100644 js/src/views/Signer/store/index.js diff --git a/js/src/views/Signer/store/configureStore.js b/js/src/views/Signer/store/configureStore.js deleted file mode 100644 index b44a104d718..00000000000 --- a/js/src/views/Signer/store/configureStore.js +++ /dev/null @@ -1,24 +0,0 @@ -import { createStore, applyMiddleware } from 'redux'; - -import rootReducer from '../reducers'; - -export default function configure (middlewares) { - const create = window.devToolsExtension - ? window.devToolsExtension()(createStore) - : createStore; - - const createStoreWithMiddleware = applyMiddleware( - ...middlewares - )(create); - - const store = createStoreWithMiddleware(rootReducer); - - if (module.hot) { - module.hot.accept('../reducers', () => { - const nextReducer = require('../reducers'); - store.replaceReducer(nextReducer); - }); - } - - return store; -} diff --git a/js/src/views/Signer/store/index.js b/js/src/views/Signer/store/index.js deleted file mode 100644 index d39189a9641..00000000000 --- a/js/src/views/Signer/store/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './configureStore'; From 12942c0503781ecab2a099c117f299927c0eae2d Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 2 Sep 2016 17:41:21 +0200 Subject: [PATCH 0315/1062] live has correct txCount --- js/src/views/Application/application.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index 3e135bda3af..6c65c805866 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -49,6 +49,7 @@ class Application extends Component { static propTypes = { children: PropTypes.node, + netChain: PropTypes.string, onUpdateStatus: PropTypes.func } @@ -172,8 +173,9 @@ class Application extends Component { return Promise.all( balancesTxCounts.map(([balance, txCount], idx) => { const account = accounts[idx]; + const isTest = this.props.netChain === 'morden'; - account.txCount = txCount.sub(0x100000); // WHY? + account.txCount = txCount.sub(isTest ? 0x100000 : 0); // WHY? account.balances = [{ token: ETH_TOKEN, value: balance.toString() @@ -319,7 +321,11 @@ class Application extends Component { } function mapStateToProps (state) { - return {}; + const { netChain } = state.status; + + return { + netChain + }; } function mapDispatchToProps (dispatch) { From 38ac3a872d5b72feeac562df8b524f26e38c0304 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 2 Sep 2016 17:41:29 +0200 Subject: [PATCH 0316/1062] import image --- js/src/modals/FirstRun/Welcome/welcome.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/js/src/modals/FirstRun/Welcome/welcome.js b/js/src/modals/FirstRun/Welcome/welcome.js index e931cb73da7..630e25e8661 100644 --- a/js/src/modals/FirstRun/Welcome/welcome.js +++ b/js/src/modals/FirstRun/Welcome/welcome.js @@ -1,5 +1,7 @@ import React, { Component } from 'react'; +import imagesEthcore from '../../../images/ethcore-logo-white-square.png'; + const LOGO_STYLE = { float: 'right', width: '25%', @@ -11,7 +13,7 @@ export default class FirstRun extends Component { return (
Ethcore Ltd.

Welcome to Parity, the fastest and simplest way to run your node.

From e111b0da0d62e76827d4637b60ffe4055009ed79 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 5 Sep 2016 12:37:06 +0200 Subject: [PATCH 0317/1062] all items render in their own container, pending before finished (latest on-top) --- .../containers/LoadingPage/LoadingPage.css | 4 +- .../containers/LoadingPage/LoadingPage.js | 13 +++-- .../containers/OfflinePage/OfflinePage.js | 12 +++-- .../containers/RequestsPage/RequestsPage.css | 8 +++- .../containers/RequestsPage/RequestsPage.js | 47 +++++++++++++------ js/src/views/Signer/containers/Root/Root.css | 6 --- js/src/views/Signer/containers/Root/Root.js | 18 ++++--- 7 files changed, 66 insertions(+), 42 deletions(-) diff --git a/js/src/views/Signer/containers/LoadingPage/LoadingPage.css b/js/src/views/Signer/containers/LoadingPage/LoadingPage.css index 1d1d65f5846..87ed92ff48c 100644 --- a/js/src/views/Signer/containers/LoadingPage/LoadingPage.css +++ b/js/src/views/Signer/containers/LoadingPage/LoadingPage.css @@ -1,4 +1,4 @@ .main { - min-height: 100px; + padding: 3em 0; + text-align: center; } - diff --git a/js/src/views/Signer/containers/LoadingPage/LoadingPage.js b/js/src/views/Signer/containers/LoadingPage/LoadingPage.js index 98334e82b8d..c65e5030ad8 100644 --- a/js/src/views/Signer/containers/LoadingPage/LoadingPage.js +++ b/js/src/views/Signer/containers/LoadingPage/LoadingPage.js @@ -1,13 +1,20 @@ import React, { Component } from 'react'; +import { CircularProgress } from 'material-ui'; + +import { Container, ContainerTitle } from '../../../../ui'; import styles from './LoadingPage.css'; export default class LoadingPage extends Component { render () { return ( -
-

Connecting to Parity...

-
+ + +
+ +
+
); } } diff --git a/js/src/views/Signer/containers/OfflinePage/OfflinePage.js b/js/src/views/Signer/containers/OfflinePage/OfflinePage.js index 458a4e77cd5..c30bd675b76 100644 --- a/js/src/views/Signer/containers/OfflinePage/OfflinePage.js +++ b/js/src/views/Signer/containers/OfflinePage/OfflinePage.js @@ -2,6 +2,8 @@ import React, { Component, PropTypes } from 'react'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; +import { Container, ContainerTitle } from '../../../../ui'; + import { updateAppState } from '../../actions/signer'; import { isExtension } from '../../utils/extension'; @@ -12,11 +14,11 @@ class OfflinePage extends Component { render () { return ( -
-

Offline

-

Couldn't connect to the node. Make sure Parity is running and Trusted Signer is enabled.

+ + ContainerTitle title='Offline' /> +

Could not connect to the node. Make sure Parity is running and Trusted Signer is enabled.

{ this.renderInstallLink() } -
+ ); } @@ -27,7 +29,7 @@ class OfflinePage extends Component { return (

- If you don't have Parity installed yet, get it here. + If you do not have Parity installed yet, get it here.

); } diff --git a/js/src/views/Signer/containers/RequestsPage/RequestsPage.css b/js/src/views/Signer/containers/RequestsPage/RequestsPage.css index 75bcce9097b..e2e315ac738 100644 --- a/js/src/views/Signer/containers/RequestsPage/RequestsPage.css +++ b/js/src/views/Signer/containers/RequestsPage/RequestsPage.css @@ -1,7 +1,11 @@ .request:not(:first-child) { - border-top: 1px solid #eee; + border-top: 1px solid #444; } .noRequestsMsg { - padding: 25px 0 ; + padding: 25px 0; + color: #aaa; +} + +.items { } diff --git a/js/src/views/Signer/containers/RequestsPage/RequestsPage.js b/js/src/views/Signer/containers/RequestsPage/RequestsPage.js index a25a38d2142..2cf83188c9a 100644 --- a/js/src/views/Signer/containers/RequestsPage/RequestsPage.js +++ b/js/src/views/Signer/containers/RequestsPage/RequestsPage.js @@ -1,7 +1,10 @@ +import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; +import { Container, ContainerTitle } from '../../../../ui'; + import { RequestPendingWeb3, RequestFinishedWeb3 } from '../../components'; import * as RequestsActions from '../../actions/requests'; @@ -28,37 +31,51 @@ class RequestsPage extends Component { return (
- { this.renderFinishedRequests() } { this.renderPendingRequests() } + { this.renderFinishedRequests() }
); } + _sortRequests = (a, b) => { + return new BigNumber(b.id).cmp(a.id); + } + renderPendingRequests () { - const { requests } = this.props; - if (!requests.pending.length) { + const { pending } = this.props.requests; + + if (!pending.length) { return; } + const items = pending.sort(this._sortRequests).map(data => this.renderPending(data)); + return ( -
-

Pending Requests

-
{ requests.pending.map(data => this.renderPending(data)) }
-
+ + +
+ { items } +
+
); } renderFinishedRequests () { const { finished } = this.props.requests; + if (!finished.length) { return; } + const items = finished.sort(this._sortRequests).map(data => this.renderFinished(data)); + return ( -
-

Finished Requests

-
{ finished.map(data => this.renderFinished(data)) }
-
+ + +
+ { items } +
+
); } @@ -98,9 +115,11 @@ class RequestsPage extends Component { renderNoRequestsMsg () { return ( -
-

There are no requests requiring your confirmation.

-
+ +
+ There are no requests requiring your confirmation. +
+
); } } diff --git a/js/src/views/Signer/containers/Root/Root.css b/js/src/views/Signer/containers/Root/Root.css index f487fe21016..2a79de74b92 100644 --- a/js/src/views/Signer/containers/Root/Root.css +++ b/js/src/views/Signer/containers/Root/Root.css @@ -2,10 +2,4 @@ } .mainContainer { - width: 800px; - max-width: 100%; - margin-right: auto; - margin-left: auto; - padding: 0 25px 25px; - box-sizing: border-box; } diff --git a/js/src/views/Signer/containers/Root/Root.js b/js/src/views/Signer/containers/Root/Root.js index 035a72287f8..f7e11b7b435 100644 --- a/js/src/views/Signer/containers/Root/Root.js +++ b/js/src/views/Signer/containers/Root/Root.js @@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; -import { Actionbar, Container } from '../../../../ui'; +import { Actionbar } from '../../../../ui'; import { ToastrContainer } from '../../components'; import { removeToast } from '../../actions/toastr'; @@ -36,15 +36,13 @@ export class Root extends Component {
- -
- { this.renderPage() } -
- -
+
+ { this.renderPage() } +
+
); } From 753dfa8ed1388ac0895ea52e3ea9bee6ddad3380 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 5 Sep 2016 12:39:33 +0200 Subject: [PATCH 0318/1062] offine bugfix --- js/src/views/Signer/containers/OfflinePage/OfflinePage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/views/Signer/containers/OfflinePage/OfflinePage.js b/js/src/views/Signer/containers/OfflinePage/OfflinePage.js index c30bd675b76..d2db51907ce 100644 --- a/js/src/views/Signer/containers/OfflinePage/OfflinePage.js +++ b/js/src/views/Signer/containers/OfflinePage/OfflinePage.js @@ -15,7 +15,7 @@ class OfflinePage extends Component { render () { return ( - ContainerTitle title='Offline' /> +

Could not connect to the node. Make sure Parity is running and Trusted Signer is enabled.

{ this.renderInstallLink() }
From 0287902d0cac813406e0a2cdb3a9d40684c99adb Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 5 Sep 2016 15:04:53 +0200 Subject: [PATCH 0319/1062] s/txhash/transaction/ --- js/src/views/Account/Transactions/transactions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/views/Account/Transactions/transactions.js b/js/src/views/Account/Transactions/transactions.js index 7b085b477f9..bd34d086c6e 100644 --- a/js/src/views/Account/Transactions/transactions.js +++ b/js/src/views/Account/Transactions/transactions.js @@ -144,7 +144,7 @@ export default class Transactions extends Component {
- + From 9b77e0e8557773c0f29e96216e0a570d89861457 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 5 Sep 2016 15:42:26 +0200 Subject: [PATCH 0320/1062] properly determine test network all around --- .../Account/Transactions/transactions.js | 52 ++++++++++++------- js/src/views/Application/Status/reducers.js | 5 +- js/src/views/Application/Status/status.js | 15 +++--- js/src/views/Application/application.js | 11 ++-- 4 files changed, 52 insertions(+), 31 deletions(-) diff --git a/js/src/views/Account/Transactions/transactions.js b/js/src/views/Account/Transactions/transactions.js index bd34d086c6e..4f905814737 100644 --- a/js/src/views/Account/Transactions/transactions.js +++ b/js/src/views/Account/Transactions/transactions.js @@ -1,5 +1,7 @@ import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; import moment from 'moment'; import LinearProgress from 'material-ui/LinearProgress'; @@ -35,7 +37,7 @@ function formatEther (value) { return null; } -export default class Transactions extends Component { +class Transactions extends Component { static contextTypes = { api: PropTypes.object, accounts: PropTypes.array, @@ -45,7 +47,8 @@ export default class Transactions extends Component { } static propTypes = { - address: PropTypes.string.isRequired + address: PropTypes.string.isRequired, + isTest: PropTypes.bool } state = { @@ -100,10 +103,9 @@ export default class Transactions extends Component { } renderTransactions () { + const { isTest } = this.props; + const prefix = `https://${isTest ? 'testnet.' : ''}etherscan.io/`; let transactions = null; - const prefix = this.state.isTest - ? 'https://testnet.etherscan.io/' - : 'https://etherscan.io/'; if (this.state.transactions && this.state.transactions.length) { transactions = (this.state.transactions || []).map((tx) => { @@ -169,20 +171,32 @@ export default class Transactions extends Component { } getTransactions = () => { - this.context.api.ethcore - .netChain() - .then((netChain) => { - const isTest = netChain === 'morden'; - - return etherscan.account - .transactions(this.props.address, 0, isTest) - .then((transactions) => { - this.setState({ - transactions, - isTest, - loading: false - }); - }); + const { isTest } = this.props; + + return etherscan.account + .transactions(this.props.address, 0, isTest) + .then((transactions) => { + this.setState({ + transactions, + loading: false + }); }); } } + +function mapStateToProps (state) { + const { isTest } = state.status; + + return { + isTest + }; +} + +function mapDispatchToProps (dispatch) { + return bindActionCreators({}, dispatch); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(Transactions); diff --git a/js/src/views/Application/Status/reducers.js b/js/src/views/Application/Status/reducers.js index eec5e4c1871..f633c930ed4 100644 --- a/js/src/views/Application/Status/reducers.js +++ b/js/src/views/Application/Status/reducers.js @@ -1,11 +1,12 @@ function updateStatus (state, action) { - const { blockNumber, clientVersion, netPeers, netChain } = action.status; + const { blockNumber, clientVersion, netPeers, netChain, isTest } = action.status; return Object.assign({}, state, { blockNumber, clientVersion, netPeers, - netChain + netChain, + isTest }); } diff --git a/js/src/views/Application/Status/status.js b/js/src/views/Application/Status/status.js index df765bb24aa..43c29eaff39 100644 --- a/js/src/views/Application/Status/status.js +++ b/js/src/views/Application/Status/status.js @@ -9,13 +9,13 @@ class Status extends Component { blockNumber: PropTypes.object, clientVersion: PropTypes.string, netPeers: PropTypes.object, - netChain: PropTypes.string + netChain: PropTypes.string, + isTest: PropTypes.bool } render () { - const { clientVersion, blockNumber, netChain, netPeers } = this.props; - const isTestNet = netChain === 'morden'; - const netStyle = `${styles.network} ${styles[isTestNet ? 'networktest' : 'networklive']}`; + const { clientVersion, blockNumber, netChain, netPeers, isTest } = this.props; + const netStyle = `${styles.network} ${styles[isTest ? 'networktest' : 'networklive']}`; if (!blockNumber) { return null; @@ -36,7 +36,7 @@ class Status extends Component {
- { isTestNet ? 'test' : netChain } + { isTest ? 'test' : netChain }
@@ -45,13 +45,14 @@ class Status extends Component { } function mapStateToProps (state) { - const { blockNumber, clientVersion, netPeers, netChain } = state.status; + const { blockNumber, clientVersion, netPeers, netChain, isTest } = state.status; return { blockNumber, clientVersion, netPeers, - netChain + netChain, + isTest }; } diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index 6c65c805866..838252bfabf 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -50,6 +50,7 @@ class Application extends Component { static propTypes = { children: PropTypes.node, netChain: PropTypes.string, + isTest: PropTypes.bool, onUpdateStatus: PropTypes.func } @@ -173,7 +174,7 @@ class Application extends Component { return Promise.all( balancesTxCounts.map(([balance, txCount], idx) => { const account = accounts[idx]; - const isTest = this.props.netChain === 'morden'; + const { isTest } = this.props; account.txCount = txCount.sub(isTest ? 0x100000 : 0); // WHY? account.balances = [{ @@ -291,6 +292,8 @@ class Application extends Component { api.eth.syncing() ]) .then(([blockNumber, clientVersion, netChain, netPeers, syncing]) => { + const isTest = netChain === 'morden' || netChain === 'testnet'; + if (blockNumber.gt(lastBlockNumber)) { lastBlockNumber = blockNumber; this.retrieveBalances(); @@ -301,6 +304,7 @@ class Application extends Component { clientVersion, netChain, netPeers, + isTest, syncing }); @@ -321,10 +325,11 @@ class Application extends Component { } function mapStateToProps (state) { - const { netChain } = state.status; + const { netChain, isTest } = state.status; return { - netChain + netChain, + isTest }; } From 91d1cbd0e82dff8085a9fedcc48208be67a7072d Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 5 Sep 2016 17:04:00 +0200 Subject: [PATCH 0321/1062] fix disconnected error (Signer) --- .../Signer/providers/signerDataProvider.js | 32 ++++++++++--------- js/src/views/Signer/reducers/signer.js | 1 + js/src/views/Signer/utils/parity.js | 24 +++++++------- js/webpack.config.js | 2 +- 4 files changed, 30 insertions(+), 29 deletions(-) diff --git a/js/src/views/Signer/providers/signerDataProvider.js b/js/src/views/Signer/providers/signerDataProvider.js index 0ba33a0f2ec..e0103bcdcea 100644 --- a/js/src/views/Signer/providers/signerDataProvider.js +++ b/js/src/views/Signer/providers/signerDataProvider.js @@ -7,33 +7,35 @@ export default class SignerDataProvider { constructor (store, ws) { this.store = store; this.ws = ws; - this.ws.onOpen.push(::this.onWsOpen); - this.ws.onError.push(::this.onWsError); - this.ws.onClose.push(::this.onWsError); this.checkIfIsRunning(); + + this.ws.onOpen.push(this.onWsOpen); + this.ws.onError.push(this.onWsError); + this.ws.onClose.push(this.onWsError); } - checkIfIsRunning () { + checkIfIsRunning = () => { const { isNodeRunning, isLoading, url } = this.store.getState().signer; + const nextCheck = () => setTimeout(this.checkIfIsRunning, 1000); - isParityRunning(url).then(isRunning => { - if (isRunning !== isNodeRunning || isLoading) { - this.store.dispatch(updateIsNodeRunning(isRunning)); - } + isParityRunning(url) + .then((isRunning) => { + if (isRunning !== isNodeRunning || isLoading) { + this.store.dispatch(updateIsNodeRunning(isRunning)); + } - // call later - const interval = isRunning ? 5000 : 1000; - setTimeout(() => this.checkIfIsRunning(), interval); - }); + nextCheck(); + }); } - onWsOpen () { - logger.log('[APP Provider] connected'); + onWsOpen = () => { + logger.log('[Signer Provider] connected'); this.store.dispatch(updateIsConnected(true)); } - onWsError () { + onWsError = () => { + logger.log('[Signer Provider] error'); this.store.dispatch(updateIsConnected(false)); } } diff --git a/js/src/views/Signer/reducers/signer.js b/js/src/views/Signer/reducers/signer.js index 7089b7a757a..6af9487c3d1 100644 --- a/js/src/views/Signer/reducers/signer.js +++ b/js/src/views/Signer/reducers/signer.js @@ -29,6 +29,7 @@ export default handleActions({ 'update isNodeRunning' (state, action) { const isRunning = action.payload; const goesOnline = isRunning && !state.isNodeRunning; + console.log('isNodeRunning', isRunning); return { ...state, diff --git a/js/src/views/Signer/utils/parity.js b/js/src/views/Signer/utils/parity.js index 4c2894fbc63..ac02e7f6fb4 100644 --- a/js/src/views/Signer/utils/parity.js +++ b/js/src/views/Signer/utils/parity.js @@ -1,20 +1,18 @@ -import axios from 'axios'; import logger from './logger'; import { isExtension } from './extension'; const isProd = process.env.NODE_ENV === 'production'; -export const isParityRunning = path => { - try { - return axios.get(isProd || isExtension() ? `http://${path}/index.html` : `http://${window.location.host}/api/ping`) - .then(res => true) - .catch(err => { - logger.warn('[UTIL Parity] err', err); - return false; - }); - } catch (err) { - logger.warn('[UTIL Parity] err', err); - return new Promise((resolve, reject) => resolve(false)); - } +export const isParityRunning = (path) => { + const url = isProd || isExtension() + ? `http://${path}/index.html` + : `http://${window.location.host}/api/ping`; + + return fetch(url, { method: 'GET' }) + .then(() => true) + .catch((error) => { + logger.error('isParityRunning', error); + return false; + }); }; diff --git a/js/webpack.config.js b/js/webpack.config.js index 1f2528b53c3..302631c0bb3 100644 --- a/js/webpack.config.js +++ b/js/webpack.config.js @@ -140,7 +140,7 @@ module.exports = { changeOrigin: true }, '/api/ping': { - forward: 'http://127.0.0.1:8180/index.html', + target: 'http://127.0.0.1:8080/index.html', changeOrigin: true } } From 6cbc2cb0c9a8a4aea39c706a3bdbfa165f352caf Mon Sep 17 00:00:00 2001 From: Jannis R Date: Mon, 5 Sep 2016 16:40:54 +0200 Subject: [PATCH 0322/1062] improve wording in new account panel --- js/src/modals/CreateAccount/CreationType/creationType.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/modals/CreateAccount/CreationType/creationType.js b/js/src/modals/CreateAccount/CreationType/creationType.js index 955880b30f1..a29a30c4987 100644 --- a/js/src/modals/CreateAccount/CreationType/creationType.js +++ b/js/src/modals/CreateAccount/CreationType/creationType.js @@ -21,7 +21,7 @@ export default class CreationType extends Component { name='creationType' onChange={ this.onChange }> Date: Mon, 5 Sep 2016 17:20:55 +0200 Subject: [PATCH 0323/1062] api doesn't come from context --- js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js | 2 +- js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js b/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js index 5c12047da6a..2575ca641f1 100644 --- a/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js +++ b/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js @@ -151,7 +151,7 @@ export default class ActionBuyIn extends Component { } onSend = () => { - const { api, instance } = this.context; + const { instance } = this.context; const maxPrice = api.format.toWei(this.state.maxPrice); const values = [this.state.account.address, maxPrice.toString()]; const options = { diff --git a/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js b/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js index e81c1e64ddc..983d171c3ce 100644 --- a/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js +++ b/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js @@ -134,7 +134,7 @@ export default class ActionRefund extends Component { } onSend = () => { - const { api, instance } = this.context; + const { instance } = this.context; const price = api.format.toWei(this.state.price); const amount = new BigNumber(this.state.amount).mul(DIVISOR); const values = [price.toString(), amount.toFixed(0)]; From 6464b11e2af66939bf9c29c56c0c9691c24cf678 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 5 Sep 2016 18:36:49 +0200 Subject: [PATCH 0324/1062] hacky name display in Signer --- .../modals/AddressBook/AddEntry/addEntry.js | 2 +- .../modals/AddressBook/EditEntry/editEntry.js | 2 +- js/src/services/lookup.js | 16 +++++++++++ js/src/{services => util}/abi/eip20.json | 0 js/src/{services => util}/abi/index.js | 0 js/src/{services => util}/abi/registry.json | 0 js/src/{services => util}/abi/tokenreg.json | 0 js/src/util/index.js | 5 ++++ js/src/util/lookup.js | 16 +++++++++++ js/src/{services => util}/validation.js | 0 .../Account/Transactions/transactions.js | 16 ++--------- js/src/views/Application/application.js | 2 +- .../Signer/components/Account/Account.css | 3 +- .../Signer/components/Account/Account.js | 28 +++++++++++++++---- .../components/AccountLink/AccountLink.js | 9 ++++-- .../RequestPendingWeb3/RequestPendingWeb3.js | 4 +-- 16 files changed, 76 insertions(+), 27 deletions(-) create mode 100644 js/src/services/lookup.js rename js/src/{services => util}/abi/eip20.json (100%) rename js/src/{services => util}/abi/index.js (100%) rename js/src/{services => util}/abi/registry.json (100%) rename js/src/{services => util}/abi/tokenreg.json (100%) create mode 100644 js/src/util/index.js create mode 100644 js/src/util/lookup.js rename js/src/{services => util}/validation.js (100%) diff --git a/js/src/modals/AddressBook/AddEntry/addEntry.js b/js/src/modals/AddressBook/AddEntry/addEntry.js index f42e5066d61..0d8df5e5226 100644 --- a/js/src/modals/AddressBook/AddEntry/addEntry.js +++ b/js/src/modals/AddressBook/AddEntry/addEntry.js @@ -5,7 +5,7 @@ import ContentAdd from 'material-ui/svg-icons/content/add'; import ContentClear from 'material-ui/svg-icons/content/clear'; import { Modal, Form, Input, InputAddress } from '../../../ui'; -import { ERRORS, validateAddress, validateName } from '../../../services/validation'; +import { ERRORS, validateAddress, validateName } from '../../../util/validation'; import styles from '../addressBook.css'; diff --git a/js/src/modals/AddressBook/EditEntry/editEntry.js b/js/src/modals/AddressBook/EditEntry/editEntry.js index c6527a328f7..58d2588b4a1 100644 --- a/js/src/modals/AddressBook/EditEntry/editEntry.js +++ b/js/src/modals/AddressBook/EditEntry/editEntry.js @@ -5,7 +5,7 @@ import ContentAdd from 'material-ui/svg-icons/content/add'; import ContentClear from 'material-ui/svg-icons/content/clear'; import { Modal, Form, Input, InputAddress } from '../../../ui'; -import { validateName } from '../../../services/validation'; +import { validateName } from '../../../util/validation'; import styles from '../addressBook.css'; diff --git a/js/src/services/lookup.js b/js/src/services/lookup.js new file mode 100644 index 00000000000..e909083072d --- /dev/null +++ b/js/src/services/lookup.js @@ -0,0 +1,16 @@ +export function retrieveAccount (address, accounts, contacts, contracts, tokens) { + const cmp = (_account) => _account.address === address; + + let account = accounts.find(cmp); + if (!account) { + account = contacts.find(cmp); + if (!account) { + account = contracts.find(cmp); + if (!account) { + account = tokens.find(cmp); + } + } + } + + return account; +} diff --git a/js/src/services/abi/eip20.json b/js/src/util/abi/eip20.json similarity index 100% rename from js/src/services/abi/eip20.json rename to js/src/util/abi/eip20.json diff --git a/js/src/services/abi/index.js b/js/src/util/abi/index.js similarity index 100% rename from js/src/services/abi/index.js rename to js/src/util/abi/index.js diff --git a/js/src/services/abi/registry.json b/js/src/util/abi/registry.json similarity index 100% rename from js/src/services/abi/registry.json rename to js/src/util/abi/registry.json diff --git a/js/src/services/abi/tokenreg.json b/js/src/util/abi/tokenreg.json similarity index 100% rename from js/src/services/abi/tokenreg.json rename to js/src/util/abi/tokenreg.json diff --git a/js/src/util/index.js b/js/src/util/index.js new file mode 100644 index 00000000000..aabf726606c --- /dev/null +++ b/js/src/util/index.js @@ -0,0 +1,5 @@ +import { retrieveAccount } from './lookup'; + +export { + retrieveAccount +}; diff --git a/js/src/util/lookup.js b/js/src/util/lookup.js new file mode 100644 index 00000000000..e909083072d --- /dev/null +++ b/js/src/util/lookup.js @@ -0,0 +1,16 @@ +export function retrieveAccount (address, accounts, contacts, contracts, tokens) { + const cmp = (_account) => _account.address === address; + + let account = accounts.find(cmp); + if (!account) { + account = contacts.find(cmp); + if (!account) { + account = contracts.find(cmp); + if (!account) { + account = tokens.find(cmp); + } + } + } + + return account; +} diff --git a/js/src/services/validation.js b/js/src/util/validation.js similarity index 100% rename from js/src/services/validation.js rename to js/src/util/validation.js diff --git a/js/src/views/Account/Transactions/transactions.js b/js/src/views/Account/Transactions/transactions.js index 4f905814737..ff3a64a574b 100644 --- a/js/src/views/Account/Transactions/transactions.js +++ b/js/src/views/Account/Transactions/transactions.js @@ -5,6 +5,7 @@ import { bindActionCreators } from 'redux'; import moment from 'moment'; import LinearProgress from 'material-ui/LinearProgress'; +import { retrieveAccount } from '../../../util'; import format from '../../../api/format'; import etherscan from '../../../3rdparty/etherscan'; import { Container, IdentityIcon } from '../../../ui'; @@ -69,19 +70,8 @@ class Transactions extends Component { } renderAddress (prefix, address) { - const cmp = (_account) => _account.address === address; - - let account = this.context.accounts.find(cmp); - if (!account) { - account = this.context.contacts.find(cmp); - if (!account) { - account = this.context.contracts.find(cmp); - if (!account) { - account = this.context.tokens.find(cmp); - } - } - } - + const { accounts, contacts, contracts, tokens } = this.context; + const account = retrieveAccount(address, accounts, contacts, contracts, tokens); const link = `${prefix}address/${address}`; const name = account ? account.name.toUpperCase() diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index 838252bfabf..9030c282878 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -4,7 +4,7 @@ import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import Api from '../../api'; -import { eip20Abi, registryAbi, tokenRegAbi } from '../../services/abi'; +import { eip20Abi, registryAbi, tokenRegAbi } from '../../util/abi'; import Container from './Container'; import DappContainer from './DappContainer'; diff --git a/js/src/views/Signer/components/Account/Account.css b/js/src/views/Signer/components/Account/Account.css index a5720700f5d..5791d82a9b4 100644 --- a/js/src/views/Signer/components/Account/Account.css +++ b/js/src/views/Signer/components/Account/Account.css @@ -22,7 +22,8 @@ text-overflow: ellipsis; overflow: hidden; white-space: nowrap; - max-width: 110px; + min-width: 330px; display: inline-block; vertical-align: middle; + text-transform: uppercase; } diff --git a/js/src/views/Signer/components/Account/Account.js b/js/src/views/Signer/components/Account/Account.js index 6fab66adca9..10ed8a48267 100644 --- a/js/src/views/Signer/components/Account/Account.js +++ b/js/src/views/Signer/components/Account/Account.js @@ -2,17 +2,22 @@ import React, { Component, PropTypes } from 'react'; import styles from './Account.css'; +import { retrieveAccount } from '../../../../util'; import { IdentityIcon } from '../../../../ui'; import AccountLink from '../AccountLink'; export default class Account extends Component { + static contextTypes = { + accounts: PropTypes.array, + contacts: PropTypes.array, + contracts: PropTypes.array + } static propTypes = { className: PropTypes.string, address: PropTypes.string.isRequired, chain: PropTypes.string.isRequired, - balance: PropTypes.object, // eth BigNumber, not required since it mght take time to fetch - name: PropTypes.string + balance: PropTypes.object // eth BigNumber, not required since it mght take time to fetch }; state = { @@ -50,7 +55,9 @@ export default class Account extends Component { } renderTitle () { - const { name, address } = this.props; + const { address } = this.props; + const name = this._retrieveName(); + if (name) { return address + ' ' + name; } @@ -66,7 +73,9 @@ export default class Account extends Component { } renderName () { - const { address, name } = this.props; + const { address } = this.props; + const name = this._retrieveName(); + if (!name) { return ( @@ -74,6 +83,7 @@ export default class Account extends Component { ); } + return ( @@ -84,6 +94,15 @@ export default class Account extends Component { ); } + _retrieveName () { + const { accounts, contacts, contracts, tokens } = this.context; + const { address } = this.props; + + const account = retrieveAccount(address, accounts, contacts, contracts, tokens); + + return account ? account.name : null; + } + tinyAddress () { const { address } = this.props; const len = address.length; @@ -95,5 +114,4 @@ export default class Account extends Component { const len = address.length; return address.slice(2, 8) + '..' + address.slice(len - 7); } - } diff --git a/js/src/views/Signer/components/AccountLink/AccountLink.js b/js/src/views/Signer/components/AccountLink/AccountLink.js index 5b2a6fb2b53..9fae2e28000 100644 --- a/js/src/views/Signer/components/AccountLink/AccountLink.js +++ b/js/src/views/Signer/components/AccountLink/AccountLink.js @@ -4,7 +4,6 @@ import { getAccountLink } from '../util/account'; import styles from './AccountLink.css'; export default class AccountLink extends Component { - static propTypes = { chain: PropTypes.string.isRequired, address: PropTypes.string.isRequired, @@ -18,11 +17,13 @@ export default class AccountLink extends Component { componentWillMount () { const { address, chain } = this.props; + this.updateLink(address, chain); } componentWillReceiveProps (nextProps) { const { address, chain } = nextProps; + this.updateLink(address, chain); } @@ -41,7 +42,9 @@ export default class AccountLink extends Component { updateLink (address, chain) { const link = getAccountLink(address, chain); - this.setState({ link }); - } + this.setState({ + link + }); + } } diff --git a/js/src/views/Signer/components/RequestPendingWeb3/RequestPendingWeb3.js b/js/src/views/Signer/components/RequestPendingWeb3/RequestPendingWeb3.js index b592d45c0ed..ab494740159 100644 --- a/js/src/views/Signer/components/RequestPendingWeb3/RequestPendingWeb3.js +++ b/js/src/views/Signer/components/RequestPendingWeb3/RequestPendingWeb3.js @@ -1,7 +1,7 @@ import React, { Component, PropTypes } from 'react'; import TransactionPendingWeb3 from '../TransactionPendingWeb3'; -import SignWeb3 from '../SignRequestWeb3'; +import SignRequestWeb3 from '../SignRequestWeb3'; import Web3Compositor from '../Web3Compositor'; class RequestPendingWeb3 extends Component { @@ -27,7 +27,7 @@ class RequestPendingWeb3 extends Component { if (payload.sign) { const { sign } = payload; return ( - Date: Mon, 5 Sep 2016 19:10:10 +0200 Subject: [PATCH 0325/1062] expand props & state instead of this.{props,state} --- .../AccountDetails/accountDetails.js | 14 ++++-- .../AccountDetailsGeth/accountDetailsGeth.js | 10 ++-- .../CreateAccount/NewAccount/newAccount.js | 47 +++++++++++-------- .../modals/CreateAccount/NewGeth/newGeth.js | 12 +++-- js/src/modals/FirstRun/firstRun.js | 17 +++---- js/src/modals/FundAccount/fundAccount.js | 4 +- js/src/modals/Transfer/transfer.js | 28 +++++++---- 7 files changed, 80 insertions(+), 52 deletions(-) diff --git a/js/src/modals/CreateAccount/AccountDetails/accountDetails.js b/js/src/modals/CreateAccount/AccountDetails/accountDetails.js index fbb9a723fa9..1ad2b80da98 100644 --- a/js/src/modals/CreateAccount/AccountDetails/accountDetails.js +++ b/js/src/modals/CreateAccount/AccountDetails/accountDetails.js @@ -11,24 +11,26 @@ export default class AccountDetails extends Component { } render () { + const { address, name } = this.props; + return (
+ address={ address } /> + value={ name } /> + value={ address } /> { this.renderPhrase() } @@ -36,7 +38,9 @@ export default class AccountDetails extends Component { } renderPhrase () { - if (!this.props.phrase) { + const { phrase } = this.props; + + if (!phrase) { return null; } @@ -48,7 +52,7 @@ export default class AccountDetails extends Component { label='account recovery phrase (take note)' multiLine rows={ 1 } - value={ this.props.phrase } /> + value={ phrase } /> ); } diff --git a/js/src/modals/CreateAccount/AccountDetailsGeth/accountDetailsGeth.js b/js/src/modals/CreateAccount/AccountDetailsGeth/accountDetailsGeth.js index 39b47f1cb62..5fea7188b5e 100644 --- a/js/src/modals/CreateAccount/AccountDetailsGeth/accountDetailsGeth.js +++ b/js/src/modals/CreateAccount/AccountDetailsGeth/accountDetailsGeth.js @@ -8,15 +8,17 @@ export default class AccountDetailsGeth extends Component { } render () { - const addresses = this.props.addresses.map((address, idx) => { - const comma = !idx ? '' : ((idx === this.props.addresses.length - 1) ? ' & ' : ', '); + const { addresses } = this.props; + + const formatted = addresses.map((address, idx) => { + const comma = !idx ? '' : ((idx === addresses.length - 1) ? ' & ' : ', '); return `${comma}${address}`; }).join(''); return (
-
You have imported { this.props.addresses.length } addresses from the Geth keystore:
-
{ addresses }
+
You have imported { addresses.length } addresses from the Geth keystore:
+
{ formatted }
); } diff --git a/js/src/modals/CreateAccount/NewAccount/newAccount.js b/js/src/modals/CreateAccount/NewAccount/newAccount.js index 5c1e8c39d4e..f1aa1860ddc 100644 --- a/js/src/modals/CreateAccount/NewAccount/newAccount.js +++ b/js/src/modals/CreateAccount/NewAccount/newAccount.js @@ -47,18 +47,20 @@ class CreateAccount extends Component { } render () { + const { accountName, accountNameError, passwordHint, password1, password1Error, password2, password2Error } = this.state; + return (
@@ -67,8 +69,8 @@ class CreateAccount extends Component { label='password' hint='a strong, unique password' type='password' - error={ this.state.password1Error } - value={ this.state.password1 } + error={ password1Error } + value={ password1 } onChange={ this.onEditPassword1 } />
@@ -77,8 +79,8 @@ class CreateAccount extends Component { label='password (repeat)' hint='verify your password' type='password' - error={ this.state.password2Error } - value={ this.state.password2 } + error={ password2Error } + value={ password2 } onChange={ this.onEditPassword2 } />
@@ -89,11 +91,13 @@ class CreateAccount extends Component { } renderIdentitySelector () { - if (!this.state.accounts) { + const { accounts, selectedAddress } = this.state; + + if (!accounts) { return null; } - const buttons = Object.keys(this.state.accounts).map((address) => { + const buttons = Object.keys(accounts).map((address) => { return ( @@ -114,11 +118,13 @@ class CreateAccount extends Component { } renderIdentities () { - if (!this.state.accounts) { + const { accounts } = this.state; + + if (!accounts) { return null; } - const identities = Object.keys(this.state.accounts).map((address) => { + const identities = Object.keys(accounts).map((address) => { return (
{ - const api = this.context.api; + const { api } = this.context; Promise .all([ @@ -186,12 +192,15 @@ class CreateAccount extends Component { } updateParent = () => { - this.props.onChange(this.state.isValidName && this.state.isValidPass, { - address: this.state.selectedAddress, - name: this.state.accountName, - passwordHint: this.state.passwordHint, - password: this.state.password1, - phrase: this.state.accounts[this.state.selectedAddress].phrase + const { isValidName, isValidPass, accounts, accountName, passwordHint, password1, selectedAddress } = this.state; + const isValid = isValidName && isValidPass; + + this.props.onChange(isValid, { + address: selectedAddress, + name: accountName, + passwordHint, + password: password1, + phrase: accounts[selectedAddress].phrase }); } diff --git a/js/src/modals/CreateAccount/NewGeth/newGeth.js b/js/src/modals/CreateAccount/NewGeth/newGeth.js index b2ed97d82f8..b12ea696926 100644 --- a/js/src/modals/CreateAccount/NewGeth/newGeth.js +++ b/js/src/modals/CreateAccount/NewGeth/newGeth.js @@ -25,12 +25,14 @@ export default class NewGeth extends Component { } render () { - if (!this.state.available.length) { + const { available } = this.state; + + if (!available.length) { return (
There are currently no importable keys available from the Geth keystore, which are not already available on your Parity instance
); } - const checkboxes = this.state.available.map((account) => { + const checkboxes = available.map((account) => { const label = (
@@ -69,7 +71,7 @@ export default class NewGeth extends Component { return; } - const available = this.state.available; + const { available } = this.state; const account = available.find((_account) => _account.address === address); account.checked = checked; const selected = available.filter((_account) => _account.checked); @@ -82,7 +84,7 @@ export default class NewGeth extends Component { } loadAvailable = () => { - const api = this.context.api; + const { accounts, api } = this.context; api.personal .listGethAccounts() @@ -95,7 +97,7 @@ export default class NewGeth extends Component { this.setState({ available: addresses .filter((address) => { - return !this.context.accounts.find((account) => account.address === address); + return !accounts.find((account) => account.address === address); }) .map((address, idx) => { return { diff --git a/js/src/modals/FirstRun/firstRun.js b/js/src/modals/FirstRun/firstRun.js index 57d7313888b..4cba426c040 100644 --- a/js/src/modals/FirstRun/firstRun.js +++ b/js/src/modals/FirstRun/firstRun.js @@ -56,7 +56,7 @@ class FirstRun extends Component { } renderStage () { - const { stage } = this.state; + const { address, name, phrase, stage } = this.state; switch (stage) { case 0: @@ -71,9 +71,9 @@ class FirstRun extends Component { case 2: return ( + address={ address } + name={ name } + phrase={ phrase } /> ); case 3: return ( @@ -83,7 +83,7 @@ class FirstRun extends Component { } renderDialogActions () { - const { stage } = this.state; + const { canCreate, stage } = this.state; switch (stage) { case 0: @@ -101,7 +101,7 @@ class FirstRun extends Component { } label='Create' - disabled={ !this.state.canCreate } + disabled={ !canCreate } primary onTouchTap={ this.onCreate } /> ); @@ -145,14 +145,15 @@ class FirstRun extends Component { onCreate = () => { const { api } = this.context; + const { name, phrase, password } = this.state; this.setState({ canCreate: false }); return api.personal - .newAccountFromPhrase(this.state.phrase, this.state.password) - .then((address) => api.personal.setAccountName(address, this.state.name)) + .newAccountFromPhrase(phrase, password) + .then((address) => api.personal.setAccountName(address, name)) .then(() => { this.onNext(); }) diff --git a/js/src/modals/FundAccount/fundAccount.js b/js/src/modals/FundAccount/fundAccount.js index d0e6d0f3eb7..874ce80efad 100644 --- a/js/src/modals/FundAccount/fundAccount.js +++ b/js/src/modals/FundAccount/fundAccount.js @@ -18,10 +18,12 @@ export default class FundAccount extends Component { } render () { + const { stage } = this.state; + return (
diff --git a/js/src/modals/Transfer/transfer.js b/js/src/modals/Transfer/transfer.js index 21da76311ec..b5080da1749 100644 --- a/js/src/modals/Transfer/transfer.js +++ b/js/src/modals/Transfer/transfer.js @@ -66,11 +66,13 @@ class Transfer extends Component { } render () { + const { stage, extras } = this.state; + return ( { this.renderPage() } @@ -101,9 +103,11 @@ class Transfer extends Component { } renderPage () { - if (this.state.stage === 0) { + const { extras, stage } = this.state; + + if (stage === 0) { return this.renderDetailsPage(); - } else if (this.state.stage === 1 && this.state.extras) { + } else if (stage === 1 && extras) { return this.renderExtrasPage(); } @@ -111,10 +115,12 @@ class Transfer extends Component { } renderCompletePage () { + const { sending, txhash } = this.state; + return ( + sending={ sending } + txhash={ txhash } /> ); } @@ -154,6 +160,8 @@ class Transfer extends Component { } renderDialogActions () { + const { extras, sending, stage } = this.state; + const cancelBtn = ( } @@ -175,7 +183,7 @@ class Transfer extends Component { ); const sendBtn = ( } label='Send' primary onTouchTap={ this.onSend } /> @@ -187,13 +195,13 @@ class Transfer extends Component { onTouchTap={ this.onClose } /> ); - switch (this.state.stage) { + switch (stage) { case 0: - return this.state.extras + return extras ? [cancelBtn, nextBtn] : [cancelBtn, sendBtn]; case 1: - return this.state.extras + return extras ? [cancelBtn, prevBtn, sendBtn] : [doneBtn]; default: From 78df70fbcc9116002f02d23525243bc7a808d70c Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 5 Sep 2016 21:43:22 +0200 Subject: [PATCH 0326/1062] slightly more effect log sorting --- js/src/dapps/gavcoin/Events/events.js | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/js/src/dapps/gavcoin/Events/events.js b/js/src/dapps/gavcoin/Events/events.js index f1102208b68..45bf79868d9 100644 --- a/js/src/dapps/gavcoin/Events/events.js +++ b/js/src/dapps/gavcoin/Events/events.js @@ -106,18 +106,22 @@ export default class Events extends Component { console.log(logs); - const minedEvents = this.state.minedEvents - .concat(logs.filter((log) => log.type === 'mined').map(logToEvent)) + const minedEvents = logs + .filter((log) => log.type === 'mined') + .map(logToEvent) + .reverse() + .concat(this.state.minedEvents) .sort(sortEvents); - const pendingEvents = this.state.pendingEvents - .filter((event) => { + const pendingEvents = logs + .filter((log) => log.type === 'pending') + .map(logToEvent) + .reverse() + .concat(this.state.pendingEvents.filter((event) => { return !logs.find((log) => { return (log.type === 'mined') && (log.transactionHash === event.transactionHash); }); - }) - .reverse() - .concat(logs.filter((log) => log.type === 'pending').map(logToEvent)) - .reverse(); + })) + .sort(sortEvents); const allEvents = pendingEvents.concat(minedEvents); this.setState({ From eac5dfd94ec77b06ef15a047d72e3ea3f0be6bfb Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 5 Sep 2016 22:54:56 +0200 Subject: [PATCH 0327/1062] sort & logToEvent outside of subscribe --- js/src/dapps/gavcoin/Events/events.js | 37 +++++++++++++-------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/js/src/dapps/gavcoin/Events/events.js b/js/src/dapps/gavcoin/Events/events.js index 45bf79868d9..7de80caed4f 100644 --- a/js/src/dapps/gavcoin/Events/events.js +++ b/js/src/dapps/gavcoin/Events/events.js @@ -76,29 +76,28 @@ export default class Events extends Component { const { instance } = this.context; let key = 0; + const sortEvents = (a, b) => b.blockNumber.cmp(a.blockNumber) || b.logIndex.cmp(a.logIndex); + const logToEvent = (eventName, log) => { + const { blockNumber, logIndex, transactionHash, transactionIndex, params, type } = log; + + return { + type: eventName, + state: type, + blockNumber, + logIndex, + transactionHash, + transactionIndex, + params, + key: ++key + }; + }; + ['Approval', 'Buyin', 'Refund', 'Transfer', 'NewTranch'].forEach((eventName) => { const options = { fromBlock: 0, toBlock: 'pending' }; - const logToEvent = (log) => { - const { blockNumber, logIndex, transactionHash, transactionIndex, params, type } = log; - - return { - type: eventName, - state: type, - blockNumber, - logIndex, - transactionHash, - transactionIndex, - params, - key: ++key - }; - }; - - const sortEvents = (a, b) => b.blockNumber.cmp(a.blockNumber) || b.logIndex.cmp(a.logIndex); - instance[eventName].subscribe(options, (logs) => { if (!logs.length) { return; @@ -108,13 +107,13 @@ export default class Events extends Component { const minedEvents = logs .filter((log) => log.type === 'mined') - .map(logToEvent) + .map((log) => logToEvent(eventName, log)) .reverse() .concat(this.state.minedEvents) .sort(sortEvents); const pendingEvents = logs .filter((log) => log.type === 'pending') - .map(logToEvent) + .map((log) => logToEvent(eventName, log)) .reverse() .concat(this.state.pendingEvents.filter((event) => { return !logs.find((log) => { From 539cca49f73933feed7b40b2a708f67e4f9995d4 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 5 Sep 2016 22:59:00 +0200 Subject: [PATCH 0328/1062] expand state --- js/src/dapps/gavcoin/Application/application.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/js/src/dapps/gavcoin/Application/application.js b/js/src/dapps/gavcoin/Application/application.js index b5ad715b1e0..17e1e0c0808 100644 --- a/js/src/dapps/gavcoin/Application/application.js +++ b/js/src/dapps/gavcoin/Application/application.js @@ -104,9 +104,11 @@ export default class Application extends Component { } getChildContext () { + const { instance } = this.state; + return { api, - instance: this.state.instance, + instance, muiTheme }; } @@ -124,7 +126,7 @@ export default class Application extends Component { } onNewBlockNumber = (blockNumber) => { - const { instance } = this.state; + const { instance, accounts } = this.state; Promise .all([ @@ -140,7 +142,6 @@ export default class Application extends Component { price }); - const { accounts } = this.state; const gavQueries = accounts.map((account) => instance.balanceOf.call({}, [account.address])); const ethQueries = accounts.map((account) => api.eth.getBalance(account.address)); @@ -150,8 +151,6 @@ export default class Application extends Component { ]); }) .then(([gavBalances, ethBalances]) => { - const { accounts } = this.state; - this.setState({ ethBalance: ethBalances.reduce((total, balance) => total.add(balance), new BigNumber(0)), gavBalance: gavBalances.reduce((total, balance) => total.add(balance), new BigNumber(0)), From d486c9800cb66a34750182cde6b386e62e9cc043 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 5 Sep 2016 23:03:19 +0200 Subject: [PATCH 0329/1062] console.error all errors (including function) --- js/src/dapps/gavcoin/Application/application.js | 5 ++++- js/src/dapps/registry/Application/application.js | 6 ++++-- js/src/dapps/tokenreg/Application/application.js | 6 ++++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/js/src/dapps/gavcoin/Application/application.js b/js/src/dapps/gavcoin/Application/application.js index 17e1e0c0808..5bc1457d92e 100644 --- a/js/src/dapps/gavcoin/Application/application.js +++ b/js/src/dapps/gavcoin/Application/application.js @@ -165,6 +165,9 @@ export default class Application extends Component { return account; }) }); + }) + .catch((error) => { + console.error('onNewBlockNumber', error); }); } @@ -206,7 +209,7 @@ export default class Application extends Component { api.events.subscribe('eth.blockNumber', this.onNewBlockNumber); }) .catch((error) => { - console.error(error); + console.error('attachInterface', error); }); } } diff --git a/js/src/dapps/registry/Application/application.js b/js/src/dapps/registry/Application/application.js index eb6b563c849..6e213e4a38d 100644 --- a/js/src/dapps/registry/Application/application.js +++ b/js/src/dapps/registry/Application/application.js @@ -49,8 +49,10 @@ export default class Application extends Component { } getChildContext () { + const { instance } = this.state; + return { - instance: this.state.instance, + instance, muiTheme }; } @@ -93,7 +95,7 @@ export default class Application extends Component { }); }) .catch((error) => { - console.error(error); + console.error('attachInterface', error); }); } } diff --git a/js/src/dapps/tokenreg/Application/application.js b/js/src/dapps/tokenreg/Application/application.js index 7122d96f5f7..e18981c1e89 100644 --- a/js/src/dapps/tokenreg/Application/application.js +++ b/js/src/dapps/tokenreg/Application/application.js @@ -48,8 +48,10 @@ export default class Application extends Component { } getChildContext () { + const { instance } = this.state; + return { - instance: this.state.instance, + instance, muiTheme }; } @@ -98,7 +100,7 @@ export default class Application extends Component { }); }) .catch((error) => { - console.error(error); + console.error('attachInterface', error); }); } } From 65c60917174984723d1016b2fbe27a290e397663 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 5 Sep 2016 23:14:52 +0200 Subject: [PATCH 0330/1062] update titles --- js/src/dapps/registry.html | 2 +- js/src/dapps/tokenreg.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/dapps/registry.html b/js/src/dapps/registry.html index a1bbeb13a59..52036f3aa71 100644 --- a/js/src/dapps/registry.html +++ b/js/src/dapps/registry.html @@ -4,7 +4,7 @@ - Registry + Address Registry diff --git a/js/src/dapps/tokenreg.html b/js/src/dapps/tokenreg.html index 7336753603a..874a03c19c0 100644 --- a/js/src/dapps/tokenreg.html +++ b/js/src/dapps/tokenreg.html @@ -4,7 +4,7 @@ - GAVcoin + Token Registry From 5ceb9f4db8e5eb0ced6e9c982c1ec4e67f1cbadc Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 6 Sep 2016 09:49:04 +0200 Subject: [PATCH 0331/1062] adjust tooltip positions, pass class with actual position --- js/src/ui/Actionbar/actionbar.js | 7 +++--- js/src/ui/Tooltips/Tooltip/tooltip.js | 11 +++++---- js/src/ui/Tooltips/tooltips.css | 27 +++++++++++++++++++---- js/src/views/Accounts/accounts.css | 10 +++++++++ js/src/views/Accounts/accounts.js | 6 +++-- js/src/views/Application/TabBar/tabBar.js | 2 +- js/src/views/Application/application.css | 5 +++++ 7 files changed, 52 insertions(+), 16 deletions(-) diff --git a/js/src/ui/Actionbar/actionbar.js b/js/src/ui/Actionbar/actionbar.js index 9f8c4124e71..203096cd7fc 100644 --- a/js/src/ui/Actionbar/actionbar.js +++ b/js/src/ui/Actionbar/actionbar.js @@ -7,14 +7,15 @@ export default class Actionbar extends Component { static propTypes = { title: PropTypes.string, buttons: PropTypes.array, - children: PropTypes.node + children: PropTypes.node, + className: PropTypes.string }; render () { - const { children } = this.props; + const { children, className } = this.props; return ( - + { this.renderTitle() } { this.renderButtons() } { children } diff --git a/js/src/ui/Tooltips/Tooltip/tooltip.js b/js/src/ui/Tooltips/Tooltip/tooltip.js index fd471ef92ba..facb1e90d3e 100644 --- a/js/src/ui/Tooltips/Tooltip/tooltip.js +++ b/js/src/ui/Tooltips/Tooltip/tooltip.js @@ -16,10 +16,10 @@ class Tooltip extends Component { static propTypes = { title: PropTypes.string, text: PropTypes.string, - top: PropTypes.string, - left: PropTypes.string, + right: PropTypes.bool, currentId: PropTypes.number, maxId: PropTypes.number, + className: PropTypes.string, onNewTooltip: PropTypes.func, onNextTooltip: PropTypes.func, onCloseTooltips: PropTypes.func @@ -38,8 +38,8 @@ class Tooltip extends Component { render () { const { id } = this.state; - const { currentId, maxId, top, left, onCloseTooltips, onNextTooltip } = this.props; - const inlineStyles = { top, left }; + const { className, currentId, maxId, right, onCloseTooltips, onNextTooltip } = this.props; + const classes = `${styles.box} ${right ? styles.arrowRight : styles.arrowLeft} ${className}`; if (id !== currentId) { return null; @@ -66,8 +66,7 @@ class Tooltip extends Component { return (
+ className={ classes }>
{ this.props.title }
diff --git a/js/src/ui/Tooltips/tooltips.css b/js/src/ui/Tooltips/tooltips.css index 3d2741ec299..f7f7b10808c 100644 --- a/js/src/ui/Tooltips/tooltips.css +++ b/js/src/ui/Tooltips/tooltips.css @@ -18,8 +18,6 @@ background: #663600; /* rgba(48, 48, 48, 0.95); #88b7d5; */ border: 4px solid #f80; /* #c2e1f5; */ max-width: 450px; - top: 70%; - left: 5%; border-radius: 0.5em; z-index: 500; opacity: 1; @@ -30,7 +28,6 @@ .box:after, .box:before { bottom: 100%; - left: 15%; border: solid transparent; content: " "; height: 0; @@ -43,16 +40,38 @@ border-color: rgba(136, 183, 213, 0); border-bottom-color: #663600; /* rgba(48, 48, 48, 0.95); #88b7d5; */ border-width: 20px; - margin-left: -20px; } .box:before { border-color: rgba(194, 225, 245, 0); border-bottom-color: #f80; /* #c2e1f5; */ border-width: 26px; +} + +.arrowLeft:after, .arrowLeft:before { + left: 15%; +} + +.arrowLeft:after { + margin-left: -20px; +} + +.arrowLeft:before { margin-left: -26px; } +.arrowRight:after, .arrowRight:before { + right: 15%; +} + +.arrowRight:after { + margin-right: -20px; +} + +.arrowRight:before { + margin-right: -26px; +} + .title { text-transform: uppercase; } diff --git a/js/src/views/Accounts/accounts.css b/js/src/views/Accounts/accounts.css index 9c1a3a1496c..53772d6d1bb 100644 --- a/js/src/views/Accounts/accounts.css +++ b/js/src/views/Accounts/accounts.css @@ -21,6 +21,16 @@ position: relative; } +.accountTooltip { + top: 5.5em; + left: 5em; +} + +.toolbarTooltip { + right: 20px; + top: 4em; +} + .tooltitle { text-transform: uppercase; } diff --git a/js/src/views/Accounts/accounts.js b/js/src/views/Accounts/accounts.js index 87d9fca45d2..dfbee8c5434 100644 --- a/js/src/views/Accounts/accounts.js +++ b/js/src/views/Accounts/accounts.js @@ -51,10 +51,12 @@ export default class Accounts extends Component { return ( ); @@ -70,7 +72,7 @@ export default class Accounts extends Component { const { tokens } = this.state; const firstTooltip = ( ); diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index 9b5a8dfa3d7..fd05415331f 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -40,7 +40,7 @@ export default class TabBar extends Component { label='accounts' onActive={ this.onActivate }> Date: Tue, 6 Sep 2016 10:12:30 +0200 Subject: [PATCH 0332/1062] add ethcore block (only, no text) --- js/src/images/ethcore-block.png | Bin 0 -> 11437 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 js/src/images/ethcore-block.png diff --git a/js/src/images/ethcore-block.png b/js/src/images/ethcore-block.png new file mode 100644 index 0000000000000000000000000000000000000000..bac46e5c957818ec16eef0d841366a4f8b599a24 GIT binary patch literal 11437 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 literal 0 HcmV?d00001 From 1606c529adce88e1d2e427065ca0b084cf7b76fa Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 6 Sep 2016 10:34:30 +0200 Subject: [PATCH 0333/1062] split styles from application.css --- .../Application/FrameError/frameError.css | 5 +++ .../Application/FrameError/frameError.js | 4 +-- js/src/views/Application/TabBar/tabBar.css | 34 +++++++++++++++++++ js/src/views/Application/TabBar/tabBar.js | 11 +++--- js/src/views/Application/application.css | 28 --------------- 5 files changed, 47 insertions(+), 35 deletions(-) create mode 100644 js/src/views/Application/FrameError/frameError.css create mode 100644 js/src/views/Application/TabBar/tabBar.css diff --git a/js/src/views/Application/FrameError/frameError.css b/js/src/views/Application/FrameError/frameError.css new file mode 100644 index 00000000000..2c7906d42ef --- /dev/null +++ b/js/src/views/Application/FrameError/frameError.css @@ -0,0 +1,5 @@ +.error { + padding: 2em; + background: red; + color: white; +} diff --git a/js/src/views/Application/FrameError/frameError.js b/js/src/views/Application/FrameError/frameError.js index 65c7dd35777..14f91c3212e 100644 --- a/js/src/views/Application/FrameError/frameError.js +++ b/js/src/views/Application/FrameError/frameError.js @@ -1,11 +1,11 @@ import React, { Component } from 'react'; -import styles from '../application.css'; +import styles from './frameError.css'; export default class FrameError extends Component { render () { return ( -
+
ERROR: This application cannot and should not be loaded in an embedded iFrame
); diff --git a/js/src/views/Application/TabBar/tabBar.css b/js/src/views/Application/TabBar/tabBar.css new file mode 100644 index 00000000000..0b4dfe27dbd --- /dev/null +++ b/js/src/views/Application/TabBar/tabBar.css @@ -0,0 +1,34 @@ +.toolbar { + background: rgb(65, 65, 65) !important; + height: 72px !important; + position: relative; +} + +.tabs { + width: 100%; + position: relative; +} + +.tabbarTooltip { + left: 2em; + top: 0; +} + +.logo { + margin: 22px 3em 0 0; + white-space: nowrap; +} + +.logo img { + height: 28px; + width: 28px; + margin-right: 0.5em; +} + +.logo div { + display: inline-block; + text-transform: uppercase; + line-height: 32px; + vertical-align: top; + letter-spacing: 0.2em; +} diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index fd05415331f..4fb31d72f08 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -9,8 +9,8 @@ import NavigationApps from 'material-ui/svg-icons/navigation/apps'; import { Tooltip } from '../../../ui'; -import styles from '../application.css'; -import imagesParitybar from '../../../images/paritybar.png'; +import styles from './tabBar.css'; +import imagesEthcoreBlock from '../../../images/ethcore-block.png'; export default class TabBar extends Component { static contextTypes = { @@ -26,9 +26,10 @@ export default class TabBar extends Component { - +
+ +
Parity
+
Date: Tue, 6 Sep 2016 10:50:29 +0200 Subject: [PATCH 0334/1062] add signer as a link from the dapp overlay --- js/src/views/ParityBar/parityBar.css | 34 ++++++++++++++++++++-------- js/src/views/ParityBar/parityBar.js | 22 +++++++++--------- 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/js/src/views/ParityBar/parityBar.css b/js/src/views/ParityBar/parityBar.css index 84af3815c1e..985b26a2042 100644 --- a/js/src/views/ParityBar/parityBar.css +++ b/js/src/views/ParityBar/parityBar.css @@ -2,7 +2,6 @@ position: fixed; bottom: 0; right: 0; - color: rgba(255, 255, 255, 0.75); font-size: 16px; font-family: 'Roboto', sans-serif; vertical-align: middle; @@ -13,22 +12,39 @@ } .corner { - background: rgba(0, 0, 0, 0.5); + background: rgba(0, 0, 0, 0.75); position: absolute; bottom: 0; right: 16px; border-radius: 4px 4px 0 0; + padding: 0.5em 1em; } -.logo { - padding: 8px 96px 0 8px; - cursor: pointer; +.link { + white-space: nowrap; + border: none; + outline: none !important; + color: white !important; + display: inline-block; } -.button { +.link img, .link svg { + height: 28px !important; + width: 28px !important; + margin-right: 0.5em; } -a.noshow { - border: none; - outline: none !important; +.link div { + display: inline-block; + text-transform: uppercase; + line-height: 32px; + vertical-align: top; + letter-spacing: 0.2em; +} + +.link+.link { + margin-left: 1em; +} + +.button { } diff --git a/js/src/views/ParityBar/parityBar.js b/js/src/views/ParityBar/parityBar.js index 74e9f426838..8508cbf6965 100644 --- a/js/src/views/ParityBar/parityBar.js +++ b/js/src/views/ParityBar/parityBar.js @@ -1,9 +1,7 @@ import React, { Component } from 'react'; +import ActionFingerprint from 'material-ui/svg-icons/action/fingerprint'; -import { IconButton } from 'material-ui'; -import ActionSwapVert from 'material-ui/svg-icons/action/swap-vert'; - -import imagesParitybar from '../../images/paritybar.png'; +import imagesEthcoreBlock from '../../images/ethcore-block.png'; import styles from './parityBar.css'; export default class ParityBar extends Component { @@ -12,15 +10,17 @@ export default class ParityBar extends Component { ); From f5368a824c4b16365542afb34a9b7a8c15dab554 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 6 Sep 2016 10:53:41 +0200 Subject: [PATCH 0335/1062] update the signer link to embedded signer --- js/src/dapps/gavcoin/Actions/StepComplete/stepComplete.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/dapps/gavcoin/Actions/StepComplete/stepComplete.js b/js/src/dapps/gavcoin/Actions/StepComplete/stepComplete.js index 2f9bd555d44..63fc23ed215 100644 --- a/js/src/dapps/gavcoin/Actions/StepComplete/stepComplete.js +++ b/js/src/dapps/gavcoin/Actions/StepComplete/stepComplete.js @@ -6,7 +6,7 @@ export default class StepComplete extends Component { render () { return (
- Your transaction has been posted. Please visit the Parity Signer to authenticate the transfer. + Your transaction has been posted. Please visit the Parity Signer to authenticate the transfer.
); } From b4056630089fa928b16d4d39a5255f3e5597c83d Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 6 Sep 2016 13:37:43 +0200 Subject: [PATCH 0336/1062] prettify the transaction list display --- js/src/ui/Theme/theme.js | 3 +++ js/src/util/lookup.js | 2 +- .../TransactionPending/TransactionPending.css | 8 +++++--- .../TransactionPendingFormConfirm.css | 2 +- .../TransactionPendingFormConfirm.js | 14 ++++++-------- .../UnAuthorizedPage/UnAuthorizedPage.js | 11 +++++------ 6 files changed, 21 insertions(+), 19 deletions(-) diff --git a/js/src/ui/Theme/theme.js b/js/src/ui/Theme/theme.js index f391b89901f..dcfd58dd863 100644 --- a/js/src/ui/Theme/theme.js +++ b/js/src/ui/Theme/theme.js @@ -8,6 +8,7 @@ const muiTheme = getMuiTheme(darkBaseTheme); muiTheme.stepper.textColor = '#eee'; muiTheme.stepper.disabledTextColor = '#777'; muiTheme.inkBar.backgroundColor = 'rgb(0, 151, 167)'; // 'rgba(255, 136, 0, 0.8)'; // 'rgb(0, 151, 167)'; +muiTheme.raisedButton.primaryTextColor = 'white'; muiTheme.snackbar.backgroundColor = 'rgba(255, 30, 30, 0.9)'; muiTheme.snackbar.textColor = 'rgba(255, 255, 255, 0.9)'; muiTheme.tabs = lightTheme.tabs; @@ -18,4 +19,6 @@ muiTheme.textField.disabledTextColor = muiTheme.textField.textColor; muiTheme.toolbar = lightTheme.toolbar; muiTheme.toolbar.backgroundColor = 'rgb(80, 80, 80)'; // 'rgba(255, 136, 0, 0.5)'; // 'rgb(80, 80, 80)'; +console.log(muiTheme.raisedButton); + export default muiTheme; diff --git a/js/src/util/lookup.js b/js/src/util/lookup.js index e909083072d..2cca52d9a59 100644 --- a/js/src/util/lookup.js +++ b/js/src/util/lookup.js @@ -1,4 +1,4 @@ -export function retrieveAccount (address, accounts, contacts, contracts, tokens) { +export function retrieveAccount (address, accounts = [], contacts = [], contracts = [], tokens = []) { const cmp = (_account) => _account.address === address; let account = accounts.find(cmp); diff --git a/js/src/views/Signer/components/TransactionPending/TransactionPending.css b/js/src/views/Signer/components/TransactionPending/TransactionPending.css index 5b27f97adcd..c211ef34a64 100644 --- a/js/src/views/Signer/components/TransactionPending/TransactionPending.css +++ b/js/src/views/Signer/components/TransactionPending/TransactionPending.css @@ -14,15 +14,17 @@ } .iconsContainer { - display: inline-block; - min-width: 180px; + display: block; + text-align: center; font-size: .8em; opacity: 0.5; + width: 830px; + margin-right: 30px; } .iconsContainer > * { - float: left; margin-right: 3px; + display: inline-block; } .iconsContainer:after { diff --git a/js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css b/js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css index 5546aaca2cb..da9ca08f237 100644 --- a/js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css +++ b/js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css @@ -1,8 +1,8 @@ .confirmForm { margin-top: -40px; + psotion: relative; } - .confirmButton { display: block !important; margin-bottom: 10px; diff --git a/js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js b/js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js index 8cb9534e3b8..d7bc2e0055a 100644 --- a/js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js +++ b/js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js @@ -1,9 +1,9 @@ import React, { Component, PropTypes } from 'react'; - -import TextField from 'material-ui/TextField'; import RaisedButton from 'material-ui/RaisedButton'; import ReactTooltip from 'react-tooltip'; +import { Input } from '../../../../ui'; + import styles from './TransactionPendingFormConfirm.css'; export default class TransactionPendingFormConfirm extends Component { @@ -25,15 +25,13 @@ export default class TransactionPendingFormConfirm extends Component { return (
- + value={ password } />

Make sure Parity is running, generate authorization token:

$ parity signer new-token  and paste the token below:

- + hint='token from Parity' + label='Authorization Token' />
Date: Tue, 6 Sep 2016 15:46:44 +0200 Subject: [PATCH 0337/1062] add actions & reducers for contract, fee & owner I'm not entirely happy with this, since it's not very DRY. I was also not sure how to balance LOC vs. complexity. Using `redux-promise` would have made it easier to read but more complex. --- js/src/dapps/registry/actions.js | 10 ++++++ js/src/dapps/registry/reducers.js | 54 +++++++++++++++++++++++++++++++ js/src/dapps/registry/store.js | 6 ++++ 3 files changed, 70 insertions(+) create mode 100644 js/src/dapps/registry/actions.js create mode 100644 js/src/dapps/registry/reducers.js create mode 100644 js/src/dapps/registry/store.js diff --git a/js/src/dapps/registry/actions.js b/js/src/dapps/registry/actions.js new file mode 100644 index 00000000000..8b5aa15c0f4 --- /dev/null +++ b/js/src/dapps/registry/actions.js @@ -0,0 +1,10 @@ +import { createAction } from 'redux-actions'; + +export const fetchContract = createAction('fetch contract'); +export const setContract = createAction('set contract', (c) => c); + +export const fetchFee = createAction('fetch fee'); +export const setFee = createAction('set fee', (f) => f); + +export const fetchOwner = createAction('fetch owner'); +export const setOwner = createAction('set owner', (f) => f); diff --git a/js/src/dapps/registry/reducers.js b/js/src/dapps/registry/reducers.js new file mode 100644 index 00000000000..71e10759688 --- /dev/null +++ b/js/src/dapps/registry/reducers.js @@ -0,0 +1,54 @@ +import { handleActions } from 'redux-actions'; + +import { + setContract, + fetchFee, setFee, + fetchOwner, setOwner +} from './actions'; +import registryAbi from '../abi/registry.json'; +const { api } = window.parity; + +const initialState = { + contract: null, + fee: null, + owner: null +}; + +const onFetchContract = (state, action) => (dispatch) => + api.ethcore.registryAddress().then( + (address) => { + const contract = api.newContract(registryAbi, address); + dispatch(setContract(contract)); + dispatch(fetchFee()); + dispatch(fetchOwner()); + }, + () => console.error('could not fetch contract') + ); + +const onFetchFee = (state, action) => (dispatch) => + state.contract.fee.call().then( + (fee) => dispatch(setFee(fee)), + () => console.error('could not fetch fee') + ); + +const onFetchOwner = (state, action) => (dispatch) => + state.contract.owner.call().then( + (owner) => dispatch(setOwner(owner)), + () => console.error('could not fetch owner') + ); + +export default handleActions({ + + 'fetch contract': onFetchContract, + 'set contract': (state, action) => + ({ ...state, contract: action.payload }), + + 'fetch fee': onFetchFee, + 'set fee': (state, action) => + ({ ...state, fee: action.payload }), + + 'fetch owner': onFetchOwner, + 'set owner': (state, action) => + ({ ...state, owner: action.payload }) + +}, initialState); diff --git a/js/src/dapps/registry/store.js b/js/src/dapps/registry/store.js new file mode 100644 index 00000000000..189c86a3d64 --- /dev/null +++ b/js/src/dapps/registry/store.js @@ -0,0 +1,6 @@ +import { createStore, applyMiddleware } from 'redux'; +import thunk from 'redux-thunk'; + +import reducer from './reducer'; + +export const store = createStore(reducer, applyMiddleware(thunk)); From ffb1be0723d7fd5b2549c4b4e62cb79d94006637 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Tue, 6 Sep 2016 17:40:23 +0200 Subject: [PATCH 0338/1062] connect React & Redux --- js/src/dapps/registry.js | 17 +++++++++-------- js/src/dapps/registry/Container.js | 28 ++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 js/src/dapps/registry/Container.js diff --git a/js/src/dapps/registry.js b/js/src/dapps/registry.js index c4f12c7758c..bef0598ccd2 100644 --- a/js/src/dapps/registry.js +++ b/js/src/dapps/registry.js @@ -1,15 +1,16 @@ -import ReactDOM from 'react-dom'; import React from 'react'; +import ReactDOM from 'react-dom'; +import { Provider } from 'react-redux'; -import injectTapEventPlugin from 'react-tap-event-plugin'; -injectTapEventPlugin(); - -import Application from './registry/Application'; - -import './style.css'; +import store from './registry/store' +import Container from './registry/Container'; import './registry.html'; ReactDOM.render( - , + ( + + + + ), document.querySelector('#container') ); diff --git a/js/src/dapps/registry/Container.js b/js/src/dapps/registry/Container.js new file mode 100644 index 00000000000..baf094023c8 --- /dev/null +++ b/js/src/dapps/registry/Container.js @@ -0,0 +1,28 @@ +import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; + +import actions from './actions'; + +class Container extends Component { + + componentDidMount () { + this.props.fetchContract(); + } + + render () { + return (
{ this.props.foo }
); + } + +} + +Container.propTypes = { + foo: PropTypes.string +}; + +export default connect( + // redux -> react connection + (state) => state, + // react -> redux connection + (dispatch) => bindActionCreators(actions, dispatch) +)(Container); From 39c72c40c3100b70fc60597540379cc71f8630f7 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Tue, 6 Sep 2016 17:41:01 +0200 Subject: [PATCH 0339/1062] bugfixes :bug: --- js/src/dapps/registry/actions.js | 14 ++++++++------ js/src/dapps/registry/reducers.js | 2 +- js/src/dapps/registry/store.js | 4 ++-- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/js/src/dapps/registry/actions.js b/js/src/dapps/registry/actions.js index 8b5aa15c0f4..30aae5de770 100644 --- a/js/src/dapps/registry/actions.js +++ b/js/src/dapps/registry/actions.js @@ -1,10 +1,12 @@ import { createAction } from 'redux-actions'; -export const fetchContract = createAction('fetch contract'); -export const setContract = createAction('set contract', (c) => c); +export default { + fetchContract: createAction('fetch contract'), + setContract: createAction('set contract', (c) => c), -export const fetchFee = createAction('fetch fee'); -export const setFee = createAction('set fee', (f) => f); + fetchFee: createAction('fetch fee'), + setFee: createAction('set fee', (f) => f), -export const fetchOwner = createAction('fetch owner'); -export const setOwner = createAction('set owner', (f) => f); + fetchOwner: createAction('fetch owner'), + setOwner: createAction('set owner', (f) => f) +}; diff --git a/js/src/dapps/registry/reducers.js b/js/src/dapps/registry/reducers.js index 71e10759688..df0475a2c07 100644 --- a/js/src/dapps/registry/reducers.js +++ b/js/src/dapps/registry/reducers.js @@ -5,7 +5,7 @@ import { fetchFee, setFee, fetchOwner, setOwner } from './actions'; -import registryAbi from '../abi/registry.json'; +import registryAbi from './abi/registry.json'; const { api } = window.parity; const initialState = { diff --git a/js/src/dapps/registry/store.js b/js/src/dapps/registry/store.js index 189c86a3d64..7e86c030204 100644 --- a/js/src/dapps/registry/store.js +++ b/js/src/dapps/registry/store.js @@ -1,6 +1,6 @@ import { createStore, applyMiddleware } from 'redux'; import thunk from 'redux-thunk'; -import reducer from './reducer'; +import reducer from './reducers'; -export const store = createStore(reducer, applyMiddleware(thunk)); +export default createStore(reducer, applyMiddleware(thunk)); From 0077770a94b777efa56bc129ca7517063f3a677a Mon Sep 17 00:00:00 2001 From: Jannis R Date: Tue, 6 Sep 2016 18:16:34 +0200 Subject: [PATCH 0340/1062] bugfixes :bug: --- js/package.json | 1 + js/src/dapps/registry.js | 2 +- js/src/dapps/registry/Container.js | 2 +- js/src/dapps/registry/actions.js | 14 ++++++-------- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/js/package.json b/js/package.json index c4844182b54..bad993df25e 100644 --- a/js/package.json +++ b/js/package.json @@ -119,6 +119,7 @@ "react-tooltip": "^2.0.3", "redux": "^3.5.2", "redux-actions": "^0.10.1", + "redux-thunk": "^2.1.0", "utf8": "^2.1.1", "web3": "^0.17.0-alpha" } diff --git a/js/src/dapps/registry.js b/js/src/dapps/registry.js index bef0598ccd2..ee7e902036c 100644 --- a/js/src/dapps/registry.js +++ b/js/src/dapps/registry.js @@ -2,7 +2,7 @@ import React from 'react'; import ReactDOM from 'react-dom'; import { Provider } from 'react-redux'; -import store from './registry/store' +import store from './registry/store'; import Container from './registry/Container'; import './registry.html'; diff --git a/js/src/dapps/registry/Container.js b/js/src/dapps/registry/Container.js index baf094023c8..88dcd1c0ad4 100644 --- a/js/src/dapps/registry/Container.js +++ b/js/src/dapps/registry/Container.js @@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; -import actions from './actions'; +import * as actions from './actions'; class Container extends Component { diff --git a/js/src/dapps/registry/actions.js b/js/src/dapps/registry/actions.js index 30aae5de770..8b5aa15c0f4 100644 --- a/js/src/dapps/registry/actions.js +++ b/js/src/dapps/registry/actions.js @@ -1,12 +1,10 @@ import { createAction } from 'redux-actions'; -export default { - fetchContract: createAction('fetch contract'), - setContract: createAction('set contract', (c) => c), +export const fetchContract = createAction('fetch contract'); +export const setContract = createAction('set contract', (c) => c); - fetchFee: createAction('fetch fee'), - setFee: createAction('set fee', (f) => f), +export const fetchFee = createAction('fetch fee'); +export const setFee = createAction('set fee', (f) => f); - fetchOwner: createAction('fetch owner'), - setOwner: createAction('set owner', (f) => f) -}; +export const fetchOwner = createAction('fetch owner'); +export const setOwner = createAction('set owner', (f) => f); From 326b1d23f8d53148997fc192add170b28cd14636 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 6 Sep 2016 19:41:39 +0200 Subject: [PATCH 0341/1062] addresses section (no single click through yet...) --- js/src/index.js | 3 +- js/src/modals/AddressBook/addressBook.js | 5 +- js/src/modals/Transfer/Details/details.js | 16 +-- js/src/modals/Transfer/transfer.js | 18 ++-- js/src/ui/Balances/balances.js | 8 +- js/src/ui/Container/container.js | 10 +- js/src/ui/Theme/theme.js | 2 - js/src/views/Account/account.js | 13 ++- js/src/views/Accounts/Summary/summary.js | 11 +- js/src/views/Accounts/accounts.css | 22 ++-- js/src/views/Accounts/accounts.js | 53 +++++----- js/src/views/Addresses/addresses.css | 27 +++++ js/src/views/Addresses/addresses.js | 58 ++++++++++ js/src/views/Addresses/index.js | 1 + js/src/views/Application/TabBar/tabBar.js | 14 ++- js/src/views/Application/application.js | 122 +++++++++------------- js/src/views/index.js | 2 + 17 files changed, 234 insertions(+), 151 deletions(-) create mode 100644 js/src/views/Addresses/addresses.css create mode 100644 js/src/views/Addresses/addresses.js create mode 100644 js/src/views/Addresses/index.js diff --git a/js/src/index.js b/js/src/index.js index 5e0cecb9873..0fda7463ff9 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -11,7 +11,7 @@ import { Redirect, Router, Route, useRouterHistory } from 'react-router'; import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; import { muiTheme } from './ui'; -import { Accounts, Account, Application, Contract, Contracts, Dapp, Dapps } from './views'; +import { Accounts, Account, Addresses, Application, Contract, Contracts, Dapp, Dapps } from './views'; import { errorReducer } from './ui/Errors'; import { tooltipReducer } from './ui/Tooltips'; @@ -70,6 +70,7 @@ ReactDOM.render( + diff --git a/js/src/modals/AddressBook/addressBook.js b/js/src/modals/AddressBook/addressBook.js index b7eeaad585b..5a338ad3915 100644 --- a/js/src/modals/AddressBook/addressBook.js +++ b/js/src/modals/AddressBook/addressBook.js @@ -21,7 +21,7 @@ const editIconStyle = { export default class AddressBook extends Component { static contextTypes = { api: PropTypes.object.isRequired, - contacts: PropTypes.array.isRequired + accounts: PropTypes.array.isRequired }; static propTypes = { @@ -64,7 +64,8 @@ export default class AddressBook extends Component { } renderEntries () { - const { contacts } = this.context; + const { accounts } = this.context; + const contacts = accounts.filter((account) => !account.uuid); if (!contacts.length) { return ( diff --git a/js/src/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js index 140051c7857..cc5cb7a46bb 100644 --- a/js/src/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -15,7 +15,7 @@ const CHECK_STYLE = { export default class Details extends Component { static contextTypes = { api: PropTypes.object, - accounts: PropTypes.array.isRequired + balances: PropTypes.object } static propTypes = { @@ -97,11 +97,10 @@ export default class Details extends Component { } renderTokenSelect () { - const { accounts, api } = this.context; + const { api, balances } = this.context; const { address, tag } = this.props; - const account = accounts.find((acc) => acc.address === address); - const items = account.balances.map((balance, idx) => { + const items = balances[address].tokens.map((balance, idx) => { const token = balance.token; const isEth = idx === 0; let value = 0; @@ -145,13 +144,8 @@ export default class Details extends Component { ); } - onChangeToken = (event, value) => { - const { accounts } = this.context; - const { address } = this.props; - - const account = accounts.find((acc) => acc.address === address); - - this.props.onChange('tag', account.balances[value].token.tag); + onChangeToken = (event, idx, tag) => { + this.props.onChange('tag', tag); } onEditRecipient = (event, recipient) => { diff --git a/js/src/modals/Transfer/transfer.js b/js/src/modals/Transfer/transfer.js index b5080da1749..a11c19aab41 100644 --- a/js/src/modals/Transfer/transfer.js +++ b/js/src/modals/Transfer/transfer.js @@ -30,7 +30,8 @@ const STAGES_EXTRA = [TITLES.transfer, TITLES.extras, TITLES.complete]; class Transfer extends Component { static contextTypes = { - api: PropTypes.object.isRequired + api: PropTypes.object.isRequired, + balances: PropTypes.object } static propTypes = { @@ -304,9 +305,12 @@ class Transfer extends Component { } _onUpdateTag (tag) { + const { balances } = this.context; + const { account } = this.props; + this.setState({ tag, - isEth: tag === this.props.account.balances[0].token.tag + isEth: tag === balances[account.address].tokens[0].token.tag }, this.recalculateGas); } @@ -367,9 +371,10 @@ class Transfer extends Component { } _sendToken () { + const { balances } = this.context; const { account } = this.props; const { recipient, value, tag } = this.state; - const token = account.balances.find((balance) => balance.token.tag === tag).token; + const token = balances[account.address].tokens.find((balance) => balance.token.tag === tag).token; return token.contract.instance.transfer .postTransaction({ @@ -413,9 +418,10 @@ class Transfer extends Component { } _estimateGasToken () { + const { balances } = this.context; const { account } = this.props; - const { recipient, value } = this.state; - const token = account.balances.find((balance) => balance.token.tag === this.state.tag).token; + const { recipient, value, tag } = this.state; + const token = balances[account.address].tokens.find((balance) => balance.token.tag === tag).token; return token.contract.instance.transfer .estimateGas({ @@ -477,7 +483,7 @@ class Transfer extends Component { const { gas, gasPrice, tag, valueAll, isEth } = this.state; const gasTotal = new BigNumber(gasPrice || 0).mul(new BigNumber(gas || 0)); - const balances = account.balances; + const balances = this.context.balances[account.address].tokens; const balance = balances.find((balance) => tag === balance.token.tag); const availableEth = new BigNumber(balances[0].value); const available = new BigNumber(balance.value); diff --git a/js/src/ui/Balances/balances.js b/js/src/ui/Balances/balances.js index 181cbb19e89..abd42e37001 100644 --- a/js/src/ui/Balances/balances.js +++ b/js/src/ui/Balances/balances.js @@ -5,7 +5,8 @@ import styles from './balances.css'; export default class Balances extends Component { static contextTypes = { - api: PropTypes.object + api: PropTypes.object, + balances: PropTypes.object } static propTypes = { @@ -14,9 +15,10 @@ export default class Balances extends Component { } render () { - const { api } = this.context; + const { api, balances } = this.context; + const { account } = this.props; - let body = this.props.account.balances + let body = balances[account.address].tokens .filter((balance) => new BigNumber(balance.value).gt(0)) .map((balance) => { const token = balance.token; diff --git a/js/src/ui/Container/container.js b/js/src/ui/Container/container.js index 765ad298812..b42786e3295 100644 --- a/js/src/ui/Container/container.js +++ b/js/src/ui/Container/container.js @@ -6,14 +6,18 @@ import styles from './container.css'; export default class Container extends Component { static propTypes = { - children: PropTypes.node + children: PropTypes.node, + className: PropTypes.string } render () { + const { children, className } = this.props; + const classes = `${styles.container} ${className}`; + return ( -
+
- { this.props.children } + { children }
); diff --git a/js/src/ui/Theme/theme.js b/js/src/ui/Theme/theme.js index dcfd58dd863..92b0daae4b1 100644 --- a/js/src/ui/Theme/theme.js +++ b/js/src/ui/Theme/theme.js @@ -19,6 +19,4 @@ muiTheme.textField.disabledTextColor = muiTheme.textField.textColor; muiTheme.toolbar = lightTheme.toolbar; muiTheme.toolbar.backgroundColor = 'rgb(80, 80, 80)'; // 'rgba(255, 136, 0, 0.5)'; // 'rgb(80, 80, 80)'; -console.log(muiTheme.raisedButton); - export default muiTheme; diff --git a/js/src/views/Account/account.js b/js/src/views/Account/account.js index 1f546aa9b0f..3346e669d8e 100644 --- a/js/src/views/Account/account.js +++ b/js/src/views/Account/account.js @@ -5,7 +5,7 @@ import ContentCreate from 'material-ui/svg-icons/content/create'; import ContentSend from 'material-ui/svg-icons/content/send'; import { FundAccount, Transfer } from '../../modals'; -import { Actionbar, Balances, Container, ContainerTitle, Form, FormWrap, InputInline, IdentityIcon } from '../../ui'; +import { Actionbar, Balances, Container, ContainerTitle, Form, InputInline, IdentityIcon } from '../../ui'; import Transactions from './Transactions'; @@ -16,7 +16,8 @@ const DEFAULT_NAME = 'Unnamed'; export default class Account extends Component { static contextTypes = { api: React.PropTypes.object, - accounts: PropTypes.array + accounts: PropTypes.array, + balances: PropTypes.object } static propTypes = { @@ -40,11 +41,13 @@ export default class Account extends Component { } render () { + const { accounts, balances } = this.context; const { address } = this.props.params; const { name } = this.state; - const account = this.context.accounts.find((account) => account.address === address); + const balance = balances[address]; + const account = accounts.find((_account) => _account.address === address); - if (!account) { + if (!balance || !account) { return null; } @@ -78,7 +81,7 @@ export default class Account extends Component { { address }
- { account.txCount.toFormat() } outgoing transactions + { balance.txCount.toFormat() } outgoing transactions
@@ -36,9 +36,8 @@ export default class Summary extends Component { title={ { account.name || 'Unnamed' } } byline={ account.address } /> - { this.props.children } + account={ account } /> + { children } ); } diff --git a/js/src/views/Accounts/accounts.css b/js/src/views/Accounts/accounts.css index 53772d6d1bb..05948b3b6e8 100644 --- a/js/src/views/Accounts/accounts.css +++ b/js/src/views/Accounts/accounts.css @@ -17,29 +17,25 @@ padding-left: 0.5em !important; } -.toolbar { - position: relative; -} - .accountTooltip { top: 5.5em; left: 5em; } +.toolbar { + position: relative; +} + .toolbarTooltip { right: 20px; top: 4em; } -.tooltitle { - text-transform: uppercase; -} - -.toolbutton { - color: white !important; - background: rgb(0, 151, 167); +.empty { + width: 100%; + display: block; } -.toolbutton svg { - fill: white !important; +.empty div { + color: #aaa; } diff --git a/js/src/views/Accounts/accounts.js b/js/src/views/Accounts/accounts.js index dfbee8c5434..c71258aad82 100644 --- a/js/src/views/Accounts/accounts.js +++ b/js/src/views/Accounts/accounts.js @@ -1,11 +1,12 @@ import React, { Component, PropTypes } from 'react'; +import { Link } from 'react-router'; import { FlatButton } from 'material-ui'; import CommunicationContacts from 'material-ui/svg-icons/communication/contacts'; import ContentAdd from 'material-ui/svg-icons/content/add'; import Summary from './Summary'; import { AddressBook, CreateAccount } from '../../modals'; -import { Actionbar, Tooltip } from '../../ui'; +import { Actionbar, Container, Tooltip } from '../../ui'; import styles from './accounts.css'; @@ -41,12 +42,14 @@ export default class Accounts extends Component { label='new account' primary onTouchTap={ this.onNewAccountClick } />, - } - label='address book' - primary - onTouchTap={ this.onAddressBookClick } /> + to='/addresses'> + } + label='address book' + primary /> + ]; return ( @@ -65,32 +68,34 @@ export default class Accounts extends Component { renderAccounts () { const { accounts } = this.context; - if (!accounts) { - return null; + if (!accounts || !accounts.length) { + return ( + +
+ There are currently no accounts attached to this instance. +
+
+ ); } - const { tokens } = this.state; const firstTooltip = ( ); - return accounts - .filter((acc) => acc.uuid) - .map((account, idx) => { - return ( -
- - { idx === 0 ? firstTooltip : null } - -
- ); - }); + return accounts.map((account, idx) => { + return ( +
+ + { idx === 0 ? firstTooltip : null } + +
+ ); + }); } renderNewDialog () { diff --git a/js/src/views/Addresses/addresses.css b/js/src/views/Addresses/addresses.css new file mode 100644 index 00000000000..2bfb1f58eef --- /dev/null +++ b/js/src/views/Addresses/addresses.css @@ -0,0 +1,27 @@ +.addresses { + display: flex; + flex-wrap: wrap; +} + +.address { + flex: 0 1 50%; + width: 50%; + position: relative; +} + +.address:nth-child(odd)>div { + padding-right: 0.5em !important; +} + +.address:nth-child(even)>div { + padding-left: 0.5em !important; +} + +.empty { + width: 100%; + display: block; +} + +.empty div { + color: #aaa; +} diff --git a/js/src/views/Addresses/addresses.js b/js/src/views/Addresses/addresses.js new file mode 100644 index 00000000000..abbf23b97b5 --- /dev/null +++ b/js/src/views/Addresses/addresses.js @@ -0,0 +1,58 @@ +import React, { Component, PropTypes } from 'react'; + +import Summary from '../Accounts/Summary'; +import { Actionbar, Container } from '../../ui'; + +import styles from './addresses.css'; + +export default class Addresses extends Component { + static contextTypes = { + api: PropTypes.object, + contacts: PropTypes.array + } + + render () { + console.log(this.renderAddresses()); + + return ( +
+ { this.renderActionbar() } +
+ { this.renderAddresses() } +
+
+ ); + } + + renderActionbar () { + return ( + + ); + } + + renderAddresses () { + const { contacts } = this.context; + + if (!contacts || !contacts.length) { + return ( + + There are currently no saved addresses. + + ); + } + + return contacts.map((contact, idx) => { + return ( +
+ +
+ ); + }); + } +} diff --git a/js/src/views/Addresses/index.js b/js/src/views/Addresses/index.js new file mode 100644 index 00000000000..6e01dfe244d --- /dev/null +++ b/js/src/views/Addresses/index.js @@ -0,0 +1 @@ +export default from './addresses'; diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index 4fb31d72f08..07fb1102276 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -12,15 +12,23 @@ import { Tooltip } from '../../../ui'; import styles from './tabBar.css'; import imagesEthcoreBlock from '../../../images/ethcore-block.png'; +const TABMAP = { + accounts: 'account', + address: 'account', + addresses: 'account', + apps: 'app', + contracts: 'contract' +}; + export default class TabBar extends Component { static contextTypes = { router: PropTypes.object.isRequired } render () { - const hash = (window.location.hash || '') - .replace('#/', '').replace('accounts', 'account').replace('apps', 'app') - .split('?')[0].split('/')[0]; + const windowHash = (window.location.hash || '') + .split('?')[0].split('/')[1]; + const hash = TABMAP[windowHash] || windowHash; return ( _account.uuid === uuid) || { address, - uuid, - balances: [], - txCount: 0 + uuid }; accounts.push(Object.assign(account, { @@ -157,13 +156,13 @@ class Application extends Component { } retrieveBalances = () => { - const { accounts, tokens } = this.state; + const { accounts, contacts, tokens } = this.state; + const balances = {}; + const addresses = accounts.concat(contacts).map((account) => account.address); return Promise .all( - accounts.map((account) => { - const { address } = account; - + addresses.map((address) => { return Promise.all([ api.eth.getBalance(address), api.eth.getTransactionCount(address) @@ -173,29 +172,32 @@ class Application extends Component { .then((balancesTxCounts) => { return Promise.all( balancesTxCounts.map(([balance, txCount], idx) => { - const account = accounts[idx]; + const address = addresses[idx]; const { isTest } = this.props; - account.txCount = txCount.sub(isTest ? 0x100000 : 0); // WHY? - account.balances = [{ - token: ETH_TOKEN, - value: balance.toString() - }]; + balances[address] = { + txCount: txCount.sub(isTest ? 0x100000 : 0), + tokens: [{ + token: ETH_TOKEN, + value: balance.toString() + }] + }; return Promise.all( tokens.map((token) => { - return token.contract.instance.balanceOf.call({}, [account.address]); + return token.contract.instance.balanceOf.call({}, [address]); }) ); }) ); }) - .then((balances) => { - accounts.forEach((account, idx) => { - const balanceOf = balances[idx]; + .then((tokenBalances) => { + addresses.forEach((address, idx) => { + const balanceOf = tokenBalances[idx]; + const balance = balances[address]; tokens.forEach((token, tidx) => { - account.balances.push({ + balance.tokens.push({ token, value: balanceOf[tidx].toString() }); @@ -203,7 +205,7 @@ class Application extends Component { }); this.setState({ - accounts + balances }); }) .catch((error) => { @@ -212,66 +214,42 @@ class Application extends Component { } retrieveTokens = () => { - const contracts = {}; - const tokens = []; - api.ethcore .registryAddress() .then((registryAddress) => { - contracts.registry = api.newContract(registryAbi, registryAddress); + const registry = api.newContract(registryAbi, registryAddress); - return contracts.registry.instance.getAddress.call({}, [api.format.sha3('tokenreg'), 'A']); + return registry.instance.getAddress.call({}, [api.format.sha3('tokenreg'), 'A']); }) .then((tokenregAddress) => { - contracts.tokenreg = api.newContract(tokenRegAbi, tokenregAddress); + const tokenreg = api.newContract(tokenRegAbi, tokenregAddress); - return contracts.tokenreg.instance.tokenCount.call(); - }) - .then((tokenCount) => { - const promises = []; + return tokenreg.instance.tokenCount + .call() + .then((numTokens) => { + const promises = []; - while (promises.length < tokenCount.toNumber()) { - promises.push(contracts.tokenreg.instance.token.call({}, [promises.length])); - } + while (promises.length < numTokens.toNumber()) { + promises.push(tokenreg.instance.token.call({}, [promises.length])); + } - return Promise.all(promises); - }) - .then((_tokens) => { - return Promise.all( - _tokens.map((token) => { - const contract = api.newContract(eip20Abi); - contract.at(token[0]); - - tokens.push({ - address: token[0], - format: token[2].toString(), - images: images[token[3].toLowerCase()], - supply: '0', - tag: token[1], - name: token[3], - contract - }); - - return contract.instance.totalSupply.call(); - }) - ); + return Promise.all(promises); + }); }) - .then((supplies) => { - supplies.forEach((supply, idx) => { - tokens[idx].supply = supply.toString(); - }); - + .then((tokens) => { this.setState({ - tokens, - contracts: Object.keys(contracts).map((name) => { - const contract = contracts[name]; + tokens: tokens.map((token) => { + const [address, tag, format, name] = token; return { + address, name, - contract, - address: contract.address + tag, + format: format.toString(), + images: images[name.toLowerCase()], + contract: api.newContract(eip20Abi, address) }; - }).concat(tokens) + }) }, this.retrieveBalances); }) .catch((error) => { @@ -294,11 +272,6 @@ class Application extends Component { .then(([blockNumber, clientVersion, netChain, netPeers, syncing]) => { const isTest = netChain === 'morden' || netChain === 'testnet'; - if (blockNumber.gt(lastBlockNumber)) { - lastBlockNumber = blockNumber; - this.retrieveBalances(); - } - onUpdateStatus({ blockNumber, clientVersion, @@ -308,6 +281,11 @@ class Application extends Component { syncing }); + if (blockNumber.gt(lastBlockNumber)) { + lastBlockNumber = blockNumber; + this.retrieveBalances(); + } + nextTimeout(); }) .catch((error) => { diff --git a/js/src/views/index.js b/js/src/views/index.js index 489353a1324..83141737458 100644 --- a/js/src/views/index.js +++ b/js/src/views/index.js @@ -1,5 +1,6 @@ import Account from './Account'; import Accounts from './Accounts'; +import Addresses from './Addresses'; import Application from './Application'; import Contract from './Contract'; import Contracts from './Contracts'; @@ -11,6 +12,7 @@ import Signer from './Signer'; export { Account, Accounts, + Addresses, Application, Contract, Contracts, From d7fb28ae6a61246218448105bed5db485d749f65 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 6 Sep 2016 19:54:03 +0200 Subject: [PATCH 0342/1062] add a type icon to the accounts --- js/src/views/Accounts/Summary/summary.css | 4 ++++ js/src/views/Accounts/Summary/summary.js | 16 +++++++++++++--- js/src/views/Addresses/addresses.js | 2 +- 3 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 js/src/views/Accounts/Summary/summary.css diff --git a/js/src/views/Accounts/Summary/summary.css b/js/src/views/Accounts/Summary/summary.css new file mode 100644 index 00000000000..76ea07a29ff --- /dev/null +++ b/js/src/views/Accounts/Summary/summary.css @@ -0,0 +1,4 @@ +.typeIcon { + float: right; + opacity: 0.5; +} diff --git a/js/src/views/Accounts/Summary/summary.js b/js/src/views/Accounts/Summary/summary.js index 3072c87861e..a89116dc579 100644 --- a/js/src/views/Accounts/Summary/summary.js +++ b/js/src/views/Accounts/Summary/summary.js @@ -1,9 +1,13 @@ import React, { Component, PropTypes } from 'react'; import { Link } from 'react-router'; +import ActionAccountBalanceWallet from 'material-ui/svg-icons/action/account-balance-wallet'; +import CommunicationContacts from 'material-ui/svg-icons/communication/contacts'; import Balances from '../../../ui/Balances'; import { Container, ContainerTitle, IdentityIcon } from '../../../ui'; +import styles from './summary.css'; + export default class Summary extends Component { static contextTypes = { api: React.PropTypes.object @@ -11,7 +15,7 @@ export default class Summary extends Component { static propTypes = { account: PropTypes.object.isRequired, - to: PropTypes.string, + contact: PropTypes.string, children: PropTypes.node } @@ -20,16 +24,22 @@ export default class Summary extends Component { } render () { - const { account, children, to } = this.props; + const { account, children, contact } = this.props; if (!account) { return null; } - const viewLink = `/${to || 'account'}/${account.address}`; + const viewLink = `/${contact ? 'address' : 'account'}/${account.address}`; + const typeIcon = contact + ? + : ; return ( +
+ { typeIcon } +
); From 84266073114ea2cace233b72e1782289a19b6631 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 6 Sep 2016 20:43:43 +0200 Subject: [PATCH 0343/1062] add click-through from address-book addresses --- js/src/index.js | 3 +- js/src/views/Account/Header/header.css | 17 ++++ js/src/views/Account/Header/header.js | 99 +++++++++++++++++++ js/src/views/Account/Header/index.js | 1 + .../Account/Transactions/transactions.css | 41 ++++++++ .../Account/Transactions/transactions.js | 2 +- js/src/views/Account/account.css | 59 +---------- js/src/views/Account/account.js | 92 ++--------------- js/src/views/Address/address.css | 2 + js/src/views/Address/address.js | 35 +++++++ js/src/views/Address/index.js | 1 + js/src/views/index.js | 2 + 12 files changed, 209 insertions(+), 145 deletions(-) create mode 100644 js/src/views/Account/Header/header.css create mode 100644 js/src/views/Account/Header/header.js create mode 100644 js/src/views/Account/Header/index.js create mode 100644 js/src/views/Account/Transactions/transactions.css create mode 100644 js/src/views/Address/address.css create mode 100644 js/src/views/Address/address.js create mode 100644 js/src/views/Address/index.js diff --git a/js/src/index.js b/js/src/index.js index 0fda7463ff9..60f766af026 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -11,7 +11,7 @@ import { Redirect, Router, Route, useRouterHistory } from 'react-router'; import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; import { muiTheme } from './ui'; -import { Accounts, Account, Addresses, Application, Contract, Contracts, Dapp, Dapps } from './views'; +import { Accounts, Account, Addresses, Address, Application, Contract, Contracts, Dapp, Dapps } from './views'; import { errorReducer } from './ui/Errors'; import { tooltipReducer } from './ui/Tooltips'; @@ -71,6 +71,7 @@ ReactDOM.render( + diff --git a/js/src/views/Account/Header/header.css b/js/src/views/Account/Header/header.css new file mode 100644 index 00000000000..55bddf47826 --- /dev/null +++ b/js/src/views/Account/Header/header.css @@ -0,0 +1,17 @@ +.balances { + clear: both; +} + +.editicon { + margin-left: 0.5em; +} + +.floatleft { + float: left; + margin-bottom: 0.5em; +} + +.infoline { + color: #aaa; + line-height: 1.618em; +} diff --git a/js/src/views/Account/Header/header.js b/js/src/views/Account/Header/header.js new file mode 100644 index 00000000000..fe62d89666e --- /dev/null +++ b/js/src/views/Account/Header/header.js @@ -0,0 +1,99 @@ +import React, { Component, PropTypes } from 'react'; +import ContentCreate from 'material-ui/svg-icons/content/create'; + +import { Balances, Container, ContainerTitle, Form, InputInline, IdentityIcon } from '../../../ui'; + +import styles from './header.css'; + +const DEFAULT_NAME = 'Unnamed'; + +export default class Header extends Component { + static contextTypes = { + api: PropTypes.object, + balances: PropTypes.object + } + + static propTypes = { + account: PropTypes.object + } + + state = { + name: null + } + + componentWillMount () { + this.setName(); + } + + componentWillReceiveProps () { + this.setName(); + } + + render () { + const { balances } = this.context; + const { account } = this.props; + const { address } = account; + const { name } = this.state; + const balance = balances[address]; + + const title = ( + + { name || DEFAULT_NAME } + + + ); + + return ( + + + +
+ } + onChange={ this.onEditName } /> +
+ { address } +
+
+ { balance.txCount.toFormat() } outgoing transactions +
+
+
+ +
+ +
+ ); + } + + onEditName = (event, name) => { + const { api } = this.context; + const { account } = this.props; + + this.setState({ name }, () => { + api.personal + .setAccountName(account.address, name) + .catch((error) => { + console.error(error); + }); + }); + } + + setName () { + const { account } = this.props; + + if (account && account.name !== this.propName) { + this.propName = account.name; + this.setState({ + name: account.name + }); + } + } +} diff --git a/js/src/views/Account/Header/index.js b/js/src/views/Account/Header/index.js new file mode 100644 index 00000000000..91aac2ba57b --- /dev/null +++ b/js/src/views/Account/Header/index.js @@ -0,0 +1 @@ +export default from './header'; diff --git a/js/src/views/Account/Transactions/transactions.css b/js/src/views/Account/Transactions/transactions.css new file mode 100644 index 00000000000..7d9cbdbbbe4 --- /dev/null +++ b/js/src/views/Account/Transactions/transactions.css @@ -0,0 +1,41 @@ +.right { + text-align: right; +} + +.center { + text-align: center; +} + +.left { + text-align: left; +} + +.transactions { + width: 100%; +} + +.transactions tr { + line-height: 32px; + vertical-align: top; + /*font-family: 'Roboto Mono', monospace;*/ +} + +.transactions th { + color: #aaa; +} + +.transactions tr td { + vertical-align: top; +} + +.transactions .link { + vertical-align: top; +} + +.value { + text-align: right; +} + +.infonone { + opacity: 0.25; +} diff --git a/js/src/views/Account/Transactions/transactions.js b/js/src/views/Account/Transactions/transactions.js index ff3a64a574b..a764eecfa90 100644 --- a/js/src/views/Account/Transactions/transactions.js +++ b/js/src/views/Account/Transactions/transactions.js @@ -10,7 +10,7 @@ import format from '../../../api/format'; import etherscan from '../../../3rdparty/etherscan'; import { Container, IdentityIcon } from '../../../ui'; -import styles from '../account.css'; +import styles from './transactions.css'; function formatHash (hash) { if (!hash || hash.length <= 21) { diff --git a/js/src/views/Account/account.css b/js/src/views/Account/account.css index 996d699918e..e35b8d2b177 100644 --- a/js/src/views/Account/account.css +++ b/js/src/views/Account/account.css @@ -1,59 +1,2 @@ -.editicon { - margin-left: 0.5em; -} - -.infoline { - color: #aaa; - line-height: 1.618em; -} - -.floatleft { - float: left; - margin-bottom: 0.5em; -} - -.balances { - clear: both; -} - -.right { - text-align: right; -} - -.center { - text-align: center; -} - -.left { - text-align: left; -} - -.transactions { - width: 100%; -} - -.transactions tr { - line-height: 32px; - vertical-align: top; - /*font-family: 'Roboto Mono', monospace;*/ -} - -.transactions th { - color: #aaa; -} - -.transactions tr td { - vertical-align: top; -} - -.transactions .link { - vertical-align: top; -} - -.value { - text-align: right; -} - -.infonone { - opacity: 0.25; +.account { } diff --git a/js/src/views/Account/account.js b/js/src/views/Account/account.js index 3346e669d8e..bb4a650b207 100644 --- a/js/src/views/Account/account.js +++ b/js/src/views/Account/account.js @@ -1,18 +1,16 @@ import React, { Component, PropTypes } from 'react'; import { FlatButton } from 'material-ui'; import ActionAccountBalance from 'material-ui/svg-icons/action/account-balance'; -import ContentCreate from 'material-ui/svg-icons/content/create'; import ContentSend from 'material-ui/svg-icons/content/send'; import { FundAccount, Transfer } from '../../modals'; -import { Actionbar, Balances, Container, ContainerTitle, Form, InputInline, IdentityIcon } from '../../ui'; +import { Actionbar } from '../../ui'; +import Header from './Header'; import Transactions from './Transactions'; import styles from './account.css'; -const DEFAULT_NAME = 'Unnamed'; - export default class Account extends Component { static contextTypes = { api: React.PropTypes.object, @@ -27,71 +25,26 @@ export default class Account extends Component { propName = null state = { - name: null, fundDialog: false, transferDialog: false } - componentWillMount () { - this.setName(); - } - - componentWillReceiveProps () { - this.setName(); - } - render () { - const { accounts, balances } = this.context; + const { accounts } = this.context; const { address } = this.props.params; - const { name } = this.state; - const balance = balances[address]; const account = accounts.find((_account) => _account.address === address); - if (!balance || !account) { + if (!account) { return null; } - const title = ( - - { name || DEFAULT_NAME } - - - ); - return ( -
+
{ this.renderFundDialog() } { this.renderTransferDialog() } { this.renderActionbar() } - - -
-
- } - onChange={ this.onEditName } /> -
- { address } -
-
- { balance.txCount.toFormat() } outgoing transactions -
-
-
- -
- -
+
@@ -173,35 +126,4 @@ export default class Account extends Component { onTransferClose = () => { this.onTransferClick(); } - - onChangeBalances = (balances) => { - this.setState({ - balances: balances - }); - } - - onEditName = (event, name) => { - const { api } = this.context; - const { address } = this.props.params; - - this.setState({ name }, () => { - api.personal - .setAccountName(address, name) - .catch((error) => { - console.error(error); - }); - }); - } - - setName () { - const { address } = this.props.params; - const account = this.context.accounts.find((account) => account.address === address); - - if (account && account.name !== this.propName) { - this.propName = account.name; - this.setState({ - name: account.name - }); - } - } } diff --git a/js/src/views/Address/address.css b/js/src/views/Address/address.css new file mode 100644 index 00000000000..b83b9a7f1a9 --- /dev/null +++ b/js/src/views/Address/address.css @@ -0,0 +1,2 @@ +.address { +} diff --git a/js/src/views/Address/address.js b/js/src/views/Address/address.js new file mode 100644 index 00000000000..3017773a5b7 --- /dev/null +++ b/js/src/views/Address/address.js @@ -0,0 +1,35 @@ +import React, { Component, PropTypes } from 'react'; + +import Header from '../Account/Header'; +import Transactions from '../Account/Transactions'; + +import styles from './address.css'; + +export default class Address extends Component { + static contextTypes = { + contacts: PropTypes.array + } + + static propTypes = { + params: PropTypes.object + } + + render () { + const { contacts } = this.context; + const { address } = this.props.params; + const contact = contacts.find((_account) => _account.address === address); + + if (!contact) { + return null; + } + + return ( +
+
+ +
+ ); + } +} diff --git a/js/src/views/Address/index.js b/js/src/views/Address/index.js new file mode 100644 index 00000000000..49240c5e40e --- /dev/null +++ b/js/src/views/Address/index.js @@ -0,0 +1 @@ +export default from './address'; diff --git a/js/src/views/index.js b/js/src/views/index.js index 83141737458..b65ab39268c 100644 --- a/js/src/views/index.js +++ b/js/src/views/index.js @@ -1,5 +1,6 @@ import Account from './Account'; import Accounts from './Accounts'; +import Address from './Address'; import Addresses from './Addresses'; import Application from './Application'; import Contract from './Contract'; @@ -12,6 +13,7 @@ import Signer from './Signer'; export { Account, Accounts, + Address, Addresses, Application, Contract, From 27538a09f60731a6ba107c59f0bbbf3b45d01e20 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 6 Sep 2016 20:57:49 +0200 Subject: [PATCH 0344/1062] shared infrastructure for accounts & addresses lists --- js/src/views/Accounts/List/index.js | 1 + js/src/views/Accounts/List/list.css | 27 ++++++++++++++++ js/src/views/Accounts/List/list.js | 45 ++++++++++++++++++++++++++ js/src/views/Accounts/accounts.css | 27 +--------------- js/src/views/Accounts/accounts.js | 48 ++++++---------------------- js/src/views/Addresses/addresses.css | 3 ++ js/src/views/Addresses/addresses.js | 36 +++------------------ 7 files changed, 91 insertions(+), 96 deletions(-) create mode 100644 js/src/views/Accounts/List/index.js create mode 100644 js/src/views/Accounts/List/list.css create mode 100644 js/src/views/Accounts/List/list.js diff --git a/js/src/views/Accounts/List/index.js b/js/src/views/Accounts/List/index.js new file mode 100644 index 00000000000..f85725446e1 --- /dev/null +++ b/js/src/views/Accounts/List/index.js @@ -0,0 +1 @@ +export default from './list'; diff --git a/js/src/views/Accounts/List/list.css b/js/src/views/Accounts/List/list.css new file mode 100644 index 00000000000..f82ecd36635 --- /dev/null +++ b/js/src/views/Accounts/List/list.css @@ -0,0 +1,27 @@ +.list { + display: flex; + flex-wrap: wrap; +} + +.account { + flex: 0 1 50%; + width: 50%; + position: relative; +} + +.account:nth-child(odd)>div { + padding-right: 0.5em !important; +} + +.account:nth-child(even)>div { + padding-left: 0.5em !important; +} + +.empty { + width: 100%; + display: block; +} + +.empty div { + color: #aaa; +} diff --git a/js/src/views/Accounts/List/list.js b/js/src/views/Accounts/List/list.js new file mode 100644 index 00000000000..48d68997567 --- /dev/null +++ b/js/src/views/Accounts/List/list.js @@ -0,0 +1,45 @@ +import React, { Component, PropTypes } from 'react'; + +import { Container } from '../../../ui'; + +import Summary from '../Summary'; +import styles from './list.css'; + +export default class List extends Component { + static propTypes = { + accounts: PropTypes.array + }; + + render () { + return ( +
+ { this.renderAccounts() } +
+ ); + } + + renderAccounts () { + const { accounts } = this.props; + + if (!accounts || !accounts.length) { + return ( + +
+ There are currently no accounts or addresses to display. +
+
+ ); + } + + return accounts.map((account, idx) => { + return ( +
+ +
+ ); + }); + } +} diff --git a/js/src/views/Accounts/accounts.css b/js/src/views/Accounts/accounts.css index 05948b3b6e8..9bae4fed75e 100644 --- a/js/src/views/Accounts/accounts.css +++ b/js/src/views/Accounts/accounts.css @@ -1,24 +1,8 @@ .accounts { - display: flex; - flex-wrap: wrap; -} - -.account { - flex: 0 1 50%; - width: 50%; - position: relative; -} - -.account:nth-child(odd)>div { - padding-right: 0.5em !important; -} - -.account:nth-child(even)>div { - padding-left: 0.5em !important; } .accountTooltip { - top: 5.5em; + top: 13em; left: 5em; } @@ -30,12 +14,3 @@ right: 20px; top: 4em; } - -.empty { - width: 100%; - display: block; -} - -.empty div { - color: #aaa; -} diff --git a/js/src/views/Accounts/accounts.js b/js/src/views/Accounts/accounts.js index c71258aad82..d680b034bc4 100644 --- a/js/src/views/Accounts/accounts.js +++ b/js/src/views/Accounts/accounts.js @@ -4,9 +4,9 @@ import { FlatButton } from 'material-ui'; import CommunicationContacts from 'material-ui/svg-icons/communication/contacts'; import ContentAdd from 'material-ui/svg-icons/content/add'; -import Summary from './Summary'; +import List from './List'; import { AddressBook, CreateAccount } from '../../modals'; -import { Actionbar, Container, Tooltip } from '../../ui'; +import { Actionbar, Tooltip } from '../../ui'; import styles from './accounts.css'; @@ -22,14 +22,17 @@ export default class Accounts extends Component { } render () { + const { accounts } = this.context; + return ( -
+
{ this.renderAddressBook() } { this.renderNewDialog() } { this.renderActionbar() } -
- { this.renderAccounts() } -
+ +
); } @@ -65,39 +68,6 @@ export default class Accounts extends Component { ); } - renderAccounts () { - const { accounts } = this.context; - - if (!accounts || !accounts.length) { - return ( - -
- There are currently no accounts attached to this instance. -
-
- ); - } - - const firstTooltip = ( - - ); - - return accounts.map((account, idx) => { - return ( -
- - { idx === 0 ? firstTooltip : null } - -
- ); - }); - } - renderNewDialog () { const { newDialog } = this.state; diff --git a/js/src/views/Addresses/addresses.css b/js/src/views/Addresses/addresses.css index 2bfb1f58eef..ea66c154935 100644 --- a/js/src/views/Addresses/addresses.css +++ b/js/src/views/Addresses/addresses.css @@ -1,4 +1,7 @@ .addresses { +} + +.list { display: flex; flex-wrap: wrap; } diff --git a/js/src/views/Addresses/addresses.js b/js/src/views/Addresses/addresses.js index a0a95ba66ae..0f1ab86de37 100644 --- a/js/src/views/Addresses/addresses.js +++ b/js/src/views/Addresses/addresses.js @@ -1,7 +1,7 @@ import React, { Component, PropTypes } from 'react'; -import Summary from '../Accounts/Summary'; -import { Actionbar, Container } from '../../ui'; +import List from '../Accounts/List'; +import { Actionbar } from '../../ui'; import styles from './addresses.css'; @@ -12,14 +12,12 @@ export default class Addresses extends Component { } render () { - console.log(this.renderAddresses()); + const { contacts } = this.context; return ( -
+
{ this.renderActionbar() } -
- { this.renderAddresses() } -
+
); } @@ -31,28 +29,4 @@ export default class Addresses extends Component { title='Saved Addresses' /> ); } - - renderAddresses () { - const { contacts } = this.context; - - if (!contacts || !contacts.length) { - return ( - - There are currently no saved addresses. - - ); - } - - return contacts.map((contact, idx) => { - return ( -
- -
- ); - }); - } } From fc5e055d6269df5069ded2155b97128ed0944811 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 6 Sep 2016 21:09:13 +0200 Subject: [PATCH 0345/1062] restore token image lookups --- js/src/ui/IdentityIcon/identityIcon.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/js/src/ui/IdentityIcon/identityIcon.js b/js/src/ui/IdentityIcon/identityIcon.js index 4d3e10daafa..4fdb459dec0 100644 --- a/js/src/ui/IdentityIcon/identityIcon.js +++ b/js/src/ui/IdentityIcon/identityIcon.js @@ -5,7 +5,7 @@ import styles from './identityIcon.css'; export default class IdentityIcon extends Component { static contextTypes = { - contracts: PropTypes.array + tokens: PropTypes.array } static propTypes = { @@ -32,19 +32,22 @@ export default class IdentityIcon extends Component { } updateIcon (_address) { - const { contracts } = this.context; + const { tokens } = this.context; const { inline } = this.props; - const address = _address.toLowerCase(); - const contract = (contracts || []).find((c) => c.address.toLowerCase() === address); + const token = (tokens || []).find((c) => c.address === _address); + + console.log(tokens); - if (contract && contract.images) { + if (token && token.images) { this.setState({ - iconsrc: contract.images[inline ? 'small' : 'normal'] + iconsrc: token.images[inline ? 'small' : 'normal'] }); return; } + const address = _address.toLowerCase(); + this.setState({ iconsrc: blockies({ seed: address, From 1d3715d7d419a043288c4c87c460cb9cd3f02084 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 6 Sep 2016 21:09:25 +0200 Subject: [PATCH 0346/1062] add type icons to applications --- js/src/views/Dapps/Summary/summary.css | 4 ++++ js/src/views/Dapps/Summary/summary.js | 6 ++++++ 2 files changed, 10 insertions(+) create mode 100644 js/src/views/Dapps/Summary/summary.css diff --git a/js/src/views/Dapps/Summary/summary.css b/js/src/views/Dapps/Summary/summary.css new file mode 100644 index 00000000000..76ea07a29ff --- /dev/null +++ b/js/src/views/Dapps/Summary/summary.css @@ -0,0 +1,4 @@ +.typeIcon { + float: right; + opacity: 0.5; +} diff --git a/js/src/views/Dapps/Summary/summary.js b/js/src/views/Dapps/Summary/summary.js index 2beeee892ce..486f4ff9798 100644 --- a/js/src/views/Dapps/Summary/summary.js +++ b/js/src/views/Dapps/Summary/summary.js @@ -1,9 +1,12 @@ import React, { Component, PropTypes } from 'react'; import { Link } from 'react-router'; +import NavigationApps from 'material-ui/svg-icons/navigation/apps'; import Container, { Title } from '../../../ui/Container'; import IdentityIcon from '../../../ui/IdentityIcon'; +import styles from './summary.css'; + export default class Summary extends Component { static contextTypes = { api: React.PropTypes.object @@ -25,6 +28,9 @@ export default class Summary extends Component { return ( +
+ +
Date: Tue, 6 Sep 2016 21:29:43 +0200 Subject: [PATCH 0347/1062] address book is now a first-class citizen --- js/src/modals/AddressBook/addressBook.js | 5 ++--- js/src/views/Accounts/accounts.js | 13 +++++-------- js/src/views/Application/TabBar/tabBar.js | 12 ++++++++---- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/js/src/modals/AddressBook/addressBook.js b/js/src/modals/AddressBook/addressBook.js index 5a338ad3915..b7eeaad585b 100644 --- a/js/src/modals/AddressBook/addressBook.js +++ b/js/src/modals/AddressBook/addressBook.js @@ -21,7 +21,7 @@ const editIconStyle = { export default class AddressBook extends Component { static contextTypes = { api: PropTypes.object.isRequired, - accounts: PropTypes.array.isRequired + contacts: PropTypes.array.isRequired }; static propTypes = { @@ -64,8 +64,7 @@ export default class AddressBook extends Component { } renderEntries () { - const { accounts } = this.context; - const contacts = accounts.filter((account) => !account.uuid); + const { contacts } = this.context; if (!contacts.length) { return ( diff --git a/js/src/views/Accounts/accounts.js b/js/src/views/Accounts/accounts.js index d680b034bc4..bceac459eba 100644 --- a/js/src/views/Accounts/accounts.js +++ b/js/src/views/Accounts/accounts.js @@ -1,5 +1,4 @@ import React, { Component, PropTypes } from 'react'; -import { Link } from 'react-router'; import { FlatButton } from 'material-ui'; import CommunicationContacts from 'material-ui/svg-icons/communication/contacts'; import ContentAdd from 'material-ui/svg-icons/content/add'; @@ -45,14 +44,12 @@ export default class Accounts extends Component { label='new account' primary onTouchTap={ this.onNewAccountClick } />, - <Link + <FlatButton key='addressBook' - to='/addresses'> - <FlatButton - icon={ <CommunicationContacts /> } - label='address book' - primary /> - </Link> + icon={ <CommunicationContacts /> } + label='address book' + primary + onTouchTap={ this.onAddressBookClick } /> ]; return ( diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index 07fb1102276..50fd29967a7 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -1,10 +1,9 @@ import React, { Component, PropTypes } from 'react'; - import { Toolbar, ToolbarGroup } from 'material-ui/Toolbar'; import { Tabs, Tab } from 'material-ui/Tabs'; - import ActionAccountBalanceWallet from 'material-ui/svg-icons/action/account-balance-wallet'; import ActionFingerprint from 'material-ui/svg-icons/action/fingerprint'; +import CommunicationContacts from 'material-ui/svg-icons/communication/contacts'; import NavigationApps from 'material-ui/svg-icons/navigation/apps'; import { Tooltip } from '../../../ui'; @@ -14,8 +13,7 @@ import imagesEthcoreBlock from '../../../images/ethcore-block.png'; const TABMAP = { accounts: 'account', - address: 'account', - addresses: 'account', + addresses: 'address', apps: 'app', contracts: 'contract' }; @@ -52,6 +50,12 @@ export default class TabBar extends Component { className={ styles.tabbarTooltip } text='navigate between the different parts and views of the application, switching between an account view, token view and distributed application view' /> </Tab> + <Tab + data-route='/addresses' + value='address' + icon={ <CommunicationContacts /> } + label='address book' + onActive={ this.onActivate } /> <Tab data-route='/apps' value='app' From cf498aab400b010f2aec2d29777a8e52be68fc68 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 6 Sep 2016 21:33:07 +0200 Subject: [PATCH 0348/1062] fix address list click-through --- js/src/views/Accounts/List/list.js | 6 ++++-- js/src/views/Accounts/Summary/summary.js | 2 +- js/src/views/Addresses/addresses.js | 4 +++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/js/src/views/Accounts/List/list.js b/js/src/views/Accounts/List/list.js index 48d68997567..9cf2afddd4c 100644 --- a/js/src/views/Accounts/List/list.js +++ b/js/src/views/Accounts/List/list.js @@ -7,7 +7,8 @@ import styles from './list.css'; export default class List extends Component { static propTypes = { - accounts: PropTypes.array + accounts: PropTypes.array, + contact: PropTypes.bool }; render () { @@ -19,7 +20,7 @@ export default class List extends Component { } renderAccounts () { - const { accounts } = this.props; + const { accounts, contact } = this.props; if (!accounts || !accounts.length) { return ( @@ -37,6 +38,7 @@ export default class List extends Component { className={ styles.account } key={ account.address }> <Summary + contact={ contact } account={ account } /> </div> ); diff --git a/js/src/views/Accounts/Summary/summary.js b/js/src/views/Accounts/Summary/summary.js index a89116dc579..6966a31790b 100644 --- a/js/src/views/Accounts/Summary/summary.js +++ b/js/src/views/Accounts/Summary/summary.js @@ -15,7 +15,7 @@ export default class Summary extends Component { static propTypes = { account: PropTypes.object.isRequired, - contact: PropTypes.string, + contact: PropTypes.bool, children: PropTypes.node } diff --git a/js/src/views/Addresses/addresses.js b/js/src/views/Addresses/addresses.js index 0f1ab86de37..a2f74d6fecc 100644 --- a/js/src/views/Addresses/addresses.js +++ b/js/src/views/Addresses/addresses.js @@ -17,7 +17,9 @@ export default class Addresses extends Component { return ( <div className={ styles.addresses }> { this.renderActionbar() } - <List accounts={ contacts } /> + <List + contact + accounts={ contacts } /> </div> ); } From 94cb7bb8ae0c1dbeb094e2c1aa530309d7f50824 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 6 Sep 2016 22:14:46 +0200 Subject: [PATCH 0349/1062] align signer index with the other view components --- js/src/index.js | 3 +-- .../fonts/sourcesanspro-bold-webfont.woff | Bin 29528 -> 0 bytes .../fonts/sourcesanspro-bold-webfont.woff2 | Bin 23512 -> 0 bytes .../fonts/sourcesanspro-regular-webfont.woff | Bin 29836 -> 0 bytes .../fonts/sourcesanspro-regular-webfont.woff2 | Bin 23808 -> 0 bytes js/src/views/Signer/containers/Root/index.js | 1 - js/src/views/Signer/index.js | 4 +-- .../{containers/Root/Root.css => signer.css} | 3 +++ .../{containers/Root/Root.js => signer.js} | 23 +++++++++--------- 9 files changed, 16 insertions(+), 18 deletions(-) delete mode 100644 js/src/views/Signer/assets/fonts/sourcesanspro-bold-webfont.woff delete mode 100644 js/src/views/Signer/assets/fonts/sourcesanspro-bold-webfont.woff2 delete mode 100644 js/src/views/Signer/assets/fonts/sourcesanspro-regular-webfont.woff delete mode 100644 js/src/views/Signer/assets/fonts/sourcesanspro-regular-webfont.woff2 delete mode 100644 js/src/views/Signer/containers/Root/index.js rename js/src/views/Signer/{containers/Root/Root.css => signer.css} (72%) rename js/src/views/Signer/{containers/Root/Root.js => signer.js} (75%) diff --git a/js/src/index.js b/js/src/index.js index 60f766af026..247d4f2ad1a 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -11,14 +11,13 @@ import { Redirect, Router, Route, useRouterHistory } from 'react-router'; import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; import { muiTheme } from './ui'; -import { Accounts, Account, Addresses, Address, Application, Contract, Contracts, Dapp, Dapps } from './views'; +import { Accounts, Account, Addresses, Address, Application, Contract, Contracts, Dapp, Dapps, Signer } from './views'; import { errorReducer } from './ui/Errors'; import { tooltipReducer } from './ui/Tooltips'; import { statusReducer } from './views/Application/Status'; // TODO: This is VERY messy, just dumped here to get the Signer going -import Signer from './views/Signer/containers/Root'; import signerMiddlewares from './views/Signer/middlewares'; import { signer as signerReducer, toastr as toastrReducer, requests as requestsReducer } from './views/Signer/reducers'; import Web3 from 'web3'; diff --git a/js/src/views/Signer/assets/fonts/sourcesanspro-bold-webfont.woff b/js/src/views/Signer/assets/fonts/sourcesanspro-bold-webfont.woff deleted file mode 100644 index 69306b1d850b9c072d157eb2c779714443f94605..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29528 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 M00043WqJVs0Me=c+yDRo diff --git a/js/src/views/Signer/assets/fonts/sourcesanspro-bold-webfont.woff2 b/js/src/views/Signer/assets/fonts/sourcesanspro-bold-webfont.woff2 deleted file mode 100644 index ffabb8cc65885bf37946930a9da039d5047835f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23512 zcmV({K+?Z=Pew8T0RR9109)7q6aWAK0S8b309$4N0SwFl00000000000000000000 z0000PP(MaSR81TjC>!T&9D^<fU;u++2sjCZWf2Gpg0mEYmM#G{0we>6C<}vD00bZf z&twOMV+?@^KX+wfW(FI%^#^am;deWXGwuGJW-{H}DR3STlj8o<MF(QHg96I6Y_k9V zbB>cS1TLHE)vEf*>@Y%PpgJ1`IweNh?K_dQ(7(0rj5r);zq)c25m@uW?Gw)svBiOD z<xC{qiN?)_^~R}s`I65de^hm50he03(Nfk=d3{&&RYOk8u#6R-8rH_zTiylwjh!6A zw1uNk)`{n()lMfnyNqs|8q&Tf5O$fsZ){HXpDG<0FW$8AQmBD8jHA)Yw{oMVmKeJp z1hhl4t}hQyb$)+tRdpv1oD7`N7vLSN6_EjcoBhKCb57^1U<QJL7>G!eh?JBH2pE7$ zs53C;40P(uSh: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 XL2!n_-ODy<b50=uNR(3n0ssI2rqYxJ diff --git a/js/src/views/Signer/assets/fonts/sourcesanspro-regular-webfont.woff b/js/src/views/Signer/assets/fonts/sourcesanspro-regular-webfont.woff deleted file mode 100644 index f1b68fb33acdae50f457938870c677453bddb484..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29836 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 diff --git a/js/src/views/Signer/assets/fonts/sourcesanspro-regular-webfont.woff2 b/js/src/views/Signer/assets/fonts/sourcesanspro-regular-webfont.woff2 deleted file mode 100644 index bb45e133c3f886118d549dc3744f8c550ee92fd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23808 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 He*gdgxN)k0 diff --git a/js/src/views/Signer/containers/Root/index.js b/js/src/views/Signer/containers/Root/index.js deleted file mode 100644 index a3492f3a7ab..00000000000 --- a/js/src/views/Signer/containers/Root/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './Root'; diff --git a/js/src/views/Signer/index.js b/js/src/views/Signer/index.js index 7d798152e05..49bc364c43d 100644 --- a/js/src/views/Signer/index.js +++ b/js/src/views/Signer/index.js @@ -1,3 +1 @@ -const Signer = null; - -export default Signer; +export default from './signer'; diff --git a/js/src/views/Signer/containers/Root/Root.css b/js/src/views/Signer/signer.css similarity index 72% rename from js/src/views/Signer/containers/Root/Root.css rename to js/src/views/Signer/signer.css index 2a79de74b92..5ce74048f65 100644 --- a/js/src/views/Signer/containers/Root/Root.css +++ b/js/src/views/Signer/signer.css @@ -1,3 +1,6 @@ +.signer { +} + .container { } diff --git a/js/src/views/Signer/containers/Root/Root.js b/js/src/views/Signer/signer.js similarity index 75% rename from js/src/views/Signer/containers/Root/Root.js rename to js/src/views/Signer/signer.js index f7e11b7b435..d0049d28682 100644 --- a/js/src/views/Signer/containers/Root/Root.js +++ b/js/src/views/Signer/signer.js @@ -2,19 +2,18 @@ import React, { Component, PropTypes } from 'react'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; -import { Actionbar } from '../../../../ui'; +import { Actionbar } from '../../ui'; -import { ToastrContainer } from '../../components'; -import { removeToast } from '../../actions/toastr'; +import { removeToast } from './actions/toastr'; +import { ToastrContainer } from './components'; +import LoadingPage from './containers/LoadingPage'; +import OfflinePage from './containers/OfflinePage'; +import RequestsPage from './containers/RequestsPage'; +import UnAuthorizedPage from './containers/UnAuthorizedPage'; -import LoadingPage from '../LoadingPage'; -import OfflinePage from '../OfflinePage'; -import RequestsPage from '../RequestsPage'; -import UnAuthorizedPage from '../UnAuthorizedPage'; +import styles from './signer.css'; -import styles from './Root.css'; - -export class Root extends Component { +export class Signer extends Component { static propTypes = { toastr: PropTypes.shape({ toasts: PropTypes.array.isRequired @@ -33,7 +32,7 @@ export class Root extends Component { const { toastr, actions } = this.props; return ( - <div> + <div className={ styles.signer }> <Actionbar title='Parity Trusted Signer' /> <div className={ styles.mainContainer }> @@ -83,4 +82,4 @@ function mapDispatchToProps (dispatch) { export default connect( mapStateToProps, mapDispatchToProps -)(Root); +)(Signer); From ad858109eb7de5721353df01db0bec8bfd114e8d Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 7 Sep 2016 09:30:15 +0200 Subject: [PATCH 0350/1062] adjust transaction display, auto-sizing now available --- .../Signer/components/Account/Account.css | 3 +-- .../Signer/components/Account/Account.js | 4 +++- .../TransactionFinished.css | 15 +++++++++---- .../TransactionMainDetails.css | 21 ++++++++++++++++--- .../TransactionMainDetails.js | 14 +++++++++---- .../TransactionPending/TransactionPending.css | 15 ++++++++----- .../TransactionPending/TransactionPending.js | 18 ++++++++-------- .../TransactionPendingForm.css | 6 ++++++ .../TransactionPendingFormConfirm.css | 3 +-- .../containers/RequestsPage/RequestsPage.css | 3 +-- 10 files changed, 70 insertions(+), 32 deletions(-) diff --git a/js/src/views/Signer/components/Account/Account.css b/js/src/views/Signer/components/Account/Account.css index 5791d82a9b4..e4818fc7927 100644 --- a/js/src/views/Signer/components/Account/Account.css +++ b/js/src/views/Signer/components/Account/Account.css @@ -22,8 +22,7 @@ text-overflow: ellipsis; overflow: hidden; white-space: nowrap; - min-width: 330px; - display: inline-block; + display: lock; vertical-align: middle; text-transform: uppercase; } diff --git a/js/src/views/Signer/components/Account/Account.js b/js/src/views/Signer/components/Account/Account.js index 10ed8a48267..fce59c9855c 100644 --- a/js/src/views/Signer/components/Account/Account.js +++ b/js/src/views/Signer/components/Account/Account.js @@ -10,7 +10,8 @@ export default class Account extends Component { static contextTypes = { accounts: PropTypes.array, contacts: PropTypes.array, - contracts: PropTypes.array + contracts: PropTypes.array, + tokens: PropTypes.array } static propTypes = { @@ -98,6 +99,7 @@ export default class Account extends Component { const { accounts, contacts, contracts, tokens } = this.context; const { address } = this.props; + console.log(tokens); const account = retrieveAccount(address, accounts, contacts, contracts, tokens); return account ? account.name : null; diff --git a/js/src/views/Signer/components/TransactionFinished/TransactionFinished.css b/js/src/views/Signer/components/TransactionFinished/TransactionFinished.css index 82b70a5974c..2d92777b9fe 100644 --- a/js/src/views/Signer/components/TransactionFinished/TransactionFinished.css +++ b/js/src/views/Signer/components/TransactionFinished/TransactionFinished.css @@ -2,19 +2,26 @@ padding: 25px 0 15px; } +.mainContainer { + position: relative; +} + .mainContainer > * { - display: inline-block; vertical-align: middle; min-height: 120px; } .statusContainer { - width: 180px; + width: 200px; + padding: 20px 40px 0 40px; + /*border-left: 1px solid #aaa;*/ + position: absolute; + top: 0; + right: 0; } .transactionDetails { - border-right: 1px solid #eee; - margin-right: 2rem; + margin-right: 321px; } .isConfirmed { diff --git a/js/src/views/Signer/components/TransactionMainDetails/TransactionMainDetails.css b/js/src/views/Signer/components/TransactionMainDetails/TransactionMainDetails.css index 86bc616ea5d..72bf94dc598 100644 --- a/js/src/views/Signer/components/TransactionMainDetails/TransactionMainDetails.css +++ b/js/src/views/Signer/components/TransactionMainDetails/TransactionMainDetails.css @@ -1,17 +1,33 @@ .transaction { - margin-right: 30px; } .transaction > * { display: inline-block; } +.account { + text-align: center; +} + +.from, .to { + width: 50%; +} + +.from .account { + padding-right: 75px; +} + +.to .account { + padding-left: 75px; +} + .from img, .to img { display: inline-block; width: 50px; height: 50px; margin: 5px; } + .from span, .to span { display: block; } @@ -19,8 +35,7 @@ .tx { position: relative; text-align: center; - margin-right: 10px; - margin-left: 10px; + margin: 0 -75px; width: 150px; top: -20px; white-space: nowrap; diff --git a/js/src/views/Signer/components/TransactionMainDetails/TransactionMainDetails.js b/js/src/views/Signer/components/TransactionMainDetails/TransactionMainDetails.js index 4a373fc2162..e96e9aff27e 100644 --- a/js/src/views/Signer/components/TransactionMainDetails/TransactionMainDetails.js +++ b/js/src/views/Signer/components/TransactionMainDetails/TransactionMainDetails.js @@ -18,7 +18,8 @@ export default class TransactionMainDetails extends Component { chain: PropTypes.string.isRequired, to: PropTypes.string, // undefined if it's a contract toBalance: PropTypes.object, // eth BigNumber - undefined if it's a contract or until it's fetched - className: PropTypes.string + className: PropTypes.string, + children: PropTypes.node }; componentWillMount () { @@ -42,11 +43,12 @@ export default class TransactionMainDetails extends Component { } render () { - const { className } = this.props; + const { className, children } = this.props; return ( <div className={ className }> { this.renderTransfer() } { this.renderContract() } + { children } </div> ); } @@ -60,7 +62,9 @@ export default class TransactionMainDetails extends Component { return ( <div className={ styles.transaction }> <div className={ styles.from }> - <Account address={ from } balance={ fromBalance } chain={ chain } /> + <div className={ styles.account }> + <Account address={ from } balance={ fromBalance } chain={ chain } /> + </div> </div> <div className={ styles.tx }> { this.renderValue() } @@ -68,7 +72,9 @@ export default class TransactionMainDetails extends Component { { this.renderTotalValue() } </div> <div className={ styles.to }> - <Account address={ to } balance={ toBalance } chain={ chain } /> + <div className={ styles.account }> + <Account address={ to } balance={ toBalance } chain={ chain } /> + </div> </div> </div> ); diff --git a/js/src/views/Signer/components/TransactionPending/TransactionPending.css b/js/src/views/Signer/components/TransactionPending/TransactionPending.css index c211ef34a64..01888e06692 100644 --- a/js/src/views/Signer/components/TransactionPending/TransactionPending.css +++ b/js/src/views/Signer/components/TransactionPending/TransactionPending.css @@ -3,12 +3,18 @@ } .transactionDetails { - border-right: 1px solid #eee; - margin-right: 2rem; + margin-right: 321px; +} + +.mainContainer { + position: relative; +} + +.mainContainer:after { + clear: both; } .mainContainer > * { - display: inline-block; vertical-align: middle; min-height: 120px; } @@ -18,8 +24,7 @@ text-align: center; font-size: .8em; opacity: 0.5; - width: 830px; - margin-right: 30px; + padding: 1em 0 0 0; } .iconsContainer > * { diff --git a/js/src/views/Signer/components/TransactionPending/TransactionPending.js b/js/src/views/Signer/components/TransactionPending/TransactionPending.js index d163689ef8e..55529f5dbe7 100644 --- a/js/src/views/Signer/components/TransactionPending/TransactionPending.js +++ b/js/src/views/Signer/components/TransactionPending/TransactionPending.js @@ -55,21 +55,21 @@ export default class TransactionPending extends Component { <TransactionMainDetails { ...this.props } className={ styles.transactionDetails } - totalValue={ totalValue } - /> + totalValue={ totalValue }> + <div className={ styles.iconsContainer }> + { this.renderGasPrice() } + { this.renderData() } + </div> + <div className={ styles.expandedContainer }> + { this.renderDataExpanded() } + </div> + </TransactionMainDetails> <TransactionPendingForm isSending={ this.props.isSending } onConfirm={ this.onConfirm } onReject={ this.onReject } /> </div> - <div className={ styles.iconsContainer }> - { this.renderGasPrice() } - { this.renderData() } - </div> - <div className={ styles.expandedContainer }> - { this.renderDataExpanded() } - </div> </div> ); } diff --git a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.css b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.css index 23ef45eac9e..391d427a588 100644 --- a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.css +++ b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.css @@ -1,6 +1,12 @@ .container { width: 200px; + padding: 20px 40px 0 40px; + /*border-left: 1px solid #aaa;*/ + position: absolute; + top: 0; + right: 0; } + .rejectToggle { display: block; cursor: pointer; diff --git a/js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css b/js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css index da9ca08f237..84a2688afa3 100644 --- a/js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css +++ b/js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css @@ -1,6 +1,5 @@ .confirmForm { - margin-top: -40px; - psotion: relative; + margin-top: -30px; } .confirmButton { diff --git a/js/src/views/Signer/containers/RequestsPage/RequestsPage.css b/js/src/views/Signer/containers/RequestsPage/RequestsPage.css index e2e315ac738..7601d261de8 100644 --- a/js/src/views/Signer/containers/RequestsPage/RequestsPage.css +++ b/js/src/views/Signer/containers/RequestsPage/RequestsPage.css @@ -1,5 +1,4 @@ -.request:not(:first-child) { - border-top: 1px solid #444; +.request { } .noRequestsMsg { From b867529e1fa0b5b3d4dd8185a649cb0e3150fbd4 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 7 Sep 2016 09:43:49 +0200 Subject: [PATCH 0351/1062] adjust active tab display --- js/src/ui/Theme/theme.js | 4 +++- js/src/views/Application/TabBar/tabBar.css | 5 +++++ js/src/views/Application/TabBar/tabBar.js | 4 ++++ js/src/views/Signer/components/Account/Account.js | 2 -- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/js/src/ui/Theme/theme.js b/js/src/ui/Theme/theme.js index 92b0daae4b1..bde7ca67925 100644 --- a/js/src/ui/Theme/theme.js +++ b/js/src/ui/Theme/theme.js @@ -7,7 +7,7 @@ const muiTheme = getMuiTheme(darkBaseTheme); muiTheme.stepper.textColor = '#eee'; muiTheme.stepper.disabledTextColor = '#777'; -muiTheme.inkBar.backgroundColor = 'rgb(0, 151, 167)'; // 'rgba(255, 136, 0, 0.8)'; // 'rgb(0, 151, 167)'; +muiTheme.inkBar.backgroundColor = 'transparent'; // 'rgb(0, 151, 167)'; // 'rgba(255, 136, 0, 0.8)'; muiTheme.raisedButton.primaryTextColor = 'white'; muiTheme.snackbar.backgroundColor = 'rgba(255, 30, 30, 0.9)'; muiTheme.snackbar.textColor = 'rgba(255, 255, 255, 0.9)'; @@ -19,4 +19,6 @@ muiTheme.textField.disabledTextColor = muiTheme.textField.textColor; muiTheme.toolbar = lightTheme.toolbar; muiTheme.toolbar.backgroundColor = 'rgb(80, 80, 80)'; // 'rgba(255, 136, 0, 0.5)'; // 'rgb(80, 80, 80)'; +console.log(muiTheme.tabs); + export default muiTheme; diff --git a/js/src/views/Application/TabBar/tabBar.css b/js/src/views/Application/TabBar/tabBar.css index 0b4dfe27dbd..217b6ed2fac 100644 --- a/js/src/views/Application/TabBar/tabBar.css +++ b/js/src/views/Application/TabBar/tabBar.css @@ -4,6 +4,11 @@ position: relative; } +.tabactive { + background: rgb(80, 80, 80) !important; + border-radius: 4px 4px 0 0; +} + .tabs { width: 100%; position: relative; diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index 50fd29967a7..e5c310c2b13 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -41,6 +41,7 @@ export default class TabBar extends Component { className={ styles.tabs } value={ hash }> <Tab + className={ hash === 'account' ? styles.tabactive : '' } data-route='/accounts' value='account' icon={ <ActionAccountBalanceWallet /> } @@ -51,18 +52,21 @@ export default class TabBar extends Component { text='navigate between the different parts and views of the application, switching between an account view, token view and distributed application view' /> </Tab> <Tab + className={ hash === 'address' ? styles.tabactive : '' } data-route='/addresses' value='address' icon={ <CommunicationContacts /> } label='address book' onActive={ this.onActivate } /> <Tab + className={ hash === 'app' ? styles.tabactive : '' } data-route='/apps' value='app' icon={ <NavigationApps /> } label='apps' onActive={ this.onActivate } /> <Tab + className={ hash === 'signer' ? styles.tabactive : '' } data-route='/signer' value='signer' icon={ <ActionFingerprint /> } diff --git a/js/src/views/Signer/components/Account/Account.js b/js/src/views/Signer/components/Account/Account.js index fce59c9855c..0f4dd6e25a2 100644 --- a/js/src/views/Signer/components/Account/Account.js +++ b/js/src/views/Signer/components/Account/Account.js @@ -98,8 +98,6 @@ export default class Account extends Component { _retrieveName () { const { accounts, contacts, contracts, tokens } = this.context; const { address } = this.props; - - console.log(tokens); const account = retrieveAccount(address, accounts, contacts, contracts, tokens); return account ? account.name : null; From 8ef4cdeb72fd734e2d32898991f87930d191291f Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 7 Sep 2016 10:14:23 +0200 Subject: [PATCH 0352/1062] rework display, don't barf when props aren't available yet --- js/src/ui/Balances/balances.js | 7 +- js/src/ui/IdentityIcon/identityIcon.js | 2 - js/src/views/Account/Header/header.js | 42 +++++-- .../Account/Transactions/transactions.js | 117 +++++++++--------- js/src/views/Address/address.js | 14 +++ 5 files changed, 110 insertions(+), 72 deletions(-) diff --git a/js/src/ui/Balances/balances.js b/js/src/ui/Balances/balances.js index abd42e37001..5493155b303 100644 --- a/js/src/ui/Balances/balances.js +++ b/js/src/ui/Balances/balances.js @@ -17,8 +17,13 @@ export default class Balances extends Component { render () { const { api, balances } = this.context; const { account } = this.props; + const balance = balances[account.address]; - let body = balances[account.address].tokens + if (!balance) { + return null; + } + + let body = balance.tokens .filter((balance) => new BigNumber(balance.value).gt(0)) .map((balance) => { const token = balance.token; diff --git a/js/src/ui/IdentityIcon/identityIcon.js b/js/src/ui/IdentityIcon/identityIcon.js index 4fdb459dec0..84c49c89e6c 100644 --- a/js/src/ui/IdentityIcon/identityIcon.js +++ b/js/src/ui/IdentityIcon/identityIcon.js @@ -36,8 +36,6 @@ export default class IdentityIcon extends Component { const { inline } = this.props; const token = (tokens || []).find((c) => c.address === _address); - console.log(tokens); - if (token && token.images) { this.setState({ iconsrc: token.images[inline ? 'small' : 'normal'] diff --git a/js/src/views/Account/Header/header.js b/js/src/views/Account/Header/header.js index fe62d89666e..e39ee701922 100644 --- a/js/src/views/Account/Header/header.js +++ b/js/src/views/Account/Header/header.js @@ -36,14 +36,9 @@ export default class Header extends Component { const { name } = this.state; const balance = balances[address]; - const title = ( - <span> - <span>{ name || DEFAULT_NAME }</span> - <ContentCreate - className={ styles.editicon } - color='rgb(0, 151, 167)' /> - </span> - ); + if (!account) { + return null; + } return ( <Container> @@ -55,14 +50,12 @@ export default class Header extends Component { label='account name' hint='a descriptive name for the account' value={ name } - static={ <ContainerTitle title={ title } /> } + static={ this.renderTitle(name) } onChange={ this.onEditName } /> <div className={ styles.infoline }> { address } </div> - <div className={ styles.infoline }> - { balance.txCount.toFormat() } outgoing transactions - </div> + { this.renderTxCount(balance) } </div> <div className={ styles.balances }> <Balances @@ -73,6 +66,31 @@ export default class Header extends Component { ); } + renderTitle (name) { + return ( + <ContainerTitle title={ + <span> + <span>{ name || DEFAULT_NAME }</span> + <ContentCreate + className={ styles.editicon } + color='rgb(0, 151, 167)' /> + </span> + } /> + ); + } + + renderTxCount (balance) { + if (!balance) { + return null; + } + + return ( + <div className={ styles.infoline }> + { balance.txCount.toFormat() } outgoing transactions + </div> + ); + } + onEditName = (event, name) => { const { api } = this.context; const { account } = this.props; diff --git a/js/src/views/Account/Transactions/transactions.js b/js/src/views/Account/Transactions/transactions.js index a764eecfa90..61a79f6526e 100644 --- a/js/src/views/Account/Transactions/transactions.js +++ b/js/src/views/Account/Transactions/transactions.js @@ -94,82 +94,85 @@ class Transactions extends Component { renderTransactions () { const { isTest } = this.props; - const prefix = `https://${isTest ? 'testnet.' : ''}etherscan.io/`; - let transactions = null; - - if (this.state.transactions && this.state.transactions.length) { - transactions = (this.state.transactions || []).map((tx) => { - const hashLink = `${prefix}tx/${tx.hash}`; - const value = formatEther(tx.value); - const token = value ? 'ΞTH' : null; - const tosection = (tx.to && tx.to.length) - ? this.renderAddress(prefix, tx.to) - : (<td className={ `${styles.center}` }></td>); - - return ( - <tr key={ tx.hash }> - <td className={ styles.center }></td> - { this.renderAddress(prefix, tx.from) } - { tosection } - <td className={ styles.center }> - <a href={ hashLink } target='_blank' className={ styles.link }> - { formatHash(tx.hash) } - </a> - </td> - <td className={ styles.right }> - { formatNumber(tx.blockNumber) } - </td> - <td className={ styles.right }> - { formatTime(tx.timeStamp) } - </td> - <td className={ styles.value }> - { formatEther(tx.value) }<small> { token }</small> - </td> - </tr> - ); - }); + const { loading, transactions } = this.state; + if (loading) { return ( - <table className={ styles.transactions }> - <thead> - <tr className={ styles.info }> - <th> </th> - <th className={ styles.left }>from</th> - <th className={ styles.left }>to</th> - <th className={ styles.center }>transaction</th> - <th className={ styles.right }>block</th> - <th className={ styles.right }>age</th> - <th className={ styles.right }>value</th> - </tr> - </thead> - <tbody> - { transactions } - </tbody> - </table> + <LinearProgress mode='indeterminate' /> ); - } else if (this.state.loading) { + } else if (!transactions.length) { return ( - <LinearProgress mode='indeterminate' /> + <div className={ styles.infonone }> + No transactions were found for this account + </div> ); } + const prefix = `https://${isTest ? 'testnet.' : ''}etherscan.io/`; + const rows = (transactions || []).map((tx) => { + const hashLink = `${prefix}tx/${tx.hash}`; + const value = formatEther(tx.value); + const token = value ? 'ΞTH' : null; + const tosection = (tx.to && tx.to.length) + ? this.renderAddress(prefix, tx.to) + : (<td className={ `${styles.center}` }></td>); + + return ( + <tr key={ tx.hash }> + <td className={ styles.center }></td> + { this.renderAddress(prefix, tx.from) } + { tosection } + <td className={ styles.center }> + <a href={ hashLink } target='_blank' className={ styles.link }> + { formatHash(tx.hash) } + </a> + </td> + <td className={ styles.right }> + { formatNumber(tx.blockNumber) } + </td> + <td className={ styles.right }> + { formatTime(tx.timeStamp) } + </td> + <td className={ styles.value }> + { formatEther(tx.value) }<small> { token }</small> + </td> + </tr> + ); + }); + return ( - <div className={ styles.infonone }> - No transactions were found for this account - </div> + <table className={ styles.transactions }> + <thead> + <tr className={ styles.info }> + <th> </th> + <th className={ styles.left }>from</th> + <th className={ styles.left }>to</th> + <th className={ styles.center }>transaction</th> + <th className={ styles.right }>block</th> + <th className={ styles.right }>age</th> + <th className={ styles.right }>value</th> + </tr> + </thead> + <tbody> + { rows } + </tbody> + </table> ); } getTransactions = () => { - const { isTest } = this.props; + const { isTest, address } = this.props; return etherscan.account - .transactions(this.props.address, 0, isTest) + .transactions(address, 0, isTest) .then((transactions) => { this.setState({ transactions, loading: false }); + }) + .catch((error) => { + console.error('getTransactions', error); }); } } diff --git a/js/src/views/Address/address.js b/js/src/views/Address/address.js index 3017773a5b7..419c6c42c1d 100644 --- a/js/src/views/Address/address.js +++ b/js/src/views/Address/address.js @@ -1,5 +1,7 @@ import React, { Component, PropTypes } from 'react'; +import { Actionbar } from '../../ui'; + import Header from '../Account/Header'; import Transactions from '../Account/Transactions'; @@ -25,6 +27,7 @@ export default class Address extends Component { return ( <div className={ styles.address }> + { this.renderActionbar() } <Header account={ contact } /> <Transactions @@ -32,4 +35,15 @@ export default class Address extends Component { </div> ); } + + renderActionbar () { + const buttons = [ + ]; + + return ( + <Actionbar + title='Address Information' + buttons={ buttons } /> + ); + } } From 0627258618cdbc0e0e2a6e59c9fcb92426b7d46d Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 7 Sep 2016 10:17:49 +0200 Subject: [PATCH 0353/1062] remove type icon, getting very cluterred --- js/src/views/Accounts/Summary/summary.css | 5 +---- js/src/views/Accounts/Summary/summary.js | 10 ---------- js/src/views/Dapps/Summary/summary.css | 5 +---- js/src/views/Dapps/Summary/summary.js | 6 ------ 4 files changed, 2 insertions(+), 24 deletions(-) diff --git a/js/src/views/Accounts/Summary/summary.css b/js/src/views/Accounts/Summary/summary.css index 76ea07a29ff..8b137891791 100644 --- a/js/src/views/Accounts/Summary/summary.css +++ b/js/src/views/Accounts/Summary/summary.css @@ -1,4 +1 @@ -.typeIcon { - float: right; - opacity: 0.5; -} + diff --git a/js/src/views/Accounts/Summary/summary.js b/js/src/views/Accounts/Summary/summary.js index 6966a31790b..697890bfc27 100644 --- a/js/src/views/Accounts/Summary/summary.js +++ b/js/src/views/Accounts/Summary/summary.js @@ -1,13 +1,9 @@ import React, { Component, PropTypes } from 'react'; import { Link } from 'react-router'; -import ActionAccountBalanceWallet from 'material-ui/svg-icons/action/account-balance-wallet'; -import CommunicationContacts from 'material-ui/svg-icons/communication/contacts'; import Balances from '../../../ui/Balances'; import { Container, ContainerTitle, IdentityIcon } from '../../../ui'; -import styles from './summary.css'; - export default class Summary extends Component { static contextTypes = { api: React.PropTypes.object @@ -31,15 +27,9 @@ export default class Summary extends Component { } const viewLink = `/${contact ? 'address' : 'account'}/${account.address}`; - const typeIcon = contact - ? <CommunicationContacts /> - : <ActionAccountBalanceWallet />; return ( <Container> - <div className={ styles.typeIcon }> - { typeIcon } - </div> <IdentityIcon address={ account.address } /> <ContainerTitle diff --git a/js/src/views/Dapps/Summary/summary.css b/js/src/views/Dapps/Summary/summary.css index 76ea07a29ff..8b137891791 100644 --- a/js/src/views/Dapps/Summary/summary.css +++ b/js/src/views/Dapps/Summary/summary.css @@ -1,4 +1 @@ -.typeIcon { - float: right; - opacity: 0.5; -} + diff --git a/js/src/views/Dapps/Summary/summary.js b/js/src/views/Dapps/Summary/summary.js index 486f4ff9798..2beeee892ce 100644 --- a/js/src/views/Dapps/Summary/summary.js +++ b/js/src/views/Dapps/Summary/summary.js @@ -1,12 +1,9 @@ import React, { Component, PropTypes } from 'react'; import { Link } from 'react-router'; -import NavigationApps from 'material-ui/svg-icons/navigation/apps'; import Container, { Title } from '../../../ui/Container'; import IdentityIcon from '../../../ui/IdentityIcon'; -import styles from './summary.css'; - export default class Summary extends Component { static contextTypes = { api: React.PropTypes.object @@ -28,9 +25,6 @@ export default class Summary extends Component { return ( <Container> - <div className={ styles.typeIcon }> - <NavigationApps /> - </div> <IdentityIcon address={ app.address } /> <Title From 75892c98ff3a06ba111623a74d459326f8ada481 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 7 Sep 2016 10:38:30 +0200 Subject: [PATCH 0354/1062] adjust overall flow styling --- js/src/reset.css | 2 +- js/src/ui/Container/container.css | 2 +- js/src/ui/Theme/theme.js | 2 -- js/src/views/Accounts/accounts.css | 4 ++-- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/js/src/reset.css b/js/src/reset.css index 4436a8793f4..1d7cda5e988 100644 --- a/js/src/reset.css +++ b/js/src/reset.css @@ -6,7 +6,7 @@ font-size: 100%; font: inherit; vertical-align: baseline; - background: rgb(95, 95, 95); + background: rgb(80, 80, 80); /* rgb(95, 95, 95); */ color: rgba(255, 255, 255, 0.75); font-size: 16px; font-family: 'Roboto', sans-serif; diff --git a/js/src/ui/Container/container.css b/js/src/ui/Container/container.css index a45fd8e50e5..917c696c0e8 100644 --- a/js/src/ui/Container/container.css +++ b/js/src/ui/Container/container.css @@ -1,5 +1,5 @@ .container { - padding: 1em 1em 0 1em; + padding: 0em 1em 1em 1em; } .padded { diff --git a/js/src/ui/Theme/theme.js b/js/src/ui/Theme/theme.js index bde7ca67925..139d4528b91 100644 --- a/js/src/ui/Theme/theme.js +++ b/js/src/ui/Theme/theme.js @@ -19,6 +19,4 @@ muiTheme.textField.disabledTextColor = muiTheme.textField.textColor; muiTheme.toolbar = lightTheme.toolbar; muiTheme.toolbar.backgroundColor = 'rgb(80, 80, 80)'; // 'rgba(255, 136, 0, 0.5)'; // 'rgb(80, 80, 80)'; -console.log(muiTheme.tabs); - export default muiTheme; diff --git a/js/src/views/Accounts/accounts.css b/js/src/views/Accounts/accounts.css index 9bae4fed75e..aedb9d8a608 100644 --- a/js/src/views/Accounts/accounts.css +++ b/js/src/views/Accounts/accounts.css @@ -2,7 +2,7 @@ } .accountTooltip { - top: 13em; + top: 12em; left: 5em; } @@ -12,5 +12,5 @@ .toolbarTooltip { right: 20px; - top: 4em; + top: 3.5em; } From c6119b81552b26b125adab92fbace57e6218af75 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 7 Sep 2016 10:59:44 +0200 Subject: [PATCH 0355/1062] address additions are now operational --- js/src/modals/AddAddress/addAddress.css | 10 + .../addEntry.js => AddAddress/addAddress.js} | 9 +- js/src/modals/AddAddress/index.js | 1 + js/src/modals/AddressBook/AddEntry/index.js | 1 - .../modals/AddressBook/EditEntry/editEntry.js | 108 ----------- js/src/modals/AddressBook/EditEntry/index.js | 1 - js/src/modals/AddressBook/addressBook.css | 43 ----- js/src/modals/AddressBook/addressBook.js | 181 ------------------ js/src/modals/AddressBook/index.js | 1 - js/src/modals/index.js | 2 + js/src/views/Accounts/accounts.js | 35 +--- js/src/views/Addresses/addresses.js | 54 +++++- 12 files changed, 72 insertions(+), 374 deletions(-) create mode 100644 js/src/modals/AddAddress/addAddress.css rename js/src/modals/{AddressBook/AddEntry/addEntry.js => AddAddress/addAddress.js} (92%) create mode 100644 js/src/modals/AddAddress/index.js delete mode 100644 js/src/modals/AddressBook/AddEntry/index.js delete mode 100644 js/src/modals/AddressBook/EditEntry/editEntry.js delete mode 100644 js/src/modals/AddressBook/EditEntry/index.js delete mode 100644 js/src/modals/AddressBook/addressBook.css delete mode 100644 js/src/modals/AddressBook/addressBook.js delete mode 100644 js/src/modals/AddressBook/index.js diff --git a/js/src/modals/AddAddress/addAddress.css b/js/src/modals/AddAddress/addAddress.css new file mode 100644 index 00000000000..c6a2425d791 --- /dev/null +++ b/js/src/modals/AddAddress/addAddress.css @@ -0,0 +1,10 @@ +.header { + margin: -24px -24px 1em -24px; + padding: 1em; + background: rgba(0, 0, 0, 0.175); +} + +.header h3 { + margin: 0; + text-transform: uppercase; +} diff --git a/js/src/modals/AddressBook/AddEntry/addEntry.js b/js/src/modals/AddAddress/addAddress.js similarity index 92% rename from js/src/modals/AddressBook/AddEntry/addEntry.js rename to js/src/modals/AddAddress/addAddress.js index 0d8df5e5226..7082415c04b 100644 --- a/js/src/modals/AddressBook/AddEntry/addEntry.js +++ b/js/src/modals/AddAddress/addAddress.js @@ -1,15 +1,14 @@ import React, { Component, PropTypes } from 'react'; - import { FlatButton } from 'material-ui'; import ContentAdd from 'material-ui/svg-icons/content/add'; import ContentClear from 'material-ui/svg-icons/content/clear'; -import { Modal, Form, Input, InputAddress } from '../../../ui'; -import { ERRORS, validateAddress, validateName } from '../../../util/validation'; +import { Modal, Form, Input, InputAddress } from '../../ui'; +import { ERRORS, validateAddress, validateName } from '../../util/validation'; -import styles from '../addressBook.css'; +import styles from './addAddress.css'; -export default class AddEntry extends Component { +export default class AddAddress extends Component { static contextTypes = { contacts: PropTypes.array.isRequired }; diff --git a/js/src/modals/AddAddress/index.js b/js/src/modals/AddAddress/index.js new file mode 100644 index 00000000000..1459ddc3dcc --- /dev/null +++ b/js/src/modals/AddAddress/index.js @@ -0,0 +1 @@ +export default from './addAddress'; diff --git a/js/src/modals/AddressBook/AddEntry/index.js b/js/src/modals/AddressBook/AddEntry/index.js deleted file mode 100644 index 04a85a2e690..00000000000 --- a/js/src/modals/AddressBook/AddEntry/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './addEntry'; diff --git a/js/src/modals/AddressBook/EditEntry/editEntry.js b/js/src/modals/AddressBook/EditEntry/editEntry.js deleted file mode 100644 index 58d2588b4a1..00000000000 --- a/js/src/modals/AddressBook/EditEntry/editEntry.js +++ /dev/null @@ -1,108 +0,0 @@ -import React, { Component, PropTypes } from 'react'; - -import { FlatButton } from 'material-ui'; -import ContentAdd from 'material-ui/svg-icons/content/add'; -import ContentClear from 'material-ui/svg-icons/content/clear'; - -import { Modal, Form, Input, InputAddress } from '../../../ui'; -import { validateName } from '../../../util/validation'; - -import styles from '../addressBook.css'; - -export default class EditEntry extends Component { - static propTypes = { - contact: PropTypes.object, - onClose: PropTypes.func - }; - - state = { - address: this.props.contact.address, - name: this.props.contact.name, - nameError: null, - description: this.props.contact.description - }; - - render () { - return ( - <Modal - visible - actions={ this.renderDialogActions() }> - <div className={ styles.header }> - <h3>edit contact</h3> - </div> - { this.renderFields() } - </Modal> - ); - } - - renderDialogActions () { - const { nameError } = this.state; - const hasErrors = !!(nameError); - - return ([ - <FlatButton - icon={ <ContentClear /> } - label='Cancel' - primary - onTouchTap={ this.onClose } />, - <FlatButton - disabled={ hasErrors } - icon={ <ContentAdd /> } - label='Save Entry' - primary - onTouchTap={ this.onSave } /> - ]); - } - - renderFields () { - const { name, nameError, description, address } = this.state; - - return ( - <Form> - <InputAddress - disabled - label='contact address' - hint='the network address for the contact' - value={ address } /> - <Input - label='contact name' - hint='a descriptive name for the contact' - error={ nameError } - value={ name } - onChange={ this.onEditName } /> - <Input - multiLine - rows={ 2 } - label='(optional) contact description' - hint='a expanded description for the contact' - value={ description } - onChange={ this.onEditDescription } /> - </Form> - ); - } - - onEditDescription = (event, description) => { - this.setState({ - description - }); - } - - onEditName = (event, _name) => { - const { name, nameError } = validateName(_name); - - this.setState({ - name, - nameError - }); - } - - onSave = () => { - const { address, name, description } = this.state; - - this.props.onClose(address, name, description); - } - - onClose = () => { - this.props.onClose(); - } -} diff --git a/js/src/modals/AddressBook/EditEntry/index.js b/js/src/modals/AddressBook/EditEntry/index.js deleted file mode 100644 index 05b98d7fc45..00000000000 --- a/js/src/modals/AddressBook/EditEntry/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './editEntry'; diff --git a/js/src/modals/AddressBook/addressBook.css b/js/src/modals/AddressBook/addressBook.css deleted file mode 100644 index 93825096bc2..00000000000 --- a/js/src/modals/AddressBook/addressBook.css +++ /dev/null @@ -1,43 +0,0 @@ -.account { - white-space: nowrap; - padding-bottom: 0.5em; - display: table; -} - -.account>div { - display: table-cell; - padding-right: 1em; - vertical-align: top; -} - -.address { - color: #aaa; -} - -.details { -} - -.editicon { - margin-left: 0.5em; -} - -.header { - margin: -24px -24px 1em -24px; - padding: 1em; - background: rgba(0, 0, 0, 0.175); -} - -.header h3 { - margin: 0; - text-transform: uppercase; -} - -.name { - color: rgb(0, 151, 167) !important; - text-transform: uppercase; - cursor: pointer; -} - -.noentries { - color: #aaa; -} diff --git a/js/src/modals/AddressBook/addressBook.js b/js/src/modals/AddressBook/addressBook.js deleted file mode 100644 index b7eeaad585b..00000000000 --- a/js/src/modals/AddressBook/addressBook.js +++ /dev/null @@ -1,181 +0,0 @@ -import React, { Component, PropTypes } from 'react'; - -import { FlatButton } from 'material-ui'; -import ContentAdd from 'material-ui/svg-icons/content/add'; -import ContentClear from 'material-ui/svg-icons/content/clear'; -import ContentCreate from 'material-ui/svg-icons/content/create'; - -import { IdentityIcon, Modal } from '../../ui'; - -import AddEntry from './AddEntry'; -import EditEntry from './EditEntry'; - -import styles from './addressBook.css'; - -const editIconStyle = { - color: 'rgb(0, 151, 167)', - width: '16px', - height: '16px' -}; - -export default class AddressBook extends Component { - static contextTypes = { - api: PropTypes.object.isRequired, - contacts: PropTypes.array.isRequired - }; - - static propTypes = { - onClose: PropTypes.func - }; - - state = { - showAdd: false, - showEdit: false, - editing: null - }; - - render () { - return ( - <Modal - scroll visible - actions={ this.renderDialogActions() }> - { this.renderModals() } - <div className={ styles.header }> - <h3>address book entries</h3> - </div> - { this.renderEntries() } - </Modal> - ); - } - - renderDialogActions () { - return ([ - <FlatButton - icon={ <ContentAdd /> } - label='Add Entry' - primary - onTouchTap={ this.onAdd } />, - <FlatButton - icon={ <ContentClear /> } - label='Close' - primary - onTouchTap={ this.onClose } /> - ]); - } - - renderEntries () { - const { contacts } = this.context; - - if (!contacts.length) { - return ( - <div className={ styles.noentries }> - There are currently no address book entries. - </div> - ); - } - - const list = contacts.map((contact) => { - return ( - <div - key={ contact.address } - className={ styles.account }> - <IdentityIcon - center inline - address={ contact.address } /> - <div className={ styles.details }> - <div - className={ styles.name } - onTouchTap={ this.wrapOnEdit(contact) }> - <span>{ contact.name || 'Unnamed' }</span> - <ContentCreate - style={ editIconStyle } - className={ styles.editicon } /> - </div> - <div className={ styles.address }> - { contact.address } - </div> - </div> - </div> - ); - }); - - return ( - <div> - { list } - </div> - ); - } - - renderModals () { - const { showAdd, showEdit, editing } = this.state; - - if (showAdd) { - return ( - <AddEntry - onClose={ this.onCloseAdd } /> - ); - } else if (showEdit) { - return ( - <EditEntry - contact={ editing } - onClose={ this.onCloseEdit } /> - ); - } - - return null; - } - - onAdd = () => { - this.setState({ - showAdd: true - }); - } - - updateDetails (address, name, description) { - const { api } = this.context; - - Promise.all([ - api.personal.setAccountName(address, name), - api.personal.setAccountMeta(address, { description }) - ]).catch((error) => { - console.error('updateDetails', error); - }); - } - - onCloseAdd = (address, name, description) => { - this.setState({ - showAdd: false - }); - - if (!address) { - return; - } - - this.updateDetails(address, name, description); - } - - onCloseEdit = (address, name, description) => { - this.setState({ - showEdit: false - }); - - if (!address) { - return; - } - - this.updateDetails(address, name, description); - } - - onClose = () => { - this.props.onClose(); - } - - wrapOnEdit (editing) { - return () => { - this.setState({ - editing, - showEdit: true - }); - }; - } -} diff --git a/js/src/modals/AddressBook/index.js b/js/src/modals/AddressBook/index.js deleted file mode 100644 index 34da71f72d9..00000000000 --- a/js/src/modals/AddressBook/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './addressBook'; diff --git a/js/src/modals/index.js b/js/src/modals/index.js index a111c4d505e..0a8f8db3e93 100644 --- a/js/src/modals/index.js +++ b/js/src/modals/index.js @@ -1,3 +1,4 @@ +import AddAddress from './AddAddress'; import AddressBook from './AddressBook'; import CreateAccount from './CreateAccount'; import FirstRun from './FirstRun'; @@ -5,6 +6,7 @@ import FundAccount from './FundAccount'; import Transfer from './Transfer'; export { + AddAddress, AddressBook, CreateAccount, FirstRun, diff --git a/js/src/views/Accounts/accounts.js b/js/src/views/Accounts/accounts.js index bceac459eba..26a7e181f71 100644 --- a/js/src/views/Accounts/accounts.js +++ b/js/src/views/Accounts/accounts.js @@ -1,10 +1,9 @@ import React, { Component, PropTypes } from 'react'; import { FlatButton } from 'material-ui'; -import CommunicationContacts from 'material-ui/svg-icons/communication/contacts'; import ContentAdd from 'material-ui/svg-icons/content/add'; import List from './List'; -import { AddressBook, CreateAccount } from '../../modals'; +import { CreateAccount } from '../../modals'; import { Actionbar, Tooltip } from '../../ui'; import styles from './accounts.css'; @@ -25,7 +24,6 @@ export default class Accounts extends Component { return ( <div className={ styles.accounts }> - { this.renderAddressBook() } { this.renderNewDialog() } { this.renderActionbar() } <List accounts={ accounts } /> @@ -43,13 +41,7 @@ export default class Accounts extends Component { icon={ <ContentAdd /> } label='new account' primary - onTouchTap={ this.onNewAccountClick } />, - <FlatButton - key='addressBook' - icon={ <CommunicationContacts /> } - label='address book' - primary - onTouchTap={ this.onAddressBookClick } /> + onTouchTap={ this.onNewAccountClick } /> ]; return ( @@ -79,35 +71,12 @@ export default class Accounts extends Component { ); } - renderAddressBook () { - const { addressBook } = this.state; - - if (!addressBook) { - return null; - } - - return ( - <AddressBook - onClose={ this.onAddressBookClose } /> - ); - } - - onAddressBookClick = () => { - this.setState({ - addressBook: !this.state.addressBook - }); - } - onNewAccountClick = () => { this.setState({ newDialog: !this.state.newDialog }); } - onAddressBookClose = () => { - this.onAddressBookClick(); - } - onNewAccountClose = () => { this.onNewAccountClick(); } diff --git a/js/src/views/Addresses/addresses.js b/js/src/views/Addresses/addresses.js index a2f74d6fecc..7fef1568ef7 100644 --- a/js/src/views/Addresses/addresses.js +++ b/js/src/views/Addresses/addresses.js @@ -1,6 +1,9 @@ import React, { Component, PropTypes } from 'react'; +import { FlatButton } from 'material-ui'; +import ContentAdd from 'material-ui/svg-icons/content/add'; import List from '../Accounts/List'; +import { AddAddress } from '../../modals'; import { Actionbar } from '../../ui'; import styles from './addresses.css'; @@ -11,12 +14,17 @@ export default class Addresses extends Component { contacts: PropTypes.array } + state = { + showAdd: false + } + render () { const { contacts } = this.context; return ( <div className={ styles.addresses }> { this.renderActionbar() } + { this.renderAddAddress() } <List contact accounts={ contacts } /> @@ -25,10 +33,54 @@ export default class Addresses extends Component { } renderActionbar () { + const buttons = [ + <FlatButton + key='newAddress' + icon={ <ContentAdd /> } + label='new address' + primary + onTouchTap={ this.onOpenAdd } /> + ]; + return ( <Actionbar className={ styles.toolbar } - title='Saved Addresses' /> + title='Saved Addresses' + buttons={ buttons } /> ); } + + renderAddAddress () { + const { showAdd } = this.state; + + if (!showAdd) { + return null; + } + + return ( + <AddAddress + onClose={ this.onCloseAdd } /> + ); + } + + onOpenAdd = () => { + this.setState({ + showAdd: true + }); + } + + onCloseAdd = (address, name, description) => { + const { api } = this.context; + + this.setState({ + showAdd: false + }); + + Promise.all([ + api.personal.setAccountName(address, name), + api.personal.setAccountMeta(address, { description }) + ]).catch((error) => { + console.error('updateDetails', error); + }); + } } From f041ebd4970840db195e48010c6085ef9fe98169 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 7 Sep 2016 11:10:41 +0200 Subject: [PATCH 0356/1062] adjust actionbar spacing & sizing --- js/src/ui/Actionbar/actionbar.css | 5 +++++ js/src/ui/Actionbar/actionbar.js | 3 ++- js/src/views/Accounts/accounts.css | 4 ++-- js/src/views/Signer/signer.js | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/js/src/ui/Actionbar/actionbar.css b/js/src/ui/Actionbar/actionbar.css index 7ecdc19cdf5..9916e3f2ce7 100644 --- a/js/src/ui/Actionbar/actionbar.css +++ b/js/src/ui/Actionbar/actionbar.css @@ -1,3 +1,8 @@ +.actionbar { + padding: 0.25em 24px !important; + height: auto !important; +} + .tooltitle { text-transform: uppercase; color: white; diff --git a/js/src/ui/Actionbar/actionbar.js b/js/src/ui/Actionbar/actionbar.js index 203096cd7fc..8ba8b551cd4 100644 --- a/js/src/ui/Actionbar/actionbar.js +++ b/js/src/ui/Actionbar/actionbar.js @@ -13,9 +13,10 @@ export default class Actionbar extends Component { render () { const { children, className } = this.props; + const classes = `${styles.actionbar} ${className}`; return ( - <Toolbar className={ className }> + <Toolbar className={ classes }> { this.renderTitle() } { this.renderButtons() } { children } diff --git a/js/src/views/Accounts/accounts.css b/js/src/views/Accounts/accounts.css index aedb9d8a608..d399bbb1b50 100644 --- a/js/src/views/Accounts/accounts.css +++ b/js/src/views/Accounts/accounts.css @@ -2,7 +2,7 @@ } .accountTooltip { - top: 12em; + top: 12.5em; left: 5em; } @@ -12,5 +12,5 @@ .toolbarTooltip { right: 20px; - top: 3.5em; + top: 3.75em; } diff --git a/js/src/views/Signer/signer.js b/js/src/views/Signer/signer.js index d0049d28682..aeada77f640 100644 --- a/js/src/views/Signer/signer.js +++ b/js/src/views/Signer/signer.js @@ -34,7 +34,7 @@ export class Signer extends Component { return ( <div className={ styles.signer }> <Actionbar - title='Parity Trusted Signer' /> + title='Trusted Signer' /> <div className={ styles.mainContainer }> { this.renderPage() } </div> From 679ff9b41ec703488ae84fbf6c284e5880604da7 Mon Sep 17 00:00:00 2001 From: Jannis R <mail@jannisr.de> Date: Wed, 7 Sep 2016 11:26:23 +0200 Subject: [PATCH 0357/1062] simplify action & reducers Thinking about my work from yesterday, I like the simpler approach to Redux more. Therefore, I removed `redux-actions`. --- js/src/dapps/registry/actions.js | 14 ++++++-------- js/src/dapps/registry/reducers.js | 29 +++++++++++++++-------------- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/js/src/dapps/registry/actions.js b/js/src/dapps/registry/actions.js index 8b5aa15c0f4..a764af4e8a4 100644 --- a/js/src/dapps/registry/actions.js +++ b/js/src/dapps/registry/actions.js @@ -1,10 +1,8 @@ -import { createAction } from 'redux-actions'; +export const fetchContract = () => ({ type: 'fetch contract' }); +export const setContract = (contract) => ({ type: 'set contract', contract }); -export const fetchContract = createAction('fetch contract'); -export const setContract = createAction('set contract', (c) => c); +export const fetchFee = () => ({ type: 'fetch fee' }); +export const setFee = (fee) => ({ type: 'set fee', fee }); -export const fetchFee = createAction('fetch fee'); -export const setFee = createAction('set fee', (f) => f); - -export const fetchOwner = createAction('fetch owner'); -export const setOwner = createAction('set owner', (f) => f); +export const fetchOwner = () => ({ type: 'fetch owner' }); +export const setOwner = (owner) => ({ type: 'set owner', owner }); diff --git a/js/src/dapps/registry/reducers.js b/js/src/dapps/registry/reducers.js index df0475a2c07..fef80313bdf 100644 --- a/js/src/dapps/registry/reducers.js +++ b/js/src/dapps/registry/reducers.js @@ -1,5 +1,3 @@ -import { handleActions } from 'redux-actions'; - import { setContract, fetchFee, setFee, @@ -37,18 +35,21 @@ const onFetchOwner = (state, action) => (dispatch) => () => console.error('could not fetch owner') ); -export default handleActions({ - - 'fetch contract': onFetchContract, - 'set contract': (state, action) => - ({ ...state, contract: action.payload }), +export default (state = initialState, action) => { + if (action.type === 'fetch contract') + return onFetchContract(state, action); + if (action.type === 'set contract') + return { ...state, contract: action.contract }; - 'fetch fee': onFetchFee, - 'set fee': (state, action) => - ({ ...state, fee: action.payload }), + if (action.type === 'fetch fee') + return onFetchFee(state, action); + if (action.type === 'set fee') + return { ...state, fee: action.fee }; - 'fetch owner': onFetchOwner, - 'set owner': (state, action) => - ({ ...state, owner: action.payload }) + if (action.type === 'fetch owner') + return onFetchOwner(state, action); + if (action.type === 'set owner') + return { ...state, owner: action.owner }; -}, initialState); + return state; +}; From a6ffdf3d7209e269eb8003c795f96dc67807b766 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 7 Sep 2016 12:01:03 +0200 Subject: [PATCH 0358/1062] fix addressbook modal issues --- js/src/modals/index.js | 2 -- js/src/views/ParityBar/parityBar.css | 6 +++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/js/src/modals/index.js b/js/src/modals/index.js index 0a8f8db3e93..6f9fd90db48 100644 --- a/js/src/modals/index.js +++ b/js/src/modals/index.js @@ -1,5 +1,4 @@ import AddAddress from './AddAddress'; -import AddressBook from './AddressBook'; import CreateAccount from './CreateAccount'; import FirstRun from './FirstRun'; import FundAccount from './FundAccount'; @@ -7,7 +6,6 @@ import Transfer from './Transfer'; export { AddAddress, - AddressBook, CreateAccount, FirstRun, FundAccount, diff --git a/js/src/views/ParityBar/parityBar.css b/js/src/views/ParityBar/parityBar.css index 985b26a2042..83d2564cb90 100644 --- a/js/src/views/ParityBar/parityBar.css +++ b/js/src/views/ParityBar/parityBar.css @@ -29,9 +29,9 @@ } .link img, .link svg { - height: 28px !important; - width: 28px !important; - margin-right: 0.5em; + height: 24px !important; + width: 24px !important; + margin: 2px 0.5em 0 0; } .link div { From 572634802eaf6db65d0e0d2340b339eeffa853b1 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 7 Sep 2016 12:53:19 +0200 Subject: [PATCH 0359/1062] signer show pending requests with a little label --- .../views/Application/Container/container.js | 5 -- js/src/views/Application/TabBar/tabBar.css | 15 +++++ js/src/views/Application/TabBar/tabBar.js | 37 ++++++++++-- js/src/views/Application/application.js | 24 +++++--- js/src/views/ParityBar/parityBar.css | 28 +++++++-- js/src/views/ParityBar/parityBar.js | 57 +++++++++++++++++-- 6 files changed, 139 insertions(+), 27 deletions(-) diff --git a/js/src/views/Application/Container/container.js b/js/src/views/Application/Container/container.js index 360f3e32f27..83fe34fb845 100644 --- a/js/src/views/Application/Container/container.js +++ b/js/src/views/Application/Container/container.js @@ -3,9 +3,6 @@ import React, { Component, PropTypes } from 'react'; import { FirstRun } from '../../../modals'; import { Errors, Tooltips } from '../../../ui'; -import Status from '../Status'; -import TabBar from '../TabBar'; - import styles from '../application.css'; export default class Container extends Component { @@ -25,9 +22,7 @@ export default class Container extends Component { onClose={ onCloseFirstRun } /> <Tooltips /> <Errors /> - <TabBar /> { children } - <Status /> </div> ); } diff --git a/js/src/views/Application/TabBar/tabBar.css b/js/src/views/Application/TabBar/tabBar.css index 217b6ed2fac..f5f4858aae6 100644 --- a/js/src/views/Application/TabBar/tabBar.css +++ b/js/src/views/Application/TabBar/tabBar.css @@ -19,6 +19,21 @@ top: 0; } +.label { + position: relative; +} + +.labelBubble { + border-radius: 50%; + padding: 3px 5px; + background: red; + color: white; + font-size: 0.7em; + position: absolute; + top: -10px; + right: -10px; +} + .logo { margin: 22px 3em 0 0; white-space: nowrap; diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index e5c310c2b13..710555331e3 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -23,10 +23,15 @@ export default class TabBar extends Component { router: PropTypes.object.isRequired } + static propTypes = { + pending: PropTypes.array + } + render () { const windowHash = (window.location.hash || '') .split('?')[0].split('/')[1]; const hash = TABMAP[windowHash] || windowHash; + console.log(hash); return ( <Toolbar @@ -45,7 +50,7 @@ export default class TabBar extends Component { data-route='/accounts' value='account' icon={ <ActionAccountBalanceWallet /> } - label='accounts' + label={ this.renderLabel('accounts') } onActive={ this.onActivate }> <Tooltip className={ styles.tabbarTooltip } @@ -56,27 +61,51 @@ export default class TabBar extends Component { data-route='/addresses' value='address' icon={ <CommunicationContacts /> } - label='address book' + label={ this.renderLabel('address book') } onActive={ this.onActivate } /> <Tab className={ hash === 'app' ? styles.tabactive : '' } data-route='/apps' value='app' icon={ <NavigationApps /> } - label='apps' + label={ this.renderLabel('apps') } onActive={ this.onActivate } /> <Tab className={ hash === 'signer' ? styles.tabactive : '' } data-route='/signer' value='signer' icon={ <ActionFingerprint /> } - label='signer' + label={ this.renderSignerLabel() } onActive={ this.onActivate } /> </Tabs> </Toolbar> ); } + renderLabel (name, bubble) { + return ( + <div className={ styles.label }> + { name } + { bubble } + </div> + ); + } + + renderSignerLabel () { + const { pending } = this.props; + let bubble = null; + + if (pending && pending.length) { + bubble = ( + <div className={ styles.labelBubble }> + { pending.length } + </div> + ); + } + + return this.renderLabel('signer', bubble); + } + onActivate = (tab) => { const { router } = this.context; diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index ab06c72f9fc..97572f04d88 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -9,7 +9,8 @@ import { eip20Abi, registryAbi, tokenRegAbi } from '../../util/abi'; import Container from './Container'; import DappContainer from './DappContainer'; import FrameError from './FrameError'; -import { updateStatus } from './Status'; +import Status, { updateStatus } from './Status'; +import TabBar from './TabBar'; import imagesEthereum32 from '../../images/contracts/ethereum-32.png'; import imagesEthereum56 from '../../images/contracts/ethereum-56.png'; @@ -51,7 +52,8 @@ class Application extends Component { children: PropTypes.node, netChain: PropTypes.string, isTest: PropTypes.bool, - onUpdateStatus: PropTypes.func + onUpdateStatus: PropTypes.func, + pending: PropTypes.array } state = { @@ -70,7 +72,7 @@ class Application extends Component { } render () { - const { children } = this.props; + const { children, pending } = this.props; const { showFirstRun } = this.state; const [root] = (window.location.hash || '').replace('#/', '').split('/'); @@ -80,16 +82,20 @@ class Application extends Component { ); } else if (root === 'app') { return ( - <DappContainer - children={ children } /> + <DappContainer> + { children } + </DappContainer> ); } return ( <Container - children={ children } showFirstRun={ showFirstRun } - onCloseFirstRun={ this.onCloseFirstRun } /> + onCloseFirstRun={ this.onCloseFirstRun }> + <TabBar pending={ pending } /> + { children } + <Status /> + </Container> ); } @@ -304,10 +310,12 @@ class Application extends Component { function mapStateToProps (state) { const { netChain, isTest } = state.status; + const { pending } = state.requests; return { netChain, - isTest + isTest, + pending }; } diff --git a/js/src/views/ParityBar/parityBar.css b/js/src/views/ParityBar/parityBar.css index 83d2564cb90..275f07584bb 100644 --- a/js/src/views/ParityBar/parityBar.css +++ b/js/src/views/ParityBar/parityBar.css @@ -34,17 +34,33 @@ margin: 2px 0.5em 0 0; } -.link div { +.link+.link { + margin-left: 1em; +} + +.button { +} + +.label { + position: relative; display: inline-block; + vertical-align: top; +} + +.labelText { text-transform: uppercase; line-height: 32px; vertical-align: top; letter-spacing: 0.2em; } -.link+.link { - margin-left: 1em; -} - -.button { +.labelBubble { + border-radius: 50%; + padding: 3px 5px; + background: red; + color: white; + font-size: 0.7em; + position: absolute; + top: -2px; + right: -10px; } diff --git a/js/src/views/ParityBar/parityBar.js b/js/src/views/ParityBar/parityBar.js index 8508cbf6965..96a60b4ff18 100644 --- a/js/src/views/ParityBar/parityBar.js +++ b/js/src/views/ParityBar/parityBar.js @@ -1,10 +1,16 @@ -import React, { Component } from 'react'; +import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; import ActionFingerprint from 'material-ui/svg-icons/action/fingerprint'; import imagesEthcoreBlock from '../../images/ethcore-block.png'; import styles from './parityBar.css'; -export default class ParityBar extends Component { +class ParityBar extends Component { + static propTypes = { + pending: PropTypes.array + } + render () { return ( <div className={ styles.bar }> @@ -13,16 +19,59 @@ export default class ParityBar extends Component { className={ styles.link } href='/#/apps'> <img src={ imagesEthcoreBlock } /> - <div>Parity</div> + { this.renderLabel('Parity') } </a> <a className={ styles.link } href='/#/signer'> <ActionFingerprint /> - <div>Signer</div> + { this.renderSignerLabel() } </a> </div> </div> ); } + + renderLabel (name, bubble) { + return ( + <div className={ styles.label }> + <div className={ styles.labelText }> + { name } + </div> + { bubble } + </div> + ); + } + + renderSignerLabel () { + const { pending } = this.props; + let bubble = null; + + if (pending && pending.length) { + bubble = ( + <div className={ styles.labelBubble }> + { pending.length } + </div> + ); + } + + return this.renderLabel('Signer', bubble); + } } + +function mapStateToProps (state) { + const { pending } = state.requests; + + return { + pending + }; +} + +function mapDispatchToProps (dispatch) { + return bindActionCreators({}, dispatch); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(ParityBar); From d83c472ed30e7323887920b365b225c13e3cd71c Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 7 Sep 2016 12:57:10 +0200 Subject: [PATCH 0360/1062] update address book add entry naming --- js/src/modals/AddAddress/addAddress.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/modals/AddAddress/addAddress.js b/js/src/modals/AddAddress/addAddress.js index 7082415c04b..eb015477ec6 100644 --- a/js/src/modals/AddAddress/addAddress.js +++ b/js/src/modals/AddAddress/addAddress.js @@ -31,7 +31,7 @@ export default class AddAddress extends Component { visible actions={ this.renderDialogActions() }> <div className={ styles.header }> - <h3>add contact</h3> + <h3>add saved address</h3> </div> { this.renderFields() } </Modal> From dadccc0533dc30562a7d73116ef59aa7a9606317 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 7 Sep 2016 13:13:16 +0200 Subject: [PATCH 0361/1062] remove debug logging --- js/src/views/Application/TabBar/tabBar.js | 1 - 1 file changed, 1 deletion(-) diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index 710555331e3..aba255c8746 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -31,7 +31,6 @@ export default class TabBar extends Component { const windowHash = (window.location.hash || '') .split('?')[0].split('/')[1]; const hash = TABMAP[windowHash] || windowHash; - console.log(hash); return ( <Toolbar From 9920fb1d2a0bbf9acebb4552d6e716eda6c45b28 Mon Sep 17 00:00:00 2001 From: Jannis R <mail@jannisr.de> Date: Wed, 7 Sep 2016 11:50:01 +0200 Subject: [PATCH 0362/1062] move fetch logic into actions Haven't read the `redux-thunk` docs properly tbh. It makes sense to put the async (impure) stuff into actions, as reducers are supposed to be pure. --- js/src/dapps/registry/actions.js | 41 ++++++++++++++++++++++++++++--- js/src/dapps/registry/reducers.js | 37 ---------------------------- 2 files changed, 38 insertions(+), 40 deletions(-) diff --git a/js/src/dapps/registry/actions.js b/js/src/dapps/registry/actions.js index a764af4e8a4..256f55b7d5e 100644 --- a/js/src/dapps/registry/actions.js +++ b/js/src/dapps/registry/actions.js @@ -1,8 +1,43 @@ -export const fetchContract = () => ({ type: 'fetch contract' }); +import registryAbi from './abi/registry.json'; +const { api } = window.parity; + export const setContract = (contract) => ({ type: 'set contract', contract }); -export const fetchFee = () => ({ type: 'fetch fee' }); +export const fetchContract = () => (dispatch) => + api.ethcore.registryAddress() + .then((address) => { + const contract = api.newContract(registryAbi, address); + dispatch(setContract(contract)); + dispatch(fetchFee()); + dispatch(fetchOwner()); + }) + .catch((err) => { + console.error('could not fetch contract'); + if (err) console.error(err.stack); + }); + export const setFee = (fee) => ({ type: 'set fee', fee }); -export const fetchOwner = () => ({ type: 'fetch owner' }); +const fetchFee = () => (dispatch, getState) => { + const { contract } = getState(); + if (!contract) return; + contract.instance.fee.call() + .then((fee) => dispatch(setFee(fee))) + .catch((err) => { + console.error('could not fetch fee'); + if (err) console.error(err.stack); + }); +}; + export const setOwner = (owner) => ({ type: 'set owner', owner }); + +export const fetchOwner = () => (dispatch, getState) => { + const { contract } = getState(); + if (!contract) return; + contract.instance.owner.call() + .then((owner) => dispatch(setOwner(owner))) + .catch((err) => { + console.error('could not fetch owner'); + if (err) console.error(err.stack); + }); +}; diff --git a/js/src/dapps/registry/reducers.js b/js/src/dapps/registry/reducers.js index fef80313bdf..4cca6379a93 100644 --- a/js/src/dapps/registry/reducers.js +++ b/js/src/dapps/registry/reducers.js @@ -1,53 +1,16 @@ -import { - setContract, - fetchFee, setFee, - fetchOwner, setOwner -} from './actions'; -import registryAbi from './abi/registry.json'; -const { api } = window.parity; - const initialState = { contract: null, fee: null, owner: null }; -const onFetchContract = (state, action) => (dispatch) => - api.ethcore.registryAddress().then( - (address) => { - const contract = api.newContract(registryAbi, address); - dispatch(setContract(contract)); - dispatch(fetchFee()); - dispatch(fetchOwner()); - }, - () => console.error('could not fetch contract') - ); - -const onFetchFee = (state, action) => (dispatch) => - state.contract.fee.call().then( - (fee) => dispatch(setFee(fee)), - () => console.error('could not fetch fee') - ); - -const onFetchOwner = (state, action) => (dispatch) => - state.contract.owner.call().then( - (owner) => dispatch(setOwner(owner)), - () => console.error('could not fetch owner') - ); - export default (state = initialState, action) => { - if (action.type === 'fetch contract') - return onFetchContract(state, action); if (action.type === 'set contract') return { ...state, contract: action.contract }; - if (action.type === 'fetch fee') - return onFetchFee(state, action); if (action.type === 'set fee') return { ...state, fee: action.fee }; - if (action.type === 'fetch owner') - return onFetchOwner(state, action); if (action.type === 'set owner') return { ...state, owner: action.owner }; From 3cc9854fd167b7dd3cdf1059f24028fab8c4d50b Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 7 Sep 2016 14:06:34 +0200 Subject: [PATCH 0363/1062] expande parity bar to access the signer --- js/src/views/ParityBar/parityBar.css | 32 ++++++- js/src/views/ParityBar/parityBar.js | 41 ++++++++- .../Signer/containers/Embedded/embedded.css | 13 +++ .../Signer/containers/Embedded/embedded.js | 90 +++++++++++++++++++ .../views/Signer/containers/Embedded/index.js | 1 + .../containers/RequestsPage/RequestsPage.js | 8 +- js/src/views/Signer/index.js | 6 ++ 7 files changed, 182 insertions(+), 9 deletions(-) create mode 100644 js/src/views/Signer/containers/Embedded/embedded.css create mode 100644 js/src/views/Signer/containers/Embedded/embedded.js create mode 100644 js/src/views/Signer/containers/Embedded/index.js diff --git a/js/src/views/ParityBar/parityBar.css b/js/src/views/ParityBar/parityBar.css index 275f07584bb..cde13586d0f 100644 --- a/js/src/views/ParityBar/parityBar.css +++ b/js/src/views/ParityBar/parityBar.css @@ -1,22 +1,35 @@ -.bar { +.bar, .expanded { position: fixed; bottom: 0; right: 0; font-size: 16px; font-family: 'Roboto', sans-serif; - vertical-align: middle; z-index: 10000; +} + +.bar { + vertical-align: middle; display: flex; flex-wrap: wrap; width: 100%; } +.expanded { + right: 16px; + width: 840px; + height: 250px; + border-radius: 4px 4px 0 0; + background: rgb(48, 48, 48); + padding: 1em; + overflow-y: scroll; +} + .corner { - background: rgba(0, 0, 0, 0.75); + background: rgb(48, 48, 48); position: absolute; bottom: 0; right: 16px; - border-radius: 4px 4px 0 0; + border-radius: 4px 0 0 0; padding: 0.5em 1em; } @@ -64,3 +77,14 @@ top: -2px; right: -10px; } + +.actions { + text-align: right; + padding-bottom: 1em; +} + +.actions div { + margin-left: 1em; + display: inline-block; + cursor: pointer; +} diff --git a/js/src/views/ParityBar/parityBar.js b/js/src/views/ParityBar/parityBar.js index 96a60b4ff18..83b963a2d20 100644 --- a/js/src/views/ParityBar/parityBar.js +++ b/js/src/views/ParityBar/parityBar.js @@ -1,7 +1,11 @@ import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; +import { FlatButton } from 'material-ui'; import ActionFingerprint from 'material-ui/svg-icons/action/fingerprint'; +import ContentClear from 'material-ui/svg-icons/content/clear'; + +import { Embedded as Signer } from '../Signer'; import imagesEthcoreBlock from '../../images/ethcore-block.png'; import styles from './parityBar.css'; @@ -11,7 +15,19 @@ class ParityBar extends Component { pending: PropTypes.array } + state = { + opened: false + } + render () { + const { opened } = this.state; + + return opened + ? this.renderExpanded() + : this.renderBar(); + } + + renderBar () { return ( <div className={ styles.bar }> <div className={ styles.corner }> @@ -23,7 +39,7 @@ class ParityBar extends Component { </a> <a className={ styles.link } - href='/#/signer'> + onTouchTap={ this.toggleDisplay }> <ActionFingerprint /> { this.renderSignerLabel() } </a> @@ -32,6 +48,21 @@ class ParityBar extends Component { ); } + renderExpanded () { + return ( + <div className={ styles.expanded }> + <div className={ styles.actions }> + <FlatButton + icon={ <ContentClear /> } + label='Close' + primary + onTouchTap={ this.toggleDisplay } /> + </div> + <Signer /> + </div> + ); + } + renderLabel (name, bubble) { return ( <div className={ styles.label }> @@ -57,6 +88,14 @@ class ParityBar extends Component { return this.renderLabel('Signer', bubble); } + + toggleDisplay = () => { + const { opened } = this.state; + + this.setState({ + opened: !opened + }); + } } function mapStateToProps (state) { diff --git a/js/src/views/Signer/containers/Embedded/embedded.css b/js/src/views/Signer/containers/Embedded/embedded.css new file mode 100644 index 00000000000..c32f0050918 --- /dev/null +++ b/js/src/views/Signer/containers/Embedded/embedded.css @@ -0,0 +1,13 @@ +.signer { +} + +.pending { +} + +.none { + color: #aaa; +} + +.info { + padding: 1em 0; +} diff --git a/js/src/views/Signer/containers/Embedded/embedded.js b/js/src/views/Signer/containers/Embedded/embedded.js new file mode 100644 index 00000000000..23f78b89bb7 --- /dev/null +++ b/js/src/views/Signer/containers/Embedded/embedded.js @@ -0,0 +1,90 @@ +import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; + +import { RequestPendingWeb3 } from '../../components'; +import * as RequestsActions from '../../actions/requests'; + +import styles from './embedded.js'; + +class Embedded extends Component { + static propTypes = { + requests: PropTypes.shape({ + pending: PropTypes.array.isRequired, + finished: PropTypes.array.isRequired + }).isRequired, + actions: PropTypes.shape({ + startConfirmRequest: PropTypes.func.isRequired, + startRejectRequest: PropTypes.func.isRequired + }).isRequired + }; + + render () { + return ( + <div className={ styles.signer }> + { this.renderPendingRequests() } + </div> + ); + } + + renderPendingRequests () { + const { requests } = this.props; + const { pending } = requests; + + if (!pending.length) { + return ( + <div className={ styles.none }> + There are currently no pending requests awaiting your confirmation + </div> + ); + } + + const items = pending.sort(this._sortRequests).map(this.renderPending); + + return ( + <div className={ styles.pending }> + <div className={ styles.info }> + There are currently { items.length } pending requests awaiting confirmation. Please accept/reject them below. + </div> + { items } + </div> + ); + } + + renderPending = (data) => { + const { actions } = this.props; + const { payload, id, isSending } = data; + + return ( + <RequestPendingWeb3 + className={ styles.request } + onConfirm={ actions.startConfirmRequest } + onReject={ actions.startRejectRequest } + isSending={ isSending || false } + key={ id } + id={ id } + payload={ payload } + /> + ); + } +} + +function mapStateToProps (state) { + const { actions, requests } = state; + + return { + actions, + requests + }; +} + +function mapDispatchToProps (dispatch) { + return { + actions: bindActionCreators(RequestsActions, dispatch) + }; +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(Embedded); diff --git a/js/src/views/Signer/containers/Embedded/index.js b/js/src/views/Signer/containers/Embedded/index.js new file mode 100644 index 00000000000..87ddbce7a56 --- /dev/null +++ b/js/src/views/Signer/containers/Embedded/index.js @@ -0,0 +1 @@ +export default from './embedded'; diff --git a/js/src/views/Signer/containers/RequestsPage/RequestsPage.js b/js/src/views/Signer/containers/RequestsPage/RequestsPage.js index 2cf83188c9a..e088344d4f9 100644 --- a/js/src/views/Signer/containers/RequestsPage/RequestsPage.js +++ b/js/src/views/Signer/containers/RequestsPage/RequestsPage.js @@ -48,7 +48,7 @@ class RequestsPage extends Component { return; } - const items = pending.sort(this._sortRequests).map(data => this.renderPending(data)); + const items = pending.sort(this._sortRequests).map(this.renderPending); return ( <Container> @@ -67,7 +67,7 @@ class RequestsPage extends Component { return; } - const items = finished.sort(this._sortRequests).map(data => this.renderFinished(data)); + const items = finished.sort(this._sortRequests).map(this.renderFinished); return ( <Container> @@ -79,7 +79,7 @@ class RequestsPage extends Component { ); } - renderPending (data) { + renderPending = (data) => { const { actions } = this.props; const { payload, id, isSending } = data; @@ -96,7 +96,7 @@ class RequestsPage extends Component { ); } - renderFinished (data) { + renderFinished = (data) => { const { payload, id, result, msg, status, error } = data; return ( diff --git a/js/src/views/Signer/index.js b/js/src/views/Signer/index.js index 49bc364c43d..5f3cc5b5ed3 100644 --- a/js/src/views/Signer/index.js +++ b/js/src/views/Signer/index.js @@ -1 +1,7 @@ +import Embedded from './containers/Embedded'; + export default from './signer'; + +export { + Embedded +}; From 467b071c537be82f5d22f0d3d2959dfb8df42028 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 7 Sep 2016 15:14:26 +0200 Subject: [PATCH 0364/1062] use buttons for the parity bar --- js/src/images/ethcore-block-blue.png | Bin 0 -> 4861 bytes js/src/views/ParityBar/parityBar.css | 13 ++++++---- js/src/views/ParityBar/parityBar.js | 34 +++++++++++++++++---------- 3 files changed, 30 insertions(+), 17 deletions(-) create mode 100644 js/src/images/ethcore-block-blue.png diff --git a/js/src/images/ethcore-block-blue.png b/js/src/images/ethcore-block-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..fd93635ecfec29e98f290b82dcea7d3176ca6ff3 GIT binary patch literal 4861 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 CeA1i% literal 0 HcmV?d00001 diff --git a/js/src/views/ParityBar/parityBar.css b/js/src/views/ParityBar/parityBar.css index cde13586d0f..bd56179b922 100644 --- a/js/src/views/ParityBar/parityBar.css +++ b/js/src/views/ParityBar/parityBar.css @@ -52,6 +52,7 @@ } .button { + overflow: visible !important; } .label { @@ -62,19 +63,18 @@ .labelText { text-transform: uppercase; - line-height: 32px; vertical-align: top; - letter-spacing: 0.2em; } .labelBubble { border-radius: 50%; - padding: 3px 5px; + padding: 5px; background: red; color: white; font-size: 0.7em; + line-height: 0.7em; position: absolute; - top: -2px; + top: 0px; right: -10px; } @@ -88,3 +88,8 @@ display: inline-block; cursor: pointer; } + +.parityIcon { + width: 24px; + height: 24px; +} diff --git a/js/src/views/ParityBar/parityBar.js b/js/src/views/ParityBar/parityBar.js index 83b963a2d20..d1d68cf707a 100644 --- a/js/src/views/ParityBar/parityBar.js +++ b/js/src/views/ParityBar/parityBar.js @@ -1,4 +1,5 @@ import React, { Component, PropTypes } from 'react'; +import { Link } from 'react-router'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import { FlatButton } from 'material-ui'; @@ -7,7 +8,7 @@ import ContentClear from 'material-ui/svg-icons/content/clear'; import { Embedded as Signer } from '../Signer'; -import imagesEthcoreBlock from '../../images/ethcore-block.png'; +import imagesEthcoreBlock from '../../images/ethcore-block-blue.png'; import styles from './parityBar.css'; class ParityBar extends Component { @@ -28,21 +29,28 @@ class ParityBar extends Component { } renderBar () { + const parityIcon = ( + <img + src={ imagesEthcoreBlock } + className={ styles.parityIcon } /> + ); + return ( <div className={ styles.bar }> <div className={ styles.corner }> - <a - className={ styles.link } - href='/#/apps'> - <img src={ imagesEthcoreBlock } /> - { this.renderLabel('Parity') } - </a> - <a - className={ styles.link } - onTouchTap={ this.toggleDisplay }> - <ActionFingerprint /> - { this.renderSignerLabel() } - </a> + <Link to='/apps'> + <FlatButton + className={ styles.button } + icon={ parityIcon } + label={ this.renderLabel('Parity') } + primary /> + </Link> + <FlatButton + className={ styles.button } + icon={ <ActionFingerprint /> } + label={ this.renderSignerLabel() } + primary + onTouchTap={ this.toggleDisplay } /> </div> </div> ); From 3390d838b1206970c9dd610dcb32dec989cff555 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 7 Sep 2016 15:47:51 +0200 Subject: [PATCH 0365/1062] add identity icon for the signer --- js/src/ui/IdentityIcon/identityIcon.js | 8 +++--- js/src/ui/SignerIcon/index.js | 1 + js/src/ui/SignerIcon/signerIcon.js | 31 ++++++++++++++++++++++ js/src/ui/index.js | 2 ++ js/src/views/Application/TabBar/tabBar.css | 6 +++++ js/src/views/Application/TabBar/tabBar.js | 5 ++-- js/src/views/ParityBar/parityBar.css | 4 ++- js/src/views/ParityBar/parityBar.js | 4 +-- 8 files changed, 51 insertions(+), 10 deletions(-) create mode 100644 js/src/ui/SignerIcon/index.js create mode 100644 js/src/ui/SignerIcon/signerIcon.js diff --git a/js/src/ui/IdentityIcon/identityIcon.js b/js/src/ui/IdentityIcon/identityIcon.js index 84c49c89e6c..e42091add49 100644 --- a/js/src/ui/IdentityIcon/identityIcon.js +++ b/js/src/ui/IdentityIcon/identityIcon.js @@ -10,6 +10,7 @@ export default class IdentityIcon extends Component { static propTypes = { address: PropTypes.string, + className: PropTypes.string, center: PropTypes.bool, padded: PropTypes.bool, inline: PropTypes.bool @@ -56,16 +57,15 @@ export default class IdentityIcon extends Component { } render () { - const { address, center, inline, padded } = this.props; + const { className, center, inline, padded } = this.props; const { iconsrc } = this.state; const size = inline ? '32px' : '56px'; - const className = `${styles.icon} ${center ? styles.center : styles.left} ${padded ? styles.padded : null} ${inline ? styles.inline : null}`; + const classes = `${styles.icon} ${center ? styles.center : styles.left} ${padded ? styles.padded : ''} ${inline ? styles.inline : ''} ${className}`; return ( <img - className={ className } + className={ classes } src={ iconsrc } - value={ address } width={ size } height={ size } /> ); diff --git a/js/src/ui/SignerIcon/index.js b/js/src/ui/SignerIcon/index.js new file mode 100644 index 00000000000..5af9c3ddcae --- /dev/null +++ b/js/src/ui/SignerIcon/index.js @@ -0,0 +1 @@ +export default from './signerIcon'; diff --git a/js/src/ui/SignerIcon/signerIcon.js b/js/src/ui/SignerIcon/signerIcon.js new file mode 100644 index 00000000000..4a7713ef7a4 --- /dev/null +++ b/js/src/ui/SignerIcon/signerIcon.js @@ -0,0 +1,31 @@ +import React, { Component, PropTypes } from 'react'; +import { keccak_256 } from 'js-sha3'; // eslint-disable-line camelcase +import ActionFingerprint from 'material-ui/svg-icons/action/fingerprint'; + +import IdentityIcon from '../IdentityIcon'; + +export default class SignerIcon extends Component { + static propTypes = { + className: PropTypes.string + } + + render () { + const { className } = this.props; + const signerToken = window.localStorage.getItem('sysuiToken'); + + if (!signerToken) { + return ( + <ActionFingerprint /> + ); + } + + const signerSha = keccak_256(signerToken); + + return ( + <IdentityIcon + center + className={ className } + address={ signerSha } /> + ); + } +} diff --git a/js/src/ui/index.js b/js/src/ui/index.js index d71e2ed13af..bb4605ce612 100644 --- a/js/src/ui/index.js +++ b/js/src/ui/index.js @@ -6,6 +6,7 @@ import Form, { FormWrap, Input, InputAddress, InputAddressSelect, InputInline, S import IdentityIcon from './IdentityIcon'; import Modal from './Modal'; import muiTheme from './Theme'; +import SignerIcon from './signerIcon'; import Tooltips, { Tooltip } from './Tooltips'; export { @@ -24,6 +25,7 @@ export { IdentityIcon, Modal, muiTheme, + SignerIcon, Tooltip, Tooltips }; diff --git a/js/src/views/Application/TabBar/tabBar.css b/js/src/views/Application/TabBar/tabBar.css index f5f4858aae6..94dced26b95 100644 --- a/js/src/views/Application/TabBar/tabBar.css +++ b/js/src/views/Application/TabBar/tabBar.css @@ -52,3 +52,9 @@ vertical-align: top; letter-spacing: 0.2em; } + +.signerIcon { + width: 24px; + height: 24px; + margin-bottom: 5px; +} diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index aba255c8746..419324e4272 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -2,11 +2,10 @@ import React, { Component, PropTypes } from 'react'; import { Toolbar, ToolbarGroup } from 'material-ui/Toolbar'; import { Tabs, Tab } from 'material-ui/Tabs'; import ActionAccountBalanceWallet from 'material-ui/svg-icons/action/account-balance-wallet'; -import ActionFingerprint from 'material-ui/svg-icons/action/fingerprint'; import CommunicationContacts from 'material-ui/svg-icons/communication/contacts'; import NavigationApps from 'material-ui/svg-icons/navigation/apps'; -import { Tooltip } from '../../../ui'; +import { SignerIcon, Tooltip } from '../../../ui'; import styles from './tabBar.css'; import imagesEthcoreBlock from '../../../images/ethcore-block.png'; @@ -73,7 +72,7 @@ export default class TabBar extends Component { className={ hash === 'signer' ? styles.tabactive : '' } data-route='/signer' value='signer' - icon={ <ActionFingerprint /> } + icon={ <SignerIcon className={ styles.signerIcon } /> } label={ this.renderSignerLabel() } onActive={ this.onActivate } /> </Tabs> diff --git a/js/src/views/ParityBar/parityBar.css b/js/src/views/ParityBar/parityBar.css index bd56179b922..7ccf8dcb3a9 100644 --- a/js/src/views/ParityBar/parityBar.css +++ b/js/src/views/ParityBar/parityBar.css @@ -89,7 +89,9 @@ cursor: pointer; } -.parityIcon { +.parityIcon, .signerIcon { width: 24px; height: 24px; + vertical-align: middle; + margin-left: 12px; } diff --git a/js/src/views/ParityBar/parityBar.js b/js/src/views/ParityBar/parityBar.js index d1d68cf707a..3b595aad2d7 100644 --- a/js/src/views/ParityBar/parityBar.js +++ b/js/src/views/ParityBar/parityBar.js @@ -3,9 +3,9 @@ import { Link } from 'react-router'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import { FlatButton } from 'material-ui'; -import ActionFingerprint from 'material-ui/svg-icons/action/fingerprint'; import ContentClear from 'material-ui/svg-icons/content/clear'; +import { SignerIcon } from '../../ui'; import { Embedded as Signer } from '../Signer'; import imagesEthcoreBlock from '../../images/ethcore-block-blue.png'; @@ -47,7 +47,7 @@ class ParityBar extends Component { </Link> <FlatButton className={ styles.button } - icon={ <ActionFingerprint /> } + icon={ <SignerIcon className={ styles.signerIcon } /> } label={ this.renderSignerLabel() } primary onTouchTap={ this.toggleDisplay } /> From ba378f8d308badce65f2b4af1aad8a586ee4af9a Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 7 Sep 2016 16:11:23 +0200 Subject: [PATCH 0366/1062] add signer icon on all confirm transaction buttons --- js/src/views/ParityBar/parityBar.css | 2 +- .../components/TransactionFinished/TransactionFinished.css | 2 +- .../TransactionPendingForm/TransactionPendingForm.css | 2 +- .../TransactionPendingForm/TransactionPendingForm.js | 2 +- .../TransactionPendingFormConfirm.css | 7 +++++++ .../TransactionPendingFormConfirm.js | 3 ++- 6 files changed, 13 insertions(+), 5 deletions(-) diff --git a/js/src/views/ParityBar/parityBar.css b/js/src/views/ParityBar/parityBar.css index 7ccf8dcb3a9..22b82e579bc 100644 --- a/js/src/views/ParityBar/parityBar.css +++ b/js/src/views/ParityBar/parityBar.css @@ -16,7 +16,7 @@ .expanded { right: 16px; - width: 840px; + width: 860px; height: 250px; border-radius: 4px 4px 0 0; background: rgb(48, 48, 48); diff --git a/js/src/views/Signer/components/TransactionFinished/TransactionFinished.css b/js/src/views/Signer/components/TransactionFinished/TransactionFinished.css index 2d92777b9fe..fa8360999b5 100644 --- a/js/src/views/Signer/components/TransactionFinished/TransactionFinished.css +++ b/js/src/views/Signer/components/TransactionFinished/TransactionFinished.css @@ -12,7 +12,7 @@ } .statusContainer { - width: 200px; + width: 220px; padding: 20px 40px 0 40px; /*border-left: 1px solid #aaa;*/ position: absolute; diff --git a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.css b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.css index 391d427a588..2ca6f1abe97 100644 --- a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.css +++ b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.css @@ -1,5 +1,5 @@ .container { - width: 200px; + width: 220px; padding: 20px 40px 0 40px; /*border-left: 1px solid #aaa;*/ position: absolute; diff --git a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.js b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.js index ebe68ea0ed0..49c42380e88 100644 --- a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.js +++ b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.js @@ -48,7 +48,7 @@ export default class TransactionPendingForm extends Component { let html; if (!isRejectOpen) { - html = <span>reject</span>; + html = <span>reject transaction</span>; } else { html = <span><BackIcon />I've changed my mind</span>; } diff --git a/js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css b/js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css index 84a2688afa3..39e618a8140 100644 --- a/js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css +++ b/js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css @@ -6,3 +6,10 @@ display: block !important; margin-bottom: 10px; } + +.signerIcon { + width: 24px; + height: 24px; + vertical-align: middle; + margin-left: 12px; +} diff --git a/js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js b/js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js index d7bc2e0055a..e00bbbcedcb 100644 --- a/js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js +++ b/js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js @@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'; import RaisedButton from 'material-ui/RaisedButton'; import ReactTooltip from 'react-tooltip'; -import { Input } from '../../../../ui'; +import { Input, SignerIcon } from '../../../../ui'; import styles from './TransactionPendingFormConfirm.css'; @@ -44,6 +44,7 @@ export default class TransactionPendingFormConfirm extends Component { fullWidth primary disabled={ isSending } + icon={ <SignerIcon className={ styles.signerIcon } /> } label={ isSending ? 'Confirming...' : 'Confirm Transaction' } /> </div> From 713c292f5f04dda488f316d503d5326b9f60472c Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 7 Sep 2016 16:29:25 +0200 Subject: [PATCH 0367/1062] border-radius on all visible sides --- js/src/views/ParityBar/parityBar.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/views/ParityBar/parityBar.css b/js/src/views/ParityBar/parityBar.css index 22b82e579bc..5663e168658 100644 --- a/js/src/views/ParityBar/parityBar.css +++ b/js/src/views/ParityBar/parityBar.css @@ -29,7 +29,7 @@ position: absolute; bottom: 0; right: 16px; - border-radius: 4px 0 0 0; + border-radius: 4px 4px 0 0; padding: 0.5em 1em; } From 792e1994f9a53112905a6453997855626a78a25a Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 7 Sep 2016 17:48:12 +0200 Subject: [PATCH 0368/1062] build with NODE_ENV=production --- js/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/package.json b/js/package.json index c4844182b54..d008f52f0bc 100644 --- a/js/package.json +++ b/js/package.json @@ -24,7 +24,7 @@ ], "scripts": { "build": "npm run buildApp", - "buildApp": "webpack", + "buildApp": "NODE_ENV=production webpack", "buildLibrary": "rollup --config ./rollup.library.js", "clean": "rm -rf ./build", "coveralls": "npm run testCoverage && coveralls < coverage/lcov.info", From f5c40c87a409430fec2cf54bc684ccf362379e09 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 7 Sep 2016 20:45:42 +0200 Subject: [PATCH 0369/1062] start of Status import... lots & lots & lots of work left --- js/package.json | 6 +- js/src/environment/empty.js | 0 js/src/environment/index.js | 4 + .../integration-tests/fake-backend.js | 68 ++ js/src/environment/integration-tests/index.js | 1 + js/src/environment/perf-debug/index.js | 1 + js/src/environment/perf-debug/why-update.js | 4 + js/src/environment/tests/index.js | 1 + js/src/environment/tests/test-utils.js | 30 + js/src/index.js | 26 +- .../Account/Transactions/transactions.js | 2 +- js/src/views/Application/Status/actions.js | 4 +- js/src/views/Application/Status/index.js | 8 +- js/src/views/Application/Status/reducers.js | 6 +- js/src/views/Application/Status/status.js | 2 +- js/src/views/Application/TabBar/tabBar.js | 8 + js/src/views/Application/application.js | 14 +- js/src/views/ParityBar/parityBar.js | 2 +- .../containers/RequestsPage/RequestsPage.js | 8 +- js/src/views/Signer/middlewares/toastr.js | 4 +- js/src/views/Signer/middlewares/ws.js | 4 +- .../views/Signer/providers/wsDataProvider.js | 6 +- js/src/views/Signer/reducers/toastr.js | 2 - js/src/views/Signer/signer.js | 7 +- js/src/views/Status/actions/app.js | 4 + js/src/views/Status/actions/clipboard.js | 6 + js/src/views/Status/actions/debug.js | 8 + js/src/views/Status/actions/localstorage.js | 5 + js/src/views/Status/actions/logger.js | 8 + js/src/views/Status/actions/mining.js | 9 + js/src/views/Status/actions/modify-mining.js | 8 + js/src/views/Status/actions/rpc.js | 12 + js/src/views/Status/actions/status.js | 14 + js/src/views/Status/actions/toastr.js | 5 + .../Animated/AnimateChildren.css | 39 + .../Animated/Animated.js | 13 + .../Animated/children.js | 48 + .../components-compositors/Animated/index.js | 1 + .../components/AutoComplete/AutoComplete.js | 28 + .../AutoComplete/AutoComplete.spec.js | 28 + .../Status/components/AutoComplete/index.js | 1 + js/src/views/Status/components/Box/Box.js | 32 + .../views/Status/components/Box/Box.spec.js | 54 + js/src/views/Status/components/Box/index.js | 1 + js/src/views/Status/components/Call/Call.css | 24 + js/src/views/Status/components/Call/Call.js | 53 + .../views/Status/components/Call/Call.spec.js | 76 ++ js/src/views/Status/components/Call/index.js | 1 + .../views/Status/components/Calls/Calls.css | 28 + js/src/views/Status/components/Calls/Calls.js | 116 ++ .../Status/components/Calls/Calls.spec.js | 119 ++ js/src/views/Status/components/Calls/index.js | 1 + .../components/CallsToolbar/CallsToolbar.css | 51 + .../components/CallsToolbar/CallsToolbar.js | 116 ++ .../CallsToolbar/CallsToolbar.spec.js | 102 ++ .../Status/components/CallsToolbar/index.js | 1 + .../views/Status/components/Debug/Debug.css | 56 + js/src/views/Status/components/Debug/Debug.js | 63 + js/src/views/Status/components/Debug/index.js | 1 + .../EditableValue/EditableValue.css | 58 + .../components/EditableValue/EditableValue.js | 177 +++ .../Status/components/EditableValue/index.js | 1 + .../views/Status/components/Footer/Footer.css | 32 + .../views/Status/components/Footer/Footer.js | 48 + .../views/Status/components/Footer/index.js | 1 + .../views/Status/components/Header/Header.css | 23 + .../views/Status/components/Header/Header.js | 76 ++ .../views/Status/components/Header/index.js | 1 + .../components/JsonEditor/JsonEditor.css | 12 + .../components/JsonEditor/JsonEditor.js | 83 ++ .../Status/components/JsonEditor/index.js | 1 + .../Status/components/Markdown/Markdown.css | 4 + .../Status/components/Markdown/Markdown.js | 43 + .../views/Status/components/Markdown/index.js | 1 + .../MiningSettings/MiningSettings.js | 87 ++ .../MiningSettings/decodeExtraData.js | 17 + .../MiningSettings/decodeExtraData.spec.js | 12 + .../Status/components/MiningSettings/index.js | 1 + .../MiningSettings/numberFromString.js | 9 + .../MiningSettings/numberFromString.spec.js | 20 + .../MuiThemeProvider/MuiThemeProvider.js | 36 + .../components/MuiThemeProvider/index.js | 1 + .../Status/components/Response/Response.css | 4 + .../Status/components/Response/Response.js | 50 + .../components/Response/Response.spec.js | 31 + .../views/Status/components/Response/index.js | 1 + .../Status/components/RpcCalls/RpcCalls.css | 17 + .../Status/components/RpcCalls/RpcCalls.js | 322 +++++ .../views/Status/components/RpcCalls/index.js | 1 + .../Status/components/RpcDocs/RpcDocs.css | 19 + .../Status/components/RpcDocs/RpcDocs.js | 89 ++ .../views/Status/components/RpcDocs/index.js | 1 + .../views/Status/components/RpcNav/RpcNav.css | 12 + .../views/Status/components/RpcNav/RpcNav.js | 20 + .../views/Status/components/RpcNav/index.js | 1 + .../ScrollTopButton/ScrollTopButton.css | 26 + .../ScrollTopButton/ScrollTopButton.js | 56 + .../components/ScrollTopButton/index.js | 1 + .../Status/components/ScrollTopButton/util.js | 32 + .../views/Status/components/Status/Status.css | 10 + .../views/Status/components/Status/Status.js | 131 ++ .../views/Status/components/Status/index.js | 1 + .../ToastrContainer/ToastrContainer.css | 45 + .../ToastrContainer/ToastrContainer.js | 46 + .../components/ToastrContainer/index.js | 1 + .../views/Status/components/Value/Value.css | 10 + js/src/views/Status/components/Value/Value.js | 30 + js/src/views/Status/components/Value/index.js | 1 + js/src/views/Status/constants/index.js | 2 + .../containers/AccountsPage/AccountsPage.js | 35 + .../Status/containers/AccountsPage/index.js | 1 + .../Status/containers/Container/Container.js | 66 + .../Status/containers/Container/index.js | 1 + .../Status/containers/DebugPage/DebugPage.js | 37 + .../Status/containers/DebugPage/index.js | 1 + .../Status/containers/RpcPage/RpcPage.js | 43 + .../views/Status/containers/RpcPage/index.js | 1 + .../containers/StatusPage/StatusPage.js | 36 + .../Status/containers/StatusPage/index.js | 1 + .../Status/dapp-styles/hex-grid-tile.png | Bin 0 -> 13471 bytes js/src/views/Status/data/rpc.json | 1075 +++++++++++++++++ js/src/views/Status/icon.png | Bin 0 -> 7414 bytes js/src/views/Status/index.css | 19 + js/src/views/Status/index.html | 12 + js/src/views/Status/index.js | 42 + js/src/views/Status/middleware/index.js | 1 + .../views/Status/middleware/localstorage.js | 59 + .../Status/middleware/localstorage.spec.js | 180 +++ js/src/views/Status/middleware/logger.js | 18 + js/src/views/Status/middleware/logger.spec.js | 52 + js/src/views/Status/middleware/middleware.js | 27 + js/src/views/Status/middleware/rpc.js | 71 ++ js/src/views/Status/middleware/rpc.spec.js | 79 ++ js/src/views/Status/middleware/toastr.js | 53 + js/src/views/Status/middleware/toastr.spec.js | 174 +++ .../middleware/user-web3-interactions.js | 34 + .../middleware/user-web3-interactions.spec.js | 63 + js/src/views/Status/provider/rpc-provider.js | 63 + .../Status/provider/rpc-provider.spec.js | 90 ++ js/src/views/Status/provider/web3-base.js | 9 + .../Status/provider/web3-ethcore-provider.js | 101 ++ js/src/views/Status/provider/web3-provider.js | 143 +++ .../Status/provider/web3-provider.spec.js | 83 ++ js/src/views/Status/reducers/debug.js | 51 + js/src/views/Status/reducers/index.js | 17 + js/src/views/Status/reducers/logger.js | 16 + js/src/views/Status/reducers/mining.js | 51 + js/src/views/Status/reducers/rpc.js | 49 + js/src/views/Status/reducers/settings.js | 45 + js/src/views/Status/reducers/status.js | 77 ++ js/src/views/Status/reducers/toastr.js | 23 + js/src/views/Status/routes.js | 45 + js/src/views/Status/store/index.js | 1 + js/src/views/Status/store/store.js | 24 + js/src/views/Status/util/error.js | 15 + js/src/views/Status/util/error.spec.js | 93 ++ js/src/views/Status/util/index.js | 23 + js/src/views/Status/util/index.spec.js | 35 + js/src/views/Status/util/react.js | 6 + js/src/views/Status/util/rpc-md.js | 12 + js/src/views/Status/util/toastr.js | 11 + js/src/views/Status/util/toastr.spec.js | 38 + 162 files changed, 6314 insertions(+), 42 deletions(-) create mode 100644 js/src/environment/empty.js create mode 100644 js/src/environment/index.js create mode 100644 js/src/environment/integration-tests/fake-backend.js create mode 100644 js/src/environment/integration-tests/index.js create mode 100644 js/src/environment/perf-debug/index.js create mode 100644 js/src/environment/perf-debug/why-update.js create mode 100644 js/src/environment/tests/index.js create mode 100644 js/src/environment/tests/test-utils.js create mode 100644 js/src/views/Status/actions/app.js create mode 100644 js/src/views/Status/actions/clipboard.js create mode 100644 js/src/views/Status/actions/debug.js create mode 100644 js/src/views/Status/actions/localstorage.js create mode 100644 js/src/views/Status/actions/logger.js create mode 100644 js/src/views/Status/actions/mining.js create mode 100644 js/src/views/Status/actions/modify-mining.js create mode 100644 js/src/views/Status/actions/rpc.js create mode 100644 js/src/views/Status/actions/status.js create mode 100644 js/src/views/Status/actions/toastr.js create mode 100644 js/src/views/Status/components-compositors/Animated/AnimateChildren.css create mode 100644 js/src/views/Status/components-compositors/Animated/Animated.js create mode 100644 js/src/views/Status/components-compositors/Animated/children.js create mode 100644 js/src/views/Status/components-compositors/Animated/index.js create mode 100644 js/src/views/Status/components/AutoComplete/AutoComplete.js create mode 100644 js/src/views/Status/components/AutoComplete/AutoComplete.spec.js create mode 100644 js/src/views/Status/components/AutoComplete/index.js create mode 100644 js/src/views/Status/components/Box/Box.js create mode 100644 js/src/views/Status/components/Box/Box.spec.js create mode 100644 js/src/views/Status/components/Box/index.js create mode 100644 js/src/views/Status/components/Call/Call.css create mode 100644 js/src/views/Status/components/Call/Call.js create mode 100644 js/src/views/Status/components/Call/Call.spec.js create mode 100644 js/src/views/Status/components/Call/index.js create mode 100644 js/src/views/Status/components/Calls/Calls.css create mode 100644 js/src/views/Status/components/Calls/Calls.js create mode 100644 js/src/views/Status/components/Calls/Calls.spec.js create mode 100644 js/src/views/Status/components/Calls/index.js create mode 100644 js/src/views/Status/components/CallsToolbar/CallsToolbar.css create mode 100644 js/src/views/Status/components/CallsToolbar/CallsToolbar.js create mode 100644 js/src/views/Status/components/CallsToolbar/CallsToolbar.spec.js create mode 100644 js/src/views/Status/components/CallsToolbar/index.js create mode 100644 js/src/views/Status/components/Debug/Debug.css create mode 100644 js/src/views/Status/components/Debug/Debug.js create mode 100644 js/src/views/Status/components/Debug/index.js create mode 100644 js/src/views/Status/components/EditableValue/EditableValue.css create mode 100644 js/src/views/Status/components/EditableValue/EditableValue.js create mode 100644 js/src/views/Status/components/EditableValue/index.js create mode 100644 js/src/views/Status/components/Footer/Footer.css create mode 100644 js/src/views/Status/components/Footer/Footer.js create mode 100644 js/src/views/Status/components/Footer/index.js create mode 100644 js/src/views/Status/components/Header/Header.css create mode 100644 js/src/views/Status/components/Header/Header.js create mode 100644 js/src/views/Status/components/Header/index.js create mode 100644 js/src/views/Status/components/JsonEditor/JsonEditor.css create mode 100644 js/src/views/Status/components/JsonEditor/JsonEditor.js create mode 100644 js/src/views/Status/components/JsonEditor/index.js create mode 100644 js/src/views/Status/components/Markdown/Markdown.css create mode 100644 js/src/views/Status/components/Markdown/Markdown.js create mode 100644 js/src/views/Status/components/Markdown/index.js create mode 100644 js/src/views/Status/components/MiningSettings/MiningSettings.js create mode 100644 js/src/views/Status/components/MiningSettings/decodeExtraData.js create mode 100644 js/src/views/Status/components/MiningSettings/decodeExtraData.spec.js create mode 100644 js/src/views/Status/components/MiningSettings/index.js create mode 100644 js/src/views/Status/components/MiningSettings/numberFromString.js create mode 100644 js/src/views/Status/components/MiningSettings/numberFromString.spec.js create mode 100644 js/src/views/Status/components/MuiThemeProvider/MuiThemeProvider.js create mode 100644 js/src/views/Status/components/MuiThemeProvider/index.js create mode 100644 js/src/views/Status/components/Response/Response.css create mode 100644 js/src/views/Status/components/Response/Response.js create mode 100644 js/src/views/Status/components/Response/Response.spec.js create mode 100644 js/src/views/Status/components/Response/index.js create mode 100644 js/src/views/Status/components/RpcCalls/RpcCalls.css create mode 100644 js/src/views/Status/components/RpcCalls/RpcCalls.js create mode 100644 js/src/views/Status/components/RpcCalls/index.js create mode 100644 js/src/views/Status/components/RpcDocs/RpcDocs.css create mode 100644 js/src/views/Status/components/RpcDocs/RpcDocs.js create mode 100644 js/src/views/Status/components/RpcDocs/index.js create mode 100644 js/src/views/Status/components/RpcNav/RpcNav.css create mode 100644 js/src/views/Status/components/RpcNav/RpcNav.js create mode 100644 js/src/views/Status/components/RpcNav/index.js create mode 100644 js/src/views/Status/components/ScrollTopButton/ScrollTopButton.css create mode 100644 js/src/views/Status/components/ScrollTopButton/ScrollTopButton.js create mode 100644 js/src/views/Status/components/ScrollTopButton/index.js create mode 100644 js/src/views/Status/components/ScrollTopButton/util.js create mode 100644 js/src/views/Status/components/Status/Status.css create mode 100644 js/src/views/Status/components/Status/Status.js create mode 100644 js/src/views/Status/components/Status/index.js create mode 100644 js/src/views/Status/components/ToastrContainer/ToastrContainer.css create mode 100644 js/src/views/Status/components/ToastrContainer/ToastrContainer.js create mode 100644 js/src/views/Status/components/ToastrContainer/index.js create mode 100644 js/src/views/Status/components/Value/Value.css create mode 100644 js/src/views/Status/components/Value/Value.js create mode 100644 js/src/views/Status/components/Value/index.js create mode 100644 js/src/views/Status/constants/index.js create mode 100644 js/src/views/Status/containers/AccountsPage/AccountsPage.js create mode 100644 js/src/views/Status/containers/AccountsPage/index.js create mode 100644 js/src/views/Status/containers/Container/Container.js create mode 100644 js/src/views/Status/containers/Container/index.js create mode 100644 js/src/views/Status/containers/DebugPage/DebugPage.js create mode 100644 js/src/views/Status/containers/DebugPage/index.js create mode 100644 js/src/views/Status/containers/RpcPage/RpcPage.js create mode 100644 js/src/views/Status/containers/RpcPage/index.js create mode 100644 js/src/views/Status/containers/StatusPage/StatusPage.js create mode 100644 js/src/views/Status/containers/StatusPage/index.js create mode 100644 js/src/views/Status/dapp-styles/hex-grid-tile.png create mode 100644 js/src/views/Status/data/rpc.json create mode 100644 js/src/views/Status/icon.png create mode 100644 js/src/views/Status/index.css create mode 100644 js/src/views/Status/index.html create mode 100644 js/src/views/Status/index.js create mode 100644 js/src/views/Status/middleware/index.js create mode 100644 js/src/views/Status/middleware/localstorage.js create mode 100644 js/src/views/Status/middleware/localstorage.spec.js create mode 100644 js/src/views/Status/middleware/logger.js create mode 100644 js/src/views/Status/middleware/logger.spec.js create mode 100644 js/src/views/Status/middleware/middleware.js create mode 100644 js/src/views/Status/middleware/rpc.js create mode 100644 js/src/views/Status/middleware/rpc.spec.js create mode 100644 js/src/views/Status/middleware/toastr.js create mode 100644 js/src/views/Status/middleware/toastr.spec.js create mode 100644 js/src/views/Status/middleware/user-web3-interactions.js create mode 100644 js/src/views/Status/middleware/user-web3-interactions.spec.js create mode 100644 js/src/views/Status/provider/rpc-provider.js create mode 100644 js/src/views/Status/provider/rpc-provider.spec.js create mode 100644 js/src/views/Status/provider/web3-base.js create mode 100644 js/src/views/Status/provider/web3-ethcore-provider.js create mode 100644 js/src/views/Status/provider/web3-provider.js create mode 100644 js/src/views/Status/provider/web3-provider.spec.js create mode 100644 js/src/views/Status/reducers/debug.js create mode 100644 js/src/views/Status/reducers/index.js create mode 100644 js/src/views/Status/reducers/logger.js create mode 100644 js/src/views/Status/reducers/mining.js create mode 100644 js/src/views/Status/reducers/rpc.js create mode 100644 js/src/views/Status/reducers/settings.js create mode 100644 js/src/views/Status/reducers/status.js create mode 100644 js/src/views/Status/reducers/toastr.js create mode 100644 js/src/views/Status/routes.js create mode 100644 js/src/views/Status/store/index.js create mode 100644 js/src/views/Status/store/store.js create mode 100644 js/src/views/Status/util/error.js create mode 100644 js/src/views/Status/util/error.spec.js create mode 100644 js/src/views/Status/util/index.js create mode 100644 js/src/views/Status/util/index.spec.js create mode 100644 js/src/views/Status/util/react.js create mode 100644 js/src/views/Status/util/rpc-md.js create mode 100644 js/src/views/Status/util/toastr.js create mode 100644 js/src/views/Status/util/toastr.spec.js diff --git a/js/package.json b/js/package.json index d008f52f0bc..9a5003143ab 100644 --- a/js/package.json +++ b/js/package.json @@ -104,9 +104,12 @@ "blockies": "0.0.2", "classnames": "^2.2.3", "es6-promise": "^3.2.1", + "format-json": "^1.0.3", + "format-number": "^2.0.1", "isomorphic-fetch": "^2.2.1", "js-sha3": "^0.5.2", - "lodash": "4.11.1", + "lodash": "^4.11.1", + "marked": "^0.3.6", "material-ui": "^0.15.4", "moment": "^2.14.1", "react": "^15.2.1", @@ -119,6 +122,7 @@ "react-tooltip": "^2.0.3", "redux": "^3.5.2", "redux-actions": "^0.10.1", + "rlp": "^2.0.0", "utf8": "^2.1.1", "web3": "^0.17.0-alpha" } diff --git a/js/src/environment/empty.js b/js/src/environment/empty.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/js/src/environment/index.js b/js/src/environment/index.js new file mode 100644 index 00000000000..bdf1cd55edf --- /dev/null +++ b/js/src/environment/index.js @@ -0,0 +1,4 @@ +// import './integration-tests'; +// import './perf-debug'; + +import './tests'; diff --git a/js/src/environment/integration-tests/fake-backend.js b/js/src/environment/integration-tests/fake-backend.js new file mode 100644 index 00000000000..60ab1a08304 --- /dev/null +++ b/js/src/environment/integration-tests/fake-backend.js @@ -0,0 +1,68 @@ +import sinon from 'sinon/pkg/sinon'; +import mockedResponses from '../../../test/mocked-responses.json'; + +class FakeRpcServer { + constructor () { + this.xhr = null; + this.middlewares = []; + } + + start () { + this.xhr = sinon.useFakeXMLHttpRequest(); + this.xhr.onCreate = this.handleRequest; + return () => this.xhr.restore(); + } + + simpleRpc (rpcMethod, result) { + this.rpc(rpcMethod, req => result); + } + + rpc (rpcMethod, middleware) { + this.middlewares.unshift({ + rpcMethod, middleware + }); + } + + handleRequest = req => { + setTimeout(() => { + req.body = JSON.parse(req.requestBody); + const middlewaresForMethod = this.middlewares + .filter(m => m.rpcMethod === req.body.method); + + const response = middlewaresForMethod + .map(m => m.middleware) + .reduce((replied, middleware) => { + if (replied) { + return replied; + } + + return middleware(req); + }, false); + + if (!response) { + return req.respond(405, { + 'Content-Type': 'application/json' + }, JSON.stringify({ + jsonrpc: '2.0', + id: req.body.id, + result: null + })); + } + + return req.respond(200, { + 'Content-Type': 'application/json' + }, JSON.stringify({ + jsonrpc: '2.0', + id: req.body.id, + result: response + })); + }); + } +} + +const fakeRpc = new FakeRpcServer(); +fakeRpc.start(); +mockedResponses.rpc.forEach(method => fakeRpc.simpleRpc(method.name, method.response)); + +// export fakeRpc to mock stuff in tests +window.fakeRpc = fakeRpc; diff --git a/js/src/environment/integration-tests/index.js b/js/src/environment/integration-tests/index.js new file mode 100644 index 00000000000..3ee1db3f377 --- /dev/null +++ b/js/src/environment/integration-tests/index.js @@ -0,0 +1 @@ +import './fake-backend'; diff --git a/js/src/environment/perf-debug/index.js b/js/src/environment/perf-debug/index.js new file mode 100644 index 00000000000..a7ae638f3d4 --- /dev/null +++ b/js/src/environment/perf-debug/index.js @@ -0,0 +1 @@ +import './why-update'; diff --git a/js/src/environment/perf-debug/why-update.js b/js/src/environment/perf-debug/why-update.js new file mode 100644 index 00000000000..d47b0aeea48 --- /dev/null +++ b/js/src/environment/perf-debug/why-update.js @@ -0,0 +1,4 @@ +import React from 'react'; +import { whyDidYouUpdate } from 'why-did-you-update'; + +whyDidYouUpdate(React); diff --git a/js/src/environment/tests/index.js b/js/src/environment/tests/index.js new file mode 100644 index 00000000000..383cbe06121 --- /dev/null +++ b/js/src/environment/tests/index.js @@ -0,0 +1 @@ +import './test-utils'; diff --git a/js/src/environment/tests/test-utils.js b/js/src/environment/tests/test-utils.js new file mode 100644 index 00000000000..a60d79fd7e9 --- /dev/null +++ b/js/src/environment/tests/test-utils.js @@ -0,0 +1,30 @@ +import { Component } from 'react'; + +const isProd = process.env.NODE_ENV === 'production'; + +// Component utils for integration tests hooks. +const TEST_HOOK = 'data-test'; +Component.prototype._test = isProd ? noop : testHook; +Component.prototype._testInherit = isProd ? noop : testHookInherit; + +function noop (name) {} + +function testHookInherit (name) { + let hook = this.props[TEST_HOOK]; + if (name) { + hook += `-${name}`; + } + return { + [TEST_HOOK]: hook + }; +} + +function testHook (name) { + let hook = this.constructor.name; + if (name) { + hook += `-${name}`; + } + return { + [TEST_HOOK]: hook + }; +} diff --git a/js/src/index.js b/js/src/index.js index 247d4f2ad1a..b353bd6c408 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -8,6 +8,7 @@ import { createHashHistory } from 'history'; import { Provider } from 'react-redux'; import { applyMiddleware, combineReducers, createStore } from 'redux'; import { Redirect, Router, Route, useRouterHistory } from 'react-router'; +import { routerReducer } from 'react-router-redux'; import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; import { muiTheme } from './ui'; @@ -15,16 +16,22 @@ import { Accounts, Account, Addresses, Address, Application, Contract, Contracts import { errorReducer } from './ui/Errors'; import { tooltipReducer } from './ui/Tooltips'; -import { statusReducer } from './views/Application/Status'; +import { nodeStatusReducer } from './views/Application/Status'; // TODO: This is VERY messy, just dumped here to get the Signer going import signerMiddlewares from './views/Signer/middlewares'; -import { signer as signerReducer, toastr as toastrReducer, requests as requestsReducer } from './views/Signer/reducers'; +import { signer as signerReducer, toastr as signerToastrReducer, requests as signerRequestsReducer } from './views/Signer/reducers'; import Web3 from 'web3'; import { Web3Provider, web3Extension } from './views/Signer/components'; import { WebSocketsProvider, Ws } from './views/Signer/utils'; import { SignerDataProvider, WsDataProvider } from './views/Signer/providers'; +// TODO: same with Status... +import { status as statusReducer, settings as statusSettingsReducer, mining as statusMiningReducer, rpc as statusRpcReducer, toastr as statusToastrReducer, logger as statusLoggerReducer, debug as statusDebugReducer } from './views/Status/reducers'; +import Status from './views/Status/containers/Container'; + +import './environment'; + import styles from './reset.css'; import './index.html'; @@ -44,11 +51,19 @@ function tokenSetter (token, cb) { const reducers = combineReducers({ errors: errorReducer, - status: statusReducer, + nodeStatus: nodeStatusReducer, tooltip: tooltipReducer, + routing: routerReducer, signer: signerReducer, - toastr: toastrReducer, - requests: requestsReducer + signerRequests: signerRequestsReducer, + signerToastr: signerToastrReducer, + status: statusReducer, + statusSettings: statusSettingsReducer, + statusMining: statusMiningReducer, + statusRpc: statusRpcReducer, + statusToastr: statusToastrReducer, + statusLogger: statusLoggerReducer, + statusDebug: statusDebugReducer }); const store = applyMiddleware(...signerMiddlewares(ws, tokenSetter))( window.devToolsExtension @@ -76,6 +91,7 @@ ReactDOM.render( <Route path='contracts' component={ Contracts } /> <Route path='contract/:address' component={ Contract } /> <Route path='signer' component={ Signer } /> + <Route path='status' component={ Status } /> </Route> </Router> </Web3Provider> diff --git a/js/src/views/Account/Transactions/transactions.js b/js/src/views/Account/Transactions/transactions.js index 61a79f6526e..794ae22c393 100644 --- a/js/src/views/Account/Transactions/transactions.js +++ b/js/src/views/Account/Transactions/transactions.js @@ -178,7 +178,7 @@ class Transactions extends Component { } function mapStateToProps (state) { - const { isTest } = state.status; + const { isTest } = state.nodeStatus; return { isTest diff --git a/js/src/views/Application/Status/actions.js b/js/src/views/Application/Status/actions.js index e4b058353fb..64a311a0f73 100644 --- a/js/src/views/Application/Status/actions.js +++ b/js/src/views/Application/Status/actions.js @@ -1,6 +1,6 @@ -export function updateStatus (status) { +export function updateNodeStatus (status) { return { - type: 'updateStatus', + type: 'updateNodeStatus', status }; } diff --git a/js/src/views/Application/Status/index.js b/js/src/views/Application/Status/index.js index 8c2658b3f9c..8dcc9695db1 100644 --- a/js/src/views/Application/Status/index.js +++ b/js/src/views/Application/Status/index.js @@ -1,9 +1,9 @@ -import statusReducer from './reducers'; -import { updateStatus } from './actions'; +import nodeStatusReducer from './reducers'; +import { updateNodeStatus } from './actions'; export default from './status'; export { - statusReducer, - updateStatus + nodeStatusReducer, + updateNodeStatus }; diff --git a/js/src/views/Application/Status/reducers.js b/js/src/views/Application/Status/reducers.js index f633c930ed4..6a7421c4be5 100644 --- a/js/src/views/Application/Status/reducers.js +++ b/js/src/views/Application/Status/reducers.js @@ -1,4 +1,4 @@ -function updateStatus (state, action) { +function updateNodeStatus (state, action) { const { blockNumber, clientVersion, netPeers, netChain, isTest } = action.status; return Object.assign({}, state, { @@ -12,8 +12,8 @@ function updateStatus (state, action) { export default function statusReducer (state = {}, action) { switch (action.type) { - case 'updateStatus': - return updateStatus(state, action); + case 'updateNodeStatus': + return updateNodeStatus(state, action); default: return state; diff --git a/js/src/views/Application/Status/status.js b/js/src/views/Application/Status/status.js index 43c29eaff39..59569c00260 100644 --- a/js/src/views/Application/Status/status.js +++ b/js/src/views/Application/Status/status.js @@ -45,7 +45,7 @@ class Status extends Component { } function mapStateToProps (state) { - const { blockNumber, clientVersion, netPeers, netChain, isTest } = state.status; + const { blockNumber, clientVersion, netPeers, netChain, isTest } = state.nodeStatus; return { blockNumber, diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index 419324e4272..bf784fa0176 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -2,6 +2,7 @@ import React, { Component, PropTypes } from 'react'; import { Toolbar, ToolbarGroup } from 'material-ui/Toolbar'; import { Tabs, Tab } from 'material-ui/Tabs'; import ActionAccountBalanceWallet from 'material-ui/svg-icons/action/account-balance-wallet'; +import ActionTrackChanges from 'material-ui/svg-icons/action/track-changes'; import CommunicationContacts from 'material-ui/svg-icons/communication/contacts'; import NavigationApps from 'material-ui/svg-icons/navigation/apps'; @@ -68,6 +69,13 @@ export default class TabBar extends Component { icon={ <NavigationApps /> } label={ this.renderLabel('apps') } onActive={ this.onActivate } /> + <Tab + className={ hash === 'status' ? styles.tabactive : '' } + data-route='/status' + value='status' + icon={ <ActionTrackChanges /> } + label={ this.renderLabel('status') } + onActive={ this.onActivate } /> <Tab className={ hash === 'signer' ? styles.tabactive : '' } data-route='/signer' diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index 97572f04d88..bfade3f65c8 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -9,7 +9,7 @@ import { eip20Abi, registryAbi, tokenRegAbi } from '../../util/abi'; import Container from './Container'; import DappContainer from './DappContainer'; import FrameError from './FrameError'; -import Status, { updateStatus } from './Status'; +import Status, { updateNodeStatus } from './Status'; import TabBar from './TabBar'; import imagesEthereum32 from '../../images/contracts/ethereum-32.png'; @@ -52,7 +52,7 @@ class Application extends Component { children: PropTypes.node, netChain: PropTypes.string, isTest: PropTypes.bool, - onUpdateStatus: PropTypes.func, + onUpdateNodeStatus: PropTypes.func, pending: PropTypes.array } @@ -264,7 +264,7 @@ class Application extends Component { } pollStatus () { - const { onUpdateStatus } = this.props; + const { onUpdateNodeStatus } = this.props; const nextTimeout = () => setTimeout(() => this.pollStatus(), 1000); Promise @@ -278,7 +278,7 @@ class Application extends Component { .then(([blockNumber, clientVersion, netChain, netPeers, syncing]) => { const isTest = netChain === 'morden' || netChain === 'testnet'; - onUpdateStatus({ + onUpdateNodeStatus({ blockNumber, clientVersion, netChain, @@ -309,8 +309,8 @@ class Application extends Component { } function mapStateToProps (state) { - const { netChain, isTest } = state.status; - const { pending } = state.requests; + const { netChain, isTest } = state.nodeStatus; + const { pending } = state.signerRequests; return { netChain, @@ -321,7 +321,7 @@ function mapStateToProps (state) { function mapDispatchToProps (dispatch) { return bindActionCreators({ - onUpdateStatus: updateStatus + onUpdateNodeStatus: updateNodeStatus }, dispatch); } diff --git a/js/src/views/ParityBar/parityBar.js b/js/src/views/ParityBar/parityBar.js index 3b595aad2d7..607be0f33a1 100644 --- a/js/src/views/ParityBar/parityBar.js +++ b/js/src/views/ParityBar/parityBar.js @@ -107,7 +107,7 @@ class ParityBar extends Component { } function mapStateToProps (state) { - const { pending } = state.requests; + const { pending } = state.signerRequests; return { pending diff --git a/js/src/views/Signer/containers/RequestsPage/RequestsPage.js b/js/src/views/Signer/containers/RequestsPage/RequestsPage.js index e088344d4f9..fefb81a9317 100644 --- a/js/src/views/Signer/containers/RequestsPage/RequestsPage.js +++ b/js/src/views/Signer/containers/RequestsPage/RequestsPage.js @@ -12,7 +12,7 @@ import styles from './RequestsPage.css'; class RequestsPage extends Component { static propTypes = { - requests: PropTypes.shape({ + signerRequests: PropTypes.shape({ pending: PropTypes.array.isRequired, finished: PropTypes.array.isRequired }).isRequired, @@ -23,7 +23,7 @@ class RequestsPage extends Component { }; render () { - const { pending, finished } = this.props.requests; + const { pending, finished } = this.props.signerRequests; if (!pending.length && !finished.length) { return this.renderNoRequestsMsg(); @@ -42,7 +42,7 @@ class RequestsPage extends Component { } renderPendingRequests () { - const { pending } = this.props.requests; + const { pending } = this.props.signerRequests; if (!pending.length) { return; @@ -61,7 +61,7 @@ class RequestsPage extends Component { } renderFinishedRequests () { - const { finished } = this.props.requests; + const { finished } = this.props.signerRequests; if (!finished.length) { return; diff --git a/js/src/views/Signer/middlewares/toastr.js b/js/src/views/Signer/middlewares/toastr.js index 0bc867ef130..ab2bf982fd8 100644 --- a/js/src/views/Signer/middlewares/toastr.js +++ b/js/src/views/Signer/middlewares/toastr.js @@ -1,8 +1,6 @@ - import { addToast, removeToast } from '../actions/toastr'; export default class ToastrMiddleware { - constructor (time = 4000) { this._time = time; this._timeouts = {}; @@ -28,7 +26,7 @@ export default class ToastrMiddleware { } toast (store, next, action) { - const { toastNo } = store.getState().toastr; + const { toastNo } = store.getState().signerToastr; const { msg, type } = action.meta.toastr; next(addToast({ type, msg, toastNo })); this.setTimeoutFor(toastNo, next); diff --git a/js/src/views/Signer/middlewares/ws.js b/js/src/views/Signer/middlewares/ws.js index dce1b023381..1b562514acd 100644 --- a/js/src/views/Signer/middlewares/ws.js +++ b/js/src/views/Signer/middlewares/ws.js @@ -38,7 +38,7 @@ export default class LocalstorageMiddleware { next(action); const { id, password } = action.payload; // TODO [legacy;todr] Remove - const method = store.getState().requests.compatibilityMode ? 'personal_confirmTransaction' : 'personal_confirmRequest'; + const method = store.getState().signerRequests.compatibilityMode ? 'personal_confirmTransaction' : 'personal_confirmRequest'; this.send(method, [ id, {}, password ], (err, txHash) => { logger.log('[WS MIDDLEWARE] confirm request cb:', err, txHash); @@ -56,7 +56,7 @@ export default class LocalstorageMiddleware { next(action); const id = action.payload; // TODO [legacy;todr] Remove - const method = store.getState().requests.compatibilityMode ? 'personal_rejectTransaction' : 'personal_rejectRequest'; + const method = store.getState().signerRequests.compatibilityMode ? 'personal_rejectTransaction' : 'personal_rejectRequest'; this.send(method, [ id ], (err, res) => { logger.log('[WS MIDDLEWARE] reject request cb:', err, res); diff --git a/js/src/views/Signer/providers/wsDataProvider.js b/js/src/views/Signer/providers/wsDataProvider.js index e4ba2756957..b065b3a5907 100644 --- a/js/src/views/Signer/providers/wsDataProvider.js +++ b/js/src/views/Signer/providers/wsDataProvider.js @@ -23,7 +23,7 @@ export default class WsDataProvider { fetchPendingRequests () { // TODO [legacy;todr] Remove - if (this.store.getState().requests.compatibilityMode) { + if (this.store.getState().signerRequests.compatibilityMode) { return this.fetchPendingTransactionsFallback(); } @@ -40,7 +40,7 @@ export default class WsDataProvider { return; } - const txsStored = this.store.getState().requests.pending; + const txsStored = this.store.getState().signerRequests.pending; if (isEqual(txsWs, txsStored)) { return; } @@ -71,7 +71,7 @@ export default class WsDataProvider { return transaction; }); - const txsStored = this.store.getState().requests.pending; + const txsStored = this.store.getState().signerRequests.pending; if (isEqual(txsWs, txsStored)) { return; } diff --git a/js/src/views/Signer/reducers/toastr.js b/js/src/views/Signer/reducers/toastr.js index 193860a6aef..5018dc8b0cd 100644 --- a/js/src/views/Signer/reducers/toastr.js +++ b/js/src/views/Signer/reducers/toastr.js @@ -1,4 +1,3 @@ - import { handleActions } from 'redux-actions'; const initialState = { @@ -7,7 +6,6 @@ const initialState = { }; export default handleActions({ - 'add toast' (state, action) { return { ...state, diff --git a/js/src/views/Signer/signer.js b/js/src/views/Signer/signer.js index aeada77f640..b92bf6e7421 100644 --- a/js/src/views/Signer/signer.js +++ b/js/src/views/Signer/signer.js @@ -15,7 +15,7 @@ import styles from './signer.css'; export class Signer extends Component { static propTypes = { - toastr: PropTypes.shape({ + signerToastr: PropTypes.shape({ toasts: PropTypes.array.isRequired }).isRequired, actions: PropTypes.shape({ @@ -29,7 +29,8 @@ export class Signer extends Component { }; render () { - const { toastr, actions } = this.props; + console.log(this.props); + const { signerToastr, actions } = this.props; return ( <div className={ styles.signer }> @@ -39,7 +40,7 @@ export class Signer extends Component { { this.renderPage() } </div> <ToastrContainer - toasts={ toastr.toasts } + toasts={ signerToastr.toasts } actions={ actions } /> </div> diff --git a/js/src/views/Status/actions/app.js b/js/src/views/Status/actions/app.js new file mode 100644 index 00000000000..15621dd691c --- /dev/null +++ b/js/src/views/Status/actions/app.js @@ -0,0 +1,4 @@ + +import { createAction } from 'redux-actions'; + +export const initAppAction = createAction('init app'); diff --git a/js/src/views/Status/actions/clipboard.js b/js/src/views/Status/actions/clipboard.js new file mode 100644 index 00000000000..e3e93f17c8e --- /dev/null +++ b/js/src/views/Status/actions/clipboard.js @@ -0,0 +1,6 @@ + +import { createAction } from 'redux-actions'; +import { identity } from '../util'; +import { withToastr } from '../util/toastr'; + +export const copyToClipboard = createAction('copy toClipboard', identity, withToastr(identity)); diff --git a/js/src/views/Status/actions/debug.js b/js/src/views/Status/actions/debug.js new file mode 100644 index 00000000000..a3719f94e21 --- /dev/null +++ b/js/src/views/Status/actions/debug.js @@ -0,0 +1,8 @@ + +import { createAction } from 'redux-actions'; + +export const error = createAction('error'); +export const updateDevLogs = createAction('update devLogs'); +export const removeDevLogs = createAction('remove devLogs'); +export const updateDevLogging = createAction('update devLogging'); +export const updateDevLogsLevels = createAction('update devLogsLevels'); diff --git a/js/src/views/Status/actions/localstorage.js b/js/src/views/Status/actions/localstorage.js new file mode 100644 index 00000000000..75088953d05 --- /dev/null +++ b/js/src/views/Status/actions/localstorage.js @@ -0,0 +1,5 @@ + +import { createAction } from 'redux-actions'; + +export const error = createAction('error'); +export const syncRpcStateFromLocalStorage = createAction('sync rpcStateFromLocalStorage'); diff --git a/js/src/views/Status/actions/logger.js b/js/src/views/Status/actions/logger.js new file mode 100644 index 00000000000..d06d2ab2257 --- /dev/null +++ b/js/src/views/Status/actions/logger.js @@ -0,0 +1,8 @@ + +import { createAction } from 'redux-actions'; +import { identity } from '../util'; +import { withToastr } from '../util/toastr'; + +export const updateLogging = createAction( + 'update logging', identity, withToastr(flag => `logging updated to ${flag}`) +); diff --git a/js/src/views/Status/actions/mining.js b/js/src/views/Status/actions/mining.js new file mode 100644 index 00000000000..95944a18405 --- /dev/null +++ b/js/src/views/Status/actions/mining.js @@ -0,0 +1,9 @@ + +import { createAction } from 'redux-actions'; + +export const error = createAction('error'); +export const updateAuthor = createAction('update author'); +export const updateMinGasPrice = createAction('update minGasPrice'); +export const updateGasFloorTarget = createAction('update gasFloorTarget'); +export const updateExtraData = createAction('update extraData'); +export const updateDefaultExtraData = createAction('update defaultExtraData'); diff --git a/js/src/views/Status/actions/modify-mining.js b/js/src/views/Status/actions/modify-mining.js new file mode 100644 index 00000000000..cae64c3e4f7 --- /dev/null +++ b/js/src/views/Status/actions/modify-mining.js @@ -0,0 +1,8 @@ + +import { createAction } from 'redux-actions'; + +export const modifyMinGasPrice = createAction('modify minGasPrice'); +export const modifyGasFloorTarget = createAction('modify gasFloorTarget'); +export const modifyAuthor = createAction('modify author'); +export const modifyExtraData = createAction('modify extraData'); +export const resetExtraData = createAction('reset extraData'); diff --git a/js/src/views/Status/actions/rpc.js b/js/src/views/Status/actions/rpc.js new file mode 100644 index 00000000000..72ebc8bd6a4 --- /dev/null +++ b/js/src/views/Status/actions/rpc.js @@ -0,0 +1,12 @@ + +import { createAction } from 'redux-actions'; +import { identity } from '../util'; +import { withToastr } from '../util/toastr'; + +export const error = createAction('error rpc', identity, + withToastr(() => 'error processing rpc call. check console for details', 'error') +); +export const fireRpc = createAction('fire rpc'); +export const addRpcReponse = createAction('add rpcResponse'); +export const selectRpcMethod = createAction('select rpcMethod'); +export const resetRpcPrevCalls = createAction('reset rpcPrevCalls'); diff --git a/js/src/views/Status/actions/status.js b/js/src/views/Status/actions/status.js new file mode 100644 index 00000000000..c9e5c34397b --- /dev/null +++ b/js/src/views/Status/actions/status.js @@ -0,0 +1,14 @@ + +import { createAction } from 'redux-actions'; + +export const error = createAction('error'); +export const updateHashrate = createAction('update hashrate'); +export const updateBlockNumber = createAction('update blockNumber'); +export const updateVersion = createAction('update version'); +export const updatePeerCount = createAction('update peerCount'); +export const updateNetPeers = createAction('update netPeers'); +export const updateNetChain = createAction('update netChain'); +export const updateNetPort = createAction('update netPort'); +export const updateRpcSettings = createAction('update rpcSettings'); +export const updateNodeName = createAction('update nodeName'); +export const updateAccounts = createAction('update accounts'); diff --git a/js/src/views/Status/actions/toastr.js b/js/src/views/Status/actions/toastr.js new file mode 100644 index 00000000000..d63eff527ec --- /dev/null +++ b/js/src/views/Status/actions/toastr.js @@ -0,0 +1,5 @@ + +import { createAction } from 'redux-actions'; + +export const addToast = createAction('add toast'); +export const removeToast = createAction('remove toast'); diff --git a/js/src/views/Status/components-compositors/Animated/AnimateChildren.css b/js/src/views/Status/components-compositors/Animated/AnimateChildren.css new file mode 100644 index 00000000000..5c32516f23a --- /dev/null +++ b/js/src/views/Status/components-compositors/Animated/AnimateChildren.css @@ -0,0 +1,39 @@ +/* todo [adgo] - make local */ +:global .transition-appear { + opacity: 0.01; +} + +:global .transition-appear.transition-appear-active { + opacity: 1; + transition: opacity .3s ease-in-out; +} + +:global .transition-enter { + opacity: 0.01; +} + +:global .transition-enter.transition-enter-active { + opacity: 1; + transition: opacity .3s ease-in-out; +} + +:global .transition-leave { + opacity: 1; +} + +:global .transition-leave.transition-leave-active { + opacity: 0.01; + transition: opacity .3s ease-in-out; +} + +:global .absoluteAnimationContainer { + position: relative; +} + +:global .absoluteAnimationContainer > .transition-leave { + position: absolute; + top: 0; + left: 0; + right: 0; + width: 100%; +} diff --git a/js/src/views/Status/components-compositors/Animated/Animated.js b/js/src/views/Status/components-compositors/Animated/Animated.js new file mode 100644 index 00000000000..5bf4bbc5502 --- /dev/null +++ b/js/src/views/Status/components-compositors/Animated/Animated.js @@ -0,0 +1,13 @@ + +import React, { Component } from 'react'; +import AnimateChildren from './children'; + +export default Wrapped => class Animated extends Component { + render () { + return ( + <AnimateChildren> + <Wrapped { ...this.props } /> + </AnimateChildren> + ); + } +}; diff --git a/js/src/views/Status/components-compositors/Animated/children.js b/js/src/views/Status/components-compositors/Animated/children.js new file mode 100644 index 00000000000..42c9c2950ed --- /dev/null +++ b/js/src/views/Status/components-compositors/Animated/children.js @@ -0,0 +1,48 @@ + +import React, { Component, PropTypes } from 'react'; +import { isReactComponent } from '../../util/react'; +import ReactCSSTransitionGroup from 'react-addons-css-transition-group'; +import './AnimateChildren.css'; + +export default class AnimateChildren extends Component { + render () { + const className = this.props.absolute ? 'absoluteAnimationContainer' : ''; + return ( + <ReactCSSTransitionGroup + component='div' + className={ className } + transitionName='transition' + transitionAppear + transitionAppearTimeout={ 0 } + transitionLeaveTimeout={ 0 } + transitionEnterTimeout={ 0 } + > + { this.renderChildren() } + </ReactCSSTransitionGroup> + ); + } + + renderChildren () { + const { children, isView } = this.props; + + if (isView) { + return React.cloneElement(this.props.children, { + key: this.props.pathname + }); + } + + if (isReactComponent(children)) { + return React.cloneElement(this.props.children, { ...this.props }); + } + + return children; + } + + static propTypes = { + children: PropTypes.any.isRequired, + pathname: PropTypes.string, + isView: PropTypes.bool, + absolute: PropTypes.bool + } + +} diff --git a/js/src/views/Status/components-compositors/Animated/index.js b/js/src/views/Status/components-compositors/Animated/index.js new file mode 100644 index 00000000000..c620c98c640 --- /dev/null +++ b/js/src/views/Status/components-compositors/Animated/index.js @@ -0,0 +1 @@ +export default from './Animated'; diff --git a/js/src/views/Status/components/AutoComplete/AutoComplete.js b/js/src/views/Status/components/AutoComplete/AutoComplete.js new file mode 100644 index 00000000000..16075ce6795 --- /dev/null +++ b/js/src/views/Status/components/AutoComplete/AutoComplete.js @@ -0,0 +1,28 @@ +import React, { Component, PropTypes } from 'react'; +import AutoComplete from 'material-ui/AutoComplete'; + +export default class WrappedAutoComplete extends Component { + + render () { + return ( + <AutoComplete { ...this.props } /> + ); + } + + static defaultProps = { + openOnFocus: true, + filter: (searchText, key) => searchText === '' || key.toLowerCase().indexOf(searchText.toLowerCase()) !== -1 + } + + static propTypes = { + dataSource: PropTypes.array.isRequired, + filter: PropTypes.func, + name: PropTypes.string.isRequired, + openOnFocus: PropTypes.bool + } + + static contextTypes = { + muiTheme: PropTypes.object.isRequired + } + +} diff --git a/js/src/views/Status/components/AutoComplete/AutoComplete.spec.js b/js/src/views/Status/components/AutoComplete/AutoComplete.spec.js new file mode 100644 index 00000000000..ba17d502819 --- /dev/null +++ b/js/src/views/Status/components/AutoComplete/AutoComplete.spec.js @@ -0,0 +1,28 @@ +import React from 'react'; +import { shallow } from 'enzyme'; + +import getMuiTheme from 'material-ui/styles/getMuiTheme'; + +import WrappedAutoComplete from './AutoComplete'; + +describe('components/AutoComplete', () => { + describe('rendering', () => { + let rendered; + + beforeEach(() => { + const dataSource = ['abc', 'def', 'ghi']; + const component = + <WrappedAutoComplete + dataSource={ dataSource } + name='testComponent' + />; + + rendered = shallow(component, { context: { muiTheme: getMuiTheme({}) } }); + }); + + it('renders the material AutoComplete component', () => { + expect(rendered).to.be.ok; + expect(rendered).to.have.exactly(1).descendants('AutoComplete'); + }); + }); +}); diff --git a/js/src/views/Status/components/AutoComplete/index.js b/js/src/views/Status/components/AutoComplete/index.js new file mode 100644 index 00000000000..28d623ca69b --- /dev/null +++ b/js/src/views/Status/components/AutoComplete/index.js @@ -0,0 +1 @@ +export default from './AutoComplete'; diff --git a/js/src/views/Status/components/Box/Box.js b/js/src/views/Status/components/Box/Box.js new file mode 100644 index 00000000000..6aa02524f3a --- /dev/null +++ b/js/src/views/Status/components/Box/Box.js @@ -0,0 +1,32 @@ + +import React, { Component, PropTypes } from 'react'; + +export default class Box extends Component { + + renderValue () { + if (!this.props.value) { + return; + } + + return ( + <h1>{ this.props.value }</h1> + ); + } + + render () { + return ( + <div className='dapp-box'> + <h2>{ this.props.title }</h2> + { this.renderValue() } + { this.props.children } + </div> + ); + } + + static propTypes = { + title: PropTypes.string.isRequired, + value: PropTypes.string, + children: PropTypes.element + } + +} diff --git a/js/src/views/Status/components/Box/Box.spec.js b/js/src/views/Status/components/Box/Box.spec.js new file mode 100644 index 00000000000..883cb6f533d --- /dev/null +++ b/js/src/views/Status/components/Box/Box.spec.js @@ -0,0 +1,54 @@ +import React from 'react'; +import { shallow } from 'enzyme'; + +import Box from './Box'; + +describe('components/Box', () => { + describe('rendering', () => { + const title = 'test title'; + let rendered; + + beforeEach(() => { + rendered = shallow(<Box title={ title } />); + }); + + it('renders the component', () => { + expect(rendered).to.be.ok; + expect(rendered).to.have.className('dapp-box'); + }); + + it('renders the title', () => { + expect(rendered.find('h2')).to.have.text(title); + }); + + it('renders no default value', () => { + expect(rendered).to.not.have.descendants('h1'); + }); + }); + + describe('contents', () => { + const value = 'test value'; + const child = 'this is the child value'; + + let rendered; + + beforeEach(() => { + rendered = shallow( + <Box + title='title' + value={ value } + > + <pre>{ child }</pre> + </Box> + ); + }); + + it('renders the value', () => { + expect(rendered.find('h1')).to.have.text(value); + }); + + it('wraps the children', () => { + expect(rendered.find('pre')).to.have.text(child); + }); + }); +}); diff --git a/js/src/views/Status/components/Box/index.js b/js/src/views/Status/components/Box/index.js new file mode 100644 index 00000000000..24a93be071d --- /dev/null +++ b/js/src/views/Status/components/Box/index.js @@ -0,0 +1 @@ +export default from './Box'; diff --git a/js/src/views/Status/components/Call/Call.css b/js/src/views/Status/components/Call/Call.css new file mode 100644 index 00000000000..513fa87b65e --- /dev/null +++ b/js/src/views/Status/components/Call/Call.css @@ -0,0 +1,24 @@ +.call { + position: relative; + border-bottom: 2px solid #CCC6C6; + margin-bottom: 18.4px; + background: #f5f4f2; +} + +.call:first-child { + border-color: #6691C2; +} + +.call pre { + margin: 0; +} + +.call pre:nth-child(3) { + padding-top: 0; + color: #bbb; +} + +.callNo { + float: right; + color: #ccc; +} diff --git a/js/src/views/Status/components/Call/Call.js b/js/src/views/Status/components/Call/Call.js new file mode 100644 index 00000000000..bfa1a4190ed --- /dev/null +++ b/js/src/views/Status/components/Call/Call.js @@ -0,0 +1,53 @@ +import React, { Component, PropTypes } from 'react'; + +import Response from '../Response'; +import styles from './Call.css'; + +export default class Call extends Component { + + render () { + let { callNo, name, params, response } = this.props.call; + params = this.formatParams(params); + return ( + <div + onMouseEnter={ this.setActiveCall } + ref={ this.setElement } + className={ styles.call } + { ...this._test(`call-${callNo}`) } + > + <span className={ styles.callNo } { ...this._test('callNo') }>#{ callNo }</span> + <pre { ...this._test('name') }>{ name }({ params })</pre> + <Response response={ response } /> + </div> + ); + } + + setElement = el => { + this.element = el; + } + + setActiveCall = () => { + this.props.setActiveCall(this.props.call, this.element); + } + + formatParams (params) { + return params.reduce((str, p) => { + if (str !== '') { + str += ', '; + } + if (p === undefined) { + return str; + } + if (typeof p === 'object' || typeof p === 'string') { + p = JSON.stringify(p); + } + return str + p; + }, ''); + } + + static propTypes = { + call: PropTypes.object.isRequired, + setActiveCall: PropTypes.func.isRequired + } + +} diff --git a/js/src/views/Status/components/Call/Call.spec.js b/js/src/views/Status/components/Call/Call.spec.js new file mode 100644 index 00000000000..88624b2fcf7 --- /dev/null +++ b/js/src/views/Status/components/Call/Call.spec.js @@ -0,0 +1,76 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import sinon from 'sinon'; + +import '../../env-specific/tests'; + +import Call from './Call'; + +describe('components/Call', () => { + const call = { callIdx: 123, callNo: 456, name: 'eth_call', params: [{ name: '123' }], response: '' }; + const element = 'dummyElement'; + + let rendered; + let instance; + let setActiveCall = sinon.stub(); + + beforeEach(() => { + rendered = shallow( + <Call + call={ call } + setActiveCall={ setActiveCall } + /> + ); + instance = rendered.instance(); + }); + + describe('rendering', () => { + it('renders the component', () => { + expect(rendered).to.be.ok; + expect(rendered).to.have.exactly(1).descendants(`div[data-test="Call-call-${call.callNo}"]`); + }); + + it('adds onMouseEnter to setActiveElement', () => { + expect(rendered.find('div').first()).to.have.prop('onMouseEnter', instance.setActiveCall); + }); + }); + + describe('actions', () => { + it('sets the element via setElement', () => { + expect(instance.element).to.not.be.ok; + instance.setElement(element); + expect(instance.element).to.equal(element); + }); + + it('calls parent setActive call on setActiveCall', () => { + instance.setElement(element); + instance.setActiveCall(); + + expect(setActiveCall).to.be.calledWith(call, element); + }); + }); + + describe('utility', () => { + describe('.formatParams', () => { + it('correctly returns a single parameter', () => { + expect(instance.formatParams([1])).to.equal('1'); + }); + + it('correctly joins 2 parameters', () => { + expect(instance.formatParams([1, 2])).to.equal('1, 2'); + }); + + it('stringifies a string object', () => { + expect(instance.formatParams(['1'])).to.equal('"1"'); + }); + + it('stringifies an object object', () => { + expect(instance.formatParams([{ name: '1' }])).to.equal('{"name":"1"}'); + }); + + it('skips an undefined value', () => { + expect(instance.formatParams(['1', undefined, 3])).to.equal('"1", , 3'); + }); + }); + }); +}); diff --git a/js/src/views/Status/components/Call/index.js b/js/src/views/Status/components/Call/index.js new file mode 100644 index 00000000000..3cec42ec774 --- /dev/null +++ b/js/src/views/Status/components/Call/index.js @@ -0,0 +1 @@ +export default from './Call'; diff --git a/js/src/views/Status/components/Calls/Calls.css b/js/src/views/Status/components/Calls/Calls.css new file mode 100644 index 00000000000..13cd5736f71 --- /dev/null +++ b/js/src/views/Status/components/Calls/Calls.css @@ -0,0 +1,28 @@ +.historyInfo { + margin-top: 0; + text-transform: initial; +} + +.header { + margin: 0; +} + +.removeIcon { + float: right; + color: #bbb; + cursor: pointer; + transition: opacity ease-in-out 0.2s; + transition-delay: 0.2s; + opacity: 0; +} + +div:hover > .removeIcon { + opacity: 1.0; +} + +.history { + margin-top: calc(1em + 18.4px); + padding-top: 0; + overflow: auto; + max-height: 60vh; +} diff --git a/js/src/views/Status/components/Calls/Calls.js b/js/src/views/Status/components/Calls/Calls.js new file mode 100644 index 00000000000..bde7c8989b5 --- /dev/null +++ b/js/src/views/Status/components/Calls/Calls.js @@ -0,0 +1,116 @@ +import React, { Component, PropTypes } from 'react'; +import AnimateChildren from '../../components-compositors/Animated/children'; +import Call from '../Call'; +import CallsToolbar from '../CallsToolbar'; +import styles from './Calls.css'; + +export default class Calls extends Component { + + state = { + activeCall: null, + activeChild: null + } + + render () { + return ( + <div + className='calls-container' + onMouseLeave={ this.clearActiveCall } + { ...this._test('container') } + > + { this.renderClear() } + <h2 className={ styles.header }>History</h2> + <div className={ `${styles.history} row` } ref={ this.setCallsHistory }> + { this.renderNoCallsMsg() } + { this.renderCalls() } + </div> + <CallsToolbar + call={ this.state.activeCall } + callEl={ this.state.activeChild } + containerEl={ this._callsHistory } + actions={ this.props.actions } + /> + </div> + ); + } + + renderClear () { + if (!this.props.calls.length) { + return; + } + + return ( + <a + { ...this._test('remove') } + title='Clear RPC calls history' + onClick={ this.clearHistory } + className={ styles.removeIcon } + > + <i className='icon-trash'></i> + </a> + ); + } + + renderNoCallsMsg () { + if (this.props.calls.length) { + return; + } + + return ( + <AnimateChildren> + <div { ...this._test('empty-wrapper') }> + <h3 className={ styles.historyInfo } { ...this._test('empty') }> + Fire up some calls and the results will be here. + </h3> + </div> + </AnimateChildren> + ); + } + + renderCalls () { + const { calls } = this.props; + + if (!calls.length) { + return; + } + + return ( + <AnimateChildren> + { calls.map((call, idx) => ( + <Call + key={ calls.length - idx } + call={ call } + setActiveCall={ this.setActiveCall } + /> + )) } + </AnimateChildren> + ); + } + + clearActiveCall = () => { + this.setState({ activeCall: null, activeChild: null }); + } + + setActiveCall = (call, el) => { + this.setState({ activeCall: call, activeChild: el }); + } + + setCallsHistory = el => { + this._callsHistory = el; + } + + clearHistory = () => { + this.props.reset(); + } + + static propTypes = { + calls: PropTypes.arrayOf(PropTypes.object).isRequired, + actions: PropTypes.shape({ + fireRpc: PropTypes.func.isRequired, + copyToClipboard: PropTypes.func.isRequired, + selectRpcMethod: PropTypes.func.isRequired + }).isRequired, + reset: PropTypes.func + } + +} diff --git a/js/src/views/Status/components/Calls/Calls.spec.js b/js/src/views/Status/components/Calls/Calls.spec.js new file mode 100644 index 00000000000..46441e33bb8 --- /dev/null +++ b/js/src/views/Status/components/Calls/Calls.spec.js @@ -0,0 +1,119 @@ +import React from 'react'; +import { shallow } from 'enzyme'; + +import '../../env-specific/tests'; + +import Calls from './Calls'; + +describe('components/Calls', () => { + describe('rendering (no calls)', () => { + let rendered; + + before(() => { + const calls = []; + + rendered = shallow(<Calls calls={ calls } />); + }); + + it('renders the component and container', () => { + expect(rendered).to.be.ok; + expect(rendered).to.have.className('calls-container'); + }); + + it('renders no calls', () => { + expect(rendered.find('div[data-test="Calls-empty-wrapper"]')).to.have.exactly(1).descendants('h3'); + }); + + it('renders no clear button', () => { + expect(rendered.find('a[data-test="Calls-remove"]')).to.not.exist; + }); + + it('renders an attached CallsToolbar', () => { + expect(rendered).to.have.exactly(1).descendants('CallsToolbar'); + }); + }); + + describe('rendering (calls supplied)', () => { + const calls = [ + { callNo: 0, name: 'eth_call', params: '', response: '' }, + { callNo: 1, name: 'eth_sendTransaction', params: '', response: '' } + ]; + const actions = { action1: true, action2: true }; + + let rendered; + let instance; + + before(() => { + rendered = shallow(<Calls calls={ calls } actions={ actions } />); + instance = rendered.instance(); + }); + + it('renders the clear button', () => { + expect(rendered).to.have.exactly(1).descendants('a[data-test="Calls-remove"]'); + }); + + it('renders calls', () => { + expect(rendered.find('div[data-test="Calls-empty-wrapper"]')).to.not.exist; + expect(rendered.find('div.row div')).to.have.exactly(2).descendants('Call'); + }); + + it('passes the correct properties to Call', () => { + const call = rendered.find('Call').first(); + + expect(call).to.have.prop('setActiveCall', instance.setActiveCall); + expect(call).to.have.prop('call').deep.equal(calls[0]); + }); + + it('passes the correct properties to CallsToolbar', () => { + const child = { offsetTop: 0 }; + const container = { scrollTop: 0 }; + + instance.setCallsHistory(container); + rendered.setState({ activeCall: 'dummyActiveCall', activeChild: child }); + + const toolbar = rendered.find('CallsToolbar').first(); + + expect(toolbar).to.have.prop('call', 'dummyActiveCall'); + expect(toolbar).to.have.prop('actions').deep.equal(actions); + expect(toolbar).to.have.prop('callEl').deep.equal(child); + expect(toolbar).to.have.prop('containerEl').deep.equal(container); + }); + }); + + describe('actions', () => { + let rendered; + let instance; + + before(() => { + const calls = [ + { callNo: 0, name: 'eth_call', params: '', response: '' }, + { callNo: 1, name: 'eth_sendTransaction', params: '', response: '' } + ]; + + rendered = shallow(<Calls calls={ calls } />); + instance = rendered.instance(); + }); + + it('sets the element via setCallsHistory', () => { + instance.setCallsHistory('dummyElement'); + + expect(instance._callsHistory).to.equal('dummyElement'); + }); + + it('sets state via setActiveCall', () => { + instance.setActiveCall('dummyActiveCall', 'dummyActiveChild'); + + expect(rendered).to.have.state('activeCall', 'dummyActiveCall'); + expect(rendered).to.have.state('activeChild', 'dummyActiveChild'); + }); + + it('clears state via clearActiveCall', () => { + instance.setActiveCall('dummyActiveCall', 'dummyActiveChild'); + expect(rendered).to.have.state('activeCall', 'dummyActiveCall'); + instance.clearActiveCall(); + + expect(rendered).to.have.state('activeCall', null); + expect(rendered).to.have.state('activeChild', null); + }); + }); +}); diff --git a/js/src/views/Status/components/Calls/index.js b/js/src/views/Status/components/Calls/index.js new file mode 100644 index 00000000000..c21d463cfbc --- /dev/null +++ b/js/src/views/Status/components/Calls/index.js @@ -0,0 +1 @@ +export default from './Calls'; diff --git a/js/src/views/Status/components/CallsToolbar/CallsToolbar.css b/js/src/views/Status/components/CallsToolbar/CallsToolbar.css new file mode 100644 index 00000000000..ae680e0fa54 --- /dev/null +++ b/js/src/views/Status/components/CallsToolbar/CallsToolbar.css @@ -0,0 +1,51 @@ + +.callActionsWrap { + position: absolute; + animation: fadein .5s; + right: 0; + height: 28px; +} + +.callActionsButton { + padding: 0 !important; + height: 24px !important; +} + +.callActionsWrap:hover .callActionsButton { + display: none !important; +} + +.callActions { + display: none; + height: 100%; + margin-top: 1px; + margin-right: 10px; +} + +.callActionsWrap:hover .callActions { + display: block; +} + +.callAction { + float: right; + transition: opacity ease-in-out .2s; + transition-delay: .2s; + opacity: 0; + padding: 3px !important; + height: 22px !important; + width: 22px !important; +} + +.callActions:hover .callAction { + opacity: 1; +} + +.callActionIcon { + height: 100% !important; + width: 100% !important; +} + +@keyframes fadein { + from { opacity: 0; } + to { opacity: 1; } +} \ No newline at end of file diff --git a/js/src/views/Status/components/CallsToolbar/CallsToolbar.js b/js/src/views/Status/components/CallsToolbar/CallsToolbar.js new file mode 100644 index 00000000000..d9cd15f2d68 --- /dev/null +++ b/js/src/views/Status/components/CallsToolbar/CallsToolbar.js @@ -0,0 +1,116 @@ +import React, { Component, PropTypes } from 'react'; +import CopyToClipboard from 'react-copy-to-clipboard'; +import { sortBy, find, extend } from 'lodash'; + +import IconButton from 'material-ui/IconButton'; +import MoreHorizIcon from 'material-ui/svg-icons/navigation/more-horiz'; +import CallIcon from 'material-ui/svg-icons/communication/call'; +import AssignmentIcon from 'material-ui/svg-icons/action/assignment'; +import InputIcon from 'material-ui/svg-icons/action/input'; + +import { SCROLLBAR_WIDTH } from '../../constants'; +import styles from './CallsToolbar.css'; +import rpcData from '../../data/rpc.json'; +const rpcMethods = sortBy(rpcData.methods, 'name'); + +export default class CallsToolbar extends Component { + + render () { + const { call, callEl, containerEl } = this.props; + + if (!call) { + return null; + } + + const wrapStyle = { top: callEl.offsetTop - SCROLLBAR_WIDTH - containerEl.scrollTop }; + if (this.hasScrollbar(containerEl)) { + wrapStyle.right = 13; + } + + return ( + <div + className={ styles.callActionsWrap } + style={ wrapStyle } + > + <IconButton + className={ styles.callActionsButton } + { ...this._test('button-more') } + > + <MoreHorizIcon /> + </IconButton> + <div className={ styles.callActions } { ...this._test('button-container') }> + <IconButton + className={ styles.callAction } + onClick={ this.setCall } + tooltip='Set' + tooltipPosition='top-left' + { ...this._test('button-setCall') } + > + <InputIcon className={ styles.callActionIcon } /> + </IconButton> + <IconButton + className={ styles.callAction } + onClick={ this.makeCall } + tooltip='Fire again' + tooltipPosition='top-left' + { ...this._test('button-makeCall') } + > + <CallIcon className={ styles.callActionIcon } /> + </IconButton> + <CopyToClipboard + text={ JSON.stringify(call) } + onCopy={ this.copyToClipboard } + > + <IconButton + className={ styles.callAction } + tooltip='Copy to clipboard' + tooltipPosition='top-left' + { ...this._test('copyCallToClipboard') } + > + <AssignmentIcon className={ styles.callActionIcon } /> + </IconButton> + </CopyToClipboard> + </div> + </div> + ); + } + + setCall = () => { + const { call } = this.props; + let method = find(rpcMethods, { name: call.name }); + + this.props.actions.selectRpcMethod(extend({}, method, { paramsValues: call.params })); + } + + makeCall = () => { + const { call } = this.props; + let method = find(rpcMethods, { name: call.name }); + + this.setCall(); + this.props.actions.fireRpc({ + method: method.name, + outputFormatter: method.outputFormatter, + inputFormatters: method.inputFormatters, + params: call.params + }); + } + + copyToClipboard = () => { + this.props.actions.copyToClipboard('method copied to clipboard'); + } + + hasScrollbar (el) { + return el.clientHeight < el.scrollHeight; + } +} + +CallsToolbar.propTypes = { + call: PropTypes.object.isRequired, + callEl: PropTypes.node.isRequired, + containerEl: PropTypes.node.isRequired, + actions: PropTypes.shape({ + fireRpc: PropTypes.func.isRequired, + copyToClipboard: PropTypes.func.isRequired, + selectRpcMethod: PropTypes.func.isRequired + }).isRequired +}; diff --git a/js/src/views/Status/components/CallsToolbar/CallsToolbar.spec.js b/js/src/views/Status/components/CallsToolbar/CallsToolbar.spec.js new file mode 100644 index 00000000000..0e9b7d6f916 --- /dev/null +++ b/js/src/views/Status/components/CallsToolbar/CallsToolbar.spec.js @@ -0,0 +1,102 @@ +import React from 'react'; +import sinon from 'sinon'; +import { shallow } from 'enzyme'; + +import '../../env-specific/tests'; + +import CallsToolbar from './CallsToolbar'; + +describe('components/CallsToolbar', () => { + const callEl = { offsetTop: 0 }; + const containerEl = { scrollTop: 0, clientHeight: 0, scrollHeight: 999 }; + + describe('rendering (no call)', () => { + let rendered; + + before(() => { + const call = null; + + rendered = shallow(<CallsToolbar call={ call } callEl={ callEl } containerEl={ containerEl } />); + }); + + it('does not render the component', () => { + expect(rendered).to.not.have.descendants('[data-test="CallsToolbar-button-more"]'); + }); + }); + + describe('rendering', () => { + const call = { callNo: 456, name: 'eth_call', params: '', response: '' }; + let rendered; + let btncontainer; + + before(() => { + rendered = shallow(<CallsToolbar call={ call } callEl={ callEl } containerEl={ containerEl } />); + btncontainer = rendered.find('[data-test="CallsToolbar-button-container"]'); + }); + + it('renders the More button', () => { + expect(rendered).to.have.descendants('[data-test="CallsToolbar-button-more"]'); + }); + + it('renders the Set button', () => { + expect(btncontainer).to.have.descendants('[data-test="CallsToolbar-button-setCall"]'); + }); + + it('renders the Fire button', () => { + expect(btncontainer).to.have.descendants('[data-test="CallsToolbar-button-makeCall"]'); + }); + + it('renders the Copy button', () => { + expect(btncontainer).to.have.descendants('[data-test="CallsToolbar-copyCallToClipboard"]'); + }); + }); + + describe('actions', () => { + const call = { callNo: 456, name: 'eth_call', params: '', response: '' }; + const actions = { fireRpc: sinon.stub(), copyToClipboard: sinon.stub(), selectRpcMethod: sinon.stub() }; + + let rendered; + let instance; + + before(() => { + rendered = shallow(<CallsToolbar call={ call } callEl={ callEl } containerEl={ containerEl } actions={ actions } />); + instance = rendered.instance(); + }); + + it('calls copyToClipboard with action copyToClipboard', () => { + instance.copyToClipboard(); + expect(actions.copyToClipboard).to.be.calledOnce; + }); + + it('calls setCall with action selectRpcMethod', () => { + instance.setCall(); + expect(actions.selectRpcMethod).to.be.calledOnce; + }); + + it('calls makeCall with action fireRpc', () => { + instance.makeCall(); + expect(actions.fireRpc).to.be.calledOnce; + }); + }); + + describe('utility', () => { + const call = { callNo: 456, name: 'eth_call', params: '', response: '' }; + let rendered; + let instance; + + before(() => { + rendered = shallow(<CallsToolbar call={ call } callEl={ callEl } containerEl={ containerEl } />); + instance = rendered.instance(); + }); + + describe('.hasScrollbar', () => { + it('correctly returns true when scrollbar', () => { + expect(instance.hasScrollbar({ clientHeight: 123, scrollHeight: 456 })).to.be.true; + }); + + it('correctly returns false when no scrollbar', () => { + expect(instance.hasScrollbar({ clientHeight: 456, scrollHeight: 123 })).to.be.false; + }); + }); + }); +}); diff --git a/js/src/views/Status/components/CallsToolbar/index.js b/js/src/views/Status/components/CallsToolbar/index.js new file mode 100644 index 00000000000..2e47cf4918f --- /dev/null +++ b/js/src/views/Status/components/CallsToolbar/index.js @@ -0,0 +1 @@ +export default from './CallsToolbar'; diff --git a/js/src/views/Status/components/Debug/Debug.css b/js/src/views/Status/components/Debug/Debug.css new file mode 100644 index 00000000000..e76b9ce5e36 --- /dev/null +++ b/js/src/views/Status/components/Debug/Debug.css @@ -0,0 +1,56 @@ +.subheader { + margin-top: 0; +} + +.inputTrigger { + display: none; + left: 310px; + bottom: 4px; + position: absolute; + cursor: pointer; + animation: fadein .3s; +} + +*:hover > .inputTrigger { + display: block; +} + +@keyframes fadein { + 0% { opacity: 0; } + 100% { opacity: 1; } +} + +.logs { + width: 100%; + overflow: auto; + height: 50vh; + min-height: 400px; + background: #F5F4F2; +} + +.log { + margin: 0; + white-space: nowrap; + overflow: visible; +} + +.container { + width: 100%; +} + +.actions { + float: right; + opacity: 0; + transition: opacity ease-in-out .5s; + transition-delay: 0.2s; +} + +div:hover > .actions { + opacity: 1; +} + +.actions a { + margin-left: 5px; + cursor: pointer; + color: #bbb; +} diff --git a/js/src/views/Status/components/Debug/Debug.js b/js/src/views/Status/components/Debug/Debug.js new file mode 100644 index 00000000000..32f1e9f5c13 --- /dev/null +++ b/js/src/views/Status/components/Debug/Debug.js @@ -0,0 +1,63 @@ + +import React, { Component, PropTypes } from 'react'; + +import styles from './Debug.css'; + +export default class Debug extends Component { + + render () { + return ( + <div className='dapp-flex-content'> + <main className={ `dapp-content ${styles.container}` }> + <div className={ 'dapp-container' }> + <h1><span>Debugging</span> logs</h1> + { this.renderActions() } + <h2 className={ styles.subheader }>{ this.props.debug.levels || '-' }</h2> + <div className={ styles.logs }> + { this.renderLogs() } + </div> + </div> + </main> + </div> + ); + } + + renderLogs () { + return this.props.debug.logs.map((log, idx) => ( + <pre className={ styles.log } key={ idx }> + { log } + </pre> + )); + } + + renderActions () { + const toggleClass = this.props.debug.logging ? 'icon-control-pause' : 'icon-control-play'; + return ( + <div className={ styles.actions }> + <a><i onClick={ this.toggle } className={ toggleClass }></i></a> + <a><i onClick={ this.clear } className='icon-trash'></i></a> + </div> + ); + } + + clear = () => { + this.props.actions.removeDevLogs(); + } + + toggle = () => { + this.props.actions.updateDevLogging(!this.props.debug.logging); + } + + static propTypes = { + actions: PropTypes.shape({ + removeDevLogs: PropTypes.func.isRequired, + updateDevLogging: PropTypes.func.isRequired + }).isRequired, + debug: PropTypes.shape({ + levels: PropTypes.string.isRequired, + logging: PropTypes.bool.isRequired, + logs: PropTypes.arrayOf(PropTypes.string).isRequired + }).isRequired + } + +} diff --git a/js/src/views/Status/components/Debug/index.js b/js/src/views/Status/components/Debug/index.js new file mode 100644 index 00000000000..32f46e9e79c --- /dev/null +++ b/js/src/views/Status/components/Debug/index.js @@ -0,0 +1 @@ +export default from './Debug'; diff --git a/js/src/views/Status/components/EditableValue/EditableValue.css b/js/src/views/Status/components/EditableValue/EditableValue.css new file mode 100644 index 00000000000..68c26ccb55f --- /dev/null +++ b/js/src/views/Status/components/EditableValue/EditableValue.css @@ -0,0 +1,58 @@ +.input { + margin-top: 0; + width: 100%; + padding-left: 10px; + padding-right: 50px; +} + +.icon, .iconSuccess, .firstIcon { + display: block; + cursor: pointer; + flex: 1; + margin: 3px 3px; + color: #bbb; +} + +.success, .iconSuccess { + color: #8bc34a; +} + +.icon i, .iconSuccess i, .firstIcon i { + vertical-align: middle; +} + +.icons, .iconsVisible, .firstIcon { + z-index: 10; + position: absolute; + right: 0; + top: 0; + bottom: 0; + display: flex; + opacity: 0; + transition: opacity ease-in-out .2s; + transition-delay: 0.2s; +} + +.iconsVisible { + opacity: 1.0; +} + +.container:hover .icons, .container:hover .firstIcon { + opacity: 1.0; +} + +.firstIcon { + position: absolute; + left: -10px; + right: auto; + top: 0; + bottom: 0; + margin: 3px 0; + display: block; +} + +.autocomplete input { + margin-top: 0; + padding-left: 10px !important; + padding-right: 50px !important; +} \ No newline at end of file diff --git a/js/src/views/Status/components/EditableValue/EditableValue.js b/js/src/views/Status/components/EditableValue/EditableValue.js new file mode 100644 index 00000000000..f825bf7c218 --- /dev/null +++ b/js/src/views/Status/components/EditableValue/EditableValue.js @@ -0,0 +1,177 @@ + +import React, { Component, PropTypes } from 'react'; +import AutoComplete from 'material-ui/AutoComplete'; + +import styles from './EditableValue.css'; +import valueStyles from '../Value/Value.css'; + +export default class EditableValue extends Component { + + state = { + value: this.props.value, + inEditMode: false + } + + componentWillReceiveProps (newProps) { + if (newProps.value === this.state.value || this.state.inEditMode) { + return; + } + this.setState({ + value: newProps.value + }); + } + + onChange = value => { + this.setState({ + value: value + }); + } + + onOpenEdit = evt => { + this.setState({ + inEditMode: true + }); + + if (!this._input) { + return; + } + this._input.focus(); + } + + onCancel = evt => { + this.setState({ + inEditMode: false, + value: this.props.value + }); + } + + onSubmit = () => { + this.setState({ + inEditMode: false + }); + this.props.onSubmit(this.state.value, false); + } + + onResetToDefault = () => { + this.props.onSubmit(this.props.defaultValue, true); + } + + render () { + return ( + <form + className={ `${valueStyles.valueContainer} ${styles.container}` } + onSubmit={ this.onSubmit } + { ...this._testInherit() } + > + { this.renderResetButton() } + <div className={ this.state.inEditMode ? styles.iconsVisible : styles.icons }> + { this.props.children } + { this.renderButtons() } + </div> + { this.renderInput() } + </form> + ); + } + + renderInput () { + const { inEditMode, value } = this.state; + + const setInput = el => { this._input = el; }; + const onChange = evt => this.onChange(evt.target.value); + + if (!inEditMode || !this.props.autocomplete) { + return ( + <input + className={ inEditMode ? styles.input : valueStyles.value } + type='text' + value={ value } + onClick={ this.onOpenEdit } + ref={ setInput } + onChange={ onChange } + readOnly={ !inEditMode } + /> + ); + } + + return ( + <AutoComplete + name='EditableValueAutoComplete' // avoid Material Ui warning + className={ styles.autocomplete } + fullWidth + searchText={ value } + dataSource={ this.props.dataSource } + onUpdateInput={ this.onChange } + onNewRequest={ this.onChange } + openOnFocus + filter={ AutoComplete.noFilter } + /> + ); + } + + renderResetButton () { + if (this.state.inEditMode) { + return; + } + + if (!this.props.defaultValue || this.state.value === this.props.defaultValue) { + return; + } + + return ( + <a + key={ 'reset' } + className={ `${styles.icon} ${styles.firstIcon}` } + onClick={ this.onResetToDefault } + title={ `Reset to ${this.props.defaultValue}` } + { ...this._testInherit('reset') } + > + <i className='icon-anchor'></i> + </a> + ); + } + + renderButtons () { + if (this.state.inEditMode) { + return [ + <a + key={ 'submit' } + className={ styles.iconSuccess } + onClick={ this.onSubmit } + { ...this._testInherit('submit') } + > + <i className='icon-check'></i> + </a>, + <a + key={ 'cancel' } + className={ styles.icon } + onClick={ this.onCancel } + { ...this._testInherit('cancel') } + > + <i className='icon-close'></i> + </a> + ]; + } + + return ( + <a + key={ 'edit' } + className={ styles.icon } + onClick={ this.onOpenEdit } + title='Edit' + { ...this._testInherit('edit') } + > + <i className='icon-pencil'></i> + </a> + ); + } + + static propTypes = { + onSubmit: PropTypes.func.isRequired, + value: PropTypes.string, + defaultValue: PropTypes.string, + children: PropTypes.element, + autocomplete: PropTypes.bool, + dataSource: PropTypes.arrayOf(PropTypes.string) + } + +} diff --git a/js/src/views/Status/components/EditableValue/index.js b/js/src/views/Status/components/EditableValue/index.js new file mode 100644 index 00000000000..d9d4affa790 --- /dev/null +++ b/js/src/views/Status/components/EditableValue/index.js @@ -0,0 +1 @@ +export default from './EditableValue'; diff --git a/js/src/views/Status/components/Footer/Footer.css b/js/src/views/Status/components/Footer/Footer.css new file mode 100644 index 00000000000..17f60784c17 --- /dev/null +++ b/js/src/views/Status/components/Footer/Footer.css @@ -0,0 +1,32 @@ +.footer { + position: fixed; + bottom: 0; + left: 0; + right: 0; + background: rgba(255, 255, 255, 0.85); + border-top: 1px solid #6691C2; + padding: 10px; + margin: 50px 0 0; + color: #6691C2; +} +.right { + float: right; +} + +.logButton { + float: right; + height: 15px !important; + width: 15px !important; + padding: 0 !important; + margin-top: 3px !important; + margin-left: 3px; +} + +.logIcon { + height: 100% !important; + width: 100% !important; +} + +.off { + opacity: .3; +} \ No newline at end of file diff --git a/js/src/views/Status/components/Footer/Footer.js b/js/src/views/Status/components/Footer/Footer.js new file mode 100644 index 00000000000..c165609f2db --- /dev/null +++ b/js/src/views/Status/components/Footer/Footer.js @@ -0,0 +1,48 @@ + +import React, { Component, PropTypes } from 'react'; +import IconButton from 'material-ui/IconButton'; +import IconEventNote from 'material-ui/svg-icons/notification/event-note'; + +import styles from './Footer.css'; + +export default class Footer extends Component { + + render () { + return ( + <footer { ...this._testInherit() }> + <div className={ styles.footer }> + <a href='http://ethcore.io'>ethcore.io</a> + { this.renderLogIcon() } + <span className={ styles.right }> + Powered by: { this.props.version } + </span> + </div> + </footer> + ); + } + + renderLogIcon () { + const { updateLogging, logging } = this.props; + const isOffClass = !logging ? styles.off : ''; + + const onClick = () => updateLogging(!logging); + + return ( + <IconButton + { ...this._testInherit('log-button') } + onClick={ onClick } + tooltip='Toggle logging' tooltipPosition='top-left' + className={ styles.logButton } + > + <IconEventNote className={ `${styles.logIcon} ${isOffClass}` } /> + </IconButton> + ); + } + + static propTypes = { + version: PropTypes.string.isRequired, + logging: PropTypes.bool.isRequired, + updateLogging: PropTypes.func.isRequired + } + +} diff --git a/js/src/views/Status/components/Footer/index.js b/js/src/views/Status/components/Footer/index.js new file mode 100644 index 00000000000..6a67aecdeda --- /dev/null +++ b/js/src/views/Status/components/Footer/index.js @@ -0,0 +1 @@ +export default from './Footer'; diff --git a/js/src/views/Status/components/Header/Header.css b/js/src/views/Status/components/Header/Header.css new file mode 100644 index 00000000000..60a563955e3 --- /dev/null +++ b/js/src/views/Status/components/Header/Header.css @@ -0,0 +1,23 @@ +.title { + position: relative; + top: -8px; + left: -8px; +} +.title h1, .title h3 { + margin: 0; +} +.title h3 { + text-transform: none; + font-weight: 300; +} +.error { + color: #C20E25 !important; +} + +.warning { + color: #E88305 !important; +} + +.hidden { + display: none !important; +} diff --git a/js/src/views/Status/components/Header/Header.js b/js/src/views/Status/components/Header/Header.js new file mode 100644 index 00000000000..31469b62bdf --- /dev/null +++ b/js/src/views/Status/components/Header/Header.js @@ -0,0 +1,76 @@ + +import { Link } from 'react-router'; +import React, { Component, PropTypes } from 'react'; + +import styles from './Header.css'; + +export default class Header extends Component { + + renderErrors () { + const { disconnected } = this.props; + if (!disconnected) { + return; + } + + return ( + <nav> + <ul> + <li className={ disconnected ? {} : styles.hidden }> + <a className={ styles.error } disabled title='It seems that we cannot connect to your node. Make sure the node is online and RPC is enabled.'> + <i className='icon-power'></i> + <span>Node is Down</span> + </a> + </li> + </ul> + </nav> + ); + } + + render () { + return ( + <header className='dapp-header' { ...this._testInherit() }> + <hgroup className={ styles.title }> + <h1>Status Page</h1> + <h3>{ this.props.nodeName }</h3> + </hgroup> + { this.renderErrors() } + <div className='dapp-flex-item'></div> + <nav> + <ul> + <li> + <Link to={ '/status' } activeClassName='active' { ...this._test('home-link') }> + <i className='icon-globe'></i> + <span>Status</span> + </Link> + </li> + <li> + <Link to={ '/rpc' } activeClassName='active' { ...this._test('rpc-link') }> + <i className='icon-call-out'></i> + <span>Rpc Methods</span> + </Link> + </li> + <li> + <Link to={ '/debug' } activeClassName='active' { ...this._test('debug-link') }> + <i className='icon-bar-chart'></i> + <span>Debug</span> + </Link> + </li> + <li style={ { display: 'none' } }> + <Link to={ '/accounts' } activeClassName='active' { ...this._test('accounts-link') }> + <i className='icon-users'></i> + <span>Accounts</span> + </Link> + </li> + </ul> + </nav> + </header> + ); + } + + static propTypes = { + nodeName: PropTypes.string.isRequired, + noOfErrors: PropTypes.number.isRequired, + disconnected: PropTypes.bool + } + +} diff --git a/js/src/views/Status/components/Header/index.js b/js/src/views/Status/components/Header/index.js new file mode 100644 index 00000000000..2509393d237 --- /dev/null +++ b/js/src/views/Status/components/Header/index.js @@ -0,0 +1 @@ +export default from './Header'; diff --git a/js/src/views/Status/components/JsonEditor/JsonEditor.css b/js/src/views/Status/components/JsonEditor/JsonEditor.css new file mode 100644 index 00000000000..5837da840ba --- /dev/null +++ b/js/src/views/Status/components/JsonEditor/JsonEditor.css @@ -0,0 +1,12 @@ +.editor { + width: 100%; + height: 200px; +} + +.error { + border: 1px solid red !important; +} + +.errorMsg { + color: red; +} diff --git a/js/src/views/Status/components/JsonEditor/JsonEditor.js b/js/src/views/Status/components/JsonEditor/JsonEditor.js new file mode 100644 index 00000000000..32331c7b71f --- /dev/null +++ b/js/src/views/Status/components/JsonEditor/JsonEditor.js @@ -0,0 +1,83 @@ + +import React, { Component, PropTypes } from 'react'; +import { isEqual } from 'lodash'; +import formatJson from 'format-json'; + +import styles from './JsonEditor.css'; + +export default class JsonEditor extends Component { + + constructor (...args) { + super(...args); + let { value } = this.props; + value = formatJson.plain(value); + this.state = { value }; + } + + componentDidMount () { + const mockedEvt = { target: { value: this.state.value } }; + this.onChange(mockedEvt); + } + + componentWillReceiveProps (nextProps) { + let { value } = nextProps; + + if (!isEqual(value, this.props.value)) { + value = formatJson.plain(value); + this.setState({ value }); + } + } + + render () { + let errorClass = this.state.error ? styles.error : ''; + + return ( + <div className='row'> + <textarea + onChange={ this.onChange } + className={ `${styles.editor} ${errorClass}` } + value={ this.state.value } + /> + { this.renderError() } + </div> + ); + } + + renderError () { + const { error } = this.state; + if (!error) { + return; + } + + return ( + <div className={ styles.errorMsg }>{ error }</div> + ); + } + + onChange = evt => { + const { value } = evt.target; + let parsed; + let error; + + try { + parsed = JSON.parse(value); + error = null; + } catch (err) { + parsed = null; + error = 'invalid json'; + } + + this.setState({ + value, + error + }); + + this.props.onChange(parsed, error); + } + + static propTypes = { + onChange: PropTypes.func.isRequired, + value: PropTypes.object + } + +} diff --git a/js/src/views/Status/components/JsonEditor/index.js b/js/src/views/Status/components/JsonEditor/index.js new file mode 100644 index 00000000000..d89d7dea1cd --- /dev/null +++ b/js/src/views/Status/components/JsonEditor/index.js @@ -0,0 +1 @@ +export default from './JsonEditor'; diff --git a/js/src/views/Status/components/Markdown/Markdown.css b/js/src/views/Status/components/Markdown/Markdown.css new file mode 100644 index 00000000000..3ea6f999257 --- /dev/null +++ b/js/src/views/Status/components/Markdown/Markdown.css @@ -0,0 +1,4 @@ +.container li { + display: list-item; + line-height: 1.6; +} \ No newline at end of file diff --git a/js/src/views/Status/components/Markdown/Markdown.js b/js/src/views/Status/components/Markdown/Markdown.js new file mode 100644 index 00000000000..5333e6e127a --- /dev/null +++ b/js/src/views/Status/components/Markdown/Markdown.js @@ -0,0 +1,43 @@ + +import marked from 'marked'; +import React, { Component, PropTypes } from 'react'; +import styles from './Markdown.css'; + +export default class Marked extends Component { + + state = {} + + render () { + let { parsed } = this.state; + if (!parsed) { + return null; + } + return <div className={ styles.container } style={ this.props.style } dangerouslySetInnerHTML={ { __html: parsed } } />; + } + + componentWillMount () { + this.setState({ parsed: this.parse(this.props.val) }); + } + + componentWillReceiveProps (newProps) { + if (newProps.val === this.props.val) { + return; + } + this.setState({ parsed: this.parse(newProps.val) }); + } + + parse (val) { + try { + val = marked(val); + } catch (err) { + console.error(`Marked error when parsing ${val}: ${err}`); + } + return val; + } + + static propTypes = { + val: PropTypes.any, + style: PropTypes.object + } + +} diff --git a/js/src/views/Status/components/Markdown/index.js b/js/src/views/Status/components/Markdown/index.js new file mode 100644 index 00000000000..4d647107aa8 --- /dev/null +++ b/js/src/views/Status/components/Markdown/index.js @@ -0,0 +1 @@ +export default from './Markdown'; diff --git a/js/src/views/Status/components/MiningSettings/MiningSettings.js b/js/src/views/Status/components/MiningSettings/MiningSettings.js new file mode 100644 index 00000000000..b429faddd2b --- /dev/null +++ b/js/src/views/Status/components/MiningSettings/MiningSettings.js @@ -0,0 +1,87 @@ +import React, { Component, PropTypes } from 'react'; + +import formatNumber from 'format-number'; +import Value from '../Value'; +import { numberFromString } from './numberFromString'; +import { decodeExtraData } from './decodeExtraData'; + +const toNiceNumber = formatNumber(); + +export default class MiningSettings extends Component { + + render () { + const { statusMining, actions } = this.props; + + let onMinGasPriceChange = newVal => { + actions.modifyMinGasPrice(numberFromString(newVal)); + }; + + let onExtraDataChange = (newVal, isResetToDefault) => { + // In case of resetting to default we are just using raw bytes from defaultExtraData + // When user sets new value we can safely send a string that will be converted to hex by formatter. + const val = isResetToDefault ? statusMining.defaultExtraData : newVal; + actions.modifyExtraData(val); + }; + + let onAuthorChange = newVal => { + actions.modifyAuthor(newVal); + }; + + let onGasFloorTargetChange = newVal => { + actions.modifyGasFloorTarget(numberFromString(newVal)); + }; + + return ( + <div { ...this._testInherit() }> + <h1><span>Mining</span> settings</h1> + <h3>Author</h3> + <Value + value={ statusMining.author } + autocomplete + dataSource={ this.props.accounts } + onSubmit={ onAuthorChange } + { ...this._test('author') } + /> + <h3>Extradata</h3> + <Value + value={ decodeExtraData(statusMining.extraData) } + onSubmit={ onExtraDataChange } + defaultValue={ decodeExtraData(statusMining.defaultExtraData) } + { ...this._test('extra-data') } + /> + <h3>Minimal Gas Price</h3> + <Value + value={ toNiceNumber(statusMining.minGasPrice) } + onSubmit={ onMinGasPriceChange } + { ...this._test('min-gas-price') } + /> + <h3>Gas floor target</h3> + <Value + value={ toNiceNumber(statusMining.gasFloorTarget) } + onSubmit={ onGasFloorTargetChange } + { ...this._test('gas-floor-target') } + /> + </div> + ); + } + + static propTypes = { + accounts: PropTypes.arrayOf(PropTypes.string).isRequired, + version: PropTypes.string.isRequired, + statusMining: PropTypes.shape({ + author: PropTypes.string.isRequired, + extraData: PropTypes.string.isRequired, + defaultExtraData: PropTypes.string.isRequired, + minGasPrice: PropTypes.string.isRequired, + gasFloorTarget: PropTypes.string.isRequired + }).isRequired, + actions: PropTypes.shape({ + modifyMinGasPrice: PropTypes.func.isRequired, + modifyAuthor: PropTypes.func.isRequired, + modifyGasFloorTarget: PropTypes.func.isRequired, + modifyExtraData: PropTypes.func.isRequired, + resetExtraData: PropTypes.func.isRequired + }).isRequired + } + +} diff --git a/js/src/views/Status/components/MiningSettings/decodeExtraData.js b/js/src/views/Status/components/MiningSettings/decodeExtraData.js new file mode 100644 index 00000000000..5ed40a5e727 --- /dev/null +++ b/js/src/views/Status/components/MiningSettings/decodeExtraData.js @@ -0,0 +1,17 @@ +import rlp from 'rlp'; + +export function decodeExtraData (str) { + try { + // Try decoding as RLP + const decoded = rlp.decode(str); + const v = decoded[0]; + decoded[0] = decoded[1]; + decoded[1] = `${v[0]}.${v[1]}.${v[2]}`; + return decoded.join('/'); + } catch (err) { + // hex -> str + return str.match(/.{1,2}/g).map(v => { + return String.fromCharCode(parseInt(v, 16)); + }).join(''); + } +} diff --git a/js/src/views/Status/components/MiningSettings/decodeExtraData.spec.js b/js/src/views/Status/components/MiningSettings/decodeExtraData.spec.js new file mode 100644 index 00000000000..4eaa5bdbfbf --- /dev/null +++ b/js/src/views/Status/components/MiningSettings/decodeExtraData.spec.js @@ -0,0 +1,12 @@ +import { decodeExtraData } from './decodeExtraData'; + +describe('MINING SETTINGS', () => { + describe('EXTRA DATA', () => { + const str = 'parity/1.0.0/1.0.0-beta2'; + const encoded = '0xd783010000867061726974798b312e302e302d6265746132'; + + it('should decode encoded to str', () => { + expect(decodeExtraData(encoded)).to.equal(str); + }); + }); +}); diff --git a/js/src/views/Status/components/MiningSettings/index.js b/js/src/views/Status/components/MiningSettings/index.js new file mode 100644 index 00000000000..d1ce56d820a --- /dev/null +++ b/js/src/views/Status/components/MiningSettings/index.js @@ -0,0 +1 @@ +export default from './MiningSettings'; diff --git a/js/src/views/Status/components/MiningSettings/numberFromString.js b/js/src/views/Status/components/MiningSettings/numberFromString.js new file mode 100644 index 00000000000..6c29eb880ec --- /dev/null +++ b/js/src/views/Status/components/MiningSettings/numberFromString.js @@ -0,0 +1,9 @@ +export function numberFromString (val) { + return parseInt( + val + .replace(/m/ig, 'k') + .replace(/k/ig, '000') + .replace(/[^0-9]/g, '') + , 10 + ); +} diff --git a/js/src/views/Status/components/MiningSettings/numberFromString.spec.js b/js/src/views/Status/components/MiningSettings/numberFromString.spec.js new file mode 100644 index 00000000000..537013a4260 --- /dev/null +++ b/js/src/views/Status/components/MiningSettings/numberFromString.spec.js @@ -0,0 +1,20 @@ +import { numberFromString } from './numberFromString'; + +describe('NUMBER FROM STRING', () => { + it('should convert string to number', () => { + expect(numberFromString('12345'), 12345); + }); + + it('should handle special characters "k" and "m"', () => { + expect(numberFromString('10kk'), 10000000); + expect(numberFromString('10K'), 1000); + expect(numberFromString('10Mmk'), 1000000000000000); + }); + + it('should ignore any non-numeric characters', () => { + expect(numberFromString('10.000.000'), 10000000); + expect(numberFromString('10_000_000'), 10000000); + expect(numberFromString('10_k_k'), 10000000); + expect(numberFromString('-5'), 5); + }); +}); diff --git a/js/src/views/Status/components/MuiThemeProvider/MuiThemeProvider.js b/js/src/views/Status/components/MuiThemeProvider/MuiThemeProvider.js new file mode 100644 index 00000000000..ea644d48d6e --- /dev/null +++ b/js/src/views/Status/components/MuiThemeProvider/MuiThemeProvider.js @@ -0,0 +1,36 @@ + +import React, { Component, PropTypes } from 'react'; +import injectTapEventPlugin from 'react-tap-event-plugin'; +// Needed for onTouchTap, for material ui +// http://stackoverflow.com/a/34015469/988941 +injectTapEventPlugin(); + +import { deepOrange500 } from 'material-ui/styles/colors'; +import getMuiTheme from 'material-ui/styles/getMuiTheme'; +import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; + +const muiTheme = getMuiTheme({ + fontFamily: '"Source Sans Pro", "Helvetica Neue", arial, sans-serif', + palette: { + primary1Color: '#6691C2', + accent1Color: deepOrange500 + } +}); + +export default class WrappedMuiThemeProvider extends Component { + + render () { + return ( + <MuiThemeProvider muiTheme={ muiTheme }> + { this.props.children && React.cloneElement(this.props.children, { + ...this.props + }) } + </MuiThemeProvider> + ); + } + + static propTypes = { + children: PropTypes.object.isRequired + } + +} diff --git a/js/src/views/Status/components/MuiThemeProvider/index.js b/js/src/views/Status/components/MuiThemeProvider/index.js new file mode 100644 index 00000000000..84638ececa8 --- /dev/null +++ b/js/src/views/Status/components/MuiThemeProvider/index.js @@ -0,0 +1 @@ +export default from './MuiThemeProvider'; diff --git a/js/src/views/Status/components/Response/Response.css b/js/src/views/Status/components/Response/Response.css new file mode 100644 index 00000000000..81489380f39 --- /dev/null +++ b/js/src/views/Status/components/Response/Response.css @@ -0,0 +1,4 @@ +.response { + white-space: nowrap; + overflow-x: auto; +} diff --git a/js/src/views/Status/components/Response/Response.js b/js/src/views/Status/components/Response/Response.js new file mode 100644 index 00000000000..0db94280f3b --- /dev/null +++ b/js/src/views/Status/components/Response/Response.js @@ -0,0 +1,50 @@ + +import React, { Component, PropTypes } from 'react'; +import { isArray, isPlainObject } from 'lodash'; + +import styles from './Response.css'; + +export default class Response extends Component { + + render () { + let { response } = this.props; + let formatted; + + if (isArray(response)) { + formatted = this.renderArray(); + } + if (isPlainObject(response)) { + formatted = this.renderObject(); + } + + return <pre className={ styles.response }>{ formatted || response }</pre>; + } + + renderArray () { + let { response } = this.props; + return response.map((r, idx) => ( + <span key={ idx }> + { idx === 0 ? '[' : ',' } + { idx === 0 ? '' : <br /> } + { r } + { idx === response.length - 1 ? ']' : '' } + </span> + )); + } + + renderObject () { + let { response } = this.props; + const arr = JSON.stringify(response, null, 1).split('\n'); + return arr.map((any, idx) => ( + <span key={ idx }> + { any } + { idx !== 0 && idx !== arr.length - 1 ? <br /> : '' } + </span> + )); + } + + static propTypes = { + response: PropTypes.any.isRequired + } + +} diff --git a/js/src/views/Status/components/Response/Response.spec.js b/js/src/views/Status/components/Response/Response.spec.js new file mode 100644 index 00000000000..be821187049 --- /dev/null +++ b/js/src/views/Status/components/Response/Response.spec.js @@ -0,0 +1,31 @@ +import React from 'react'; +import { shallow } from 'enzyme'; + +import '../../env-specific/tests'; + +import Response from './Response'; + +describe('components/Response', () => { + describe('rendering', () => { + it('renders non-arrays/non-objects exactly as received', () => { + const TEST = '1234567890'; + const rendered = shallow(<Response response={ TEST } />); + + expect(rendered).to.have.html(`<pre>${TEST}</pre>`); + }); + + it('renders arrays properly with index and value', () => { + const TEST = ['123', '456']; + const rendered = shallow(<Response response={ TEST } />); + + expect(rendered).to.have.html('<pre><span>[123</span><span>,<br/>456]</span></pre>'); + }); + + it('renders objects properly with key and value', () => { + const TEST = { foo: '123', bar: '456' }; + const rendered = shallow(<Response response={ TEST } />); + + expect(rendered).to.have.html('<pre><span>{</span><span> "foo": "123",<br/></span><span> "bar": "456"<br/></span><span>}</span></pre>'); + }); + }); +}); diff --git a/js/src/views/Status/components/Response/index.js b/js/src/views/Status/components/Response/index.js new file mode 100644 index 00000000000..332abbde0b5 --- /dev/null +++ b/js/src/views/Status/components/Response/index.js @@ -0,0 +1 @@ +export default from './Response'; diff --git a/js/src/views/Status/components/RpcCalls/RpcCalls.css b/js/src/views/Status/components/RpcCalls/RpcCalls.css new file mode 100644 index 00000000000..df044a97aea --- /dev/null +++ b/js/src/views/Status/components/RpcCalls/RpcCalls.css @@ -0,0 +1,17 @@ + +.header { + margin: 0; +} + +.input { + width: 100%; +} + +h3 + label > input { + margin-top: 0; +} + +.jsonToggle { + width: auto !important; + float: right; +} diff --git a/js/src/views/Status/components/RpcCalls/RpcCalls.js b/js/src/views/Status/components/RpcCalls/RpcCalls.js new file mode 100644 index 00000000000..bbdafe44814 --- /dev/null +++ b/js/src/views/Status/components/RpcCalls/RpcCalls.js @@ -0,0 +1,322 @@ + +import React, { Component, PropTypes } from 'react'; +import _ from 'lodash'; + +import Toggle from 'material-ui/Toggle/Toggle'; +import TextField from 'material-ui/TextField'; +import { RpcAutoComplete } from 'dapps-react-components'; +import { formatRpcMd } from '../../util/rpc-md'; +import AnimateChildren from '../../components-compositors/Animated/children'; +import JsonEditor from '../JsonEditor'; +import Calls from '../Calls'; +import Markdown from '../Markdown'; +import styles from './RpcCalls.css'; +import rpcData from '../../data/rpc.json'; +import RpcNav from '../RpcNav'; + +const rpcMethods = _.sortBy(rpcData.methods, 'name'); + +export default class RpcCalls extends Component { + + state = {}; + + componentWillReceiveProps (nextProps) { + const { paramsValues, params } = nextProps.rpc.selectedMethod; + if (paramsValues) { + params.map((p, idx) => { + // todo [adgo] 01.05.2016 - make sure this works + // not sure idx is the same for paramsValues and params + this.setState({ + [this.paramKey(p)]: paramsValues[idx] + }); + }); + + if (this.state.jsonMode) { + this.setJsonEditorValue(); + } + } + } + + render () { + return ( + <div className='dapp-flex-content'> + <main className='dapp-content'> + <div className='dapp-container'> + <div className='row'> + <div className='col col-6'> + <h1><span>RPC</span> Requests</h1> + </div> + <div className='col col-6'> + <RpcNav /> + </div> + </div> + </div> + <div style={ { clear: 'both' } }></div> + <div className='dapp-container'> + <div className='row'> + <div className='col col-6 mobile-full'> + { this.renderForm() } + </div> + <div className='col col-6 mobile-full'> + <Calls + calls={ this.props.rpc.prevCalls } + reset={ this.props.actions.resetRpcPrevCalls } + actions={ this.props.actions } + /> + </div> + </div> + </div> + </main> + </div> + ); + } + + renderForm () { + return ( + <div> + <Toggle + className={ styles.jsonToggle } + onToggle={ this.onJsonToggle } + label='JSON' + /> + <h2 className={ styles.header }> + <label htmlFor='selectedMethod'> + Call Method + </label> + </h2> + <AnimateChildren absolute> + { this.renderJsonForm() } + { this.renderInputForm() } + </AnimateChildren> + </div> + ); + } + + renderInputForm () { + if (this.state.jsonMode) { + return; + } + + const { returns } = this.props.rpc.selectedMethod; + return ( + <div className='row'> + { this.renderMethodList() } + <h3>Parameters</h3> + { this.renderInputs() } + <h3>Returns</h3> + <Markdown val={ formatRpcMd(returns) } /> + { this.renderFormButton() } + </div> + ); + } + + renderMethodList () { + const { desc } = this.props.rpc.selectedMethod; + return ( + <div> + <RpcAutoComplete + style={ { marginTop: 0 } } + onNewRequest={ this.handleMethodChange } + { ...this._test('rpcAutoComplete') } + /> + <div> + <Markdown val={ desc } /> + </div> + </div> + ); + } + + handleMethodChange = name => { + const method = rpcMethods.find(m => m.name === name); + this.props.actions.selectRpcMethod(method); + } + + onRpcFire = () => { + if (this.state.jsonMode) { + return this.onCustomRpcFire(); + } + + let { name, params, outputFormatter, inputFormatters } = this.props.rpc.selectedMethod; + params = params.map(this.jsonParamValue); + + this.props.actions.fireRpc({ + method: name, + outputFormatter, + inputFormatters, + params + }); + } + + onCustomRpcFire () { + const { method, params } = this.state.jsonEditorParsedValue; + this.props.actions.fireRpc({ method, params }); + } + + renderInputs () { + let { params, name } = this.props.rpc.selectedMethod; + + if (!params || !params.length) { + return ( + <span>none</span> + ); + } + + return _.find(rpcMethods, { name }) + .params.map( + p => { + const onChange = evt => this.setState({ + [this.paramKey(p)]: evt.target.value + }); + + if (_.isPlainObject(p)) { + return this.renderObjInputs(p); + } + + return ( + <TextField + key={ p } + inputStyle={ { marginTop: 0 } } + fullWidth + hintText={ p } + title={ p } + hintStyle={ { maxWidth: '100%', overflow: 'hidden', whiteSpace: 'nowrap' } } + value={ this.paramValue(p) } + onChange={ onChange } + { ...this._test(this.paramKey(p)) } + /> + ); + } + ); + } + + renderObjInputs (param) { + const { description, details } = param; + + return ( + <div> + <Markdown val={ description } /> + <ul> + { Object.keys(details).map(k => { + const onChange = evt => this.setState({ + [this.paramKey(`${description}.${k}`)]: evt.target.value + }); + + return ( + <li key={ k }> + <TextField + inputStyle={ { marginTop: 0 } } + fullWidth + title={ `${k}: ${details[k]}` } + hintText={ `${k}: ${details[k]}` } + hintStyle={ { maxWidth: '100%', overflow: 'hidden', whiteSpace: 'nowrap' } } + value={ this.paramValue(`${description}.${k}`) } + onChange={ onChange } + { ...this._test(this.paramKey(k)) } + /> + </li> + ); + }) } + </ul> + </div> + ); + } + + setJsonEditorValue () { + const { name, params } = this.props.rpc.selectedMethod; + const json = { + method: name, + params: params.map(this.jsonParamValue) + }; + this.setState({ + jsonEditorValue: json + }); + } + + onJsonToggle = () => { + if (!this.state.jsonMode) { + this.setJsonEditorValue(); + } + this.setState({ jsonMode: !this.state.jsonMode }); + } + + renderJsonForm () { + if (!this.state.jsonMode) { + return; + } + + return ( + <div> + <JsonEditor + onChange={ this.onJsonEditorChange } + value={ this.state.jsonEditorValue } + /> + { this.renderFormButton() } + </div> + ); + } + + renderFormButton () { + return ( + <button + { ...this._test('fireRpc') } + className={ 'dapp-block-button' } + disabled={ this.state.jsonEditorError } + onClick={ this.onRpcFire } + > + Fire! + </button> + ); + } + + onJsonEditorChange = (jsonEditorParsedValue, jsonEditorError) => { + this.setState({ + jsonEditorParsedValue, + jsonEditorError + }); + } + + jsonParamValue = p => { + if (_.isPlainObject(p)) { + const { description, details } = p; + return Object.keys(details).reduce((obj, key) => { + obj[key] = this.paramValue(`${description}.${key}`); + return obj; + }, {}); + } + + return this.paramValue(p); + } + + paramValue (p) { + return this.state[this.paramKey(p)]; + } + + paramKey (p) { + return `params_${p}`; + } + + selectedMethodChanged (nextProps) { + return nextProps.rpc.selectedMethod.name !== this.props.rpc.selectedMethod.name; + } + + stateChanged (nextState) { + return !_.isEqual(nextState, this.state); + } + + prevCallsChanged (nextProps) { + return nextProps.rpc.prevCalls.length !== this.props.rpc.prevCalls.length; + } + + static propTypes = { + rpc: PropTypes.shape({ + prevCalls: PropTypes.array.isRequired, + selectedMethod: PropTypes.object.isRequired + }).isRequired, + actions: PropTypes.shape({ + fireRpc: PropTypes.func.isRequired, + selectRpcMethod: PropTypes.func.isRequired, + resetRpcPrevCalls: PropTypes.func.isRequired + }).isRequired + } + +} diff --git a/js/src/views/Status/components/RpcCalls/index.js b/js/src/views/Status/components/RpcCalls/index.js new file mode 100644 index 00000000000..661c859d949 --- /dev/null +++ b/js/src/views/Status/components/RpcCalls/index.js @@ -0,0 +1 @@ +export default from './RpcCalls'; diff --git a/js/src/views/Status/components/RpcDocs/RpcDocs.css b/js/src/views/Status/components/RpcDocs/RpcDocs.css new file mode 100644 index 00000000000..8aa504f0b98 --- /dev/null +++ b/js/src/views/Status/components/RpcDocs/RpcDocs.css @@ -0,0 +1,19 @@ +.autocomplete { + margin-top: 0 !important; +} + +.headline { + text-transform: none; +} + +.returnsTitle { + display: 'inline'; +} + +.returnsDesc { + display: inline-block; +} + +hr { + margin-bottom: 0; +} diff --git a/js/src/views/Status/components/RpcDocs/RpcDocs.js b/js/src/views/Status/components/RpcDocs/RpcDocs.js new file mode 100644 index 00000000000..f37d1f066fa --- /dev/null +++ b/js/src/views/Status/components/RpcDocs/RpcDocs.js @@ -0,0 +1,89 @@ + +import React, { Component } from 'react'; +import ReactDOM from 'react-dom'; +import { sortBy } from 'lodash'; +import List from 'material-ui/List/List'; +import ListItem from 'material-ui/List/ListItem'; +import AutoComplete from '../AutoComplete'; + +import { formatRpcMd } from '../../util/rpc-md'; +import ScrollTopButton from '../ScrollTopButton'; +import styles from './RpcDocs.css'; +import Markdown from '../Markdown'; +import rpcData from '../../data/rpc.json'; +import RpcNav from '../RpcNav'; + +const rpcMethods = sortBy(rpcData.methods, 'name'); + +class RpcDocs extends Component { + + render () { + return ( + <div className='dapp-flex-content'> + <main className='dapp-content'> + <div className='dapp-container'> + <div className='row'> + <div className='col col-6'> + <h1><span>RPC</span> Docs</h1> + </div> + <div className='col col-6'> + <RpcNav /> + </div> + </div> + </div> + <div style={ { clear: 'both' } }></div> + <div className='dapp-container'> + <div className='row'> + <div className='col col-12'> + <AutoComplete + floatingLabelText='Method name' + className={ styles.autocomplete } + dataSource={ rpcMethods.map(m => m.name) } + onNewRequest={ this.handleMethodChange } + { ...this._test('autocomplete') } + /> + { this.renderData() } + </div> + </div> + </div> + <ScrollTopButton /> + </main> + </div> + ); + } + + renderData () { + const methods = rpcMethods.map((m, idx) => { + const setMethod = el => { this[`_method-${m.name}`] = el; }; + + return ( + <ListItem + key={ m.name } + disabled + ref={ setMethod } + > + <h3 className={ styles.headline }>{ m.name }</h3> + <Markdown val={ m.desc } /> + <p><strong>Params</strong>{ !m.params.length ? ' - none' : '' }</p> + { m.params.map((p, idx) => <Markdown key={ `${m.name}-${idx}` } val={ formatRpcMd(p) } />) } + <p className={ styles.returnsTitle }><strong>Returns</strong> - </p> + <Markdown className={ styles.returnsDesc } val={ formatRpcMd(m.returns) } /> + { idx !== rpcMethods.length - 1 ? <hr /> : '' } + </ListItem> + ); + }); + + return ( + <List> + { methods } + </List> + ); + } + + handleMethodChange = name => { + ReactDOM.findDOMNode(this[`_method-${name}`]).scrollIntoViewIfNeeded(); + } + +} + +export default RpcDocs; diff --git a/js/src/views/Status/components/RpcDocs/index.js b/js/src/views/Status/components/RpcDocs/index.js new file mode 100644 index 00000000000..94453e56d99 --- /dev/null +++ b/js/src/views/Status/components/RpcDocs/index.js @@ -0,0 +1 @@ +export default from './RpcDocs'; diff --git a/js/src/views/Status/components/RpcNav/RpcNav.css b/js/src/views/Status/components/RpcNav/RpcNav.css new file mode 100644 index 00000000000..68036aa966e --- /dev/null +++ b/js/src/views/Status/components/RpcNav/RpcNav.css @@ -0,0 +1,12 @@ +.nav { + font-size: 20px; + float: right; +} + +.activeNav { + color: #b7a6a6 !important; +} + +.nav a:not(:first-child) { + margin-left: 30px; +} \ No newline at end of file diff --git a/js/src/views/Status/components/RpcNav/RpcNav.js b/js/src/views/Status/components/RpcNav/RpcNav.js new file mode 100644 index 00000000000..73f20b2d5c1 --- /dev/null +++ b/js/src/views/Status/components/RpcNav/RpcNav.js @@ -0,0 +1,20 @@ + +import React, { Component } from 'react'; +import { Link } from 'react-router'; +import styles from './RpcNav.css'; + +export default class RpcNav extends Component { + + render () { + return ( + <div className={ styles.nav }> + <Link to={ '/rpc/calls' } activeClassName={ styles.activeNav } { ...this._test('rpc-calls-link') }> + <i className='icon-call-out'></i> + </Link> + <Link to={ '/rpc/docs' } activeClassName={ styles.activeNav } { ...this._test('rpc-docs-link') }> + <i className='icon-docs'></i> + </Link> + </div> + ); + } +} diff --git a/js/src/views/Status/components/RpcNav/index.js b/js/src/views/Status/components/RpcNav/index.js new file mode 100644 index 00000000000..d3db26cb395 --- /dev/null +++ b/js/src/views/Status/components/RpcNav/index.js @@ -0,0 +1 @@ +export default from './RpcNav'; diff --git a/js/src/views/Status/components/ScrollTopButton/ScrollTopButton.css b/js/src/views/Status/components/ScrollTopButton/ScrollTopButton.css new file mode 100644 index 00000000000..466358ea0cf --- /dev/null +++ b/js/src/views/Status/components/ScrollTopButton/ScrollTopButton.css @@ -0,0 +1,26 @@ + +.scrollButton { + position: fixed !important; + bottom: 35px !important; + right: 0; + left: 0; + margin-right: auto; + margin-left: auto; + animation: fadein .5s; + background: #eee !important; + border-radius: 50%; + border: 1px solid #6691C2 !important; + z-index: 10; + padding: 5px !important; + width: 34px !important; + height: 34px !important; +} + +@keyframes fadein { + from { opacity: 0; } + to { opacity: 1; } +} + +.hidden { + display: none !important; +} diff --git a/js/src/views/Status/components/ScrollTopButton/ScrollTopButton.js b/js/src/views/Status/components/ScrollTopButton/ScrollTopButton.js new file mode 100644 index 00000000000..2b6928f9ccd --- /dev/null +++ b/js/src/views/Status/components/ScrollTopButton/ScrollTopButton.js @@ -0,0 +1,56 @@ + +import React, { Component } from 'react'; +import IconButton from 'material-ui/IconButton'; +import ArrowUpwardIcon from 'material-ui/svg-icons/navigation/arrow-upward'; + +import { scrollTo } from './util'; +import styles from './ScrollTopButton.css'; + +const scrollTopThreshold = 600; + +export default class ScrollTopButton extends Component { + + state = {} + + componentDidMount () { + window.addEventListener('scroll', this.handleScroll); + } + + componentWillUnmount () { + window.removeEventListener('scroll', this.handleScroll); + } + + _scrollToTop () { + scrollTo(document.body, 0, 500); + } + + render () { + let hiddenClass = !this.state.showScrollButton ? styles.hidden : ''; + + return ( + <IconButton + className={ `${styles.scrollButton} ${hiddenClass}` } + onClick={ this._scrollToTop }> + <ArrowUpwardIcon /> + </IconButton> + ); + } + + handleScroll = event => { + let { scrollTop } = event.srcElement.body; + let { showScrollButton } = this.state; + + if (!showScrollButton && scrollTop > scrollTopThreshold) { + this.setState({ + showScrollButton: true + }); + } + + if (showScrollButton && scrollTop < scrollTopThreshold) { + this.setState({ + showScrollButton: false + }); + } + } + +} diff --git a/js/src/views/Status/components/ScrollTopButton/index.js b/js/src/views/Status/components/ScrollTopButton/index.js new file mode 100644 index 00000000000..4cc21f04fc5 --- /dev/null +++ b/js/src/views/Status/components/ScrollTopButton/index.js @@ -0,0 +1 @@ +export default from './ScrollTopButton'; diff --git a/js/src/views/Status/components/ScrollTopButton/util.js b/js/src/views/Status/components/ScrollTopButton/util.js new file mode 100644 index 00000000000..412ac8ead00 --- /dev/null +++ b/js/src/views/Status/components/ScrollTopButton/util.js @@ -0,0 +1,32 @@ + +export function scrollTo (element, to, duration) { + let start = element.scrollTop; + let change = to - start; + let increment = 50; + + let animateScroll = elapsedTime => { + elapsedTime += increment; + let position = easeInOut(elapsedTime, start, change, duration); + element.scrollTop = position; + if (elapsedTime < duration) { + setTimeout(() => { + // stop if user scrolled + if (element.scrollTop !== parseInt(position, 10)) { + return; + } + animateScroll(elapsedTime); + }, increment); + } + }; + + animateScroll(0); +} + +export function easeInOut (currentTime, start, change, duration) { + currentTime /= duration / 2; + if (currentTime < 1) { + return change / 2 * currentTime * currentTime + start; + } + currentTime -= 1; + return -change / 2 * (currentTime * (currentTime - 2) - 1) + start; +} diff --git a/js/src/views/Status/components/Status/Status.css b/js/src/views/Status/components/Status/Status.css new file mode 100644 index 00000000000..87edf66e4e2 --- /dev/null +++ b/js/src/views/Status/components/Status/Status.css @@ -0,0 +1,10 @@ + +.row { + margin-left: -10px; + margin-right: -10px; +} +.row::after { + display: table; + clear: both; + content: ''; +} diff --git a/js/src/views/Status/components/Status/Status.js b/js/src/views/Status/components/Status/Status.js new file mode 100644 index 00000000000..4a5472f0cfc --- /dev/null +++ b/js/src/views/Status/components/Status/Status.js @@ -0,0 +1,131 @@ + +import React, { Component, PropTypes } from 'react'; +import formatNumber from 'format-number'; +import bytes from 'bytes'; + +import styles from './Status.css'; +import Value from '../Value'; +import MiningSettings from '../MiningSettings'; + +export default class Status extends Component { + static propTypes = { + statusMining: PropTypes.object.isRequired, + statusSettings: PropTypes.shape({ + chain: PropTypes.string.isRequired, + networkPort: PropTypes.number.isRequired, + maxPeers: PropTypes.number.isRequired, + rpcEnabled: PropTypes.bool.isRequired, + rpcInterface: PropTypes.string.isRequired, + rpcPort: PropTypes.number.isRequired + }).isRequired, + status: PropTypes.shape({ + name: PropTypes.string, + version: PropTypes.string.isRequired, + bestBlock: PropTypes.string.isRequired, + hashrate: PropTypes.string.isRequired, + accounts: PropTypes.arrayOf(PropTypes.string).isRequired, + peers: PropTypes.number.isRequired + }).isRequired, + actions: PropTypes.object.isRequired + } + + renderNodeName () { + const { status } = this.props; + return ( + <span> + { status.name || 'Node' } + </span> + ); + } + + renderSettings () { + const { status, statusSettings } = this.props; + return ( + <div { ...this._test('settings') }> + <h1><span>Network</span> settings</h1> + <h3>Chain</h3> + <Value + value={ statusSettings.chain } + { ...this._test('chain') } + /> + <div className={ styles.row }> + <div className='col col-6 mobile-full'> + <h3>Peers</h3> + <Value + value={ `${status.activePeers}/${status.connectedPeers}/${statusSettings.maxPeers}` } + { ...this._test('peers') } + /> + </div> + <div className='col col-6 mobile-full'> + <h3>Network port</h3> + <Value + value={ statusSettings.networkPort } + { ...this._test('network-port') } + /> + </div> + </div> + + <h3>RPC Enabled</h3> + <Value + value={ statusSettings.rpcEnabled ? 'yes' : 'no' } + { ...this._test('rpc-enabled') } + /> + <div className={ styles.row }> + <div className='col col-6 mobile-full'> + <h3>RPC Interface</h3> + <Value + value={ statusSettings.rpcInterface } + { ...this._test('rpc-interface') } + /> + </div> + <div className='col col-6 mobile-full'> + <h3>RPC Port</h3> + <Value + value={ statusSettings.rpcPort } + { ...this._test('rpc-port') } + /> + </div> + </div> + </div> + ); + } + + render () { + const { status } = this.props; + const bestBlock = formatNumber()(status.bestBlock); + const hashrate = bytes(status.hashrate) || 0; + + return ( + <div className='dapp-flex-content'> + <main className='dapp-content'> + <div className='dapp-container'> + <div className='row clear'> + <div className='col col-3 tablet-full mobile-full'> + <div className='col col-12 tablet-col-1-2 mobile-full'> + <h1><span>Best</span> Block</h1> + <h1 { ...this._test('best-block') }>#{ bestBlock }</h1> + </div> + <div className='col col-12 tablet-col-1-2 mobile-full'> + <h1><span>Hash</span> Rate</h1> + <h1 { ...this._test('hashrate') }>{ `${hashrate} H/s` }</h1> + </div> + </div> + <div className='col col-5 tablet-col-1-2 mobile-full'> + <MiningSettings + { ...this._test('mining') } + statusMining={ this.props.statusMining } + accounts={ this.props.status.accounts } + actions={ this.props.actions } + version={ this.props.status.version } + /> + </div> + <div className='col col-4 tablet-col-1-2 mobile-full'> + { this.renderSettings() } + </div> + </div> + </div> + </main> + </div> + ); + } +} diff --git a/js/src/views/Status/components/Status/index.js b/js/src/views/Status/components/Status/index.js new file mode 100644 index 00000000000..64bb387b2cf --- /dev/null +++ b/js/src/views/Status/components/Status/index.js @@ -0,0 +1 @@ +export default from './Status'; diff --git a/js/src/views/Status/components/ToastrContainer/ToastrContainer.css b/js/src/views/Status/components/ToastrContainer/ToastrContainer.css new file mode 100644 index 00000000000..34497faed43 --- /dev/null +++ b/js/src/views/Status/components/ToastrContainer/ToastrContainer.css @@ -0,0 +1,45 @@ +.toastrContainer { + position: absolute; + top: 81px; + right: 10px; + width: 200px; +} + +.toast { + padding: 10px; + position: relative; + font-size: 16px; + margin-bottom: 10px; + animation: fadein .5s; +} + +.error { + background: red !important; + color: #fff !important; +} + +.succes { + background: green !important; + color: #fff !important; +} + +.remove { + float: right; + cursor: pointer; +} + +.error .remove, +.success .remove { + color: #fff !important; +} + +.msg { + color: #000; + font-size: 18px; + text-shadow: 0px 0px 2px rgb(103, 103, 103); +} + +@keyframes fadein { + from {opacity: 0;} + to {opacity: 1;} +} diff --git a/js/src/views/Status/components/ToastrContainer/ToastrContainer.js b/js/src/views/Status/components/ToastrContainer/ToastrContainer.js new file mode 100644 index 00000000000..54e15701328 --- /dev/null +++ b/js/src/views/Status/components/ToastrContainer/ToastrContainer.js @@ -0,0 +1,46 @@ + +import React, { Component, PropTypes } from 'react'; +import Paper from 'material-ui/Paper'; + +import styles from './ToastrContainer.css'; + +export default class ToastrContainer extends Component { + + render () { + return ( + <div className={ styles.toastrContainer }> + { this.renderToasts() } + </div> + ); + } + + renderToasts () { + return this.props.statusToastr.toasts.map(t => { + const removeToast = () => this.props.actions.removeToast(t.toastNo); + + return ( + <Paper + className={ `${styles.toast} ${styles[t.type]}` } + zDepth={ 2 } + key={ t.toastNo } + { ...this._test(`toast-${t.toastNo}`) } + > + <a className={ styles.remove } onClick={ removeToast }> + <i className='icon-trash'></i> + </a> + <span className={ styles.msg }>{ t.msg }</span> + </Paper> + ); + }); + } + + static propTypes = { + statusToastr: PropTypes.shape({ + toasts: PropTypes.array.isRequired + }).isRequired, + actions: PropTypes.shape({ + removeToast: PropTypes.func.isRequired + }).isRequired + } + +} diff --git a/js/src/views/Status/components/ToastrContainer/index.js b/js/src/views/Status/components/ToastrContainer/index.js new file mode 100644 index 00000000000..eac41741099 --- /dev/null +++ b/js/src/views/Status/components/ToastrContainer/index.js @@ -0,0 +1 @@ +export default from './ToastrContainer'; diff --git a/js/src/views/Status/components/Value/Value.css b/js/src/views/Status/components/Value/Value.css new file mode 100644 index 00000000000..b2c906bc689 --- /dev/null +++ b/js/src/views/Status/components/Value/Value.css @@ -0,0 +1,10 @@ +.value { + background: none; + margin-top: 0; + padding-left: 10px; + padding-right: 20px; + width: 100%; +} +.valueContainer { + position: relative; +} diff --git a/js/src/views/Status/components/Value/Value.js b/js/src/views/Status/components/Value/Value.js new file mode 100644 index 00000000000..4650b0d7100 --- /dev/null +++ b/js/src/views/Status/components/Value/Value.js @@ -0,0 +1,30 @@ + +import React, { Component, PropTypes } from 'react'; + +import styles from './Value.css'; + +export default class Value extends Component { + + render () { + return ( + <div + className={ styles.inputContainer } + { ...this._testInherit() } + > + <input + className={ styles.value } + type='text' + value={ this.props.value } + readOnly + /> + { this.props.children } + </div> + ); + } + + static propTypes = { + value: PropTypes.any, + children: PropTypes.element + } + +} diff --git a/js/src/views/Status/components/Value/index.js b/js/src/views/Status/components/Value/index.js new file mode 100644 index 00000000000..a017ab150e3 --- /dev/null +++ b/js/src/views/Status/components/Value/index.js @@ -0,0 +1 @@ +export default from './Value'; diff --git a/js/src/views/Status/constants/index.js b/js/src/views/Status/constants/index.js new file mode 100644 index 00000000000..b51bb7b5738 --- /dev/null +++ b/js/src/views/Status/constants/index.js @@ -0,0 +1,2 @@ + +export const SCROLLBAR_WIDTH = 22; diff --git a/js/src/views/Status/containers/AccountsPage/AccountsPage.js b/js/src/views/Status/containers/AccountsPage/AccountsPage.js new file mode 100644 index 00000000000..f2687c97826 --- /dev/null +++ b/js/src/views/Status/containers/AccountsPage/AccountsPage.js @@ -0,0 +1,35 @@ + +import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; + +class AccountsPage extends Component { + + render () { + return ( + <div className='dapp-flex-content'> + <main className='dapp-content'> + <h1>Accounts</h1> + </main> + </div> + ); + } + + static propTypes = { + logger: PropTypes.object.isRequired, + actions: PropTypes.object.isRequired, + status: PropTypes.object.isRequired + } +} + +function mapStateToProps (state) { + return state; +} + +function mapDispatchToProps (dispatch) { + return {}; +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(AccountsPage); diff --git a/js/src/views/Status/containers/AccountsPage/index.js b/js/src/views/Status/containers/AccountsPage/index.js new file mode 100644 index 00000000000..a4212184740 --- /dev/null +++ b/js/src/views/Status/containers/AccountsPage/index.js @@ -0,0 +1 @@ +export default from './AccountsPage'; diff --git a/js/src/views/Status/containers/Container/Container.js b/js/src/views/Status/containers/Container/Container.js new file mode 100644 index 00000000000..a5e9ce75b4e --- /dev/null +++ b/js/src/views/Status/containers/Container/Container.js @@ -0,0 +1,66 @@ +import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; +import { extend } from 'lodash'; + +import Header from '../../components/Header'; +import Footer from '../../components/Footer'; +import * as ToastActions from '../../actions/toastr'; +import { updateLogging } from '../../actions/logger'; +import ToastrContainer from '../../components/ToastrContainer'; +import StatusPage from '../StatusPage'; + +class Container extends Component { + static propTypes = { + status: PropTypes.object.isRequired, + statusLogger: PropTypes.object.isRequired, + statusToastr: PropTypes.object.isRequired, + routing: PropTypes.object.isRequired, + actions: PropTypes.object.isRequired + } + + render () { + const { actions, statusLogger } = this.props; + const { name, disconnected, noOfErrors, version } = this.props.status; + + return ( + <div> + <Header + nodeName={ name } + disconnected={ disconnected } + noOfErrors={ noOfErrors } + { ...this._test('header') } + /> + { this.renderPage() } + <Footer + version={ version } + logging={ statusLogger.logging } + updateLogging={ actions.updateLogging } + { ...this._test('footer') } + /> + <ToastrContainer { ...this.props } /> + </div> + ); + } + + renderPage () { + return ( + <StatusPage /> + ); + } +} + +function mapStateToProps (state) { + return state; +} + +function mapDispatchToProps (dispatch) { + return { + actions: bindActionCreators(extend({}, ToastActions, { updateLogging }), dispatch) + }; +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(Container); diff --git a/js/src/views/Status/containers/Container/index.js b/js/src/views/Status/containers/Container/index.js new file mode 100644 index 00000000000..78e4e70cb47 --- /dev/null +++ b/js/src/views/Status/containers/Container/index.js @@ -0,0 +1 @@ +export default from './Container'; diff --git a/js/src/views/Status/containers/DebugPage/DebugPage.js b/js/src/views/Status/containers/DebugPage/DebugPage.js new file mode 100644 index 00000000000..6daba3e69b5 --- /dev/null +++ b/js/src/views/Status/containers/DebugPage/DebugPage.js @@ -0,0 +1,37 @@ + +import React, { Component, PropTypes } from 'react'; +import { bindActionCreators } from 'redux'; +import { connect } from 'react-redux'; +import { extend } from 'lodash'; + +import * as debugActions from '../../actions/debug'; +import { updateLogging } from '../../actions/logger'; +import Debug from '../../components/Debug'; + +class DebugPage extends Component { + + render () { + return <Debug { ...this.props } />; + } + + static propTypes = { + actions: PropTypes.object.isRequired, + debug: PropTypes.object.isRequired + } + +} + +function mapStateToProps (state) { + return state; +} + +function mapDispatchToProps (dispatch) { + return { + actions: bindActionCreators(extend({}, debugActions, { updateLogging }), dispatch) + }; +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(DebugPage); diff --git a/js/src/views/Status/containers/DebugPage/index.js b/js/src/views/Status/containers/DebugPage/index.js new file mode 100644 index 00000000000..1167d8b91dc --- /dev/null +++ b/js/src/views/Status/containers/DebugPage/index.js @@ -0,0 +1 @@ +export default from './DebugPage'; diff --git a/js/src/views/Status/containers/RpcPage/RpcPage.js b/js/src/views/Status/containers/RpcPage/RpcPage.js new file mode 100644 index 00000000000..8c6b339539b --- /dev/null +++ b/js/src/views/Status/containers/RpcPage/RpcPage.js @@ -0,0 +1,43 @@ + +import React, { Component, PropTypes } from 'react'; +import { bindActionCreators } from 'redux'; +import { connect } from 'react-redux'; +import { extend } from 'lodash'; +import * as RpcActions from '../../actions/rpc'; +import { updateLogging } from '../../actions/logger'; +import { copyToClipboard } from '../../actions/clipboard'; + +class RpcPage extends Component { + + render () { + return ( + <div> + { this.props.children && React.cloneElement(this.props.children, { + ...this.props + }) } + </div> + ); + } + + static propTypes = { + children: PropTypes.object.isRequired, + rpc: PropTypes.object.isRequired, + actions: PropTypes.object.isRequired + } + +} + +function mapStateToProps (state) { + return state; +} + +function mapDispatchToProps (dispatch) { + return { + actions: bindActionCreators(extend({}, RpcActions, { copyToClipboard }, { updateLogging }), dispatch) + }; +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(RpcPage); diff --git a/js/src/views/Status/containers/RpcPage/index.js b/js/src/views/Status/containers/RpcPage/index.js new file mode 100644 index 00000000000..27ddace7397 --- /dev/null +++ b/js/src/views/Status/containers/RpcPage/index.js @@ -0,0 +1 @@ +export default from './RpcPage'; diff --git a/js/src/views/Status/containers/StatusPage/StatusPage.js b/js/src/views/Status/containers/StatusPage/StatusPage.js new file mode 100644 index 00000000000..5418281fb0d --- /dev/null +++ b/js/src/views/Status/containers/StatusPage/StatusPage.js @@ -0,0 +1,36 @@ + +import React, { Component, PropTypes } from 'react'; +import { bindActionCreators } from 'redux'; +import { connect } from 'react-redux'; +import { extend } from 'lodash'; +import Status from '../../components/Status'; +import * as ModifyMiningActions from '../../actions/modify-mining'; +import { updateLogging } from '../../actions/logger'; + +class StatusPage extends Component { + static propTypes = { + status: PropTypes.object.isRequired, + statusSettings: PropTypes.object.isRequired, + statusMining: PropTypes.object.isRequired, + actions: PropTypes.object.isRequired + } + + render () { + return <Status { ...this.props } />; + } +} + +function mapStateToProps (state) { + return state; +} + +function mapDispatchToProps (dispatch) { + return { + actions: bindActionCreators(extend({}, ModifyMiningActions, { updateLogging }), dispatch) + }; +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(StatusPage); diff --git a/js/src/views/Status/containers/StatusPage/index.js b/js/src/views/Status/containers/StatusPage/index.js new file mode 100644 index 00000000000..663789b706a --- /dev/null +++ b/js/src/views/Status/containers/StatusPage/index.js @@ -0,0 +1 @@ +export default from './StatusPage'; diff --git a/js/src/views/Status/dapp-styles/hex-grid-tile.png b/js/src/views/Status/dapp-styles/hex-grid-tile.png new file mode 100644 index 0000000000000000000000000000000000000000..9acd894a140395f5f61bdcc071fb6152585b1e80 GIT binary patch literal 13471 zcmaKTbwE^Kw>Bc(5(7wslne|*$WS6FF_a(-DKHG(J)krw-CY6#(hX7)0z(NRB_Z8N zcYovWzVE&FkNbY}&pBtGz1CiPpSAbedp*yDX{fy<CU{JMfq_A+q$u|aeO<@Eco2(+ zgT8CFpdUkDXx-#tZd#5OZl0zt2n=a+M>7PolD(-V;uXTw9O>MTkifur$Y!k#bAzcu z#o&(ie5QZv@Ojxgp`|e}B&58YOyRZ&H)b=0rL}`3>wZf+E3>t^B&)8lD!;0eEW*lK z(c1-~<*lX-_qK(LnzKqhXO{31Lo2XHxS2A0+1oj|ig`)0{-ak6egC%@#LE0n6*pT+ z*8egJrmDd#>*#`D7UmP?h4X`jm_<bSz`|f52pGsLzz-G#@e6{$g1le>F@8}ourTw# zeyr%$T+A)RUdbu^t1a}CB&(I1o0Av_<mu_j=PAhN=wb;1i;9YZ_ys@$0=(!Nysk(G zH&ZWO2UoU#Ymh^@!d<ML+^iiPnEz@tHFI=#lVn9(`d?kJclvL&4zB+iCiH-TyiA=y zU_So8UHW%LRn`B0ReSsYuI=jf3h_Vo{-26nwUJH;&?|(iqq_?n{oyRw{x;<#ChLMQ zb#rvlc67A+_b6&uIl4KzS~)r~%gQoyshYyA9sWLZ|0AHPDyHP%>SpQyM<~fjvZ7V+ zSzDWni3mzR6A_V<5s*=k1%u^<WMoA6WrRfJpFxCW<>eI={w*u#2zR$fIJo^=*8G2D zW&fk>Uth3yLboi3aIyA4m@BwA+B5&tXEE#lY>ViB)b}r0^Z#s%^na8Ep^X9k{j&e- zOaHqF?LL2R|J!fT5C84?2nV#gyP*BrSh^(#0|QL1Bqy!yHS^~kajfBl`}#yaJ9yGx zKQK)bQ<~QRjMbXWVG+c`Qux|=k_JlFz*EgYmrlv&h-`CSVco%quwIUeh-#eNE&1ZH za;pD*l0%?H84M}brl;1dC3)6ORzDe#qy@22#Om_5y452W6!IB4*-8^}H1=%I@!4-V zZ*?s({tg{^)9y2WDYYPq&C*SGL_Rhq7}#&Led^tHEb$zVRr}!G9UjyBgd3jzoxlJM zKHyM<jOp&;HQ~`!Tr0`3W|O=v4&XRSWFA&~vYal=e(C-`24$R{HvKArY5QpA14z<s zwJ(nM6@R6~My9J{Mrx}6zGKh+Zi?=14>f7y#VU}hTiABsNcQyr!+|Q%@w=HLT+btC zJ?>a4<Soqiik(uKteN4}riXH_1hJIs%|&&?&12wJ+mYDQN<HLmQu|b*ZkYP0GUnGh zl-^L@P4l27BIyO@O8Qar<2Pd5mFh|l?5-{*yY}~EZ)}(Lsn*_ywmS4OiHE-tS=|?i zsjZEbPi)a(4Avi7BpsA`1t&~TdjTjaENthKlH8<Ft_r5U3UQ$cIOs2ZD%D1RjAw$_ zf3OR@_efHQ2x9h#p4{XY9*SAnqz$3s7)FjAI#XU$H7H4!qUt@4HagqN`_vs1r)p{Z z_TumJ*((Kd8k|cMAO51T(fnpO{h=_GLhkX3qML~2Av@Wp?JujUsXXFC1cRi)tvLPp z*YZ-*-FxMXjZ_zU5sz8D@$W~~gnFRiD~ekUcS$#HAOiO8phjudmk0%_-?Pm(b&;6d z{5ZRP=Ngu3R=F?&P*l$<R$Lc^ynIUXYf3w?62@n%9U<B+GxZMqr`AexBUL=C-27>b zfODy$V&LbndYVF-C%mhiYw!Ke@Yk55h1PWfg?lfK0d+sg{GNX}<lF!(6S8wnYb&cF zNOd_YnudMoxhoqskZ<DNIK1G&KJ5!{6$twc9wZF(0)52-oP2znLtM8F9sSHrtoxKL z=~vQ({Qx&AE*0;~gE#tRJZ3{FXG0WCHQ;&9FO$UU%O$S3^Yv?KJg&Fy9+I-Vwf%Mm z(QM#qmyYu)+2w*yGF-y25fV3wfY=CM&qwBt?N9b|gTUNl0`8-5ZO%W<Kn{cNR5E%! zs{<cBPc=vPXRLXiJ0bvrtBg9Q>*2nET%I?=hlaL2_?HV3PeNBG`qEzL6c!eC%IwMH z21AY%F8SXS=yMUne&F=xyy;DG=(woOF1nxyes$v0uQE(v@u6vdU5;7h2S1<G?;YfP z&(Vsr;%5`dpVQ=6lTw{74itm@(tRABM?dG^_ZF7Tn%TG`j@P#>erx8BB{8_PlLb9{ z%O{3sn?>FV#6t<l>&eddcMKk|+~U?T(;c#e9KB4k$)JPXW3&<_VhVfFav7|czMKS% zUGA~iVK{zRt4O0>J8jX7WvVb3B6I9SdQC$hI()#w!2^L{_-<Uzo~$V(Jb5J^82mH- zf?|1y-z!bU_z_p#&<bL<P^5m;y~>DdCyx|$<qwJmat6R3QT}MCY;(i_`TSt<npQ;X zLOY~`{Ae;(+-`p~&}jP6UU~gN%@e1xR{f#ZGb%6)&_h*FCF;d-zDD4zH{n@*1J)SV zIiQs=V+o<-4bd?e3eXu;&dBY3kGnbcHD$kEIM+0zhe&iJToD69_pO3j;$~S6SteDh zosG>E$>mb4I#({XJsm2p7|7KzIAF%!YFEkal|}#o5Ux9IZ@Nj5MPr9$f%-rTPu{Mu z9RH#&QF@WVO6R3#0|B(ugc>Ep9>%@|D~-Bs0?RxQFEd*JUTGu{fWgpaB7t$J6VMAU zaD_z$S@zPxMDq4P;DadcK}`duSDMS;I$r5u%|I@!0W7DonC9)8W-Bn;!4rYj$XENq zVW%3txrsx?kwGae^gE)}trjNylPgc7*#sLuhAkor7h%BE{$jS!C-2b)9^!OV`zo9) z!3I#W0tJBK2d#EL=5d8wye0IN1po=bJmS&A&#(V9I?ln~wkwJ<#v4r!&CR}M&@EES zN*DLNp;=@trOcUT@0`2sV2r;8pEsV{Utam$&-4UU`YjE3dMx<tx=YQqB9E<Y&adh# z??(T8BlT;!xLjy=yg%EW?Vr%UA7Ly1*?7NgKus_1Vdq@AL#2B&m_KE7Z;Q)y^t1g- zgIZ+RTASbPK~Xfl=n>$;`}XRz^6UQ9o9i}DBO`0VJh#P;F_YKfBOWBr3QXdgN2rax zOph!VysN)l#OF|uN?sJ@cyAXM%^!DDEG&HSyZ_pFdo%K;dV`JW7MAd-=hO0l4E^-Z zsYgFeO(3ZJF=-eBGXwRG0n!a|IR9c)2)B=Pdu*j2&w~ERLvshP<`45uxAl1$6*CqJ zJSORE@m+9i-vFzt|D(HV#uQSzod=}lZ@2=sw15854kq)-i+G+L(mV7E3)9}??vUf! zsZ}WsTaYfGjG3MX!dOGD1rNlwuU3S~XML8U@lTNq29YizgsC0pm2?5uJUeE{uS4pq zr#(Ux-?@jFT&9z-yJO#u*vpULa?L=O5KXnIT3Tc0{iN!b!Q{(*gFh>17k3e91ne+j z#G&uxL5(3k2W8r$=u^GX_wY-UtcTEz%0)(Gi_nW$>xl;_7o<<xX@y;%m!gx(c3~V7 zpO9k9@_+^U1@WY1d5;_fK(Fs4VJ@2gt?c+rpkV%kCi{D|C!*c4#wdIdaaolL`P}~| zW{$T~yjH>YS2lCagjosn57*n?vU%fmJr9^TIuN}944(FN!eU~6Ihn8=2sC_rB!h98 zi!jLgg$tsC?mzU>n@!$DWV2)9I{|+jka}l(W^aD0Hjyx&UZxb`3V#+c4@2OT$H>#I z9D~PJN}H&L9>FE~YTlLMK6i>D+llog+{)x!%3$=%hh;Oi6Atnup*wwbG2Sa1KW&^G z=<mr(y>OAbi%|G&u+q;o{z7$JId5v`R<XIV@d)by`(z0_5vQNsbaVk*D>+ZgpiXY0 zA`JRvw77VS^Tk8_h4g?F<EulD5*hr{W_p;$qEXU}swonC&-T64T`&hV#q406!4Qir zPG8h14Zv|}I=#lYm)F9$PpEZB&`FRXN8@>*vpFxREe@IS<Wb8zKF$vZw<Bxdek%VI z{Awc5*w6V5YjQ<@`0WeyEWA66P0EaUk43oc9fnP*%IEXp-9e4L8Lcsn!b{OsXfY3+ zz#iiw%(Ixrb0jf}#}+;nEx%_kZxxt=44*f7v;@O_Cxh?2iVaMJGu;%HSLCAC8fn53 zV&ipgvVk55`4X%tf{iM+eo~Q|KEmook9=@!1--0v@4gE&nr5-c97?PqD%Upi($m+S zT-${Kni|=2F^t#QFHv}?nFyICJXDwP!=WE1+Dwf;@@($G`Lor)nr!7oL>%urdO5>D zT|H?jn}p5600|W03P3BPGR9(kCf%$9*1JQS$|)a(GDgzNM*!vBuEGLtdV?)}i7CYv z?DB}D0|Bc;IzrHKZ%-V$r4T2em6*B!V?1}3Pw`DzZX?waZ0O}}7cHGJV0*ygcgLX6 z<V*<12Zg4ZUyQJVW`;rVxyQtrz$2^u<Is!l&cj#)K)Lj@<mR_1>EW(wJbewt_~=Z= zc5`r1k)^|lN_8Z6PU7CqE)mLQAf8WeDBxO!I9mRPcc^!f?K8*uR<6{Lu9?mei@z2m zy_f_8%CE2}672*bh=6|m2jzGRXEnk<Uws8%6xPMd=qo*EM{U+m4Fi28oR>erV5!tS zW}0ONjoGBVrcX1)+-(jMYKM=ycPh`jySuS+!fm06^TUTLD4o_`<w<9dVx$%S$0{q% zmwQ0UYALSDH}O-ykD3_<Sl$W@A2^1TA=!MLiWUzep9#9i!!df}2`|<bsx-uU2FX|P zZn*Mu1H+<*sGdKwEr$z6KWm^hPWJ3dcbk5bamIQRnA6GAa3g@|?SnZ1-Qqf~m#Vr+ zdh|P?R~mW|84Uh!EINfo`o_o3G*WMQ7?sP+1@o7`@K=*1G@X8Qw7a$uV;vtQ+n*W@ zoV@U==b5Cc^~_&18e1Pj3TH7Y;82LGP7siJTdeiSSckqS?mhBqts6o_mCCm~eh)u9 z6DZeyux110zg<VdGzKZ}B?JTETTUsi#V}LM5Gh~v<=xK?#9IVvB%;>EUOs6?tK1e2 z;xvs;>!5f6TfOa9jmR$PPqk06C9?HrqMHIAtjoNV4T(GAp-KYDPBn~%bf2S?-6f=0 z+#aqKxQ)hI`Zq}&ShEYi793rb<*IyI>x3=+4kju^*u3Dbcuw}EdAHRe|7WLM(D*<L zWnPG(KA?bbH4d8(534?rf+Kz=THfAAZ=ls*=c#$eT$3i48ocwX$C*jnN1JCeJt0ay z=(m06o`{k8!}w&%Rv=NdJk=P1a<V`xQCmQeo)>mD_K-aR>p@McBPtIEB&*WI8{z9T zlK1dH@XM0ft>FG_wc-1efJQ-*=p>#_qA<}2zHVL<mNB$*5)=&{)Wq{D7nrcXmrP3X zF`XhlvwdlIqn`*V_-Fqzr$59p-sdFzn?RTIque@8jF`^o3=t@T7&TDdLof4MrOq~D zmQX7PF8`}mw!qG|cMd-yEUGiDYtTzPd3LWI1UDoKRt?0~Vz73svRJHohE0tFf@2Y4 zcM4&F9xiQ6oUY3R*A%wzo_m#42>Eygr(WAUUe7DlBEpj*EX-%YeC7igl!_s6m2a12 zBX;eyFR%Fw%e8vlG3cK&Jef+Uotg$PUWd>}Jgz6lJ0|dLna_bD87TP+g}UssR??nL zKAnDYP?N_Tyv$8z;UEZn#Lv}6_8zX8ACA{CSQ7}Rb=|<OSem`<$Yw|sy*{nHZOq7i zdvv{jHQ;x-U9P=<csBC3*?IFv?zDl_UD&Me+V6JdhWV=#Ep_|LoBiLl*Lx$sua{In zEr0lXd`=98#9k{rzY<w!s+!u#@<bWsTt8a7Ze5L6X;ki{G*Fo>No))F*<c@HThVkj zv6V*qfk$1d6%`j@TTF4bFj<U|HY(Y!Z!FIBUAs#F*0Yf6uQw}N!t56FxnqJ~MP%DD zGav=b%W)XqNsqa<i_lJxilwBXg%by)9NPGZQ`*wd+ZxusFd~~VRwy`rNkwn#kXe8b zkl}q)I~_E0R)hH<7fS?P9Falv=VO+&a|J}ttcd-f=0*=H$HTQ%Pmc*It;yVUH;`R~ zF<|@63`|g%V~_FE69(6HEw7Yyd7y_nuSW<6B@?V93<P&34lCodQtmndZ*p8K@QOAt zDIVGm3k1QJt~dFsL?&ou0t=G@u(7c<To9NcgaC>;9iDgrn(KqJnv<I{Sl*Me-^Ld2 zbS9rcbnse<Xl5-;8Lke#UAo~KM<d*qlgl^O^?JMGgPh9Z`})snC^yEcwYLmf+R99( zrQHpK;F>{n#TpeP->N%$9DaSYk|d;2vJnTIZ8aP}O<bI8A$Wm`2J_6fq@2nEKiH$X zX7q$(0=HD6-MQw}lN0z_%b3i<XRB|*n9Uuc%x=dDcVX!lkk4tJN`w}a5P)V0Sz9H! zdoKbTB$##cz&^e7f-p_FP;{O&DgqCcr{Hdi4o%h;td1xGsg#C@?}w@2%JnqQ!bJpj z6ckJ3eItC-#lEx*rYpIjzlfLt7Aivk^5@UU8WZhjp;1bup*RqLunj&jgIu<Z0w#Tg z=esBQc?Hf~Y}R?))9atf_-rHaXX^UPl)LAWi4}cP8sXEc)_B+l0-zo`E^PGYnU5}r zY+9W0Pz5yLe!qBor3|#P@zQ%7F-<1H_LAB)pqT0#n1SncZ`!t|cl8n?gp!n$u)ueT zNWU)msVT#g3}6U)5+nm6wz$x9CyB~Hs3F?I6_3}CUQ8{S;L*Jkx(A5iIc@pfMSk1R zQiL)U7{_=$O8EsAV<b+CxK0nRuy%5s1mkGV>u$yv24xRm>kwU+;s?w0x4}As)Itut z%Of&|`b#(uY?J;x_0p?oe5VPoxH$-JooB6#8QhWa(9K$AqWM;U-hC|yFRwVKzu*^H z-bi>$Ka70AvxImU(S$s<(Bvvxqi{*|Zp+^EXfZQ2HKvS^uXgzD{hac>H8;<o%oZPm z<P24IqnMG?YTqL;7+mcIZpt@_p+~Yy^b)Cw!E2sB=e|_dSD`Bar~O#7Yj(W>lJca~ zc?~AjLwU?1reF}j83=a?LG@g|CDBG>^5c#zEa-t}$S+l;ORcU2`@={2J%g`rBDMMO zqnj)R9NF`~<V))&s}CE6hx2XKP<@AT<xaPjZ#kkj&O{%cq13IOSVi87##MFtQ^>8C zu^+vR=)qcAJp@_62e@2T*l$)$BxlR4PhpDpH#v)MnI|Z5Kr7k$?#jZDKjJ0e<5&E( zL)KpQ{r<q>F4Ksk<4F6C#M6Pig*o#^uCF?;3l<@lvhTG?R<;SUO90~YWXYA$sC4Uu zCaSHnl9Fd_*0L#|>##D3`i9NS-fFMP<xJQ9Y+}vrO!ufK!_iu6kUB_xyNyNu`1Shw ztGo(<KV@Z<(98sV%d_&2<N-b~dbRJgm-0_{2o@qA6o9iahb$%4`6`rBvJ<4-`c{31 z_^uX^<O59-Uc^Vw#T#~wM=3+yRN1!$7<gsceELpq5eV=xCP;9aeGT!p(tHtN-7I0q z8Gay87hB))?s4fTwZK<D8wQRb^B41ja#RxU0S}BV@@azQwT@_v*9&<D<wlZ-$zkd7 zY%&<^K_pT#qh^9oGAdr*n7Bn4(iss{Jz$tx>1bUxNxoNMC-PnQ1?vP*on*q!dsrfa z)`p^$NW?<-EvZ4u?07tn(Fr7+_VDMGT$ZJ%pnYJ<Yb=qi(oZ(MjPECI+#KXFzYQv6 z6Mvb?yrDH?H!7+1Cdsb$@S<%NGs;+kVPO{)^IYb+I*=Pczoq}^sd$pY%hBt@&XBE< z*`#C#p3t=MnvUg*i8c{PQ{TJ_5g=|II+=R{7;*~5Jl^KMhbkRp(#_(P8S<L0Pa=)u zXJbVDQwoft_BPwZcLru?hO2tCRW#QtpV@C8nS=xVcbQv<LjEd#2^;P3B8qns+y+q4 zNz6#^C^}o6#+&T<nvAq*V;@g0G+)*-T`X4mZM01ppBoJT)=2lRW!x9Ow$FN_vOE{= z&!(qIdVJpAU2a4y_}x?=5sQ3nKlMA`2dP4#nRnBTUr+h#uTSJiHdD~y&C+5pMe6(T z$Lo_L6%a3bkg?a&C2!2T{g(YFTWf2bNyN@!%;51{98muDz`8SK$xDsRkD<cRVT<cY zzwRKNBYmz3WX1}tlR&anc35~Etr%(%fh_8C0tTl{aL?5p1GKQ|Z81P_+P-;2RCDk1 zlAk^G*zy4Av9{7qvRO%%k%73PyJXE%daSw)flCTaA8}leEBNx8xWfk+H0WE%rRnI1 z%8C>4&sEKH68A@3SxWJ}A*->r06{_spy43NPKs&P^6nQFs^kzIQ2+wA5CBP$!(~!X z)DDB4Cqku*9FH{b^)}GB__N)XpasLnfCQ;6L)OwoL_<?e<}VgAFm1HFnzQ>szU{u` z@h+mFToHpqtVQ_g4pv+UV65Mv#PpzM4hH=*z=e(JnqrirV?6b-<x8)x-1A(jU&cCM z`^(zBB%^U?VmzH_bTOcfA@5wL^IEXbP4qH<Dx4-HCCvjN+9cbNB=5=W2z@del#wEQ z#+HpJ53e-2VEI1rL9tH1+ytnAWvnyE10}gAX_=PG=#eWY|8vyG&US0LYz8gIjF#7c zWCRG7h_R%~JfM&GjO~63O-;!!-bP^;>4XL*Na-1{{b(hoIuJ<eXUg7;<wX)ORYgaA z?;z1Y$sno)Y3KxdbiY_HA_jmQJ-IEkV4>=QR|v4tTr`4>NuIzfEhW*J#R&*d7B;6h zRxlM$4!I2G_tKLuH3|2f4r+vNnOXr31l9|DF>@o!oJ22ILRBd7jR6x$YtanX{Sg;V zLRDiyVWA(z@lmXO5ocArh&W*3juSAviz=Bp+!WkIX@<*0UAtiFvPOJ~ZQ}&A8IRUa z&%;8ormCkB2Bc8EY^v!vVP(py*A5SW>7967^ksew@3@rByvbc6=j|F?eJ!hd=G{Lc zwUOYQTJ*3pGdmj@9P>@pd$(S&=koHhU(nK6+|ktZ>lfeKs}vCj;PW2Nl`4~Lzq@g| zw)vf|<Kg%e6z4KOgQ$y~Vkaf~d_+lLo0dbO^&oWvzSt<&j^~{k)9V{A13~`zbx5iP zh29jjlBi%49`^qUqu^}kYd@#^N$Aa#6E9dNfATV=)pFF#;aAlXaaD4Bbr2KeX_}bl z`cRsWS|;QWn3FP5jd+xR{lovqX^M(muhx8O-ssR!GV40dbDqlD!?o+S1Wxtv6;w<o zb;=;&@=(-I;%21TvZ_>UyY^asts0F=&`5Pr{bLUQ&MC6pj&e^A{56x}pOVapZN~db zvEQiQNEjL&nXXaWBVVr;i45%MZOv!1N$thA&&BJ8#EcT;V#!Y{U+ge+A}9>7Y9xe( zZ-Z}6q>=X6$b>0gP}|80&kGW2ByVV<$|`7TwA&%L@{P~#P{ht;xnI#u4+)cfVa1LH zM2G$twdcM0dV|cSv*6bg3go*-#tAO<fkm=o9!I#+{GImAOka~_L?2pEV*&0TB=|~? z<D-^$5f&jX8n%phYqCepM5{oqL^fWFA18UA-b8^Ud3ZNP-n=`VSXgJ9dYbx?epa*P z?J{P;w9Vs3ig*w2i(2_QQqF>2C3Zn(@*jc4{P<z^AKw6(VM*1SyDNA2T5h_+QSwm1 zP7Dg!*x%&>oQZf(yfRdCz~bzc>dJays|DR9F9xN=I6)Wh&j)rsQx16c#rUjcSS{0; zDpN~&2n=O<goGTwH;iOMCx-SDau`qW*HYF_$23C(8hYp{`eXt(4FmwU8mS{glu8h- zrsNXcCsn0%23)0F6m*B|Tv9p-PoNa%b^!;{ZSue=DHdrgBSMA>KLu9?27h=x^2oFf z^2%6a{a1(#{#p!!hA&jVNAWk5w#;vtF6e4wY$Lm+y4Q|QS>DvosM_3yCBD@8Nw727 zaK9~}OC0Z*c}^w6Q<LPHU{Xq6iq~-Es_0Hnyt(mR+PtxaD}C6=mwV9#-m88F_M6uv zQh1Y6?7uMroaT3OAcFm;!e{1<DLrJ$PP_NgC$pQ+%xG}!-Iz4f3`PkONs9fxey!ra zZ>elO8t@y)HL+3uWL~{33Bu2dwY<z(J#B)dO+tCsQ!kFo(BKp`i$>v`U&Oa}be&B~ zSo^L&f>meidmt`M1Z!q!#G-MBTzNNei{b~>sX9^Oxtgk~)N@f$B$cp*8U2=w3+L{; zVNDPF>Zm<rwIO-%L77BZlv?pmicrhD;0Y;B6FR;rDSM}_8YhJ8{6kn==pc{akBp$} zU*RBW=p}vvgF~;SI=Uh_)}!GrjXYXDO02@0K;tgfn4T-KjVp2S_ixsmsR-4^EQ{yt zpwC&}ZS(je#}%H%_mj!HuxBtRon+VtV?$!%U@Bw7^|AC97~s2BRb$jA4YhFJ``yg) z+eSQ8$rW6gaRr=M7MhZqGI@y4?&UlS?T*tSEL4Ai`#A};q7rdBay%@)PY0NkQVA@2 zAeR@}kRpFH{!v_&%Pya7ZGhzXv`4vb2p@TCkhNt!^&4zpG#z`M%H2woQ;zf0m)Rfw zJ1n&GagECXmld$gZ|{XF&fabXa65-assS0BBrt$wydDI<Z9^yVZw|*A@C)kENQ(yU z-Vd`k%UxYJ3)BR*l_F~{RXuLkZ^6-J5o<@d-EsAui#&AwVVb``k17XUXc4T<1{dBL zyj+BhD-yO6&1{+su=U0TS-Xjt(ObJ`O{CFY!S1mJn^eon{GK;jj}=~1-tinUhy&tZ zc};(KCbl`_j7hulr=c=-FH%u9I<zN_a)6<txrXKZ0RfG&#&@g{>@Q`~kjboyPLizO zViceK_)Zs={kLC5zQ;)27o(5Jw9Syy9Na;f(MDs3d*gOhXA;UQ{y}v^D1_FEa4S!} z+l;a|-dPyNrIOo)h4&C0TQPUzt!OD)?|y0Z6)*j%zsI}&<!?WD^A`LJjs+p4PQXBI ze0|MGw$8Cb_52{n5$jY)e5A=0mJqrpDeEeW%XTw$Te8RixF(w-QGe+s#Xt!<TZ_XO zPi60>Z#ey%^bbp;=G7tUtLIYA{j`V*Dw;u@@atU&&%*S({rag}r{neSMcmIj-dt}p zeSdy)&=`?(e|vrAxbQVA^GNg}<{mb8Jw@7%xW9WQl=<O!Bq#lT6XoFTJ)5xr-7_Zq zI<hnFu$PnVvzLxe^WP<Vwv`@bapt^Te&~070hdP_T}FEv9v1B*_v^o>rKM3M?wxl8 z6m{0~Jf9W)l^CdGQPV+6O8@Jqo$;dA2-JQ<K3>@~Qy-Fm292-hJ#UHM#K|bR^b3To zj--C-WW8d0qEy9Pxlmorz|(WvfR(#C5^L@DLqV6Yxhz$LIp~OmJ@uF5EBe>>T~{0T zu~Q?9Dr6Bl+<)HWK1p?+-K;VwRYaT<2zN$GoD2Q(o839}-9*j{^Nq9@FsDMI_Sy$_ zlyjELntoR2hfAQat5@&!pGQW0E;ssmH|s-9+I7qaxV@Xj*}os^wLh&N4baFY=bqVI zt<`i!-WTnx#cMmEJv(qB_-aG;Lg3S)?zmLi33*pFNm$a@CZDR_9mWW18Y^|IqHLQ{ zH&UuIemKwPx}@&Yz9;*g+xH~mEzeL$O~p>D(e}|1J$V;DB>5*1{n<hwc4$TJ$}29B zFs$1~C>*;c*r{w$s5#t%eRJqcV9HRBt=P$KtJ#XoFOMqlQq~7@2W5B}T0fcuts9j- zkL4kZL&I5Uf{2VoH@&=Psp%3@Z)YGB=zdFxyv+dCE~2+V=p4SZ!uRB6ZT>q-^aQu3 zghE8*t`hCUMf&E#eRo}>vBwTyNXi{c@l}%QfscN$b`l*5VML#bW{8(7bPl@E!J9Er zU9iuq5mLG9y{98d&gKj&eE}L>WrY#+R(@E7Hu7OT4XZH}@1ohZbKav-QaVw<K#7|{ z&Lf_p^lz`G(g~f)m|KA<6~Kc22eQlREB5AkO*LNk?$w#rAr=AZnpXLPHa=-7qu*sR zC&}fwH131Tc*oZnyRSH>rAHxhmmv9e#wMXCwd|gdU~hw2JueqM{UO#Kc?sEPFGFOK z3>#8e#x@rjcld%Z^1QvfFj|K`n3y$Uf2n8+Yv<>=q(T}+fC7ZAP3*SIOa`uJ!W>%S zo{6a#8SEk?v;y(d>s75?41QkJPVKZUBj?M-3?;Jy!@}3;&=cLAvdzEH#D%Sw9usA= zcIYpA<v8NXeMeL`N*w$XMwj&vpiS5c)jcYTGNOVGViF7yo-OP>B+4s49YI4H;&M{o z#8MS-3s_!_ZBmkTj}Hho=o{*lgfa9u<hJwR6rSCp>JE#Z>Q087$qtrVZNK_hw5V$J z9{#8<oBtjV&&7X#cHh5ahy2Zkofp)fG(;KN%6#@a;xFo8Ulkr0A^@oW*)^!$R0I6b zzcQi%zQZc5gWV_cna`Tvh~`CA$XSPf<c<&JK0T|ELyvw1Lq<F>?+x`01F{YOP4w$~ z=<+})G~Y-2q{U-qhze1`o9W0&(mJGapq_q#0WPl34!WBi)L;%U!BN94PqUHNh)cfo zhqaBLJ_RVBR+N8ent$HVV{U6b6sRLNbT`HYpx||t1(JTngiQKPPG5A?g{#At5XQk$ zU9;6S5mG!feqXsN3FQW^IQ8eFVWLrctN`T|the?&?ufKVLatzvln=hQ$6Wf|?|u?T zN%-Ljv;`DY{7}GEF)B5T5mMJ&M3frpdAu(7a8%ixCjrif-_3sHp{uFHo?G%8VG!48 zZtO^4_e!I_uy_rTcp`#3NwJ;Nk<Vat+HqB0;s+qG<uuL9fk{T~*#i?N$+;%>o<@jD zN<JI{5E33I#8-1(WM+P}UBwO*3u+a2MsIQZiRn0U6E^K`Xu14ua?u19XHj$McY*yy zo!#d6yu1~=r`|E%*^M19ml>5*kZ09!)L=paoy68|+3u;apRxY1)=!r^!JOz7K*I9! zOeQ-ib8nd`^wJc0YwP4H8n;17n$p2EAIp@gQY#;!B=s;z^=H8R(6^%<0>T0<3GBNG z+&849@Zm#EJ=NEvpjRj}3AK2Wngp9yag%0EHRETq6qC)o;7{zNNSKghXdL(4iu4YQ zi9<_M-0wwv#@kQR_=ftnxDIHDR9XW$AXg|<b6i9gSNsPPq4Lq_wLvraoe@AyR>#GJ z;SlaVKH`Iak8d^0k#5d$3N6E-gsZsI1o$O{{G^wHb5DL!{c{lO23a5PlB+VWU;HFZ zaj$D^G<Gk-iPb+2drg9HhjLXqnXz2Mv_H}GVuLM>QISvAzo{h_cTW%}RaJ`Wp3Tno z%29qE;(n6QlE7=l`ZOZZwTgfsZGZ@>kmVfaAIZf3WqYV_)YQK{P1ZO2s+HjJf*tX~ z6LmepFA;ffC>&NUVLNxFUL7v+6jpGqDa}()cQt;ih}4H4Tx1TaQt02|**1Ln4d4cO z^(K*0b6LIpR_@FpRTNnUxtTY;)2g6&`%BjNbn47qn^WSOh#S9py*g0Zjf-7FhFlJ5 z`#fMn*C*|VV4nu;TO$Yh-3f_}b{m#9WL2=y7akZz>n;!|x*Dp~Imp^k-N((i{g+EY zdrnZp_(qh|YFDy2Jo7v|ucn;5xj-K<ZC%Pi!`})#y_CKwa-Z;#V-&*&MPQ-^B6<u9 zvVvs~1aO#0-5t@`uE4j!Wvxzu!sfGB*<-A8+?Ybv<_liBh0ONg_c}krEq`oN;Wu;+ zLOcE<Ymoesf{~PZf^TQP*(d+W=Rb-JLMMBALgBRHoJ+qhltWXZB<OzJrE&P#t>>cY z5e7q#^oOxpiRLm}8*{AP9A~8iz~<6g->RXSozjKrE&+>6rf-XBF#`f5WVGsM%N|Gf z1k&CfBy|iL2BO!YkM6`H*j!F)PCyUDirzCSTvAM9GjO%+v>A`#W7GGRU3x+Z=)4D2 zEA&pHrTpxm?h*C5H9>R_K(MI+8>havNpyS>h80rFU?%@^qBg3d8pf~1?`9bI0llI6 zScC1WBWL1`1ULcV=fJAyrt1Jn@y`Nh3%~EuK*Phy_h%wf9%J`~Hy8_dY3d>*3}Qk) zJ18mV*~->yT_w)Sy{|jb_f__@89A5b22%5%y!`HHYSog$+Akv7-Ilh-illdp6)sKN z{udk(2*`AxQdJ+hiI{e|d@C(vnlji^uf2q*aJzf*rSbuNDHu=cvn-ZmUZ4m`bkFSI z+@}gD^+jrBn}ZrmO`Pc9zfhY<YkH~^uoO)Qs7tk8f<5%2jR-=gOxaDIeH(P)P7Pm# z89hx;#w!SgUoIllNPGqnN1Uwite}*p^qWy^lnX8ErYILbni|sDHbie707u|~R8;vm z{Pa2I)aH!~MQ-}=qF;B$FaU;5puyixzEz9SwvnP=tkbjj5R?k=iR@Z5Cq{X8Ce>sA zHE|pd_e)uZ-G^K4jzJe&uzdj9#+q)@_Ijr>G!kT}4;|$AEbm-x0Q83U+dy<Mz4Y#| zD9Y6*uz7;9cgY8T|A74TQ*(bgFLF@Jiiytu;B)9J3d~l2wg;(r<8;MauPYHf3|4za z6I#a0Va2IjFJm)17_SjUX`<KrQO^#vGR$;a5eK%4-x_9e)60FU&G|KR3WCPt-zFeu zqp{N)lup+VOm|<Mk%x8+*7+a{2icp@_+Nj)u|e#MDYbcKH+iD=x^)?e@6a-A#&JVO zR3Lc-nx~Y}2&dI<P*_A{D{url8ZSMH<N3UM5oEvXQ3jO6V>l2{yE7kwA$~lW=x2&7 zFtPVZ5JiN(AK>Nasumk6ywK@0^P+`4Sl{wGZ(v|0ES8W@>dz7F<h4;swTUX-Kk@() zQt69Cz2f;~VkTb}43AUGpree2E+X{MDB;uD@w9EB3cJ?_9zcfifv$IT_|fv3)4j&= zPav0YajnjHs(iP}Zl$~6&g#^<Bd|_jU&O`BEHqClO4qG>?^6R@baB2H%@cTZ&t<hk z5ELkA`kCB|Rst)r5iV*W8IVH-#zcb)Rk0JA<RgjP@D1{^hcLTm8)LOH)6pR*NVd5m z0;b%0tb*b%^D0>@N~KBmvyMcfm$E3~?Ys_|qYZE5I}Nf>xaQi@$CS6l(M=w^&HwOz z7@xDAf7XB*pu^7spH$YLQ*Sf$@A~GZYqe=3`?w)3jhFp7%eA$)x5Z)p>XdQ>@(!K$ zM^iUhUgBfb%<hJVgdjD6fSzXeol6ZvorbR?Oi5FiOkqB5+vCN&oa))Xwvm=u$!`D~ z8ykL4-ek;usrK?$M`=za!=dDd{mi?2G2jtP?GLVC3nYJ}1FY%OAfbDih1o<-XHc*- zhQBW>S0XZJegory)SziaSx%kZ8?#pmCM+wHNx5fwmOM6`*cp-pvc8`wel$?MZR>fN z8kIre4;Loq|Ju!IO{FfKoc@gxF)jq;ukS*o>D_o~Ty7FrOS(R*{_)Hv^2nHV2|Rt< zKi(7I<(Cl3V&NKS>cf$=qt;FzH49l}zj=v3r`IokB?&$nZg@ngMvS>|CPn{ibvUpD z#7Sm5_aP;*I4|be5>^}|hlO)R^CIHU=}E>UJh!%$@*YU^ruVT(KnDCFeMDml_nP%~ z$d{)+2LtrAPgF4RRF+`)O9<$@5w_Q6s?&)Q6l29<uf8wGGUK-bV*uodx|WM2B^`V_ znceeFNCtm}#`-PKOZ(_CmWa)m2(lL=`0W$gy1Tppp>{os<pEp<foZ;&%Q6=AX>t92 z-L<{1MaL{eR<mY|gfpGNG|)#*!WmKfl2bBUJXFbUcT5Qw&>wYc5=}DWjqs(jnkET+ zj^3D=sZJjpM>Ma^Cfg?G*OoNx!~;@p>(1^k-j@EAGfCwshpGvIXx19f7mCEAhBXJ0 zMZ^R!(UxT;qYw`?c%7>L>Y%2~Vjm#zbxV!k0=)M0vx_UHQ<=qZ$WNpfZDbrJJeG;0 zuVKreV?3OVXdDy8N|WD&11g>QXhQfb>w^m5CEMRaGY_!bGT){ADqy3*j=sv<xIpzl zKns2Ht+1bEN=Ji30MNti((tH7!V!<c@Vixh1FVnV@{-dBy5h-I5*b*5sca-5lcvay z!N3mF@f+gg((#)iBI80#bes~^Ur9Fs;<1c$gW1sQDZ;hlpl<Oo1@W29BqUTwftlZ) z7?bonPnNU{ssLMM7{sIb0Ob0Yd(viqH9|*W|CHSKV|Uh{?|fv7wvxL`Xh+k`4|wrf z>u6%yLw$qS;*}RI`(H}WV>)9CbW96O%LFVT;Hh{}$7(zXMTNGL%O#g7Bh=wfmB~!8 zz4%I<JqbEHffrmsd*UUt2s6jPQn9`8kgD1+u6Z!1+K!xRS-7qAJs8b!xZ_wWI{!bQ zj5VLz-kh7mdI|~(sivjg^MsSPF4ZzuQ+_Mod_Z4UH@w1lSgz*Jzg|!BN}X!G?{D4@ zTwI<(v)h0cojx1|_F$5ro_g^Q^RtG=&6Rz6Lm$vsGMb}Sp=qC}VaAXSEz${ie4f`) zP4nYVuuBvnDlms#a5G9~LtXUOB}F4+*p^p?>5Odk5=?dxG3+f*3FN@jE)f#tPvm?A zTRVN>%WOYIa!|`n|GQ`<vxg`E?ymg=t0pi7ycGa%`r0-muRBTkcXp()u{i<z{xmPo zH*XF+-m*qR_xjjRcpy4j5CP+HSN|}bj%qXu<rQY9P_{H0%ztfXG`$qqQ->Li{Q);x zv>(a#k-4O+YZo!82SvkEEG?|alRhtBeL_?XnnY(wOCcRpPmf&h?HWv-3xvxDq^!N- zXFpyyRC0z(w+!Sp&a61oMAs7-C#!T4%|@?X$ST?R=!JjzuB2|(cUA+vNOM2JHA9i) zzK>r%tNB7IB7A~tzCzt5S`$cH!(bczOLiK6w86-RtgJ(_t1T`Bj-b*<BO9d6bFj?V z&kK&c>J;0mor973P-T-pAI=FGJLz-Z|D4%{;S}=`)!BGIPJ^whrM<SS8FThZtDmig zhVpPMBE)z(B>Z^+s3gER!Yhpx4Tt~41Zi1--*;61G7FWOyK^m_wF#)o6h;}+^{exu z;f)HkZ#RDKDT=S6HpY?BLjZbotaj_N;{?!rG08`?wsST=j{C@@DbTx;FG=QD{nct5 z0E)5RIi8Y$;?ATa9BvA<_aZVL8z=XgHDFghpE8rK4Hs=X*QI+c2ldi3kDx`LYO6}~ zRbPnRxxUAW!)Z(!_W%xF>cy0vw0?lPp@Uvj2li8IFPNe|$|WqXV-Q`M>55!VU72ZM zNM=?(;E$b;UZaUZhb-At7~Jja??_dQm&?U|XI!(@2Q{YsOiqpv-#YQMA5oY5PWk@7 zv7$Is6hC1Kjw(gXqK_ISc;<b_4Ga+&>bi-HDU%0i&~DCSSaic>Xo;CY%J)yn<z)!3 z?G&KGpxyVKwXg5p@zL7GGrQEcq3S5rt9wi$j8z{T;b)e1e1HEkq$IB<S0Q5(`2PSG C49LR( literal 0 HcmV?d00001 diff --git a/js/src/views/Status/data/rpc.json b/js/src/views/Status/data/rpc.json new file mode 100644 index 00000000000..97c7e405561 --- /dev/null +++ b/js/src/views/Status/data/rpc.json @@ -0,0 +1,1075 @@ +{ + "methods": [ + { + "name": "web3_clientVersion", + "desc": "Returns the current client version.", + "params": [], + "returns": "`String` - The current client version", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "web3_sha3", + "desc": "Returns Keccak-256 (*not* the standardized SHA3-256) of the given data.", + "params": [ + "`String` - the data to convert into a SHA3 hash" + ], + "returns": "`DATA` - The SHA3 result of the given string.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "net_version", + "desc": "Returns the current network protocol version.", + "params": [], + "returns": "`String` - The current network protocol version", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "net_listening", + "desc": "Returns `true` if client is actively listening for network connections.", + "params": [], + "returns": "`Boolean` - `true` when listening, otherwise `false`.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "net_peerCount", + "desc": "Returns number of peers currenly connected to the client.", + "params": [], + "returns": "`QUANTITY` - integer of the number of connected peers.", + "inputFormatters": [], + "outputFormatter": "utils.toDecimal" + }, + { + "name": "eth_protocolVersion", + "desc": "Returns the current ethereum protocol version.", + "params": [], + "returns": "`String` - The current ethereum protocol version", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_syncing", + "desc": "Returns an object with data about the sync status or `false`.", + "params": [], + "returns": { + "description": "`Object|Boolean`, An object with sync status data or `FALSE`, when not syncing:", + "details": { + "startingBlock": "`QUANTITY` - The block at which the import started (will only be reset, after the sync reached his head)", + "currentBlock": "`QUANTITY` - The current block, same as eth_blockNumber", + "highestBlock": "`QUANTITY` - The estimated highest block" + } + }, + "inputFormatters": [], + "outputFormatter": "outputSyncingFormatter" + }, + { + "name": "eth_coinbase", + "desc": "Returns the client coinbase address.", + "params": [], + "returns": "`DATA`, 20 bytes - the current coinbase address.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_mining", + "desc": "Returns `true` if client is actively mining new blocks.", + "params": [], + "returns": "`Boolean` - returns `true` of the client is mining, otherwise `false`.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_hashrate", + "desc": "Returns the number of hashes per second that the node is mining with.", + "params": [], + "returns": "`QUANTITY` - number of hashes per second.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_gasPrice", + "desc": "Returns the current price per gas in wei.", + "params": [], + "returns": "`QUANTITY` - integer of the current gas price in wei.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_accounts", + "desc": "Returns a list of addresses owned by client.", + "params": [], + "returns": "`Array of DATA`, 20 Bytes - addresses owned by the client.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_blockNumber", + "desc": "Returns the number of most recent block.", + "params": [], + "returns": "`QUANTITY` - integer of the current block number the client is on.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_getBalance", + "desc": "Returns the balance of the account of given address.", + "params": [ + "`DATA`, 20 Bytes - address to check for balance.", + "`QUANTITY|TAG` - integer block number, or the string `\"latest\"`, `\"earliest\"` or `\"pending\"`, see the [default block parameter](#the-default-block-parameter)" + ], + "returns": "`QUANTITY` - integer of the current balance in wei.", + "inputFormatters": [ + "inputAddressFormatter", + "inputDefaultBlockNumberFormatter" + ], + "outputFormatter": "outputBigNumberFormatter" + }, + { + "name": "eth_getStorageAt", + "desc": "Returns the value from a storage position at a given address.", + "params": [ + "`DATA`, 20 Bytes - address of the storage.", + "`QUANTITY` - integer of the position in the storage.", + "`QUANTITY|TAG` - integer block number, or the string `\"latest\"`, `\"earliest\"` or `\"pending\"`, see the [default block parameter](#the-default-block-parameter)" + ], + "returns": "`DATA` - the value at this storage position.", + "inputFormatters": [ + null, + "utils.toHex", + "inputDefaultBlockNumberFormatter" + ], + "outputFormatter": null + }, + { + "name": "eth_getTransactionCount", + "desc": "Returns the number of transactions *sent* from an address.", + "params": [ + "`DATA`, 20 Bytes - address.", + "`QUANTITY|TAG` - integer block number, or the string `\"latest\"`, `\"earliest\"` or `\"pending\"`, see the [default block parameter](#the-default-block-parameter)" + ], + "returns": "`QUANTITY` - integer of the number of transactions send from this address.", + "inputFormatters": [ + null, + "inputDefaultBlockNumberFormatter" + ], + "outputFormatter": "utils.toDecimal" + }, + { + "name": "eth_getBlockTransactionCountByHash", + "desc": "Returns the number of transactions in a block from a block matching the given block hash.", + "params": [ + "`DATA`, 32 Bytes - hash of a block" + ], + "returns": "`QUANTITY` - integer of the number of transactions in this block.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_getBlockTransactionCountByNumber", + "desc": "Returns the number of transactions in a block from a block matching the given block number.", + "params": [ + "`QUANTITY|TAG` - integer of a block number, or the string `\"earliest\"`, `\"latest\"` or `\"pending\"`, as in the [default block parameter](#the-default-block-parameter)." + ], + "returns": "`QUANTITY` - integer of the number of transactions in this block.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_getUncleCountByBlockHash", + "desc": "Returns the number of uncles in a block from a block matching the given block hash.", + "params": [ + "`DATA`, 32 Bytes - hash of a block" + ], + "returns": "`QUANTITY` - integer of the number of uncles in this block.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_getUncleCountByBlockNumber", + "desc": "Returns the number of uncles in a block from a block matching the given block number.", + "params": [ + "`QUANTITY` - integer of a block number, or the string \"latest\", \"earliest\" or \"pending\", see the [default block parameter](#the-default-block-parameter)" + ], + "returns": "`QUANTITY` - integer of the number of uncles in this block.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_getCode", + "desc": "Returns code at a given address.", + "params": [ + "`DATA`, 20 Bytes - address", + "`QUANTITY|TAG` - integer block number, or the string `\"latest\"`, `\"earliest\"` or `\"pending\"`, see the [default block parameter](#the-default-block-parameter)" + ], + "returns": "`DATA` - the code from the given address.", + "inputFormatters": [ + "inputAddressFormatter", + "inputDefaultBlockNumberFormatter" + ], + "outputFormatter": null + }, + { + "name": "eth_sign", + "desc": "Signs data with a given address.\n**Note** the address to sign must be unlocked.", + "params": [ + "`DATA`, 20 Bytes - address", + "`DATA`, Data to sign" + ], + "returns": "`DATA`: Signed data", + "inputFormatters": [ + "inputAddressFormatter", + null + ], + "outputFormatter": null + }, + { + "name": "eth_sendTransaction", + "desc": "Creates new message call transaction or a contract creation, if the data field contains code.", + "params": [ + { + "description": "`Object` - The transaction object", + "details": { + "from": "`DATA`, 20 Bytes - The address the transaction is send from.", + "to": "`DATA`, 20 Bytes - (optional when creating new contract) The address the transaction is directed to.", + "gas": "`QUANTITY` - (optional, default: 90000) Integer of the gas provided for the transaction execution. It will return unused gas.", + "gasPrice": "`QUANTITY` - (optional, default: To-Be-Determined) Integer of the gasPrice used for each paid gas", + "value": "`QUANTITY` - (optional) Integer of the value send with this transaction", + "data": "`DATA` - The compiled code of a contract OR the hash of the invoked method signature and encoded parameters. For details see [Ethereum Contract ABI](https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI)", + "nonce": "`QUANTITY` - (optional) Integer of a nonce. This allows to overwrite your own pending transactions that use the same nonce." + } + } + ], + "returns": "`DATA`, 32 Bytes - the transaction hash, or the zero hash if the transaction is not yet available.", + "inputFormatters": [ + "inputTransactionFormatter" + ], + "outputFormatter": null + }, + { + "name": "eth_sendRawTransaction", + "desc": "Creates new message call transaction or a contract creation for signed transactions.", + "params": [ + "`DATA`, The signed transaction data." + ], + "returns": "`DATA`, 32 Bytes - the transaction hash, or the zero hash if the transaction is not yet available.", + "inputFormatters": [ + null + ], + "outputFormatter": null + }, + { + "name": "eth_call", + "desc": "Executes a new message call immediately without creating a transaction on the block chain.", + "params": [ + { + "description": "`Object` - The transaction call object", + "details": { + "from": "`DATA`, 20 Bytes - (optional) The address the transaction is send from.", + "to": "`DATA`, 20 Bytes - The address the transaction is directed to.", + "gas": "`QUANTITY` - (optional) Integer of the gas provided for the transaction execution. eth_call consumes zero gas, but this parameter may be needed by some executions.", + "gasPrice": "`QUANTITY` - (optional) Integer of the gasPrice used for each paid gas", + "value": "`QUANTITY` - (optional) Integer of the value send with this transaction", + "data": "`DATA` - (optional) Hash of the method signature and encoded parameters. For details see [Ethereum Contract ABI](https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI)" + } + }, + "`QUANTITY|TAG` - integer block number, or the string `\"latest\"`, `\"earliest\"` or `\"pending\"`, see the [default block parameter](#the-default-block-parameter)" + ], + "returns": "`DATA` - the return value of executed contract.", + "inputFormatters": [ + "inputCallFormatter", + "inputDefaultBlockNumberFormatter" + ], + "outputFormatter": null + }, + { + "name": "eth_estimateGas", + "desc": "Makes a call or transaction, which won't be added to the blockchain and returns the used gas, which can be used for estimating the used gas.", + "params": [], + "returns": "`QUANTITY` - the amount of gas used.", + "inputFormatters": [ + "inputCallFormatter" + ], + "outputFormatter": "utils.toDecimal" + }, + { + "name": "eth_getBlockByHash", + "desc": "Returns information about a block by hash.", + "params": [ + "`DATA`, 32 Bytes - Hash of a block.", + "`Boolean` - If `true` it returns the full transaction objects, if `false` only the hashes of the transactions." + ], + "returns": { + "description": "`Object` - A block object, or `null` when no block was found:", + "details": { + "number": "`QUANTITY` - the block number. `null` when its pending block.", + "hash": "`DATA`, 32 Bytes - hash of the block. `null` when its pending block.", + "parentHash": "`DATA`, 32 Bytes - hash of the parent block.", + "nonce": "`DATA`, 8 Bytes - hash of the generated proof-of-work. `null` when its pending block.", + "sha3Uncles": "`DATA`, 32 Bytes - SHA3 of the uncles data in the block.", + "logsBloom": "`DATA`, 256 Bytes - the bloom filter for the logs of the block. `null` when its pending block.", + "transactionsRoot": "`DATA`, 32 Bytes - the root of the transaction trie of the block.", + "stateRoot": "`DATA`, 32 Bytes - the root of the final state trie of the block.", + "receiptsRoot": "`DATA`, 32 Bytes - the root of the receipts trie of the block.", + "miner": "`DATA`, 20 Bytes - the address of the beneficiary to whom the mining rewards were given.", + "difficulty": "`QUANTITY` - integer of the difficulty for this block.", + "totalDifficulty": "`QUANTITY` - integer of the total difficulty of the chain until this block.", + "extraData": "`DATA` - the \"extra data\" field of this block.", + "size": "`QUANTITY` - integer the size of this block in bytes.", + "gasLimit": "`QUANTITY` - the maximum gas allowed in this block.", + "gasUsed": "`QUANTITY` - the total used gas by all transactions in this block.", + "timestamp": "`QUANTITY` - the unix timestamp for when the block was collated.", + "transactions": "`Array` - Array of transaction objects, or 32 Bytes transaction hashes depending on the last given parameter.", + "uncles": "`Array` - Array of uncle hashes." + } + }, + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_getBlockByNumber", + "desc": "Returns information about a block by block number.", + "params": [ + "`QUANTITY|TAG` - integer of a block number, or the string `\"earliest\"`, `\"latest\"` or `\"pending\"`, as in the [default block parameter](#the-default-block-parameter).", + "`Boolean` - If `true` it returns the full transaction objects, if `false` only the hashes of the transactions." + ], + "returns": "See [eth_getBlockByHash](#eth_getblockbyhash)", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_getTransactionByHash", + "desc": "Returns the information about a transaction requested by transaction hash.", + "params": [ + "`DATA`, 32 Bytes - hash of a transaction" + ], + "returns": { + "description": "`Object` - A transaction object, or `null` when no transaction was found:", + "details": { + "hash": "`DATA`, 32 Bytes - hash of the transaction.", + "nonce": "`QUANTITY` - the number of transactions made by the sender prior to this one.", + "blockHash": "`DATA`, 32 Bytes - hash of the block where this transaction was in. `null` when its pending.", + "blockNumber": "`QUANTITY` - block number where this transaction was in. `null` when its pending.", + "transactionIndex": "`QUANTITY` - integer of the transactions index position in the block. `null` when its pending.", + "from": "`DATA`, 20 Bytes - address of the sender.", + "to": "`DATA`, 20 Bytes - address of the receiver. `null` when its a contract creation transaction.", + "value": "`QUANTITY` - value transferred in Wei.", + "gasPrice": "`QUANTITY` - gas price provided by the sender in Wei.", + "gas": "`QUANTITY` - gas provided by the sender.", + "input": "`DATA` - the data send along with the transaction." + } + }, + "inputFormatters": [], + "outputFormatter": "outputTransactionFormatter" + }, + { + "name": "eth_getTransactionByBlockHashAndIndex", + "desc": "Returns information about a transaction by block hash and transaction index position.", + "params": [ + "`DATA`, 32 Bytes - hash of a block.", + "`QUANTITY` - integer of the transaction index position." + ], + "returns": "See [eth_getBlockByHash](#eth_gettransactionbyhash)", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_getTransactionByBlockNumberAndIndex", + "desc": "Returns information about a transaction by block number and transaction index position.", + "params": [ + "`QUANTITY|TAG` - a block number, or the string `\"earliest\"`, `\"latest\"` or `\"pending\"`, as in the [default block parameter](#the-default-block-parameter).", + "`QUANTITY` - the transaction index position." + ], + "returns": "See [eth_getBlockByHash](#eth_gettransactionbyhash)", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_getTransactionReceipt", + "desc": "Returns the receipt of a transaction by transaction hash.\n**Note** That the receipt is not available for pending transactions.", + "params": [ + "`DATA`, 32 Bytes - hash of a transaction" + ], + "returns": { + "description": "`Object` - A transaction receipt object, or `null` when no receipt was found:", + "details": { + "transactionHash ": "`DATA`, 32 Bytes - hash of the transaction.", + "transactionIndex": "`QUANTITY` - integer of the transactions index position in the block.", + "blockHash": "`DATA`, 32 Bytes - hash of the block where this transaction was in.", + "blockNumber": "`QUANTITY` - block number where this transaction was in.", + "cumulativeGasUsed ": "`QUANTITY ` - The total amount of gas used when this transaction was executed in the block.", + "gasUsed ": "`QUANTITY ` - The amount of gas used by this specific transaction alone.", + "contractAddress ": "`DATA`, 20 Bytes - The contract address created, if the transaction was a contract creation, otherwise `null`.", + "logs": "`Array` - Array of log objects, which this transaction generated." + } + }, + "inputFormatters": [], + "outputFormatter": "outputTransactionReceiptFormatter" + }, + { + "name": "eth_getUncleByBlockHashAndIndex", + "desc": "Returns information about a uncle of a block by hash and uncle index position.", + "params": [ + "`DATA`, 32 Bytes - hash a block.", + "`QUANTITY` - the uncle's index position." + ], + "returns": "See [eth_getBlockByHash](#eth_getblockbyhash)", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_getUncleByBlockNumberAndIndex", + "desc": "Returns information about a uncle of a block by number and uncle index position.", + "params": [ + "`QUANTITY|TAG` - a block number, or the string `\"earliest\"`, `\"latest\"` or `\"pending\"`, as in the [default block parameter](#the-default-block-parameter).", + "`QUANTITY` - the uncle's index position." + ], + "returns": "See [eth_getBlockByHash](#eth_getblockbyhash)", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_getCompilers", + "desc": "Returns a list of available compilers in the client.", + "params": [], + "returns": "`Array` - Array of available compilers.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_compileSolidity", + "desc": "Returns compiled solidity code.", + "params": [ + "`String` - The source code." + ], + "returns": "`DATA` - The compiled source code.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_compileLLL", + "desc": "Returns compiled LLL code.", + "params": [ + "`String` - The source code." + ], + "returns": "`DATA` - The compiled source code.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_compileSerpent", + "desc": "Returns compiled serpent code.", + "params": [ + "`String` - The source code." + ], + "returns": "`DATA` - The compiled source code.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_newFilter", + "desc": "Creates a filter object, based on filter options, to notify when the state changes (logs).\nTo check if the state has changed, call [eth_getFilterChanges](#eth_getfilterchanges).", + "params": [], + "returns": { + "description": "1. `Object` - The filter options:", + "details": { + "fromBlock": "`QUANTITY|TAG` - (optional, default: `\"latest\"`) Integer block number, or `\"latest\"` for the last mined block or `\"pending\"`, `\"earliest\"` for not yet mined transactions.", + "toBlock": "`QUANTITY|TAG` - (optional, default: `\"latest\"`) Integer block number, or `\"latest\"` for the last mined block or `\"pending\"`, `\"earliest\"` for not yet mined transactions.", + "address": "`DATA|Array`, 20 Bytes - (optional) Contract address or a list of addresses from which logs should originate.", + "topics": "`Array of DATA`, - (optional) Array of 32 Bytes `DATA` topics. Topics are order-dependent. Each topic can also be an array of DATA with \"or\" options." + } + }, + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_newBlockFilter", + "desc": "Creates a filter in the node, to notify when a new block arrives.\nTo check if the state has changed, call [eth_getFilterChanges](#eth_getfilterchanges).", + "params": [], + "returns": "`QUANTITY` - A filter id.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_newPendingTransactionFilter", + "desc": "Creates a filter in the node, to notify when new pending transactions arrive.\nTo check if the state has changed, call [eth_getFilterChanges](#eth_getfilterchanges).", + "params": [], + "returns": "`QUANTITY` - A filter id.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_uninstallFilter", + "desc": "Uninstalls a filter with given id. Should always be called when watch is no longer needed.\nAdditonally Filters timeout when they aren't requested with [eth_getFilterChanges](#eth_getfilterchanges) for a period of time.", + "params": [ + "`QUANTITY` - The filter id." + ], + "returns": "`Boolean` - `true` if the filter was successfully uninstalled, otherwise `false`.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_getFilterChanges", + "desc": "Polling method for a filter, which returns an array of logs which occurred since last poll.", + "params": [ + "`QUANTITY` - the filter id." + ], + "returns": "`Array` - Array of log objects, or an empty array if nothing has changed since last poll.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_getFilterLogs", + "desc": "Returns an array of all logs matching filter with given id.", + "params": [ + "`QUANTITY` - The filter id." + ], + "returns": "See [eth_getFilterChanges](#eth_getfilterchanges)", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_getLogs", + "desc": "Returns an array of all logs matching a given filter object.", + "params": [ + { + "description": "`Object` - the filter object, see [eth_newFilter parameters](#eth_newfilter).", + "details": {} + } + ], + "returns": "See [eth_getFilterChanges](#eth_getfilterchanges)", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_getWork", + "desc": "Returns the hash of the current block, the seedHash, and the boundary condition to be met (\"target\").", + "params": [], + "returns": "`Array` - Array with the following properties:", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_submitWork", + "desc": "Used for submitting a proof-of-work solution.", + "params": [ + "`DATA`, 8 Bytes - The nonce found (64 bits)", + "`DATA`, 32 Bytes - The header's pow-hash (256 bits)", + "`DATA`, 32 Bytes - The mix digest (256 bits)" + ], + "returns": "`Boolean` - returns `true` if the provided solution is valid, otherwise `false`.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_submitHashrate", + "desc": "Used for submitting mining hashrate.", + "params": [ + "`Hashrate`, a hexadecimal string representation (32 bytes) of the hash rate ", + "`ID`, String - A random hexadecimal(32 bytes) ID identifying the client" + ], + "returns": "`Boolean` - returns `true` if submitting went through succesfully and `false` otherwise.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "db_putString", + "desc": "Stores a string in the local database.\n**Note** this function is deprecated and will be removed in the future.", + "params": [ + "`String` - Database name.", + "`String` - Key name.", + "`String` - String to store." + ], + "returns": "`Boolean` - returns `true` if the value was stored, otherwise `false`.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "db_getString", + "desc": "Returns string from the local database.\n**Note** this function is deprecated and will be removed in the future.", + "params": [ + "`String` - Database name.", + "`String` - Key name." + ], + "returns": "`String` - The previously stored string.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "db_putHex", + "desc": "Stores binary data in the local database.\n**Note** this function is deprecated and will be removed in the future.", + "params": [ + "`String` - Database name.", + "`String` - Key name.", + "`DATA` - The data to store." + ], + "returns": "`Boolean` - returns `true` if the value was stored, otherwise `false`.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "db_getHex", + "desc": "Returns binary data from the local database.\n**Note** this function is deprecated and will be removed in the future.", + "params": [ + "`String` - Database name.", + "`String` - Key name." + ], + "returns": "`DATA` - The previously stored data.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "shh_version", + "desc": "Returns the current whisper protocol version.", + "params": [], + "returns": "`String` - The current whisper protocol version", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "shh_post", + "desc": "Sends a whisper message.", + "params": [ + { + "description": "`Object` - The whisper post object:", + "details": { + "from": "`DATA`, 60 Bytes - (optional) The identity of the sender.", + "to": "`DATA`, 60 Bytes - (optional) The identity of the receiver. When present whisper will encrypt the message so that only the receiver can decrypt it.", + "topics": "`Array of DATA` - Array of `DATA` topics, for the receiver to identify messages.", + "payload": "`DATA` - The payload of the message.", + "priority": "`QUANTITY` - The integer of the priority in a rang from ... (?).", + "ttl": "`QUANTITY` - integer of the time to live in seconds." + } + } + ], + "returns": "`Boolean` - returns `true` if the message was send, otherwise `false`.", + "inputFormatters": [ + "inputPostFormatter" + ], + "outputFormatter": null + }, + { + "name": "shh_newIdentity", + "desc": "Creates new whisper identity in the client.", + "params": [], + "returns": "`DATA`, 60 Bytes - the address of the new identiy.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "shh_hasIdentity", + "desc": "Checks if the client hold the private keys for a given identity.", + "params": [ + "`DATA`, 60 Bytes - The identity address to check." + ], + "returns": "`Boolean` - returns `true` if the client holds the privatekey for that identity, otherwise `false`.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "shh_newGroup", + "desc": "(?)", + "params": [], + "returns": "`DATA`, 60 Bytes - the address of the new group. (?)", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "shh_addToGroup", + "desc": "(?)", + "params": [ + "`DATA`, 60 Bytes - The identity address to add to a group (?)." + ], + "returns": "`Boolean` - returns `true` if the identity was successfully added to the group, otherwise `false` (?).", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "shh_newFilter", + "desc": "Creates filter to notify, when client receives whisper message matching the filter options.", + "params": [ + { + "description": "`Object` - The filter options:", + "details": { + "to": "`DATA`, 60 Bytes - (optional) Identity of the receiver. *When present it will try to decrypt any incoming message if the client holds the private key to this identity.*", + "topics": "`Array of DATA` - Array of `DATA` topics which the incoming message's topics should match. You can use the following combinations:" + } + } + ], + "returns": "`QUANTITY` - The newly created filter.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "shh_uninstallFilter", + "desc": "Uninstalls a filter with given id. Should always be called when watch is no longer needed.\nAdditonally Filters timeout when they aren't requested with [shh_getFilterChanges](#shh_getfilterchanges) for a period of time.", + "params": [ + "`QUANTITY` - The filter id." + ], + "returns": "`Boolean` - `true` if the filter was successfully uninstalled, otherwise `false`.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "shh_getFilterChanges", + "desc": "Polling method for whisper filters. Returns new messages since the last call of this method.\n**Note** calling the [shh_getMessages](#shh_getmessages) method, will reset the buffer for this method, so that you won't receive duplicate messages.", + "params": [ + "`QUANTITY` - The filter id." + ], + "returns": "`Array` - Array of messages received since last poll:", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "shh_getMessages", + "desc": "Get all messages matching a filter. Unlike `shh_getFilterChanges` this returns all messages.", + "params": [ + "`QUANTITY` - The filter id." + ], + "returns": "See [shh_getFilterChanges](#shh_getfilterchanges)", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_pendingTransactions", + "desc": "?", + "params": [], + "returns": "`Boolean` - whether the call was successful", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_flush", + "desc": "?", + "params": [], + "returns": "`Boolean` - whether the call was successful", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_newFilterEx", + "desc": "?", + "params": [ + "" + ], + "returns": "`Boolean` - whether the call was successful", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_getFilterChangesEx", + "desc": "?", + "params": [ + "" + ], + "returns": "`Boolean` - whether the call was successful", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_getFilterLogsEx", + "desc": "?", + "params": [ + "" + ], + "returns": "`Boolean` - whether the call was successful", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_getLogsEx", + "desc": "?", + "params": [ + "?" + ], + "returns": "`Boolean` - whether the call was successful", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_register", + "desc": "?", + "params": [ + "?" + ], + "returns": "`Boolean` - whether the call was successful", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_unregister", + "desc": "?", + "params": [ + "?" + ], + "returns": "`Boolean` - whether the call was successful", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_fetchQueuedTransactions", + "desc": "?", + "params": [ + "?" + ], + "returns": "`Boolean` - whether the call was successful", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_signTransaction", + "desc": "?", + "params": [ + "?" + ], + "returns": "`Boolean` - whether the call was successful", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "personal_signAndSendTransaction", + "desc": "Sends and signs a transaction given account passphrase. Does not require the account to be unlocked nor unlocks the account for future transactions. ", + "params": [ + { + "description": "`Object` - The transaction object", + "details": { + "from": "`DATA`, 20 Bytes - The address the transaction is send from.", + "to": "`DATA`, 20 Bytes - (optional when creating new contract) The address the transaction is directed to.", + "gas": "`QUANTITY` - (optional, default: 90000) Integer of the gas provided for the transaction execution. It will return unused gas.", + "gasPrice": "`QUANTITY` - (optional, default: To-Be-Determined) Integer of the gasPrice used for each paid gas", + "value": "`QUANTITY` - (optional) Integer of the value send with this transaction", + "data": "`DATA` - The compiled code of a contract OR the hash of the invoked method signature and encoded parameters. For details see [Ethereum Contract ABI](https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI)", + "nonce": "`QUANTITY` - (optional) Integer of a nonce. This allows to overwrite your own pending transactions that use the same nonce." + } + }, + "`PASS`, Passphrase to unlock `from` account." + ], + "returns": "`DATA`, 32 Bytes - the transaction hash, or the zero hash if the transaction is not yet available.", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_inspectTransaction", + "desc": "?", + "params": [ + "?" + ], + "returns": "`Boolean` - whether the call was successful", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "eth_notePassword", + "desc": "?", + "params": [ + "?" + ], + "returns": "`Boolean` - whether the call was successful", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "personal_newAccount", + "desc": "Creates new account", + "params": [ + "`DATA` - Password" + ], + "returns": "`Boolean` - whether the call was successful", + "inputFormatters": [ + null + ], + "outputFormatter": null + }, + { + "name": "personal_unlockAccount", + "desc": "?", + "params": [ + "?", + "?", + "?" + ], + "returns": "`Boolean` - whether the call was successful", + "inputFormatters": [ + null, + null, + null + ], + "outputFormatter": null + }, + { + "name": "ethcore_minGasPrice", + "desc": "Returns currently set minimal gas price", + "params": [], + "returns": "`QUANTITY` - Minimal Gas Price", + "inputFormatters": [], + "outputFormatter": "outputBigNumberFormatter" + }, + { + "name": "ethcore_extraData", + "desc": "Returns currently set extra data", + "params": [], + "returns": "`DATA` - Extra data", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "ethcore_setExtraData", + "desc": "Changes extra data for newly mined blocks", + "params": [ + "`DATA`- Extra Data" + ], + "returns": "`Boolean` - whether the call was successful", + "inputFormatters": [ + "utils.toHex" + ], + "outputFormatter": null + }, + { + "name": "ethcore_setMinGasPrice", + "desc": "Changes minimal gas price for transaction to be accepted to the queue.", + "params": [ + "`QUANTITY` - Minimal gas price" + ], + "returns": "`Boolean` - whether the call was successful", + "inputFormatters": [ + "utils.toHex" + ], + "outputFormatter": null + }, + { + "name": "ethcore_gasFloorTarget", + "desc": "Returns current target for gas floor", + "params": [], + "returns": "`QUANTITY` - Gas Floor Target", + "inputFormatters": [], + "outputFormatter": "outputBigNumberFormatter" + }, + { + "name": "ethcore_setGasFloorTarget", + "desc": "Changes current gas floor target.", + "params": [ + "`QUANTITY` - Gas Floor Target" + ], + "returns": "`Boolean` - whether the call was successful", + "inputFormatters": [ + "utils.toHex" + ], + "outputFormatter": null + }, + { + "name": "ethcore_setAuthor", + "desc": "Changes author (coinbase) for mined blocks.", + "params": [ + "`DATA`, 20 Bytes - Address" + ], + "returns": "`Boolean` - whether the call was successful", + "inputFormatters": [ + "inputAddressFormatter" + ], + "outputFormatter": null + }, + { + "name": "ethcore_setTransactionsLimit", + "desc": "Changes limit for transactions in queue.", + "params": [ + "`QUANTITY` - New Limit" + ], + "returns": "`Boolean` - whether the call was successful", + "inputFormatters": [ + "utils.toHex" + ], + "outputFormatter": null + }, + { + "name": "ethcore_transactionsLimit", + "desc": "Changes limit for transactions in queue.", + "params": [], + "returns": "`QUANTITY` - Current max number of transactions in queue.", + "inputFormatters": [], + "outputFormatter": "outputBigNumberFormatter" + }, + { + "name": "ethcore_netChain", + "desc": "Returns the name of the connected chain.", + "params": [], + "returns": "`DATA` - chain name", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "ethcore_netPeers", + "desc": "Returns number of peers.", + "params": [], + "returns": "`OBJECT` - JSON object containing active, connected and max peers", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "ethcore_netPort", + "desc": "Returns network port the node is listening on.", + "params": [], + "returns": "`QUANTITY` - Port Number", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "ethcore_rpcSettings", + "desc": "Returns basic settings of rpc (enabled, port, interface).", + "params": [], + "returns": "`OBJECT` - JSON object containing rpc settings", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "ethcore_nodeName", + "desc": "Returns node name (identity)", + "params": [], + "returns": "`DATA` - Node name", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "trace_filter", + "desc": "Returns traces matching given filter", + "params": [ + "`OBJECT` - The filter object" + ], + "returns": "`ARRAY` - Traces matching given filter", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "trace_get", + "desc": "Returns trace at given position.", + "params": [ + "`HASH` - Transaction hash", + "`INTEGER` - Trace position witing transaction" + ], + "returns": "`Object` - Trace", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "trace_transaction", + "desc": "Returns all traces of given transaction", + "params": [ + "`HASH` - Transaction hash" + ], + "returns": "`ARRAY` - Traces of given transaction", + "inputFormatters": [], + "outputFormatter": null + }, + { + "name": "trace_block", + "desc": "Returns traces created at given block", + "params": [ + "`BLOCKNUMBER` - Integer block number, or \"latest\" for the last mined block or \"pending\", \"earliest\" for not yet mined transactions" + ], + "returns": "`ARRAY` - Block traces", + "inputFormatters": [], + "outputFormatter": null + } + ] +} diff --git a/js/src/views/Status/icon.png b/js/src/views/Status/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f7778e67ed4f9a57d028a335cc0f64d5db142cf2 GIT binary patch literal 7414 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 literal 0 HcmV?d00001 diff --git a/js/src/views/Status/index.css b/js/src/views/Status/index.css new file mode 100644 index 00000000000..0d3fca6823b --- /dev/null +++ b/js/src/views/Status/index.css @@ -0,0 +1,19 @@ +html, +body { + margin: 0; + padding: 0; + padding-bottom: 50px; +} +:global .dapp-header nav ul { + white-space: nowrap; +} +/* shame:on */ +/* Material-ui is changing input properties with inline styles. */ +/* We want to keep it consistent */ +input { + color: #6691C2 !important; + font-size: 16px !important; + font-family: sans-serif !important; + font-weight: 200 !important; +} +/* shame:off */ diff --git a/js/src/views/Status/index.html b/js/src/views/Status/index.html new file mode 100644 index 00000000000..c3d79d5dbfe --- /dev/null +++ b/js/src/views/Status/index.html @@ -0,0 +1,12 @@ +<!doctype html> +<html> + <head> + <meta charset="utf-8"> + <title>Node Management + + + +
+ + + diff --git a/js/src/views/Status/index.js b/js/src/views/Status/index.js new file mode 100644 index 00000000000..9ec679a5df7 --- /dev/null +++ b/js/src/views/Status/index.js @@ -0,0 +1,42 @@ +import { Provider } from 'react-redux'; +import ReactDOM from 'react-dom'; +import React from 'react'; + +import localStore from 'store'; + +import './index.html'; +import './index.css'; +import '!file-loader?name=icon.png!./icon.png'; +import 'dapp-styles/dapp-styles.less'; +import './env-specific'; + +import Web3 from 'web3'; // must b after ./test otherwise it breaks +import middlewares from './middleware'; +import Routes from './routes'; +import MuiThemeProvider from './components/MuiThemeProvider'; + +import configure from './store'; +import { Web3Provider } from './provider/web3-provider'; +import EthcoreWeb3 from './provider/web3-ethcore-provider'; +import { initAppAction } from './actions/app'; + +const web3 = new Web3(new Web3.providers.HttpProvider(process.env.RPC_ADDRESS || '/rpc/')); + +const store = configure(middlewares(web3)); + +ReactDOM.render( + + + + + , + document.getElementById('root') +); + +const ethcoreWeb3 = new EthcoreWeb3(web3); +new Web3Provider(web3, ethcoreWeb3, store).start(); + +(window || global).store = localStore; +(window || global).web3 = web3; + +store.dispatch(initAppAction()); diff --git a/js/src/views/Status/middleware/index.js b/js/src/views/Status/middleware/index.js new file mode 100644 index 00000000000..364b9b670c8 --- /dev/null +++ b/js/src/views/Status/middleware/index.js @@ -0,0 +1 @@ +export default from './middleware'; diff --git a/js/src/views/Status/middleware/localstorage.js b/js/src/views/Status/middleware/localstorage.js new file mode 100644 index 00000000000..c6087eb3142 --- /dev/null +++ b/js/src/views/Status/middleware/localstorage.js @@ -0,0 +1,59 @@ + +import localStore from 'store'; +import { syncRpcStateFromLocalStorage } from '../actions/localstorage'; +import rpcMetods from '../data/rpc.json'; + +export default class localStorageMiddleware { + + toMiddleware () { + return store => next => action => { + let delegate; + switch (action.type) { + case 'add rpcResponse': delegate = ::this.onAddRpcResponse; break; + case 'reset rpcPrevCalls': delegate = ::this.onResetRpcCalls; break; + case 'init app': delegate = ::this.onInitApp; break; + default: + next(action); + return; + } + + if (!delegate) { + return; + } + + delegate(store, next, action); + }; + } + + onInitApp (store, next, action) { + const prevCalls = localStore.get('rpcPrevCalls'); + if (!(prevCalls && prevCalls.length)) { + return next(action); + } + + store.dispatch(syncRpcStateFromLocalStorage({ + prevCalls: prevCalls, + callNo: prevCalls.length ? prevCalls[0].callNo + 1 : 1, + selectedMethod: rpcMetods.methods.find(m => m.name === prevCalls[0].name) + })); + return next(action); + } + + onAddRpcResponse (store, next, action) { + action.payload.callNo = store.getState().rpc.callNo; + this.unshift('rpcPrevCalls', action.payload); + return next(action); + } + + onResetRpcCalls (store, next, action) { + localStore.set('rpcPrevCalls', []); + return next(action); + } + + // TODO [adgo] 20.04.2016 remove if/when PR is accepted: https://github.com/marcuswestin/store.js/pull/153 + unshift (key, value) { + const newArr = [value].concat(localStore.get(key) || []); + localStore.set(key, newArr); + } + +} diff --git a/js/src/views/Status/middleware/localstorage.spec.js b/js/src/views/Status/middleware/localstorage.spec.js new file mode 100644 index 00000000000..dfa437a66a8 --- /dev/null +++ b/js/src/views/Status/middleware/localstorage.spec.js @@ -0,0 +1,180 @@ +import sinon from 'sinon'; +import localStore from 'store'; + +import { syncRpcStateFromLocalStorage } from '../actions/localstorage'; +import rpcData from '../data/rpc.json'; +import LocalStorageMiddleware from './localstorage'; + +describe('MIDDLEWARE: LOCAL STORAGE', () => { + let cut, state; + + beforeEach('mock cut', () => { + cut = new LocalStorageMiddleware(); + sinon.spy(cut, 'onAddRpcResponse'); + sinon.spy(cut, 'onResetRpcCalls'); + sinon.spy(cut, 'onInitApp'); + sinon.spy(cut, 'unshift'); + state = { + rpc: { + callNo: 1 + } + }; + }); + + it('should call onAddRpcResponse when respected action is dispatched', () => { + // given + const store = { getState: () => state }; + const next = sinon.spy(); + const middleware = cut.toMiddleware()(store)(next); + const action = { type: 'add rpcResponse', payload: {} }; + expect(middleware).to.be.a('function'); + expect(action).to.be.an('object'); + + // when + middleware(action); + + // then + expect(cut.onAddRpcResponse.calledWith(store, next, action)).to.be.true; + }); + + it('should call onResetRpcCalls when respected action is dispactched', () => { + // given + const store = {}; + const next = sinon.spy(); + const middleware = cut.toMiddleware()(store)(next); + const action = { type: 'reset rpcPrevCalls', payload: {} }; + expect(middleware).to.be.a('function'); + expect(action).to.be.an('object'); + + // when + middleware(action); + + // then + expect(cut.onResetRpcCalls.calledWith(store, next, action)).to.be.true; + }); + + it('should call onInitApp when respected action is dispatched', () => { + // given + const store = { dispatch: sinon.spy() }; + const next = sinon.spy(); + const middleware = cut.toMiddleware()(store)(next); + const action = { type: 'init app' }; + cut.onInitApp = sinon.spy(); + expect(middleware).to.be.a('function'); + expect(action).to.be.an('object'); + + // when + middleware(action); + + // then + expect(cut.onInitApp.calledWith(store, next, action)).to.be.true; + }); + + it('should not call onAddRpcResponse or onInitApp when a non-respected action is dispatched', () => { + // given + const store = {}; + const next = sinon.spy(); + const middleware = cut.toMiddleware()(store)(next); + const action = { type: 'testAction' }; + expect(middleware).to.be.a('function'); + expect(action).to.be.an('object'); + + // when + middleware(action); + + // then + expect(cut.onAddRpcResponse.called).to.be.false; + expect(cut.onInitApp.called).to.be.false; + expect(next.calledWith(action)).to.be.true; + }); + + describe('RPC', () => { + it('should dispatch syncRpcStateFromLocalStorage when there are rpc calls in localStorage', () => { + // given + const store = { dispatch: sinon.spy() }; + const next = sinon.spy(); + const action = {}; + const key = 'rpcPrevCalls'; + const prevCalls = [rpcData.methods[0]]; + prevCalls[0].callNo = 1; + localStore.remove(key); + localStore.set(key, prevCalls); + + // when + cut.onInitApp(store, next, action); + + // then + expect(store.dispatch.calledWith(syncRpcStateFromLocalStorage({ + prevCalls: prevCalls, + callNo: 2, + selectedMethod: prevCalls[0] + }))).to.be.true; + expect(next.calledWith(action)).to.be.true; + }); + + it('should not dispatch syncRpcStateFromLocalStorage when there are no rpc calls in localStorage', () => { + // given + const store = { dispatch: sinon.spy() }; + const next = sinon.spy(); + const action = {}; + localStore.remove('rpcPrevCalls'); + + // when + cut.onInitApp(store, next, action); + + // then + expect(store.dispatch.notCalled).to.be.true; + expect(next.calledWith(action)).to.be.true; + }); + }); + + it('should call unshift and next', () => { + // given + const store = { getState: () => state }; + const next = sinon.spy(); + const action = { payload: {} }; + + // when + cut.onAddRpcResponse(store, next, action); + + // then + expect(cut.unshift.calledWith('rpcPrevCalls', action.payload)).to.be.true; + expect(action.payload.callNo).to.equal(1); + expect(next.calledWith(action)).to.be.true; + }); + + describe('UNSHIFT', () => { + // TODO [adgo] 20.04.2016 remove if/when PR is accepted: https://github.com/marcuswestin/store.js/pull/153 + it('should create array in local storage by key and unshift item to it', () => { + // given + const key = 'foo'; + const val = 'bar'; + localStore.remove(key); + + // when + cut.unshift(key, val); + + // then + expect(localStore.get(key)[0]).to.equal(val); + expect(localStore.get(key).length).to.equal(1); + }); + + // TODO [adgo] 20.04.2016 remove if/when PR is accepted: https://github.com/marcuswestin/store.js/pull/153 + it('should unshift item to an existing array in local storage by key', () => { + // given + const key = 'foo'; + const val = 'bar'; + const newVal = 'bazz'; + localStore.remove(key); + localStore.set(key, [val]); + expect(localStore.get(key)).to.be.defined; + + // when + cut.unshift(key, newVal); + + // then + expect(localStore.get(key)[0]).to.equal(newVal); + expect(localStore.get(key).length).to.equal(2); + }); + }); +}); diff --git a/js/src/views/Status/middleware/logger.js b/js/src/views/Status/middleware/logger.js new file mode 100644 index 00000000000..e0a8bf62463 --- /dev/null +++ b/js/src/views/Status/middleware/logger.js @@ -0,0 +1,18 @@ + +export default store => next => action => { + if (store.getState().logger.logging) { + const msg = [`[${now()}] action:`, `${action.type};`, 'payload: ', action.payload]; + const logMethod = action.type.indexOf('error') > -1 ? 'error' : 'log'; + console[logMethod](...msg); + } + return next(action); +}; + +function now () { + const date = new Date(Date.now()); + const seconds = date.getSeconds(); + const minutes = date.getMinutes(); + const hour = date.getHours(); + return `${hour}::${minutes}::${seconds}`; +} + diff --git a/js/src/views/Status/middleware/logger.spec.js b/js/src/views/Status/middleware/logger.spec.js new file mode 100644 index 00000000000..bc7ef13f802 --- /dev/null +++ b/js/src/views/Status/middleware/logger.spec.js @@ -0,0 +1,52 @@ +import sinon from 'sinon'; +import logger from './logger'; + +describe('MIDDLEWARE: LOGGER', () => { + describe('MIDDLEWARE', () => { + const state = { logger: { logging: true } }; + + beforeEach('spy console', () => { + sinon.spy(console, 'log'); + sinon.spy(console, 'error'); + }); + + afterEach('unspy console', () => { + console.log.restore(); + console.error.restore(); + }); + + it('should call console.log on non-error msgs', () => { + // given + const store = { getState: () => state }; + const next = sinon.spy(); + const action = { type: 'test action' }; + const middleware = logger(store)(next); + expect(middleware).to.be.a('function'); + expect(action).to.be.an('object'); + + // when + middleware(action); + + // then + expect(console.error.called).to.be.false; + expect(console.log.calledOnce).to.be.true; + }); + + it('should call console.log on non-error msgs', () => { + // given + const store = { getState: () => state }; + const next = sinon.spy(); + const action = { type: 'test error action' }; + const middleware = logger(store)(next); + expect(middleware).to.be.a('function'); + expect(action).to.be.an('object'); + + // when + middleware(action); + + // then + expect(console.log.called).to.be.false; + expect(console.error.calledOnce).to.be.true; + }); + }); +}); diff --git a/js/src/views/Status/middleware/middleware.js b/js/src/views/Status/middleware/middleware.js new file mode 100644 index 00000000000..805c8aaa80b --- /dev/null +++ b/js/src/views/Status/middleware/middleware.js @@ -0,0 +1,27 @@ + +import request from 'browser-request'; +import EthcoreWeb3 from '../provider/web3-ethcore-provider'; + +// Middleware classes +import logger from './logger'; +import WebInteractions from './user-web3-interactions'; +import Rpc from './rpc'; +import LocalStorage from './localstorage'; +import Toastr from './toastr.js'; + +export default function (web3) { + const ethcoreWeb3 = new EthcoreWeb3(web3); + // Middleware Instances + const web3Interactions = new WebInteractions(web3, ethcoreWeb3); + const rpc = new Rpc(request); + const localstorage = new LocalStorage(); + const toastr = new Toastr(); + + return [ + logger, + web3Interactions.toMiddleware(), + rpc.toMiddleware(), + localstorage.toMiddleware(), + toastr.toMiddleware() + ]; +} diff --git a/js/src/views/Status/middleware/rpc.js b/js/src/views/Status/middleware/rpc.js new file mode 100644 index 00000000000..db7138c693b --- /dev/null +++ b/js/src/views/Status/middleware/rpc.js @@ -0,0 +1,71 @@ + +import web3Formatters from 'web3/lib/web3/formatters.js'; +import web3Utils from 'web3/lib/utils/utils.js'; +import * as RpcActions from '../actions/rpc'; +import { hasErrors, filterErrors, isError } from '../util/error'; +import RpcProvider from '../provider/rpc-provider'; +const rpcProvider = new RpcProvider(web3Utils, web3Formatters); + +export default class RpcMiddleware { + + constructor (request) { + this._request = request; + } + + toMiddleware () { + return store => next => action => { + if (action.type !== 'fire rpc') { + return next(action); + } + + const { method, inputFormatters, outputFormatter, params } = action.payload; + const formattedParams = rpcProvider.formatParams(params, inputFormatters); + + if (hasErrors(formattedParams)) { + let errors = filterErrors(formattedParams); + return store.dispatch(RpcActions.error(errors)); + } + + this._request( + this.getOptions(method, formattedParams), + this.responseHandler(store, method, params, outputFormatter) + ); + return next(action); + }; + } + + responseHandler (store, method, params, outputFormatter) { + return (err, response, body) => { + if (err) { + return store.dispatch(RpcActions.error(err)); + } + + const formattedResult = rpcProvider.formatResult(body.result, outputFormatter); + + if (isError(formattedResult)) { + return store.dispatch(RpcActions.error(formattedResult)); + } + + const addRpcResponseAction = RpcActions.addRpcReponse({ + name: method, + params: params, + response: formattedResult + }); + store.dispatch(addRpcResponseAction); + }; + } + + getOptions (method, params) { + return { + url: '/rpc/', + method: 'POST', + json: { + id: 1000, + method: method, + jsonrpc: '2.0', + params: params + } + }; + } + +} diff --git a/js/src/views/Status/middleware/rpc.spec.js b/js/src/views/Status/middleware/rpc.spec.js new file mode 100644 index 00000000000..133c688b3cc --- /dev/null +++ b/js/src/views/Status/middleware/rpc.spec.js @@ -0,0 +1,79 @@ +import sinon from 'sinon'; +import _ from 'lodash'; + +import rpcData from '../data/rpc.json'; +import RpcMiddleware from './rpc'; +import * as RpcActions from '../actions/rpc'; + +describe('MIDDLEWARE: Rpc', () => { + let cut; + + beforeEach('mock cut', () => { + const request = sinon.spy(); + cut = new RpcMiddleware(request); + }); + + it('should not invoke request when a modify action is dispatched', () => { + // given + const store = null; + const next = sinon.spy(); + const middleware = cut.toMiddleware()(store)(next); + const action = { type: '_testAction' }; + expect(middleware).to.be.a('function'); + expect(action).to.be.an('object'); + + // when + middleware(action); + + // then + expect(next.calledWith(action)).to.be.true; + expect(cut._request.notCalled).to.be.true; + }); + + it('should invoke request when a modify action is dispatched', () => { + // given + const store = null; + const next = sinon.spy(); + const middleware = cut.toMiddleware()(store)(next); + const selectedMethod = _.find(rpcData.methods, { name: 'ethcore_minGasPrice' }); + const params = null; + const action = RpcActions.fireRpc({ + method: selectedMethod.name, + outputFormatter: selectedMethod.outputFormatter, + inputFormatters: selectedMethod.inputFormatters, + params: params + }); + expect(middleware).to.be.a('function'); + expect(action).to.be.an('object'); + + // when + middleware(action); + + // then + expect(next.calledWith(action)).to.be.true; + expect(cut._request.calledWith({ + url: '/rpc/', + method: 'POST', + json: { + id: 1000, + method: selectedMethod.name, + jsonrpc: '2.0', + params: params // TODO :: add formatting + } + })).to.be.true; + }); + + it('should dispatch add rpc response on request CB', () => { + // given + const store = { dispatch: sinon.spy() }; + const method = 'testMethod'; + const params = []; + const cb = (null, null, {}); + + // when + cut.responseHandler(store, method, params)(cb); + + // then + expect(store.dispatch.called).to.be.true; + }); +}); diff --git a/js/src/views/Status/middleware/toastr.js b/js/src/views/Status/middleware/toastr.js new file mode 100644 index 00000000000..0bc867ef130 --- /dev/null +++ b/js/src/views/Status/middleware/toastr.js @@ -0,0 +1,53 @@ + +import { addToast, removeToast } from '../actions/toastr'; + +export default class ToastrMiddleware { + + constructor (time = 4000) { + this._time = time; + this._timeouts = {}; + } + + toMiddleware () { + return store => next => action => { + const { type, payload } = action; + if (type === 'remove toast' || type === 'freezeToast') { + this.clearTimeoutFor(payload); + } + + // pass along action + next(action); + + if (!this.shouldToast(action)) { + return; + } + + // if action should toast, call next again with toast values + this.toast(store, next, action); + }; + } + + toast (store, next, action) { + const { toastNo } = store.getState().toastr; + const { msg, type } = action.meta.toastr; + next(addToast({ type, msg, toastNo })); + this.setTimeoutFor(toastNo, next); + } + + setTimeoutFor (toastNo, next) { + this._timeouts[String(toastNo)] = setTimeout(() => { + this.clearTimeoutFor(toastNo); + next(removeToast(toastNo)); + }, this._time); + } + + shouldToast (action) { + return !!(action.meta && action.meta.toastr); + } + + clearTimeoutFor (toastNo) { + clearTimeout(this._timeouts[String(toastNo)]); + delete this._timeouts[String(toastNo)]; + } + +} diff --git a/js/src/views/Status/middleware/toastr.spec.js b/js/src/views/Status/middleware/toastr.spec.js new file mode 100644 index 00000000000..73036e4f6c6 --- /dev/null +++ b/js/src/views/Status/middleware/toastr.spec.js @@ -0,0 +1,174 @@ +import sinon from 'sinon'; +import ToastrMiddleware from './toastr'; +import { removeToast, addToast } from '../actions/toastr'; + +describe('MIDDLEWARE: TOASTR', () => { + let cut, state; + const time = 20; + let toastNo = 1; + + beforeEach('mock cut', () => { + cut = new ToastrMiddleware(time); + state = { + toastr: { + toastNo: toastNo + } + }; + }); + + describe('TO MIDDLEWARE', () => { + beforeEach('mock methods', () => { + cut.clearTimeoutFor = sinon.spy(); + cut.toast = sinon.spy(); + }); + + it('should call only clearTimeoutFor and next, when respected action is dispatched', () => { + // given + const store = null; + const next = sinon.spy(); + const middleware = cut.toMiddleware()(store)(next); + const action = removeToast(toastNo); + expect(middleware).to.be.a('function'); + expect(action).to.be.an('object'); + + // when + middleware(action); + + // then + expect(cut.clearTimeoutFor.calledWith(toastNo)).to.be.true; + expect(next.calledWith(action)).to.be.true; + expect(cut.toast.called).to.be.false; + }); + + it('should call only next when non-respected action is dispatched', () => { + // given + const store = null; + const next = sinon.spy(); + const middleware = cut.toMiddleware()(store)(next); + const action = { type: 'test' }; + expect(middleware).to.be.a('function'); + expect(action).to.be.an('object'); + + // when + middleware(action); + + // then + expect(cut.clearTimeoutFor.called).to.be.false; + expect(next.calledWith(action)).to.be.true; + expect(cut.toast.called).to.be.false; + }); + + it('should call only next and toast, when action with meta toastr is dispatched', () => { + // given + const msg = 'test'; + const store = null; + const next = sinon.spy(); + const middleware = cut.toMiddleware()(store)(next); + const meta = { toastr: { msg, type: 'default' } }; + const action = { type: 'test', payload: 'test', meta }; + expect(middleware).to.be.a('function'); + expect(action).to.be.an('object'); + + // when + middleware(action); + + // then + expect(cut.clearTimeoutFor.called).to.be.false; + expect(next.calledWith(action)).to.be.true; + expect(cut.toast.calledWith(store, next, action)).to.be.true; + }); + }); + + describe('TOAST', () => { + // using 'before' doesn't work + // it might b overwriten by the global beforeEach + beforeEach('spy on removeToast', () => { + cut.setTimeoutFor = sinon.spy(); + }); + + it('should call next and setTimeoutFor', () => { + // given + const msg = 'text'; + const type = 'default'; + const store = { getState: () => state }; + const next = sinon.spy(); + const action = { meta: { toastr: { + msg, type + } } }; + + // when + cut.toast(store, next, action); + + // then + expect(next.calledWith(addToast({ + msg, type, toastNo + }))).to.be.true; + + expect(cut.setTimeoutFor.calledWith(toastNo, next)); + }); + }); + + describe('SET TIMEOUT FOR', () => { + beforeEach('spy on clearTimeoutFor', () => { + cut.clearTimeoutFor = sinon.spy(); + }); + it('should call clearTimeoutFor and next after cut._time', done => { + // given + const next = sinon.spy(); + + // when + cut.setTimeoutFor(toastNo, next); + + // then + expect(cut._timeouts[String(toastNo)]).to.be.an('object'); + setTimeout(() => { + expect(cut.clearTimeoutFor.calledWith(toastNo)).to.be.true; + expect(next.calledWith(removeToast(toastNo))).to.be.true; + done(); + }, time); + }); + }); + + describe('SHOULD TOAST', () => { + it('should return false when action isn\'t toastable', () => { + // given + const action = { meta: {} }; + + // when + const res = cut.shouldToast(action); + + // then + expect(res).to.be.false; + }); + it('should return true when action is toastable', () => { + // given + const action = { meta: { toastr: { msg: 'foo' } } }; + + // when + const res = cut.shouldToast(action); + + // then + expect(res).to.be.true; + }); + }); + describe('CLEAR TIMEOUT FOR', () => { + let mockedTimeoutSpy; + beforeEach('mock timeouts', () => { + mockedTimeoutSpy = sinon.spy(); + cut._timeouts[String(toastNo)] = setTimeout(() => { + mockedTimeoutSpy(); + }, time); + }); + it('should clear and delete timeout', done => { + // when + cut.clearTimeoutFor(toastNo); + + // then + expect(cut._timeouts[String(toastNo)]).to.be.undefined; + setTimeout(() => { + expect(mockedTimeoutSpy.called).to.be.false; + done(); + }, time); + }); + }); +}); diff --git a/js/src/views/Status/middleware/user-web3-interactions.js b/js/src/views/Status/middleware/user-web3-interactions.js new file mode 100644 index 00000000000..ed42272b6d1 --- /dev/null +++ b/js/src/views/Status/middleware/user-web3-interactions.js @@ -0,0 +1,34 @@ + +import { Web3Base } from '../provider/web3-base'; + +export default class WebInteractions extends Web3Base { + + toMiddleware () { + return store => next => action => { + let delegate; + if (action.type.indexOf('modify ') > -1) { + delegate = ::this.onModify; + } else { + next(action); + return; + } + + if (!delegate) { + return; + } + + delegate(store, next, action); + }; + } + + onModify (store, next, action) { + this.ethcoreWeb3[this.getMethod(action.type)](action.payload); + action.type = action.type.replace('modify ', 'update '); + return next(action); + } + + getMethod (actionType) { + let method = actionType.split('modify ')[1]; + return 'set' + method[0].toUpperCase() + method.slice(1); + } +} diff --git a/js/src/views/Status/middleware/user-web3-interactions.spec.js b/js/src/views/Status/middleware/user-web3-interactions.spec.js new file mode 100644 index 00000000000..6cee5aaa390 --- /dev/null +++ b/js/src/views/Status/middleware/user-web3-interactions.spec.js @@ -0,0 +1,63 @@ +import sinon from 'sinon'; +import WebInteractions from './user-web3-interactions'; +import * as MiningActions from '../actions/modify-mining'; + +describe('MIDDLEWARE: WEB3 INTERACTIONS', () => { + let cut; + + beforeEach('Mock cut', () => { + const web3 = null; + const ethcoreWeb3 = { + setExtraData: sinon.spy() + }; + cut = new WebInteractions(web3, ethcoreWeb3); + }); + + it('should get correct function names', () => { + expect(cut.getMethod('modify minGasPrice')).to.equal('setMinGasPrice'); + }); + + it('should not invoke web3 when a non modify action is dispatched', () => { + // given + const store = null; + const next = sinon.spy(); + const middleware = cut.toMiddleware()(store)(next); + const action = { type: 'testAction', payload: 'testPayload' }; + expect(middleware).to.be.a('function'); + expect(action).to.be.an('object'); + + // when + middleware(action); + + // then + expect(next.calledWith(action)).to.be.true; + Object.keys(cut.ethcoreWeb3).map(func => { + expect(cut.ethcoreWeb3[func].notCalled).to.be.true; + }); + }); + + it('should invoke web3 when a modify action is dispatched', () => { + // given + const extraData = 'Parity'; + const store = null; + const next = sinon.spy(); + const middleware = cut.toMiddleware()(store)(next); + const action = MiningActions.modifyExtraData(extraData); + expect(middleware).to.be.a('function'); + expect(action).to.be.an('object'); + + // when + middleware(action); + + // then + expect( + cut.ethcoreWeb3[cut.getMethod('modify extraData')] + .calledWith(action.payload) + ).to.be.true; + expect(action.type).to.equal('update extraData'); + expect(next.calledWith({ + type: 'update extraData', + payload: extraData + })).to.be.true; + }); +}); diff --git a/js/src/views/Status/provider/rpc-provider.js b/js/src/views/Status/provider/rpc-provider.js new file mode 100644 index 00000000000..8cb3ebd1880 --- /dev/null +++ b/js/src/views/Status/provider/rpc-provider.js @@ -0,0 +1,63 @@ + +import { stringifyIfObject } from '../util'; + +export default class RpcProvider { + + constructor (web3Utils, web3Formatters) { + this._web3Utils = web3Utils; + this._web3Formatters = web3Formatters; + } + + formatResult (result, formatterName) { + if (!formatterName) { + return typeof result === 'object' ? result : String(result); + } + + let formatter; + + if (formatterName.indexOf('utils.') > -1) { + formatter = this._web3Utils[formatterName.split('.')[1]]; + } else { + formatter = this._web3Formatters[formatterName]; + } + + try { + return `${formatter(result)}`; + } catch (err) { + result = stringifyIfObject(result); + const msg = `error using ${formatterName} on ${result}: ${err}`; + console.error(msg); + return new Error(msg); + } + } + + formatParams (params, inputFormatters) { + if (!inputFormatters || !inputFormatters.length) { + return params; + } + + return params.map((param, i) => { + let formatterName = inputFormatters[i]; + if (!formatterName) { + return param; + } + + let formatter; + + if (formatterName.indexOf('utils.') > -1) { + formatter = this._web3Utils[formatterName.split('.')[1]]; + } else { + formatter = this._web3Formatters[formatterName]; + } + + try { + return formatter(param); + } catch (err) { + param = stringifyIfObject(param); + const msg = `error using ${formatterName} on ${param}: ${err}`; + console.error(msg); + return new Error(msg); + } + }); + } +} diff --git a/js/src/views/Status/provider/rpc-provider.spec.js b/js/src/views/Status/provider/rpc-provider.spec.js new file mode 100644 index 00000000000..650b3357f9d --- /dev/null +++ b/js/src/views/Status/provider/rpc-provider.spec.js @@ -0,0 +1,90 @@ +import sinon from 'sinon'; +import RpcProvider from './rpc-provider'; + +describe('PROVIDER - RPC', () => { + let cut; + + beforeEach('Mock cut', () => { + const mockedWeb3Utils = { testUtil: sinon.spy() }; + const mockedWeb3Formatters = { testFormatter: sinon.spy() }; + cut = new RpcProvider(mockedWeb3Utils, mockedWeb3Formatters); + }); + + describe('FORMAT RESULT', () => { + it('should not format result and coherse to string when no formatter is passed', () => { + // given + const result = 5; + const formatter = null; + + // when + const returned = cut.formatResult(result, formatter); + + // then + expect(returned).to.equal('5'); + }); + + it('should format with web3Utils and coherse to string when respected formatter is passed', () => { + // given + const result = 5; + const formatter = 'utils.testUtil'; + + // when + cut.formatResult(result, formatter); + + // then + expect(cut._web3Utils.testUtil.calledWith(result)).to.be.true; + }); + + it('should format with web3Formatters and coherse to string when respected formatter is passed', () => { + // given + const result = 5; + const formatter = 'testFormatter'; + + // when + cut.formatResult(result, formatter); + + // then + expect(cut._web3Formatters.testFormatter.calledWith(result)).to.be.true; + }); + }); + + describe('FORMAT PARAMS', () => { + it('should not format params when no formatters are passed', () => { + // given + const params = [5, 20]; + const formatters = null; + + // when + const returned = cut.formatParams(params, formatters); + + // then + expect(returned).to.eql(params); + }); + + it('should format with web3Utils when respected formatter is passed', () => { + // given + const params = [5, 20]; + const formatters = ['utils.testUtil', null]; + + // when + cut.formatParams(params, formatters); + + // then + expect(cut._web3Utils.testUtil.calledWith(params[0])).to.be.true; + expect(cut._web3Utils.testUtil.calledOnce).to.be.true; + }); + + it('should format with web3Formatters and coherse to string when respected formatter is passed', () => { + // given + const params = [5, 20]; + const formatters = ['testFormatter']; + + // when + cut.formatParams(params, formatters); + + // then + expect(cut._web3Formatters.testFormatter.calledWith(params[0])).to.be.true; + expect(cut._web3Formatters.testFormatter.calledOnce).to.be.true; + }); + }); +}); diff --git a/js/src/views/Status/provider/web3-base.js b/js/src/views/Status/provider/web3-base.js new file mode 100644 index 00000000000..a51e63bdb77 --- /dev/null +++ b/js/src/views/Status/provider/web3-base.js @@ -0,0 +1,9 @@ + +export class Web3Base { + + constructor (web3, ethcoreWeb3) { + this.web3 = web3; + this.ethcoreWeb3 = ethcoreWeb3; + } + +} diff --git a/js/src/views/Status/provider/web3-ethcore-provider.js b/js/src/views/Status/provider/web3-ethcore-provider.js new file mode 100644 index 00000000000..73b89215ae4 --- /dev/null +++ b/js/src/views/Status/provider/web3-ethcore-provider.js @@ -0,0 +1,101 @@ +import Method from 'web3/lib/web3/method'; +import formatters from 'web3/lib/web3/formatters'; +import utils from 'web3/lib/utils/utils'; + +const methods = [ + new Method({ + name: 'getExtraData', + call: 'ethcore_extraData', + params: 0 + }), + new Method({ + name: 'setExtraData', + call: 'ethcore_setExtraData', + params: 1, + inputFormatter: [utils.toHex] + }), + new Method({ + name: 'getDefaultExtraData', + call: 'ethcore_defaultExtraData', + params: 0 + }), + new Method({ + name: 'getMinGasPrice', + call: 'ethcore_minGasPrice', + params: 0, + outputFormatter: formatters.outputBigNumberFormatter + }), + new Method({ + name: 'setMinGasPrice', + call: 'ethcore_setMinGasPrice', + params: 1, + inputFormatter: [utils.toHex] + }), + new Method({ + name: 'getGasFloorTarget', + call: 'ethcore_gasFloorTarget', + params: 0, + outputFormatter: formatters.outputBigNumberFormatter + }), + new Method({ + name: 'setGasFloorTarget', + call: 'ethcore_setGasFloorTarget', + params: 1, + inputFormatter: [utils.toHex] + }), + new Method({ + name: 'setAuthor', + call: 'ethcore_setAuthor', + params: 1, + inputFormatter: [formatters.inputAddressFormatter] + }), + new Method({ + name: 'getDevLogs', + call: 'ethcore_devLogs', + params: 0 + }), + new Method({ + name: 'getDevLogsLevels', + call: 'ethcore_devLogsLevels', + params: 0 + }), + new Method({ + name: 'getNetChain', + call: 'ethcore_netChain', + params: 0 + }), + new Method({ + name: 'getNetPeers', + call: 'ethcore_netPeers', + params: 0 + }), + new Method({ + name: 'getNetPort', + call: 'ethcore_netPort', + params: 0 + }), + new Method({ + name: 'getRpcSettings', + call: 'ethcore_rpcSettings', + params: 0 + }), + new Method({ + name: 'getNodeName', + call: 'ethcore_nodeName', + params: 0 + }) +]; + +class Ethcore { + + constructor (web3) { + this._requestManager = web3._requestManager; + + methods.map(method => { + method.attachToObject(this); + method.setRequestManager(this._requestManager); + }); + } +} + +export default Ethcore; diff --git a/js/src/views/Status/provider/web3-provider.js b/js/src/views/Status/provider/web3-provider.js new file mode 100644 index 00000000000..ee1ea8f947d --- /dev/null +++ b/js/src/views/Status/provider/web3-provider.js @@ -0,0 +1,143 @@ + +import { isArray, isObject, isEqual, compact } from 'lodash'; +import { isBigNumber } from 'web3/lib/utils/utils'; +import { toPromise } from '../util'; +import { Web3Base } from './web3-base'; +import * as StatusActions from '../actions/status'; +import * as MiningActions from '../actions/mining'; +import * as DebugActions from '../actions/debug'; + +export class Web3Provider extends Web3Base { + + state = {} + + constructor (web3, ethcoreWeb3, store) { + super(web3, ethcoreWeb3); + this.store = store; + this.delay = 500; + this.running = false; + this.tickArr = this.getTickArr(); + } + + onStart () { + toPromise(this.web3.version.getNode) + .then(StatusActions.updateVersion) + .then(::this.store.dispatch) + .catch(err => { + console.error(err); + this.store.dispatch(StatusActions.error(err)); + }); + } + + onTickWhenDisconnected () { + // When disconnected we are only checking single call. + // After we connect again - onTick should refresh all other results. + const call = this.tickArr[0]; + return toPromise(call.method) + .then(call.actionMaker) + .then(this.store.dispatch) + .catch(err => { + this.store.dispatch(StatusActions.error(err)); + }); + } + + onTick () { + if (this.store.getState().status.disconnected) { + return this.onTickWhenDisconnected(); + } + + return Promise.all(this.tickArr.map((obj, idx) => { + if (!obj.actionMaker) { + console.error(obj); + throw new Error(`Missing action creator for no ${idx}`); + } + return toPromise(obj.method).then(obj.actionMaker) + .catch(err => { + const action = obj.actionMaker(); + console.error(`err for ${action.type} with payload ${action.payload}`); + this.store.dispatch(StatusActions.error(err)); + return false; // don't process errors in the promise chain + }); + })) + .then(compact) + .then(::this.filterChanged) + .then(::this.updateState) + .then(actions => actions.map(this.store.dispatch)) + .catch(err => { + console.error(err); + this.store.dispatch(StatusActions.error(err)); + }); + } + + getTickArr () { + return [ + { method: this.web3.eth.getBlockNumber, actionMaker: StatusActions.updateBlockNumber }, + { method: this.web3.eth.getHashrate, actionMaker: StatusActions.updateHashrate }, + { method: this.web3.eth.getAccounts, actionMaker: StatusActions.updateAccounts }, + { method: this.web3.eth.getCoinbase, actionMaker: MiningActions.updateAuthor }, + { method: this.ethcoreWeb3.getMinGasPrice, actionMaker: MiningActions.updateMinGasPrice }, + { method: this.ethcoreWeb3.getGasFloorTarget, actionMaker: MiningActions.updateGasFloorTarget }, + { method: this.ethcoreWeb3.getExtraData, actionMaker: MiningActions.updateExtraData }, + { method: this.ethcoreWeb3.getDefaultExtraData, actionMaker: MiningActions.updateDefaultExtraData }, + { method: this.ethcoreWeb3.getDevLogsLevels, actionMaker: DebugActions.updateDevLogsLevels }, + { method: this.ethcoreWeb3.getDevLogs, actionMaker: DebugActions.updateDevLogs }, + { method: this.ethcoreWeb3.getNetChain, actionMaker: StatusActions.updateNetChain }, + { method: this.ethcoreWeb3.getNetPort, actionMaker: StatusActions.updateNetPort }, + { method: this.ethcoreWeb3.getNetPeers, actionMaker: StatusActions.updateNetPeers }, + { method: this.ethcoreWeb3.getRpcSettings, actionMaker: StatusActions.updateRpcSettings }, + { method: this.ethcoreWeb3.getNodeName, actionMaker: StatusActions.updateNodeName } + ]; + } + + nextDelay () { + let noOfErrors = this.store.getState().status.noOfErrors; + if (noOfErrors === 0) { + return this.delay; + } + return this.delay * (1 + Math.log(noOfErrors)); + } + + start () { + this.running = true; + this.onStart(); + this.refreshTick(); + return () => { this.running = false; }; + } + + refreshTick () { + if (!this.running) { + return; + } + this.onTick().then(() => { + setTimeout(::this.refreshTick, this.nextDelay()); + }); + } + + filterChanged (actions) { + return actions.filter(action => { + const val = this.state[this.actionToStateProp(action)]; + + if (isBigNumber(val)) { + return !val.equals(action.payload); + } + + if (isArray(val) || isObject(val)) { + return !isEqual(val, action.payload); + } + + return val !== action.payload; + }); + } + + updateState (actions) { + return actions.map(action => { + this.state[this.actionToStateProp(action)] = action.payload; + return action; + }); + } + + actionToStateProp (action) { + return action.type.split(' ')[1]; + } + +} diff --git a/js/src/views/Status/provider/web3-provider.spec.js b/js/src/views/Status/provider/web3-provider.spec.js new file mode 100644 index 00000000000..85e3e4f14cc --- /dev/null +++ b/js/src/views/Status/provider/web3-provider.spec.js @@ -0,0 +1,83 @@ +import sinon from 'sinon'; +import { Web3Provider } from './web3-provider'; +import * as StatusActions from '../actions/status'; + +describe('WEB3 PROVIDER', () => { + let cut; + let state; + let web3; + + beforeEach('mock Web3Provider', () => { + state = { + status: { + noOfErrors: 0 + } + }; + web3 = { + eth: { + getHashrate: sinon.spy(), + getBlockNumber: sinon.spy(), + getCoinbase: sinon.spy() + }, + net: { + getPeerCount: sinon.spy() + }, + version: { + getNode: sinon.spy() + } + }; + + const ethcoreWeb3 = { + getMinGasPrice: sinon.spy(), + getGasFloorTarget: sinon.spy(), + getExtraData: sinon.spy() + }; + + const store = { + dispatch: sinon.spy(), + getState: () => state + }; + + cut = new Web3Provider(web3, ethcoreWeb3, store); + }); + + it('should get action from action type', () => { + // given + const action = StatusActions.updatePeerCount(20); + + // then + expect(cut.actionToStateProp(action)).to.equal('peerCount'); + }); + + it('should get this.delay when no errors', () => { + // given + state.status.noOfErrors = 0; + + // then + expect(cut.nextDelay()).to.equal(cut.delay); + }); + + it('should get result higher this.delay when there are errors', () => { + // given + state.status.noOfErrors = 10; + + // then + expect(cut.nextDelay()).to.be.above(cut.delay); + }); + + it('should call only single method when you are disconnected', () => { + // given + state.status.disconnected = true; + + // when + cut.onTick(); + + // then + expect(web3.eth.getBlockNumber.called).to.be.true; + + [web3.eth.getHashrate, web3.eth.getCoinbase, web3.net.getPeerCount] + .map(method => { + expect(method.called).to.be.false; + }); + }); +}); diff --git a/js/src/views/Status/reducers/debug.js b/js/src/views/Status/reducers/debug.js new file mode 100644 index 00000000000..c9029be5221 --- /dev/null +++ b/js/src/views/Status/reducers/debug.js @@ -0,0 +1,51 @@ + +import { handleActions } from 'redux-actions'; +import { union } from 'lodash'; + +const initialState = { + levels: '', + logging: true, + logs: [] +}; + +const maxLogs = 1024; + +export const actionHandlers = { + + 'update devLogsLevels' (state, action) { + return { + ...state, + levels: `${action.payload}` + }; + }, + + 'remove devLogs' (state, action) { + return { + ...state, + logs: [] + }; + }, + + 'update devLogging' (state, action) { + return { + ...state, + logging: action.payload + }; + }, + + 'update devLogs' (state, action) { + if (!state.logging) { + return { ...state }; + } + + let newLogs = union(state.logs, action.payload.reverse()); + + return { + ...state, + logs: newLogs.slice(newLogs.length - maxLogs) + }; + } + +}; + +export default handleActions(actionHandlers, initialState); diff --git a/js/src/views/Status/reducers/index.js b/js/src/views/Status/reducers/index.js new file mode 100644 index 00000000000..8b78d6ab1bf --- /dev/null +++ b/js/src/views/Status/reducers/index.js @@ -0,0 +1,17 @@ +import status from './status'; +import settings from './settings'; +import mining from './mining'; +import debug from './debug'; +import rpc from './rpc'; +import toastr from './toastr'; +import logger from './logger'; + +export { + status, + settings, + mining, + rpc, + toastr, + logger, + debug +}; diff --git a/js/src/views/Status/reducers/logger.js b/js/src/views/Status/reducers/logger.js new file mode 100644 index 00000000000..f3172a97019 --- /dev/null +++ b/js/src/views/Status/reducers/logger.js @@ -0,0 +1,16 @@ +import { handleActions } from 'redux-actions'; + +const isProd = process.env.NODE_ENV === 'production'; + +const initialState = { + logging: !isProd +}; + +export default handleActions({ + 'update logging' (state, action) { + return { + logging: action.payload + }; + } + +}, initialState); diff --git a/js/src/views/Status/reducers/mining.js b/js/src/views/Status/reducers/mining.js new file mode 100644 index 00000000000..2c4d340da48 --- /dev/null +++ b/js/src/views/Status/reducers/mining.js @@ -0,0 +1,51 @@ + +import { handleActions } from 'redux-actions'; + +const initialState = { + author: 'loading...', + extraData: 'loading...', + defaultExtraData: '0x01', + minGasPrice: 'loading...', + gasFloorTarget: 'loading...' +}; + +export const actionHandlers = { + + 'update author' (state, action) { + return { + ...state, + author: `${action.payload}` + }; + }, + + 'update minGasPrice' (state, action) { + return { + ...state, + minGasPrice: `${action.payload}` + }; + }, + + 'update gasFloorTarget' (state, action) { + return { + ...state, + gasFloorTarget: `${action.payload}` + }; + }, + + 'update extraData' (state, action) { + return { + ...state, + extraData: `${action.payload}` + }; + }, + + 'update defaultExtraData' (state, action) { + return { + ...state, + defaultExtraData: `${action.payload}` + }; + } + +}; + +export default handleActions(actionHandlers, initialState); diff --git a/js/src/views/Status/reducers/rpc.js b/js/src/views/Status/reducers/rpc.js new file mode 100644 index 00000000000..cb9a9340fce --- /dev/null +++ b/js/src/views/Status/reducers/rpc.js @@ -0,0 +1,49 @@ + +import { handleActions } from 'redux-actions'; +import rpcMetods from '../data/rpc.json'; + +const initialState = { + prevCalls: [], + callNo: 1, + selectedMethod: rpcMetods.methods[0] +}; + +export const actionHandlers = { + + 'add rpcResponse' (state, action) { + const calls = [action.payload].concat(state.prevCalls); + const maxCalls = 64; + return { + ...state, + callNo: state.callNo + 1, + prevCalls: calls.slice(0, maxCalls) + }; + }, + + 'sync rpcStateFromLocalStorage' (state, action) { + return { + ...state, + prevCalls: action.payload.prevCalls, + callNo: action.payload.callNo, + selectedMethod: action.payload.selectedMethod + }; + }, + + 'reset rpcPrevCalls' (state, action) { + return { + ...state, + callNo: 1, + prevCalls: [] + }; + }, + + 'select rpcMethod' (state, action) { + return { + ...state, + selectedMethod: action.payload + }; + } + +}; + +export default handleActions(actionHandlers, initialState); diff --git a/js/src/views/Status/reducers/settings.js b/js/src/views/Status/reducers/settings.js new file mode 100644 index 00000000000..51493c811ab --- /dev/null +++ b/js/src/views/Status/reducers/settings.js @@ -0,0 +1,45 @@ + +import { handleActions } from 'redux-actions'; + +const initialState = { + chain: 'loading...', + networkPort: 0, + maxPeers: 0, + rpcEnabled: false, + rpcInterface: '-', + rpcPort: 0 +}; + +export default handleActions({ + 'update netChain' (state, action) { + return { + ...state, + chain: action.payload + }; + }, + + 'update netPort' (state, action) { + return { + ...state, + networkPort: action.payload + }; + }, + + 'update netPeers' (state, action) { + return { + ...state, + maxPeers: action.payload.max + }; + }, + + 'update rpcSettings' (state, action) { + const rpc = action.payload; + + return { + ...state, + rpcEnabled: rpc.enabled, + rpcInterface: rpc.interface, + rpcPort: rpc.port + }; + } +}, initialState); diff --git a/js/src/views/Status/reducers/status.js b/js/src/views/Status/reducers/status.js new file mode 100644 index 00000000000..772ee263372 --- /dev/null +++ b/js/src/views/Status/reducers/status.js @@ -0,0 +1,77 @@ + +import { handleActions } from 'redux-actions'; + +const initialState = { + error: false, + noOfErrors: 0, + name: 'My node', + bestBlock: 'loading...', + hashrate: 'loading...', + connectedPeers: 0, + activePeers: 0, + peers: 0, + accounts: [], + version: '-' +}; + +export default handleActions({ + error (state, action) { + return { + ...state, + disconnected: (action.payload.message === 'Invalid JSON RPC response: ""'), + noOfErrors: state.noOfErrors + 1 + }; + }, + + 'update blockNumber' (state, action) { + return { + ...resetError(state), + bestBlock: `${action.payload}` + }; + }, + + 'update hashrate' (state, action) { + return { + ...resetError(state), + hashrate: `${action.payload}` + }; + }, + + 'update netPeers' (state, action) { + return { + ...state, + connectedPeers: action.payload.connected, + activePeers: action.payload.active + }; + }, + + 'update version' (state, action) { + return { + ...resetError(state), + version: action.payload + }; + }, + + 'update accounts' (state, action) { + return { + ...resetError(state), + accounts: action.payload + }; + }, + + 'update nodeName' (state, action) { + return { + ...resetError(state), + name: action.payload || ' ' + }; + } + +}, initialState); + +function resetError (state) { + return { + ...state, + disconnected: false, + noOfErrors: 0 + }; +} diff --git a/js/src/views/Status/reducers/toastr.js b/js/src/views/Status/reducers/toastr.js new file mode 100644 index 00000000000..aa34c543239 --- /dev/null +++ b/js/src/views/Status/reducers/toastr.js @@ -0,0 +1,23 @@ +import { handleActions } from 'redux-actions'; + +const initialState = { + toasts: [], + toastNo: 1 +}; + +export default handleActions({ + 'add toast' (state, action) { + return { + ...state, + toastNo: state.toastNo + 1, + toasts: [action.payload].concat(state.toasts) + }; + }, + + 'remove toast' (state, action) { + return { + ...state, + toasts: state.toasts.filter(t => t.toastNo !== action.payload) + }; + } +}, initialState); diff --git a/js/src/views/Status/routes.js b/js/src/views/Status/routes.js new file mode 100644 index 00000000000..af4d5997150 --- /dev/null +++ b/js/src/views/Status/routes.js @@ -0,0 +1,45 @@ + +import React, { Component, PropTypes } from 'react'; + +import { Router, Route, useRouterHistory, IndexRedirect } from 'react-router'; +import { createHashHistory } from 'history'; +import { syncHistoryWithStore } from 'react-router-redux'; + +import AppContainer from './containers/App'; +import StatusPage from './containers/StatusPage'; +import DebugPage from './containers/DebugPage'; +import AccountsPage from './containers/AccountsPage'; +import RpcPage from './containers/RpcPage'; +import RpcCalls from './components/RpcCalls'; +import RpcDocs from './components/RpcDocs'; + +const routerHistory = useRouterHistory(createHashHistory)({ + queryKey: false +}); + +export default class Routes extends Component { + + render () { + const history = syncHistoryWithStore(routerHistory, this.props.store); + return ( + + + + + + + + + + + + + + ); + } + + static propTypes = { + store: PropTypes.object.isRequired + } + +} diff --git a/js/src/views/Status/store/index.js b/js/src/views/Status/store/index.js new file mode 100644 index 00000000000..aacfae5dff8 --- /dev/null +++ b/js/src/views/Status/store/index.js @@ -0,0 +1 @@ +export default from './store'; diff --git a/js/src/views/Status/store/store.js b/js/src/views/Status/store/store.js new file mode 100644 index 00000000000..b44a104d718 --- /dev/null +++ b/js/src/views/Status/store/store.js @@ -0,0 +1,24 @@ +import { createStore, applyMiddleware } from 'redux'; + +import rootReducer from '../reducers'; + +export default function configure (middlewares) { + const create = window.devToolsExtension + ? window.devToolsExtension()(createStore) + : createStore; + + const createStoreWithMiddleware = applyMiddleware( + ...middlewares + )(create); + + const store = createStoreWithMiddleware(rootReducer); + + if (module.hot) { + module.hot.accept('../reducers', () => { + const nextReducer = require('../reducers'); + store.replaceReducer(nextReducer); + }); + } + + return store; +} diff --git a/js/src/views/Status/util/error.js b/js/src/views/Status/util/error.js new file mode 100644 index 00000000000..aa03d892b71 --- /dev/null +++ b/js/src/views/Status/util/error.js @@ -0,0 +1,15 @@ + +export function filterErrors (xs) { + return xs.filter(isError); +} + +export function hasErrors (xs) { + if (!xs) { + return; + } + return !!xs.find(isError); +} + +export function isError (x) { + return x instanceof Error; +} diff --git a/js/src/views/Status/util/error.spec.js b/js/src/views/Status/util/error.spec.js new file mode 100644 index 00000000000..a5e4cbdda4b --- /dev/null +++ b/js/src/views/Status/util/error.spec.js @@ -0,0 +1,93 @@ +import sinon from 'sinon'; +import * as ErrorUtil from './error'; + +describe('util/error', () => { + beforeEach('spy on isError', () => { + sinon.spy(ErrorUtil, 'isError'); + }); + + afterEach('spy on isError', () => { + ErrorUtil.isError.restore(); + }); + + describe('filterErrors', () => { + const ERROR1 = new Error('abc'); + const ERROR2 = new Error('def'); + const INPUT = [ERROR1, 'ghi', ERROR2, 'jkl']; + const ERRORS = [ERROR1, ERROR2]; + + it('should return errors in the array', () => { + expect(ErrorUtil.filterErrors(INPUT)).to.deep.equal(ERRORS); + }); + }); + + describe('hasErrors', () => { + it('should return undefined and not invoke isError when null is passed', () => { + // given + const xs = null; + + // when + const res = ErrorUtil.hasErrors(xs); + + // then + expect(ErrorUtil.isError.called).to.be.false; + expect(res).to.be.undefined; + }); + + it('should return true and invoke isError when at least one error object is passed', () => { + // given + const arg1 = 'test string'; + const arg2 = new Error(); + const xs = [arg1, arg2]; + + // when + const res = ErrorUtil.hasErrors(xs); + + // then + // todo [adgo] - 30.04.2016 - fix and uncomment + // expect(ErrorUtil.isError.calledWith(arg1)).to.be.true; + // expect(ErrorUtil.isError.calledWith(arg2)).to.be.true; + expect(res).to.be.true; + }); + + it('should return false and invoke isError when non error objects are passed', () => { + // given + const arg1 = 'test string'; + const arg2 = 123; + const xs = [arg1, arg2]; + + // when + const res = ErrorUtil.hasErrors(xs); + + // then + // todo [adgo] - 30.04.2016 - fix and uncomment + // expect(ErrorUtil.isError.calledWith(arg1)).to.be.true; + // expect(ErrorUtil.isError.calledWith(arg2)).to.be.true; + expect(res).to.be.false; + }); + }); + + describe('isError', () => { + it('should return false when non error object is passed', () => { + // given + const arg = ''; + + // when + const res = ErrorUtil.isError(arg); + + // then + expect(res).to.be.false; + }); + + it('should return true when error object is passed', () => { + // given + const arg = new Error(); + + // when + const res = ErrorUtil.isError(arg); + + // then + expect(res).to.be.true; + }); + }); +}); diff --git a/js/src/views/Status/util/index.js b/js/src/views/Status/util/index.js new file mode 100644 index 00000000000..486b3c5d7bd --- /dev/null +++ b/js/src/views/Status/util/index.js @@ -0,0 +1,23 @@ + +export function toPromise (fn) { + return new Promise((resolve, reject) => { + fn((err, res) => { + if (err) { + reject(err); + } else { + resolve(res); + } + }); + }); +} + +export function stringifyIfObject (any) { + if (typeof any === 'object') { + any = JSON.stringify(any); + } + return any; +} + +export function identity (x) { + return x; +} diff --git a/js/src/views/Status/util/index.spec.js b/js/src/views/Status/util/index.spec.js new file mode 100644 index 00000000000..52306ae6ce5 --- /dev/null +++ b/js/src/views/Status/util/index.spec.js @@ -0,0 +1,35 @@ +import { toPromise, identity } from './'; + +describe('util/index', () => { + describe('toPromise', () => { + it('rejects on error result', () => { + const ERROR = new Error(); + const FN = function (callback) { + callback(ERROR); + }; + + return toPromise(FN).catch(err => { + expect(err).to.equal(ERROR); + }); + }); + + it('resolves on success result', () => { + const SUCCESS = 'ok, we are good'; + const FN = function (callback) { + callback(null, SUCCESS); + }; + + return toPromise(FN).then(success => { + expect(success).to.equal(SUCCESS); + }); + }); + }); + + describe('identity', () => { + it('returns the value passed in', () => { + const TEST = { abc: 'def' }; + + expect(identity(TEST)).to.deep.equal(TEST); + }); + }); +}); diff --git a/js/src/views/Status/util/react.js b/js/src/views/Status/util/react.js new file mode 100644 index 00000000000..c5a99c70f5e --- /dev/null +++ b/js/src/views/Status/util/react.js @@ -0,0 +1,6 @@ + +import { isValidElement } from 'react'; + +export function isReactComponent (componentOrElem) { + return isValidElement(componentOrElem) && typeof componentOrElem.type === 'function'; +} diff --git a/js/src/views/Status/util/rpc-md.js b/js/src/views/Status/util/rpc-md.js new file mode 100644 index 00000000000..ac77aa3a852 --- /dev/null +++ b/js/src/views/Status/util/rpc-md.js @@ -0,0 +1,12 @@ + +import { isPlainObject } from 'lodash'; + +export function formatRpcMd (val) { + if (!isPlainObject(val)) { + return val; + } + + return val.description + Object.keys(val.details) + .map(key => `- \`${key}\`: ${val.details[key]}`) + .join('\n'); +} diff --git a/js/src/views/Status/util/toastr.js b/js/src/views/Status/util/toastr.js new file mode 100644 index 00000000000..cf09a10c454 --- /dev/null +++ b/js/src/views/Status/util/toastr.js @@ -0,0 +1,11 @@ +// pass this to action creator's meta (third argument) to make action toastable +export function withToastr (msgFunc, type = 'default') { + return function (msg) { + return { + toastr: { + msg: msgFunc(msg), + type + } + }; + }; +} diff --git a/js/src/views/Status/util/toastr.spec.js b/js/src/views/Status/util/toastr.spec.js new file mode 100644 index 00000000000..6cbff32131e --- /dev/null +++ b/js/src/views/Status/util/toastr.spec.js @@ -0,0 +1,38 @@ +import { withToastr } from './toastr'; + +describe('UTIL TOASTR', () => { + it('should return toastr object with type set to default, when no type is passed', () => { + // given + const msg = 'test'; + const msgFunc = x => `some text and ${x}`; + + // when + const res = withToastr(msgFunc)(msg); + + // then + expect(res).to.eql({ + toastr: { + msg: `some text and ${msg}`, + type: 'default' + } + }); + }); + + it('should return toastr object with type set to success, when success type is passed', () => { + // given + const msg = 'test'; + const type = 'success'; + const msgFunc = x => `some text and ${x}`; + + // when + const res = withToastr(msgFunc, type)(msg); + + // then + expect(res).to.eql({ + toastr: { + msg: `some text and ${msg}`, + type + } + }); + }); +}); From b4f5767aa4e0bbc9b22829e44f13cf74b0962d05 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 7 Sep 2016 21:16:48 +0200 Subject: [PATCH 0370/1062] status page shows something, nothing live, but something --- js/package.json | 3 +++ .../Status => }/dapp-styles/hex-grid-tile.png | Bin js/src/index.js | 1 + .../Status/containers/Container/Container.js | 4 ++- .../Status/containers/Container/status.css | 2 ++ js/webpack.config.js | 24 +++++++++++++++++- 6 files changed, 32 insertions(+), 2 deletions(-) rename js/src/{views/Status => }/dapp-styles/hex-grid-tile.png (100%) create mode 100644 js/src/views/Status/containers/Container/status.css diff --git a/js/package.json b/js/package.json index 9a5003143ab..3ecd397b7fc 100644 --- a/js/package.json +++ b/js/package.json @@ -56,6 +56,7 @@ "cheerio": "0.20.0", "coveralls": "^2.11.11", "css-loader": "^0.23.1", + "dapp-styles": "^0.2.2", "enzyme": "2.3.0", "eslint": "^3.1.0", "eslint-config-semistandard": "^6.0.2", @@ -73,6 +74,8 @@ "istanbul": "^1.0.0-alpha.2", "jsdom": "9.2.1", "json-loader": "^0.5.4", + "less": "^2.7.1", + "less-loader": "^2.2.3", "mocha": "^3.0.0-1", "mock-local-storage": "1.0.2", "mock-socket": "^3.0.1", diff --git a/js/src/views/Status/dapp-styles/hex-grid-tile.png b/js/src/dapp-styles/hex-grid-tile.png similarity index 100% rename from js/src/views/Status/dapp-styles/hex-grid-tile.png rename to js/src/dapp-styles/hex-grid-tile.png diff --git a/js/src/index.js b/js/src/index.js index b353bd6c408..6fdd58cc612 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -31,6 +31,7 @@ import { status as statusReducer, settings as statusSettingsReducer, mining as s import Status from './views/Status/containers/Container'; import './environment'; +import 'dapp-styles/dist/dapp-styles.css'; import styles from './reset.css'; import './index.html'; diff --git a/js/src/views/Status/containers/Container/Container.js b/js/src/views/Status/containers/Container/Container.js index a5e9ce75b4e..f2a6c453368 100644 --- a/js/src/views/Status/containers/Container/Container.js +++ b/js/src/views/Status/containers/Container/Container.js @@ -10,6 +10,8 @@ import { updateLogging } from '../../actions/logger'; import ToastrContainer from '../../components/ToastrContainer'; import StatusPage from '../StatusPage'; +import styles from './status.css'; + class Container extends Component { static propTypes = { status: PropTypes.object.isRequired, @@ -24,7 +26,7 @@ class Container extends Component { const { name, disconnected, noOfErrors, version } = this.props.status; return ( -
+
Date: Wed, 7 Sep 2016 21:37:47 +0200 Subject: [PATCH 0371/1062] fix overrides of soon to be removed external, non-standard styles --- js/src/index.js | 1 - .../components/TransactionFinished/TransactionFinished.css | 1 + .../TransactionPendingForm/TransactionPendingForm.css | 1 + js/src/views/Status/components/Status/Status.js | 1 + js/src/views/Status/containers/Container/Container.js | 2 ++ 5 files changed, 5 insertions(+), 1 deletion(-) diff --git a/js/src/index.js b/js/src/index.js index 6fdd58cc612..b353bd6c408 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -31,7 +31,6 @@ import { status as statusReducer, settings as statusSettingsReducer, mining as s import Status from './views/Status/containers/Container'; import './environment'; -import 'dapp-styles/dist/dapp-styles.css'; import styles from './reset.css'; import './index.html'; diff --git a/js/src/views/Signer/components/TransactionFinished/TransactionFinished.css b/js/src/views/Signer/components/TransactionFinished/TransactionFinished.css index fa8360999b5..3c8a7aa818a 100644 --- a/js/src/views/Signer/components/TransactionFinished/TransactionFinished.css +++ b/js/src/views/Signer/components/TransactionFinished/TransactionFinished.css @@ -18,6 +18,7 @@ position: absolute; top: 0; right: 0; + box-sizing: content-box; } .transactionDetails { diff --git a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.css b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.css index 2ca6f1abe97..e19ae0db4c0 100644 --- a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.css +++ b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.css @@ -5,6 +5,7 @@ position: absolute; top: 0; right: 0; + box-sizing: content-box; } .rejectToggle { diff --git a/js/src/views/Status/components/Status/Status.js b/js/src/views/Status/components/Status/Status.js index 4a5472f0cfc..9bb21db11ff 100644 --- a/js/src/views/Status/components/Status/Status.js +++ b/js/src/views/Status/components/Status/Status.js @@ -40,6 +40,7 @@ export default class Status extends Component { renderSettings () { const { status, statusSettings } = this.props; + return (

Network settings

diff --git a/js/src/views/Status/containers/Container/Container.js b/js/src/views/Status/containers/Container/Container.js index f2a6c453368..07981ee07e6 100644 --- a/js/src/views/Status/containers/Container/Container.js +++ b/js/src/views/Status/containers/Container/Container.js @@ -10,6 +10,8 @@ import { updateLogging } from '../../actions/logger'; import ToastrContainer from '../../components/ToastrContainer'; import StatusPage from '../StatusPage'; +// TODO [jacogr] get rid of this ASAP +import 'dapp-styles/dist/dapp-styles.css'; import styles from './status.css'; class Container extends Component { From d6aabd48c6640b1d112ad251c199a096702b3a64 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 8 Sep 2016 09:14:37 +0200 Subject: [PATCH 0372/1062] Status page shows status... lots of UI work remaining here, but opertaional --- js/package.json | 2 ++ js/src/index.js | 38 ++++++++++++++------ js/src/views/Status/middleware/index.js | 27 +++++++++++++- js/src/views/Status/middleware/logger.js | 20 ++++++----- js/src/views/Status/middleware/middleware.js | 27 -------------- js/src/views/Status/reducers/logger.js | 2 +- 6 files changed, 68 insertions(+), 48 deletions(-) delete mode 100644 js/src/views/Status/middleware/middleware.js diff --git a/js/package.json b/js/package.json index 3ecd397b7fc..88971d9f1a2 100644 --- a/js/package.json +++ b/js/package.json @@ -105,6 +105,7 @@ "dependencies": { "bignumber.js": "^2.3.0", "blockies": "0.0.2", + "browser-request": "^0.3.3", "classnames": "^2.2.3", "es6-promise": "^3.2.1", "format-json": "^1.0.3", @@ -126,6 +127,7 @@ "redux": "^3.5.2", "redux-actions": "^0.10.1", "rlp": "^2.0.0", + "store": "^1.3.20", "utf8": "^2.1.1", "web3": "^0.17.0-alpha" } diff --git a/js/src/index.js b/js/src/index.js index b353bd6c408..b8c8bb39ece 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -11,6 +11,8 @@ import { Redirect, Router, Route, useRouterHistory } from 'react-router'; import { routerReducer } from 'react-router-redux'; import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; +import Web3 from 'web3'; + import { muiTheme } from './ui'; import { Accounts, Account, Addresses, Address, Application, Contract, Contracts, Dapp, Dapps, Signer } from './views'; @@ -21,13 +23,15 @@ import { nodeStatusReducer } from './views/Application/Status'; // TODO: This is VERY messy, just dumped here to get the Signer going import signerMiddlewares from './views/Signer/middlewares'; import { signer as signerReducer, toastr as signerToastrReducer, requests as signerRequestsReducer } from './views/Signer/reducers'; -import Web3 from 'web3'; -import { Web3Provider, web3Extension } from './views/Signer/components'; +import { Web3Provider as SignerWeb3Provider, web3Extension as statusWeb3Extension } from './views/Signer/components'; import { WebSocketsProvider, Ws } from './views/Signer/utils'; import { SignerDataProvider, WsDataProvider } from './views/Signer/providers'; // TODO: same with Status... +import statusMiddlewares from './views/Status/middleware'; import { status as statusReducer, settings as statusSettingsReducer, mining as statusMiningReducer, rpc as statusRpcReducer, toastr as statusToastrReducer, logger as statusLoggerReducer, debug as statusDebugReducer } from './views/Status/reducers'; +import { Web3Provider as StatusWeb3Provider } from './views/Status/provider/web3-provider'; +import StatusEthcoreWeb3 from './views/Status/provider/web3-ethcore-provider'; import Status from './views/Status/containers/Container'; import './environment'; @@ -41,9 +45,15 @@ injectTapEventPlugin(); const initToken = window.localStorage.getItem('sysuiToken'); const parityUrl = process.env.NODE_ENV === 'production' ? window.location.host : '127.0.0.1:8180'; const routerHistory = useRouterHistory(createHashHistory)({}); + +// signer const ws = new Ws(parityUrl); -const web3 = new Web3(new WebSocketsProvider(ws)); -web3Extension(web3).map((extension) => web3._extend(extension)); +const web3ws = new Web3(new WebSocketsProvider(ws)); +statusWeb3Extension(web3ws).map((extension) => web3ws._extend(extension)); + +// status +const web3 = new Web3(new Web3.providers.HttpProvider(process.env.RPC_ADDRESS || '/rpc/')); +const ethcoreWeb3 = new StatusEthcoreWeb3(web3); function tokenSetter (token, cb) { window.localStorage.setItem('sysuiToken', token); @@ -65,20 +75,26 @@ const reducers = combineReducers({ statusLogger: statusLoggerReducer, statusDebug: statusDebugReducer }); -const store = applyMiddleware(...signerMiddlewares(ws, tokenSetter))( - window.devToolsExtension - ? window.devToolsExtension()(createStore) - : createStore -)(reducers); +const middlewares = [] + .concat(signerMiddlewares(ws, tokenSetter)) + .concat(statusMiddlewares(web3)); +const storeCreation = window.devToolsExtension + ? window.devToolsExtension()(createStore) + : createStore; +const store = applyMiddleware(...middlewares)(storeCreation)(reducers); +// signer new WsDataProvider(store, ws); // eslint-disable-line no-new new SignerDataProvider(store, ws); // eslint-disable-line no-new ws.init(initToken); +// status +new StatusWeb3Provider(web3, ethcoreWeb3, store).start(); + ReactDOM.render( - + @@ -94,7 +110,7 @@ ReactDOM.render( - + , document.querySelector('#container') diff --git a/js/src/views/Status/middleware/index.js b/js/src/views/Status/middleware/index.js index 364b9b670c8..98221f5f976 100644 --- a/js/src/views/Status/middleware/index.js +++ b/js/src/views/Status/middleware/index.js @@ -1 +1,26 @@ -export default from './middleware'; +import request from 'browser-request'; +import EthcoreWeb3 from '../provider/web3-ethcore-provider'; + +// Middleware classes +import logger from './logger'; +import WebInteractions from './user-web3-interactions'; +import Rpc from './rpc'; +import LocalStorage from './localstorage'; +import Toastr from './toastr.js'; + +export default function (web3) { + const ethcoreWeb3 = new EthcoreWeb3(web3); + // Middleware Instances + const web3Interactions = new WebInteractions(web3, ethcoreWeb3); + const rpc = new Rpc(request); + const localstorage = new LocalStorage(); + const toastr = new Toastr(); + + return [ + logger, + web3Interactions.toMiddleware(), + rpc.toMiddleware(), + localstorage.toMiddleware(), + toastr.toMiddleware() + ]; +} diff --git a/js/src/views/Status/middleware/logger.js b/js/src/views/Status/middleware/logger.js index e0a8bf62463..29aeb337da4 100644 --- a/js/src/views/Status/middleware/logger.js +++ b/js/src/views/Status/middleware/logger.js @@ -1,11 +1,16 @@ +export default (store) => { + return (next) => { + return (action) => { + if (store.getState().statusLogger.logging) { + const msg = [`[${now()}] action:`, `${action.type};`, 'payload: ', action.payload]; + const logMethod = action.type.indexOf('error') > -1 ? 'error' : 'log'; -export default store => next => action => { - if (store.getState().logger.logging) { - const msg = [`[${now()}] action:`, `${action.type};`, 'payload: ', action.payload]; - const logMethod = action.type.indexOf('error') > -1 ? 'error' : 'log'; - console[logMethod](...msg); - } - return next(action); + console[logMethod](...msg); + } + + return next(action); + }; + }; }; function now () { @@ -15,4 +20,3 @@ function now () { const hour = date.getHours(); return `${hour}::${minutes}::${seconds}`; } - diff --git a/js/src/views/Status/middleware/middleware.js b/js/src/views/Status/middleware/middleware.js deleted file mode 100644 index 805c8aaa80b..00000000000 --- a/js/src/views/Status/middleware/middleware.js +++ /dev/null @@ -1,27 +0,0 @@ - -import request from 'browser-request'; -import EthcoreWeb3 from '../provider/web3-ethcore-provider'; - -// Middleware classes -import logger from './logger'; -import WebInteractions from './user-web3-interactions'; -import Rpc from './rpc'; -import LocalStorage from './localstorage'; -import Toastr from './toastr.js'; - -export default function (web3) { - const ethcoreWeb3 = new EthcoreWeb3(web3); - // Middleware Instances - const web3Interactions = new WebInteractions(web3, ethcoreWeb3); - const rpc = new Rpc(request); - const localstorage = new LocalStorage(); - const toastr = new Toastr(); - - return [ - logger, - web3Interactions.toMiddleware(), - rpc.toMiddleware(), - localstorage.toMiddleware(), - toastr.toMiddleware() - ]; -} diff --git a/js/src/views/Status/reducers/logger.js b/js/src/views/Status/reducers/logger.js index f3172a97019..dd41601b5eb 100644 --- a/js/src/views/Status/reducers/logger.js +++ b/js/src/views/Status/reducers/logger.js @@ -3,7 +3,7 @@ import { handleActions } from 'redux-actions'; const isProd = process.env.NODE_ENV === 'production'; const initialState = { - logging: !isProd + logging: false && !isProd }; export default handleActions({ From 469c8d9205b1cbc56ee7f5c78034a767d51d8873 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 8 Sep 2016 09:27:09 +0200 Subject: [PATCH 0373/1062] short-term override of dapp-styles until we can get rid ot it completely --- js/src/ignore-dapp-styles.css | 9 +++++++++ js/src/index.js | 4 ++++ js/src/views/Status/containers/Container/Container.js | 2 -- 3 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 js/src/ignore-dapp-styles.css diff --git a/js/src/ignore-dapp-styles.css b/js/src/ignore-dapp-styles.css new file mode 100644 index 00000000000..f2997b296ee --- /dev/null +++ b/js/src/ignore-dapp-styles.css @@ -0,0 +1,9 @@ +table td { + padding: inherit; +} + +table thead { + background-color: transparent; + color: inherit; + text-transform: inherit; +} diff --git a/js/src/index.js b/js/src/index.js index b8c8bb39ece..e9fbcb82d0e 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -36,6 +36,10 @@ import Status from './views/Status/containers/Container'; import './environment'; +// TODO [jacogr] get rid of this ASAP +import 'dapp-styles/dist/dapp-styles.css'; +import './ignore-dapp-styles.css'; + import styles from './reset.css'; import './index.html'; diff --git a/js/src/views/Status/containers/Container/Container.js b/js/src/views/Status/containers/Container/Container.js index 07981ee07e6..f2a6c453368 100644 --- a/js/src/views/Status/containers/Container/Container.js +++ b/js/src/views/Status/containers/Container/Container.js @@ -10,8 +10,6 @@ import { updateLogging } from '../../actions/logger'; import ToastrContainer from '../../components/ToastrContainer'; import StatusPage from '../StatusPage'; -// TODO [jacogr] get rid of this ASAP -import 'dapp-styles/dist/dapp-styles.css'; import styles from './status.css'; class Container extends Component { From 49ff469f01342fcd58d1381c6a94b5bcc5b76b00 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 8 Sep 2016 09:46:03 +0200 Subject: [PATCH 0374/1062] some more tweaks to Status to at least let it not break horribly --- js/src/index.js | 1 + .../{Footer => --remove-Footer}/Footer.css | 0 .../{Footer => --remove-Footer}/Footer.js | 0 .../{Footer => --remove-Footer}/index.js | 0 js/src/views/Status/components/Debug/Debug.js | 10 +++--- .../views/Status/components/Header/Header.js | 10 ++---- .../AccountsPage.js | 0 .../index.js | 0 .../Status/containers/Container/Container.js | 32 +++++++++++++------ .../Status/containers/DebugPage/DebugPage.js | 11 +++---- 10 files changed, 34 insertions(+), 30 deletions(-) rename js/src/views/Status/components/{Footer => --remove-Footer}/Footer.css (100%) rename js/src/views/Status/components/{Footer => --remove-Footer}/Footer.js (100%) rename js/src/views/Status/components/{Footer => --remove-Footer}/index.js (100%) rename js/src/views/Status/containers/{AccountsPage => --remove-AccountsPage}/AccountsPage.js (100%) rename js/src/views/Status/containers/{AccountsPage => --remove-AccountsPage}/index.js (100%) diff --git a/js/src/index.js b/js/src/index.js index e9fbcb82d0e..c92ddeae33f 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -112,6 +112,7 @@ ReactDOM.render( + diff --git a/js/src/views/Status/components/Footer/Footer.css b/js/src/views/Status/components/--remove-Footer/Footer.css similarity index 100% rename from js/src/views/Status/components/Footer/Footer.css rename to js/src/views/Status/components/--remove-Footer/Footer.css diff --git a/js/src/views/Status/components/Footer/Footer.js b/js/src/views/Status/components/--remove-Footer/Footer.js similarity index 100% rename from js/src/views/Status/components/Footer/Footer.js rename to js/src/views/Status/components/--remove-Footer/Footer.js diff --git a/js/src/views/Status/components/Footer/index.js b/js/src/views/Status/components/--remove-Footer/index.js similarity index 100% rename from js/src/views/Status/components/Footer/index.js rename to js/src/views/Status/components/--remove-Footer/index.js diff --git a/js/src/views/Status/components/Debug/Debug.js b/js/src/views/Status/components/Debug/Debug.js index 32f1e9f5c13..36504a58a73 100644 --- a/js/src/views/Status/components/Debug/Debug.js +++ b/js/src/views/Status/components/Debug/Debug.js @@ -12,7 +12,7 @@ export default class Debug extends Component {

Debugging logs

{ this.renderActions() } -

{ this.props.debug.levels || '-' }

+

{ this.props.statusDebug.levels || '-' }

{ this.renderLogs() }
@@ -23,7 +23,7 @@ export default class Debug extends Component { } renderLogs () { - return this.props.debug.logs.map((log, idx) => ( + return this.props.statusDebug.logs.map((log, idx) => (
         { log }
       
@@ -31,7 +31,7 @@ export default class Debug extends Component { } renderActions () { - const toggleClass = this.props.debug.logging ? 'icon-control-pause' : 'icon-control-play'; + const toggleClass = this.props.statusDebug.logging ? 'icon-control-pause' : 'icon-control-play'; return (
@@ -45,7 +45,7 @@ export default class Debug extends Component { } toggle = () => { - this.props.actions.updateDevLogging(!this.props.debug.logging); + this.props.actions.updateDevLogging(!this.props.statusDebug.logging); } static propTypes = { @@ -53,7 +53,7 @@ export default class Debug extends Component { removeDevLogs: PropTypes.func.isRequired, updateDevLogging: PropTypes.func.isRequired }).isRequired, - debug: PropTypes.shape({ + statusDebug: PropTypes.shape({ levels: PropTypes.string.isRequired, logging: PropTypes.bool.isRequired, logs: PropTypes.arrayOf(PropTypes.string).isRequired diff --git a/js/src/views/Status/components/Header/Header.js b/js/src/views/Status/components/Header/Header.js index 31469b62bdf..69b9a78769d 100644 --- a/js/src/views/Status/components/Header/Header.js +++ b/js/src/views/Status/components/Header/Header.js @@ -44,23 +44,17 @@ export default class Header extends Component {
  • - + Rpc Methods
  • - + Debug
  • -
  • - - - Accounts - -
  • diff --git a/js/src/views/Status/containers/AccountsPage/AccountsPage.js b/js/src/views/Status/containers/--remove-AccountsPage/AccountsPage.js similarity index 100% rename from js/src/views/Status/containers/AccountsPage/AccountsPage.js rename to js/src/views/Status/containers/--remove-AccountsPage/AccountsPage.js diff --git a/js/src/views/Status/containers/AccountsPage/index.js b/js/src/views/Status/containers/--remove-AccountsPage/index.js similarity index 100% rename from js/src/views/Status/containers/AccountsPage/index.js rename to js/src/views/Status/containers/--remove-AccountsPage/index.js diff --git a/js/src/views/Status/containers/Container/Container.js b/js/src/views/Status/containers/Container/Container.js index f2a6c453368..519f9232fc6 100644 --- a/js/src/views/Status/containers/Container/Container.js +++ b/js/src/views/Status/containers/Container/Container.js @@ -4,10 +4,12 @@ import { bindActionCreators } from 'redux'; import { extend } from 'lodash'; import Header from '../../components/Header'; -import Footer from '../../components/Footer'; import * as ToastActions from '../../actions/toastr'; import { updateLogging } from '../../actions/logger'; import ToastrContainer from '../../components/ToastrContainer'; + +import DebugPage from '../DebugPage'; +import RpcPage from '../RpcPage'; import StatusPage from '../StatusPage'; import styles from './status.css'; @@ -18,12 +20,12 @@ class Container extends Component { statusLogger: PropTypes.object.isRequired, statusToastr: PropTypes.object.isRequired, routing: PropTypes.object.isRequired, - actions: PropTypes.object.isRequired + actions: PropTypes.object.isRequired, + params: PropTypes.object } render () { - const { actions, statusLogger } = this.props; - const { name, disconnected, noOfErrors, version } = this.props.status; + const { name, disconnected, noOfErrors } = this.props.status; return (
    @@ -34,18 +36,28 @@ class Container extends Component { { ...this._test('header') } /> { this.renderPage() } -
    ); } renderPage () { + const { params } = this.props; + + if (params && params.subpage) { + if (params.subpage === 'debug') { + return ( + + ); + } else if (params.subpage === 'rpc') { + return ( + +
    This is very much still a WIP, hence the original RPC calls are not available here yet (it should actually be removed here and moved to a dedicated developer section once available)
    +
    + ); + } + } + return ( ); diff --git a/js/src/views/Status/containers/DebugPage/DebugPage.js b/js/src/views/Status/containers/DebugPage/DebugPage.js index 6daba3e69b5..0ec8371c22b 100644 --- a/js/src/views/Status/containers/DebugPage/DebugPage.js +++ b/js/src/views/Status/containers/DebugPage/DebugPage.js @@ -1,4 +1,3 @@ - import React, { Component, PropTypes } from 'react'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; @@ -9,16 +8,14 @@ import { updateLogging } from '../../actions/logger'; import Debug from '../../components/Debug'; class DebugPage extends Component { - - render () { - return ; - } - static propTypes = { actions: PropTypes.object.isRequired, - debug: PropTypes.object.isRequired + statusDebug: PropTypes.object.isRequired } + render () { + return ; + } } function mapStateToProps (state) { From 7954aaf80dceb0654e47ccc745e327c0c385e3cd Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 8 Sep 2016 09:50:22 +0200 Subject: [PATCH 0375/1062] fix dapp-styles breaking the network type block --- js/src/views/Application/Status/status.css | 1 + 1 file changed, 1 insertion(+) diff --git a/js/src/views/Application/Status/status.css b/js/src/views/Application/Status/status.css index b9451a64666..92a1d093723 100644 --- a/js/src/views/Application/Status/status.css +++ b/js/src/views/Application/Status/status.css @@ -32,6 +32,7 @@ text-transform: uppercase; height: 1.25em; margin-top: 0.25em; + box-sizing: content-box; } .networklive { From 6dc847e15b573c56501bfbb7767cb15f2c02364e Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 8 Sep 2016 10:11:56 +0200 Subject: [PATCH 0376/1062] move single-used components to under their parents --- js/src/views/Signer/components/Account/Account.js | 2 +- .../components/{ => Account}/AccountLink/AccountLink.css | 0 .../components/{ => Account}/AccountLink/AccountLink.js | 2 +- .../Signer/components/{ => Account}/AccountLink/index.js | 0 .../TransactionPendingForm/TransactionPendingForm.js | 4 ++-- .../TransactionPendingFormConfirm.css | 0 .../TransactionPendingFormConfirm.js | 2 +- .../TransactionPendingFormConfirm/index.js | 0 .../TransactionPendingFormReject.css | 0 .../TransactionPendingFormReject.js | 2 +- .../TransactionPendingFormReject/index.js | 0 11 files changed, 6 insertions(+), 6 deletions(-) rename js/src/views/Signer/components/{ => Account}/AccountLink/AccountLink.css (100%) rename js/src/views/Signer/components/{ => Account}/AccountLink/AccountLink.js (94%) rename js/src/views/Signer/components/{ => Account}/AccountLink/index.js (100%) rename js/src/views/Signer/components/{ => TransactionPendingForm}/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css (100%) rename js/src/views/Signer/components/{ => TransactionPendingForm}/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js (97%) rename js/src/views/Signer/components/{ => TransactionPendingForm}/TransactionPendingFormConfirm/index.js (100%) rename js/src/views/Signer/components/{ => TransactionPendingForm}/TransactionPendingFormReject/TransactionPendingFormReject.css (100%) rename js/src/views/Signer/components/{ => TransactionPendingForm}/TransactionPendingFormReject/TransactionPendingFormReject.js (96%) rename js/src/views/Signer/components/{ => TransactionPendingForm}/TransactionPendingFormReject/index.js (100%) diff --git a/js/src/views/Signer/components/Account/Account.js b/js/src/views/Signer/components/Account/Account.js index 0f4dd6e25a2..dd6ab9d6c12 100644 --- a/js/src/views/Signer/components/Account/Account.js +++ b/js/src/views/Signer/components/Account/Account.js @@ -4,7 +4,7 @@ import styles from './Account.css'; import { retrieveAccount } from '../../../../util'; import { IdentityIcon } from '../../../../ui'; -import AccountLink from '../AccountLink'; +import AccountLink from './AccountLink'; export default class Account extends Component { static contextTypes = { diff --git a/js/src/views/Signer/components/AccountLink/AccountLink.css b/js/src/views/Signer/components/Account/AccountLink/AccountLink.css similarity index 100% rename from js/src/views/Signer/components/AccountLink/AccountLink.css rename to js/src/views/Signer/components/Account/AccountLink/AccountLink.css diff --git a/js/src/views/Signer/components/AccountLink/AccountLink.js b/js/src/views/Signer/components/Account/AccountLink/AccountLink.js similarity index 94% rename from js/src/views/Signer/components/AccountLink/AccountLink.js rename to js/src/views/Signer/components/Account/AccountLink/AccountLink.js index 9fae2e28000..8ac2baecac1 100644 --- a/js/src/views/Signer/components/AccountLink/AccountLink.js +++ b/js/src/views/Signer/components/Account/AccountLink/AccountLink.js @@ -1,6 +1,6 @@ import React, { Component, PropTypes } from 'react'; -import { getAccountLink } from '../util/account'; +import { getAccountLink } from '../../util/account'; import styles from './AccountLink.css'; export default class AccountLink extends Component { diff --git a/js/src/views/Signer/components/AccountLink/index.js b/js/src/views/Signer/components/Account/AccountLink/index.js similarity index 100% rename from js/src/views/Signer/components/AccountLink/index.js rename to js/src/views/Signer/components/Account/AccountLink/index.js diff --git a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.js b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.js index 49c42380e88..e0da942b40c 100644 --- a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.js +++ b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.js @@ -2,8 +2,8 @@ import React, { Component, PropTypes } from 'react'; import BackIcon from 'material-ui/svg-icons/navigation/arrow-back'; -import TransactionPendingFormConfirm from '../TransactionPendingFormConfirm'; -import TransactionPendingFormReject from '../TransactionPendingFormReject'; +import TransactionPendingFormConfirm from './TransactionPendingFormConfirm'; +import TransactionPendingFormReject from './TransactionPendingFormReject'; import styles from './TransactionPendingForm.css'; export default class TransactionPendingForm extends Component { diff --git a/js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css similarity index 100% rename from js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css rename to js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css diff --git a/js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js similarity index 97% rename from js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js rename to js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js index e00bbbcedcb..36cf3eec030 100644 --- a/js/src/views/Signer/components/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js +++ b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js @@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'; import RaisedButton from 'material-ui/RaisedButton'; import ReactTooltip from 'react-tooltip'; -import { Input, SignerIcon } from '../../../../ui'; +import { Input, SignerIcon } from '../../../../../ui'; import styles from './TransactionPendingFormConfirm.css'; diff --git a/js/src/views/Signer/components/TransactionPendingFormConfirm/index.js b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/index.js similarity index 100% rename from js/src/views/Signer/components/TransactionPendingFormConfirm/index.js rename to js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/index.js diff --git a/js/src/views/Signer/components/TransactionPendingFormReject/TransactionPendingFormReject.css b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormReject/TransactionPendingFormReject.css similarity index 100% rename from js/src/views/Signer/components/TransactionPendingFormReject/TransactionPendingFormReject.css rename to js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormReject/TransactionPendingFormReject.css diff --git a/js/src/views/Signer/components/TransactionPendingFormReject/TransactionPendingFormReject.js b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormReject/TransactionPendingFormReject.js similarity index 96% rename from js/src/views/Signer/components/TransactionPendingFormReject/TransactionPendingFormReject.js rename to js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormReject/TransactionPendingFormReject.js index 5dd71630eed..ef8887abf63 100644 --- a/js/src/views/Signer/components/TransactionPendingFormReject/TransactionPendingFormReject.js +++ b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormReject/TransactionPendingFormReject.js @@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'; import RaisedButton from 'material-ui/RaisedButton'; -import { REJECT_COUNTER_TIME } from '../constants/constants'; +import { REJECT_COUNTER_TIME } from '../../constants/constants'; import styles from './TransactionPendingFormReject.css'; export default class TransactionPendingFormReject extends Component { diff --git a/js/src/views/Signer/components/TransactionPendingFormReject/index.js b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormReject/index.js similarity index 100% rename from js/src/views/Signer/components/TransactionPendingFormReject/index.js rename to js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormReject/index.js From b7b47e7f5f8227c173e451afe9995370c302c1c4 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 8 Sep 2016 10:47:40 +0200 Subject: [PATCH 0377/1062] adjust page styling for consistency --- js/src/ui/Actionbar/actionbar.css | 11 +---------- js/src/ui/Page/index.js | 1 + js/src/ui/Page/page.css | 3 +++ js/src/ui/Page/page.js | 21 +++++++++++++++++++++ js/src/ui/index.js | 2 ++ js/src/views/Account/account.js | 12 +++++++----- js/src/views/Accounts/accounts.js | 12 +++++++----- js/src/views/Address/address.js | 12 +++++++----- js/src/views/Addresses/addresses.js | 10 ++++++---- js/src/views/Dapps/dapps.js | 10 ++++++---- js/src/views/Signer/middlewares/toastr.js | 1 + js/src/views/Signer/signer.js | 7 +++---- 12 files changed, 65 insertions(+), 37 deletions(-) create mode 100644 js/src/ui/Page/index.js create mode 100644 js/src/ui/Page/page.css create mode 100644 js/src/ui/Page/page.js diff --git a/js/src/ui/Actionbar/actionbar.css b/js/src/ui/Actionbar/actionbar.css index 9916e3f2ce7..411ca810e74 100644 --- a/js/src/ui/Actionbar/actionbar.css +++ b/js/src/ui/Actionbar/actionbar.css @@ -1,5 +1,5 @@ .actionbar { - padding: 0.25em 24px !important; + padding: 0.5em 24px !important; height: auto !important; } @@ -12,14 +12,5 @@ } .toolbuttons button { - /*color: white !important;*/ margin: 10px 0 10px 16px !important; } - -.toolbuttons button:hover { - /*background: rgba(80, 80, 80, 0.5) !important;*/ -} - -.toolbuttons svg { - /*fill: white !important;*/ -} diff --git a/js/src/ui/Page/index.js b/js/src/ui/Page/index.js new file mode 100644 index 00000000000..13280f7cbeb --- /dev/null +++ b/js/src/ui/Page/index.js @@ -0,0 +1 @@ +export default from './page'; diff --git a/js/src/ui/Page/page.css b/js/src/ui/Page/page.css new file mode 100644 index 00000000000..e5f1651f504 --- /dev/null +++ b/js/src/ui/Page/page.css @@ -0,0 +1,3 @@ +.layout { + padding: 0em 3em; +} diff --git a/js/src/ui/Page/page.js b/js/src/ui/Page/page.js new file mode 100644 index 00000000000..d7d2e5c4f91 --- /dev/null +++ b/js/src/ui/Page/page.js @@ -0,0 +1,21 @@ +import React, { Component, PropTypes } from 'react'; + +import styles from './page.css'; + +export default class Page extends Component { + static propTypes = { + className: PropTypes.string, + children: PropTypes.node + }; + + render () { + const { className, children } = this.props; + const classes = `${styles.layout} ${className}`; + + return ( +
    + { children } +
    + ); + } +} diff --git a/js/src/ui/index.js b/js/src/ui/index.js index bb4605ce612..978d64174b2 100644 --- a/js/src/ui/index.js +++ b/js/src/ui/index.js @@ -6,6 +6,7 @@ import Form, { FormWrap, Input, InputAddress, InputAddressSelect, InputInline, S import IdentityIcon from './IdentityIcon'; import Modal from './Modal'; import muiTheme from './Theme'; +import Page from './Page'; import SignerIcon from './signerIcon'; import Tooltips, { Tooltip } from './Tooltips'; @@ -25,6 +26,7 @@ export { IdentityIcon, Modal, muiTheme, + Page, SignerIcon, Tooltip, Tooltips diff --git a/js/src/views/Account/account.js b/js/src/views/Account/account.js index bb4a650b207..c59274ff72d 100644 --- a/js/src/views/Account/account.js +++ b/js/src/views/Account/account.js @@ -4,7 +4,7 @@ import ActionAccountBalance from 'material-ui/svg-icons/action/account-balance'; import ContentSend from 'material-ui/svg-icons/content/send'; import { FundAccount, Transfer } from '../../modals'; -import { Actionbar } from '../../ui'; +import { Actionbar, Page } from '../../ui'; import Header from './Header'; import Transactions from './Transactions'; @@ -43,10 +43,12 @@ export default class Account extends Component { { this.renderFundDialog() } { this.renderTransferDialog() } { this.renderActionbar() } -
    - + +
    + +
    ); } diff --git a/js/src/views/Accounts/accounts.js b/js/src/views/Accounts/accounts.js index 26a7e181f71..e895f7561c2 100644 --- a/js/src/views/Accounts/accounts.js +++ b/js/src/views/Accounts/accounts.js @@ -4,7 +4,7 @@ import ContentAdd from 'material-ui/svg-icons/content/add'; import List from './List'; import { CreateAccount } from '../../modals'; -import { Actionbar, Tooltip } from '../../ui'; +import { Actionbar, Page, Tooltip } from '../../ui'; import styles from './accounts.css'; @@ -26,10 +26,12 @@ export default class Accounts extends Component {
    { this.renderNewDialog() } { this.renderActionbar() } - - + + + +
    ); } diff --git a/js/src/views/Address/address.js b/js/src/views/Address/address.js index 419c6c42c1d..51b000bb5c0 100644 --- a/js/src/views/Address/address.js +++ b/js/src/views/Address/address.js @@ -1,6 +1,6 @@ import React, { Component, PropTypes } from 'react'; -import { Actionbar } from '../../ui'; +import { Actionbar, Page } from '../../ui'; import Header from '../Account/Header'; import Transactions from '../Account/Transactions'; @@ -28,10 +28,12 @@ export default class Address extends Component { return (
    { this.renderActionbar() } -
    - + +
    + +
    ); } diff --git a/js/src/views/Addresses/addresses.js b/js/src/views/Addresses/addresses.js index 7fef1568ef7..51c88239ae2 100644 --- a/js/src/views/Addresses/addresses.js +++ b/js/src/views/Addresses/addresses.js @@ -4,7 +4,7 @@ import ContentAdd from 'material-ui/svg-icons/content/add'; import List from '../Accounts/List'; import { AddAddress } from '../../modals'; -import { Actionbar } from '../../ui'; +import { Actionbar, Page } from '../../ui'; import styles from './addresses.css'; @@ -25,9 +25,11 @@ export default class Addresses extends Component {
    { this.renderActionbar() } { this.renderAddAddress() } - + + +
    ); } diff --git a/js/src/views/Dapps/dapps.js b/js/src/views/Dapps/dapps.js index a319f9cd062..f3dc3a80c48 100644 --- a/js/src/views/Dapps/dapps.js +++ b/js/src/views/Dapps/dapps.js @@ -1,6 +1,6 @@ import React, { Component, PropTypes } from 'react'; -import { Actionbar } from '../../ui'; +import { Actionbar, Page } from '../../ui'; import Summary from './Summary'; @@ -39,9 +39,11 @@ export default class Dapps extends Component {
    -
    - { this.renderApps() } -
    + +
    + { this.renderApps() } +
    +
    ); } diff --git a/js/src/views/Signer/middlewares/toastr.js b/js/src/views/Signer/middlewares/toastr.js index ab2bf982fd8..1c8e7a60fd3 100644 --- a/js/src/views/Signer/middlewares/toastr.js +++ b/js/src/views/Signer/middlewares/toastr.js @@ -28,6 +28,7 @@ export default class ToastrMiddleware { toast (store, next, action) { const { toastNo } = store.getState().signerToastr; const { msg, type } = action.meta.toastr; + next(addToast({ type, msg, toastNo })); this.setTimeoutFor(toastNo, next); } diff --git a/js/src/views/Signer/signer.js b/js/src/views/Signer/signer.js index b92bf6e7421..c2c6ebdcf77 100644 --- a/js/src/views/Signer/signer.js +++ b/js/src/views/Signer/signer.js @@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; -import { Actionbar } from '../../ui'; +import { Actionbar, Page } from '../../ui'; import { removeToast } from './actions/toastr'; import { ToastrContainer } from './components'; @@ -29,16 +29,15 @@ export class Signer extends Component { }; render () { - console.log(this.props); const { signerToastr, actions } = this.props; return (
    -
    + { this.renderPage() } -
    + Date: Wed, 7 Sep 2016 15:08:21 +0200 Subject: [PATCH 0378/1062] extract visual part from Container component This as http://redux.js.org/docs/basics/UsageWithReact.html#presentational-and-container-components describes it. --- .../dapps/registry/Application/application.js | 94 +++---------------- js/src/dapps/registry/Container.js | 25 +++-- 2 files changed, 30 insertions(+), 89 deletions(-) diff --git a/js/src/dapps/registry/Application/application.js b/js/src/dapps/registry/Application/application.js index 6e213e4a38d..aa9a97c467a 100644 --- a/js/src/dapps/registry/Application/application.js +++ b/js/src/dapps/registry/Application/application.js @@ -2,100 +2,34 @@ import React, { Component, PropTypes } from 'react'; import getMuiTheme from 'material-ui/styles/getMuiTheme'; import lightBaseTheme from 'material-ui/styles/baseThemes/lightBaseTheme'; +const muiTheme = getMuiTheme(lightBaseTheme); -import registryAbi from '../abi/registry.json'; import Loading from '../Loading'; import Status from '../Status'; -const { api } = window.parity; - -const muiTheme = getMuiTheme(lightBaseTheme); - export default class Application extends Component { static childContextTypes = { - instance: PropTypes.object, muiTheme: PropTypes.object - } - - state = { - address: null, - fee: null, - instance: null, - loading: true, - owner: null - } - - componentDidMount () { - this.attachInterface(); + }; + getChildContext () { + return { muiTheme }; } render () { - const { address, fee, loading, owner } = this.state; + const { contract, fee, owner } = this.props; - if (loading) { - return ( - - ); + if (!contract || !fee || !owner) { + return (); } - return ( -
    - -
    + ); } - getChildContext () { - const { instance } = this.state; - - return { - instance, - muiTheme - }; - } - - onNewBlockNumber = (blockNumber) => { - const { instance } = this.state; - - instance.fee - .call() - .then((fee) => { - this.setState({ - fee - }); - }); - } - - attachInterface = () => { - api.ethcore - .registryAddress() - .then((address) => { - console.log(`registry found at ${address}`); - const { instance } = api.newContract(registryAbi, address); - - return Promise - .all([ - instance.owner.call(), - instance.fee.call() - ]) - .then(([owner, fee]) => { - console.log(`owner as ${owner}, fee set at ${fee.toFormat()}`); - this.setState({ - address, - fee, - instance, - loading: false, - owner - }); - - api.events.subscribe('eth.blockNumber', this.onNewBlockNumber); - }); - }) - .catch((error) => { - console.error('attachInterface', error); - }); - } } + +Application.propTypes = { + contract: PropTypes.object, + fee: PropTypes.object, + owner: PropTypes.string +}; diff --git a/js/src/dapps/registry/Container.js b/js/src/dapps/registry/Container.js index 88dcd1c0ad4..44da34cb0ed 100644 --- a/js/src/dapps/registry/Container.js +++ b/js/src/dapps/registry/Container.js @@ -2,27 +2,34 @@ import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; +import Application from './Application'; import * as actions from './actions'; class Container extends Component { - + static propTypes = { + actions: PropTypes.object, + contract: PropTypes.object, + owner: PropTypes.string, + fee: PropTypes.object + }; componentDidMount () { - this.props.fetchContract(); + this.props.actions.fetchContract(); } render () { - return (
    { this.props.foo }
    ); + const { actions, contract, owner, fee } = this.props + return (); } - } -Container.propTypes = { - foo: PropTypes.string -}; - export default connect( // redux -> react connection (state) => state, // react -> redux connection - (dispatch) => bindActionCreators(actions, dispatch) + (dispatch) => ({ actions: bindActionCreators(actions, dispatch) }) )(Container); From c9b0173fb130596b9a577dfccc07a11464703681 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Wed, 7 Sep 2016 15:16:47 +0200 Subject: [PATCH 0379/1062] styling: colors, Material UI spinner --- js/src/dapps/registry.js | 2 ++ js/src/dapps/registry/Application/application.js | 4 ++-- js/src/dapps/registry/Loading/index.js | 1 - js/src/dapps/registry/Loading/loading.css | 5 ----- js/src/dapps/registry/Loading/loading.js | 13 ------------- js/src/dapps/registry/Status/status.css | 4 +++- js/src/dapps/registry/Status/status.js | 3 --- 7 files changed, 7 insertions(+), 25 deletions(-) delete mode 100644 js/src/dapps/registry/Loading/index.js delete mode 100644 js/src/dapps/registry/Loading/loading.css delete mode 100644 js/src/dapps/registry/Loading/loading.js diff --git a/js/src/dapps/registry.js b/js/src/dapps/registry.js index ee7e902036c..03ec8885154 100644 --- a/js/src/dapps/registry.js +++ b/js/src/dapps/registry.js @@ -4,6 +4,8 @@ import { Provider } from 'react-redux'; import store from './registry/store'; import Container from './registry/Container'; + +import './style.css'; import './registry.html'; ReactDOM.render( diff --git a/js/src/dapps/registry/Application/application.js b/js/src/dapps/registry/Application/application.js index aa9a97c467a..45ad55bc0cd 100644 --- a/js/src/dapps/registry/Application/application.js +++ b/js/src/dapps/registry/Application/application.js @@ -4,7 +4,7 @@ import getMuiTheme from 'material-ui/styles/getMuiTheme'; import lightBaseTheme from 'material-ui/styles/baseThemes/lightBaseTheme'; const muiTheme = getMuiTheme(lightBaseTheme); -import Loading from '../Loading'; +import CircularProgress from 'material-ui/CircularProgress'; import Status from '../Status'; export default class Application extends Component { @@ -19,7 +19,7 @@ export default class Application extends Component { const { contract, fee, owner } = this.props; if (!contract || !fee || !owner) { - return (); + return (); } return ( diff --git a/js/src/dapps/registry/Loading/index.js b/js/src/dapps/registry/Loading/index.js deleted file mode 100644 index 25ff460fa67..00000000000 --- a/js/src/dapps/registry/Loading/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './loading'; diff --git a/js/src/dapps/registry/Loading/loading.css b/js/src/dapps/registry/Loading/loading.css deleted file mode 100644 index 6a864120621..00000000000 --- a/js/src/dapps/registry/Loading/loading.css +++ /dev/null @@ -1,5 +0,0 @@ -.loading { - width: 100%; - text-align: center; - padding: 1em; -} diff --git a/js/src/dapps/registry/Loading/loading.js b/js/src/dapps/registry/Loading/loading.js deleted file mode 100644 index 186cb3833f4..00000000000 --- a/js/src/dapps/registry/Loading/loading.js +++ /dev/null @@ -1,13 +0,0 @@ -import React, { Component } from 'react'; - -import styles from './loading.css'; - -export default class Loading extends Component { - render () { - return ( -
    - Loading ... -
    - ); - } -} diff --git a/js/src/dapps/registry/Status/status.css b/js/src/dapps/registry/Status/status.css index bd465f8886d..7ce7f2f0bf1 100644 --- a/js/src/dapps/registry/Status/status.css +++ b/js/src/dapps/registry/Status/status.css @@ -1,5 +1,7 @@ .status { - padding: 1em 1em 2em 1em; + padding: 1em; + color: #fff; + background-color: #c0392b; } .address { diff --git a/js/src/dapps/registry/Status/status.js b/js/src/dapps/registry/Status/status.js index dad3f7f02cc..be24e813631 100644 --- a/js/src/dapps/registry/Status/status.js +++ b/js/src/dapps/registry/Status/status.js @@ -5,9 +5,6 @@ import styles from './status.css'; const { api } = window.parity; export default class Status extends Component { - static contextTypes = { - api: PropTypes.object - } static propTypes = { address: PropTypes.string, From 14e32517068fdf08bc97e8b138582e55c80b0096 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Thu, 8 Sep 2016 11:21:40 +0200 Subject: [PATCH 0380/1062] actions & reducers for registry lookup --- js/src/dapps/registry/Lookup/actions.js | 23 ++++++++++++++++++ js/src/dapps/registry/Lookup/reducers.js | 30 ++++++++++++++++++++++++ js/src/dapps/registry/actions.js | 3 +++ js/src/dapps/registry/reducers.js | 9 ++++++- 4 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 js/src/dapps/registry/Lookup/actions.js create mode 100644 js/src/dapps/registry/Lookup/reducers.js diff --git a/js/src/dapps/registry/Lookup/actions.js b/js/src/dapps/registry/Lookup/actions.js new file mode 100644 index 00000000000..3ff6b2d9ef9 --- /dev/null +++ b/js/src/dapps/registry/Lookup/actions.js @@ -0,0 +1,23 @@ +const sha3 = window.parity.api.format.sha3; + +export const start = (name, key) => ({ type: 'lookup start', name, key }); + +export const success = (address) => ({ type: 'lookup success', result: address }); + +export const fail = () => ({ type: 'lookup error' }); + +export const lookup = (name, key) => (dispatch, getState) => { + const { contract } = getState(); + if (!contract) return; + const getAddress = contract.functions + .find((f) => f.name === 'getAddress'); + + dispatch(start(name, key)); + getAddress.call({}, [sha3(name), key]) + .then((address) => dispatch(success(address))) + .catch((err) => { + console.error(`could not lookup ${key} for ${name}`); + if (err) console.error(err.stack); + dispatch(fail()); + }); +}; diff --git a/js/src/dapps/registry/Lookup/reducers.js b/js/src/dapps/registry/Lookup/reducers.js new file mode 100644 index 00000000000..dc0aa80b31c --- /dev/null +++ b/js/src/dapps/registry/Lookup/reducers.js @@ -0,0 +1,30 @@ +const initialState = { + pending: false, + name: null, key: null, + result: null +}; + +export default (state = initialState, action) => { + if (action.type === 'lookup start') + return { + pending: true, + name: action.name, key: action.key, + result: null + }; + + if (action.type === 'lookup error') + return { + pending: false, + name: null, key: null, + result: null + }; + + if (action.type === 'lookup success') + return { + pending: false, + name: null, key: null, + result: action.result + }; + + return state; +}; diff --git a/js/src/dapps/registry/actions.js b/js/src/dapps/registry/actions.js index 256f55b7d5e..fbf2b4dded3 100644 --- a/js/src/dapps/registry/actions.js +++ b/js/src/dapps/registry/actions.js @@ -1,5 +1,8 @@ import registryAbi from './abi/registry.json'; const { api } = window.parity; +import * as lookup from './Lookup/actions.js'; + +export { lookup }; export const setContract = (contract) => ({ type: 'set contract', contract }); diff --git a/js/src/dapps/registry/reducers.js b/js/src/dapps/registry/reducers.js index 4cca6379a93..ee05f5f7ed6 100644 --- a/js/src/dapps/registry/reducers.js +++ b/js/src/dapps/registry/reducers.js @@ -1,7 +1,10 @@ +import lookupReducer from './Lookup/reducers.js'; + const initialState = { contract: null, fee: null, - owner: null + owner: null, + lookup: lookupReducer(undefined, { type: '' }) }; export default (state = initialState, action) => { @@ -14,5 +17,9 @@ export default (state = initialState, action) => { if (action.type === 'set owner') return { ...state, owner: action.owner }; + if (action.type.slice(0, 6) === 'lookup') { + return { ...state, lookup: lookupReducer(state.lookup, action) }; + } + return state; }; From 7527bfa911918c6edf4acc6aac716e58c7e65d63 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Thu, 8 Sep 2016 11:22:50 +0200 Subject: [PATCH 0381/1062] component for registry lookup --- js/src/dapps/registry/Lookup/index.js | 1 + js/src/dapps/registry/Lookup/lookup.css | 7 ++++ js/src/dapps/registry/Lookup/lookup.js | 51 +++++++++++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 js/src/dapps/registry/Lookup/index.js create mode 100644 js/src/dapps/registry/Lookup/lookup.css create mode 100644 js/src/dapps/registry/Lookup/lookup.js diff --git a/js/src/dapps/registry/Lookup/index.js b/js/src/dapps/registry/Lookup/index.js new file mode 100644 index 00000000000..afed0648288 --- /dev/null +++ b/js/src/dapps/registry/Lookup/index.js @@ -0,0 +1 @@ +export default from './lookup.js'; diff --git a/js/src/dapps/registry/Lookup/lookup.css b/js/src/dapps/registry/Lookup/lookup.css new file mode 100644 index 00000000000..97becf31afd --- /dev/null +++ b/js/src/dapps/registry/Lookup/lookup.css @@ -0,0 +1,7 @@ +.lookup { + padding: 1em; +} + +.results { + margin: .5em 0; +} diff --git a/js/src/dapps/registry/Lookup/lookup.js b/js/src/dapps/registry/Lookup/lookup.js new file mode 100644 index 00000000000..07a69a2ff74 --- /dev/null +++ b/js/src/dapps/registry/Lookup/lookup.js @@ -0,0 +1,51 @@ +import React, { Component, PropTypes } from 'react'; +import TextField from 'material-ui/TextField'; +import FlatButton from 'material-ui/FlatButton'; + +import styles from './lookup.css'; + +export default class Lookup extends Component { + + static propTypes = { + actions: PropTypes.object, + lookup: PropTypes.object + } + + state = { name: '', key: '' }; + + render () { + const self = this; + const onNameChange = (e) => { + self.setState({ name: e.target.value }); + }; + const onKeyChange = (e) => { + self.setState({ key: e.target.value }); + }; + const onLookupClick = () => { + self.props.actions.lookup(self.state.name, self.state.key); + }; + + return ( +
    + + + +
    + { this.props.lookup.result || '' } +
    +
    + ); + } +} From 0e3fa96efb8cd9812829ad6288671a0f4cae8ee0 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Thu, 8 Sep 2016 11:26:08 +0200 Subject: [PATCH 0382/1062] connect lookup component --- js/src/dapps/registry/Application/application.js | 8 ++++++-- js/src/dapps/registry/Container.js | 12 +++++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/js/src/dapps/registry/Application/application.js b/js/src/dapps/registry/Application/application.js index 45ad55bc0cd..9c825a0f0fd 100644 --- a/js/src/dapps/registry/Application/application.js +++ b/js/src/dapps/registry/Application/application.js @@ -6,6 +6,7 @@ const muiTheme = getMuiTheme(lightBaseTheme); import CircularProgress from 'material-ui/CircularProgress'; import Status from '../Status'; +import Lookup from '../Lookup'; export default class Application extends Component { static childContextTypes = { @@ -16,13 +17,16 @@ export default class Application extends Component { } render () { - const { contract, fee, owner } = this.props; + const { contract, fee, owner, actions } = this.props; if (!contract || !fee || !owner) { return (); } return ( - +
    + + +
    ); } diff --git a/js/src/dapps/registry/Container.js b/js/src/dapps/registry/Container.js index 44da34cb0ed..eab1ea929aa 100644 --- a/js/src/dapps/registry/Container.js +++ b/js/src/dapps/registry/Container.js @@ -10,19 +10,21 @@ class Container extends Component { actions: PropTypes.object, contract: PropTypes.object, owner: PropTypes.string, - fee: PropTypes.object + fee: PropTypes.object, + lookup: PropTypes.object }; componentDidMount () { this.props.actions.fetchContract(); } render () { - const { actions, contract, owner, fee } = this.props + const { actions, contract, owner, fee, lookup } = this.props; return (); } } @@ -31,5 +33,9 @@ export default connect( // redux -> react connection (state) => state, // react -> redux connection - (dispatch) => ({ actions: bindActionCreators(actions, dispatch) }) + (dispatch) => { + const bound = bindActionCreators(actions, dispatch); + bound.lookup = bindActionCreators(actions.lookup, dispatch); + return { actions: bound }; + } )(Container); From cb2f5b8faaae0f6d8efb135d978e464b7702a092 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 8 Sep 2016 12:42:34 +0200 Subject: [PATCH 0383/1062] fix walk-through issues --- js/src/modals/AddAddress/addAddress.js | 16 +++++----- .../AccountDetails/accountDetails.css | 14 +++++++++ .../AccountDetails/accountDetails.js | 30 +++++++++---------- js/src/views/Accounts/accounts.css | 8 ++--- js/src/views/Application/TabBar/tabBar.css | 4 +-- js/src/views/Application/application.js | 7 ++++- .../Signer/containers/Embedded/embedded.js | 10 +++---- 7 files changed, 53 insertions(+), 36 deletions(-) create mode 100644 js/src/modals/CreateAccount/AccountDetails/accountDetails.css diff --git a/js/src/modals/AddAddress/addAddress.js b/js/src/modals/AddAddress/addAddress.js index eb015477ec6..3f2f2293eda 100644 --- a/js/src/modals/AddAddress/addAddress.js +++ b/js/src/modals/AddAddress/addAddress.js @@ -50,7 +50,7 @@ export default class AddAddress extends Component { onTouchTap={ this.onClose } />, } - label='Save Entry' + label='Save Address' disabled={ hasError } primary onTouchTap={ this.onAdd } /> @@ -63,22 +63,22 @@ export default class AddAddress extends Component { return (
    diff --git a/js/src/modals/CreateAccount/AccountDetails/accountDetails.css b/js/src/modals/CreateAccount/AccountDetails/accountDetails.css new file mode 100644 index 00000000000..f5d283c0d53 --- /dev/null +++ b/js/src/modals/CreateAccount/AccountDetails/accountDetails.css @@ -0,0 +1,14 @@ +.icon { + margin: 1em -100% 0 0; +} + +.details { + float: left; + margin-bottom: 0.5em; + width: 100%; + padding-left: 72px; +} + +.details input { + width: 100%; +} diff --git a/js/src/modals/CreateAccount/AccountDetails/accountDetails.js b/js/src/modals/CreateAccount/AccountDetails/accountDetails.js index 1ad2b80da98..fbd5a0097aa 100644 --- a/js/src/modals/CreateAccount/AccountDetails/accountDetails.js +++ b/js/src/modals/CreateAccount/AccountDetails/accountDetails.js @@ -1,8 +1,10 @@ import React, { Component, PropTypes } from 'react'; -import Form, { FormWrap, Input } from '../../../ui/Form'; +import Form, { Input } from '../../../ui/Form'; import IdentityIcon from '../../../ui/IdentityIcon'; +import styles from './accountDetails.css'; + export default class AccountDetails extends Component { static propTypes = { address: PropTypes.string, @@ -16,23 +18,21 @@ export default class AccountDetails extends Component { return (
    - +
    - - - - { this.renderPhrase() } + { this.renderPhrase() } +
    ); } @@ -45,15 +45,13 @@ export default class AccountDetails extends Component { } return ( - - - + ); } } diff --git a/js/src/views/Accounts/accounts.css b/js/src/views/Accounts/accounts.css index d399bbb1b50..24b48ddb818 100644 --- a/js/src/views/Accounts/accounts.css +++ b/js/src/views/Accounts/accounts.css @@ -2,8 +2,8 @@ } .accountTooltip { - top: 12.5em; - left: 5em; + top: 13.3em; + left: 7em; } .toolbar { @@ -11,6 +11,6 @@ } .toolbarTooltip { - right: 20px; - top: 3.75em; + right: 1em; + top: 4em; } diff --git a/js/src/views/Application/TabBar/tabBar.css b/js/src/views/Application/TabBar/tabBar.css index 94dced26b95..547155d9edb 100644 --- a/js/src/views/Application/TabBar/tabBar.css +++ b/js/src/views/Application/TabBar/tabBar.css @@ -15,8 +15,8 @@ } .tabbarTooltip { - left: 2em; - top: 0; + left: 3.3em; + top: 0.5em; } .label { diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index bfade3f65c8..d3c36cc19bf 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -112,6 +112,7 @@ class Application extends Component { } retrieveAccounts = () => { + let { showFirstRun } = this.state; const nextTimeout = () => setTimeout(this.retrieveAccounts, 1000); Promise @@ -148,10 +149,14 @@ class Application extends Component { } }); + if (!accounts.length) { + showFirstRun = true; + } + this.setState({ accounts, contacts, - showFirstRun: accounts.length === 0 + showFirstRun }, nextTimeout); }) .catch((error) => { diff --git a/js/src/views/Signer/containers/Embedded/embedded.js b/js/src/views/Signer/containers/Embedded/embedded.js index 23f78b89bb7..e63b194c5b5 100644 --- a/js/src/views/Signer/containers/Embedded/embedded.js +++ b/js/src/views/Signer/containers/Embedded/embedded.js @@ -9,7 +9,7 @@ import styles from './embedded.js'; class Embedded extends Component { static propTypes = { - requests: PropTypes.shape({ + signerRequests: PropTypes.shape({ pending: PropTypes.array.isRequired, finished: PropTypes.array.isRequired }).isRequired, @@ -28,8 +28,8 @@ class Embedded extends Component { } renderPendingRequests () { - const { requests } = this.props; - const { pending } = requests; + const { signerRequests } = this.props; + const { pending } = signerRequests; if (!pending.length) { return ( @@ -70,11 +70,11 @@ class Embedded extends Component { } function mapStateToProps (state) { - const { actions, requests } = state; + const { actions, signerRequests } = state; return { actions, - requests + signerRequests }; } From 532b1e1bc2ffea5cd9c5f3ad56593262fd7971f4 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 8 Sep 2016 12:54:23 +0200 Subject: [PATCH 0384/1062] add address fixes --- js/src/modals/AddAddress/addAddress.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/js/src/modals/AddAddress/addAddress.js b/js/src/modals/AddAddress/addAddress.js index 3f2f2293eda..a6d47fedd7e 100644 --- a/js/src/modals/AddAddress/addAddress.js +++ b/js/src/modals/AddAddress/addAddress.js @@ -64,13 +64,13 @@ export default class AddAddress extends Component {
    @@ -78,7 +78,7 @@ export default class AddAddress extends Component { multiLine rows={ 1 } label='(optional) address description' - hint='a expanded description for the address' + hint='an expanded description for the entry' value={ description } onChange={ this.onEditDescription } /> From a2ffa3035606502947563ff26dde643fd99394d2 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Thu, 8 Sep 2016 13:31:19 +0200 Subject: [PATCH 0385/1062] improve code style in lookup component --- js/src/dapps/registry/Lookup/lookup.js | 34 ++++++++++++++------------ 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/js/src/dapps/registry/Lookup/lookup.js b/js/src/dapps/registry/Lookup/lookup.js index 07a69a2ff74..7c6b4e7222c 100644 --- a/js/src/dapps/registry/Lookup/lookup.js +++ b/js/src/dapps/registry/Lookup/lookup.js @@ -14,33 +14,25 @@ export default class Lookup extends Component { state = { name: '', key: '' }; render () { - const self = this; - const onNameChange = (e) => { - self.setState({ name: e.target.value }); - }; - const onKeyChange = (e) => { - self.setState({ key: e.target.value }); - }; - const onLookupClick = () => { - self.props.actions.lookup(self.state.name, self.state.key); - }; - + const { name, key } = this.state + const props = this.props.lookup return ( +
    { this.props.lookup.result || '' } @@ -48,4 +40,14 @@ export default class Lookup extends Component {
    ); } + + onNameChange = (e) => { + this.setState({ name: e.target.value }); + }; + onKeyChange = (e) => { + this.setState({ key: e.target.value }); + }; + onLookupClick = () => { + this.props.actions.lookup(this.state.name, this.state.key); + }; } From 4575b4c29f470b68fcdc4078b2c90cb6ebd6d095 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Thu, 8 Sep 2016 13:42:51 +0200 Subject: [PATCH 0386/1062] registry: header, move status down --- js/src/dapps/registry/Application/application.css | 8 ++++++++ js/src/dapps/registry/Application/application.js | 15 ++++++++++----- js/src/dapps/registry/Status/status.css | 13 ++----------- 3 files changed, 20 insertions(+), 16 deletions(-) create mode 100644 js/src/dapps/registry/Application/application.css diff --git a/js/src/dapps/registry/Application/application.css b/js/src/dapps/registry/Application/application.css new file mode 100644 index 00000000000..44a07d489ba --- /dev/null +++ b/js/src/dapps/registry/Application/application.css @@ -0,0 +1,8 @@ +.title { + margin: 0; padding: .5em; + line-height: 1.3; + font-size: 200%; + text-transform: uppercase; + color: #fff; + background-color: #333; +} diff --git a/js/src/dapps/registry/Application/application.js b/js/src/dapps/registry/Application/application.js index 9c825a0f0fd..96b5c06dadf 100644 --- a/js/src/dapps/registry/Application/application.js +++ b/js/src/dapps/registry/Application/application.js @@ -5,6 +5,7 @@ import lightBaseTheme from 'material-ui/styles/baseThemes/lightBaseTheme'; const muiTheme = getMuiTheme(lightBaseTheme); import CircularProgress from 'material-ui/CircularProgress'; +import styles from './application.css'; import Status from '../Status'; import Lookup from '../Lookup'; @@ -19,13 +20,17 @@ export default class Application extends Component { render () { const { contract, fee, owner, actions } = this.props; - if (!contract || !fee || !owner) { - return (); - } return (
    - - +

    Registry

    + { contract && fee && owner + ? ( +
    + + +
    + ) : + }
    ); } diff --git a/js/src/dapps/registry/Status/status.css b/js/src/dapps/registry/Status/status.css index 7ce7f2f0bf1..a61da1b3e3a 100644 --- a/js/src/dapps/registry/Status/status.css +++ b/js/src/dapps/registry/Status/status.css @@ -1,14 +1,5 @@ .status { padding: 1em; - color: #fff; - background-color: #c0392b; -} - -.address { -} - -.fee { -} - -.owner { + color: #333; + background-color: #f0f0f0; } From 5610452ad929567007d4680dc5e49be6c18c97f6 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Thu, 8 Sep 2016 14:40:15 +0200 Subject: [PATCH 0387/1062] registry: further styling :sparkles: --- .../registry/Application/application.css | 2 +- .../dapps/registry/Application/application.js | 2 +- js/src/dapps/registry/Lookup/lookup.css | 10 ++-- js/src/dapps/registry/Lookup/lookup.js | 51 +++++++++++-------- 4 files changed, 39 insertions(+), 26 deletions(-) diff --git a/js/src/dapps/registry/Application/application.css b/js/src/dapps/registry/Application/application.css index 44a07d489ba..e7a306bc2bd 100644 --- a/js/src/dapps/registry/Application/application.css +++ b/js/src/dapps/registry/Application/application.css @@ -1,5 +1,5 @@ .title { - margin: 0; padding: .5em; + margin: 0; padding: .3em .5em; line-height: 1.3; font-size: 200%; text-transform: uppercase; diff --git a/js/src/dapps/registry/Application/application.js b/js/src/dapps/registry/Application/application.js index 96b5c06dadf..dc6fe0cae64 100644 --- a/js/src/dapps/registry/Application/application.js +++ b/js/src/dapps/registry/Application/application.js @@ -22,7 +22,7 @@ export default class Application extends Component { return (
    -

    Registry

    +

    RΞgistry

    { contract && fee && owner ? (
    diff --git a/js/src/dapps/registry/Lookup/lookup.css b/js/src/dapps/registry/Lookup/lookup.css index 97becf31afd..deb1cfee2c4 100644 --- a/js/src/dapps/registry/Lookup/lookup.css +++ b/js/src/dapps/registry/Lookup/lookup.css @@ -1,7 +1,11 @@ .lookup { - padding: 1em; + margin: 1em; } -.results { - margin: .5em 0; +.box { + margin: 0 1em; +} + +.spacing { + margin-left: 1em; } diff --git a/js/src/dapps/registry/Lookup/lookup.js b/js/src/dapps/registry/Lookup/lookup.js index 7c6b4e7222c..7d189591632 100644 --- a/js/src/dapps/registry/Lookup/lookup.js +++ b/js/src/dapps/registry/Lookup/lookup.js @@ -1,6 +1,8 @@ import React, { Component, PropTypes } from 'react'; +import {Card, CardHeader, CardText} from 'material-ui/Card'; import TextField from 'material-ui/TextField'; -import FlatButton from 'material-ui/FlatButton'; +import RaisedButton from 'material-ui/RaisedButton'; +import SearchIcon from 'material-ui/svg-icons/action/search'; import styles from './lookup.css'; @@ -11,33 +13,40 @@ export default class Lookup extends Component { lookup: PropTypes.object } - state = { name: '', key: '' }; + state = { name: '', key: 'A' }; render () { const { name, key } = this.state const props = this.props.lookup return ( -
    - - - -
    - { this.props.lookup.result || '' } + + +
    + + + } + onClick={ this.onLookupClick } + />
    -
    + + { this.props.lookup.result || '' } + + ); } From fbee9b459f6fe9981b5d4d59262660b82e518d80 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 8 Sep 2016 15:42:55 +0200 Subject: [PATCH 0388/1062] status now looks usable... not 100% using the standard components, but usable. --- .../{Header => --remove-Header}/Header.css | 0 .../{Header => --remove-Header}/Header.js | 0 .../{Header => --remove-Header}/index.js | 0 .../views/Status/components/Status/Status.css | 46 +++++++++- .../views/Status/components/Status/Status.js | 87 +++++++++---------- .../Status/containers/Container/Container.js | 19 ++-- .../containers/StatusPage/StatusPage.js | 10 ++- .../containers/StatusPage/statusPage.css | 2 + 8 files changed, 105 insertions(+), 59 deletions(-) rename js/src/views/Status/components/{Header => --remove-Header}/Header.css (100%) rename js/src/views/Status/components/{Header => --remove-Header}/Header.js (100%) rename js/src/views/Status/components/{Header => --remove-Header}/index.js (100%) create mode 100644 js/src/views/Status/containers/StatusPage/statusPage.css diff --git a/js/src/views/Status/components/Header/Header.css b/js/src/views/Status/components/--remove-Header/Header.css similarity index 100% rename from js/src/views/Status/components/Header/Header.css rename to js/src/views/Status/components/--remove-Header/Header.css diff --git a/js/src/views/Status/components/Header/Header.js b/js/src/views/Status/components/--remove-Header/Header.js similarity index 100% rename from js/src/views/Status/components/Header/Header.js rename to js/src/views/Status/components/--remove-Header/Header.js diff --git a/js/src/views/Status/components/Header/index.js b/js/src/views/Status/components/--remove-Header/index.js similarity index 100% rename from js/src/views/Status/components/Header/index.js rename to js/src/views/Status/components/--remove-Header/index.js diff --git a/js/src/views/Status/components/Status/Status.css b/js/src/views/Status/components/Status/Status.css index 87edf66e4e2..3e02fd4e795 100644 --- a/js/src/views/Status/components/Status/Status.css +++ b/js/src/views/Status/components/Status/Status.css @@ -1,10 +1,52 @@ +.container { + padding-bottom: 1em; +} .row { - margin-left: -10px; - margin-right: -10px; + margin: 0 -1em; } + .row::after { display: table; clear: both; content: ''; } + +.col, +.col1, .col2, .col3, .col4, .col5, .col6, .col7, .col8, .col9, .col10, .col11, .col12 { + float: left; + padding: 0 1em; + box-sizing: border-box; +} + +.col3 { + width: 25%; + width: -webkit-calc(100% / 12 * 3); + width: -moz-calc(100% / 12 * 3); + width: calc(100% / 12 * 3); +} + +.col4 { + width: 33.33333%; + width: -webkit-calc(100% / 12 * 4); + width: -moz-calc(100% / 12 * 4); + width: calc(100% / 12 * 4); +} + +.col5 { + width: 41.66665%; + width: -webkit-calc(100% / 12 * 5); + width: -moz-calc(100% / 12 * 5); + width: calc(100% / 12 * 5); +} + +.col6 { + width: 50%; + width: -webkit-calc(100% / 12 * 6); + width: -moz-calc(100% / 12 * 6); + width: calc(100% / 12 * 6); +} + +.col12 { + width: 100%; +} diff --git a/js/src/views/Status/components/Status/Status.js b/js/src/views/Status/components/Status/Status.js index 9bb21db11ff..ddada1546e3 100644 --- a/js/src/views/Status/components/Status/Status.js +++ b/js/src/views/Status/components/Status/Status.js @@ -1,8 +1,9 @@ - import React, { Component, PropTypes } from 'react'; import formatNumber from 'format-number'; import bytes from 'bytes'; +import { Container } from '../../../../ui'; + import styles from './Status.css'; import Value from '../Value'; import MiningSettings from '../MiningSettings'; @@ -29,6 +30,43 @@ export default class Status extends Component { actions: PropTypes.object.isRequired } + render () { + const { status } = this.props; + const bestBlock = formatNumber()(status.bestBlock); + const hashrate = bytes(status.hashrate) || 0; + + return ( + +
    +
    +
    +
    +

    Best Block

    +

    #{ bestBlock }

    +
    +
    +

    Hash Rate

    +

    { `${hashrate} H/s` }

    +
    +
    +
    + +
    +
    + { this.renderSettings() } +
    +
    +
    +
    + ); + } + renderNodeName () { const { status } = this.props; return ( @@ -50,14 +88,14 @@ export default class Status extends Component { { ...this._test('chain') } />
    -
    +

    Peers

    -
    +

    Network port

    -
    +

    RPC Interface

    -
    +

    RPC Port

    ); } - - render () { - const { status } = this.props; - const bestBlock = formatNumber()(status.bestBlock); - const hashrate = bytes(status.hashrate) || 0; - - return ( -
    -
    -
    -
    -
    -
    -

    Best Block

    -

    #{ bestBlock }

    -
    -
    -

    Hash Rate

    -

    { `${hashrate} H/s` }

    -
    -
    -
    - -
    -
    - { this.renderSettings() } -
    -
    -
    -
    -
    - ); - } } diff --git a/js/src/views/Status/containers/Container/Container.js b/js/src/views/Status/containers/Container/Container.js index 519f9232fc6..0351a83bba0 100644 --- a/js/src/views/Status/containers/Container/Container.js +++ b/js/src/views/Status/containers/Container/Container.js @@ -3,7 +3,8 @@ import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import { extend } from 'lodash'; -import Header from '../../components/Header'; +import { Actionbar, Page } from '../../../../ui'; + import * as ToastActions from '../../actions/toastr'; import { updateLogging } from '../../actions/logger'; import ToastrContainer from '../../components/ToastrContainer'; @@ -25,18 +26,14 @@ class Container extends Component { } render () { - const { name, disconnected, noOfErrors } = this.props.status; - return (
    -
    - { this.renderPage() } - + + + { this.renderPage() } + +
    ); } diff --git a/js/src/views/Status/containers/StatusPage/StatusPage.js b/js/src/views/Status/containers/StatusPage/StatusPage.js index 5418281fb0d..236cd6b9a65 100644 --- a/js/src/views/Status/containers/StatusPage/StatusPage.js +++ b/js/src/views/Status/containers/StatusPage/StatusPage.js @@ -1,12 +1,14 @@ - import React, { Component, PropTypes } from 'react'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; import { extend } from 'lodash'; + import Status from '../../components/Status'; import * as ModifyMiningActions from '../../actions/modify-mining'; import { updateLogging } from '../../actions/logger'; +import styles from './statusPage.css'; + class StatusPage extends Component { static propTypes = { status: PropTypes.object.isRequired, @@ -16,7 +18,11 @@ class StatusPage extends Component { } render () { - return ; + return ( +
    + +
    + ); } } diff --git a/js/src/views/Status/containers/StatusPage/statusPage.css b/js/src/views/Status/containers/StatusPage/statusPage.css new file mode 100644 index 00000000000..6d86a0633b5 --- /dev/null +++ b/js/src/views/Status/containers/StatusPage/statusPage.css @@ -0,0 +1,2 @@ +.body { +} From c1fb52e5dfa65cc4e5c87e9da610df348d89e7d6 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Thu, 8 Sep 2016 17:30:02 +0200 Subject: [PATCH 0389/1062] add byte-array-to-hex to ethapi --- js/src/api/util/bytes-array-to-hex.js | 2 ++ js/src/api/util/bytes-array-to-hex.spec.js | 11 +++++++++++ 2 files changed, 13 insertions(+) create mode 100644 js/src/api/util/bytes-array-to-hex.js create mode 100644 js/src/api/util/bytes-array-to-hex.spec.js diff --git a/js/src/api/util/bytes-array-to-hex.js b/js/src/api/util/bytes-array-to-hex.js new file mode 100644 index 00000000000..64a61f4b63b --- /dev/null +++ b/js/src/api/util/bytes-array-to-hex.js @@ -0,0 +1,2 @@ +export default (bytes) => + '0x' + bytes.map((b) => b.toString(16)).join('') diff --git a/js/src/api/util/bytes-array-to-hex.spec.js b/js/src/api/util/bytes-array-to-hex.spec.js new file mode 100644 index 00000000000..1b0af718ce3 --- /dev/null +++ b/js/src/api/util/bytes-array-to-hex.spec.js @@ -0,0 +1,11 @@ +import bytesToHex from './bytes-array-to-hex'; + +describe('api/util/bytes-array-to-hex', () => { + it('correctly converts an empty array', () => { + expect(bytesToHex([])).to.equal('0x'); + }); + + it('correctly converts a non-empty array', () => { + expect(bytesToHex([0, 15, 16])).to.equal('0x0f10'); + }); +}); From 9091edce65dc726ce59004bd28e79c6a3153bc8b Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 8 Sep 2016 18:40:35 +0200 Subject: [PATCH 0390/1062] remove toastr, use the error middleware (consistency) --- js/src/index.js | 16 +- js/src/middleware.js | 21 +++ js/src/ui/Errors/middleware.js | 27 +++ js/src/views/Signer/actions/requests.js | 6 +- js/src/views/Signer/actions/toastr.js | 5 - .../ToastrContainer/ToastrContainer.css | 53 ------ .../ToastrContainer/ToastrContainer.js | 40 ---- .../components/ToastrContainer/index.js | 1 - js/src/views/Signer/components/index.js | 1 - js/src/views/Signer/components/util/toastr.js | 11 -- .../Signer/components/util/toastr.spec.js | 38 ---- js/src/views/Signer/middlewares/index.js | 3 - js/src/views/Signer/middlewares/toastr.js | 52 ------ .../views/Signer/middlewares/toastr.spec.js | 174 ------------------ js/src/views/Signer/reducers/index.js | 3 - js/src/views/Signer/reducers/toastr.js | 24 --- js/src/views/Signer/signer.js | 19 +- js/src/views/Signer/utils/toastr.js | 11 -- js/src/views/Status/actions/clipboard.js | 6 +- js/src/views/Status/actions/logger.js | 6 +- js/src/views/Status/actions/rpc.js | 12 +- js/src/views/Status/actions/toastr.js | 5 - .../ToastrContainer/ToastrContainer.css | 45 ----- .../ToastrContainer/ToastrContainer.js | 46 ----- .../components/ToastrContainer/index.js | 1 - .../Status/containers/Container/Container.js | 31 +--- .../Status/containers/RpcPage/RpcPage.js | 14 +- js/src/views/Status/middleware/index.js | 7 +- js/src/views/Status/middleware/rpc.js | 1 - js/src/views/Status/middleware/toastr.js | 53 ------ js/src/views/Status/middleware/toastr.spec.js | 174 ------------------ js/src/views/Status/reducers/index.js | 2 - js/src/views/Status/reducers/toastr.js | 23 --- js/src/views/Status/routes.js | 45 ----- js/src/views/Status/util/index.js | 1 - js/src/views/Status/util/toastr.js | 11 -- js/src/views/Status/util/toastr.spec.js | 38 ---- 37 files changed, 79 insertions(+), 947 deletions(-) create mode 100644 js/src/middleware.js create mode 100644 js/src/ui/Errors/middleware.js delete mode 100644 js/src/views/Signer/actions/toastr.js delete mode 100644 js/src/views/Signer/components/ToastrContainer/ToastrContainer.css delete mode 100644 js/src/views/Signer/components/ToastrContainer/ToastrContainer.js delete mode 100644 js/src/views/Signer/components/ToastrContainer/index.js delete mode 100644 js/src/views/Signer/components/util/toastr.js delete mode 100644 js/src/views/Signer/components/util/toastr.spec.js delete mode 100644 js/src/views/Signer/middlewares/toastr.js delete mode 100644 js/src/views/Signer/middlewares/toastr.spec.js delete mode 100644 js/src/views/Signer/reducers/toastr.js delete mode 100644 js/src/views/Signer/utils/toastr.js delete mode 100644 js/src/views/Status/actions/toastr.js delete mode 100644 js/src/views/Status/components/ToastrContainer/ToastrContainer.css delete mode 100644 js/src/views/Status/components/ToastrContainer/ToastrContainer.js delete mode 100644 js/src/views/Status/components/ToastrContainer/index.js delete mode 100644 js/src/views/Status/middleware/toastr.js delete mode 100644 js/src/views/Status/middleware/toastr.spec.js delete mode 100644 js/src/views/Status/reducers/toastr.js delete mode 100644 js/src/views/Status/routes.js delete mode 100644 js/src/views/Status/util/toastr.js delete mode 100644 js/src/views/Status/util/toastr.spec.js diff --git a/js/src/index.js b/js/src/index.js index c92ddeae33f..4b50299f637 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -3,7 +3,6 @@ import React from 'react'; import ReactDOM from 'react-dom'; import injectTapEventPlugin from 'react-tap-event-plugin'; import es6Promise from 'es6-promise'; - import { createHashHistory } from 'history'; import { Provider } from 'react-redux'; import { applyMiddleware, combineReducers, createStore } from 'redux'; @@ -19,17 +18,16 @@ import { Accounts, Account, Addresses, Address, Application, Contract, Contracts import { errorReducer } from './ui/Errors'; import { tooltipReducer } from './ui/Tooltips'; import { nodeStatusReducer } from './views/Application/Status'; +import initMiddleware from './middleware'; // TODO: This is VERY messy, just dumped here to get the Signer going -import signerMiddlewares from './views/Signer/middlewares'; -import { signer as signerReducer, toastr as signerToastrReducer, requests as signerRequestsReducer } from './views/Signer/reducers'; +import { signer as signerReducer, requests as signerRequestsReducer } from './views/Signer/reducers'; import { Web3Provider as SignerWeb3Provider, web3Extension as statusWeb3Extension } from './views/Signer/components'; import { WebSocketsProvider, Ws } from './views/Signer/utils'; import { SignerDataProvider, WsDataProvider } from './views/Signer/providers'; // TODO: same with Status... -import statusMiddlewares from './views/Status/middleware'; -import { status as statusReducer, settings as statusSettingsReducer, mining as statusMiningReducer, rpc as statusRpcReducer, toastr as statusToastrReducer, logger as statusLoggerReducer, debug as statusDebugReducer } from './views/Status/reducers'; +import { status as statusReducer, debug as statusDebugReducer, logger as statusLoggerReducer, mining as statusMiningReducer, rpc as statusRpcReducer, settings as statusSettingsReducer } from './views/Status/reducers'; import { Web3Provider as StatusWeb3Provider } from './views/Status/provider/web3-provider'; import StatusEthcoreWeb3 from './views/Status/provider/web3-ethcore-provider'; import Status from './views/Status/containers/Container'; @@ -70,22 +68,18 @@ const reducers = combineReducers({ routing: routerReducer, signer: signerReducer, signerRequests: signerRequestsReducer, - signerToastr: signerToastrReducer, status: statusReducer, statusSettings: statusSettingsReducer, statusMining: statusMiningReducer, statusRpc: statusRpcReducer, - statusToastr: statusToastrReducer, statusLogger: statusLoggerReducer, statusDebug: statusDebugReducer }); -const middlewares = [] - .concat(signerMiddlewares(ws, tokenSetter)) - .concat(statusMiddlewares(web3)); +const middleware = initMiddleware(ws, tokenSetter, web3); const storeCreation = window.devToolsExtension ? window.devToolsExtension()(createStore) : createStore; -const store = applyMiddleware(...middlewares)(storeCreation)(reducers); +const store = applyMiddleware(...middleware)(storeCreation)(reducers); // signer new WsDataProvider(store, ws); // eslint-disable-line no-new diff --git a/js/src/middleware.js b/js/src/middleware.js new file mode 100644 index 00000000000..ed3cd53e443 --- /dev/null +++ b/js/src/middleware.js @@ -0,0 +1,21 @@ +import ErrorsMiddleware, { withError } from './ui/Errors/middleware'; + +import signerMiddlewares from './views/Signer/middlewares'; +import statusMiddlewares from './views/Status/middleware'; + +export default function (signerWs, signerTokenSetter, statusWeb3) { + const errors = new ErrorsMiddleware(); + + const signer = signerMiddlewares(signerWs, signerTokenSetter); + const status = statusMiddlewares(statusWeb3); + + const middleware = [ + errors.toMiddleware() + ]; + + return middleware.concat(signer).concat(status); +} + +export { + withError +}; diff --git a/js/src/ui/Errors/middleware.js b/js/src/ui/Errors/middleware.js new file mode 100644 index 00000000000..20d5156d24d --- /dev/null +++ b/js/src/ui/Errors/middleware.js @@ -0,0 +1,27 @@ +import { newError } from './actions'; + +export default class ErrorsMiddleware { + toMiddleware () { + return (store) => (next) => (action) => { + const { meta } = action; + + if (!meta || !meta.error) { + next(action); + return; + } + + next(newError(meta.error)); + }; + } +} + +export function withError (formatter, type = 'default') { + return (message) => { + return { + error: { + message: formatter(message), + type + } + }; + }; +} diff --git a/js/src/views/Signer/actions/requests.js b/js/src/views/Signer/actions/requests.js index fc3e63f067c..63627356fa9 100644 --- a/js/src/views/Signer/actions/requests.js +++ b/js/src/views/Signer/actions/requests.js @@ -1,4 +1,4 @@ -import { withToastr } from '../components/util/toastr'; +import { withError } from '../../../middleware'; import { identity } from '../components/util/util'; import { createAction } from 'redux-actions'; @@ -10,10 +10,10 @@ export const updatePendingRequests = createAction('update pendingRequests'); export const startConfirmRequest = createAction('start confirmRequest'); export const successConfirmRequest = createAction('success confirmRequest'); export const errorConfirmRequest = createAction('error confirmRequest', identity, - withToastr(args => args.err, 'error') + withError(args => args.err, 'error') ); export const startRejectRequest = createAction('start rejectRequest'); export const successRejectRequest = createAction('success rejectRequest'); export const errorRejectRequest = createAction('error rejectRequest', identity, - withToastr(args => args.err, 'error') + withError(args => args.err, 'error') ); diff --git a/js/src/views/Signer/actions/toastr.js b/js/src/views/Signer/actions/toastr.js deleted file mode 100644 index d63eff527ec..00000000000 --- a/js/src/views/Signer/actions/toastr.js +++ /dev/null @@ -1,5 +0,0 @@ - -import { createAction } from 'redux-actions'; - -export const addToast = createAction('add toast'); -export const removeToast = createAction('remove toast'); diff --git a/js/src/views/Signer/components/ToastrContainer/ToastrContainer.css b/js/src/views/Signer/components/ToastrContainer/ToastrContainer.css deleted file mode 100644 index a46377d6274..00000000000 --- a/js/src/views/Signer/components/ToastrContainer/ToastrContainer.css +++ /dev/null @@ -1,53 +0,0 @@ -.toastrContainer { - position: absolute; - bottom: 0; - right: 10px; - width: 250px; -} - -.toast { - padding: 1.1rem; - position: relative; - font-size: 1.1rem; - line-height: 1.4rem; - margin-bottom: 1.2rem; - animation: fadein .5s; -} - -.toast:hover .remove { - opacity: 0.9; -} - -.error { - background: #E53935 !important; - border-color: 1px solid #C62828; - color: #fff !important; -} - -.success { - background: #43A047 !important; - border-color: 1px solid #2E7D32; - color: #fff !important; -} - -.remove { - position: absolute; - top: 2px; - right: 5px; - cursor: pointer; - opacity: 0; - transition: opacity 0.2s ease-in; -} -.remove:hover { - text-decoration: none; -} - -.error .remove, -.success .remove { - color: #fff !important; -} - -@keyframes fadein { - from {opacity: 0;} - to {opacity: 1;} -} diff --git a/js/src/views/Signer/components/ToastrContainer/ToastrContainer.js b/js/src/views/Signer/components/ToastrContainer/ToastrContainer.js deleted file mode 100644 index e8d60fab320..00000000000 --- a/js/src/views/Signer/components/ToastrContainer/ToastrContainer.js +++ /dev/null @@ -1,40 +0,0 @@ -import React, { Component, PropTypes } from 'react'; -import Paper from 'material-ui/Paper'; - -import styles from './ToastrContainer.css'; - -export default class ToastrContainer extends Component { - static propTypes = { - toasts: PropTypes.array.isRequired, - actions: PropTypes.shape({ - removeToast: PropTypes.func.isRequired - }).isRequired - } - - render () { - return ( -
    - { this.renderToasts() } -
    - ); - } - - renderToasts () { - return this.props.toasts.map(t => { - const removeToast = () => this.props.actions.removeToast(t.toastNo); - - return ( - - - × - - { t.msg } - - ); - }); - } -} diff --git a/js/src/views/Signer/components/ToastrContainer/index.js b/js/src/views/Signer/components/ToastrContainer/index.js deleted file mode 100644 index eac41741099..00000000000 --- a/js/src/views/Signer/components/ToastrContainer/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './ToastrContainer'; diff --git a/js/src/views/Signer/components/index.js b/js/src/views/Signer/components/index.js index 1a13cd7162e..103ac81078e 100644 --- a/js/src/views/Signer/components/index.js +++ b/js/src/views/Signer/components/index.js @@ -1,5 +1,4 @@ export RequestFinishedWeb3 from './RequestFinishedWeb3'; export RequestPendingWeb3 from './RequestPendingWeb3'; -export ToastrContainer from './ToastrContainer'; export web3Extension from './util/web3.extensions'; export Web3Provider from './Web3Provider'; diff --git a/js/src/views/Signer/components/util/toastr.js b/js/src/views/Signer/components/util/toastr.js deleted file mode 100644 index cf09a10c454..00000000000 --- a/js/src/views/Signer/components/util/toastr.js +++ /dev/null @@ -1,11 +0,0 @@ -// pass this to action creator's meta (third argument) to make action toastable -export function withToastr (msgFunc, type = 'default') { - return function (msg) { - return { - toastr: { - msg: msgFunc(msg), - type - } - }; - }; -} diff --git a/js/src/views/Signer/components/util/toastr.spec.js b/js/src/views/Signer/components/util/toastr.spec.js deleted file mode 100644 index 6cbff32131e..00000000000 --- a/js/src/views/Signer/components/util/toastr.spec.js +++ /dev/null @@ -1,38 +0,0 @@ -import { withToastr } from './toastr'; - -describe('UTIL TOASTR', () => { - it('should return toastr object with type set to default, when no type is passed', () => { - // given - const msg = 'test'; - const msgFunc = x => `some text and ${x}`; - - // when - const res = withToastr(msgFunc)(msg); - - // then - expect(res).to.eql({ - toastr: { - msg: `some text and ${msg}`, - type: 'default' - } - }); - }); - - it('should return toastr object with type set to success, when success type is passed', () => { - // given - const msg = 'test'; - const type = 'success'; - const msgFunc = x => `some text and ${x}`; - - // when - const res = withToastr(msgFunc, type)(msg); - - // then - expect(res).to.eql({ - toastr: { - msg: `some text and ${msg}`, - type - } - }); - }); -}); diff --git a/js/src/views/Signer/middlewares/index.js b/js/src/views/Signer/middlewares/index.js index fb4ea080bc6..277b81d13c3 100644 --- a/js/src/views/Signer/middlewares/index.js +++ b/js/src/views/Signer/middlewares/index.js @@ -1,19 +1,16 @@ // Middleware classes (except logger) import Ws from './ws'; import Signer from './signer'; -import Toastr from './toastr'; import logger from './logger'; export default function middlewares (ws, setToken) { // Middleware instances const wsMiddleware = new Ws(ws, setToken); const signer = new Signer(); - const toastr = new Toastr(); return [ logger, wsMiddleware.toMiddleware(), - toastr.toMiddleware(), signer.toMiddleware() ]; } diff --git a/js/src/views/Signer/middlewares/toastr.js b/js/src/views/Signer/middlewares/toastr.js deleted file mode 100644 index 1c8e7a60fd3..00000000000 --- a/js/src/views/Signer/middlewares/toastr.js +++ /dev/null @@ -1,52 +0,0 @@ -import { addToast, removeToast } from '../actions/toastr'; - -export default class ToastrMiddleware { - constructor (time = 4000) { - this._time = time; - this._timeouts = {}; - } - - toMiddleware () { - return store => next => action => { - const { type, payload } = action; - if (type === 'remove toast' || type === 'freezeToast') { - this.clearTimeoutFor(payload); - } - - // pass along action - next(action); - - if (!this.shouldToast(action)) { - return; - } - - // if action should toast, call next again with toast values - this.toast(store, next, action); - }; - } - - toast (store, next, action) { - const { toastNo } = store.getState().signerToastr; - const { msg, type } = action.meta.toastr; - - next(addToast({ type, msg, toastNo })); - this.setTimeoutFor(toastNo, next); - } - - setTimeoutFor (toastNo, next) { - this._timeouts[String(toastNo)] = setTimeout(() => { - this.clearTimeoutFor(toastNo); - next(removeToast(toastNo)); - }, this._time); - } - - shouldToast (action) { - return !!(action.meta && action.meta.toastr); - } - - clearTimeoutFor (toastNo) { - clearTimeout(this._timeouts[String(toastNo)]); - delete this._timeouts[String(toastNo)]; - } - -} diff --git a/js/src/views/Signer/middlewares/toastr.spec.js b/js/src/views/Signer/middlewares/toastr.spec.js deleted file mode 100644 index 73036e4f6c6..00000000000 --- a/js/src/views/Signer/middlewares/toastr.spec.js +++ /dev/null @@ -1,174 +0,0 @@ -import sinon from 'sinon'; -import ToastrMiddleware from './toastr'; -import { removeToast, addToast } from '../actions/toastr'; - -describe('MIDDLEWARE: TOASTR', () => { - let cut, state; - const time = 20; - let toastNo = 1; - - beforeEach('mock cut', () => { - cut = new ToastrMiddleware(time); - state = { - toastr: { - toastNo: toastNo - } - }; - }); - - describe('TO MIDDLEWARE', () => { - beforeEach('mock methods', () => { - cut.clearTimeoutFor = sinon.spy(); - cut.toast = sinon.spy(); - }); - - it('should call only clearTimeoutFor and next, when respected action is dispatched', () => { - // given - const store = null; - const next = sinon.spy(); - const middleware = cut.toMiddleware()(store)(next); - const action = removeToast(toastNo); - expect(middleware).to.be.a('function'); - expect(action).to.be.an('object'); - - // when - middleware(action); - - // then - expect(cut.clearTimeoutFor.calledWith(toastNo)).to.be.true; - expect(next.calledWith(action)).to.be.true; - expect(cut.toast.called).to.be.false; - }); - - it('should call only next when non-respected action is dispatched', () => { - // given - const store = null; - const next = sinon.spy(); - const middleware = cut.toMiddleware()(store)(next); - const action = { type: 'test' }; - expect(middleware).to.be.a('function'); - expect(action).to.be.an('object'); - - // when - middleware(action); - - // then - expect(cut.clearTimeoutFor.called).to.be.false; - expect(next.calledWith(action)).to.be.true; - expect(cut.toast.called).to.be.false; - }); - - it('should call only next and toast, when action with meta toastr is dispatched', () => { - // given - const msg = 'test'; - const store = null; - const next = sinon.spy(); - const middleware = cut.toMiddleware()(store)(next); - const meta = { toastr: { msg, type: 'default' } }; - const action = { type: 'test', payload: 'test', meta }; - expect(middleware).to.be.a('function'); - expect(action).to.be.an('object'); - - // when - middleware(action); - - // then - expect(cut.clearTimeoutFor.called).to.be.false; - expect(next.calledWith(action)).to.be.true; - expect(cut.toast.calledWith(store, next, action)).to.be.true; - }); - }); - - describe('TOAST', () => { - // using 'before' doesn't work - // it might b overwriten by the global beforeEach - beforeEach('spy on removeToast', () => { - cut.setTimeoutFor = sinon.spy(); - }); - - it('should call next and setTimeoutFor', () => { - // given - const msg = 'text'; - const type = 'default'; - const store = { getState: () => state }; - const next = sinon.spy(); - const action = { meta: { toastr: { - msg, type - } } }; - - // when - cut.toast(store, next, action); - - // then - expect(next.calledWith(addToast({ - msg, type, toastNo - }))).to.be.true; - - expect(cut.setTimeoutFor.calledWith(toastNo, next)); - }); - }); - - describe('SET TIMEOUT FOR', () => { - beforeEach('spy on clearTimeoutFor', () => { - cut.clearTimeoutFor = sinon.spy(); - }); - it('should call clearTimeoutFor and next after cut._time', done => { - // given - const next = sinon.spy(); - - // when - cut.setTimeoutFor(toastNo, next); - - // then - expect(cut._timeouts[String(toastNo)]).to.be.an('object'); - setTimeout(() => { - expect(cut.clearTimeoutFor.calledWith(toastNo)).to.be.true; - expect(next.calledWith(removeToast(toastNo))).to.be.true; - done(); - }, time); - }); - }); - - describe('SHOULD TOAST', () => { - it('should return false when action isn\'t toastable', () => { - // given - const action = { meta: {} }; - - // when - const res = cut.shouldToast(action); - - // then - expect(res).to.be.false; - }); - it('should return true when action is toastable', () => { - // given - const action = { meta: { toastr: { msg: 'foo' } } }; - - // when - const res = cut.shouldToast(action); - - // then - expect(res).to.be.true; - }); - }); - describe('CLEAR TIMEOUT FOR', () => { - let mockedTimeoutSpy; - beforeEach('mock timeouts', () => { - mockedTimeoutSpy = sinon.spy(); - cut._timeouts[String(toastNo)] = setTimeout(() => { - mockedTimeoutSpy(); - }, time); - }); - it('should clear and delete timeout', done => { - // when - cut.clearTimeoutFor(toastNo); - - // then - expect(cut._timeouts[String(toastNo)]).to.be.undefined; - setTimeout(() => { - expect(mockedTimeoutSpy.called).to.be.false; - done(); - }, time); - }); - }); -}); diff --git a/js/src/views/Signer/reducers/index.js b/js/src/views/Signer/reducers/index.js index 2c9506ba794..3ca1a364b2c 100644 --- a/js/src/views/Signer/reducers/index.js +++ b/js/src/views/Signer/reducers/index.js @@ -1,18 +1,15 @@ import { combineReducers } from 'redux'; import { routerReducer as routing } from 'react-router-redux'; import signer from './signer'; -import toastr from './toastr'; import requests from './requests'; export default combineReducers({ routing, signer, - toastr, requests }); export { signer, - toastr, requests }; diff --git a/js/src/views/Signer/reducers/toastr.js b/js/src/views/Signer/reducers/toastr.js deleted file mode 100644 index 5018dc8b0cd..00000000000 --- a/js/src/views/Signer/reducers/toastr.js +++ /dev/null @@ -1,24 +0,0 @@ -import { handleActions } from 'redux-actions'; - -const initialState = { - toasts: [], - toastNo: 1 -}; - -export default handleActions({ - 'add toast' (state, action) { - return { - ...state, - toastNo: state.toastNo + 1, - toasts: [action.payload].concat(state.toasts) - }; - }, - - 'remove toast' (state, action) { - return { - ...state, - toasts: state.toasts.filter(t => t.toastNo !== action.payload) - }; - } - -}, initialState); diff --git a/js/src/views/Signer/signer.js b/js/src/views/Signer/signer.js index c2c6ebdcf77..f28414967ac 100644 --- a/js/src/views/Signer/signer.js +++ b/js/src/views/Signer/signer.js @@ -1,11 +1,8 @@ import React, { Component, PropTypes } from 'react'; -import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; import { Actionbar, Page } from '../../ui'; -import { removeToast } from './actions/toastr'; -import { ToastrContainer } from './components'; import LoadingPage from './containers/LoadingPage'; import OfflinePage from './containers/OfflinePage'; import RequestsPage from './containers/RequestsPage'; @@ -15,12 +12,6 @@ import styles from './signer.css'; export class Signer extends Component { static propTypes = { - signerToastr: PropTypes.shape({ - toasts: PropTypes.array.isRequired - }).isRequired, - actions: PropTypes.shape({ - removeToast: PropTypes.func.isRequired - }).isRequired, signer: PropTypes.shape({ isLoading: PropTypes.bool.isRequired, isConnected: PropTypes.bool.isRequired, @@ -29,8 +20,6 @@ export class Signer extends Component { }; render () { - const { signerToastr, actions } = this.props; - return (
    { this.renderPage() } -
    ); } @@ -74,9 +59,7 @@ function mapStateToProps (state) { } function mapDispatchToProps (dispatch) { - return { - actions: bindActionCreators({ removeToast }, dispatch) - }; + return {}; } export default connect( diff --git a/js/src/views/Signer/utils/toastr.js b/js/src/views/Signer/utils/toastr.js deleted file mode 100644 index 8e397461fd4..00000000000 --- a/js/src/views/Signer/utils/toastr.js +++ /dev/null @@ -1,11 +0,0 @@ -// pass this to action creator's meta (third argument) to make action toastable -export const withToastr = (msgFunc, type = 'default') => { - return msg => { - return { - toastr: { - msg: msgFunc(msg), - type - } - }; - }; -}; diff --git a/js/src/views/Status/actions/clipboard.js b/js/src/views/Status/actions/clipboard.js index e3e93f17c8e..2dd79359b3f 100644 --- a/js/src/views/Status/actions/clipboard.js +++ b/js/src/views/Status/actions/clipboard.js @@ -1,6 +1,6 @@ - import { createAction } from 'redux-actions'; + import { identity } from '../util'; -import { withToastr } from '../util/toastr'; +import { withError } from '../../../middleware'; -export const copyToClipboard = createAction('copy toClipboard', identity, withToastr(identity)); +export const copyToClipboard = createAction('copy toClipboard', identity, withError(identity)); diff --git a/js/src/views/Status/actions/logger.js b/js/src/views/Status/actions/logger.js index d06d2ab2257..539bbe19f46 100644 --- a/js/src/views/Status/actions/logger.js +++ b/js/src/views/Status/actions/logger.js @@ -1,8 +1,8 @@ - import { createAction } from 'redux-actions'; + import { identity } from '../util'; -import { withToastr } from '../util/toastr'; +import { withError } from '../../../middleware'; export const updateLogging = createAction( - 'update logging', identity, withToastr(flag => `logging updated to ${flag}`) + 'update logging', identity, withError(flag => `logging updated to ${flag}`) ); diff --git a/js/src/views/Status/actions/rpc.js b/js/src/views/Status/actions/rpc.js index 72ebc8bd6a4..160676594b4 100644 --- a/js/src/views/Status/actions/rpc.js +++ b/js/src/views/Status/actions/rpc.js @@ -1,11 +1,11 @@ - import { createAction } from 'redux-actions'; -import { identity } from '../util'; -import { withToastr } from '../util/toastr'; -export const error = createAction('error rpc', identity, - withToastr(() => 'error processing rpc call. check console for details', 'error') -); +// import { identity } from '../util'; +// import { withError } from '../../../middleware'; +// +// export const error = createAction('error rpc', identity, +// withError(() => 'error processing rpc call. check console for details', 'error') +// ); export const fireRpc = createAction('fire rpc'); export const addRpcReponse = createAction('add rpcResponse'); export const selectRpcMethod = createAction('select rpcMethod'); diff --git a/js/src/views/Status/actions/toastr.js b/js/src/views/Status/actions/toastr.js deleted file mode 100644 index d63eff527ec..00000000000 --- a/js/src/views/Status/actions/toastr.js +++ /dev/null @@ -1,5 +0,0 @@ - -import { createAction } from 'redux-actions'; - -export const addToast = createAction('add toast'); -export const removeToast = createAction('remove toast'); diff --git a/js/src/views/Status/components/ToastrContainer/ToastrContainer.css b/js/src/views/Status/components/ToastrContainer/ToastrContainer.css deleted file mode 100644 index 34497faed43..00000000000 --- a/js/src/views/Status/components/ToastrContainer/ToastrContainer.css +++ /dev/null @@ -1,45 +0,0 @@ -.toastrContainer { - position: absolute; - top: 81px; - right: 10px; - width: 200px; -} - -.toast { - padding: 10px; - position: relative; - font-size: 16px; - margin-bottom: 10px; - animation: fadein .5s; -} - -.error { - background: red !important; - color: #fff !important; -} - -.succes { - background: green !important; - color: #fff !important; -} - -.remove { - float: right; - cursor: pointer; -} - -.error .remove, -.success .remove { - color: #fff !important; -} - -.msg { - color: #000; - font-size: 18px; - text-shadow: 0px 0px 2px rgb(103, 103, 103); -} - -@keyframes fadein { - from {opacity: 0;} - to {opacity: 1;} -} diff --git a/js/src/views/Status/components/ToastrContainer/ToastrContainer.js b/js/src/views/Status/components/ToastrContainer/ToastrContainer.js deleted file mode 100644 index 54e15701328..00000000000 --- a/js/src/views/Status/components/ToastrContainer/ToastrContainer.js +++ /dev/null @@ -1,46 +0,0 @@ - -import React, { Component, PropTypes } from 'react'; -import Paper from 'material-ui/Paper'; - -import styles from './ToastrContainer.css'; - -export default class ToastrContainer extends Component { - - render () { - return ( -
    - { this.renderToasts() } -
    - ); - } - - renderToasts () { - return this.props.statusToastr.toasts.map(t => { - const removeToast = () => this.props.actions.removeToast(t.toastNo); - - return ( - - - - - { t.msg } - - ); - }); - } - - static propTypes = { - statusToastr: PropTypes.shape({ - toasts: PropTypes.array.isRequired - }).isRequired, - actions: PropTypes.shape({ - removeToast: PropTypes.func.isRequired - }).isRequired - } - -} diff --git a/js/src/views/Status/components/ToastrContainer/index.js b/js/src/views/Status/components/ToastrContainer/index.js deleted file mode 100644 index eac41741099..00000000000 --- a/js/src/views/Status/components/ToastrContainer/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './ToastrContainer'; diff --git a/js/src/views/Status/containers/Container/Container.js b/js/src/views/Status/containers/Container/Container.js index 0351a83bba0..4aad3e3b51c 100644 --- a/js/src/views/Status/containers/Container/Container.js +++ b/js/src/views/Status/containers/Container/Container.js @@ -5,12 +5,8 @@ import { extend } from 'lodash'; import { Actionbar, Page } from '../../../../ui'; -import * as ToastActions from '../../actions/toastr'; import { updateLogging } from '../../actions/logger'; -import ToastrContainer from '../../components/ToastrContainer'; -import DebugPage from '../DebugPage'; -import RpcPage from '../RpcPage'; import StatusPage from '../StatusPage'; import styles from './status.css'; @@ -31,34 +27,11 @@ class Container extends Component { - { this.renderPage() } - +
    ); } - - renderPage () { - const { params } = this.props; - - if (params && params.subpage) { - if (params.subpage === 'debug') { - return ( - - ); - } else if (params.subpage === 'rpc') { - return ( - -
    This is very much still a WIP, hence the original RPC calls are not available here yet (it should actually be removed here and moved to a dedicated developer section once available)
    -
    - ); - } - } - - return ( - - ); - } } function mapStateToProps (state) { @@ -67,7 +40,7 @@ function mapStateToProps (state) { function mapDispatchToProps (dispatch) { return { - actions: bindActionCreators(extend({}, ToastActions, { updateLogging }), dispatch) + actions: bindActionCreators(extend({}, {}, { updateLogging }), dispatch) }; } diff --git a/js/src/views/Status/containers/RpcPage/RpcPage.js b/js/src/views/Status/containers/RpcPage/RpcPage.js index 8c6b339539b..768ad5d424f 100644 --- a/js/src/views/Status/containers/RpcPage/RpcPage.js +++ b/js/src/views/Status/containers/RpcPage/RpcPage.js @@ -1,5 +1,5 @@ - import React, { Component, PropTypes } from 'react'; + import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; import { extend } from 'lodash'; @@ -8,6 +8,11 @@ import { updateLogging } from '../../actions/logger'; import { copyToClipboard } from '../../actions/clipboard'; class RpcPage extends Component { + static propTypes = { + children: PropTypes.object.isRequired, + rpc: PropTypes.object.isRequired, + actions: PropTypes.object.isRequired + } render () { return ( @@ -18,13 +23,6 @@ class RpcPage extends Component {
    ); } - - static propTypes = { - children: PropTypes.object.isRequired, - rpc: PropTypes.object.isRequired, - actions: PropTypes.object.isRequired - } - } function mapStateToProps (state) { diff --git a/js/src/views/Status/middleware/index.js b/js/src/views/Status/middleware/index.js index 98221f5f976..48a5a5885a0 100644 --- a/js/src/views/Status/middleware/index.js +++ b/js/src/views/Status/middleware/index.js @@ -6,7 +6,6 @@ import logger from './logger'; import WebInteractions from './user-web3-interactions'; import Rpc from './rpc'; import LocalStorage from './localstorage'; -import Toastr from './toastr.js'; export default function (web3) { const ethcoreWeb3 = new EthcoreWeb3(web3); @@ -14,13 +13,11 @@ export default function (web3) { const web3Interactions = new WebInteractions(web3, ethcoreWeb3); const rpc = new Rpc(request); const localstorage = new LocalStorage(); - const toastr = new Toastr(); return [ logger, - web3Interactions.toMiddleware(), - rpc.toMiddleware(), localstorage.toMiddleware(), - toastr.toMiddleware() + rpc.toMiddleware(), + web3Interactions.toMiddleware() ]; } diff --git a/js/src/views/Status/middleware/rpc.js b/js/src/views/Status/middleware/rpc.js index db7138c693b..623126132c2 100644 --- a/js/src/views/Status/middleware/rpc.js +++ b/js/src/views/Status/middleware/rpc.js @@ -1,4 +1,3 @@ - import web3Formatters from 'web3/lib/web3/formatters.js'; import web3Utils from 'web3/lib/utils/utils.js'; import * as RpcActions from '../actions/rpc'; diff --git a/js/src/views/Status/middleware/toastr.js b/js/src/views/Status/middleware/toastr.js deleted file mode 100644 index 0bc867ef130..00000000000 --- a/js/src/views/Status/middleware/toastr.js +++ /dev/null @@ -1,53 +0,0 @@ - -import { addToast, removeToast } from '../actions/toastr'; - -export default class ToastrMiddleware { - - constructor (time = 4000) { - this._time = time; - this._timeouts = {}; - } - - toMiddleware () { - return store => next => action => { - const { type, payload } = action; - if (type === 'remove toast' || type === 'freezeToast') { - this.clearTimeoutFor(payload); - } - - // pass along action - next(action); - - if (!this.shouldToast(action)) { - return; - } - - // if action should toast, call next again with toast values - this.toast(store, next, action); - }; - } - - toast (store, next, action) { - const { toastNo } = store.getState().toastr; - const { msg, type } = action.meta.toastr; - next(addToast({ type, msg, toastNo })); - this.setTimeoutFor(toastNo, next); - } - - setTimeoutFor (toastNo, next) { - this._timeouts[String(toastNo)] = setTimeout(() => { - this.clearTimeoutFor(toastNo); - next(removeToast(toastNo)); - }, this._time); - } - - shouldToast (action) { - return !!(action.meta && action.meta.toastr); - } - - clearTimeoutFor (toastNo) { - clearTimeout(this._timeouts[String(toastNo)]); - delete this._timeouts[String(toastNo)]; - } - -} diff --git a/js/src/views/Status/middleware/toastr.spec.js b/js/src/views/Status/middleware/toastr.spec.js deleted file mode 100644 index 73036e4f6c6..00000000000 --- a/js/src/views/Status/middleware/toastr.spec.js +++ /dev/null @@ -1,174 +0,0 @@ -import sinon from 'sinon'; -import ToastrMiddleware from './toastr'; -import { removeToast, addToast } from '../actions/toastr'; - -describe('MIDDLEWARE: TOASTR', () => { - let cut, state; - const time = 20; - let toastNo = 1; - - beforeEach('mock cut', () => { - cut = new ToastrMiddleware(time); - state = { - toastr: { - toastNo: toastNo - } - }; - }); - - describe('TO MIDDLEWARE', () => { - beforeEach('mock methods', () => { - cut.clearTimeoutFor = sinon.spy(); - cut.toast = sinon.spy(); - }); - - it('should call only clearTimeoutFor and next, when respected action is dispatched', () => { - // given - const store = null; - const next = sinon.spy(); - const middleware = cut.toMiddleware()(store)(next); - const action = removeToast(toastNo); - expect(middleware).to.be.a('function'); - expect(action).to.be.an('object'); - - // when - middleware(action); - - // then - expect(cut.clearTimeoutFor.calledWith(toastNo)).to.be.true; - expect(next.calledWith(action)).to.be.true; - expect(cut.toast.called).to.be.false; - }); - - it('should call only next when non-respected action is dispatched', () => { - // given - const store = null; - const next = sinon.spy(); - const middleware = cut.toMiddleware()(store)(next); - const action = { type: 'test' }; - expect(middleware).to.be.a('function'); - expect(action).to.be.an('object'); - - // when - middleware(action); - - // then - expect(cut.clearTimeoutFor.called).to.be.false; - expect(next.calledWith(action)).to.be.true; - expect(cut.toast.called).to.be.false; - }); - - it('should call only next and toast, when action with meta toastr is dispatched', () => { - // given - const msg = 'test'; - const store = null; - const next = sinon.spy(); - const middleware = cut.toMiddleware()(store)(next); - const meta = { toastr: { msg, type: 'default' } }; - const action = { type: 'test', payload: 'test', meta }; - expect(middleware).to.be.a('function'); - expect(action).to.be.an('object'); - - // when - middleware(action); - - // then - expect(cut.clearTimeoutFor.called).to.be.false; - expect(next.calledWith(action)).to.be.true; - expect(cut.toast.calledWith(store, next, action)).to.be.true; - }); - }); - - describe('TOAST', () => { - // using 'before' doesn't work - // it might b overwriten by the global beforeEach - beforeEach('spy on removeToast', () => { - cut.setTimeoutFor = sinon.spy(); - }); - - it('should call next and setTimeoutFor', () => { - // given - const msg = 'text'; - const type = 'default'; - const store = { getState: () => state }; - const next = sinon.spy(); - const action = { meta: { toastr: { - msg, type - } } }; - - // when - cut.toast(store, next, action); - - // then - expect(next.calledWith(addToast({ - msg, type, toastNo - }))).to.be.true; - - expect(cut.setTimeoutFor.calledWith(toastNo, next)); - }); - }); - - describe('SET TIMEOUT FOR', () => { - beforeEach('spy on clearTimeoutFor', () => { - cut.clearTimeoutFor = sinon.spy(); - }); - it('should call clearTimeoutFor and next after cut._time', done => { - // given - const next = sinon.spy(); - - // when - cut.setTimeoutFor(toastNo, next); - - // then - expect(cut._timeouts[String(toastNo)]).to.be.an('object'); - setTimeout(() => { - expect(cut.clearTimeoutFor.calledWith(toastNo)).to.be.true; - expect(next.calledWith(removeToast(toastNo))).to.be.true; - done(); - }, time); - }); - }); - - describe('SHOULD TOAST', () => { - it('should return false when action isn\'t toastable', () => { - // given - const action = { meta: {} }; - - // when - const res = cut.shouldToast(action); - - // then - expect(res).to.be.false; - }); - it('should return true when action is toastable', () => { - // given - const action = { meta: { toastr: { msg: 'foo' } } }; - - // when - const res = cut.shouldToast(action); - - // then - expect(res).to.be.true; - }); - }); - describe('CLEAR TIMEOUT FOR', () => { - let mockedTimeoutSpy; - beforeEach('mock timeouts', () => { - mockedTimeoutSpy = sinon.spy(); - cut._timeouts[String(toastNo)] = setTimeout(() => { - mockedTimeoutSpy(); - }, time); - }); - it('should clear and delete timeout', done => { - // when - cut.clearTimeoutFor(toastNo); - - // then - expect(cut._timeouts[String(toastNo)]).to.be.undefined; - setTimeout(() => { - expect(mockedTimeoutSpy.called).to.be.false; - done(); - }, time); - }); - }); -}); diff --git a/js/src/views/Status/reducers/index.js b/js/src/views/Status/reducers/index.js index 8b78d6ab1bf..3d093dc40ae 100644 --- a/js/src/views/Status/reducers/index.js +++ b/js/src/views/Status/reducers/index.js @@ -3,7 +3,6 @@ import settings from './settings'; import mining from './mining'; import debug from './debug'; import rpc from './rpc'; -import toastr from './toastr'; import logger from './logger'; export { @@ -11,7 +10,6 @@ export { settings, mining, rpc, - toastr, logger, debug }; diff --git a/js/src/views/Status/reducers/toastr.js b/js/src/views/Status/reducers/toastr.js deleted file mode 100644 index aa34c543239..00000000000 --- a/js/src/views/Status/reducers/toastr.js +++ /dev/null @@ -1,23 +0,0 @@ -import { handleActions } from 'redux-actions'; - -const initialState = { - toasts: [], - toastNo: 1 -}; - -export default handleActions({ - 'add toast' (state, action) { - return { - ...state, - toastNo: state.toastNo + 1, - toasts: [action.payload].concat(state.toasts) - }; - }, - - 'remove toast' (state, action) { - return { - ...state, - toasts: state.toasts.filter(t => t.toastNo !== action.payload) - }; - } -}, initialState); diff --git a/js/src/views/Status/routes.js b/js/src/views/Status/routes.js deleted file mode 100644 index af4d5997150..00000000000 --- a/js/src/views/Status/routes.js +++ /dev/null @@ -1,45 +0,0 @@ - -import React, { Component, PropTypes } from 'react'; - -import { Router, Route, useRouterHistory, IndexRedirect } from 'react-router'; -import { createHashHistory } from 'history'; -import { syncHistoryWithStore } from 'react-router-redux'; - -import AppContainer from './containers/App'; -import StatusPage from './containers/StatusPage'; -import DebugPage from './containers/DebugPage'; -import AccountsPage from './containers/AccountsPage'; -import RpcPage from './containers/RpcPage'; -import RpcCalls from './components/RpcCalls'; -import RpcDocs from './components/RpcDocs'; - -const routerHistory = useRouterHistory(createHashHistory)({ - queryKey: false -}); - -export default class Routes extends Component { - - render () { - const history = syncHistoryWithStore(routerHistory, this.props.store); - return ( - - - - - - - - - - - - - - ); - } - - static propTypes = { - store: PropTypes.object.isRequired - } - -} diff --git a/js/src/views/Status/util/index.js b/js/src/views/Status/util/index.js index 486b3c5d7bd..0458fb7742c 100644 --- a/js/src/views/Status/util/index.js +++ b/js/src/views/Status/util/index.js @@ -1,4 +1,3 @@ - export function toPromise (fn) { return new Promise((resolve, reject) => { fn((err, res) => { diff --git a/js/src/views/Status/util/toastr.js b/js/src/views/Status/util/toastr.js deleted file mode 100644 index cf09a10c454..00000000000 --- a/js/src/views/Status/util/toastr.js +++ /dev/null @@ -1,11 +0,0 @@ -// pass this to action creator's meta (third argument) to make action toastable -export function withToastr (msgFunc, type = 'default') { - return function (msg) { - return { - toastr: { - msg: msgFunc(msg), - type - } - }; - }; -} diff --git a/js/src/views/Status/util/toastr.spec.js b/js/src/views/Status/util/toastr.spec.js deleted file mode 100644 index 6cbff32131e..00000000000 --- a/js/src/views/Status/util/toastr.spec.js +++ /dev/null @@ -1,38 +0,0 @@ -import { withToastr } from './toastr'; - -describe('UTIL TOASTR', () => { - it('should return toastr object with type set to default, when no type is passed', () => { - // given - const msg = 'test'; - const msgFunc = x => `some text and ${x}`; - - // when - const res = withToastr(msgFunc)(msg); - - // then - expect(res).to.eql({ - toastr: { - msg: `some text and ${msg}`, - type: 'default' - } - }); - }); - - it('should return toastr object with type set to success, when success type is passed', () => { - // given - const msg = 'test'; - const type = 'success'; - const msgFunc = x => `some text and ${x}`; - - // when - const res = withToastr(msgFunc, type)(msg); - - // then - expect(res).to.eql({ - toastr: { - msg: `some text and ${msg}`, - type - } - }); - }); -}); From be65b1616e4a7ae2470fd1f84960dc3ed85fef50 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 9 Sep 2016 08:42:36 +0200 Subject: [PATCH 0391/1062] cleanup redux init functions --- js/src/index.js | 44 ++++--------------- js/src/redux/index.js | 5 +++ js/src/{ => redux}/middleware.js | 10 ++--- js/src/redux/reducers.js | 26 +++++++++++ js/src/redux/store.js | 15 +++++++ js/src/redux/util.js | 5 +++ js/src/ui/Errors/middleware.js | 31 +++++++------ js/src/views/Signer/actions/requests.js | 2 +- js/src/views/Status/actions/clipboard.js | 2 +- js/src/views/Status/actions/logger.js | 2 +- js/src/views/Status/actions/rpc.js | 12 ++--- .../Status/containers/Container/Container.js | 1 - 12 files changed, 89 insertions(+), 66 deletions(-) create mode 100644 js/src/redux/index.js rename js/src/{ => redux}/middleware.js (60%) create mode 100644 js/src/redux/reducers.js create mode 100644 js/src/redux/store.js create mode 100644 js/src/redux/util.js diff --git a/js/src/index.js b/js/src/index.js index 4b50299f637..0301b75e280 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -5,29 +5,21 @@ import injectTapEventPlugin from 'react-tap-event-plugin'; import es6Promise from 'es6-promise'; import { createHashHistory } from 'history'; import { Provider } from 'react-redux'; -import { applyMiddleware, combineReducers, createStore } from 'redux'; import { Redirect, Router, Route, useRouterHistory } from 'react-router'; -import { routerReducer } from 'react-router-redux'; import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; import Web3 from 'web3'; +import { initStore } from './redux'; import { muiTheme } from './ui'; import { Accounts, Account, Addresses, Address, Application, Contract, Contracts, Dapp, Dapps, Signer } from './views'; -import { errorReducer } from './ui/Errors'; -import { tooltipReducer } from './ui/Tooltips'; -import { nodeStatusReducer } from './views/Application/Status'; -import initMiddleware from './middleware'; - // TODO: This is VERY messy, just dumped here to get the Signer going -import { signer as signerReducer, requests as signerRequestsReducer } from './views/Signer/reducers'; import { Web3Provider as SignerWeb3Provider, web3Extension as statusWeb3Extension } from './views/Signer/components'; import { WebSocketsProvider, Ws } from './views/Signer/utils'; import { SignerDataProvider, WsDataProvider } from './views/Signer/providers'; // TODO: same with Status... -import { status as statusReducer, debug as statusDebugReducer, logger as statusLoggerReducer, mining as statusMiningReducer, rpc as statusRpcReducer, settings as statusSettingsReducer } from './views/Status/reducers'; import { Web3Provider as StatusWeb3Provider } from './views/Status/provider/web3-provider'; import StatusEthcoreWeb3 from './views/Status/provider/web3-ethcore-provider'; import Status from './views/Status/containers/Container'; @@ -44,11 +36,13 @@ import './index.html'; es6Promise.polyfill(); injectTapEventPlugin(); +// signer +function tokenSetter (token, cb) { + window.localStorage.setItem('sysuiToken', token); +} + const initToken = window.localStorage.getItem('sysuiToken'); const parityUrl = process.env.NODE_ENV === 'production' ? window.location.host : '127.0.0.1:8180'; -const routerHistory = useRouterHistory(createHashHistory)({}); - -// signer const ws = new Ws(parityUrl); const web3ws = new Web3(new WebSocketsProvider(ws)); statusWeb3Extension(web3ws).map((extension) => web3ws._extend(extension)); @@ -57,29 +51,7 @@ statusWeb3Extension(web3ws).map((extension) => web3ws._extend(extension)); const web3 = new Web3(new Web3.providers.HttpProvider(process.env.RPC_ADDRESS || '/rpc/')); const ethcoreWeb3 = new StatusEthcoreWeb3(web3); -function tokenSetter (token, cb) { - window.localStorage.setItem('sysuiToken', token); -} - -const reducers = combineReducers({ - errors: errorReducer, - nodeStatus: nodeStatusReducer, - tooltip: tooltipReducer, - routing: routerReducer, - signer: signerReducer, - signerRequests: signerRequestsReducer, - status: statusReducer, - statusSettings: statusSettingsReducer, - statusMining: statusMiningReducer, - statusRpc: statusRpcReducer, - statusLogger: statusLoggerReducer, - statusDebug: statusDebugReducer -}); -const middleware = initMiddleware(ws, tokenSetter, web3); -const storeCreation = window.devToolsExtension - ? window.devToolsExtension()(createStore) - : createStore; -const store = applyMiddleware(...middleware)(storeCreation)(reducers); +const store = initStore(ws, tokenSetter, web3); // signer new WsDataProvider(store, ws); // eslint-disable-line no-new @@ -89,6 +61,8 @@ ws.init(initToken); // status new StatusWeb3Provider(web3, ethcoreWeb3, store).start(); +const routerHistory = useRouterHistory(createHashHistory)({}); + ReactDOM.render( diff --git a/js/src/redux/index.js b/js/src/redux/index.js new file mode 100644 index 00000000000..6ef6aa1b7f6 --- /dev/null +++ b/js/src/redux/index.js @@ -0,0 +1,5 @@ +import initStore from './store'; + +export { + initStore +}; diff --git a/js/src/middleware.js b/js/src/redux/middleware.js similarity index 60% rename from js/src/middleware.js rename to js/src/redux/middleware.js index ed3cd53e443..1cbdc0377a0 100644 --- a/js/src/middleware.js +++ b/js/src/redux/middleware.js @@ -1,7 +1,7 @@ -import ErrorsMiddleware, { withError } from './ui/Errors/middleware'; +import ErrorsMiddleware from '../ui/Errors/middleware'; -import signerMiddlewares from './views/Signer/middlewares'; -import statusMiddlewares from './views/Status/middleware'; +import signerMiddlewares from '../views/Signer/middlewares'; +import statusMiddlewares from '../views/Status/middleware'; export default function (signerWs, signerTokenSetter, statusWeb3) { const errors = new ErrorsMiddleware(); @@ -15,7 +15,3 @@ export default function (signerWs, signerTokenSetter, statusWeb3) { return middleware.concat(signer).concat(status); } - -export { - withError -}; diff --git a/js/src/redux/reducers.js b/js/src/redux/reducers.js new file mode 100644 index 00000000000..99e85232b69 --- /dev/null +++ b/js/src/redux/reducers.js @@ -0,0 +1,26 @@ +import { combineReducers } from 'redux'; +import { routerReducer } from 'react-router-redux'; + +import { errorReducer } from '../ui/Errors'; +import { tooltipReducer } from '../ui/Tooltips'; +import { nodeStatusReducer } from '../views/Application/Status'; + +import { signer as signerReducer, requests as signerRequestsReducer } from '../views/Signer/reducers'; +import { status as statusReducer, debug as statusDebugReducer, logger as statusLoggerReducer, mining as statusMiningReducer, rpc as statusRpcReducer, settings as statusSettingsReducer } from '../views/Status/reducers'; + +export default function () { + return combineReducers({ + errors: errorReducer, + nodeStatus: nodeStatusReducer, + tooltip: tooltipReducer, + routing: routerReducer, + signer: signerReducer, + signerRequests: signerRequestsReducer, + status: statusReducer, + statusSettings: statusSettingsReducer, + statusMining: statusMiningReducer, + statusRpc: statusRpcReducer, + statusLogger: statusLoggerReducer, + statusDebug: statusDebugReducer + }); +} diff --git a/js/src/redux/store.js b/js/src/redux/store.js new file mode 100644 index 00000000000..f029203520d --- /dev/null +++ b/js/src/redux/store.js @@ -0,0 +1,15 @@ +import { applyMiddleware, createStore } from 'redux'; + +import initMiddleware from './middleware'; +import initReducers from './reducers'; + +const storeCreation = window.devToolsExtension + ? window.devToolsExtension()(createStore) + : createStore; + +export default function (signerWs, signerTokenSetter, statusWeb3) { + const reducers = initReducers(); + const middleware = initMiddleware(signerWs, signerTokenSetter, statusWeb3); + + return applyMiddleware(...middleware)(storeCreation)(reducers); +} diff --git a/js/src/redux/util.js b/js/src/redux/util.js new file mode 100644 index 00000000000..5fa86a7a776 --- /dev/null +++ b/js/src/redux/util.js @@ -0,0 +1,5 @@ +import { withError } from '../ui/Errors/middleware'; + +export { + withError +}; diff --git a/js/src/ui/Errors/middleware.js b/js/src/ui/Errors/middleware.js index 20d5156d24d..76aa157ef7b 100644 --- a/js/src/ui/Errors/middleware.js +++ b/js/src/ui/Errors/middleware.js @@ -1,27 +1,30 @@ import { newError } from './actions'; +function withError (formatter, type = 'default') { + return (message) => { + return { + error: { + message: formatter(message), + type + } + }; + }; +} + export default class ErrorsMiddleware { toMiddleware () { return (store) => (next) => (action) => { const { meta } = action; - if (!meta || !meta.error) { - next(action); - return; + if (meta && meta.error) { + next(newError(meta.error)); } - next(newError(meta.error)); + next(action); }; } } -export function withError (formatter, type = 'default') { - return (message) => { - return { - error: { - message: formatter(message), - type - } - }; - }; -} +export { + withError +}; diff --git a/js/src/views/Signer/actions/requests.js b/js/src/views/Signer/actions/requests.js index 63627356fa9..57ef5ec80ef 100644 --- a/js/src/views/Signer/actions/requests.js +++ b/js/src/views/Signer/actions/requests.js @@ -1,4 +1,4 @@ -import { withError } from '../../../middleware'; +import { withError } from '../../../redux/util'; import { identity } from '../components/util/util'; import { createAction } from 'redux-actions'; diff --git a/js/src/views/Status/actions/clipboard.js b/js/src/views/Status/actions/clipboard.js index 2dd79359b3f..21914ae3f39 100644 --- a/js/src/views/Status/actions/clipboard.js +++ b/js/src/views/Status/actions/clipboard.js @@ -1,6 +1,6 @@ import { createAction } from 'redux-actions'; import { identity } from '../util'; -import { withError } from '../../../middleware'; +import { withError } from '../../../redux/util'; export const copyToClipboard = createAction('copy toClipboard', identity, withError(identity)); diff --git a/js/src/views/Status/actions/logger.js b/js/src/views/Status/actions/logger.js index 539bbe19f46..391231120d2 100644 --- a/js/src/views/Status/actions/logger.js +++ b/js/src/views/Status/actions/logger.js @@ -1,7 +1,7 @@ import { createAction } from 'redux-actions'; import { identity } from '../util'; -import { withError } from '../../../middleware'; +import { withError } from '../../../redux/util'; export const updateLogging = createAction( 'update logging', identity, withError(flag => `logging updated to ${flag}`) diff --git a/js/src/views/Status/actions/rpc.js b/js/src/views/Status/actions/rpc.js index 160676594b4..cea5ec06c98 100644 --- a/js/src/views/Status/actions/rpc.js +++ b/js/src/views/Status/actions/rpc.js @@ -1,11 +1,11 @@ import { createAction } from 'redux-actions'; -// import { identity } from '../util'; -// import { withError } from '../../../middleware'; -// -// export const error = createAction('error rpc', identity, -// withError(() => 'error processing rpc call. check console for details', 'error') -// ); +import { identity } from '../util'; +import { withError } from '../../../redux/util'; + +export const error = createAction('error rpc', identity, + withError(() => 'error processing rpc call. check console for details', 'error') +); export const fireRpc = createAction('fire rpc'); export const addRpcReponse = createAction('add rpcResponse'); export const selectRpcMethod = createAction('select rpcMethod'); diff --git a/js/src/views/Status/containers/Container/Container.js b/js/src/views/Status/containers/Container/Container.js index 4aad3e3b51c..ea5842fa52f 100644 --- a/js/src/views/Status/containers/Container/Container.js +++ b/js/src/views/Status/containers/Container/Container.js @@ -15,7 +15,6 @@ class Container extends Component { static propTypes = { status: PropTypes.object.isRequired, statusLogger: PropTypes.object.isRequired, - statusToastr: PropTypes.object.isRequired, routing: PropTypes.object.isRequired, actions: PropTypes.object.isRequired, params: PropTypes.object From 8f69216082de6e4b911665f0607befeb0013299a Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 9 Sep 2016 08:52:50 +0200 Subject: [PATCH 0392/1062] consistency in middleware naming --- js/src/redux/middleware.js | 8 ++++---- js/src/views/Signer/{middlewares => middleware}/index.js | 0 js/src/views/Signer/{middlewares => middleware}/logger.js | 0 js/src/views/Signer/{middlewares => middleware}/signer.js | 0 js/src/views/Signer/{middlewares => middleware}/ws.js | 0 5 files changed, 4 insertions(+), 4 deletions(-) rename js/src/views/Signer/{middlewares => middleware}/index.js (100%) rename js/src/views/Signer/{middlewares => middleware}/logger.js (100%) rename js/src/views/Signer/{middlewares => middleware}/signer.js (100%) rename js/src/views/Signer/{middlewares => middleware}/ws.js (100%) diff --git a/js/src/redux/middleware.js b/js/src/redux/middleware.js index 1cbdc0377a0..2ee831859f6 100644 --- a/js/src/redux/middleware.js +++ b/js/src/redux/middleware.js @@ -1,13 +1,13 @@ import ErrorsMiddleware from '../ui/Errors/middleware'; -import signerMiddlewares from '../views/Signer/middlewares'; -import statusMiddlewares from '../views/Status/middleware'; +import signerMiddleware from '../views/Signer/middleware'; +import statusMiddleware from '../views/Status/middleware'; export default function (signerWs, signerTokenSetter, statusWeb3) { const errors = new ErrorsMiddleware(); - const signer = signerMiddlewares(signerWs, signerTokenSetter); - const status = statusMiddlewares(statusWeb3); + const signer = signerMiddleware(signerWs, signerTokenSetter); + const status = statusMiddleware(statusWeb3); const middleware = [ errors.toMiddleware() diff --git a/js/src/views/Signer/middlewares/index.js b/js/src/views/Signer/middleware/index.js similarity index 100% rename from js/src/views/Signer/middlewares/index.js rename to js/src/views/Signer/middleware/index.js diff --git a/js/src/views/Signer/middlewares/logger.js b/js/src/views/Signer/middleware/logger.js similarity index 100% rename from js/src/views/Signer/middlewares/logger.js rename to js/src/views/Signer/middleware/logger.js diff --git a/js/src/views/Signer/middlewares/signer.js b/js/src/views/Signer/middleware/signer.js similarity index 100% rename from js/src/views/Signer/middlewares/signer.js rename to js/src/views/Signer/middleware/signer.js diff --git a/js/src/views/Signer/middlewares/ws.js b/js/src/views/Signer/middleware/ws.js similarity index 100% rename from js/src/views/Signer/middlewares/ws.js rename to js/src/views/Signer/middleware/ws.js From 3c72aadbf2e28b768bab78217022537182d7ac21 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 9 Sep 2016 09:10:20 +0200 Subject: [PATCH 0393/1062] only try and add address when we actually have something --- js/src/views/Addresses/addresses.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/js/src/views/Addresses/addresses.js b/js/src/views/Addresses/addresses.js index 51c88239ae2..19af6fc092d 100644 --- a/js/src/views/Addresses/addresses.js +++ b/js/src/views/Addresses/addresses.js @@ -78,11 +78,13 @@ export default class Addresses extends Component { showAdd: false }); - Promise.all([ - api.personal.setAccountName(address, name), - api.personal.setAccountMeta(address, { description }) - ]).catch((error) => { - console.error('updateDetails', error); - }); + if (address) { + Promise.all([ + api.personal.setAccountName(address, name), + api.personal.setAccountMeta(address, { description }) + ]).catch((error) => { + console.error('updateDetails', error); + }); + } } } From d4ea0b208577e3482538c37ceb5baef9cb5d1cc2 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 9 Sep 2016 10:15:34 +0200 Subject: [PATCH 0394/1062] status now has the same styles as the rest, removed dapp-styles completely --- js/package.json | 1 - js/src/dapp-styles/hex-grid-tile.png | Bin 13471 -> 0 bytes js/src/ignore-dapp-styles.css | 9 --- js/src/index.js | 4 -- .../{Value => --remove-Value}/Value.css | 0 .../{Value => --remove-Value}/Value.js | 0 .../{Value => --remove-Value}/index.js | 0 .../MiningSettings/MiningSettings.js | 48 +++++++------- .../views/Status/components/Status/Status.js | 61 +++++++++--------- 9 files changed, 54 insertions(+), 69 deletions(-) delete mode 100644 js/src/dapp-styles/hex-grid-tile.png delete mode 100644 js/src/ignore-dapp-styles.css rename js/src/views/Status/components/{Value => --remove-Value}/Value.css (100%) rename js/src/views/Status/components/{Value => --remove-Value}/Value.js (100%) rename js/src/views/Status/components/{Value => --remove-Value}/index.js (100%) diff --git a/js/package.json b/js/package.json index fc5e0d009ec..bc9ee63f771 100644 --- a/js/package.json +++ b/js/package.json @@ -56,7 +56,6 @@ "cheerio": "0.20.0", "coveralls": "^2.11.11", "css-loader": "^0.23.1", - "dapp-styles": "^0.2.2", "enzyme": "2.3.0", "eslint": "^3.1.0", "eslint-config-semistandard": "^6.0.2", diff --git a/js/src/dapp-styles/hex-grid-tile.png b/js/src/dapp-styles/hex-grid-tile.png deleted file mode 100644 index 9acd894a140395f5f61bdcc071fb6152585b1e80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13471 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 -

    Mining settings

    -

    Author

    - + -

    Extradata

    - + -

    Minimal Gas Price

    - + -

    Gas floor target

    - + + onChange={ onGasFloorTargetChange } + { ...this._test('gas-floor-target') } />
    ); } diff --git a/js/src/views/Status/components/Status/Status.js b/js/src/views/Status/components/Status/Status.js index ddada1546e3..81837751fe7 100644 --- a/js/src/views/Status/components/Status/Status.js +++ b/js/src/views/Status/components/Status/Status.js @@ -2,10 +2,9 @@ import React, { Component, PropTypes } from 'react'; import formatNumber from 'format-number'; import bytes from 'bytes'; -import { Container } from '../../../../ui'; +import { Container, ContainerTitle, Input } from '../../../../ui'; import styles from './Status.css'; -import Value from '../Value'; import MiningSettings from '../MiningSettings'; export default class Status extends Component { @@ -41,12 +40,12 @@ export default class Status extends Component {
    -

    Best Block

    -

    #{ bestBlock }

    + +

    #{ bestBlock }

    -

    Hash Rate

    -

    { `${hashrate} H/s` }

    + +

    { `${hashrate} H/s` }

    @@ -81,48 +80,48 @@ export default class Status extends Component { return (
    -

    Network settings

    -

    Chain

    - + + { ...this._test('chain') } />
    -

    Peers

    - + { ...this._test('peers') } />
    -

    Network port

    - + { ...this._test('network-port') } />
    -

    RPC Enabled

    - + { ...this._test('rpc-enabled') } />
    -

    RPC Interface

    - + { ...this._test('rpc-interface') } />
    -

    RPC Port

    - + { ...this._test('rpc-port') } />
    From e45552ffddfd297cd7b7a9ca76b09cbfe761df55 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 9 Sep 2016 10:22:12 +0200 Subject: [PATCH 0395/1062] status looks presentable --- js/src/views/Status/components/Status/Status.css | 6 ++++++ js/src/views/Status/components/Status/Status.js | 11 ++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/js/src/views/Status/components/Status/Status.css b/js/src/views/Status/components/Status/Status.css index 3e02fd4e795..873c978703e 100644 --- a/js/src/views/Status/components/Status/Status.css +++ b/js/src/views/Status/components/Status/Status.css @@ -12,6 +12,12 @@ content: ''; } +.blockinfo { + font-size: 24px; + color: #aaa; + line-height: 24px; +} + .col, .col1, .col2, .col3, .col4, .col5, .col6, .col7, .col8, .col9, .col10, .col11, .col12 { float: left; diff --git a/js/src/views/Status/components/Status/Status.js b/js/src/views/Status/components/Status/Status.js index 81837751fe7..72d8a5c2f9c 100644 --- a/js/src/views/Status/components/Status/Status.js +++ b/js/src/views/Status/components/Status/Status.js @@ -30,9 +30,10 @@ export default class Status extends Component { } render () { - const { status } = this.props; + const { status, statusSettings } = this.props; const bestBlock = formatNumber()(status.bestBlock); const hashrate = bytes(status.hashrate) || 0; + const peers = `${status.activePeers}/${status.connectedPeers}/${statusSettings.maxPeers}`; return ( @@ -41,11 +42,15 @@ export default class Status extends Component {
    -

    #{ bestBlock }

    +

    #{ bestBlock }

    +
    +
    + +

    { peers }

    -

    { `${hashrate} H/s` }

    +

    { `${hashrate} H/s` }

    From 5549ade493fa97f25211fd36106a96f99b79d152 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 9 Sep 2016 11:41:12 +0200 Subject: [PATCH 0396/1062] allow for onSubmit handler for inputs --- js/src/ui/Form/Input/input.js | 71 +++++++++++++++---- js/src/ui/Form/InputInline/inputInline.js | 7 +- js/src/views/Account/Header/header.js | 5 +- js/src/views/Signer/reducers/signer.js | 1 - .../MiningSettings/MiningSettings.js | 8 +-- 5 files changed, 71 insertions(+), 21 deletions(-) diff --git a/js/src/ui/Form/Input/input.js b/js/src/ui/Form/Input/input.js index 1994030df9f..2be4197b23e 100644 --- a/js/src/ui/Form/Input/input.js +++ b/js/src/ui/Form/Input/input.js @@ -25,6 +25,7 @@ export default class Input extends Component { onBlur: PropTypes.func, onChange: PropTypes.func, onKeyDown: PropTypes.func, + onSubmit: PropTypes.func, rows: PropTypes.number, type: PropTypes.string, value: PropTypes.oneOfType([ @@ -32,30 +33,74 @@ export default class Input extends Component { ]) } + state = { + value: this.props.value + } + render () { + const { value } = this.state; + const { children, className, disabled, error, label, hint, multiLine, rows, type } = this.props; + return ( - { this.props.children } + value={ value } + onBlur={ this.onBlur } + onChange={ this.onChange } + onKeyDown={ this.onKeyDown }> + { children } ); } + + onChange = (event, value) => { + this.setValue(value); + + this.props.onChange && this.props.onChange(event, value); + } + + onBlur = (event) => { + const { value } = event.target; + + this.onSubmit(value); + + this.props.onBlur && this.props.onBlur(event); + } + + onKeyDown = (event) => { + const { value } = event.target; + + if (event.which === 13) { + this.onSubmit(value); + } + + this.props.onKeyDown && this.props.onKeyDown(event); + } + + onSubmit = (value) => { + console.log('onSubmit', value, this.props.onSubmit); + this.setValue(value); + + this.props.onSubmit && this.props.onSubmit(value); + } + + setValue (value) { + this.setState({ + value + }); + } } diff --git a/js/src/ui/Form/InputInline/inputInline.js b/js/src/ui/Form/InputInline/inputInline.js index 1e5a73ffdd5..936f68f3d50 100644 --- a/js/src/ui/Form/InputInline/inputInline.js +++ b/js/src/ui/Form/InputInline/inputInline.js @@ -11,6 +11,8 @@ export default class InputInline extends Component { label: PropTypes.string, onBlur: PropTypes.func, onChange: PropTypes.func, + onSubmit: PropTypes.func, + onKeyDown: PropTypes.func, type: PropTypes.string, value: PropTypes.oneOfType([ PropTypes.number, PropTypes.string @@ -47,7 +49,8 @@ export default class InputInline extends Component { value={ value } onBlur={ this.onBlur } onChange={ this.props.onChange } - onKeyDown={ this.onKeyDown } /> + onKeyDown={ this.onKeyDown } + onSubmit={ this.props.onSubmit } /> ); } @@ -69,5 +72,7 @@ export default class InputInline extends Component { if (event.keyCode === 13) { this.onToggle(); } + + this.props.onKeyDown && this.props.onKeyDown(event); } } diff --git a/js/src/views/Account/Header/header.js b/js/src/views/Account/Header/header.js index e39ee701922..bf06dcf9094 100644 --- a/js/src/views/Account/Header/header.js +++ b/js/src/views/Account/Header/header.js @@ -51,7 +51,7 @@ export default class Header extends Component { hint='a descriptive name for the account' value={ name } static={ this.renderTitle(name) } - onChange={ this.onEditName } /> + onSubmit={ this.onSubmitName } />
    { address }
    @@ -91,7 +91,8 @@ export default class Header extends Component { ); } - onEditName = (event, name) => { + onSubmitName = (name) => { + console.log('onSubmitName', name); const { api } = this.context; const { account } = this.props; diff --git a/js/src/views/Signer/reducers/signer.js b/js/src/views/Signer/reducers/signer.js index 6af9487c3d1..7089b7a757a 100644 --- a/js/src/views/Signer/reducers/signer.js +++ b/js/src/views/Signer/reducers/signer.js @@ -29,7 +29,6 @@ export default handleActions({ 'update isNodeRunning' (state, action) { const isRunning = action.payload; const goesOnline = isRunning && !state.isNodeRunning; - console.log('isNodeRunning', isRunning); return { ...state, diff --git a/js/src/views/Status/components/MiningSettings/MiningSettings.js b/js/src/views/Status/components/MiningSettings/MiningSettings.js index 8d232223c10..d737c612a62 100644 --- a/js/src/views/Status/components/MiningSettings/MiningSettings.js +++ b/js/src/views/Status/components/MiningSettings/MiningSettings.js @@ -40,26 +40,26 @@ export default class MiningSettings extends Component { hint='the mining author' value={ statusMining.author } dataSource={ this.props.accounts } - onChange={ onAuthorChange } + onSubmit={ onAuthorChange } { ...this._test('author') } />
    ); From 4c89059b2c06df5504aed5789e085041f69896ac Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 9 Sep 2016 11:47:03 +0200 Subject: [PATCH 0397/1062] remove debug info --- js/src/ui/Form/Input/input.js | 3 ++- js/src/views/Account/Header/header.js | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/ui/Form/Input/input.js b/js/src/ui/Form/Input/input.js index 2be4197b23e..1aff0bc19e9 100644 --- a/js/src/ui/Form/Input/input.js +++ b/js/src/ui/Form/Input/input.js @@ -86,13 +86,14 @@ export default class Input extends Component { if (event.which === 13) { this.onSubmit(value); + } else if (event.which === 27) { + // TODO ESC, revert to original } this.props.onKeyDown && this.props.onKeyDown(event); } onSubmit = (value) => { - console.log('onSubmit', value, this.props.onSubmit); this.setValue(value); this.props.onSubmit && this.props.onSubmit(value); diff --git a/js/src/views/Account/Header/header.js b/js/src/views/Account/Header/header.js index bf06dcf9094..21a4aae3a33 100644 --- a/js/src/views/Account/Header/header.js +++ b/js/src/views/Account/Header/header.js @@ -92,7 +92,6 @@ export default class Header extends Component { } onSubmitName = (name) => { - console.log('onSubmitName', name); const { api } = this.context; const { account } = this.props; From 28cfd54bbe8a13002370636ebe98533716fbe3ac Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 9 Sep 2016 14:28:19 +0200 Subject: [PATCH 0398/1062] badges for those little overlays - consolidated, not duplicated --- js/src/ui/Badge/badge.css | 19 +++++++++++++++ js/src/ui/Badge/badge.js | 22 ++++++++++++++++++ js/src/ui/Badge/index.js | 1 + js/src/ui/index.js | 2 ++ js/src/views/Application/TabBar/tabBar.css | 9 ++------ js/src/views/Application/TabBar/tabBar.js | 27 +++++++++++++++++----- js/src/views/Application/application.js | 7 ++++-- js/src/views/ParityBar/parityBar.css | 6 ----- js/src/views/ParityBar/parityBar.js | 9 ++++---- 9 files changed, 77 insertions(+), 25 deletions(-) create mode 100644 js/src/ui/Badge/badge.css create mode 100644 js/src/ui/Badge/badge.js create mode 100644 js/src/ui/Badge/index.js diff --git a/js/src/ui/Badge/badge.css b/js/src/ui/Badge/badge.css new file mode 100644 index 00000000000..04a694cfe3a --- /dev/null +++ b/js/src/ui/Badge/badge.css @@ -0,0 +1,19 @@ +.bubble { + border-radius: 50%; + padding: 3px 5px; + color: white; + font-size: 0.7em; + line-height: 1em; +} + +.default { + background: #555; +} + +.red { + background: red; +} + +.green { + background: green; +} diff --git a/js/src/ui/Badge/badge.js b/js/src/ui/Badge/badge.js new file mode 100644 index 00000000000..66753544923 --- /dev/null +++ b/js/src/ui/Badge/badge.js @@ -0,0 +1,22 @@ +import React, { Component, PropTypes } from 'react'; + +import styles from './badge.css'; + +export default class Badge extends Component { + static propTypes = { + className: PropTypes.string, + color: PropTypes.string, + value: PropTypes.any + }; + + render () { + const { className, color, value } = this.props; + const classes = `${styles.bubble} ${styles[color || 'default']} ${className}`; + + return ( +
    + { value } +
    + ); + } +} diff --git a/js/src/ui/Badge/index.js b/js/src/ui/Badge/index.js new file mode 100644 index 00000000000..c7876f0c760 --- /dev/null +++ b/js/src/ui/Badge/index.js @@ -0,0 +1 @@ +export default from './badge'; diff --git a/js/src/ui/index.js b/js/src/ui/index.js index 978d64174b2..c653b72a33a 100644 --- a/js/src/ui/index.js +++ b/js/src/ui/index.js @@ -1,4 +1,5 @@ import Actionbar from './Actionbar'; +import Badge from './badge'; import Balances from './Balances'; import Container, { Title as ContainerTitle } from './Container'; import Errors from './Errors'; @@ -12,6 +13,7 @@ import Tooltips, { Tooltip } from './Tooltips'; export { Actionbar, + Badge, Balances, Container, ContainerTitle, diff --git a/js/src/views/Application/TabBar/tabBar.css b/js/src/views/Application/TabBar/tabBar.css index 547155d9edb..8eeaae89106 100644 --- a/js/src/views/Application/TabBar/tabBar.css +++ b/js/src/views/Application/TabBar/tabBar.css @@ -24,14 +24,9 @@ } .labelBubble { - border-radius: 50%; - padding: 3px 5px; - background: red; - color: white; - font-size: 0.7em; position: absolute; - top: -10px; - right: -10px; + top: -12px; + right: -12px; } .logo { diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index bf784fa0176..8a84cab0905 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -6,7 +6,7 @@ import ActionTrackChanges from 'material-ui/svg-icons/action/track-changes'; import CommunicationContacts from 'material-ui/svg-icons/communication/contacts'; import NavigationApps from 'material-ui/svg-icons/navigation/apps'; -import { SignerIcon, Tooltip } from '../../../ui'; +import { Badge, SignerIcon, Tooltip } from '../../../ui'; import styles from './tabBar.css'; import imagesEthcoreBlock from '../../../images/ethcore-block.png'; @@ -24,7 +24,9 @@ export default class TabBar extends Component { } static propTypes = { - pending: PropTypes.array + pending: PropTypes.array, + isTest: PropTypes.bool, + netChain: PropTypes.string } render () { @@ -74,7 +76,7 @@ export default class TabBar extends Component { data-route='/status' value='status' icon={ } - label={ this.renderLabel('status') } + label={ this.renderStatusLabel() } onActive={ this.onActivate } /> - { pending.length } -
    + ); } return this.renderLabel('signer', bubble); } + renderStatusLabel () { + const { isTest, netChain } = this.props; + const bubble = ( + + ); + + return this.renderLabel('status', bubble); + } + onActivate = (tab) => { const { router } = this.context; diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index d3c36cc19bf..fa018015984 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -72,7 +72,7 @@ class Application extends Component { } render () { - const { children, pending } = this.props; + const { children, pending, netChain, isTest } = this.props; const { showFirstRun } = this.state; const [root] = (window.location.hash || '').replace('#/', '').split('/'); @@ -92,7 +92,10 @@ class Application extends Component { - + { children } diff --git a/js/src/views/ParityBar/parityBar.css b/js/src/views/ParityBar/parityBar.css index 5663e168658..f60655e3da3 100644 --- a/js/src/views/ParityBar/parityBar.css +++ b/js/src/views/ParityBar/parityBar.css @@ -67,12 +67,6 @@ } .labelBubble { - border-radius: 50%; - padding: 5px; - background: red; - color: white; - font-size: 0.7em; - line-height: 0.7em; position: absolute; top: 0px; right: -10px; diff --git a/js/src/views/ParityBar/parityBar.js b/js/src/views/ParityBar/parityBar.js index 607be0f33a1..f5bc6a32215 100644 --- a/js/src/views/ParityBar/parityBar.js +++ b/js/src/views/ParityBar/parityBar.js @@ -5,7 +5,7 @@ import { bindActionCreators } from 'redux'; import { FlatButton } from 'material-ui'; import ContentClear from 'material-ui/svg-icons/content/clear'; -import { SignerIcon } from '../../ui'; +import { Badge, SignerIcon } from '../../ui'; import { Embedded as Signer } from '../Signer'; import imagesEthcoreBlock from '../../images/ethcore-block-blue.png'; @@ -88,9 +88,10 @@ class ParityBar extends Component { if (pending && pending.length) { bubble = ( -
    - { pending.length } -
    + ); } From 1321f9a6703f8c64edc5b271c418e195d4c5e3a6 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 12 Sep 2016 10:28:21 +0200 Subject: [PATCH 0399/1062] debug/node logs show up under Status --- .../views/Status/components/Debug/Debug.css | 17 ++--- js/src/views/Status/components/Debug/Debug.js | 62 ++++++++++--------- .../containers/StatusPage/StatusPage.js | 7 ++- 3 files changed, 44 insertions(+), 42 deletions(-) diff --git a/js/src/views/Status/components/Debug/Debug.css b/js/src/views/Status/components/Debug/Debug.css index e76b9ce5e36..8129f408be2 100644 --- a/js/src/views/Status/components/Debug/Debug.css +++ b/js/src/views/Status/components/Debug/Debug.css @@ -2,8 +2,8 @@ margin-top: 0; } -.inputTrigger { - display: none; +.inputTrigger { + display: none; left: 310px; bottom: 4px; position: absolute; @@ -11,8 +11,8 @@ animation: fadein .3s; } -*:hover > .inputTrigger { - display: block; +*:hover > .inputTrigger { + display: block; } @keyframes fadein { @@ -25,13 +25,13 @@ overflow: auto; height: 50vh; min-height: 400px; - background: #F5F4F2; } .log { margin: 0; white-space: nowrap; overflow: visible; + color: #aaa; } .container { @@ -40,13 +40,6 @@ .actions { float: right; - opacity: 0; - transition: opacity ease-in-out .5s; - transition-delay: 0.2s; -} - -div:hover > .actions { - opacity: 1; } .actions a { diff --git a/js/src/views/Status/components/Debug/Debug.js b/js/src/views/Status/components/Debug/Debug.js index 36504a58a73..986576988d3 100644 --- a/js/src/views/Status/components/Debug/Debug.js +++ b/js/src/views/Status/components/Debug/Debug.js @@ -1,24 +1,38 @@ - import React, { Component, PropTypes } from 'react'; +import AvPause from 'material-ui/svg-icons/av/pause'; +import AvPlay from 'material-ui/svg-icons/av/play-arrow'; +import AvReplay from 'material-ui/svg-icons/av/replay'; + +import { Container, ContainerTitle } from '../../../../ui'; import styles from './Debug.css'; export default class Debug extends Component { + static propTypes = { + actions: PropTypes.shape({ + removeDevLogs: PropTypes.func.isRequired, + updateDevLogging: PropTypes.func.isRequired + }).isRequired, + statusDebug: PropTypes.shape({ + levels: PropTypes.string.isRequired, + logging: PropTypes.bool.isRequired, + logs: PropTypes.arrayOf(PropTypes.string).isRequired + }).isRequired + } render () { return ( -
    -
    -
    -

    Debugging logs

    - { this.renderActions() } -

    { this.props.statusDebug.levels || '-' }

    -
    - { this.renderLogs() } -
    -
    -
    -
    + + + { this.renderActions() } +

    + { this.props.statusDebug.levels || '-' } +

    +
    + { this.renderLogs() } +
    +
    ); } @@ -31,11 +45,14 @@ export default class Debug extends Component { } renderActions () { - const toggleClass = this.props.statusDebug.logging ? 'icon-control-pause' : 'icon-control-play'; + const toggleButton = this.props.statusDebug.logging + ? + : ; + return ( ); } @@ -47,17 +64,4 @@ export default class Debug extends Component { toggle = () => { this.props.actions.updateDevLogging(!this.props.statusDebug.logging); } - - static propTypes = { - actions: PropTypes.shape({ - removeDevLogs: PropTypes.func.isRequired, - updateDevLogging: PropTypes.func.isRequired - }).isRequired, - statusDebug: PropTypes.shape({ - levels: PropTypes.string.isRequired, - logging: PropTypes.bool.isRequired, - logs: PropTypes.arrayOf(PropTypes.string).isRequired - }).isRequired - } - } diff --git a/js/src/views/Status/containers/StatusPage/StatusPage.js b/js/src/views/Status/containers/StatusPage/StatusPage.js index 236cd6b9a65..f0f47c7ea78 100644 --- a/js/src/views/Status/containers/StatusPage/StatusPage.js +++ b/js/src/views/Status/containers/StatusPage/StatusPage.js @@ -3,7 +3,10 @@ import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; import { extend } from 'lodash'; +import Debug from '../../components/Debug'; import Status from '../../components/Status'; + +import * as debugActions from '../../actions/debug'; import * as ModifyMiningActions from '../../actions/modify-mining'; import { updateLogging } from '../../actions/logger'; @@ -14,6 +17,7 @@ class StatusPage extends Component { status: PropTypes.object.isRequired, statusSettings: PropTypes.object.isRequired, statusMining: PropTypes.object.isRequired, + statusDebug: PropTypes.object.isRequired, actions: PropTypes.object.isRequired } @@ -21,6 +25,7 @@ class StatusPage extends Component { return (
    +
    ); } @@ -32,7 +37,7 @@ function mapStateToProps (state) { function mapDispatchToProps (dispatch) { return { - actions: bindActionCreators(extend({}, ModifyMiningActions, { updateLogging }), dispatch) + actions: bindActionCreators(extend({}, ModifyMiningActions, debugActions, { updateLogging }), dispatch) }; } From ac55092ef6e8a670c867130dcab7b107ff43d010 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Mon, 12 Sep 2016 10:49:46 +0200 Subject: [PATCH 0400/1062] fix byte-array-to-hex :bug: --- js/src/api/util/bytes-array-to-hex.js | 2 +- js/src/api/util/bytes-array-to-hex.spec.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/api/util/bytes-array-to-hex.js b/js/src/api/util/bytes-array-to-hex.js index 64a61f4b63b..4ff1f31c33a 100644 --- a/js/src/api/util/bytes-array-to-hex.js +++ b/js/src/api/util/bytes-array-to-hex.js @@ -1,2 +1,2 @@ export default (bytes) => - '0x' + bytes.map((b) => b.toString(16)).join('') + '0x' + bytes.map((b) => ('0' + b.toString(16)).slice(-2)).join('') diff --git a/js/src/api/util/bytes-array-to-hex.spec.js b/js/src/api/util/bytes-array-to-hex.spec.js index 1b0af718ce3..e13e0b4400f 100644 --- a/js/src/api/util/bytes-array-to-hex.spec.js +++ b/js/src/api/util/bytes-array-to-hex.spec.js @@ -6,6 +6,6 @@ describe('api/util/bytes-array-to-hex', () => { }); it('correctly converts a non-empty array', () => { - expect(bytesToHex([0, 15, 16])).to.equal('0x0f10'); + expect(bytesToHex([0, 15, 16])).to.equal('0x000f10'); }); }); From 5567a24cb965fd99bc92bd37eb66d61adebf2f15 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Mon, 12 Sep 2016 10:58:16 +0200 Subject: [PATCH 0401/1062] actions & reducers for registry events --- js/src/dapps/registry/actions.js | 3 ++- js/src/dapps/registry/events/actions.js | 28 ++++++++++++++++++++++++ js/src/dapps/registry/events/reducers.js | 15 +++++++++++++ js/src/dapps/registry/reducers.js | 8 ++++++- 4 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 js/src/dapps/registry/events/actions.js create mode 100644 js/src/dapps/registry/events/reducers.js diff --git a/js/src/dapps/registry/actions.js b/js/src/dapps/registry/actions.js index fbf2b4dded3..8d6632ae81f 100644 --- a/js/src/dapps/registry/actions.js +++ b/js/src/dapps/registry/actions.js @@ -1,8 +1,9 @@ import registryAbi from './abi/registry.json'; const { api } = window.parity; import * as lookup from './Lookup/actions.js'; +import * as events from './events/actions.js'; -export { lookup }; +export { lookup, events }; export const setContract = (contract) => ({ type: 'set contract', contract }); diff --git a/js/src/dapps/registry/events/actions.js b/js/src/dapps/registry/events/actions.js new file mode 100644 index 00000000000..555646be6db --- /dev/null +++ b/js/src/dapps/registry/events/actions.js @@ -0,0 +1,28 @@ +export const start = (name, from, to) => ({ type: 'events subscribe start', name, from, to }); + +export const event = (name, event) => ({ type: 'events event', name, event }); + +export const fail = (name) => ({ type: 'events subscribe fail', name }); + +export const subscribe = (name, from = 0, to = 'latest') => + (dispatch, getState) => { + const { contract } = getState(); + if (!contract || !contract.instance) return; + if (!contract.instance[name]) return; + const channel = contract.instance[name]; + + dispatch(start(name, from, to)); + channel.subscribe({ fromBlock: from, toBlock: to }, (events) => { + // TODO there's no error param! the `fail` action is never used + for (let e of events) { + const data = { + key: '' + e.transactionHash + e.logIndex, + state: e.type, + block: e.blockNumber, + transaction: e.transactionHash, + parameters: e.params + }; + dispatch(event(name, data)) + } + }) + }; diff --git a/js/src/dapps/registry/events/reducers.js b/js/src/dapps/registry/events/reducers.js new file mode 100644 index 00000000000..b39ebf399f9 --- /dev/null +++ b/js/src/dapps/registry/events/reducers.js @@ -0,0 +1,15 @@ +const initialState = []; + +export default (state = initialState, action) => { + if (action.type === 'events subscribe start') + return state; // TODO store the subscriptions? + if (action.type === 'events subscribe fail') + return state; // TODO ? + + if (action.type === 'events event') + return state + .filter((event) => event.key !== action.key) + .concat(action.event); + + return state; +}; diff --git a/js/src/dapps/registry/reducers.js b/js/src/dapps/registry/reducers.js index ee05f5f7ed6..8beb48884d0 100644 --- a/js/src/dapps/registry/reducers.js +++ b/js/src/dapps/registry/reducers.js @@ -1,10 +1,12 @@ import lookupReducer from './Lookup/reducers.js'; +import eventsReducer from './events/reducers.js'; const initialState = { contract: null, fee: null, owner: null, - lookup: lookupReducer(undefined, { type: '' }) + lookup: lookupReducer(undefined, { type: '' }), + events: eventsReducer(undefined, { type: '' }) }; export default (state = initialState, action) => { @@ -21,5 +23,9 @@ export default (state = initialState, action) => { return { ...state, lookup: lookupReducer(state.lookup, action) }; } + if (action.type.slice(0, 6) === 'events') { + return { ...state, events: eventsReducer(state.events, action) }; + } + return state; }; From 8bf2b6ff1e2daf547ffff665c7ffa98e15403145 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 12 Sep 2016 11:16:54 +0200 Subject: [PATCH 0402/1062] status is now a full citizen, not perefct, but integrated --- js/src/index.js | 3 +- .../Status/containers/Container/index.js | 1 - js/src/views/Status/icon.png | Bin 7414 -> 0 bytes js/src/views/Status/index.css | 19 -------- js/src/views/Status/index.html | 12 ----- js/src/views/Status/index.js | 43 +----------------- .../{containers/Container => }/status.css | 0 .../Container/Container.js => status.js} | 11 ++--- js/src/views/index.js | 4 +- 9 files changed, 10 insertions(+), 83 deletions(-) delete mode 100644 js/src/views/Status/containers/Container/index.js delete mode 100644 js/src/views/Status/icon.png delete mode 100644 js/src/views/Status/index.css delete mode 100644 js/src/views/Status/index.html rename js/src/views/Status/{containers/Container => }/status.css (100%) rename js/src/views/Status/{containers/Container/Container.js => status.js} (82%) diff --git a/js/src/index.js b/js/src/index.js index f25345decc4..69b49e60101 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -12,7 +12,7 @@ import Web3 from 'web3'; import { initStore } from './redux'; import { muiTheme } from './ui'; -import { Accounts, Account, Addresses, Address, Application, Contract, Contracts, Dapp, Dapps, Signer } from './views'; +import { Accounts, Account, Addresses, Address, Application, Contract, Contracts, Dapp, Dapps, Signer, Status } from './views'; // TODO: This is VERY messy, just dumped here to get the Signer going import { Web3Provider as SignerWeb3Provider, web3Extension as statusWeb3Extension } from './views/Signer/components'; @@ -22,7 +22,6 @@ import { SignerDataProvider, WsDataProvider } from './views/Signer/providers'; // TODO: same with Status... import { Web3Provider as StatusWeb3Provider } from './views/Status/provider/web3-provider'; import StatusEthcoreWeb3 from './views/Status/provider/web3-ethcore-provider'; -import Status from './views/Status/containers/Container'; import './environment'; diff --git a/js/src/views/Status/containers/Container/index.js b/js/src/views/Status/containers/Container/index.js deleted file mode 100644 index 78e4e70cb47..00000000000 --- a/js/src/views/Status/containers/Container/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './Container'; diff --git a/js/src/views/Status/icon.png b/js/src/views/Status/icon.png deleted file mode 100644 index f7778e67ed4f9a57d028a335cc0f64d5db142cf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7414 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 diff --git a/js/src/views/Status/index.css b/js/src/views/Status/index.css deleted file mode 100644 index 0d3fca6823b..00000000000 --- a/js/src/views/Status/index.css +++ /dev/null @@ -1,19 +0,0 @@ -html, -body { - margin: 0; - padding: 0; - padding-bottom: 50px; -} -:global .dapp-header nav ul { - white-space: nowrap; -} -/* shame:on */ -/* Material-ui is changing input properties with inline styles. */ -/* We want to keep it consistent */ -input { - color: #6691C2 !important; - font-size: 16px !important; - font-family: sans-serif !important; - font-weight: 200 !important; -} -/* shame:off */ diff --git a/js/src/views/Status/index.html b/js/src/views/Status/index.html deleted file mode 100644 index c3d79d5dbfe..00000000000 --- a/js/src/views/Status/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Node Management - - - -
    - - - diff --git a/js/src/views/Status/index.js b/js/src/views/Status/index.js index 9ec679a5df7..60aae301478 100644 --- a/js/src/views/Status/index.js +++ b/js/src/views/Status/index.js @@ -1,42 +1 @@ -import { Provider } from 'react-redux'; -import ReactDOM from 'react-dom'; -import React from 'react'; - -import localStore from 'store'; - -import './index.html'; -import './index.css'; -import '!file-loader?name=icon.png!./icon.png'; -import 'dapp-styles/dapp-styles.less'; -import './env-specific'; - -import Web3 from 'web3'; // must b after ./test otherwise it breaks -import middlewares from './middleware'; -import Routes from './routes'; -import MuiThemeProvider from './components/MuiThemeProvider'; - -import configure from './store'; -import { Web3Provider } from './provider/web3-provider'; -import EthcoreWeb3 from './provider/web3-ethcore-provider'; -import { initAppAction } from './actions/app'; - -const web3 = new Web3(new Web3.providers.HttpProvider(process.env.RPC_ADDRESS || '/rpc/')); - -const store = configure(middlewares(web3)); - -ReactDOM.render( - - - - - , - document.getElementById('root') -); - -const ethcoreWeb3 = new EthcoreWeb3(web3); -new Web3Provider(web3, ethcoreWeb3, store).start(); - -(window || global).store = localStore; -(window || global).web3 = web3; - -store.dispatch(initAppAction()); +export default from './status'; diff --git a/js/src/views/Status/containers/Container/status.css b/js/src/views/Status/status.css similarity index 100% rename from js/src/views/Status/containers/Container/status.css rename to js/src/views/Status/status.css diff --git a/js/src/views/Status/containers/Container/Container.js b/js/src/views/Status/status.js similarity index 82% rename from js/src/views/Status/containers/Container/Container.js rename to js/src/views/Status/status.js index ea5842fa52f..185091a21a8 100644 --- a/js/src/views/Status/containers/Container/Container.js +++ b/js/src/views/Status/status.js @@ -3,15 +3,14 @@ import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import { extend } from 'lodash'; -import { Actionbar, Page } from '../../../../ui'; +import { Actionbar, Page } from '../../ui'; -import { updateLogging } from '../../actions/logger'; - -import StatusPage from '../StatusPage'; +import { updateLogging } from './actions/logger'; +import StatusPage from './containers/StatusPage'; import styles from './status.css'; -class Container extends Component { +class Status extends Component { static propTypes = { status: PropTypes.object.isRequired, statusLogger: PropTypes.object.isRequired, @@ -46,4 +45,4 @@ function mapDispatchToProps (dispatch) { export default connect( mapStateToProps, mapDispatchToProps -)(Container); +)(Status); diff --git a/js/src/views/index.js b/js/src/views/index.js index b65ab39268c..4fc21b5a4cf 100644 --- a/js/src/views/index.js +++ b/js/src/views/index.js @@ -9,6 +9,7 @@ import Dapp from './Dapp'; import Dapps from './Dapps'; import ParityBar from './ParityBar'; import Signer from './Signer'; +import Status from './Status'; export { Account, @@ -21,5 +22,6 @@ export { Dapp, Dapps, ParityBar, - Signer + Signer, + Status }; From adbcca124d7c28edb2320fc3387b8e13afd70d63 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Mon, 12 Sep 2016 11:20:49 +0200 Subject: [PATCH 0403/1062] component for registry events --- js/src/dapps/registry/events/events.css | 12 ++++++++ js/src/dapps/registry/events/events.js | 41 +++++++++++++++++++++++++ js/src/dapps/registry/events/index.js | 1 + 3 files changed, 54 insertions(+) create mode 100644 js/src/dapps/registry/events/events.css create mode 100644 js/src/dapps/registry/events/events.js create mode 100644 js/src/dapps/registry/events/index.js diff --git a/js/src/dapps/registry/events/events.css b/js/src/dapps/registry/events/events.css new file mode 100644 index 00000000000..1ec8303791f --- /dev/null +++ b/js/src/dapps/registry/events/events.css @@ -0,0 +1,12 @@ +.events { + margin: 1em; +} + +.reserved { + display: flex; + justify-content: space-between; +} + +.reserved abbr { + cursor: help; +} diff --git a/js/src/dapps/registry/events/events.js b/js/src/dapps/registry/events/events.js new file mode 100644 index 00000000000..550c8ad0f1e --- /dev/null +++ b/js/src/dapps/registry/events/events.js @@ -0,0 +1,41 @@ +import React, { Component, PropTypes } from 'react'; +import {Card, CardHeader, CardText} from 'material-ui/Card'; +import TextField from 'material-ui/TextField'; + +import styles from './events.css'; +import bytesToHex from '../../../api/util/bytes-array-to-hex'; + +const renderReserved = (e) => ( +

    + { e.parameters.owner } + { ' ' } + registered + { ' ' } + { bytesToHex(e.parameters.name) } +

    +); + +export default class Events extends Component { + + static propTypes = { + actions: PropTypes.object, + events: PropTypes.array + } + componentDidMount () { + // TODO remove this + this.props.actions.subscribe('Reserved', 0, 'latest'); + } + + render () { + return ( + + + { + this.props.events + .filter((e) => e.state === 'mined') + .map(renderReserved) + } + + ); + } +} diff --git a/js/src/dapps/registry/events/index.js b/js/src/dapps/registry/events/index.js new file mode 100644 index 00000000000..7542507a83d --- /dev/null +++ b/js/src/dapps/registry/events/index.js @@ -0,0 +1 @@ +export default from './events.js'; From eba1c8df09e53458c0773d13a953ae0697b23a47 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Mon, 12 Sep 2016 11:21:29 +0200 Subject: [PATCH 0404/1062] integrate events component into registry --- js/src/dapps/registry/Application/application.js | 6 ++++-- js/src/dapps/registry/Container.js | 7 +++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/js/src/dapps/registry/Application/application.js b/js/src/dapps/registry/Application/application.js index dc6fe0cae64..1f22fa3b967 100644 --- a/js/src/dapps/registry/Application/application.js +++ b/js/src/dapps/registry/Application/application.js @@ -6,8 +6,9 @@ const muiTheme = getMuiTheme(lightBaseTheme); import CircularProgress from 'material-ui/CircularProgress'; import styles from './application.css'; -import Status from '../Status'; import Lookup from '../Lookup'; +import Events from '../events'; +import Status from '../Status'; export default class Application extends Component { static childContextTypes = { @@ -27,7 +28,8 @@ export default class Application extends Component { ? (
    - + +
    ) : } diff --git a/js/src/dapps/registry/Container.js b/js/src/dapps/registry/Container.js index eab1ea929aa..8b39ebc51df 100644 --- a/js/src/dapps/registry/Container.js +++ b/js/src/dapps/registry/Container.js @@ -11,20 +11,22 @@ class Container extends Component { contract: PropTypes.object, owner: PropTypes.string, fee: PropTypes.object, - lookup: PropTypes.object + lookup: PropTypes.object, + events: PropTypes.array }; componentDidMount () { this.props.actions.fetchContract(); } render () { - const { actions, contract, owner, fee, lookup } = this.props; + const { actions, contract, owner, fee, lookup, events } = this.props; return (); } } @@ -36,6 +38,7 @@ export default connect( (dispatch) => { const bound = bindActionCreators(actions, dispatch); bound.lookup = bindActionCreators(actions.lookup, dispatch); + bound.events = bindActionCreators(actions.events, dispatch); return { actions: bound }; } )(Container); From 38f878ddea06ab6c278b8311d2c3ecad46a9e973 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Mon, 12 Sep 2016 11:34:26 +0200 Subject: [PATCH 0405/1062] registry events: show identity icon next to owner --- js/src/dapps/registry/events/events.css | 8 ++++++++ js/src/dapps/registry/events/events.js | 6 +++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/js/src/dapps/registry/events/events.css b/js/src/dapps/registry/events/events.css index 1ec8303791f..53f4b399dde 100644 --- a/js/src/dapps/registry/events/events.css +++ b/js/src/dapps/registry/events/events.css @@ -4,7 +4,15 @@ .reserved { display: flex; + margin: .5em 0; justify-content: space-between; + align-items: center; +} + +.owner code { + display: inline-block; + vertical-align: top; + line-height: 32px; } .reserved abbr { diff --git a/js/src/dapps/registry/events/events.js b/js/src/dapps/registry/events/events.js index 550c8ad0f1e..3ef4eae146b 100644 --- a/js/src/dapps/registry/events/events.js +++ b/js/src/dapps/registry/events/events.js @@ -2,12 +2,16 @@ import React, { Component, PropTypes } from 'react'; import {Card, CardHeader, CardText} from 'material-ui/Card'; import TextField from 'material-ui/TextField'; +const { IdentityIcon } = window.parity.react; import styles from './events.css'; import bytesToHex from '../../../api/util/bytes-array-to-hex'; const renderReserved = (e) => (

    - { e.parameters.owner } +

    + + { e.parameters.owner } +
    { ' ' } registered { ' ' } From e48ffd7a447166c527f533f9b836e3f2fe907446 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 12 Sep 2016 11:53:50 +0200 Subject: [PATCH 0406/1062] GAVcoin transfer sends to any address (not just those with balances) --- js/src/dapps/gavcoin/AccountSelector/accountSelector.js | 7 ++++--- .../gavcoin/AccountSelectorText/accountSelectorText.js | 7 +++---- .../dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/js/src/dapps/gavcoin/AccountSelector/accountSelector.js b/js/src/dapps/gavcoin/AccountSelector/accountSelector.js index b81decc4bd5..8962c17d464 100644 --- a/js/src/dapps/gavcoin/AccountSelector/accountSelector.js +++ b/js/src/dapps/gavcoin/AccountSelector/accountSelector.js @@ -11,6 +11,7 @@ export default class AccountSelect extends Component { static propTypes = { accounts: PropTypes.array, account: PropTypes.object, + anyAccount: PropTypes.bool, gavBalance: PropTypes.bool, onSelect: PropTypes.func, errorText: PropTypes.string, @@ -23,7 +24,7 @@ export default class AccountSelect extends Component { } render () { - const { account, accounts, errorText, floatingLabelText, gavBalance, hintText } = this.props; + const { account, accounts, anyAccount, errorText, floatingLabelText, gavBalance, hintText } = this.props; return ( - { renderAccounts(accounts, { gavBalance }) } + { renderAccounts(accounts, { anyAccount, gavBalance }) } ); } @@ -55,7 +56,7 @@ function isPositive (numberStr) { export function renderAccounts (accounts, options = {}) { return accounts .filter((account) => { - if (options.all) { + if (options.anyAccount) { return true; } diff --git a/js/src/dapps/gavcoin/AccountSelectorText/accountSelectorText.js b/js/src/dapps/gavcoin/AccountSelectorText/accountSelectorText.js index 30f07662159..2ffff55cec0 100644 --- a/js/src/dapps/gavcoin/AccountSelectorText/accountSelectorText.js +++ b/js/src/dapps/gavcoin/AccountSelectorText/accountSelectorText.js @@ -15,6 +15,7 @@ export default class AccountSelectorText extends Component { account: PropTypes.object, errorText: PropTypes.string, gavBalance: PropTypes.bool, + anyAccount: PropTypes.bool, floatingLabelText: PropTypes.string, hintText: PropTypes.string, selector: PropTypes.bool, @@ -30,10 +31,11 @@ export default class AccountSelectorText extends Component { } renderDropDown () { - const { account, accounts, errorText, gavBalance, hintText, floatingLabelText, onChange } = this.props; + const { account, accounts, anyAccount, errorText, gavBalance, hintText, floatingLabelText, onChange } = this.props; return ( { - console.log('onChange', address); const lower = address.toLowerCase(); const account = this.props.accounts.find((_account) => _account.address.toLowerCase() === lower); diff --git a/js/src/dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js b/js/src/dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js index 37d301696d6..3e9119715e3 100644 --- a/js/src/dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js +++ b/js/src/dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js @@ -91,7 +91,7 @@ export default class ActionTransfer extends Component { onSelect={ this.onChangeFromAccount } />
    Date: Mon, 12 Sep 2016 11:58:56 +0200 Subject: [PATCH 0407/1062] remove refund refences from transfer dialog --- js/src/dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js b/js/src/dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js index 3e9119715e3..9105bd229f0 100644 --- a/js/src/dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js +++ b/js/src/dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js @@ -111,7 +111,7 @@ export default class ActionTransfer extends Component { floatingLabelFixed floatingLabelText='number of coins' fullWidth - hintText='the number of coins to exchange for an ΞTH refund' + hintText='the number of coins to transfer' errorText={ amountError } name={ NAME_ID } id={ NAME_ID } From ee023e67bacb136685d2c37a0d0042b96efa20a4 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 12 Sep 2016 12:13:47 +0200 Subject: [PATCH 0408/1062] Add form overlay to hide password suggestions --- js/src/ui/Form/form.css | 1 + .../TransactionPendingFormConfirm.js | 52 ++++++++++--------- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/js/src/ui/Form/form.css b/js/src/ui/Form/form.css index ee8201e00d7..995754188dc 100644 --- a/js/src/ui/Form/form.css +++ b/js/src/ui/Form/form.css @@ -7,6 +7,7 @@ position: absolute; left: 0; top: 0; + opacity: 0; } :root .form input:-webkit-autofill { diff --git a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js index 36cf3eec030..0a803726c6d 100644 --- a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js +++ b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js @@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'; import RaisedButton from 'material-ui/RaisedButton'; import ReactTooltip from 'react-tooltip'; -import { Input, SignerIcon } from '../../../../../ui'; +import { Form, Input, SignerIcon } from '../../../../../ui'; import styles from './TransactionPendingFormConfirm.css'; @@ -25,30 +25,32 @@ export default class TransactionPendingFormConfirm extends Component { return (
    - -
    - } - label={ isSending ? 'Confirming...' : 'Confirm Transaction' } - /> -
    - { this.renderTooltip() } +
    + +
    + } + label={ isSending ? 'Confirming...' : 'Confirm Transaction' } + /> +
    + { this.renderTooltip() } +
    ); } From c351ed7d8d596674a872ea3c7b8d9acad3dfcaef Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Mon, 12 Sep 2016 11:58:23 +0100 Subject: [PATCH 0409/1062] Fixes case-sensitive bugs in imports --- js/src/ui/Modal/ModalSteps/index.js | 2 +- js/src/ui/Modal/index.js | 2 +- js/src/ui/Tooltips/Tooltip/index.js | 2 +- js/src/ui/index.js | 4 ++-- js/webpack.config.js | 4 ---- 5 files changed, 5 insertions(+), 9 deletions(-) diff --git a/js/src/ui/Modal/ModalSteps/index.js b/js/src/ui/Modal/ModalSteps/index.js index 08e0460607f..4ac9ea401d8 100644 --- a/js/src/ui/Modal/ModalSteps/index.js +++ b/js/src/ui/Modal/ModalSteps/index.js @@ -1 +1 @@ -export default from './ModalSteps'; +export default from './modalSteps'; diff --git a/js/src/ui/Modal/index.js b/js/src/ui/Modal/index.js index adfcb8f125b..2d77d4d6d03 100644 --- a/js/src/ui/Modal/index.js +++ b/js/src/ui/Modal/index.js @@ -1 +1 @@ -export default from './Modal'; +export default from './modal'; diff --git a/js/src/ui/Tooltips/Tooltip/index.js b/js/src/ui/Tooltips/Tooltip/index.js index 17f06b52ba6..7819891f326 100644 --- a/js/src/ui/Tooltips/Tooltip/index.js +++ b/js/src/ui/Tooltips/Tooltip/index.js @@ -1 +1 @@ -export default from './Tooltip'; +export default from './tooltip'; diff --git a/js/src/ui/index.js b/js/src/ui/index.js index c653b72a33a..9a731d3c193 100644 --- a/js/src/ui/index.js +++ b/js/src/ui/index.js @@ -1,5 +1,5 @@ import Actionbar from './Actionbar'; -import Badge from './badge'; +import Badge from './Badge'; import Balances from './Balances'; import Container, { Title as ContainerTitle } from './Container'; import Errors from './Errors'; @@ -8,7 +8,7 @@ import IdentityIcon from './IdentityIcon'; import Modal from './Modal'; import muiTheme from './Theme'; import Page from './Page'; -import SignerIcon from './signerIcon'; +import SignerIcon from './SignerIcon'; import Tooltips, { Tooltip } from './Tooltips'; export { diff --git a/js/webpack.config.js b/js/webpack.config.js index 7998a4b5ea2..2d7d2658d0b 100644 --- a/js/webpack.config.js +++ b/js/webpack.config.js @@ -122,10 +122,6 @@ module.exports = { return a; } ), - new webpack.NormalModuleReplacementPlugin( - /dapp-styles\/hex-grid-tile\.png$/, - require.resolve('dapp-styles/hex-grid-tile.png') - ), new webpack.DefinePlugin({ 'process.env': { NODE_ENV: JSON.stringify(ENV), From 81ee05c829d29f25726420daf1ec0abb80d75188 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 12 Sep 2016 14:41:09 +0200 Subject: [PATCH 0410/1062] retrieve balances on accounts update --- js/src/views/Application/application.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index fa018015984..14398c05b27 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -160,7 +160,9 @@ class Application extends Component { accounts, contacts, showFirstRun - }, nextTimeout); + }, this.retrieveBalances); + + nextTimeout(); }) .catch((error) => { console.error('retrieveAccounts', error); From 1a0fbd91ec3329fa2c4175eaf495a832ed34aa11 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 12 Sep 2016 15:23:03 +0200 Subject: [PATCH 0411/1062] prettify embedded signer boxes --- js/src/views/ParityBar/parityBar.css | 16 ++++++++++++++-- js/src/views/ParityBar/parityBar.js | 19 ++++++++++++------- .../Signer/containers/Embedded/embedded.js | 3 --- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/js/src/views/ParityBar/parityBar.css b/js/src/views/ParityBar/parityBar.css index f60655e3da3..4e42d406991 100644 --- a/js/src/views/ParityBar/parityBar.css +++ b/js/src/views/ParityBar/parityBar.css @@ -72,11 +72,23 @@ right: -10px; } -.actions { - text-align: right; +.header { + height: 36px; padding-bottom: 1em; } +.header:after { + clear: both; +} + +.title { + float: left; +} + +.actions { + float: right; +} + .actions div { margin-left: 1em; display: inline-block; diff --git a/js/src/views/ParityBar/parityBar.js b/js/src/views/ParityBar/parityBar.js index f5bc6a32215..770d636fdc1 100644 --- a/js/src/views/ParityBar/parityBar.js +++ b/js/src/views/ParityBar/parityBar.js @@ -5,7 +5,7 @@ import { bindActionCreators } from 'redux'; import { FlatButton } from 'material-ui'; import ContentClear from 'material-ui/svg-icons/content/clear'; -import { Badge, SignerIcon } from '../../ui'; +import { Badge, ContainerTitle, SignerIcon } from '../../ui'; import { Embedded as Signer } from '../Signer'; import imagesEthcoreBlock from '../../images/ethcore-block-blue.png'; @@ -59,12 +59,17 @@ class ParityBar extends Component { renderExpanded () { return (
    -
    - } - label='Close' - primary - onTouchTap={ this.toggleDisplay } /> +
    +
    + +
    +
    + } + label='Close' + primary + onTouchTap={ this.toggleDisplay } /> +
    diff --git a/js/src/views/Signer/containers/Embedded/embedded.js b/js/src/views/Signer/containers/Embedded/embedded.js index e63b194c5b5..d8942d339ea 100644 --- a/js/src/views/Signer/containers/Embedded/embedded.js +++ b/js/src/views/Signer/containers/Embedded/embedded.js @@ -43,9 +43,6 @@ class Embedded extends Component { return (
    -
    - There are currently { items.length } pending requests awaiting confirmation. Please accept/reject them below. -
    { items }
    ); From 7b932d5246598ed1a7fb396c16a69736a3e97e96 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 12 Sep 2016 15:39:56 +0200 Subject: [PATCH 0412/1062] make tests run (not all passing again, need to fix) --- js/package.json | 1 + js/src/views/Status/components/Call/Call.spec.js | 2 +- js/src/views/Status/components/Calls/Calls.spec.js | 2 +- .../views/Status/components/CallsToolbar/CallsToolbar.spec.js | 2 +- js/src/views/Status/components/Response/Response.spec.js | 2 +- 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/js/package.json b/js/package.json index bc9ee63f771..81e70cacaea 100644 --- a/js/package.json +++ b/js/package.json @@ -81,6 +81,7 @@ "nock": "^8.0.0", "postcss-loader": "^0.8.1", "react-addons-test-utils": "^15.3.0", + "react-copy-to-clipboard": "^4.2.3", "react-hot-loader": "^1.3.0", "rollup": "^0.34.1", "rollup-plugin-babel": "^2.6.1", diff --git a/js/src/views/Status/components/Call/Call.spec.js b/js/src/views/Status/components/Call/Call.spec.js index 88624b2fcf7..e3eb286b711 100644 --- a/js/src/views/Status/components/Call/Call.spec.js +++ b/js/src/views/Status/components/Call/Call.spec.js @@ -2,7 +2,7 @@ import React from 'react'; import { shallow } from 'enzyme'; import sinon from 'sinon'; -import '../../env-specific/tests'; +import '../../../../environment/tests'; import Call from './Call'; diff --git a/js/src/views/Status/components/Calls/Calls.spec.js b/js/src/views/Status/components/Calls/Calls.spec.js index 46441e33bb8..8570a17c65d 100644 --- a/js/src/views/Status/components/Calls/Calls.spec.js +++ b/js/src/views/Status/components/Calls/Calls.spec.js @@ -1,7 +1,7 @@ import React from 'react'; import { shallow } from 'enzyme'; -import '../../env-specific/tests'; +import '../../../../environment/tests'; import Calls from './Calls'; diff --git a/js/src/views/Status/components/CallsToolbar/CallsToolbar.spec.js b/js/src/views/Status/components/CallsToolbar/CallsToolbar.spec.js index 0e9b7d6f916..d055d534574 100644 --- a/js/src/views/Status/components/CallsToolbar/CallsToolbar.spec.js +++ b/js/src/views/Status/components/CallsToolbar/CallsToolbar.spec.js @@ -2,7 +2,7 @@ import React from 'react'; import sinon from 'sinon'; import { shallow } from 'enzyme'; -import '../../env-specific/tests'; +import '../../../../environment/tests'; import CallsToolbar from './CallsToolbar'; diff --git a/js/src/views/Status/components/Response/Response.spec.js b/js/src/views/Status/components/Response/Response.spec.js index be821187049..093876a8848 100644 --- a/js/src/views/Status/components/Response/Response.spec.js +++ b/js/src/views/Status/components/Response/Response.spec.js @@ -1,7 +1,7 @@ import React from 'react'; import { shallow } from 'enzyme'; -import '../../env-specific/tests'; +import '../../../../environment/tests'; import Response from './Response'; From 80ceb8e19d96272cb7899f7bc4e9503cc5a2b2ba Mon Sep 17 00:00:00 2001 From: Jannis R Date: Mon, 12 Sep 2016 14:34:17 +0200 Subject: [PATCH 0413/1062] registry: actions & reducers for account selection --- js/src/dapps/registry/actions.js | 20 ++++++++++++++++++++ js/src/dapps/registry/reducers.js | 15 ++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/js/src/dapps/registry/actions.js b/js/src/dapps/registry/actions.js index 8d6632ae81f..ff60a9b5bfe 100644 --- a/js/src/dapps/registry/actions.js +++ b/js/src/dapps/registry/actions.js @@ -5,6 +5,26 @@ import * as events from './events/actions.js'; export { lookup, events }; +export const setAccounts = (accounts) => ({ type: 'set accounts', accounts }); + +export const fetchAccounts = () => (dispatch) => + Promise.all([ + api.personal.listAccounts(), + api.personal.accountsInfo() + ]) + .then((accounts, infos) => { + accounts = accounts + .filter((id) => infos[id]) + .map((id) => infos[id]) + dispatch(setAccounts(accounts)) + }) + .catch((err) => { + console.error('could not fetch accounts'); + if (err) console.error(err.stack); + }); + +export const setAccount = (id) => ({ type: 'set account', id }); + export const setContract = (contract) => ({ type: 'set contract', contract }); export const fetchContract = () => (dispatch) => diff --git a/js/src/dapps/registry/reducers.js b/js/src/dapps/registry/reducers.js index 8beb48884d0..7ca414960a8 100644 --- a/js/src/dapps/registry/reducers.js +++ b/js/src/dapps/registry/reducers.js @@ -1,15 +1,28 @@ import lookupReducer from './Lookup/reducers.js'; import eventsReducer from './events/reducers.js'; +import registerReducer from './register/reducers.js'; const initialState = { + accounts: {}, + account: null, contract: null, fee: null, owner: null, lookup: lookupReducer(undefined, { type: '' }), - events: eventsReducer(undefined, { type: '' }) + events: eventsReducer(undefined, { type: '' }), + register: registerReducer(undefined, { type: '' }) }; export default (state = initialState, action) => { + if (action.type === 'set accounts') + return { ...state, accounts: action.accounts }; + + if (action.type === 'set account') { + if (state.accounts && state.accounts[action.id]) + return { ...state, account: state.accounts[action.id] }; + return state + } + if (action.type === 'set contract') return { ...state, contract: action.contract }; From 68872f14696d450d1f4cd74ae32294f2dcf29bc3 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 12 Sep 2016 16:17:18 +0200 Subject: [PATCH 0414/1062] tests all passing again --- js/src/api/contract/contract.js | 3 +-- js/src/api/contract/contract.spec.js | 6 +++--- js/src/api/events/events.js | 5 +++++ js/src/api/format/input.js | 14 ++++++-------- js/src/views/Status/middleware/logger.spec.js | 2 +- 5 files changed, 16 insertions(+), 14 deletions(-) diff --git a/js/src/api/contract/contract.js b/js/src/api/contract/contract.js index 091aa216363..05e8483ca11 100644 --- a/js/src/api/contract/contract.js +++ b/js/src/api/contract/contract.js @@ -5,7 +5,7 @@ import { isInstanceOf } from '../util/types'; export default class Contract { constructor (api, abi) { if (!isInstanceOf(api, Api)) { - throw new Error('Api instance needs to be provided to Contract'); + throw new Error('API instance needs to be provided to Contract'); } else if (!abi) { throw new Error('ABI needs to be provided to Contract instance'); } @@ -137,7 +137,6 @@ export default class Contract { if (options.data && options.data.substr(0, 2) === '0x') { options.data = options.data.substr(2); } - options.data = `0x${options.data || ''}${func.encodeCall(tokens)}`; return options; diff --git a/js/src/api/contract/contract.spec.js b/js/src/api/contract/contract.spec.js index b356824be47..edd5a477599 100644 --- a/js/src/api/contract/contract.spec.js +++ b/js/src/api/contract/contract.spec.js @@ -35,11 +35,11 @@ describe('api/contract/Contract', () => { describe('constructor', () => { it('needs an EthAbi instance', () => { - expect(() => new Contract()).to.throw(/EthApi needs to be provided/); + expect(() => new Contract()).to.throw(/API instance needs to be provided to Contract/); }); it('needs an ABI', () => { - expect(() => new Contract(eth)).to.throw(/Object ABI needs/); + expect(() => new Contract(eth)).to.throw(/ABI needs to be provided to Contract instance/); }); describe('internal setup', () => { @@ -47,7 +47,7 @@ describe('api/contract/Contract', () => { it('sets EthApi & parsed interface', () => { expect(contract.address).to.not.be.ok; - expect(contract.eth).to.deep.equal(eth); + expect(contract.api).to.deep.equal(eth); expect(isInstanceOf(contract.abi, Abi)).to.be.ok; }); diff --git a/js/src/api/events/events.js b/js/src/api/events/events.js index fa1b474f34c..c8857119648 100644 --- a/js/src/api/events/events.js +++ b/js/src/api/events/events.js @@ -56,6 +56,11 @@ export default class Events { _pollBlockNumber = () => { const nextTimeout = () => setTimeout(this._pollBlockNumber, 1000); + if (!this.subscriptions['eth.blockNumber'].length) { + nextTimeout(); + return; + } + this._api.eth .blockNumber() .then((blockNumber) => { diff --git a/js/src/api/format/input.js b/js/src/api/format/input.js index 9cd9237da33..f8fa5a7cf38 100644 --- a/js/src/api/format/input.js +++ b/js/src/api/format/input.js @@ -2,11 +2,7 @@ import BigNumber from 'bignumber.js'; import { isInstanceOf, isString } from '../util/types'; -const ZERO_64 = '0000000000000000000000000000000000000000000000000000000000000000'; - -function padBytes (_bytes) { - -} +// const ZERO_64 = '0000000000000000000000000000000000000000000000000000000000000000'; export function inAddress (address) { // TODO: address validation if we have upper-lower addresses @@ -27,10 +23,12 @@ export function inBlockNumber (blockNumber) { } export function inData (data) { - const hex = inHex(data).substr(2); - const missing = hex.length % 64; + return inHex(data); - return `0x${hex}${ZERO_64.slice(-1 * missing)}`; + // const hex = inHex(data).substr(2); + // const missing = hex.length % 64; + // + // return `0x${hex}${ZERO_64.slice(-1 * missing)}`; } export function inTopics (_topics) { diff --git a/js/src/views/Status/middleware/logger.spec.js b/js/src/views/Status/middleware/logger.spec.js index bc7ef13f802..3220f4d05e5 100644 --- a/js/src/views/Status/middleware/logger.spec.js +++ b/js/src/views/Status/middleware/logger.spec.js @@ -3,7 +3,7 @@ import logger from './logger'; describe('MIDDLEWARE: LOGGER', () => { describe('MIDDLEWARE', () => { - const state = { logger: { logging: true } }; + const state = { statusLogger: { logging: true } }; beforeEach('spy console', () => { sinon.spy(console, 'log'); From 94ff8763d76435bc79576abc62f2b776e134a6eb Mon Sep 17 00:00:00 2001 From: Jannis R Date: Mon, 12 Sep 2016 15:58:43 +0200 Subject: [PATCH 0415/1062] registry: component for account selection --- .../registry/Application/application.css | 9 ++-- .../dapps/registry/Application/application.js | 8 +++- js/src/dapps/registry/Container.js | 6 ++- js/src/dapps/registry/accounts/accounts.js | 46 +++++++++++++++++++ js/src/dapps/registry/accounts/index.js | 1 + js/src/dapps/registry/actions.js | 9 ++-- 6 files changed, 69 insertions(+), 10 deletions(-) create mode 100644 js/src/dapps/registry/accounts/accounts.js create mode 100644 js/src/dapps/registry/accounts/index.js diff --git a/js/src/dapps/registry/Application/application.css b/js/src/dapps/registry/Application/application.css index e7a306bc2bd..9eca2d6a1a0 100644 --- a/js/src/dapps/registry/Application/application.css +++ b/js/src/dapps/registry/Application/application.css @@ -1,8 +1,11 @@ -.title { +.header { margin: 0; padding: .3em .5em; + color: #fff; + background-color: #333; +} + +.header h1 { line-height: 1.3; font-size: 200%; text-transform: uppercase; - color: #fff; - background-color: #333; } diff --git a/js/src/dapps/registry/Application/application.js b/js/src/dapps/registry/Application/application.js index 1f22fa3b967..30d929de8ba 100644 --- a/js/src/dapps/registry/Application/application.js +++ b/js/src/dapps/registry/Application/application.js @@ -6,6 +6,7 @@ const muiTheme = getMuiTheme(lightBaseTheme); import CircularProgress from 'material-ui/CircularProgress'; import styles from './application.css'; +import Accounts from '../accounts'; import Lookup from '../Lookup'; import Events from '../events'; import Status from '../Status'; @@ -19,11 +20,14 @@ export default class Application extends Component { } render () { - const { contract, fee, owner, actions } = this.props; + const { accounts, account, contract, fee, owner, actions } = this.props; return (
    -

    RΞgistry

    +
    +

    RΞgistry

    + +
    { contract && fee && owner ? (
    diff --git a/js/src/dapps/registry/Container.js b/js/src/dapps/registry/Container.js index 8b39ebc51df..afb559c64c3 100644 --- a/js/src/dapps/registry/Container.js +++ b/js/src/dapps/registry/Container.js @@ -8,6 +8,8 @@ import * as actions from './actions'; class Container extends Component { static propTypes = { actions: PropTypes.object, + accounts: PropTypes.object, + account: PropTypes.object, contract: PropTypes.object, owner: PropTypes.string, fee: PropTypes.object, @@ -19,9 +21,11 @@ class Container extends Component { } render () { - const { actions, contract, owner, fee, lookup, events } = this.props; + const { actions, accounts, account, contract, owner, fee, lookup, events } = this.props; return ( (account) => ( + +); + +export default class Accounts extends Component { + + static propTypes = { + actions: PropTypes.object, + accounts: PropTypes.object, + account: PropTypes.object + } + + componentDidMount () { + // TODO remove this + this.props.actions.fetchAccounts(); + } + + state = { value: null }; + + render () { + const { open } = this.state; + const { accounts, account } = this.props; + + return ( + + { Object.values(accounts).map(renderAccount(account)) } + + ); + } + + onAccountSelect = (e, address) => { + this.props.actions.setAccount(address); + }; +} diff --git a/js/src/dapps/registry/accounts/index.js b/js/src/dapps/registry/accounts/index.js new file mode 100644 index 00000000000..09e26c97282 --- /dev/null +++ b/js/src/dapps/registry/accounts/index.js @@ -0,0 +1 @@ +export default from './accounts'; diff --git a/js/src/dapps/registry/actions.js b/js/src/dapps/registry/actions.js index ff60a9b5bfe..f54f6928dfb 100644 --- a/js/src/dapps/registry/actions.js +++ b/js/src/dapps/registry/actions.js @@ -12,10 +12,11 @@ export const fetchAccounts = () => (dispatch) => api.personal.listAccounts(), api.personal.accountsInfo() ]) - .then((accounts, infos) => { - accounts = accounts - .filter((id) => infos[id]) - .map((id) => infos[id]) + .then(([ accounts, infos ]) => { + accounts = accounts.reduce((accounts, id) => { + if (infos[id]) accounts[id] = { ...infos[id], id } + return accounts + }, {}) dispatch(setAccounts(accounts)) }) .catch((err) => { From 55ced5e60b22cc4355ff7ff4f7d19979b52b6b6b Mon Sep 17 00:00:00 2001 From: Jannis R Date: Mon, 12 Sep 2016 17:07:35 +0200 Subject: [PATCH 0416/1062] bugfixes :bug: --- js/src/dapps/registry.js | 3 +++ js/src/dapps/registry/actions.js | 8 ++++---- js/src/dapps/registry/reducers.js | 4 ++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/js/src/dapps/registry.js b/js/src/dapps/registry.js index 03ec8885154..d78e2bc449f 100644 --- a/js/src/dapps/registry.js +++ b/js/src/dapps/registry.js @@ -2,6 +2,9 @@ import React from 'react'; import ReactDOM from 'react-dom'; import { Provider } from 'react-redux'; +import injectTapEventPlugin from 'react-tap-event-plugin'; +injectTapEventPlugin(); + import store from './registry/store'; import Container from './registry/Container'; diff --git a/js/src/dapps/registry/actions.js b/js/src/dapps/registry/actions.js index f54f6928dfb..5f105d003c4 100644 --- a/js/src/dapps/registry/actions.js +++ b/js/src/dapps/registry/actions.js @@ -12,9 +12,9 @@ export const fetchAccounts = () => (dispatch) => api.personal.listAccounts(), api.personal.accountsInfo() ]) - .then(([ accounts, infos ]) => { - accounts = accounts.reduce((accounts, id) => { - if (infos[id]) accounts[id] = { ...infos[id], id } + .then(([ addresses, infos ]) => { + const accounts = addresses.reduce((accounts, address) => { + if (infos[address]) accounts[address] = { ...infos[address], address } return accounts }, {}) dispatch(setAccounts(accounts)) @@ -24,7 +24,7 @@ export const fetchAccounts = () => (dispatch) => if (err) console.error(err.stack); }); -export const setAccount = (id) => ({ type: 'set account', id }); +export const setAccount = (address) => ({ type: 'set account', address }); export const setContract = (contract) => ({ type: 'set contract', contract }); diff --git a/js/src/dapps/registry/reducers.js b/js/src/dapps/registry/reducers.js index 7ca414960a8..2d70e04becd 100644 --- a/js/src/dapps/registry/reducers.js +++ b/js/src/dapps/registry/reducers.js @@ -18,8 +18,8 @@ export default (state = initialState, action) => { return { ...state, accounts: action.accounts }; if (action.type === 'set account') { - if (state.accounts && state.accounts[action.id]) - return { ...state, account: state.accounts[action.id] }; + if (state.accounts && state.accounts[action.address]) + return { ...state, account: state.accounts[action.address] }; return state } From c4ca471a91b5196f40d7e390376a4b8b93515e58 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Mon, 12 Sep 2016 17:12:20 +0200 Subject: [PATCH 0417/1062] registry: actions & reducers for name registration --- js/src/dapps/registry/actions.js | 3 +- js/src/dapps/registry/reducers.js | 4 +++ js/src/dapps/registry/register/actions.js | 35 ++++++++++++++++++++++ js/src/dapps/registry/register/reducers.js | 15 ++++++++++ 4 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 js/src/dapps/registry/register/actions.js create mode 100644 js/src/dapps/registry/register/reducers.js diff --git a/js/src/dapps/registry/actions.js b/js/src/dapps/registry/actions.js index 5f105d003c4..5d2d7a194ef 100644 --- a/js/src/dapps/registry/actions.js +++ b/js/src/dapps/registry/actions.js @@ -2,8 +2,9 @@ import registryAbi from './abi/registry.json'; const { api } = window.parity; import * as lookup from './Lookup/actions.js'; import * as events from './events/actions.js'; +import * as register from './register/actions.js'; -export { lookup, events }; +export { lookup, events, register }; export const setAccounts = (accounts) => ({ type: 'set accounts', accounts }); diff --git a/js/src/dapps/registry/reducers.js b/js/src/dapps/registry/reducers.js index 2d70e04becd..c46197e6d65 100644 --- a/js/src/dapps/registry/reducers.js +++ b/js/src/dapps/registry/reducers.js @@ -40,5 +40,9 @@ export default (state = initialState, action) => { return { ...state, events: eventsReducer(state.events, action) }; } + if (action.type.slice(0, 8) === 'register') { + return { ...state, register: registerReducer(state.register, action) }; + } + return state; }; diff --git a/js/src/dapps/registry/register/actions.js b/js/src/dapps/registry/register/actions.js new file mode 100644 index 00000000000..df5f574bbab --- /dev/null +++ b/js/src/dapps/registry/register/actions.js @@ -0,0 +1,35 @@ +const sha3 = window.parity.api.format.sha3; +const toWei = window.parity.api.format.toWei; + +export const start = (name) => ({ type: 'register start', name }); + +export const success = (name) => ({ type: 'register success', name }); + +export const fail = (name) => ({ type: 'register error', name }); + +export const register = (name) => (dispatch, getState) => { + const { contract, account } = getState(); + if (!contract || !account) return; + const reserve = contract.functions + .find((f) => f.name === 'reserve'); + + const options = { + from: account.address, + value: toWei(1).toString() + }; + const values = [ sha3(name) ]; + + reserve.estimateGas(options, values) + .then((gas) => { + options.gas = gas.mul(1.2).toFixed(0); + dispatch(start(name)); + return reserve.postTransaction(options, values) + }) + .then((data) => { + dispatch(success(name)); + }).catch((err) => { + console.error(`could not reserve ${name}`); + if (err) console.error(err.stack); + dispatch(fail(name)); + }); +}; diff --git a/js/src/dapps/registry/register/reducers.js b/js/src/dapps/registry/register/reducers.js new file mode 100644 index 00000000000..5e23a59dd6a --- /dev/null +++ b/js/src/dapps/registry/register/reducers.js @@ -0,0 +1,15 @@ +const initialState = { + contract: null, + names: [] +}; + +export default (state = initialState, action) => { + + if (action.type === 'register success') + return { ...state, names: state.names + .filter((n) => n !== action.name) + .concat(action.name) + }; + + return state; +}; From 70b36577b6d2abddfd6109fd8c485a3a4f8b7e4d Mon Sep 17 00:00:00 2001 From: Jannis R Date: Mon, 12 Sep 2016 17:12:49 +0200 Subject: [PATCH 0418/1062] registry: component for name registration --- js/src/dapps/registry/register/index.js | 1 + js/src/dapps/registry/register/register.css | 11 ++++ js/src/dapps/registry/register/register.js | 57 +++++++++++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 js/src/dapps/registry/register/index.js create mode 100644 js/src/dapps/registry/register/register.css create mode 100644 js/src/dapps/registry/register/register.js diff --git a/js/src/dapps/registry/register/index.js b/js/src/dapps/registry/register/index.js new file mode 100644 index 00000000000..d43009504b0 --- /dev/null +++ b/js/src/dapps/registry/register/index.js @@ -0,0 +1 @@ +export default from './register.js'; diff --git a/js/src/dapps/registry/register/register.css b/js/src/dapps/registry/register/register.css new file mode 100644 index 00000000000..391b552887a --- /dev/null +++ b/js/src/dapps/registry/register/register.css @@ -0,0 +1,11 @@ +.register { + margin: 1em; +} + +.box { + margin: 0 1em; +} + +.spacing { + margin-left: 1em; +} diff --git a/js/src/dapps/registry/register/register.js b/js/src/dapps/registry/register/register.js new file mode 100644 index 00000000000..dcf20f5c33b --- /dev/null +++ b/js/src/dapps/registry/register/register.js @@ -0,0 +1,57 @@ +import React, { Component, PropTypes } from 'react'; +import {Card, CardHeader, CardText} from 'material-ui/Card'; +import TextField from 'material-ui/TextField'; +import RaisedButton from 'material-ui/RaisedButton'; +import CheckIcon from 'material-ui/svg-icons/navigation/check'; + +const { fromWei } = window.parity.api.format; + +import styles from './register.css'; + +export default class Register extends Component { + + static propTypes = { + actions: PropTypes.object, + register: PropTypes.object, + fee: PropTypes.object + } + + state = { name: '' }; + + render () { + const { name } = this.state + const props = this.props.register + const { fee } = this.props + + return ( + + +
    + + } + onClick={ this.onRegisterClick } + /> +
    + +

    The registration fee is { fromWei(fee).toFixed(3) }ΞTH.

    +
    +
    + ); + } + + onNameChange = (e) => { + this.setState({ name: e.target.value }); + }; + onRegisterClick = () => { + this.props.actions.register(this.state.name); + }; +} From 2e5a9124e8d806657d2b2b3107371dc09bc50f7b Mon Sep 17 00:00:00 2001 From: Jannis R Date: Mon, 12 Sep 2016 17:13:06 +0200 Subject: [PATCH 0419/1062] registry: connect component for name registration --- js/src/dapps/registry/Application/application.js | 2 ++ js/src/dapps/registry/Container.js | 4 +++- js/src/dapps/registry/Status/status.js | 6 +----- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/js/src/dapps/registry/Application/application.js b/js/src/dapps/registry/Application/application.js index 30d929de8ba..c25c31749be 100644 --- a/js/src/dapps/registry/Application/application.js +++ b/js/src/dapps/registry/Application/application.js @@ -8,6 +8,7 @@ import CircularProgress from 'material-ui/CircularProgress'; import styles from './application.css'; import Accounts from '../accounts'; import Lookup from '../Lookup'; +import Register from '../register'; import Events from '../events'; import Status from '../Status'; @@ -32,6 +33,7 @@ export default class Application extends Component { ? (
    +
    diff --git a/js/src/dapps/registry/Container.js b/js/src/dapps/registry/Container.js index afb559c64c3..bf2ffd8484b 100644 --- a/js/src/dapps/registry/Container.js +++ b/js/src/dapps/registry/Container.js @@ -21,7 +21,7 @@ class Container extends Component { } render () { - const { actions, accounts, account, contract, owner, fee, lookup, events } = this.props; + const { actions, accounts, account, contract, owner, fee, lookup, events, register } = this.props; return (); } } @@ -43,6 +44,7 @@ export default connect( const bound = bindActionCreators(actions, dispatch); bound.lookup = bindActionCreators(actions.lookup, dispatch); bound.events = bindActionCreators(actions.events, dispatch); + bound.register = bindActionCreators(actions.register, dispatch); return { actions: bound }; } )(Container); diff --git a/js/src/dapps/registry/Status/status.js b/js/src/dapps/registry/Status/status.js index be24e813631..49c354ca6e3 100644 --- a/js/src/dapps/registry/Status/status.js +++ b/js/src/dapps/registry/Status/status.js @@ -2,24 +2,20 @@ import React, { Component, PropTypes } from 'react'; import styles from './status.css'; -const { api } = window.parity; - export default class Status extends Component { static propTypes = { address: PropTypes.string, - fee: PropTypes.object, owner: PropTypes.string } render () { - const { address, fee, owner } = this.props; + const { address, owner } = this.props; return (
    Registry at { address }
    Owned by { owner }
    -
    Registration fee { api.format.fromWei(fee).toFixed(3) }ΞTH
    ); } From 45fb14ae73314f6270a00d917c0e9e1bb0bc95cc Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 12 Sep 2016 17:45:51 +0200 Subject: [PATCH 0420/1062] split out addAddress to be slightly more performant --- js/src/api/contract/contract.js | 23 +++++++++-------------- js/src/api/contract/contract.spec.js | 14 ++++++++++++++ 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/js/src/api/contract/contract.js b/js/src/api/contract/contract.js index 05e8483ca11..0495d1b6ec5 100644 --- a/js/src/api/contract/contract.js +++ b/js/src/api/contract/contract.js @@ -142,21 +142,16 @@ export default class Contract { return options; } - _bindFunction (func) { - const addAddress = (_options = {}) => { - const options = {}; - - Object.keys(_options).forEach((key) => { - options[key] = _options[key]; - }); - options.to = options.to || this._address; - - return options; - }; + _addOptionsTo (options = {}) { + return Object.assign({ + to: this._address + }, options); + } + _bindFunction (func) { func.call = (options, values) => { return this._api.eth - .call(this._encodeOptions(func, addAddress(options), values)) + .call(this._encodeOptions(func, this._addOptionsTo(options), values)) .then((encoded) => func.decodeOutput(encoded)) .then((tokens) => tokens.map((token) => token.value)) .then((returns) => returns.length === 1 ? returns[0] : returns); @@ -165,12 +160,12 @@ export default class Contract { if (!func.constant) { func.postTransaction = (options, values) => { return this._api.eth - .postTransaction(this._encodeOptions(func, addAddress(options), values)); + .postTransaction(this._encodeOptions(func, this._addOptionsTo(options), values)); }; func.estimateGas = (options, values) => { return this._api.eth - .estimateGas(this._encodeOptions(func, addAddress(options), values)); + .estimateGas(this._encodeOptions(func, this._addOptionsTo(options), values)); }; } diff --git a/js/src/api/contract/contract.spec.js b/js/src/api/contract/contract.spec.js index edd5a477599..aff2418bd0a 100644 --- a/js/src/api/contract/contract.spec.js +++ b/js/src/api/contract/contract.spec.js @@ -279,6 +279,20 @@ describe('api/contract/Contract', () => { func = contract.functions.find((fn) => fn.name === 'test'); }); + describe.only('_addOptionsTo', () => { + it('works on no object specified', () => { + expect(contract._addOptionsTo()).to.deep.equal({ to: ADDR }); + }); + + it('uses the contract address when none specified', () => { + expect(contract._addOptionsTo({ from: 'me' })).to.deep.equal({ to: ADDR, from: 'me' }); + }); + + it('overrides the contract address when specified', () => { + expect(contract._addOptionsTo({ to: 'you', from: 'me' })).to.deep.equal({ to: 'you', from: 'me' }); + }); + }); + describe('attachments', () => { it('attaches .call, .postTransaction & .estimateGas to constructors', () => { expect(isFunction(cons.call)).to.be.true; From 380b084e3553efe5a4c5f29515bda67c813b1f51 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 12 Sep 2016 18:50:11 +0200 Subject: [PATCH 0421/1062] store event name on the log --- js/src/api/contract/contract.js | 1 + js/src/api/contract/contract.spec.js | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/js/src/api/contract/contract.js b/js/src/api/contract/contract.js index 0495d1b6ec5..d003b3abc66 100644 --- a/js/src/api/contract/contract.js +++ b/js/src/api/contract/contract.js @@ -95,6 +95,7 @@ export default class Contract { log.params = {}; log.address = decoded.address; + log.event = event.name; decoded.params.forEach((param) => { log.params[param.name] = param.token.value; diff --git a/js/src/api/contract/contract.spec.js b/js/src/api/contract/contract.spec.js index aff2418bd0a..1ac426a7dbd 100644 --- a/js/src/api/contract/contract.spec.js +++ b/js/src/api/contract/contract.spec.js @@ -151,8 +151,11 @@ describe('api/contract/Contract', () => { transactionHash: '0xca16f537d761d13e4e80953b754e2b15541f267d6cad9381f750af1bae1e4917', transactionIndex: '0x0' }); + const log = decoded.logs[0]; - expect(decoded.logs[0].params).to.deep.equal({ + expect(log.event).to.equal('Message'); + expect(log.address).to.equal('0xfa64203C044691aA57251aF95f4b48d85eC00Dd5'); + expect(log.params).to.deep.equal({ at: new BigNumber('1457965151'), message: 'post(message)', messageId: new BigNumber('281474976731085'), @@ -279,7 +282,7 @@ describe('api/contract/Contract', () => { func = contract.functions.find((fn) => fn.name === 'test'); }); - describe.only('_addOptionsTo', () => { + describe('_addOptionsTo', () => { it('works on no object specified', () => { expect(contract._addOptionsTo()).to.deep.equal({ to: ADDR }); }); From 218664a69539a9bcfdd82b4ed7482847187ae244 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 12 Sep 2016 19:01:42 +0200 Subject: [PATCH 0422/1062] unsubscript really works, don't much with original object for options --- js/src/api/contract/contract.js | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/js/src/api/contract/contract.js b/js/src/api/contract/contract.js index d003b3abc66..d0d573cd100 100644 --- a/js/src/api/contract/contract.js +++ b/js/src/api/contract/contract.js @@ -124,6 +124,7 @@ export default class Contract { } }) .catch((error) => { + console.error('pollTransactionReceipt', error); reject(error); }); }; @@ -176,11 +177,12 @@ export default class Contract { _bindEvent (event) { const subscriptions = []; - event.subscribe = (options, callback) => { + event.subscribe = (_options, callback) => { const subscriptionId = subscriptions.length; - - options.address = this._address; - options.topics = [event.signature]; + const options = Object.assign({}, _options, { + address: this._address, + topics: [event.signature] + }); this._api.eth .newFilter(options) @@ -190,13 +192,11 @@ export default class Contract { .then((logs) => { callback(this.parseEventLogs(logs)); - const subscription = { + subscriptions.push({ options, callback, filterId - }; - - subscriptions.push(subscription); + }); }); }); @@ -204,10 +204,19 @@ export default class Contract { }; event.unsubscribe = (subscriptionId) => { - subscriptions.filter((callback, idx) => idx !== subscriptionId); + const subscription = subscriptions[subscriptionId]; + + this._api.eth + .uninstallFilter(subscription.filterId); + + subscriptions[subscriptionId] = null; }; const sendChanges = (subscription) => { + if (!subscription) { + return; + } + this._api.eth .getFilterChanges(subscription.filterId) .then((logs) => { @@ -223,6 +232,7 @@ export default class Contract { subscriptions.forEach(sendChanges); }; + // NOTE: This would have been great, however 'pending' latest blockNumber makes us not wait, so tigher polling // this._api.events.subscribe('eth.blockNumber', onTriggerSend); setInterval(onTriggerSend, 1000); From eb168241b9106e25df96d0aebde3b0565d3fb17e Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 12 Sep 2016 20:00:20 +0200 Subject: [PATCH 0423/1062] single contract-bases subscribe/unsubscribe --- js/src/api/contract/contract.js | 69 +++++++++++++++++ js/src/api/events/events.js | 12 +-- .../dapps/gavcoin/Application/application.js | 12 ++- js/src/dapps/gavcoin/Events/events.js | 76 ++++++++++--------- js/src/dapps/gavcoin/format/index.js | 6 +- 5 files changed, 129 insertions(+), 46 deletions(-) diff --git a/js/src/api/contract/contract.js b/js/src/api/contract/contract.js index d0d573cd100..f4bca808fb3 100644 --- a/js/src/api/contract/contract.js +++ b/js/src/api/contract/contract.js @@ -13,6 +13,7 @@ export default class Contract { this._api = api; this._abi = new Abi(abi); + this._subscriptions = []; this._constructors = this._abi.constructors.map((cons) => this._bindFunction(cons)); this._functions = this._abi.functions.map((func) => this._bindFunction(func)); this._events = this._abi.events.map((event) => this._bindEvent(event)); @@ -25,6 +26,8 @@ export default class Contract { this._functions.forEach((fn) => { this._instance[fn.name] = fn; }); + + this._sendSubscriptionChanges(); } get address () { @@ -238,4 +241,70 @@ export default class Contract { return event; } + + subscribe (eventName, _options = {}, callback) { + const subscriptionId = this._subscriptions.length; + const event = this.events.find((evt) => evt.name === eventName); + const options = Object.assign({}, _options, { + address: this._address, + topics: [event ? event.signature : null] + }); + + this._api.eth + .newFilter(options) + .then((filterId) => { + return this._api.eth + .getFilterLogs(filterId) + .then((logs) => { + callback(null, this.parseEventLogs(logs)); + + this._subscriptions.push({ + options, + callback, + filterId + }); + }); + }) + .catch((error) => { + console.log('subscribe', error); + callback(error); + }); + + return subscriptionId; + } + + unsubscribe (subscriptionId) { + const subscription = this._subscriptions[subscriptionId]; + + this._api.eth.uninstallFilter(subscription.filterId); + this._subscriptions[subscriptionId] = null; + } + + _sendSubscriptionChanges = () => { + const subscriptions = this._subscriptions.filter((subscription) => subscription); + const timeout = () => setTimeout(this._sendSubscriptionChanges, 1000); + + Promise + .all( + subscriptions.map((subscription) => { + return this._api.eth.getFilterChanges(subscription.filterId); + }) + ) + .then((logsArray) => { + logsArray.forEach((logs, idx) => { + try { + subscriptions[idx].callback(null, this.parseEventLogs(logs)); + } catch (error) { + subscriptions[idx].callback(error); + console.error('_sendSubscriptionChanges', error); + } + }); + + timeout(); + }) + .catch((error) => { + console.error('_sendSubscriptionChanges', error); + timeout(); + }); + } } diff --git a/js/src/api/events/events.js b/js/src/api/events/events.js index c8857119648..5fb6e957222 100644 --- a/js/src/api/events/events.js +++ b/js/src/api/events/events.js @@ -1,10 +1,12 @@ +import BigNumber from 'bignumber.js'; + const EVENTS = ['eth.blockNumber']; export default class Events { constructor (api) { this._api = api; - this._lastBlock = 0; + this._lastBlock = new BigNumber(0); this.subscriptions = {}; this.values = {}; @@ -56,10 +58,10 @@ export default class Events { _pollBlockNumber = () => { const nextTimeout = () => setTimeout(this._pollBlockNumber, 1000); - if (!this.subscriptions['eth.blockNumber'].length) { - nextTimeout(); - return; - } + // if (!this.subscriptions['eth.blockNumber'].length) { + // nextTimeout(); + // return; + // } this._api.eth .blockNumber() diff --git a/js/src/dapps/gavcoin/Application/application.js b/js/src/dapps/gavcoin/Application/application.js index 5bc1457d92e..56752e3d3a9 100644 --- a/js/src/dapps/gavcoin/Application/application.js +++ b/js/src/dapps/gavcoin/Application/application.js @@ -22,6 +22,7 @@ const DIVISOR = 10 ** 6; export default class Application extends Component { static childContextTypes = { api: PropTypes.object, + contract: PropTypes.object, instance: PropTypes.object, muiTheme: PropTypes.object }; @@ -30,7 +31,7 @@ export default class Application extends Component { action: null, address: null, accounts: [], - blockNumber: null, + blockNumber: new BigNumber(-1), ethBalance: new BigNumber(0), gavBalance: new BigNumber(0), instance: null, @@ -104,10 +105,11 @@ export default class Application extends Component { } getChildContext () { - const { instance } = this.state; + const { contract, instance } = this.state; return { api, + contract, instance, muiTheme }; @@ -126,6 +128,7 @@ export default class Application extends Component { } onNewBlockNumber = (blockNumber) => { + console.log('blockNumber', blockNumber); const { instance, accounts } = this.state; Promise @@ -189,12 +192,13 @@ export default class Application extends Component { .then(([address, addresses, infos]) => { console.log(`gavcoin was found at ${address}`); - const { instance } = api.newContract(gavcoinAbi, address); + const contract = api.newContract(gavcoinAbi, address); this.setState({ loading: false, address, - instance, + contract, + instance: contract.instance, accounts: addresses.map((address) => { const info = infos[address]; diff --git a/js/src/dapps/gavcoin/Events/events.js b/js/src/dapps/gavcoin/Events/events.js index 7de80caed4f..ddd2130fa56 100644 --- a/js/src/dapps/gavcoin/Events/events.js +++ b/js/src/dapps/gavcoin/Events/events.js @@ -13,6 +13,7 @@ export default class Events extends Component { } static contextTypes = { + contract: PropTypes.object.isRequired, instance: PropTypes.object.isRequired } @@ -73,7 +74,7 @@ export default class Events extends Component { } setupFilters () { - const { instance } = this.context; + const { contract } = this.context; let key = 0; const sortEvents = (a, b) => b.blockNumber.cmp(a.blockNumber) || b.logIndex.cmp(a.logIndex); @@ -92,42 +93,45 @@ export default class Events extends Component { }; }; - ['Approval', 'Buyin', 'Refund', 'Transfer', 'NewTranch'].forEach((eventName) => { - const options = { - fromBlock: 0, - toBlock: 'pending' - }; - - instance[eventName].subscribe(options, (logs) => { - if (!logs.length) { - return; - } + const options = { + fromBlock: 0, + toBlock: 'pending' + }; - console.log(logs); - - const minedEvents = logs - .filter((log) => log.type === 'mined') - .map((log) => logToEvent(eventName, log)) - .reverse() - .concat(this.state.minedEvents) - .sort(sortEvents); - const pendingEvents = logs - .filter((log) => log.type === 'pending') - .map((log) => logToEvent(eventName, log)) - .reverse() - .concat(this.state.pendingEvents.filter((event) => { - return !logs.find((log) => { - return (log.type === 'mined') && (log.transactionHash === event.transactionHash); - }); - })) - .sort(sortEvents); - const allEvents = pendingEvents.concat(minedEvents); - - this.setState({ - allEvents, - minedEvents, - pendingEvents - }); + contract.subscribe(null, options, (error, logs) => { + if (error) { + console.error('setupFilters', error); + return; + } + + if (!logs.length) { + return; + } + + console.log(logs); + + const minedEvents = logs + .filter((log) => log.type === 'mined') + .map((log) => logToEvent(log.event, log)) + .reverse() + .concat(this.state.minedEvents) + .sort(sortEvents); + const pendingEvents = logs + .filter((log) => log.type === 'pending') + .map((log) => logToEvent(log.event, log)) + .reverse() + .concat(this.state.pendingEvents.filter((event) => { + return !logs.find((log) => { + return (log.type === 'mined') && (log.transactionHash === event.transactionHash); + }); + })) + .sort(sortEvents); + const allEvents = pendingEvents.concat(minedEvents); + + this.setState({ + allEvents, + minedEvents, + pendingEvents }); }); } diff --git a/js/src/dapps/gavcoin/format/index.js b/js/src/dapps/gavcoin/format/index.js index 252b2099759..a822b66bf8d 100644 --- a/js/src/dapps/gavcoin/format/index.js +++ b/js/src/dapps/gavcoin/format/index.js @@ -1,9 +1,13 @@ +import BigNumber from 'bignumber.js'; + const { api } = window.parity; const DIVISOR = 10 ** 6; +const ZERO = new BigNumber(0); export function formatBlockNumber (blockNumber) { - return blockNumber.eq(0) + console.log(blockNumber); + return ZERO.eq(blockNumber || 0) ? 'Pending' : `#${blockNumber.toFormat()}`; } From 1516e4cc9e1e1698cf8f6f842dcb1cbe47de579e Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 12 Sep 2016 20:06:57 +0200 Subject: [PATCH 0424/1062] error when invalid eventName is specified to subscribe --- js/src/api/contract/contract.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/js/src/api/contract/contract.js b/js/src/api/contract/contract.js index f4bca808fb3..d148958d314 100644 --- a/js/src/api/contract/contract.js +++ b/js/src/api/contract/contract.js @@ -244,7 +244,17 @@ export default class Contract { subscribe (eventName, _options = {}, callback) { const subscriptionId = this._subscriptions.length; - const event = this.events.find((evt) => evt.name === eventName); + let event = null; + + if (eventName) { + event = this.events.find((evt) => evt.name === eventName); + + if (!event) { + const events = this._events.map((evt) => evt.name).join(', '); + throw new Error(`${eventName} is not a valid eventName, subscribe using one of ${events} or null to include all events`); + } + } + const options = Object.assign({}, _options, { address: this._address, topics: [event ? event.signature : null] From 80f6c0bb19e73577d43cc4572e0dffcb80c935a7 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 12 Sep 2016 20:08:43 +0200 Subject: [PATCH 0425/1062] remove extra logging --- js/src/dapps/gavcoin/Application/application.js | 1 - 1 file changed, 1 deletion(-) diff --git a/js/src/dapps/gavcoin/Application/application.js b/js/src/dapps/gavcoin/Application/application.js index 56752e3d3a9..55c6d021b16 100644 --- a/js/src/dapps/gavcoin/Application/application.js +++ b/js/src/dapps/gavcoin/Application/application.js @@ -128,7 +128,6 @@ export default class Application extends Component { } onNewBlockNumber = (blockNumber) => { - console.log('blockNumber', blockNumber); const { instance, accounts } = this.state; Promise From d4fee0db4710704b0b0a1cf92c92e0f748f1c56b Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 12 Sep 2016 20:13:34 +0200 Subject: [PATCH 0426/1062] additional blockNumber logging removed --- js/src/dapps/gavcoin/format/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/js/src/dapps/gavcoin/format/index.js b/js/src/dapps/gavcoin/format/index.js index a822b66bf8d..c7244c0285d 100644 --- a/js/src/dapps/gavcoin/format/index.js +++ b/js/src/dapps/gavcoin/format/index.js @@ -6,7 +6,6 @@ const DIVISOR = 10 ** 6; const ZERO = new BigNumber(0); export function formatBlockNumber (blockNumber) { - console.log(blockNumber); return ZERO.eq(blockNumber || 0) ? 'Pending' : `#${blockNumber.toFormat()}`; From 068cdb66af6c4db30c2580c844204bb2cccf2590 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 12 Sep 2016 20:39:25 +0200 Subject: [PATCH 0427/1062] go big-gun, sha3 of log info for key --- js/src/dapps/gavcoin/Events/events.js | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/js/src/dapps/gavcoin/Events/events.js b/js/src/dapps/gavcoin/Events/events.js index ddd2130fa56..22cca8841a6 100644 --- a/js/src/dapps/gavcoin/Events/events.js +++ b/js/src/dapps/gavcoin/Events/events.js @@ -7,6 +7,8 @@ import EventTransfer from './EventTransfer'; import styles from './events.css'; +const { api } = window.parity; + export default class Events extends Component { static childContextTypes = { accounts: PropTypes.array @@ -75,21 +77,21 @@ export default class Events extends Component { setupFilters () { const { contract } = this.context; - let key = 0; const sortEvents = (a, b) => b.blockNumber.cmp(a.blockNumber) || b.logIndex.cmp(a.logIndex); - const logToEvent = (eventName, log) => { + const logToEvent = (log) => { + const key = api.format.sha3(JSON.stringify(log)); const { blockNumber, logIndex, transactionHash, transactionIndex, params, type } = log; return { - type: eventName, + type: log.event, state: type, blockNumber, logIndex, transactionHash, transactionIndex, params, - key: ++key + key }; }; @@ -98,31 +100,32 @@ export default class Events extends Component { toBlock: 'pending' }; - contract.subscribe(null, options, (error, logs) => { + contract.subscribe(null, options, (error, _logs) => { if (error) { console.error('setupFilters', error); return; } - if (!logs.length) { + if (!_logs.length) { return; } - console.log(logs); + const logs = _logs.map(logToEvent); const minedEvents = logs - .filter((log) => log.type === 'mined') - .map((log) => logToEvent(log.event, log)) + .filter((log) => log.state === 'mined') .reverse() .concat(this.state.minedEvents) .sort(sortEvents); const pendingEvents = logs - .filter((log) => log.type === 'pending') - .map((log) => logToEvent(log.event, log)) + .filter((log) => log.state === 'pending') .reverse() .concat(this.state.pendingEvents.filter((event) => { return !logs.find((log) => { - return (log.type === 'mined') && (log.transactionHash === event.transactionHash); + const isMined = (log.state === 'mined') && (log.transactionHash === event.transactionHash); + const isPending = (log.state === 'pending') && (log.key === event.key); + + return isMined || isPending; }); })) .sort(sortEvents); From 4a0611478efe4b35c76e3a21d8b783ec22a880ba Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 12 Sep 2016 21:19:33 +0200 Subject: [PATCH 0428/1062] rework subscriptions for the api with api.subscribe/api.unsubscribe --- js/src/api/api.js | 16 ++-- js/src/api/contract/contract.js | 2 - js/src/api/events/events.js | 78 ------------------- js/src/api/events/index.js | 1 - js/src/api/subscriptions/eth.js | 21 +++++ js/src/api/subscriptions/index.js | 1 + js/src/api/subscriptions/subscriptions.js | 75 ++++++++++++++++++ .../dapps/gavcoin/Application/application.js | 9 ++- .../dapps/tokenreg/Application/application.js | 9 ++- 9 files changed, 121 insertions(+), 91 deletions(-) delete mode 100644 js/src/api/events/events.js delete mode 100644 js/src/api/events/index.js create mode 100644 js/src/api/subscriptions/eth.js create mode 100644 js/src/api/subscriptions/index.js create mode 100644 js/src/api/subscriptions/subscriptions.js diff --git a/js/src/api/api.js b/js/src/api/api.js index f0b2556f823..2efe426329b 100644 --- a/js/src/api/api.js +++ b/js/src/api/api.js @@ -2,7 +2,7 @@ import { Http, Ws } from './transport/index'; import Contract from './contract/index'; import { Db, Eth, Ethcore, Net, Personal, Shh, Trace, Web3 } from './rpc/index'; -import Events from './events/index'; +import Subscriptions from './subscriptions/index'; import format from './format/index'; import { isFunction } from './util/types'; @@ -21,7 +21,7 @@ export default class Api { this._trace = new Trace(transport); this._web3 = new Web3(transport); - this._events = new Events(this); + this._subscriptions = new Subscriptions(this); } get db () { @@ -56,10 +56,6 @@ export default class Api { return this._web3; } - get events () { - return this._events; - } - get format () { return format; } @@ -68,6 +64,14 @@ export default class Api { return new Contract(this, abi).at(address); } + subscribe (subscriptionName, callback) { + return this._subscriptions.subscribe(subscriptionName, callback); + } + + unsubscribe (subscriptionId) { + return this._subscriptions.unsubscribe(subscriptionId); + } + static Transport = { Http: Http, Ws: Ws diff --git a/js/src/api/contract/contract.js b/js/src/api/contract/contract.js index d148958d314..414eb06de24 100644 --- a/js/src/api/contract/contract.js +++ b/js/src/api/contract/contract.js @@ -235,8 +235,6 @@ export default class Contract { subscriptions.forEach(sendChanges); }; - // NOTE: This would have been great, however 'pending' latest blockNumber makes us not wait, so tigher polling - // this._api.events.subscribe('eth.blockNumber', onTriggerSend); setInterval(onTriggerSend, 1000); return event; diff --git a/js/src/api/events/events.js b/js/src/api/events/events.js deleted file mode 100644 index 5fb6e957222..00000000000 --- a/js/src/api/events/events.js +++ /dev/null @@ -1,78 +0,0 @@ -import BigNumber from 'bignumber.js'; - -const EVENTS = ['eth.blockNumber']; - -export default class Events { - constructor (api) { - this._api = api; - - this._lastBlock = new BigNumber(0); - this.subscriptions = {}; - this.values = {}; - - EVENTS.forEach((eventName) => { - this.subscriptions[eventName] = []; - this.values[eventName] = 0; - }); - - this._pollBlockNumber(); - } - - _validateEvent (eventName) { - if (!EVENTS.includes(eventName)) { - throw new Error(`${eventName} is not a valid eventName, subscribe using one of ${EVENTS.join(', ')}`); - } - } - - subscribe (eventName, callback) { - this._validateEvent(eventName); - - const subscriptionId = this.subscriptions[eventName].length; - - this.subscriptions[eventName].push(callback); - this._sendData(callback, this.values[eventName]); - - return subscriptionId; - } - - unsubscribe (eventName, subscriptionId) { - this._validateEvent(eventName); - - this.subscriptions[eventName].filter((callback, idx) => idx !== subscriptionId); - } - - _sendData (callback, data) { - try { - callback(data); - } catch (error) { - } - } - - _sendEvents (eventName, data) { - this.values[eventName] = data; - this.subscriptions[eventName].forEach((callback) => { - this._sendData(callback, data); - }); - } - - _pollBlockNumber = () => { - const nextTimeout = () => setTimeout(this._pollBlockNumber, 1000); - - // if (!this.subscriptions['eth.blockNumber'].length) { - // nextTimeout(); - // return; - // } - - this._api.eth - .blockNumber() - .then((blockNumber) => { - if (blockNumber.gt(this._lastBlock)) { - this._lastBlock = blockNumber; - this._sendEvents('eth.blockNumber', blockNumber); - } - - nextTimeout(); - }) - .catch(nextTimeout); - } -} diff --git a/js/src/api/events/index.js b/js/src/api/events/index.js deleted file mode 100644 index 9bc705f2c88..00000000000 --- a/js/src/api/events/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './events'; diff --git a/js/src/api/subscriptions/eth.js b/js/src/api/subscriptions/eth.js new file mode 100644 index 00000000000..6235fab781d --- /dev/null +++ b/js/src/api/subscriptions/eth.js @@ -0,0 +1,21 @@ +import BigNumber from 'bignumber.js'; + +let lastBlock = new BigNumber(-1); + +export const ethBlockNumber = (api, updateAll) => { + const nextTimeout = () => setTimeout(() => { + ethBlockNumber(api, updateAll); + }, 1000); + + api.eth + .blockNumber() + .then((blockNumber) => { + if (blockNumber.gt(lastBlock)) { + lastBlock = blockNumber; + updateAll(null, blockNumber); + } + + nextTimeout(); + }) + .catch(nextTimeout); +}; diff --git a/js/src/api/subscriptions/index.js b/js/src/api/subscriptions/index.js new file mode 100644 index 00000000000..1d4ded9c47f --- /dev/null +++ b/js/src/api/subscriptions/index.js @@ -0,0 +1 @@ +export default from './subscriptions'; diff --git a/js/src/api/subscriptions/subscriptions.js b/js/src/api/subscriptions/subscriptions.js new file mode 100644 index 00000000000..965a66f7f64 --- /dev/null +++ b/js/src/api/subscriptions/subscriptions.js @@ -0,0 +1,75 @@ +import { ethBlockNumber } from './eth'; + +const EVENTS = ['eth.blockNumber']; +const ALIASSES = {}; + +export default class Subscriptions { + constructor (api) { + this._api = api; + + this.subscriptions = {}; + this.values = {}; + + EVENTS.forEach((subscriptionName) => { + this.subscriptions[subscriptionName] = []; + this.values[subscriptionName] = { + error: null, + data: 0 + }; + }); + + ethBlockNumber(api, (error, data) => this._updateSubscriptions('eth.blockNumber', error, data)); + } + + _validateType (_subscriptionName) { + const subscriptionName = ALIASSES[_subscriptionName] || _subscriptionName; + + if (!EVENTS.includes(subscriptionName)) { + throw new Error(`${subscriptionName} is not a valid interface, subscribe using one of ${EVENTS.join(', ')}`); + } + + return subscriptionName; + } + + subscribe (_subscriptionName, callback) { + const subscriptionName = this._validateType(_subscriptionName); + + const subscriptionId = this.subscriptions[subscriptionName].length; + const { error, data } = this.values[subscriptionName]; + + this.subscriptions[subscriptionName].push(callback); + this._sendData(callback, error, data); + + return subscriptionId; + } + + unsubscribe (_subscriptionName, subscriptionId) { + const subscriptionName = this._validateType(_subscriptionName); + + if (subscriptionId >= this.subscriptions[subscriptionName].length) { + throw new Error(`Cannot find subscriptions at index ${subscriptionId} for type ${subscriptionName}`); + } + + this.subscriptions[subscriptionName][subscriptionId] = null; + + return true; + } + + _sendData (callback, error, data) { + if (!callback) { + return; + } + + try { + callback(error, data); + } catch (error) { + } + } + + _updateSubscriptions (subscriptionName, error, data) { + this.values[subscriptionName] = { error, data }; + this.subscriptions[subscriptionName].forEach((callback) => { + this._sendData(callback, error, data); + }); + } +} diff --git a/js/src/dapps/gavcoin/Application/application.js b/js/src/dapps/gavcoin/Application/application.js index 55c6d021b16..2a145848023 100644 --- a/js/src/dapps/gavcoin/Application/application.js +++ b/js/src/dapps/gavcoin/Application/application.js @@ -127,9 +127,14 @@ export default class Application extends Component { }); } - onNewBlockNumber = (blockNumber) => { + onNewBlockNumber = (_error, blockNumber) => { const { instance, accounts } = this.state; + if (_error) { + console.error('onNewBlockNumber', _error); + return; + } + Promise .all([ instance.totalSupply.call(), @@ -209,7 +214,7 @@ export default class Application extends Component { }) }); - api.events.subscribe('eth.blockNumber', this.onNewBlockNumber); + api.subscribe('eth.blockNumber', this.onNewBlockNumber); }) .catch((error) => { console.error('attachInterface', error); diff --git a/js/src/dapps/tokenreg/Application/application.js b/js/src/dapps/tokenreg/Application/application.js index e18981c1e89..18ec0b21363 100644 --- a/js/src/dapps/tokenreg/Application/application.js +++ b/js/src/dapps/tokenreg/Application/application.js @@ -56,9 +56,14 @@ export default class Application extends Component { }; } - onNewBlockNumber = (blockNumber) => { + onNewBlockNumber = (_error, blockNumber) => { const { instance } = this.state; + if (_error) { + console.error('onNewBlockNumber', _error); + return; + } + instance.fee .call() .then((fee) => { @@ -96,7 +101,7 @@ export default class Application extends Component { owner }); - api.events.subscribe('eth.blockNumber', this.onNewBlockNumber); + api.subscribe('eth.blockNumber', this.onNewBlockNumber); }); }) .catch((error) => { From ccfeb890806f3e7a8cb280064733b5f9ec7a629a Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 12 Sep 2016 21:29:10 +0200 Subject: [PATCH 0429/1062] !blockNumber.eq isntead of .gt (re-org) --- js/src/api/subscriptions/eth.js | 4 ++-- js/src/api/subscriptions/subscriptions.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/js/src/api/subscriptions/eth.js b/js/src/api/subscriptions/eth.js index 6235fab781d..3a99af522bb 100644 --- a/js/src/api/subscriptions/eth.js +++ b/js/src/api/subscriptions/eth.js @@ -10,9 +10,9 @@ export const ethBlockNumber = (api, updateAll) => { api.eth .blockNumber() .then((blockNumber) => { - if (blockNumber.gt(lastBlock)) { + if (!blockNumber.eq(lastBlock)) { lastBlock = blockNumber; - updateAll(null, blockNumber); + updateAll('eth.blockNumber', null, blockNumber); } nextTimeout(); diff --git a/js/src/api/subscriptions/subscriptions.js b/js/src/api/subscriptions/subscriptions.js index 965a66f7f64..fece02b0880 100644 --- a/js/src/api/subscriptions/subscriptions.js +++ b/js/src/api/subscriptions/subscriptions.js @@ -14,11 +14,11 @@ export default class Subscriptions { this.subscriptions[subscriptionName] = []; this.values[subscriptionName] = { error: null, - data: 0 + data: null }; }); - ethBlockNumber(api, (error, data) => this._updateSubscriptions('eth.blockNumber', error, data)); + ethBlockNumber(api, this._updateSubscriptions); } _validateType (_subscriptionName) { From dc3785515e68d24b963d3261135ea626ec1b38a8 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 12 Sep 2016 21:53:22 +0200 Subject: [PATCH 0430/1062] subscription lazy start --- js/src/api/subscriptions/eth.js | 54 +++++++++++++++-------- js/src/api/subscriptions/subscriptions.js | 16 ++++--- 2 files changed, 46 insertions(+), 24 deletions(-) diff --git a/js/src/api/subscriptions/eth.js b/js/src/api/subscriptions/eth.js index 3a99af522bb..ddf1265b94f 100644 --- a/js/src/api/subscriptions/eth.js +++ b/js/src/api/subscriptions/eth.js @@ -1,21 +1,37 @@ import BigNumber from 'bignumber.js'; -let lastBlock = new BigNumber(-1); - -export const ethBlockNumber = (api, updateAll) => { - const nextTimeout = () => setTimeout(() => { - ethBlockNumber(api, updateAll); - }, 1000); - - api.eth - .blockNumber() - .then((blockNumber) => { - if (!blockNumber.eq(lastBlock)) { - lastBlock = blockNumber; - updateAll('eth.blockNumber', null, blockNumber); - } - - nextTimeout(); - }) - .catch(nextTimeout); -}; +export default class PollEth { + constructor (api, updateSubscriptions) { + this._api = api; + this._updateSubscriptions = updateSubscriptions; + this._started = false; + + this._lastBlock = new BigNumber(-1); + } + + get isStarted () { + return this._started; + } + + start () { + this._started = true; + + this._blockNumber(); + } + + _blockNumber = () => { + const nextTimeout = () => setTimeout(this._blockNumber, 1000); + + this._api.eth + .blockNumber() + .then((blockNumber) => { + if (!blockNumber.eq(this._lastBlock)) { + this._lastBlock = blockNumber; + this._updateSubscriptions('eth.blockNumber', null, blockNumber); + } + + nextTimeout(); + }) + .catch(nextTimeout); + } +} diff --git a/js/src/api/subscriptions/subscriptions.js b/js/src/api/subscriptions/subscriptions.js index fece02b0880..e68689c33ef 100644 --- a/js/src/api/subscriptions/subscriptions.js +++ b/js/src/api/subscriptions/subscriptions.js @@ -1,4 +1,4 @@ -import { ethBlockNumber } from './eth'; +import PollEth from './eth'; const EVENTS = ['eth.blockNumber']; const ALIASSES = {}; @@ -18,7 +18,7 @@ export default class Subscriptions { }; }); - ethBlockNumber(api, this._updateSubscriptions); + this._eth = new PollEth(api, this._updateSubscriptions); } _validateType (_subscriptionName) { @@ -33,12 +33,18 @@ export default class Subscriptions { subscribe (_subscriptionName, callback) { const subscriptionName = this._validateType(_subscriptionName); - const subscriptionId = this.subscriptions[subscriptionName].length; const { error, data } = this.values[subscriptionName]; + const [prefix] = subscriptionName.split('.'); + const engine = this[`_${prefix}`]; this.subscriptions[subscriptionName].push(callback); - this._sendData(callback, error, data); + + if (!engine.isStarted) { + engine.start(); + } else { + this._sendData(callback, error, data); + } return subscriptionId; } @@ -66,7 +72,7 @@ export default class Subscriptions { } } - _updateSubscriptions (subscriptionName, error, data) { + _updateSubscriptions = (subscriptionName, error, data) => { this.values[subscriptionName] = { error, data }; this.subscriptions[subscriptionName].forEach((callback) => { this._sendData(callback, error, data); From 43481ce8152bdd24b29712329c141884b56b1f3e Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 12 Sep 2016 22:43:23 +0200 Subject: [PATCH 0431/1062] introduce loggin subscription, expand to personal_, map subscription name to JSONRPC --- js/src/api/subscriptions/eth.js | 6 +- js/src/api/subscriptions/index.js | 2 + js/src/api/subscriptions/logging.js | 28 +++++++ js/src/api/subscriptions/personal.js | 83 +++++++++++++++++++ js/src/api/subscriptions/subscriptions.js | 10 ++- js/src/api/transport/jsonRpcBase.js | 8 +- .../dapps/gavcoin/Application/application.js | 2 +- .../dapps/tokenreg/Application/application.js | 2 +- 8 files changed, 132 insertions(+), 9 deletions(-) create mode 100644 js/src/api/subscriptions/logging.js create mode 100644 js/src/api/subscriptions/personal.js diff --git a/js/src/api/subscriptions/eth.js b/js/src/api/subscriptions/eth.js index ddf1265b94f..b99d4b88e66 100644 --- a/js/src/api/subscriptions/eth.js +++ b/js/src/api/subscriptions/eth.js @@ -1,7 +1,7 @@ import BigNumber from 'bignumber.js'; -export default class PollEth { - constructor (api, updateSubscriptions) { +export default class Eth { + constructor (updateSubscriptions, api) { this._api = api; this._updateSubscriptions = updateSubscriptions; this._started = false; @@ -27,7 +27,7 @@ export default class PollEth { .then((blockNumber) => { if (!blockNumber.eq(this._lastBlock)) { this._lastBlock = blockNumber; - this._updateSubscriptions('eth.blockNumber', null, blockNumber); + this._updateSubscriptions('eth_blockNumber', null, blockNumber); } nextTimeout(); diff --git a/js/src/api/subscriptions/index.js b/js/src/api/subscriptions/index.js index 1d4ded9c47f..f2b335e7179 100644 --- a/js/src/api/subscriptions/index.js +++ b/js/src/api/subscriptions/index.js @@ -1 +1,3 @@ +export Logging from './logging'; + export default from './subscriptions'; diff --git a/js/src/api/subscriptions/logging.js b/js/src/api/subscriptions/logging.js new file mode 100644 index 00000000000..9f6786f7900 --- /dev/null +++ b/js/src/api/subscriptions/logging.js @@ -0,0 +1,28 @@ +let instance = null; + +export default class Logging { + constructor (updateSubscriptions) { + this._updateSubscriptions = updateSubscriptions; + + instance = this; + } + + get isStarted () { + return true; + } + + start () { + } + + static send (method, params, json) { + if (!instance) { + return; + } + + return instance._updateSubscriptions('logging', null, { + method, + params, + json + }); + } +} diff --git a/js/src/api/subscriptions/personal.js b/js/src/api/subscriptions/personal.js new file mode 100644 index 00000000000..0c9bd1efc1b --- /dev/null +++ b/js/src/api/subscriptions/personal.js @@ -0,0 +1,83 @@ +export default class Personal { + constructor (updateSubscriptions, api, subscriber) { + this._subscriber = subscriber; + this._api = api; + this._updateSubscriptions = updateSubscriptions; + this._started = false; + + this._lastAccounts = []; + this._lastInfo = {}; + } + + get isStarted () { + return this._started; + } + + start () { + this._started = true; + + this._listAccounts(); + this._accountsInfo(); + this._loggingSubscribe(); + } + + _listAccounts = () => { + this._api.personal + .listAccounts() + .then((accounts) => { + let different = false; + + if (accounts.length !== this._lastAccounts.length) { + different = true; + } + + if (different) { + this._lastAccounts = accounts; + this._updateSubscriptions('personal.listAccounts', null, accounts); + } + }); + } + + _accountsInfo = () => { + this.api.personal + .accountsInfo() + .then((info) => { + const infoKeys = Object.keys(info); + const lastKeys = Object.keys(this._lastInfo); + let different = false; + + if (infoKeys.length !== lastKeys.length) { + different = true; + } else { + different = !!infoKeys.find((key) => { + return (!lastKeys[key] || this._lastInfo[key].name !== info[key].name); + }); + } + + if (different) { + this._lastInfo = info; + this._updateSubscriptions('personal.accountsInfo', null, info); + } + }); + } + + _loggingSubscribe () { + this._subscriber.subscribe('logging', (error, data) => { + if (error || !data) { + return; + } + + switch (data.method) { + case 'personal_importGethAccounts': + case 'personal_newAccount': + case 'personal_newAccountFromPhrase': + case 'personal_newAccountFromWallet': + return this._listAccounts(); + + case 'personal_setAccountName': + case 'personal_setAccountMeta': + return this._accountsInfo(); + } + }); + } +} diff --git a/js/src/api/subscriptions/subscriptions.js b/js/src/api/subscriptions/subscriptions.js index e68689c33ef..fcd67ff9fd5 100644 --- a/js/src/api/subscriptions/subscriptions.js +++ b/js/src/api/subscriptions/subscriptions.js @@ -1,6 +1,8 @@ -import PollEth from './eth'; +import Eth from './eth'; +import Logging from './logging'; +import Personal from './personal'; -const EVENTS = ['eth.blockNumber']; +const EVENTS = ['logging', 'eth_blockNumber']; const ALIASSES = {}; export default class Subscriptions { @@ -18,7 +20,9 @@ export default class Subscriptions { }; }); - this._eth = new PollEth(api, this._updateSubscriptions); + this._logging = new Logging(this._updateSubscriptions); + this._eth = new Eth(this._updateSubscriptions, api); + this._personal = new Personal(this._updateSubscriptions, api, this); } _validateType (_subscriptionName) { diff --git a/js/src/api/transport/jsonRpcBase.js b/js/src/api/transport/jsonRpcBase.js index f41a31ab7d2..59c2d6f06cf 100644 --- a/js/src/api/transport/jsonRpcBase.js +++ b/js/src/api/transport/jsonRpcBase.js @@ -1,3 +1,5 @@ +import { Logging } from '../subscriptions/index'; + export default class JsonRpcBase { constructor () { this._id = 1; @@ -5,12 +7,16 @@ export default class JsonRpcBase { } encode (method, params) { - return JSON.stringify({ + const json = JSON.stringify({ jsonrpc: '2.0', method: method, params: params, id: this._id++ }); + + Logging.send(method, params, json); + + return json; } get id () { diff --git a/js/src/dapps/gavcoin/Application/application.js b/js/src/dapps/gavcoin/Application/application.js index 2a145848023..c8f15d6ddd3 100644 --- a/js/src/dapps/gavcoin/Application/application.js +++ b/js/src/dapps/gavcoin/Application/application.js @@ -214,7 +214,7 @@ export default class Application extends Component { }) }); - api.subscribe('eth.blockNumber', this.onNewBlockNumber); + api.subscribe('eth_blockNumber', this.onNewBlockNumber); }) .catch((error) => { console.error('attachInterface', error); diff --git a/js/src/dapps/tokenreg/Application/application.js b/js/src/dapps/tokenreg/Application/application.js index 18ec0b21363..bf9eeaf51ad 100644 --- a/js/src/dapps/tokenreg/Application/application.js +++ b/js/src/dapps/tokenreg/Application/application.js @@ -101,7 +101,7 @@ export default class Application extends Component { owner }); - api.subscribe('eth.blockNumber', this.onNewBlockNumber); + api.subscribe('eth_blockNumber', this.onNewBlockNumber); }); }) .catch((error) => { From be29ea717d66036998ea0c571b084cb38984dcfe Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 13 Sep 2016 00:27:37 +0200 Subject: [PATCH 0432/1062] accounts & contacts now are provided by a provider (the right way...) --- js/src/api/subscriptions/personal.js | 13 +++-- js/src/api/subscriptions/subscriptions.js | 13 ++++- js/src/index.js | 45 +++++++------- js/src/redux/providers/index.js | 2 + js/src/redux/providers/personal.js | 23 ++++++++ js/src/redux/providers/personalActions.js | 6 ++ js/src/redux/providers/personalReducer.js | 35 +++++++++++ js/src/redux/reducers.js | 5 +- js/src/redux/store.js | 9 ++- js/src/ui/ApiProvider/apiProvider.css | 2 + js/src/ui/ApiProvider/apiProvider.js | 30 ++++++++++ js/src/ui/ApiProvider/index.js | 1 + js/src/ui/index.js | 4 +- js/src/views/Accounts/List/list.js | 11 ++-- js/src/views/Accounts/accounts.js | 31 ++++++++-- js/src/views/Addresses/addresses.js | 31 ++++++++-- js/src/views/Application/application.js | 71 +++-------------------- 17 files changed, 227 insertions(+), 105 deletions(-) create mode 100644 js/src/redux/providers/index.js create mode 100644 js/src/redux/providers/personal.js create mode 100644 js/src/redux/providers/personalActions.js create mode 100644 js/src/redux/providers/personalReducer.js create mode 100644 js/src/ui/ApiProvider/apiProvider.css create mode 100644 js/src/ui/ApiProvider/apiProvider.js create mode 100644 js/src/ui/ApiProvider/index.js diff --git a/js/src/api/subscriptions/personal.js b/js/src/api/subscriptions/personal.js index 0c9bd1efc1b..949ffdedee8 100644 --- a/js/src/api/subscriptions/personal.js +++ b/js/src/api/subscriptions/personal.js @@ -33,13 +33,13 @@ export default class Personal { if (different) { this._lastAccounts = accounts; - this._updateSubscriptions('personal.listAccounts', null, accounts); + this._updateSubscriptions('personal_listAccounts', null, accounts); } }); } _accountsInfo = () => { - this.api.personal + this._api.personal .accountsInfo() .then((info) => { const infoKeys = Object.keys(info); @@ -56,7 +56,7 @@ export default class Personal { if (different) { this._lastInfo = info; - this._updateSubscriptions('personal.accountsInfo', null, info); + this._updateSubscriptions('personal_accountsInfo', null, info); } }); } @@ -72,11 +72,14 @@ export default class Personal { case 'personal_newAccount': case 'personal_newAccountFromPhrase': case 'personal_newAccountFromWallet': - return this._listAccounts(); + this._listAccounts(); + this._accountsInfo(); + return; case 'personal_setAccountName': case 'personal_setAccountMeta': - return this._accountsInfo(); + this._accountsInfo(); + return; } }); } diff --git a/js/src/api/subscriptions/subscriptions.js b/js/src/api/subscriptions/subscriptions.js index fcd67ff9fd5..7de5c181c2a 100644 --- a/js/src/api/subscriptions/subscriptions.js +++ b/js/src/api/subscriptions/subscriptions.js @@ -2,7 +2,12 @@ import Eth from './eth'; import Logging from './logging'; import Personal from './personal'; -const EVENTS = ['logging', 'eth_blockNumber']; +const EVENTS = [ + 'logging', + 'eth_blockNumber', + 'personal_accountsInfo', + 'personal_listAccounts' +]; const ALIASSES = {}; export default class Subscriptions { @@ -39,7 +44,7 @@ export default class Subscriptions { const subscriptionName = this._validateType(_subscriptionName); const subscriptionId = this.subscriptions[subscriptionName].length; const { error, data } = this.values[subscriptionName]; - const [prefix] = subscriptionName.split('.'); + const [prefix] = subscriptionName.split('_'); const engine = this[`_${prefix}`]; this.subscriptions[subscriptionName].push(callback); @@ -77,6 +82,10 @@ export default class Subscriptions { } _updateSubscriptions = (subscriptionName, error, data) => { + if (!this.subscriptions[subscriptionName]) { + throw new Error(`Cannot find entry point for subscriptions of type ${subscriptionName}`); + } + this.values[subscriptionName] = { error, data }; this.subscriptions[subscriptionName].forEach((callback) => { this._sendData(callback, error, data); diff --git a/js/src/index.js b/js/src/index.js index 69b49e60101..fb82f1bf1a9 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -10,8 +10,9 @@ import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; import Web3 from 'web3'; +import Api from './api'; import { initStore } from './redux'; -import { muiTheme } from './ui'; +import { ApiProvider, muiTheme } from './ui'; import { Accounts, Account, Addresses, Address, Application, Contract, Contracts, Dapp, Dapps, Signer, Status } from './views'; // TODO: This is VERY messy, just dumped here to get the Signer going @@ -31,6 +32,8 @@ import './index.html'; es6Promise.polyfill(); injectTapEventPlugin(); +const api = new Api(new Api.Transport.Http('/rpc/')); + // signer function tokenSetter (token, cb) { window.localStorage.setItem('sysuiToken', token); @@ -46,7 +49,7 @@ statusWeb3Extension(web3ws).map((extension) => web3ws._extend(extension)); const web3 = new Web3(new Web3.providers.HttpProvider(process.env.RPC_ADDRESS || '/rpc/')); const ethcoreWeb3 = new StatusEthcoreWeb3(web3); -const store = initStore(ws, tokenSetter, web3); +const store = initStore(api, ws, tokenSetter, web3); // signer new WsDataProvider(store, ws); // eslint-disable-line no-new @@ -61,24 +64,26 @@ const routerHistory = useRouterHistory(createHashHistory)({}); ReactDOM.render( - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + , document.querySelector('#container') diff --git a/js/src/redux/providers/index.js b/js/src/redux/providers/index.js new file mode 100644 index 00000000000..0d8b44e659a --- /dev/null +++ b/js/src/redux/providers/index.js @@ -0,0 +1,2 @@ +export Personal from './personal'; +export personalReducer from './personalReducer'; diff --git a/js/src/redux/providers/personal.js b/js/src/redux/providers/personal.js new file mode 100644 index 00000000000..7369c03daad --- /dev/null +++ b/js/src/redux/providers/personal.js @@ -0,0 +1,23 @@ +import { personalAccountsInfo } from './personalActions'; + +export default class Personal { + constructor (store, api) { + this._api = api; + this._store = store; + } + + start () { + this._subscribeAccountsInfo(); + } + + _subscribeAccountsInfo () { + this._api.subscribe('personal_accountsInfo', (error, accountsInfo) => { + if (error) { + console.error('personal_accountsInfo', error); + return; + } + + this._store.dispatch(personalAccountsInfo(accountsInfo)); + }); + } +} diff --git a/js/src/redux/providers/personalActions.js b/js/src/redux/providers/personalActions.js new file mode 100644 index 00000000000..9895c9d1f3e --- /dev/null +++ b/js/src/redux/providers/personalActions.js @@ -0,0 +1,6 @@ +export function personalAccountsInfo (accountsInfo) { + return { + type: 'personalAccountsInfo', + accountsInfo + }; +} diff --git a/js/src/redux/providers/personalReducer.js b/js/src/redux/providers/personalReducer.js new file mode 100644 index 00000000000..b7096858cca --- /dev/null +++ b/js/src/redux/providers/personalReducer.js @@ -0,0 +1,35 @@ +function personalAccountsInfo (state, action) { + const { accountsInfo } = action; + const accounts = {}; + const contacts = {}; + + Object.keys(accountsInfo).forEach((address) => { + const account = accountsInfo[address]; + const { name, meta, uuid } = account; + + if (uuid) { + accounts[address] = { address, name, meta, uuid }; + } else { + contacts[address] = { address, name, meta }; + } + }); + + console.log(accounts, contacts); + + return Object.assign({}, state, { + accounts, + hasAccounts: Object.keys(accounts).length !== 0, + contacts, + hasContacts: Object.keys(contacts).length !== 0 + }); +} + +export default function personalReducer (state = {}, action) { + switch (action.type) { + case 'personalAccountsInfo': + return personalAccountsInfo(state, action); + + default: + return state; + } +} diff --git a/js/src/redux/reducers.js b/js/src/redux/reducers.js index 99e85232b69..9464212ebba 100644 --- a/js/src/redux/reducers.js +++ b/js/src/redux/reducers.js @@ -1,6 +1,7 @@ import { combineReducers } from 'redux'; import { routerReducer } from 'react-router-redux'; +import { personalReducer } from './providers'; import { errorReducer } from '../ui/Errors'; import { tooltipReducer } from '../ui/Tooltips'; import { nodeStatusReducer } from '../views/Application/Status'; @@ -21,6 +22,8 @@ export default function () { statusMining: statusMiningReducer, statusRpc: statusRpcReducer, statusLogger: statusLoggerReducer, - statusDebug: statusDebugReducer + statusDebug: statusDebugReducer, + + personal: personalReducer }); } diff --git a/js/src/redux/store.js b/js/src/redux/store.js index f029203520d..3c07a5e1928 100644 --- a/js/src/redux/store.js +++ b/js/src/redux/store.js @@ -3,13 +3,18 @@ import { applyMiddleware, createStore } from 'redux'; import initMiddleware from './middleware'; import initReducers from './reducers'; +import { Personal as PersonalProvider } from './providers'; + const storeCreation = window.devToolsExtension ? window.devToolsExtension()(createStore) : createStore; -export default function (signerWs, signerTokenSetter, statusWeb3) { +export default function (api, signerWs, signerTokenSetter, statusWeb3) { const reducers = initReducers(); const middleware = initMiddleware(signerWs, signerTokenSetter, statusWeb3); + const store = applyMiddleware(...middleware)(storeCreation)(reducers); + + new PersonalProvider(store, api).start(); - return applyMiddleware(...middleware)(storeCreation)(reducers); + return store; } diff --git a/js/src/ui/ApiProvider/apiProvider.css b/js/src/ui/ApiProvider/apiProvider.css new file mode 100644 index 00000000000..ce505cc267b --- /dev/null +++ b/js/src/ui/ApiProvider/apiProvider.css @@ -0,0 +1,2 @@ +.api { +} diff --git a/js/src/ui/ApiProvider/apiProvider.js b/js/src/ui/ApiProvider/apiProvider.js new file mode 100644 index 00000000000..0a02d0bdbf9 --- /dev/null +++ b/js/src/ui/ApiProvider/apiProvider.js @@ -0,0 +1,30 @@ +import React, { Component, PropTypes } from 'react'; + +import styles from './apiProvider.css'; + +export default class ApiProvider extends Component { + static propTypes = { + api: PropTypes.object.isRequired, + children: PropTypes.node.isRequired + } + + static childContextTypes = { + api: PropTypes.object + } + + render () { + const { children } = this.props; + + return ( +
    { children }
    + ); + } + + getChildContext () { + const { api } = this.props; + + return { + api + }; + } +} diff --git a/js/src/ui/ApiProvider/index.js b/js/src/ui/ApiProvider/index.js new file mode 100644 index 00000000000..7897c879e94 --- /dev/null +++ b/js/src/ui/ApiProvider/index.js @@ -0,0 +1 @@ +export default from './apiProvider'; diff --git a/js/src/ui/index.js b/js/src/ui/index.js index c653b72a33a..6306de2079f 100644 --- a/js/src/ui/index.js +++ b/js/src/ui/index.js @@ -1,5 +1,6 @@ import Actionbar from './Actionbar'; -import Badge from './badge'; +import ApiProvider from './ApiProvider'; +import Badge from './Badge'; import Balances from './Balances'; import Container, { Title as ContainerTitle } from './Container'; import Errors from './Errors'; @@ -13,6 +14,7 @@ import Tooltips, { Tooltip } from './Tooltips'; export { Actionbar, + ApiProvider, Badge, Balances, Container, diff --git a/js/src/views/Accounts/List/list.js b/js/src/views/Accounts/List/list.js index 9cf2afddd4c..f9e8b0d27f0 100644 --- a/js/src/views/Accounts/List/list.js +++ b/js/src/views/Accounts/List/list.js @@ -7,7 +7,7 @@ import styles from './list.css'; export default class List extends Component { static propTypes = { - accounts: PropTypes.array, + accounts: PropTypes.object, contact: PropTypes.bool }; @@ -21,8 +21,9 @@ export default class List extends Component { renderAccounts () { const { accounts, contact } = this.props; + const keys = Object.keys(accounts || {}); - if (!accounts || !accounts.length) { + if (!keys.length) { return (
    @@ -32,11 +33,13 @@ export default class List extends Component { ); } - return accounts.map((account, idx) => { + return keys.map((address, idx) => { + const account = accounts[address]; + return (
    + key={ address }> diff --git a/js/src/views/Accounts/accounts.js b/js/src/views/Accounts/accounts.js index e895f7561c2..8511ba6059b 100644 --- a/js/src/views/Accounts/accounts.js +++ b/js/src/views/Accounts/accounts.js @@ -1,4 +1,6 @@ import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; import { FlatButton } from 'material-ui'; import ContentAdd from 'material-ui/svg-icons/content/add'; @@ -8,10 +10,13 @@ import { Actionbar, Page, Tooltip } from '../../ui'; import styles from './accounts.css'; -export default class Accounts extends Component { +class Accounts extends Component { static contextTypes = { - api: PropTypes.object, - accounts: PropTypes.array + api: PropTypes.object + } + + static propTypes = { + accounts: PropTypes.object } state = { @@ -20,7 +25,7 @@ export default class Accounts extends Component { } render () { - const { accounts } = this.context; + const { accounts } = this.props; return (
    @@ -86,3 +91,21 @@ export default class Accounts extends Component { onNewAccountUpdate = () => { } } + +function mapStateToProps (state) { + const { accounts, hasAccounts } = state.personal; + + return { + accounts, + hasAccounts + }; +} + +function mapDispatchToProps (dispatch) { + return bindActionCreators({}, dispatch); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(Accounts); diff --git a/js/src/views/Addresses/addresses.js b/js/src/views/Addresses/addresses.js index 19af6fc092d..4e408e8c68e 100644 --- a/js/src/views/Addresses/addresses.js +++ b/js/src/views/Addresses/addresses.js @@ -1,4 +1,6 @@ import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; import { FlatButton } from 'material-ui'; import ContentAdd from 'material-ui/svg-icons/content/add'; @@ -8,10 +10,13 @@ import { Actionbar, Page } from '../../ui'; import styles from './addresses.css'; -export default class Addresses extends Component { +class Addresses extends Component { static contextTypes = { - api: PropTypes.object, - contacts: PropTypes.array + api: PropTypes.object + } + + static propTypes = { + contacts: PropTypes.object } state = { @@ -19,7 +24,7 @@ export default class Addresses extends Component { } render () { - const { contacts } = this.context; + const { contacts } = this.props; return (
    @@ -88,3 +93,21 @@ export default class Addresses extends Component { } } } + +function mapStateToProps (state) { + const { contacts, hasContacts } = state.personal; + + return { + contacts, + hasContacts + }; +} + +function mapDispatchToProps (dispatch) { + return bindActionCreators({}, dispatch); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(Addresses); diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index 14398c05b27..e3da387a5c1 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -3,7 +3,6 @@ import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; -import Api from '../../api'; import { eip20Abi, registryAbi, tokenRegAbi } from '../../util/abi'; import Container from './Container'; @@ -17,7 +16,6 @@ import imagesEthereum56 from '../../images/contracts/ethereum-56.png'; import imagesGavcoin32 from '../../images/contracts/gavcoin-32.png'; import imagesGavcoin56 from '../../images/contracts/gavcoin-56.png'; -const api = new Api(new Api.Transport.Http('/rpc/')); const inFrame = window.parent !== window && window.parent.frames.length !== 0; // TODO: Images should not be imported like this, should be via the content from GitHubHint contract (here until it is ready) @@ -41,13 +39,16 @@ let lastBlockNumber = new BigNumber(-1); class Application extends Component { static childContextTypes = { - api: PropTypes.object, accounts: PropTypes.array, balances: PropTypes.object, contacts: PropTypes.array, tokens: PropTypes.array } + static contextTypes = { + api: PropTypes.object.isRequired + } + static propTypes = { children: PropTypes.node, netChain: PropTypes.string, @@ -66,7 +67,6 @@ class Application extends Component { } componentWillMount () { - this.retrieveAccounts(); this.retrieveTokens(); this.pollStatus(); } @@ -106,7 +106,6 @@ class Application extends Component { const { accounts, balances, contacts, tokens } = this.state; return { - api, accounts, balances, contacts, @@ -114,64 +113,8 @@ class Application extends Component { }; } - retrieveAccounts = () => { - let { showFirstRun } = this.state; - const nextTimeout = () => setTimeout(this.retrieveAccounts, 1000); - - Promise - .all([ - api.personal.listAccounts(), - api.personal.accountsInfo() - ]) - .then(([addresses, infos]) => { - const contacts = []; - const accounts = []; - - Object.keys(infos).forEach((address) => { - const { name, meta, uuid } = infos[address]; - - if (uuid) { - const account = this.state.accounts.find((_account) => _account.uuid === uuid) || { - address, - uuid - }; - - accounts.push(Object.assign(account, { - meta, - name - })); - } else { - const contact = this.state.contacts.find((_contact) => _contact.address === address) || { - address - }; - - contacts.push(Object.assign(contact, { - meta, - name - })); - } - }); - - if (!accounts.length) { - showFirstRun = true; - } - - this.setState({ - accounts, - contacts, - showFirstRun - }, this.retrieveBalances); - - nextTimeout(); - }) - .catch((error) => { - console.error('retrieveAccounts', error); - - nextTimeout(); - }); - } - retrieveBalances = () => { + const { api } = this.context; const { accounts, contacts, tokens } = this.state; const balances = {}; const addresses = accounts.concat(contacts).map((account) => account.address); @@ -230,6 +173,7 @@ class Application extends Component { } retrieveTokens = () => { + const { api } = this.context; api.ethcore .registryAddress() .then((registryAddress) => { @@ -274,6 +218,7 @@ class Application extends Component { } pollStatus () { + const { api } = this.context; const { onUpdateNodeStatus } = this.props; const nextTimeout = () => setTimeout(() => this.pollStatus(), 1000); @@ -320,9 +265,11 @@ class Application extends Component { function mapStateToProps (state) { const { netChain, isTest } = state.nodeStatus; + const { hasAccounts } = state.personal; const { pending } = state.signerRequests; return { + hasAccounts, netChain, isTest, pending From 84b38040be211fa0504a5de4f6d39ea299faa966 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 13 Sep 2016 01:45:23 +0200 Subject: [PATCH 0433/1062] continue split of ugly context out into provider (balances, accounts, contacts) --- js/src/redux/providers/balances.js | 155 +++++++++++++++++++++ js/src/redux/providers/balancesActions.js | 13 ++ js/src/redux/providers/balancesReducer.js | 24 ++++ js/src/redux/providers/index.js | 3 + js/src/redux/providers/personalReducer.js | 2 - js/src/redux/reducers.js | 4 +- js/src/redux/store.js | 3 +- js/src/ui/Balances/balances.js | 39 ++++-- js/src/views/Accounts/List/list.js | 10 +- js/src/views/Accounts/accounts.js | 9 +- js/src/views/Addresses/addresses.js | 8 +- js/src/views/Application/application.js | 162 +--------------------- 12 files changed, 241 insertions(+), 191 deletions(-) create mode 100644 js/src/redux/providers/balances.js create mode 100644 js/src/redux/providers/balancesActions.js create mode 100644 js/src/redux/providers/balancesReducer.js diff --git a/js/src/redux/providers/balances.js b/js/src/redux/providers/balances.js new file mode 100644 index 00000000000..22b6073895d --- /dev/null +++ b/js/src/redux/providers/balances.js @@ -0,0 +1,155 @@ +import { getBalances, getTokens } from './balancesActions'; + +import { eip20Abi, registryAbi, tokenRegAbi } from '../../util/abi'; + +import imagesEthereum32 from '../../images/contracts/ethereum-32.png'; +import imagesEthereum56 from '../../images/contracts/ethereum-56.png'; +import imagesGavcoin32 from '../../images/contracts/gavcoin-32.png'; +import imagesGavcoin56 from '../../images/contracts/gavcoin-56.png'; + +// TODO: Images should not be imported like this, should be via the content from GitHubHint contract (here until it is ready) +const images = { + ethereum: { + small: imagesEthereum32, + normal: imagesEthereum56 + }, + gavcoin: { + small: imagesGavcoin32, + normal: imagesGavcoin56 + } +}; + +const ETH = { + name: 'Ethereum', + tag: 'ΞTH', + images: images.ethereum +}; + +export default class Balances { + constructor (store, api) { + this._api = api; + this._store = store; + this._accountsInfo = null; + } + + start () { + this._subscribeBlockNumber(); + this._subscribeAccountsInfo(); + } + + _subscribeAccountsInfo () { + this._api.subscribe('personal_accountsInfo', (error, accountsInfo) => { + if (error) { + return; + } + + this._accountsInfo = accountsInfo; + this._retrieveBalances(); + }); + } + + _subscribeBlockNumber () { + this._api.subscribe('eth_blockNumber', (error) => { + if (error) { + return; + } + + this._retrieveTokens(); + }); + } + + _retrieveTokens () { + this._api.ethcore + .registryAddress() + .then((registryAddress) => { + const registry = this._api.newContract(registryAbi, registryAddress); + + return registry.instance.getAddress.call({}, [this._api.format.sha3('tokenreg'), 'A']); + }) + .then((tokenregAddress) => { + const tokenreg = this._api.newContract(tokenRegAbi, tokenregAddress); + + return tokenreg.instance.tokenCount + .call() + .then((numTokens) => { + const promises = []; + + while (promises.length < numTokens.toNumber()) { + promises.push(tokenreg.instance.token.call({}, [promises.length])); + } + + return Promise.all(promises); + }); + }) + .then((tokens) => { + this._tokens = tokens.map((token) => { + const [address, tag, format, name] = token; + + return { + address, + name, + tag, + format: format.toString(), + images: images[name.toLowerCase()], + contract: this._api.newContract(eip20Abi, address) + }; + }); + + this._store.dispatch(getTokens(this._tokens)); + this._retrieveBalances(); + }); + } + + _retrieveBalances () { + if (!this._accountsInfo || !this._tokens) { + return; + } + + const addresses = Object.keys(this._accountsInfo); + this._balances = {}; + + Promise + .all( + addresses.map((address) => Promise.all([ + this._api.eth.getBalance(address), + this._api.eth.getTransactionCount(address) + ])) + ) + .then((balanceTxCount) => { + return Promise.all( + balanceTxCount.map(([value, txCount], idx) => { + const address = addresses[idx]; + + this._balances[address] = { + txCount, + tokens: [{ + token: ETH, + value + }] + }; + + return Promise.all( + this._tokens.map((token) => { + return token.contract.instance.balanceOf.call({}, [address]); + }) + ); + }) + ); + }) + .then((tokenBalances) => { + addresses.forEach((address, idx) => { + const balanceOf = tokenBalances[idx]; + const balance = this._balances[address]; + + this._tokens.forEach((token, tidx) => { + balance.tokens.push({ + token, + value: balanceOf[tidx].toString() + }); + }); + }); + + this._store.dispatch(getBalances(this._balances)); + }); + } +} diff --git a/js/src/redux/providers/balancesActions.js b/js/src/redux/providers/balancesActions.js new file mode 100644 index 00000000000..1897d081791 --- /dev/null +++ b/js/src/redux/providers/balancesActions.js @@ -0,0 +1,13 @@ +export function getBalances (balances) { + return { + type: 'getBalances', + balances + }; +} + +export function getTokens (tokens) { + return { + type: 'getTokens', + tokens + }; +} diff --git a/js/src/redux/providers/balancesReducer.js b/js/src/redux/providers/balancesReducer.js new file mode 100644 index 00000000000..528b7d2f740 --- /dev/null +++ b/js/src/redux/providers/balancesReducer.js @@ -0,0 +1,24 @@ +function getBalances (state, action) { + const { balances } = action; + + return Object.assign({}, state, { balances }); +} + +function getTokens (state, action) { + const { tokens } = action; + + return Object.assign({}, state, { tokens }); +} + +export default function balancesReducer (state = {}, action) { + switch (action.type) { + case 'getBalances': + return getBalances(state, action); + + case 'getTokens': + return getTokens(state, action); + + default: + return state; + } +} diff --git a/js/src/redux/providers/index.js b/js/src/redux/providers/index.js index 0d8b44e659a..ac9f7b15ae0 100644 --- a/js/src/redux/providers/index.js +++ b/js/src/redux/providers/index.js @@ -1,2 +1,5 @@ +export Balances from './balances'; export Personal from './personal'; + +export balancesReducer from './balancesReducer'; export personalReducer from './personalReducer'; diff --git a/js/src/redux/providers/personalReducer.js b/js/src/redux/providers/personalReducer.js index b7096858cca..300ad1f953e 100644 --- a/js/src/redux/providers/personalReducer.js +++ b/js/src/redux/providers/personalReducer.js @@ -14,8 +14,6 @@ function personalAccountsInfo (state, action) { } }); - console.log(accounts, contacts); - return Object.assign({}, state, { accounts, hasAccounts: Object.keys(accounts).length !== 0, diff --git a/js/src/redux/reducers.js b/js/src/redux/reducers.js index 9464212ebba..1a34d195dba 100644 --- a/js/src/redux/reducers.js +++ b/js/src/redux/reducers.js @@ -1,7 +1,8 @@ import { combineReducers } from 'redux'; import { routerReducer } from 'react-router-redux'; -import { personalReducer } from './providers'; +import { balancesReducer, personalReducer } from './providers'; + import { errorReducer } from '../ui/Errors'; import { tooltipReducer } from '../ui/Tooltips'; import { nodeStatusReducer } from '../views/Application/Status'; @@ -24,6 +25,7 @@ export default function () { statusLogger: statusLoggerReducer, statusDebug: statusDebugReducer, + balances: balancesReducer, personal: personalReducer }); } diff --git a/js/src/redux/store.js b/js/src/redux/store.js index 3c07a5e1928..2a1fd1b93ea 100644 --- a/js/src/redux/store.js +++ b/js/src/redux/store.js @@ -3,7 +3,7 @@ import { applyMiddleware, createStore } from 'redux'; import initMiddleware from './middleware'; import initReducers from './reducers'; -import { Personal as PersonalProvider } from './providers'; +import { Balances as BalancesProvider, Personal as PersonalProvider } from './providers'; const storeCreation = window.devToolsExtension ? window.devToolsExtension()(createStore) @@ -15,6 +15,7 @@ export default function (api, signerWs, signerTokenSetter, statusWeb3) { const store = applyMiddleware(...middleware)(storeCreation)(reducers); new PersonalProvider(store, api).start(); + new BalancesProvider(store, api).start(); return store; } diff --git a/js/src/ui/Balances/balances.js b/js/src/ui/Balances/balances.js index 5493155b303..58a41fbd5f1 100644 --- a/js/src/ui/Balances/balances.js +++ b/js/src/ui/Balances/balances.js @@ -1,29 +1,29 @@ import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; import styles from './balances.css'; -export default class Balances extends Component { +class Balances extends Component { static contextTypes = { - api: PropTypes.object, - balances: PropTypes.object + api: PropTypes.object } static propTypes = { account: PropTypes.object, - onChange: PropTypes.func + balances: PropTypes.object } render () { - const { api, balances } = this.context; - const { account } = this.props; - const balance = balances[account.address]; + const { api } = this.context; + const { account, balances } = this.props; - if (!balance) { + if (!balances[account.address]) { return null; } - let body = balance.tokens + let body = balances[account.address].tokens .filter((balance) => new BigNumber(balance.value).gt(0)) .map((balance) => { const token = balance.token; @@ -57,12 +57,21 @@ export default class Balances extends Component {
    ); } +} - updateParent = () => { - if (!this.props.onChange) { - return; - } +function mapStateToProps (state) { + const { balances } = state.balances; - this.props.onChange(this.state.balances); - } + return { + balances + }; +} + +function mapDispatchToProps (dispatch) { + return bindActionCreators({}, dispatch); } + +export default connect( + mapStateToProps, + mapDispatchToProps +)(Balances); diff --git a/js/src/views/Accounts/List/list.js b/js/src/views/Accounts/List/list.js index f9e8b0d27f0..6fc241f57e3 100644 --- a/js/src/views/Accounts/List/list.js +++ b/js/src/views/Accounts/List/list.js @@ -8,7 +8,8 @@ import styles from './list.css'; export default class List extends Component { static propTypes = { accounts: PropTypes.object, - contact: PropTypes.bool + contact: PropTypes.bool, + empty: PropTypes.bool }; render () { @@ -20,10 +21,9 @@ export default class List extends Component { } renderAccounts () { - const { accounts, contact } = this.props; - const keys = Object.keys(accounts || {}); + const { accounts, contact, empty } = this.props; - if (!keys.length) { + if (empty) { return (
    @@ -33,7 +33,7 @@ export default class List extends Component { ); } - return keys.map((address, idx) => { + return Object.keys(accounts).map((address, idx) => { const account = accounts[address]; return ( diff --git a/js/src/views/Accounts/accounts.js b/js/src/views/Accounts/accounts.js index 8511ba6059b..afaa373c97f 100644 --- a/js/src/views/Accounts/accounts.js +++ b/js/src/views/Accounts/accounts.js @@ -16,7 +16,8 @@ class Accounts extends Component { } static propTypes = { - accounts: PropTypes.object + accounts: PropTypes.object, + hasAccounts: PropTypes.bool } state = { @@ -25,14 +26,16 @@ class Accounts extends Component { } render () { - const { accounts } = this.props; + const { accounts, hasAccounts } = this.props; return (
    { this.renderNewDialog() } { this.renderActionbar() } - + diff --git a/js/src/views/Addresses/addresses.js b/js/src/views/Addresses/addresses.js index 4e408e8c68e..772e81f5dd2 100644 --- a/js/src/views/Addresses/addresses.js +++ b/js/src/views/Addresses/addresses.js @@ -16,7 +16,8 @@ class Addresses extends Component { } static propTypes = { - contacts: PropTypes.object + contacts: PropTypes.object, + hasContacts: PropTypes.bool } state = { @@ -24,7 +25,7 @@ class Addresses extends Component { } render () { - const { contacts } = this.props; + const { contacts, hasContacts } = this.props; return (
    @@ -33,7 +34,8 @@ class Addresses extends Component { + accounts={ contacts } + empty={ !hasContacts } />
    ); diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index e3da387a5c1..43a450a6f4f 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -1,50 +1,16 @@ -import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; -import { eip20Abi, registryAbi, tokenRegAbi } from '../../util/abi'; - import Container from './Container'; import DappContainer from './DappContainer'; import FrameError from './FrameError'; import Status, { updateNodeStatus } from './Status'; import TabBar from './TabBar'; -import imagesEthereum32 from '../../images/contracts/ethereum-32.png'; -import imagesEthereum56 from '../../images/contracts/ethereum-56.png'; -import imagesGavcoin32 from '../../images/contracts/gavcoin-32.png'; -import imagesGavcoin56 from '../../images/contracts/gavcoin-56.png'; - const inFrame = window.parent !== window && window.parent.frames.length !== 0; -// TODO: Images should not be imported like this, should be via the content from GitHubHint contract (here until it is ready) -const images = { - ethereum: { - small: imagesEthereum32, - normal: imagesEthereum56 - }, - gavcoin: { - small: imagesGavcoin32, - normal: imagesGavcoin56 - } -}; -const ETH_TOKEN = { - images: images.ethereum, - name: 'Ethereum', - tag: 'ΞTH' -}; - -let lastBlockNumber = new BigNumber(-1); - class Application extends Component { - static childContextTypes = { - accounts: PropTypes.array, - balances: PropTypes.object, - contacts: PropTypes.array, - tokens: PropTypes.array - } - static contextTypes = { api: PropTypes.object.isRequired } @@ -58,16 +24,10 @@ class Application extends Component { } state = { - showFirstRun: false, - accounts: [], - balances: {}, - contacts: [], - contracts: [], - tokens: [] + showFirstRun: false } componentWillMount () { - this.retrieveTokens(); this.pollStatus(); } @@ -102,121 +62,6 @@ class Application extends Component { ); } - getChildContext () { - const { accounts, balances, contacts, tokens } = this.state; - - return { - accounts, - balances, - contacts, - tokens - }; - } - - retrieveBalances = () => { - const { api } = this.context; - const { accounts, contacts, tokens } = this.state; - const balances = {}; - const addresses = accounts.concat(contacts).map((account) => account.address); - - return Promise - .all( - addresses.map((address) => { - return Promise.all([ - api.eth.getBalance(address), - api.eth.getTransactionCount(address) - ]); - }) - ) - .then((balancesTxCounts) => { - return Promise.all( - balancesTxCounts.map(([balance, txCount], idx) => { - const address = addresses[idx]; - const { isTest } = this.props; - - balances[address] = { - txCount: txCount.sub(isTest ? 0x100000 : 0), - tokens: [{ - token: ETH_TOKEN, - value: balance.toString() - }] - }; - - return Promise.all( - tokens.map((token) => { - return token.contract.instance.balanceOf.call({}, [address]); - }) - ); - }) - ); - }) - .then((tokenBalances) => { - addresses.forEach((address, idx) => { - const balanceOf = tokenBalances[idx]; - const balance = balances[address]; - - tokens.forEach((token, tidx) => { - balance.tokens.push({ - token, - value: balanceOf[tidx].toString() - }); - }); - }); - - this.setState({ - balances - }); - }) - .catch((error) => { - console.error('retrieveBalances', error); - }); - } - - retrieveTokens = () => { - const { api } = this.context; - api.ethcore - .registryAddress() - .then((registryAddress) => { - const registry = api.newContract(registryAbi, registryAddress); - - return registry.instance.getAddress.call({}, [api.format.sha3('tokenreg'), 'A']); - }) - .then((tokenregAddress) => { - const tokenreg = api.newContract(tokenRegAbi, tokenregAddress); - - return tokenreg.instance.tokenCount - .call() - .then((numTokens) => { - const promises = []; - - while (promises.length < numTokens.toNumber()) { - promises.push(tokenreg.instance.token.call({}, [promises.length])); - } - - return Promise.all(promises); - }); - }) - .then((tokens) => { - this.setState({ - tokens: tokens.map((token) => { - const [address, tag, format, name] = token; - - return { - address, - name, - tag, - format: format.toString(), - images: images[name.toLowerCase()], - contract: api.newContract(eip20Abi, address) - }; - }) - }, this.retrieveBalances); - }) - .catch((error) => { - console.error('retrieveTokens', error); - }); - } - pollStatus () { const { api } = this.context; const { onUpdateNodeStatus } = this.props; @@ -242,11 +87,6 @@ class Application extends Component { syncing }); - if (blockNumber.gt(lastBlockNumber)) { - lastBlockNumber = blockNumber; - this.retrieveBalances(); - } - nextTimeout(); }) .catch((error) => { From f2c97f2be81b220547e383e7e2c331142e0a2e1f Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 13 Sep 2016 01:57:36 +0200 Subject: [PATCH 0434/1062] list pages work now with accounts & balances via providers --- .../balances.css => Balance/balance.css} | 0 .../balances.js => Balance/balance.js} | 34 +++---------------- js/src/ui/Balance/index.js | 1 + js/src/ui/Balances/index.js | 1 - js/src/ui/index.js | 4 +-- js/src/views/Account/Header/header.js | 4 +-- js/src/views/Accounts/List/list.js | 7 ++-- js/src/views/Accounts/Summary/summary.js | 10 +++--- js/src/views/Accounts/accounts.js | 10 ++++-- js/src/views/Addresses/addresses.js | 6 +++- 10 files changed, 32 insertions(+), 45 deletions(-) rename js/src/ui/{Balances/balances.css => Balance/balance.css} (100%) rename js/src/ui/{Balances/balances.js => Balance/balance.js} (63%) create mode 100644 js/src/ui/Balance/index.js delete mode 100644 js/src/ui/Balances/index.js diff --git a/js/src/ui/Balances/balances.css b/js/src/ui/Balance/balance.css similarity index 100% rename from js/src/ui/Balances/balances.css rename to js/src/ui/Balance/balance.css diff --git a/js/src/ui/Balances/balances.js b/js/src/ui/Balance/balance.js similarity index 63% rename from js/src/ui/Balances/balances.js rename to js/src/ui/Balance/balance.js index 58a41fbd5f1..939f201381f 100644 --- a/js/src/ui/Balances/balances.js +++ b/js/src/ui/Balance/balance.js @@ -1,29 +1,22 @@ import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; -import { connect } from 'react-redux'; -import { bindActionCreators } from 'redux'; -import styles from './balances.css'; +import styles from './balance.css'; -class Balances extends Component { +export default class Balance extends Component { static contextTypes = { api: PropTypes.object } static propTypes = { - account: PropTypes.object, - balances: PropTypes.object + balance: PropTypes.object.isRequired } render () { const { api } = this.context; - const { account, balances } = this.props; + const { balance } = this.props; - if (!balances[account.address]) { - return null; - } - - let body = balances[account.address].tokens + let body = balance.tokens .filter((balance) => new BigNumber(balance.value).gt(0)) .map((balance) => { const token = balance.token; @@ -58,20 +51,3 @@ class Balances extends Component { ); } } - -function mapStateToProps (state) { - const { balances } = state.balances; - - return { - balances - }; -} - -function mapDispatchToProps (dispatch) { - return bindActionCreators({}, dispatch); -} - -export default connect( - mapStateToProps, - mapDispatchToProps -)(Balances); diff --git a/js/src/ui/Balance/index.js b/js/src/ui/Balance/index.js new file mode 100644 index 00000000000..3d9ac265646 --- /dev/null +++ b/js/src/ui/Balance/index.js @@ -0,0 +1 @@ +export default from './balance'; diff --git a/js/src/ui/Balances/index.js b/js/src/ui/Balances/index.js deleted file mode 100644 index 434a9315efb..00000000000 --- a/js/src/ui/Balances/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './balances'; diff --git a/js/src/ui/index.js b/js/src/ui/index.js index 6306de2079f..1245fbe0205 100644 --- a/js/src/ui/index.js +++ b/js/src/ui/index.js @@ -1,7 +1,7 @@ import Actionbar from './Actionbar'; import ApiProvider from './ApiProvider'; import Badge from './Badge'; -import Balances from './Balances'; +import Balance from './Balances'; import Container, { Title as ContainerTitle } from './Container'; import Errors from './Errors'; import Form, { FormWrap, Input, InputAddress, InputAddressSelect, InputInline, Select } from './Form'; @@ -16,7 +16,7 @@ export { Actionbar, ApiProvider, Badge, - Balances, + Balance, Container, ContainerTitle, Errors, diff --git a/js/src/views/Account/Header/header.js b/js/src/views/Account/Header/header.js index 21a4aae3a33..952d0c7195e 100644 --- a/js/src/views/Account/Header/header.js +++ b/js/src/views/Account/Header/header.js @@ -1,7 +1,7 @@ import React, { Component, PropTypes } from 'react'; import ContentCreate from 'material-ui/svg-icons/content/create'; -import { Balances, Container, ContainerTitle, Form, InputInline, IdentityIcon } from '../../../ui'; +import { Balance, Container, ContainerTitle, Form, InputInline, IdentityIcon } from '../../../ui'; import styles from './header.css'; @@ -58,7 +58,7 @@ export default class Header extends Component { { this.renderTxCount(balance) }
    -
    diff --git a/js/src/views/Accounts/List/list.js b/js/src/views/Accounts/List/list.js index 6fc241f57e3..31a0d1737d3 100644 --- a/js/src/views/Accounts/List/list.js +++ b/js/src/views/Accounts/List/list.js @@ -8,6 +8,7 @@ import styles from './list.css'; export default class List extends Component { static propTypes = { accounts: PropTypes.object, + balances: PropTypes.object, contact: PropTypes.bool, empty: PropTypes.bool }; @@ -21,7 +22,7 @@ export default class List extends Component { } renderAccounts () { - const { accounts, contact, empty } = this.props; + const { accounts, balances, contact, empty } = this.props; if (empty) { return ( @@ -35,6 +36,7 @@ export default class List extends Component { return Object.keys(accounts).map((address, idx) => { const account = accounts[address]; + const balance = balances[address]; return (
    + account={ account } + balance={ balance } />
    ); }); diff --git a/js/src/views/Accounts/Summary/summary.js b/js/src/views/Accounts/Summary/summary.js index 697890bfc27..0b48019c1c3 100644 --- a/js/src/views/Accounts/Summary/summary.js +++ b/js/src/views/Accounts/Summary/summary.js @@ -1,8 +1,7 @@ import React, { Component, PropTypes } from 'react'; import { Link } from 'react-router'; -import Balances from '../../../ui/Balances'; -import { Container, ContainerTitle, IdentityIcon } from '../../../ui'; +import { Balance, Container, ContainerTitle, IdentityIcon } from '../../../ui'; export default class Summary extends Component { static contextTypes = { @@ -11,6 +10,7 @@ export default class Summary extends Component { static propTypes = { account: PropTypes.object.isRequired, + balance: PropTypes.object.isRequired, contact: PropTypes.bool, children: PropTypes.node } @@ -20,7 +20,7 @@ export default class Summary extends Component { } render () { - const { account, children, contact } = this.props; + const { account, balance, children, contact } = this.props; if (!account) { return null; @@ -35,8 +35,8 @@ export default class Summary extends Component { { account.name || 'Unnamed' } } byline={ account.address } /> - + { children } ); diff --git a/js/src/views/Accounts/accounts.js b/js/src/views/Accounts/accounts.js index afaa373c97f..b465553af35 100644 --- a/js/src/views/Accounts/accounts.js +++ b/js/src/views/Accounts/accounts.js @@ -17,7 +17,8 @@ class Accounts extends Component { static propTypes = { accounts: PropTypes.object, - hasAccounts: PropTypes.bool + hasAccounts: PropTypes.bool, + balances: PropTypes.object } state = { @@ -26,7 +27,7 @@ class Accounts extends Component { } render () { - const { accounts, hasAccounts } = this.props; + const { accounts, hasAccounts, balances } = this.props; return (
    @@ -35,6 +36,7 @@ class Accounts extends Component { @@ -35,6 +36,7 @@ class Addresses extends Component {
    @@ -97,9 +99,11 @@ class Addresses extends Component { } function mapStateToProps (state) { + const { balances } = state.balances; const { contacts, hasContacts } = state.personal; return { + balances, contacts, hasContacts }; From f1acde9aaaf732ef54c410de7225bf90554bec82 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 13 Sep 2016 08:23:12 +0200 Subject: [PATCH 0435/1062] status provider now caters for all the node details (as used in Status view as well) --- js/src/redux/providers/index.js | 2 + js/src/redux/providers/status.js | 92 +++++++++++++++++++++ js/src/redux/providers/statusActions.js | 20 +++++ js/src/redux/providers/statusReducer.js | 33 ++++++++ js/src/redux/reducers.js | 29 +++++-- js/src/redux/store.js | 9 +- js/src/ui/index.js | 4 +- js/src/views/Application/Status/actions.js | 6 -- js/src/views/Application/Status/index.js | 8 -- js/src/views/Application/Status/reducers.js | 21 ----- js/src/views/Application/application.js | 44 +++------- 11 files changed, 187 insertions(+), 81 deletions(-) create mode 100644 js/src/redux/providers/status.js create mode 100644 js/src/redux/providers/statusActions.js create mode 100644 js/src/redux/providers/statusReducer.js delete mode 100644 js/src/views/Application/Status/actions.js delete mode 100644 js/src/views/Application/Status/reducers.js diff --git a/js/src/redux/providers/index.js b/js/src/redux/providers/index.js index ac9f7b15ae0..52f1139be2b 100644 --- a/js/src/redux/providers/index.js +++ b/js/src/redux/providers/index.js @@ -1,5 +1,7 @@ export Balances from './balances'; export Personal from './personal'; +export Status from './status'; export balancesReducer from './balancesReducer'; export personalReducer from './personalReducer'; +export statusReducer from './statusReducer'; diff --git a/js/src/redux/providers/status.js b/js/src/redux/providers/status.js new file mode 100644 index 00000000000..2b567986d66 --- /dev/null +++ b/js/src/redux/providers/status.js @@ -0,0 +1,92 @@ +import { statusBlockNumber, statusCollection, statusLogs } from './statusActions'; + +export default class Status { + constructor (store, api) { + this._api = api; + this._store = store; + this._status = null; + } + + start () { + this._subscribeBlockNumber(); + this._pollStatus(); + this._pollLogs(); + } + + _subscribeBlockNumber () { + this._api.subscribe('eth_blockNumber', (error, blockNumber) => { + if (error) { + return; + } + + this._store.dispatch(statusBlockNumber(blockNumber)); + }); + } + + _pollStatus = () => { + const nextTimeout = () => setTimeout(this._pollStatus, 1000); + + Promise + .all([ + this._api.web3.clientVersion(), + this._api.eth.coinbase(), + this._api.ethcore.defaultExtraData(), + this._api.ethcore.extraData(), + this._api.ethcore.gasFloorTarget(), + this._api.eth.hashrate(), + this._api.ethcore.minGasPrice(), + this._api.ethcore.netChain(), + this._api.ethcore.netPeers(), + this._api.ethcore.netPort(), + this._api.ethcore.nodeName(), + this._api.ethcore.rpcSettings(), + this._api.eth.syncing() + ]) + .then(([clientVersion, coinbase, defaultExtraData, extraData, gasFloorTarget, hashrate, minGasPrice, netChain, netPeers, netPort, nodeName, rpcSettings, syncing]) => { + const isTest = netChain === 'morden' || netChain === 'testnet'; + + nextTimeout(); + this._store.dispatch(statusCollection({ + clientVersion, + coinbase, + defaultExtraData, + extraData, + gasFloorTarget, + hashrate, + minGasPrice, + netChain, + netPeers, + netPort, + nodeName, + rpcSettings, + syncing, + isTest + })); + }) + .catch((error) => { + console.error('_pollStatus', error); + nextTimeout(); + }); + } + + _pollLogs = () => { + const nextTimeout = () => setTimeout(this._pollStatus, 1000); + + Promise + .all([ + this._api.ethcore.devLogs(), + this._api.ethcore.devLogsLevels() + ]) + .then(([devLogs, devLogsLevels]) => { + nextTimeout(); + this._store.dispatch(statusLogs({ + devLogs, + devLogsLevels + })); + }) + .catch((error) => { + console.error('_pollLogs', error); + nextTimeout(); + }); + } +} diff --git a/js/src/redux/providers/statusActions.js b/js/src/redux/providers/statusActions.js new file mode 100644 index 00000000000..23d416f6d3f --- /dev/null +++ b/js/src/redux/providers/statusActions.js @@ -0,0 +1,20 @@ +export function statusBlockNumber (blockNumber) { + return { + type: 'statusBlockNumber', + blockNumber + }; +} + +export function statusCollection (collection) { + return { + type: 'statusCollection', + collection + }; +} + +export function statusLogs (logInfo) { + return { + type: 'statusLogs', + logInfo + }; +} diff --git a/js/src/redux/providers/statusReducer.js b/js/src/redux/providers/statusReducer.js new file mode 100644 index 00000000000..d1d08d0f69c --- /dev/null +++ b/js/src/redux/providers/statusReducer.js @@ -0,0 +1,33 @@ +function statusBlockNumber (state, action) { + const { blockNumber } = action; + + return Object.assign({}, state, { blockNumber }); +} + +function statusCollection (state, action) { + const { collection } = action; + + return Object.assign({}, state, collection); +} + +function statusLogs (state, action) { + const { logInfo } = action; + + return Object.assign({}, state, logInfo); +} + +export default function statusReducer (state = {}, action) { + switch (action.type) { + case 'statusBlockNumber': + return statusBlockNumber(state, action); + + case 'statusCollection': + return statusCollection(state, action); + + case 'statusLogs': + return statusLogs(state, action); + + default: + return state; + } +} diff --git a/js/src/redux/reducers.js b/js/src/redux/reducers.js index 1a34d195dba..40238c8e1ec 100644 --- a/js/src/redux/reducers.js +++ b/js/src/redux/reducers.js @@ -1,21 +1,35 @@ import { combineReducers } from 'redux'; import { routerReducer } from 'react-router-redux'; -import { balancesReducer, personalReducer } from './providers'; +import { balancesReducer, personalReducer, statusReducer as nodeStatusReducer } from './providers'; import { errorReducer } from '../ui/Errors'; import { tooltipReducer } from '../ui/Tooltips'; -import { nodeStatusReducer } from '../views/Application/Status'; -import { signer as signerReducer, requests as signerRequestsReducer } from '../views/Signer/reducers'; -import { status as statusReducer, debug as statusDebugReducer, logger as statusLoggerReducer, mining as statusMiningReducer, rpc as statusRpcReducer, settings as statusSettingsReducer } from '../views/Status/reducers'; +import { + signer as signerReducer, + requests as signerRequestsReducer +} from '../views/Signer/reducers'; + +import { + status as statusReducer, + debug as statusDebugReducer, + logger as statusLoggerReducer, + mining as statusMiningReducer, + rpc as statusRpcReducer, + settings as statusSettingsReducer +} from '../views/Status/reducers'; export default function () { return combineReducers({ errors: errorReducer, - nodeStatus: nodeStatusReducer, tooltip: tooltipReducer, routing: routerReducer, + + balances: balancesReducer, + nodeStatus: nodeStatusReducer, + personal: personalReducer, + signer: signerReducer, signerRequests: signerRequestsReducer, status: statusReducer, @@ -23,9 +37,6 @@ export default function () { statusMining: statusMiningReducer, statusRpc: statusRpcReducer, statusLogger: statusLoggerReducer, - statusDebug: statusDebugReducer, - - balances: balancesReducer, - personal: personalReducer + statusDebug: statusDebugReducer }); } diff --git a/js/src/redux/store.js b/js/src/redux/store.js index 2a1fd1b93ea..fb1a5932d6b 100644 --- a/js/src/redux/store.js +++ b/js/src/redux/store.js @@ -3,7 +3,11 @@ import { applyMiddleware, createStore } from 'redux'; import initMiddleware from './middleware'; import initReducers from './reducers'; -import { Balances as BalancesProvider, Personal as PersonalProvider } from './providers'; +import { + Balances as BalancesProvider, + Personal as PersonalProvider, + Status as StatusProvider +} from './providers'; const storeCreation = window.devToolsExtension ? window.devToolsExtension()(createStore) @@ -14,8 +18,9 @@ export default function (api, signerWs, signerTokenSetter, statusWeb3) { const middleware = initMiddleware(signerWs, signerTokenSetter, statusWeb3); const store = applyMiddleware(...middleware)(storeCreation)(reducers); - new PersonalProvider(store, api).start(); new BalancesProvider(store, api).start(); + new PersonalProvider(store, api).start(); + new StatusProvider(store, api).start(); return store; } diff --git a/js/src/ui/index.js b/js/src/ui/index.js index 1245fbe0205..763ecf8fd0b 100644 --- a/js/src/ui/index.js +++ b/js/src/ui/index.js @@ -1,7 +1,7 @@ import Actionbar from './Actionbar'; import ApiProvider from './ApiProvider'; import Badge from './Badge'; -import Balance from './Balances'; +import Balance from './Balance'; import Container, { Title as ContainerTitle } from './Container'; import Errors from './Errors'; import Form, { FormWrap, Input, InputAddress, InputAddressSelect, InputInline, Select } from './Form'; @@ -9,7 +9,7 @@ import IdentityIcon from './IdentityIcon'; import Modal from './Modal'; import muiTheme from './Theme'; import Page from './Page'; -import SignerIcon from './signerIcon'; +import SignerIcon from './SignerIcon'; import Tooltips, { Tooltip } from './Tooltips'; export { diff --git a/js/src/views/Application/Status/actions.js b/js/src/views/Application/Status/actions.js deleted file mode 100644 index 64a311a0f73..00000000000 --- a/js/src/views/Application/Status/actions.js +++ /dev/null @@ -1,6 +0,0 @@ -export function updateNodeStatus (status) { - return { - type: 'updateNodeStatus', - status - }; -} diff --git a/js/src/views/Application/Status/index.js b/js/src/views/Application/Status/index.js index 8dcc9695db1..60aae301478 100644 --- a/js/src/views/Application/Status/index.js +++ b/js/src/views/Application/Status/index.js @@ -1,9 +1 @@ -import nodeStatusReducer from './reducers'; -import { updateNodeStatus } from './actions'; - export default from './status'; - -export { - nodeStatusReducer, - updateNodeStatus -}; diff --git a/js/src/views/Application/Status/reducers.js b/js/src/views/Application/Status/reducers.js deleted file mode 100644 index 6a7421c4be5..00000000000 --- a/js/src/views/Application/Status/reducers.js +++ /dev/null @@ -1,21 +0,0 @@ -function updateNodeStatus (state, action) { - const { blockNumber, clientVersion, netPeers, netChain, isTest } = action.status; - - return Object.assign({}, state, { - blockNumber, - clientVersion, - netPeers, - netChain, - isTest - }); -} - -export default function statusReducer (state = {}, action) { - switch (action.type) { - case 'updateNodeStatus': - return updateNodeStatus(state, action); - - default: - return state; - } -} diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index 43a450a6f4f..4aa26d73fee 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -5,7 +5,7 @@ import { bindActionCreators } from 'redux'; import Container from './Container'; import DappContainer from './DappContainer'; import FrameError from './FrameError'; -import Status, { updateNodeStatus } from './Status'; +import Status from './Status'; import TabBar from './TabBar'; const inFrame = window.parent !== window && window.parent.frames.length !== 0; @@ -19,7 +19,6 @@ class Application extends Component { children: PropTypes.node, netChain: PropTypes.string, isTest: PropTypes.bool, - onUpdateNodeStatus: PropTypes.func, pending: PropTypes.array } @@ -28,7 +27,7 @@ class Application extends Component { } componentWillMount () { - this.pollStatus(); + this.checkAccounts(); } render () { @@ -62,37 +61,18 @@ class Application extends Component { ); } - pollStatus () { + checkAccounts () { const { api } = this.context; - const { onUpdateNodeStatus } = this.props; - const nextTimeout = () => setTimeout(() => this.pollStatus(), 1000); - - Promise - .all([ - api.eth.blockNumber(), - api.web3.clientVersion(), - api.ethcore.netChain(), - api.ethcore.netPeers(), - api.eth.syncing() - ]) - .then(([blockNumber, clientVersion, netChain, netPeers, syncing]) => { - const isTest = netChain === 'morden' || netChain === 'testnet'; - - onUpdateNodeStatus({ - blockNumber, - clientVersion, - netChain, - netPeers, - isTest, - syncing - }); - nextTimeout(); + api.personal + .listAccounts() + .then((accounts) => { + this.setState({ + showFirst: accounts.length === 0 + }); }) .catch((error) => { - console.error('pollStatus', error); - - nextTimeout(); + console.error('checkAccounts', error); }); } @@ -117,9 +97,7 @@ function mapStateToProps (state) { } function mapDispatchToProps (dispatch) { - return bindActionCreators({ - onUpdateNodeStatus: updateNodeStatus - }, dispatch); + return bindActionCreators({}, dispatch); } export default connect( From 6676fbf581a098ef639e29927a409ea45127b514 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 13 Sep 2016 09:04:26 +0200 Subject: [PATCH 0436/1062] devLogs/devLogsSettings now via new Status provider --- js/src/redux/providers/status.js | 2 +- js/src/views/Status/components/Debug/Debug.js | 15 ++++- .../views/Status/components/Status/Status.js | 56 ++++++++++--------- .../containers/StatusPage/StatusPage.js | 1 + 4 files changed, 46 insertions(+), 28 deletions(-) diff --git a/js/src/redux/providers/status.js b/js/src/redux/providers/status.js index 2b567986d66..e5d13592fd7 100644 --- a/js/src/redux/providers/status.js +++ b/js/src/redux/providers/status.js @@ -80,7 +80,7 @@ export default class Status { .then(([devLogs, devLogsLevels]) => { nextTimeout(); this._store.dispatch(statusLogs({ - devLogs, + devLogs: devLogs.slice(-1024), devLogsLevels })); }) diff --git a/js/src/views/Status/components/Debug/Debug.js b/js/src/views/Status/components/Debug/Debug.js index 986576988d3..31900c110a3 100644 --- a/js/src/views/Status/components/Debug/Debug.js +++ b/js/src/views/Status/components/Debug/Debug.js @@ -13,6 +13,7 @@ export default class Debug extends Component { removeDevLogs: PropTypes.func.isRequired, updateDevLogging: PropTypes.func.isRequired }).isRequired, + nodeStatus: PropTypes.object.isRequired, statusDebug: PropTypes.shape({ levels: PropTypes.string.isRequired, logging: PropTypes.bool.isRequired, @@ -21,13 +22,20 @@ export default class Debug extends Component { } render () { + const { nodeStatus } = this.props; + const { devLogs, devLogsLevels } = nodeStatus; + + if (!devLogs) { + return null; + } + return ( { this.renderActions() }

    - { this.props.statusDebug.levels || '-' } + { devLogsLevels || '-' }

    { this.renderLogs() } @@ -37,7 +45,10 @@ export default class Debug extends Component { } renderLogs () { - return this.props.statusDebug.logs.map((log, idx) => ( + const { nodeStatus } = this.props; + const { devLogs } = nodeStatus; + + return devLogs.map((log, idx) => (
             { log }
           
    diff --git a/js/src/views/Status/components/Status/Status.js b/js/src/views/Status/components/Status/Status.js index 72d8a5c2f9c..e86d6893618 100644 --- a/js/src/views/Status/components/Status/Status.js +++ b/js/src/views/Status/components/Status/Status.js @@ -1,5 +1,4 @@ import React, { Component, PropTypes } from 'react'; -import formatNumber from 'format-number'; import bytes from 'bytes'; import { Container, ContainerTitle, Input } from '../../../../ui'; @@ -9,15 +8,8 @@ import MiningSettings from '../MiningSettings'; export default class Status extends Component { static propTypes = { + nodeStatus: PropTypes.object.isRequired, statusMining: PropTypes.object.isRequired, - statusSettings: PropTypes.shape({ - chain: PropTypes.string.isRequired, - networkPort: PropTypes.number.isRequired, - maxPeers: PropTypes.number.isRequired, - rpcEnabled: PropTypes.bool.isRequired, - rpcInterface: PropTypes.string.isRequired, - rpcPort: PropTypes.number.isRequired - }).isRequired, status: PropTypes.shape({ name: PropTypes.string, version: PropTypes.string.isRequired, @@ -30,10 +22,15 @@ export default class Status extends Component { } render () { - const { status, statusSettings } = this.props; - const bestBlock = formatNumber()(status.bestBlock); - const hashrate = bytes(status.hashrate) || 0; - const peers = `${status.activePeers}/${status.connectedPeers}/${statusSettings.maxPeers}`; + const { nodeStatus } = this.props; + const { netPeers } = nodeStatus; + + if (!netPeers || !nodeStatus.blockNumber) { + return null; + } + + const hashrate = bytes(nodeStatus.hashrate.toNumber()) || 0; + const peers = `${netPeers.active}/${netPeers.connected}/${netPeers.max}`; return ( @@ -42,15 +39,21 @@ export default class Status extends Component {
    -

    #{ bestBlock }

    +

    + #{ nodeStatus.blockNumber.toFormat() } +

    -

    { peers }

    +

    + { peers } +

    -

    { `${hashrate} H/s` }

    +

    + { `${hashrate} H/s` } +

    @@ -72,16 +75,19 @@ export default class Status extends Component { } renderNodeName () { - const { status } = this.props; + const { nodeStatus } = this.props; + return ( - { status.name || 'Node' } + { nodeStatus.nodeName || 'Node' } ); } renderSettings () { - const { status, statusSettings } = this.props; + const { nodeStatus } = this.props; + const { rpcSettings, netPeers } = nodeStatus; + const peers = `${netPeers.active}/${netPeers.connected}/${netPeers.max}`; return (
    @@ -89,21 +95,21 @@ export default class Status extends Component {
    @@ -111,21 +117,21 @@ export default class Status extends Component {
    diff --git a/js/src/views/Status/containers/StatusPage/StatusPage.js b/js/src/views/Status/containers/StatusPage/StatusPage.js index f0f47c7ea78..1a8a10bc595 100644 --- a/js/src/views/Status/containers/StatusPage/StatusPage.js +++ b/js/src/views/Status/containers/StatusPage/StatusPage.js @@ -14,6 +14,7 @@ import styles from './statusPage.css'; class StatusPage extends Component { static propTypes = { + nodeStatus: PropTypes.object.isRequired, status: PropTypes.object.isRequired, statusSettings: PropTypes.object.isRequired, statusMining: PropTypes.object.isRequired, From fa60530c2a08a49b9ea6b7467684ab9b17b03b8b Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 13 Sep 2016 10:21:00 +0200 Subject: [PATCH 0437/1062] logging actions available on new --- js/src/redux/actions.js | 6 +++ js/src/redux/index.js | 2 + js/src/redux/providers/balancesReducer.js | 30 +++++------ js/src/redux/providers/personalReducer.js | 51 +++++++++---------- js/src/redux/providers/status.js | 11 ++-- js/src/redux/providers/statusActions.js | 13 +++++ js/src/redux/providers/statusReducer.js | 50 +++++++++--------- js/src/views/Status/components/Debug/Debug.js | 26 ++++++---- .../containers/StatusPage/StatusPage.js | 10 +++- 9 files changed, 116 insertions(+), 83 deletions(-) create mode 100644 js/src/redux/actions.js diff --git a/js/src/redux/actions.js b/js/src/redux/actions.js new file mode 100644 index 00000000000..95cebaa5283 --- /dev/null +++ b/js/src/redux/actions.js @@ -0,0 +1,6 @@ +import { clearStatusLogs, toggleStatusLogs } from './providers/statusActions'; + +export { + clearStatusLogs, + toggleStatusLogs +}; diff --git a/js/src/redux/index.js b/js/src/redux/index.js index 6ef6aa1b7f6..a78dcde95c7 100644 --- a/js/src/redux/index.js +++ b/js/src/redux/index.js @@ -1,5 +1,7 @@ +import * as actions from './actions'; import initStore from './store'; export { + actions, initStore }; diff --git a/js/src/redux/providers/balancesReducer.js b/js/src/redux/providers/balancesReducer.js index 528b7d2f740..955f3e8aa56 100644 --- a/js/src/redux/providers/balancesReducer.js +++ b/js/src/redux/providers/balancesReducer.js @@ -1,24 +1,18 @@ -function getBalances (state, action) { - const { balances } = action; +import { handleActions } from 'redux-actions'; - return Object.assign({}, state, { balances }); -} +const initialState = { +}; -function getTokens (state, action) { - const { tokens } = action; +export default handleActions({ + getBalances (state, action) { + const { balances } = action; - return Object.assign({}, state, { tokens }); -} + return Object.assign({}, state, { balances }); + }, -export default function balancesReducer (state = {}, action) { - switch (action.type) { - case 'getBalances': - return getBalances(state, action); + getTokens (state, action) { + const { tokens } = action; - case 'getTokens': - return getTokens(state, action); - - default: - return state; + return Object.assign({}, state, { tokens }); } -} +}, initialState); diff --git a/js/src/redux/providers/personalReducer.js b/js/src/redux/providers/personalReducer.js index 300ad1f953e..d440f710778 100644 --- a/js/src/redux/providers/personalReducer.js +++ b/js/src/redux/providers/personalReducer.js @@ -1,33 +1,30 @@ -function personalAccountsInfo (state, action) { - const { accountsInfo } = action; - const accounts = {}; - const contacts = {}; +import { handleActions } from 'redux-actions'; - Object.keys(accountsInfo).forEach((address) => { - const account = accountsInfo[address]; - const { name, meta, uuid } = account; +const initialState = { +}; - if (uuid) { - accounts[address] = { address, name, meta, uuid }; - } else { - contacts[address] = { address, name, meta }; - } - }); +export default handleActions({ + personalAccountsInfo (state, action) { + const { accountsInfo } = action; + const accounts = {}; + const contacts = {}; - return Object.assign({}, state, { - accounts, - hasAccounts: Object.keys(accounts).length !== 0, - contacts, - hasContacts: Object.keys(contacts).length !== 0 - }); -} + Object.keys(accountsInfo).forEach((address) => { + const account = accountsInfo[address]; + const { name, meta, uuid } = account; -export default function personalReducer (state = {}, action) { - switch (action.type) { - case 'personalAccountsInfo': - return personalAccountsInfo(state, action); + if (uuid) { + accounts[address] = { address, name, meta, uuid }; + } else { + contacts[address] = { address, name, meta }; + } + }); - default: - return state; + return Object.assign({}, state, { + accounts, + hasAccounts: Object.keys(accounts).length !== 0, + contacts, + hasContacts: Object.keys(contacts).length !== 0 + }); } -} +}, initialState); diff --git a/js/src/redux/providers/status.js b/js/src/redux/providers/status.js index e5d13592fd7..df1326a7042 100644 --- a/js/src/redux/providers/status.js +++ b/js/src/redux/providers/status.js @@ -4,7 +4,6 @@ export default class Status { constructor (store, api) { this._api = api; this._store = store; - this._status = null; } start () { @@ -24,7 +23,7 @@ export default class Status { } _pollStatus = () => { - const nextTimeout = () => setTimeout(this._pollStatus, 1000); + const nextTimeout = (timeout = 1000) => setTimeout(this._pollStatus, timeout); Promise .all([ @@ -70,7 +69,13 @@ export default class Status { } _pollLogs = () => { - const nextTimeout = () => setTimeout(this._pollStatus, 1000); + const nextTimeout = (timeout = 1000) => setTimeout(this._pollLogs, timeout); + const { devLogsEnabled } = this._store.getState().nodeStatus; + + if (!devLogsEnabled) { + nextTimeout(); + return; + } Promise .all([ diff --git a/js/src/redux/providers/statusActions.js b/js/src/redux/providers/statusActions.js index 23d416f6d3f..809bce8f0c4 100644 --- a/js/src/redux/providers/statusActions.js +++ b/js/src/redux/providers/statusActions.js @@ -18,3 +18,16 @@ export function statusLogs (logInfo) { logInfo }; } + +export function toggleStatusLogs (devLogsEnabled) { + return { + type: 'toggleStatusLogs', + devLogsEnabled + }; +} + +export function clearStatusLogs () { + return { + type: 'clearStatusLogs' + }; +} diff --git a/js/src/redux/providers/statusReducer.js b/js/src/redux/providers/statusReducer.js index d1d08d0f69c..eb16a4f20bc 100644 --- a/js/src/redux/providers/statusReducer.js +++ b/js/src/redux/providers/statusReducer.js @@ -1,33 +1,37 @@ -function statusBlockNumber (state, action) { - const { blockNumber } = action; +import { handleActions } from 'redux-actions'; - return Object.assign({}, state, { blockNumber }); -} +const initialState = { + devLogs: [], + devLogsLevels: null, + devLogsEnabled: false +}; -function statusCollection (state, action) { - const { collection } = action; +export default handleActions({ + statusBlockNumber (state, action) { + const { blockNumber } = action; - return Object.assign({}, state, collection); -} + return Object.assign({}, state, { blockNumber }); + }, -function statusLogs (state, action) { - const { logInfo } = action; + statusCollection (state, action) { + const { collection } = action; - return Object.assign({}, state, logInfo); -} + return Object.assign({}, state, collection); + }, -export default function statusReducer (state = {}, action) { - switch (action.type) { - case 'statusBlockNumber': - return statusBlockNumber(state, action); + statusLogs (state, action) { + const { logInfo } = action; - case 'statusCollection': - return statusCollection(state, action); + return Object.assign({}, state, logInfo); + }, - case 'statusLogs': - return statusLogs(state, action); + toggleStatusLogs (state, action) { + const { devLogsEnabled } = action; - default: - return state; + return Object.assign({}, state, { devLogsEnabled }); + }, + + clearStatusLogs (state, action) { + return Object.assign({}, state, { devLogs: [] }); } -} +}, initialState); diff --git a/js/src/views/Status/components/Debug/Debug.js b/js/src/views/Status/components/Debug/Debug.js index 31900c110a3..c4f05e9eaeb 100644 --- a/js/src/views/Status/components/Debug/Debug.js +++ b/js/src/views/Status/components/Debug/Debug.js @@ -10,8 +10,8 @@ import styles from './Debug.css'; export default class Debug extends Component { static propTypes = { actions: PropTypes.shape({ - removeDevLogs: PropTypes.func.isRequired, - updateDevLogging: PropTypes.func.isRequired + clearStatusLogs: PropTypes.func.isRequired, + toggleStatusLogs: PropTypes.func.isRequired }).isRequired, nodeStatus: PropTypes.object.isRequired, statusDebug: PropTypes.shape({ @@ -23,11 +23,7 @@ export default class Debug extends Component { render () { const { nodeStatus } = this.props; - const { devLogs, devLogsLevels } = nodeStatus; - - if (!devLogs) { - return null; - } + const { devLogsLevels } = nodeStatus; return ( @@ -48,6 +44,10 @@ export default class Debug extends Component { const { nodeStatus } = this.props; const { devLogs } = nodeStatus; + if (!devLogs) { + return null; + } + return devLogs.map((log, idx) => (
             { log }
    @@ -56,7 +56,8 @@ export default class Debug extends Component {
       }
     
       renderActions () {
    -    const toggleButton = this.props.statusDebug.logging
    +    const { devLogsEnabled } = this.props.nodeStatus;
    +    const toggleButton = devLogsEnabled
           ? 
           : ;
     
    @@ -69,10 +70,15 @@ export default class Debug extends Component {
       }
     
       clear = () => {
    -    this.props.actions.removeDevLogs();
    +    const { clearStatusLogs } = this.props.actions;
    +
    +    clearStatusLogs();
       }
     
       toggle = () => {
    -    this.props.actions.updateDevLogging(!this.props.statusDebug.logging);
    +    const { devLogsEnabled } = this.props.nodeStatus;
    +    const { toggleStatusLogs } = this.props.actions;
    +
    +    toggleStatusLogs(!devLogsEnabled);
       }
     }
    diff --git a/js/src/views/Status/containers/StatusPage/StatusPage.js b/js/src/views/Status/containers/StatusPage/StatusPage.js
    index 1a8a10bc595..25ca59e0a0f 100644
    --- a/js/src/views/Status/containers/StatusPage/StatusPage.js
    +++ b/js/src/views/Status/containers/StatusPage/StatusPage.js
    @@ -3,12 +3,13 @@ import { bindActionCreators } from 'redux';
     import { connect } from 'react-redux';
     import { extend } from 'lodash';
     
    +import { clearStatusLogs, toggleStatusLogs } from '../../../../redux/actions';
    +
     import Debug from '../../components/Debug';
     import Status from '../../components/Status';
     
     import * as debugActions from '../../actions/debug';
     import * as ModifyMiningActions from '../../actions/modify-mining';
    -import { updateLogging } from '../../actions/logger';
     
     import styles from './statusPage.css';
     
    @@ -38,7 +39,12 @@ function mapStateToProps (state) {
     
     function mapDispatchToProps (dispatch) {
       return {
    -    actions: bindActionCreators(extend({}, ModifyMiningActions, debugActions, { updateLogging }), dispatch)
    +    actions: bindActionCreators(
    +      extend({}, ModifyMiningActions, debugActions, {
    +        clearStatusLogs,
    +        toggleStatusLogs
    +      }),
    +      dispatch)
       };
     }
     
    
    From 75d1059318e009a977ed060e6f920ef34d76708f Mon Sep 17 00:00:00 2001
    From: Jaco Greeff 
    Date: Tue, 13 Sep 2016 11:34:34 +0200
    Subject: [PATCH 0438/1062] inData formatting, mining uses api provider
    
    ---
     js/src/api/format/input.js                    | 13 +--
     js/src/api/format/input.spec.js               |  4 +
     js/src/api/util/types.js                      | 17 ++++
     js/src/api/util/types.spec.js                 | 16 +++-
     js/src/views/Status/components/Debug/Debug.js |  7 +-
     .../MiningSettings/MiningSettings.js          | 92 +++++++++----------
     .../views/Status/components/Status/Status.js  | 16 +---
     7 files changed, 90 insertions(+), 75 deletions(-)
    
    diff --git a/js/src/api/format/input.js b/js/src/api/format/input.js
    index f8fa5a7cf38..2cd80e37f12 100644
    --- a/js/src/api/format/input.js
    +++ b/js/src/api/format/input.js
    @@ -1,6 +1,6 @@
     import BigNumber from 'bignumber.js';
     
    -import { isInstanceOf, isString } from '../util/types';
    +import { isHex, isInstanceOf, isString } from '../util/types';
     
     // const ZERO_64 = '0000000000000000000000000000000000000000000000000000000000000000';
     
    @@ -23,12 +23,13 @@ export function inBlockNumber (blockNumber) {
     }
     
     export function inData (data) {
    -  return inHex(data);
    +  if (data && data.length && !isHex(data)) {
    +    data = data.split('').map((chr) => {
    +      return `0${chr.charCodeAt(0).toString(16)}`.slice(-2);
    +    }).join('');
    +  }
     
    -  // const hex = inHex(data).substr(2);
    -  // const missing = hex.length % 64;
    -  //
    -  // return `0x${hex}${ZERO_64.slice(-1 * missing)}`;
    +  return inHex(data);
     }
     
     export function inTopics (_topics) {
    diff --git a/js/src/api/format/input.spec.js b/js/src/api/format/input.spec.js
    index 1be4e1a1589..5e630062bf1 100644
    --- a/js/src/api/format/input.spec.js
    +++ b/js/src/api/format/input.spec.js
    @@ -56,6 +56,10 @@ describe('api/format/input', () => {
         it('formats to hex', () => {
           expect(inData('123456')).to.equal('0x123456');
         });
    +
    +    it('converts a string to a hex representation', () => {
    +      expect(inData('jaco')).to.equal('0x6a61636f');
    +    });
       });
     
       describe('inHex', () => {
    diff --git a/js/src/api/util/types.js b/js/src/api/util/types.js
    index 533ab9d9251..f3a6d51da76 100644
    --- a/js/src/api/util/types.js
    +++ b/js/src/api/util/types.js
    @@ -1,3 +1,5 @@
    +const HEXDIGITS = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
    +
     export function isArray (test) {
       return Object.prototype.toString.call(test) === '[object Array]';
     }
    @@ -6,6 +8,21 @@ export function isFunction (test) {
       return Object.prototype.toString.call(test) === '[object Function]';
     }
     
    +export function isHex (_test) {
    +  if (_test.substr(0, 2) === '0x') {
    +    return true;
    +  }
    +
    +  const test = _test.toLowerCase();
    +  let hex = true;
    +
    +  for (let idx = 0; hex && idx < test.length; idx++) {
    +    hex = HEXDIGITS.includes(test[idx]);
    +  }
    +
    +  return hex;
    +}
    +
     export function isString (test) {
       return Object.prototype.toString.call(test) === '[object String]';
     }
    diff --git a/js/src/api/util/types.spec.js b/js/src/api/util/types.spec.js
    index 700d1be8e06..0fb6316cc0b 100644
    --- a/js/src/api/util/types.spec.js
    +++ b/js/src/api/util/types.spec.js
    @@ -1,6 +1,6 @@
     import sinon from 'sinon';
     
    -import { isArray, isFunction, isInstanceOf, isString } from './types';
    +import { isArray, isFunction, isHex, isInstanceOf, isString } from './types';
     import Eth from '../rpc/eth';
     
     describe('api/util/types', () => {
    @@ -28,6 +28,20 @@ describe('api/util/types', () => {
         });
       });
     
    +  describe('isHex', () => {
    +    it('correctly identifies hex by leading 0x', () => {
    +      expect(isHex('0x123')).to.be.true;
    +    });
    +
    +    it('correctly identifies hex without leading 0x', () => {
    +      expect(isHex('123')).to.be.true;
    +    });
    +
    +    it('correctly identifies non-hex values', () => {
    +      expect(isHex('123j')).to.be.false;
    +    });
    +  });
    +
       describe('isInstanceOf', () => {
         it('correctly identifies build-in instanceof', () => {
           expect(isInstanceOf(new String('123'), String)).to.be.true; // eslint-disable-line no-new-wrappers
    diff --git a/js/src/views/Status/components/Debug/Debug.js b/js/src/views/Status/components/Debug/Debug.js
    index c4f05e9eaeb..cc2cc47a974 100644
    --- a/js/src/views/Status/components/Debug/Debug.js
    +++ b/js/src/views/Status/components/Debug/Debug.js
    @@ -13,12 +13,7 @@ export default class Debug extends Component {
           clearStatusLogs: PropTypes.func.isRequired,
           toggleStatusLogs: PropTypes.func.isRequired
         }).isRequired,
    -    nodeStatus: PropTypes.object.isRequired,
    -    statusDebug: PropTypes.shape({
    -      levels: PropTypes.string.isRequired,
    -      logging: PropTypes.bool.isRequired,
    -      logs: PropTypes.arrayOf(PropTypes.string).isRequired
    -    }).isRequired
    +    nodeStatus: PropTypes.object.isRequired
       }
     
       render () {
    diff --git a/js/src/views/Status/components/MiningSettings/MiningSettings.js b/js/src/views/Status/components/MiningSettings/MiningSettings.js
    index d737c612a62..60417feeae0 100644
    --- a/js/src/views/Status/components/MiningSettings/MiningSettings.js
    +++ b/js/src/views/Status/components/MiningSettings/MiningSettings.js
    @@ -9,28 +9,17 @@ import { decodeExtraData } from './decodeExtraData';
     const toNiceNumber = formatNumber();
     
     export default class MiningSettings extends Component {
    +  static contextTypes = {
    +    api: PropTypes.object
    +  }
     
    -  render () {
    -    const { statusMining, actions } = this.props;
    -
    -    let onMinGasPriceChange = newVal => {
    -      actions.modifyMinGasPrice(numberFromString(newVal));
    -    };
    -
    -    let onExtraDataChange = (newVal, isResetToDefault) => {
    -      // In case of resetting to default we are just using raw bytes from defaultExtraData
    -      // When user sets new value we can safely send a string that will be converted to hex by formatter.
    -      const val = isResetToDefault ? statusMining.defaultExtraData : newVal;
    -      actions.modifyExtraData(val);
    -    };
    -
    -    let onAuthorChange = newVal => {
    -      actions.modifyAuthor(newVal);
    -    };
    +  static propTypes = {
    +    nodeStatus: PropTypes.object
    +  }
     
    -    let onGasFloorTargetChange = newVal => {
    -      actions.modifyGasFloorTarget(numberFromString(newVal));
    -    };
    +  render () {
    +    const { nodeStatus } = this.props;
    +    const { coinbase, defaultExtraData, extraData, gasFloorTarget, minGasPrice } = nodeStatus;
     
         return (
           
    @@ -38,50 +27,57 @@ export default class MiningSettings extends Component {
    ); } - static propTypes = { - accounts: PropTypes.arrayOf(PropTypes.string).isRequired, - version: PropTypes.string.isRequired, - statusMining: PropTypes.shape({ - author: PropTypes.string.isRequired, - extraData: PropTypes.string.isRequired, - defaultExtraData: PropTypes.string.isRequired, - minGasPrice: PropTypes.string.isRequired, - gasFloorTarget: PropTypes.string.isRequired - }).isRequired, - actions: PropTypes.shape({ - modifyMinGasPrice: PropTypes.func.isRequired, - modifyAuthor: PropTypes.func.isRequired, - modifyGasFloorTarget: PropTypes.func.isRequired, - modifyExtraData: PropTypes.func.isRequired, - resetExtraData: PropTypes.func.isRequired - }).isRequired - } + onMinGasPriceChange = (newVal) => { + const { api } = this.context; + + api.ethcore.setMinGasPrice(numberFromString(newVal)); + }; + + onExtraDataChange = (newVal, isResetToDefault) => { + const { api } = this.context; + const { nodeStatus } = this.props; + + // In case of resetting to default we are just using raw bytes from defaultExtraData + // When user sets new value we can safely send a string that will be converted to hex by formatter. + const val = isResetToDefault ? nodeStatus.defaultExtraData : newVal; + api.ethcore.setExtraData(val); + }; + + onAuthorChange = (newVal) => { + const { api } = this.context; + + api.ethcore.setAuthor(newVal); + }; + + onGasFloorTargetChange = (newVal) => { + const { api } = this.context; + api.ethcore.setGasFloorTarget(numberFromString(newVal)); + }; } diff --git a/js/src/views/Status/components/Status/Status.js b/js/src/views/Status/components/Status/Status.js index e86d6893618..fc4feec2e23 100644 --- a/js/src/views/Status/components/Status/Status.js +++ b/js/src/views/Status/components/Status/Status.js @@ -9,15 +9,6 @@ import MiningSettings from '../MiningSettings'; export default class Status extends Component { static propTypes = { nodeStatus: PropTypes.object.isRequired, - statusMining: PropTypes.object.isRequired, - status: PropTypes.shape({ - name: PropTypes.string, - version: PropTypes.string.isRequired, - bestBlock: PropTypes.string.isRequired, - hashrate: PropTypes.string.isRequired, - accounts: PropTypes.arrayOf(PropTypes.string).isRequired, - peers: PropTypes.number.isRequired - }).isRequired, actions: PropTypes.object.isRequired } @@ -59,11 +50,8 @@ export default class Status extends Component {
    + nodeStatus={ nodeStatus } + actions={ this.props.actions } />
    { this.renderSettings() } From d4ae8a1ea144b3e71da9411d37a4ce40c77d5578 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Tue, 13 Sep 2016 11:28:12 +0200 Subject: [PATCH 0439/1062] registry: sort events, show dropped --- js/src/dapps/registry/events/actions.js | 3 ++- js/src/dapps/registry/events/events.css | 14 +++++----- js/src/dapps/registry/events/events.js | 34 +++++++++++++++++++----- js/src/dapps/registry/events/reducers.js | 15 ++++++++--- 4 files changed, 49 insertions(+), 17 deletions(-) diff --git a/js/src/dapps/registry/events/actions.js b/js/src/dapps/registry/events/actions.js index 555646be6db..a8f8acbb9f9 100644 --- a/js/src/dapps/registry/events/actions.js +++ b/js/src/dapps/registry/events/actions.js @@ -1,6 +1,6 @@ export const start = (name, from, to) => ({ type: 'events subscribe start', name, from, to }); -export const event = (name, event) => ({ type: 'events event', name, event }); +export const event = (name, event) => ({ type: 'events event', event: { ...event, type: name } }); export const fail = (name) => ({ type: 'events subscribe fail', name }); @@ -19,6 +19,7 @@ export const subscribe = (name, from = 0, to = 'latest') => key: '' + e.transactionHash + e.logIndex, state: e.type, block: e.blockNumber, + index: e.logIndex, transaction: e.transactionHash, parameters: e.params }; diff --git a/js/src/dapps/registry/events/events.css b/js/src/dapps/registry/events/events.css index 53f4b399dde..2c9296edb38 100644 --- a/js/src/dapps/registry/events/events.css +++ b/js/src/dapps/registry/events/events.css @@ -2,19 +2,21 @@ margin: 1em; } -.reserved { - display: flex; +.reserved, .dropped { margin: .5em 0; + display: flex; justify-content: space-between; + flex-wrap: wrap; align-items: center; } +.reserved abbr, .dropped abbr { + cursor: help; +} + .owner code { display: inline-block; vertical-align: top; line-height: 32px; -} - -.reserved abbr { - cursor: help; + word-wrap: break-word; } diff --git a/js/src/dapps/registry/events/events.js b/js/src/dapps/registry/events/events.js index 3ef4eae146b..13ad6dacf51 100644 --- a/js/src/dapps/registry/events/events.js +++ b/js/src/dapps/registry/events/events.js @@ -6,19 +6,38 @@ const { IdentityIcon } = window.parity.react; import styles from './events.css'; import bytesToHex from '../../../api/util/bytes-array-to-hex'; +const renderOwner = (owner) => ( + + + { owner } + +); + const renderReserved = (e) => (

    -

    - - { e.parameters.owner } -
    + { renderOwner(e.parameters.owner) } { ' ' } - registered + reserved { ' ' } { bytesToHex(e.parameters.name) }

    ); +const renderDropped = (e) => ( +

    + { renderOwner(e.parameters.owner) } + { ' ' } + dropped + { ' ' } + { bytesToHex(e.parameters.name) } +

    +); + +const eventTypes = { + Reserved: renderReserved, + Dropped: renderDropped +}; + export default class Events extends Component { static propTypes = { @@ -28,6 +47,7 @@ export default class Events extends Component { componentDidMount () { // TODO remove this this.props.actions.subscribe('Reserved', 0, 'latest'); + this.props.actions.subscribe('Dropped', 0, 'latest'); } render () { @@ -36,8 +56,8 @@ export default class Events extends Component { { this.props.events - .filter((e) => e.state === 'mined') - .map(renderReserved) + .filter((e) => eventTypes[e.type]) + .map((e) => eventTypes[e.type](e)) } ); diff --git a/js/src/dapps/registry/events/reducers.js b/js/src/dapps/registry/events/reducers.js index b39ebf399f9..cefa63fcce1 100644 --- a/js/src/dapps/registry/events/reducers.js +++ b/js/src/dapps/registry/events/reducers.js @@ -1,15 +1,24 @@ const initialState = []; +const sortEvents = (a, b) => { + const d = a.block.minus(b.block).toFixed(0) + if (d === 0) return a.index.minus(b.index).toFixed(0) + return d +} + export default (state = initialState, action) => { if (action.type === 'events subscribe start') return state; // TODO store the subscriptions? if (action.type === 'events subscribe fail') return state; // TODO ? - if (action.type === 'events event') + if (action.type === 'events event') { + if (action.event.state !== 'mined') return state return state - .filter((event) => event.key !== action.key) - .concat(action.event); + .filter((event) => event.key !== action.event.key) + .concat(action.event) + .sort(sortEvents); + } return state; }; From fb9492e57bea24cb1e3c899ea7a9ad554383b19c Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 13 Sep 2016 12:02:14 +0200 Subject: [PATCH 0440/1062] address & account now load again --- js/src/ui/Balance/balance.js | 6 +++- js/src/views/Account/Header/header.js | 24 ++++++++------ js/src/views/Account/account.js | 48 ++++++++++++++++++++------- js/src/views/Address/address.js | 40 +++++++++++++++++++--- 4 files changed, 90 insertions(+), 28 deletions(-) diff --git a/js/src/ui/Balance/balance.js b/js/src/ui/Balance/balance.js index 939f201381f..6d41fde45ae 100644 --- a/js/src/ui/Balance/balance.js +++ b/js/src/ui/Balance/balance.js @@ -9,13 +9,17 @@ export default class Balance extends Component { } static propTypes = { - balance: PropTypes.object.isRequired + balance: PropTypes.object } render () { const { api } = this.context; const { balance } = this.props; + if (!balance) { + return null; + } + let body = balance.tokens .filter((balance) => new BigNumber(balance.value).gt(0)) .map((balance) => { diff --git a/js/src/views/Account/Header/header.js b/js/src/views/Account/Header/header.js index 952d0c7195e..ed9d948b543 100644 --- a/js/src/views/Account/Header/header.js +++ b/js/src/views/Account/Header/header.js @@ -9,12 +9,13 @@ const DEFAULT_NAME = 'Unnamed'; export default class Header extends Component { static contextTypes = { - api: PropTypes.object, - balances: PropTypes.object + api: PropTypes.object } static propTypes = { - account: PropTypes.object + account: PropTypes.object, + balance: PropTypes.object, + isTest: PropTypes.bool } state = { @@ -30,11 +31,9 @@ export default class Header extends Component { } render () { - const { balances } = this.context; - const { account } = this.props; + const { account, balance } = this.props; const { address } = account; const { name } = this.state; - const balance = balances[address]; if (!account) { return null; @@ -55,11 +54,12 @@ export default class Header extends Component {
    { address }
    - { this.renderTxCount(balance) } + { this.renderTxCount() }
    + account={ account } + balance={ balance } />
    @@ -79,14 +79,18 @@ export default class Header extends Component { ); } - renderTxCount (balance) { + renderTxCount () { + const { isTest, balance } = this.props; + if (!balance) { return null; } + const txCount = balance.txCount.sub(isTest ? 0x100000 : 0); + return (
    - { balance.txCount.toFormat() } outgoing transactions + { txCount.toFormat() } outgoing transactions
    ); } diff --git a/js/src/views/Account/account.js b/js/src/views/Account/account.js index c59274ff72d..ec002345530 100644 --- a/js/src/views/Account/account.js +++ b/js/src/views/Account/account.js @@ -1,4 +1,6 @@ import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; import { FlatButton } from 'material-ui'; import ActionAccountBalance from 'material-ui/svg-icons/action/account-balance'; import ContentSend from 'material-ui/svg-icons/content/send'; @@ -11,15 +13,12 @@ import Transactions from './Transactions'; import styles from './account.css'; -export default class Account extends Component { - static contextTypes = { - api: React.PropTypes.object, - accounts: PropTypes.array, - balances: PropTypes.object - } - +class Account extends Component { static propTypes = { - params: PropTypes.object + params: PropTypes.object, + accounts: PropTypes.object, + balances: PropTypes.object, + isTest: PropTypes.bool } propName = null @@ -30,9 +29,11 @@ export default class Account extends Component { } render () { - const { accounts } = this.context; + const { accounts, balances, isTest } = this.props; const { address } = this.props.params; - const account = accounts.find((_account) => _account.address === address); + + const account = (accounts || {})[address]; + const balance = (balances || {})[address]; if (!account) { return null; @@ -45,7 +46,9 @@ export default class Account extends Component { { this.renderActionbar() }
    + isTest={ isTest } + account={ account } + balance={ balance } /> @@ -100,7 +103,7 @@ export default class Account extends Component { } const { address } = this.props.params; - const account = this.context.accounts.find((_account) => _account.address === address); + const account = this.props.accounts[address]; return ( _account.address === address); + + const contact = (contacts || {})[address]; + const balance = (balances || {})[address]; if (!contact) { return null; @@ -30,7 +37,9 @@ export default class Address extends Component { { this.renderActionbar() }
    + isTest={ isTest } + account={ contact } + balance={ balance } /> @@ -49,3 +58,24 @@ export default class Address extends Component { ); } } + +function mapStateToProps (state) { + const { contacts } = state.personal; + const { balances } = state.balances; + const { isTest } = state.nodeStatus; + + return { + isTest, + contacts, + balances + }; +} + +function mapDispatchToProps (dispatch) { + return bindActionCreators({}, dispatch); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(Address); From 616ffabbcca40a527f1cd1ccb974962842b2bb5d Mon Sep 17 00:00:00 2001 From: Jannis R Date: Tue, 13 Sep 2016 12:23:25 +0200 Subject: [PATCH 0441/1062] registry: pull out actions & reducers for accounts --- .../dapps/registry/Application/application.js | 4 ++-- js/src/dapps/registry/Container.js | 1 + js/src/dapps/registry/accounts/accounts.js | 19 ++++++++------- js/src/dapps/registry/accounts/actions.js | 23 ++++++++++++++++++ js/src/dapps/registry/accounts/reducers.js | 14 +++++++++++ js/src/dapps/registry/actions.js | 24 ++----------------- js/src/dapps/registry/reducers.js | 13 ++++------ 7 files changed, 57 insertions(+), 41 deletions(-) create mode 100644 js/src/dapps/registry/accounts/actions.js create mode 100644 js/src/dapps/registry/accounts/reducers.js diff --git a/js/src/dapps/registry/Application/application.js b/js/src/dapps/registry/Application/application.js index c25c31749be..5d96ecf5e16 100644 --- a/js/src/dapps/registry/Application/application.js +++ b/js/src/dapps/registry/Application/application.js @@ -21,13 +21,13 @@ export default class Application extends Component { } render () { - const { accounts, account, contract, fee, owner, actions } = this.props; + const { accounts, contract, fee, owner, actions } = this.props; return (

    RΞgistry

    - +
    { contract && fee && owner ? ( diff --git a/js/src/dapps/registry/Container.js b/js/src/dapps/registry/Container.js index bf2ffd8484b..48bf5864a8e 100644 --- a/js/src/dapps/registry/Container.js +++ b/js/src/dapps/registry/Container.js @@ -42,6 +42,7 @@ export default connect( // react -> redux connection (dispatch) => { const bound = bindActionCreators(actions, dispatch); + bound.accounts = bindActionCreators(actions.accounts, dispatch); bound.lookup = bindActionCreators(actions.lookup, dispatch); bound.events = bindActionCreators(actions.events, dispatch); bound.register = bindActionCreators(actions.register, dispatch); diff --git a/js/src/dapps/registry/accounts/accounts.js b/js/src/dapps/registry/accounts/accounts.js index ca56c8eb89e..f9ef1d5031a 100644 --- a/js/src/dapps/registry/accounts/accounts.js +++ b/js/src/dapps/registry/accounts/accounts.js @@ -17,30 +17,33 @@ const renderAccount = (active) => (account) => ( export default class Accounts extends Component { static propTypes = { - actions: PropTypes.object, - accounts: PropTypes.object, - account: PropTypes.object + actions: PropTypes.object.isRequired, + all: PropTypes.object.isRequired, + selected: PropTypes.object } componentDidMount () { // TODO remove this - this.props.actions.fetchAccounts(); + this.props.actions.fetch(); } state = { value: null }; render () { const { open } = this.state; - const { accounts, account } = this.props; + const { all, selected } = this.props; return ( - - { Object.values(accounts).map(renderAccount(account)) } + + { Object.values(all).map(renderAccount(selected)) } ); } onAccountSelect = (e, address) => { - this.props.actions.setAccount(address); + this.props.actions.select(address); }; } diff --git a/js/src/dapps/registry/accounts/actions.js b/js/src/dapps/registry/accounts/actions.js new file mode 100644 index 00000000000..30ab5d3b3cf --- /dev/null +++ b/js/src/dapps/registry/accounts/actions.js @@ -0,0 +1,23 @@ +const { personal } = window.parity.api; + +export const set = (accounts) => ({ type: 'accounts set', accounts }); + +export const fetch = () => (dispatch) => { + Promise.all([ + personal.listAccounts(), + personal.accountsInfo() + ]) + .then(([ addresses, infos ]) => { + const accounts = addresses.reduce((accounts, address) => { + if (infos[address]) accounts[address] = { ...infos[address], address } + return accounts + }, {}) + dispatch(set(accounts)) + }) + .catch((err) => { + console.error('could not fetch accounts'); + if (err) console.error(err.stack); + }); +}; + +export const select = (address) => ({ type: 'accounts select', address }); diff --git a/js/src/dapps/registry/accounts/reducers.js b/js/src/dapps/registry/accounts/reducers.js new file mode 100644 index 00000000000..1555d228d51 --- /dev/null +++ b/js/src/dapps/registry/accounts/reducers.js @@ -0,0 +1,14 @@ +const initialState = { + all: {}, + selected: null +}; + +export default (state = initialState, action) => { + if (action.type === 'accounts set') + return { ...state, all: action.accounts }; + + if (action.type === 'accounts select' && state.all && state.all[action.address]) + return { ...state, selected: state.all[action.address] }; + + return state; +}; diff --git a/js/src/dapps/registry/actions.js b/js/src/dapps/registry/actions.js index 5d2d7a194ef..44c3a043fff 100644 --- a/js/src/dapps/registry/actions.js +++ b/js/src/dapps/registry/actions.js @@ -1,31 +1,11 @@ import registryAbi from './abi/registry.json'; const { api } = window.parity; +import * as accounts from './accounts/actions.js'; import * as lookup from './Lookup/actions.js'; import * as events from './events/actions.js'; import * as register from './register/actions.js'; -export { lookup, events, register }; - -export const setAccounts = (accounts) => ({ type: 'set accounts', accounts }); - -export const fetchAccounts = () => (dispatch) => - Promise.all([ - api.personal.listAccounts(), - api.personal.accountsInfo() - ]) - .then(([ addresses, infos ]) => { - const accounts = addresses.reduce((accounts, address) => { - if (infos[address]) accounts[address] = { ...infos[address], address } - return accounts - }, {}) - dispatch(setAccounts(accounts)) - }) - .catch((err) => { - console.error('could not fetch accounts'); - if (err) console.error(err.stack); - }); - -export const setAccount = (address) => ({ type: 'set account', address }); +export { accounts, lookup, events, register }; export const setContract = (contract) => ({ type: 'set contract', contract }); diff --git a/js/src/dapps/registry/reducers.js b/js/src/dapps/registry/reducers.js index c46197e6d65..c0859624cef 100644 --- a/js/src/dapps/registry/reducers.js +++ b/js/src/dapps/registry/reducers.js @@ -1,10 +1,10 @@ +import accountsReducer from './accounts/reducers.js'; import lookupReducer from './Lookup/reducers.js'; import eventsReducer from './events/reducers.js'; import registerReducer from './register/reducers.js'; const initialState = { - accounts: {}, - account: null, + accounts: accountsReducer(undefined, { type: '' }), contract: null, fee: null, owner: null, @@ -14,13 +14,8 @@ const initialState = { }; export default (state = initialState, action) => { - if (action.type === 'set accounts') - return { ...state, accounts: action.accounts }; - - if (action.type === 'set account') { - if (state.accounts && state.accounts[action.address]) - return { ...state, account: state.accounts[action.address] }; - return state + if (action.type.slice(0, 8) === 'accounts') { + return { ...state, accounts: accountsReducer(state.accounts, action) }; } if (action.type === 'set contract') From 044c47e11c10eb504db1db797e23a1484bf0349c Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 13 Sep 2016 12:43:11 +0200 Subject: [PATCH 0442/1062] tranfser, account & address as expected --- js/src/modals/Transfer/Details/details.js | 10 ++--- js/src/modals/Transfer/transfer.js | 44 +++++++++---------- js/src/ui/ApiProvider/apiProvider.css | 2 + .../InputAddressSelect/inputAddressSelect.js | 37 ++++++++++------ js/src/views/Account/account.js | 6 ++- js/src/views/Address/address.js | 4 -- 6 files changed, 58 insertions(+), 45 deletions(-) diff --git a/js/src/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js index cc5cb7a46bb..48b471b26da 100644 --- a/js/src/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -14,12 +14,12 @@ const CHECK_STYLE = { export default class Details extends Component { static contextTypes = { - api: PropTypes.object, - balances: PropTypes.object + api: PropTypes.object } static propTypes = { address: PropTypes.string, + balance: PropTypes.object, all: PropTypes.bool, extras: PropTypes.bool, recipient: PropTypes.string, @@ -97,10 +97,10 @@ export default class Details extends Component { } renderTokenSelect () { - const { api, balances } = this.context; - const { address, tag } = this.props; + const { api } = this.context; + const { balance, tag } = this.props; - const items = balances[address].tokens.map((balance, idx) => { + const items = balance.tokens.map((balance, idx) => { const token = balance.token; const isEth = idx === 0; let value = 0; diff --git a/js/src/modals/Transfer/transfer.js b/js/src/modals/Transfer/transfer.js index a11c19aab41..bb02e5ec983 100644 --- a/js/src/modals/Transfer/transfer.js +++ b/js/src/modals/Transfer/transfer.js @@ -30,12 +30,13 @@ const STAGES_EXTRA = [TITLES.transfer, TITLES.extras, TITLES.complete]; class Transfer extends Component { static contextTypes = { - api: PropTypes.object.isRequired, - balances: PropTypes.object + api: PropTypes.object.isRequired } static propTypes = { account: PropTypes.object, + balance: PropTypes.object, + balances: PropTypes.object, onClose: PropTypes.func, onNewError: PropTypes.func } @@ -126,10 +127,13 @@ class Transfer extends Component { } renderDetailsPage () { + const { account, balance } = this.props; + return (
    balance.token.tag === tag).token; + const token = balance.tokens.find((balance) => balance.token.tag === tag).token; return token.contract.instance.transfer .postTransaction({ @@ -418,10 +420,9 @@ class Transfer extends Component { } _estimateGasToken () { - const { balances } = this.context; - const { account } = this.props; + const { account, balance } = this.props; const { recipient, value, tag } = this.state; - const token = balances[account.address].tokens.find((balance) => balance.token.tag === tag).token; + const token = balance.tokens.find((balance) => balance.token.tag === tag).token; return token.contract.instance.transfer .estimateGas({ @@ -449,7 +450,7 @@ class Transfer extends Component { options.data = data; } - return this.context.api.eth.estimateGas(options); + return api.eth.estimateGas(options); } recalculateGas = () => { @@ -475,19 +476,18 @@ class Transfer extends Component { recalculate = () => { const { api } = this.context; - const { account } = this.props; + const { account, balance } = this.props; - if (!account) { + if (!account || !balance) { return; } const { gas, gasPrice, tag, valueAll, isEth } = this.state; const gasTotal = new BigNumber(gasPrice || 0).mul(new BigNumber(gas || 0)); - const balances = this.context.balances[account.address].tokens; - const balance = balances.find((balance) => tag === balance.token.tag); - const availableEth = new BigNumber(balances[0].value); - const available = new BigNumber(balance.value); - const format = new BigNumber(balance.token.format || 1); + const balance_ = balance.tokens.find((b) => tag === b.token.tag); + const availableEth = new BigNumber(balance_.value); + const available = new BigNumber(balance_.value); + const format = new BigNumber(balance_.token.format || 1); let { value, valueError } = this.state; let totalEth = gasTotal; @@ -525,7 +525,7 @@ class Transfer extends Component { } getDefaults = () => { - const api = this.context.api; + const { api } = this.context; api.eth .gasPrice() diff --git a/js/src/ui/ApiProvider/apiProvider.css b/js/src/ui/ApiProvider/apiProvider.css index ce505cc267b..6d5fc477603 100644 --- a/js/src/ui/ApiProvider/apiProvider.css +++ b/js/src/ui/ApiProvider/apiProvider.css @@ -1,2 +1,4 @@ .api { + width: 100%; + height: 100%; } diff --git a/js/src/ui/Form/InputAddressSelect/inputAddressSelect.js b/js/src/ui/Form/InputAddressSelect/inputAddressSelect.js index 3c2c68fe3fa..68175a662bc 100644 --- a/js/src/ui/Form/InputAddressSelect/inputAddressSelect.js +++ b/js/src/ui/Form/InputAddressSelect/inputAddressSelect.js @@ -1,4 +1,6 @@ import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; import { MenuItem, Toggle } from 'material-ui'; import IdentityIcon from '../../IdentityIcon'; @@ -7,13 +9,9 @@ import Select from '../Select'; import styles from './inputAddressSelect.css'; -export default class InputAddressSelect extends Component { - static contextTypes = { - accounts: PropTypes.array.isRequired, - contacts: PropTypes.array.isRequired - }; - +class InputAddressSelect extends Component { static propTypes = { + entries: PropTypes.array, disabled: PropTypes.bool, error: PropTypes.string, label: PropTypes.string, @@ -100,12 +98,9 @@ export default class InputAddressSelect extends Component { } renderSelectAccounts () { - const { accounts, contacts } = this.context; - - const entriesAccounts = accounts.map(this.renderAccountItem); - const entriesContacts = contacts.map(this.renderAccountItem); + const { entries } = this.props; - return entriesAccounts.concat(entriesContacts); + return entries.map(this.renderAccountItem); } onToggle = () => { @@ -121,10 +116,26 @@ export default class InputAddressSelect extends Component { } onChangeSelect = (event, idx) => { - const { accounts, contacts } = this.context; - const entries = accounts.concat(contacts); + const { entries } = this.props; console.log(entries[idx].address); this.props.onChange(event, entries[idx].address); } } + +function mapStateToProps (state) { + const { accounts, contacts } = state.personal; + + return { + entries: Object.values(accounts).concat(Object.values(contacts)) + }; +} + +function mapDispatchToProps (dispatch) { + return bindActionCreators({}, dispatch); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(InputAddressSelect); diff --git a/js/src/views/Account/account.js b/js/src/views/Account/account.js index ec002345530..6052a3431f8 100644 --- a/js/src/views/Account/account.js +++ b/js/src/views/Account/account.js @@ -103,11 +103,15 @@ class Account extends Component { } const { address } = this.props.params; - const account = this.props.accounts[address]; + const { accounts, balances } = this.props; + const account = accounts[address]; + const balance = balances[address]; return ( ); } diff --git a/js/src/views/Address/address.js b/js/src/views/Address/address.js index 57ed1e7b150..d3e6738b5e6 100644 --- a/js/src/views/Address/address.js +++ b/js/src/views/Address/address.js @@ -10,10 +10,6 @@ import Transactions from '../Account/Transactions'; import styles from './address.css'; class Address extends Component { - static contextTypes = { - - } - static propTypes = { contacts: PropTypes.object, balances: PropTypes.object, From d92d8198708a7e83902d4b3c92492825a5f616b2 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Tue, 13 Sep 2016 12:47:13 +0200 Subject: [PATCH 0443/1062] registry: minor refactoring --- .../dapps/registry/Application/application.js | 40 ++++++++++++------- js/src/dapps/registry/Container.js | 20 +++++----- js/src/dapps/registry/accounts/accounts.js | 3 -- js/src/dapps/registry/actions.js | 2 +- js/src/dapps/registry/reducers.js | 2 +- 5 files changed, 37 insertions(+), 30 deletions(-) diff --git a/js/src/dapps/registry/Application/application.js b/js/src/dapps/registry/Application/application.js index 5d96ecf5e16..ade1b774413 100644 --- a/js/src/dapps/registry/Application/application.js +++ b/js/src/dapps/registry/Application/application.js @@ -7,21 +7,37 @@ const muiTheme = getMuiTheme(lightBaseTheme); import CircularProgress from 'material-ui/CircularProgress'; import styles from './application.css'; import Accounts from '../accounts'; -import Lookup from '../Lookup'; +import Lookup from '../lookup'; import Register from '../register'; import Events from '../events'; -import Status from '../Status'; +import Status from '../status'; export default class Application extends Component { - static childContextTypes = { - muiTheme: PropTypes.object - }; + static childContextTypes = { muiTheme: PropTypes.object }; getChildContext () { return { muiTheme }; } + static propTypes = { + actions: PropTypes.object, + accounts: PropTypes.object, + account: PropTypes.object, + contract: PropTypes.object, + owner: PropTypes.string, + fee: PropTypes.object, + lookup: PropTypes.object, + events: PropTypes.array + }; + render () { - const { accounts, contract, fee, owner, actions } = this.props; + const { + actions, + accounts, + contract, fee, owner, + lookup, + events, + register + } = this.props; return (
    @@ -32,9 +48,9 @@ export default class Application extends Component { { contract && fee && owner ? (
    - - - + + +
    ) : @@ -44,9 +60,3 @@ export default class Application extends Component { } } - -Application.propTypes = { - contract: PropTypes.object, - fee: PropTypes.object, - owner: PropTypes.string -}; diff --git a/js/src/dapps/registry/Container.js b/js/src/dapps/registry/Container.js index 48bf5864a8e..8c0c70c730d 100644 --- a/js/src/dapps/registry/Container.js +++ b/js/src/dapps/registry/Container.js @@ -16,22 +16,22 @@ class Container extends Component { lookup: PropTypes.object, events: PropTypes.array }; + componentDidMount () { this.props.actions.fetchContract(); } render () { - const { actions, accounts, account, contract, owner, fee, lookup, events, register } = this.props; + const props = this.props; return (); } } diff --git a/js/src/dapps/registry/accounts/accounts.js b/js/src/dapps/registry/accounts/accounts.js index f9ef1d5031a..1325f5e48c6 100644 --- a/js/src/dapps/registry/accounts/accounts.js +++ b/js/src/dapps/registry/accounts/accounts.js @@ -27,10 +27,7 @@ export default class Accounts extends Component { this.props.actions.fetch(); } - state = { value: null }; - render () { - const { open } = this.state; const { all, selected } = this.props; return ( diff --git a/js/src/dapps/registry/actions.js b/js/src/dapps/registry/actions.js index 44c3a043fff..8dda32f117b 100644 --- a/js/src/dapps/registry/actions.js +++ b/js/src/dapps/registry/actions.js @@ -1,7 +1,7 @@ import registryAbi from './abi/registry.json'; const { api } = window.parity; import * as accounts from './accounts/actions.js'; -import * as lookup from './Lookup/actions.js'; +import * as lookup from './lookup/actions.js'; import * as events from './events/actions.js'; import * as register from './register/actions.js'; diff --git a/js/src/dapps/registry/reducers.js b/js/src/dapps/registry/reducers.js index c0859624cef..5e543501f9b 100644 --- a/js/src/dapps/registry/reducers.js +++ b/js/src/dapps/registry/reducers.js @@ -1,5 +1,5 @@ import accountsReducer from './accounts/reducers.js'; -import lookupReducer from './Lookup/reducers.js'; +import lookupReducer from './lookup/reducers.js'; import eventsReducer from './events/reducers.js'; import registerReducer from './register/reducers.js'; From 79a27f98ab1c5a540cd9bee22cde3b9ded34f5be Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 13 Sep 2016 12:58:06 +0200 Subject: [PATCH 0444/1062] transaction list has their names back --- js/src/redux/providers/balances.js | 14 +++++++---- .../Account/Transactions/transactions.js | 23 +++++++++---------- js/src/views/Account/account.js | 1 + 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/js/src/redux/providers/balances.js b/js/src/redux/providers/balances.js index 22b6073895d..8da2476ca5f 100644 --- a/js/src/redux/providers/balances.js +++ b/js/src/redux/providers/balances.js @@ -81,11 +81,12 @@ export default class Balances { return Promise.all(promises); }); }) - .then((tokens) => { - this._tokens = tokens.map((token) => { - const [address, tag, format, name] = token; + .then((_tokens) => { + const tokens = {}; + this._tokens = _tokens.map((_token) => { + const [address, tag, format, name] = _token; - return { + const token = { address, name, tag, @@ -93,9 +94,12 @@ export default class Balances { images: images[name.toLowerCase()], contract: this._api.newContract(eip20Abi, address) }; + tokens[address] = token; + + return token; }); - this._store.dispatch(getTokens(this._tokens)); + this._store.dispatch(getTokens(tokens)); this._retrieveBalances(); }); } diff --git a/js/src/views/Account/Transactions/transactions.js b/js/src/views/Account/Transactions/transactions.js index 794ae22c393..9941d494f64 100644 --- a/js/src/views/Account/Transactions/transactions.js +++ b/js/src/views/Account/Transactions/transactions.js @@ -5,7 +5,6 @@ import { bindActionCreators } from 'redux'; import moment from 'moment'; import LinearProgress from 'material-ui/LinearProgress'; -import { retrieveAccount } from '../../../util'; import format from '../../../api/format'; import etherscan from '../../../3rdparty/etherscan'; import { Container, IdentityIcon } from '../../../ui'; @@ -39,16 +38,11 @@ function formatEther (value) { } class Transactions extends Component { - static contextTypes = { - api: PropTypes.object, - accounts: PropTypes.array, - contacts: PropTypes.array, - contracts: PropTypes.array, - tokens: PropTypes.array - } - static propTypes = { address: PropTypes.string.isRequired, + accounts: PropTypes.object, + contacts: PropTypes.object, + tokens: PropTypes.object, isTest: PropTypes.bool } @@ -70,8 +64,8 @@ class Transactions extends Component { } renderAddress (prefix, address) { - const { accounts, contacts, contracts, tokens } = this.context; - const account = retrieveAccount(address, accounts, contacts, contracts, tokens); + const { accounts, contacts, tokens } = this.props; + const account = (accounts || {})[address] || (contacts || {})[address] || (tokens || {})[address]; const link = `${prefix}address/${address}`; const name = account ? account.name.toUpperCase() @@ -179,9 +173,14 @@ class Transactions extends Component { function mapStateToProps (state) { const { isTest } = state.nodeStatus; + const { accounts, contacts } = state.personal; + const { tokens } = state.balances; return { - isTest + isTest, + accounts, + contacts, + tokens }; } diff --git a/js/src/views/Account/account.js b/js/src/views/Account/account.js index 6052a3431f8..1e2342bfa1c 100644 --- a/js/src/views/Account/account.js +++ b/js/src/views/Account/account.js @@ -50,6 +50,7 @@ class Account extends Component { account={ account } balance={ balance } />
    From efdacf009806ca7ea31527b4b6da33d55509fa00 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Tue, 13 Sep 2016 12:59:32 +0200 Subject: [PATCH 0445/1062] registry: code style :sparkles: --- .../dapps/registry/Application/application.js | 23 ++++++++++--------- js/src/dapps/registry/Lookup/lookup.js | 8 +++---- js/src/dapps/registry/Status/status.js | 4 ++-- js/src/dapps/registry/accounts/accounts.js | 1 - js/src/dapps/registry/accounts/actions.js | 8 +++---- js/src/dapps/registry/events/actions.js | 4 ++-- js/src/dapps/registry/events/events.js | 5 ++-- js/src/dapps/registry/events/reducers.js | 10 ++++---- js/src/dapps/registry/register/actions.js | 2 +- js/src/dapps/registry/register/reducers.js | 1 - js/src/dapps/registry/register/register.js | 12 +++++----- 11 files changed, 38 insertions(+), 40 deletions(-) diff --git a/js/src/dapps/registry/Application/application.js b/js/src/dapps/registry/Application/application.js index ade1b774413..2bfecf453e2 100644 --- a/js/src/dapps/registry/Application/application.js +++ b/js/src/dapps/registry/Application/application.js @@ -26,7 +26,8 @@ export default class Application extends Component { owner: PropTypes.string, fee: PropTypes.object, lookup: PropTypes.object, - events: PropTypes.array + events: PropTypes.array, + register: PropTypes.object }; render () { @@ -45,16 +46,16 @@ export default class Application extends Component {

    RΞgistry

    - { contract && fee && owner - ? ( -
    - - - - -
    - ) : - } + { contract && fee && owner ? ( +
    + + + + +
    + ) : ( + + ) }
    ); } diff --git a/js/src/dapps/registry/Lookup/lookup.js b/js/src/dapps/registry/Lookup/lookup.js index 7d189591632..94cfe11f91a 100644 --- a/js/src/dapps/registry/Lookup/lookup.js +++ b/js/src/dapps/registry/Lookup/lookup.js @@ -1,5 +1,5 @@ import React, { Component, PropTypes } from 'react'; -import {Card, CardHeader, CardText} from 'material-ui/Card'; +import { Card, CardHeader, CardText } from 'material-ui/Card'; import TextField from 'material-ui/TextField'; import RaisedButton from 'material-ui/RaisedButton'; import SearchIcon from 'material-ui/svg-icons/action/search'; @@ -16,12 +16,12 @@ export default class Lookup extends Component { state = { name: '', key: 'A' }; render () { - const { name, key } = this.state - const props = this.props.lookup + const { name, key } = this.state; + const props = this.props.lookup; return ( - +
    -
    Registry at { address }
    -
    Owned by { owner }
    +
    Registry at { address }
    +
    Owned by { owner }
    ); } diff --git a/js/src/dapps/registry/accounts/accounts.js b/js/src/dapps/registry/accounts/accounts.js index 1325f5e48c6..7b26ea22199 100644 --- a/js/src/dapps/registry/accounts/accounts.js +++ b/js/src/dapps/registry/accounts/accounts.js @@ -1,7 +1,6 @@ import React, { Component, PropTypes } from 'react'; import Menu from 'material-ui/Menu'; import MenuItem from 'material-ui/MenuItem'; -import AccountIcon from 'material-ui/svg-icons/action/account-circle'; // import styles from './lookup.css'; diff --git a/js/src/dapps/registry/accounts/actions.js b/js/src/dapps/registry/accounts/actions.js index 30ab5d3b3cf..687e36b7420 100644 --- a/js/src/dapps/registry/accounts/actions.js +++ b/js/src/dapps/registry/accounts/actions.js @@ -9,10 +9,10 @@ export const fetch = () => (dispatch) => { ]) .then(([ addresses, infos ]) => { const accounts = addresses.reduce((accounts, address) => { - if (infos[address]) accounts[address] = { ...infos[address], address } - return accounts - }, {}) - dispatch(set(accounts)) + if (infos[address]) accounts[address] = { ...infos[address], address }; + return accounts; + }, {}); + dispatch(set(accounts)); }) .catch((err) => { console.error('could not fetch accounts'); diff --git a/js/src/dapps/registry/events/actions.js b/js/src/dapps/registry/events/actions.js index a8f8acbb9f9..5f01fdd7055 100644 --- a/js/src/dapps/registry/events/actions.js +++ b/js/src/dapps/registry/events/actions.js @@ -23,7 +23,7 @@ export const subscribe = (name, from = 0, to = 'latest') => transaction: e.transactionHash, parameters: e.params }; - dispatch(event(name, data)) + dispatch(event(name, data)); } - }) + }); }; diff --git a/js/src/dapps/registry/events/events.js b/js/src/dapps/registry/events/events.js index 13ad6dacf51..35cc64f36c3 100644 --- a/js/src/dapps/registry/events/events.js +++ b/js/src/dapps/registry/events/events.js @@ -1,6 +1,5 @@ import React, { Component, PropTypes } from 'react'; -import {Card, CardHeader, CardText} from 'material-ui/Card'; -import TextField from 'material-ui/TextField'; +import { Card, CardHeader, CardText } from 'material-ui/Card'; const { IdentityIcon } = window.parity.react; import styles from './events.css'; @@ -53,7 +52,7 @@ export default class Events extends Component { render () { return ( - + { this.props.events .filter((e) => eventTypes[e.type]) diff --git a/js/src/dapps/registry/events/reducers.js b/js/src/dapps/registry/events/reducers.js index cefa63fcce1..19cfff1af0f 100644 --- a/js/src/dapps/registry/events/reducers.js +++ b/js/src/dapps/registry/events/reducers.js @@ -1,10 +1,10 @@ const initialState = []; const sortEvents = (a, b) => { - const d = a.block.minus(b.block).toFixed(0) - if (d === 0) return a.index.minus(b.index).toFixed(0) - return d -} + const d = a.block.minus(b.block).toFixed(0); + if (d === 0) return a.index.minus(b.index).toFixed(0); + return d; +}; export default (state = initialState, action) => { if (action.type === 'events subscribe start') @@ -13,7 +13,7 @@ export default (state = initialState, action) => { return state; // TODO ? if (action.type === 'events event') { - if (action.event.state !== 'mined') return state + if (action.event.state !== 'mined') return state; return state .filter((event) => event.key !== action.event.key) .concat(action.event) diff --git a/js/src/dapps/registry/register/actions.js b/js/src/dapps/registry/register/actions.js index df5f574bbab..fa6c2deb21c 100644 --- a/js/src/dapps/registry/register/actions.js +++ b/js/src/dapps/registry/register/actions.js @@ -23,7 +23,7 @@ export const register = (name) => (dispatch, getState) => { .then((gas) => { options.gas = gas.mul(1.2).toFixed(0); dispatch(start(name)); - return reserve.postTransaction(options, values) + return reserve.postTransaction(options, values); }) .then((data) => { dispatch(success(name)); diff --git a/js/src/dapps/registry/register/reducers.js b/js/src/dapps/registry/register/reducers.js index 5e23a59dd6a..e6bbd160192 100644 --- a/js/src/dapps/registry/register/reducers.js +++ b/js/src/dapps/registry/register/reducers.js @@ -4,7 +4,6 @@ const initialState = { }; export default (state = initialState, action) => { - if (action.type === 'register success') return { ...state, names: state.names .filter((n) => n !== action.name) diff --git a/js/src/dapps/registry/register/register.js b/js/src/dapps/registry/register/register.js index dcf20f5c33b..2e6446a7afd 100644 --- a/js/src/dapps/registry/register/register.js +++ b/js/src/dapps/registry/register/register.js @@ -1,10 +1,10 @@ import React, { Component, PropTypes } from 'react'; -import {Card, CardHeader, CardText} from 'material-ui/Card'; +import { Card, CardHeader, CardText } from 'material-ui/Card'; import TextField from 'material-ui/TextField'; import RaisedButton from 'material-ui/RaisedButton'; import CheckIcon from 'material-ui/svg-icons/navigation/check'; -const { fromWei } = window.parity.api.format; +const { fromWei } = window.parity.api.format; import styles from './register.css'; @@ -19,13 +19,13 @@ export default class Register extends Component { state = { name: '' }; render () { - const { name } = this.state - const props = this.props.register - const { fee } = this.props + const { name } = this.state; + const props = this.props.register; + const { fee } = this.props; return ( - +
    Date: Tue, 13 Sep 2016 13:14:02 +0200 Subject: [PATCH 0446/1062] IdentityIcon has token lookups back --- js/src/services/lookup.js | 16 ------- js/src/ui/IdentityIcon/identityIcon.js | 16 +++---- js/src/util/index.js | 5 --- js/src/util/lookup.js | 16 ------- js/src/views/Dapps/Summary/summary.js | 6 ++- js/src/views/Dapps/dapps.js | 29 +++++++++++- .../Signer/components/Account/Account.js | 44 +++++++++++++------ 7 files changed, 69 insertions(+), 63 deletions(-) delete mode 100644 js/src/services/lookup.js delete mode 100644 js/src/util/index.js delete mode 100644 js/src/util/lookup.js diff --git a/js/src/services/lookup.js b/js/src/services/lookup.js deleted file mode 100644 index e909083072d..00000000000 --- a/js/src/services/lookup.js +++ /dev/null @@ -1,16 +0,0 @@ -export function retrieveAccount (address, accounts, contacts, contracts, tokens) { - const cmp = (_account) => _account.address === address; - - let account = accounts.find(cmp); - if (!account) { - account = contacts.find(cmp); - if (!account) { - account = contracts.find(cmp); - if (!account) { - account = tokens.find(cmp); - } - } - } - - return account; -} diff --git a/js/src/ui/IdentityIcon/identityIcon.js b/js/src/ui/IdentityIcon/identityIcon.js index e42091add49..a2f8bb72c0f 100644 --- a/js/src/ui/IdentityIcon/identityIcon.js +++ b/js/src/ui/IdentityIcon/identityIcon.js @@ -4,16 +4,13 @@ import blockies from 'blockies'; import styles from './identityIcon.css'; export default class IdentityIcon extends Component { - static contextTypes = { - tokens: PropTypes.array - } - static propTypes = { address: PropTypes.string, className: PropTypes.string, center: PropTypes.bool, padded: PropTypes.bool, - inline: PropTypes.bool + inline: PropTypes.bool, + tokens: PropTypes.object } state = { @@ -25,7 +22,9 @@ export default class IdentityIcon extends Component { } componentWillReceiveProps (newProps) { - if (newProps.address === this.props.address) { + const { address, tokens } = this.props; + + if (newProps.address === address && newProps.tokens === tokens) { return; } @@ -33,9 +32,8 @@ export default class IdentityIcon extends Component { } updateIcon (_address) { - const { tokens } = this.context; - const { inline } = this.props; - const token = (tokens || []).find((c) => c.address === _address); + const { tokens, inline } = this.props; + const token = (tokens || {})[_address]; if (token && token.images) { this.setState({ diff --git a/js/src/util/index.js b/js/src/util/index.js deleted file mode 100644 index aabf726606c..00000000000 --- a/js/src/util/index.js +++ /dev/null @@ -1,5 +0,0 @@ -import { retrieveAccount } from './lookup'; - -export { - retrieveAccount -}; diff --git a/js/src/util/lookup.js b/js/src/util/lookup.js deleted file mode 100644 index 2cca52d9a59..00000000000 --- a/js/src/util/lookup.js +++ /dev/null @@ -1,16 +0,0 @@ -export function retrieveAccount (address, accounts = [], contacts = [], contracts = [], tokens = []) { - const cmp = (_account) => _account.address === address; - - let account = accounts.find(cmp); - if (!account) { - account = contacts.find(cmp); - if (!account) { - account = contracts.find(cmp); - if (!account) { - account = tokens.find(cmp); - } - } - } - - return account; -} diff --git a/js/src/views/Dapps/Summary/summary.js b/js/src/views/Dapps/Summary/summary.js index 2beeee892ce..5dda1903340 100644 --- a/js/src/views/Dapps/Summary/summary.js +++ b/js/src/views/Dapps/Summary/summary.js @@ -11,11 +11,12 @@ export default class Summary extends Component { static propTypes = { app: PropTypes.object.isRequired, + tokens: PropTypes.object, children: PropTypes.node } render () { - const { app } = this.props; + const { app, tokens } = this.props; if (!app) { return null; @@ -26,7 +27,8 @@ export default class Summary extends Component { return ( + address={ app.address } + tokens={ tokens } /> { app.name }</Link> } byline={ app.description } /> diff --git a/js/src/views/Dapps/dapps.js b/js/src/views/Dapps/dapps.js index f3dc3a80c48..6f12f212a3e 100644 --- a/js/src/views/Dapps/dapps.js +++ b/js/src/views/Dapps/dapps.js @@ -1,4 +1,6 @@ import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; import { Actionbar, Page } from '../../ui'; @@ -6,11 +8,15 @@ import Summary from './Summary'; import styles from './dapps.css'; -export default class Dapps extends Component { +class Dapps extends Component { static contextTypes = { api: PropTypes.object.isRequired } + static propTypes = { + tokens: PropTypes.object + } + state = { apps: [ { @@ -49,6 +55,7 @@ export default class Dapps extends Component { } renderApps () { + const { tokens } = this.props; const { apps } = this.state; return apps.map((app, idx) => { @@ -57,9 +64,27 @@ export default class Dapps extends Component { className={ styles.contract } key={ app.address }> <Summary - app={ app } /> + app={ app } + tokens={ tokens } /> </div> ); }); } } + +function mapStateToProps (state) { + const { tokens } = state.balances; + + return { + tokens + }; +} + +function mapDispatchToProps (dispatch) { + return bindActionCreators({}, dispatch); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(Dapps); diff --git a/js/src/views/Signer/components/Account/Account.js b/js/src/views/Signer/components/Account/Account.js index dd6ab9d6c12..2068065def3 100644 --- a/js/src/views/Signer/components/Account/Account.js +++ b/js/src/views/Signer/components/Account/Account.js @@ -1,21 +1,18 @@ import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; import styles from './Account.css'; -import { retrieveAccount } from '../../../../util'; import { IdentityIcon } from '../../../../ui'; import AccountLink from './AccountLink'; -export default class Account extends Component { - static contextTypes = { - accounts: PropTypes.array, - contacts: PropTypes.array, - contracts: PropTypes.array, - tokens: PropTypes.array - } - +class Account extends Component { static propTypes = { className: PropTypes.string, + accounts: PropTypes.object, + contacts: PropTypes.object, + tokens: PropTypes.object, address: PropTypes.string.isRequired, chain: PropTypes.string.isRequired, balance: PropTypes.object // eth BigNumber, not required since it mght take time to fetch @@ -96,11 +93,12 @@ export default class Account extends Component { } _retrieveName () { - const { accounts, contacts, contracts, tokens } = this.context; - const { address } = this.props; - const account = retrieveAccount(address, accounts, contacts, contracts, tokens); + const { address, accounts, contacts, tokens } = this.props; + const account = (accounts || {})[address] || (contacts || {})[address] || (tokens || {})[address]; - return account ? account.name : null; + return account + ? account.name + : null; } tinyAddress () { @@ -115,3 +113,23 @@ export default class Account extends Component { return address.slice(2, 8) + '..' + address.slice(len - 7); } } + +function mapStateToProps (state) { + const { accounts, contacts } = state.personal; + const { tokens } = state.balances; + + return { + accounts, + contacts, + tokens + }; +} + +function mapDispatchToProps (dispatch) { + return bindActionCreators({}, dispatch); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(Account); From 00ca636ed9cd8f60a4214f3a80c34a20907df06e Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 13 Sep 2016 13:49:54 +0200 Subject: [PATCH 0447/1062] no web3 providers in Status --- js/src/index.js | 13 +------- js/src/redux/reducers.js | 17 +--------- js/src/ui/ApiProvider/apiProvider.css | 4 --- js/src/ui/ApiProvider/apiProvider.js | 8 ++--- js/src/ui/Modal/index.js | 2 +- .../containers/StatusPage/StatusPage.js | 18 +++-------- js/src/views/Status/middleware/index.js | 18 ++--------- js/src/views/Status/status.js | 31 ++----------------- 8 files changed, 13 insertions(+), 98 deletions(-) delete mode 100644 js/src/ui/ApiProvider/apiProvider.css diff --git a/js/src/index.js b/js/src/index.js index fb82f1bf1a9..7f8ac2a0efe 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -20,10 +20,6 @@ import { Web3Provider as SignerWeb3Provider, web3Extension as statusWeb3Extensio import { WebSocketsProvider, Ws } from './views/Signer/utils'; import { SignerDataProvider, WsDataProvider } from './views/Signer/providers'; -// TODO: same with Status... -import { Web3Provider as StatusWeb3Provider } from './views/Status/provider/web3-provider'; -import StatusEthcoreWeb3 from './views/Status/provider/web3-ethcore-provider'; - import './environment'; import styles from './reset.css'; @@ -45,20 +41,13 @@ const ws = new Ws(parityUrl); const web3ws = new Web3(new WebSocketsProvider(ws)); statusWeb3Extension(web3ws).map((extension) => web3ws._extend(extension)); -// status -const web3 = new Web3(new Web3.providers.HttpProvider(process.env.RPC_ADDRESS || '/rpc/')); -const ethcoreWeb3 = new StatusEthcoreWeb3(web3); - -const store = initStore(api, ws, tokenSetter, web3); +const store = initStore(api, ws, tokenSetter); // signer new WsDataProvider(store, ws); // eslint-disable-line no-new new SignerDataProvider(store, ws); // eslint-disable-line no-new ws.init(initToken); -// status -new StatusWeb3Provider(web3, ethcoreWeb3, store).start(); - const routerHistory = useRouterHistory(createHashHistory)({}); ReactDOM.render( diff --git a/js/src/redux/reducers.js b/js/src/redux/reducers.js index 40238c8e1ec..1843309a81b 100644 --- a/js/src/redux/reducers.js +++ b/js/src/redux/reducers.js @@ -11,15 +11,6 @@ import { requests as signerRequestsReducer } from '../views/Signer/reducers'; -import { - status as statusReducer, - debug as statusDebugReducer, - logger as statusLoggerReducer, - mining as statusMiningReducer, - rpc as statusRpcReducer, - settings as statusSettingsReducer -} from '../views/Status/reducers'; - export default function () { return combineReducers({ errors: errorReducer, @@ -31,12 +22,6 @@ export default function () { personal: personalReducer, signer: signerReducer, - signerRequests: signerRequestsReducer, - status: statusReducer, - statusSettings: statusSettingsReducer, - statusMining: statusMiningReducer, - statusRpc: statusRpcReducer, - statusLogger: statusLoggerReducer, - statusDebug: statusDebugReducer + signerRequests: signerRequestsReducer }); } diff --git a/js/src/ui/ApiProvider/apiProvider.css b/js/src/ui/ApiProvider/apiProvider.css deleted file mode 100644 index 6d5fc477603..00000000000 --- a/js/src/ui/ApiProvider/apiProvider.css +++ /dev/null @@ -1,4 +0,0 @@ -.api { - width: 100%; - height: 100%; -} diff --git a/js/src/ui/ApiProvider/apiProvider.js b/js/src/ui/ApiProvider/apiProvider.js index 0a02d0bdbf9..db35f3e113e 100644 --- a/js/src/ui/ApiProvider/apiProvider.js +++ b/js/src/ui/ApiProvider/apiProvider.js @@ -1,6 +1,4 @@ -import React, { Component, PropTypes } from 'react'; - -import styles from './apiProvider.css'; +import { Component, PropTypes } from 'react'; export default class ApiProvider extends Component { static propTypes = { @@ -15,9 +13,7 @@ export default class ApiProvider extends Component { render () { const { children } = this.props; - return ( - <div className={ styles.api }>{ children }</div> - ); + return children; } getChildContext () { diff --git a/js/src/ui/Modal/index.js b/js/src/ui/Modal/index.js index adfcb8f125b..2d77d4d6d03 100644 --- a/js/src/ui/Modal/index.js +++ b/js/src/ui/Modal/index.js @@ -1 +1 @@ -export default from './Modal'; +export default from './modal'; diff --git a/js/src/views/Status/containers/StatusPage/StatusPage.js b/js/src/views/Status/containers/StatusPage/StatusPage.js index 25ca59e0a0f..448f9f8d6b9 100644 --- a/js/src/views/Status/containers/StatusPage/StatusPage.js +++ b/js/src/views/Status/containers/StatusPage/StatusPage.js @@ -1,25 +1,17 @@ import React, { Component, PropTypes } from 'react'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; -import { extend } from 'lodash'; import { clearStatusLogs, toggleStatusLogs } from '../../../../redux/actions'; import Debug from '../../components/Debug'; import Status from '../../components/Status'; -import * as debugActions from '../../actions/debug'; -import * as ModifyMiningActions from '../../actions/modify-mining'; - import styles from './statusPage.css'; class StatusPage extends Component { static propTypes = { nodeStatus: PropTypes.object.isRequired, - status: PropTypes.object.isRequired, - statusSettings: PropTypes.object.isRequired, - statusMining: PropTypes.object.isRequired, - statusDebug: PropTypes.object.isRequired, actions: PropTypes.object.isRequired } @@ -39,12 +31,10 @@ function mapStateToProps (state) { function mapDispatchToProps (dispatch) { return { - actions: bindActionCreators( - extend({}, ModifyMiningActions, debugActions, { - clearStatusLogs, - toggleStatusLogs - }), - dispatch) + actions: bindActionCreators({ + clearStatusLogs, + toggleStatusLogs + }, dispatch) }; } diff --git a/js/src/views/Status/middleware/index.js b/js/src/views/Status/middleware/index.js index 48a5a5885a0..de9c57a63d9 100644 --- a/js/src/views/Status/middleware/index.js +++ b/js/src/views/Status/middleware/index.js @@ -1,23 +1,9 @@ -import request from 'browser-request'; -import EthcoreWeb3 from '../provider/web3-ethcore-provider'; - -// Middleware classes -import logger from './logger'; -import WebInteractions from './user-web3-interactions'; -import Rpc from './rpc'; import LocalStorage from './localstorage'; -export default function (web3) { - const ethcoreWeb3 = new EthcoreWeb3(web3); - // Middleware Instances - const web3Interactions = new WebInteractions(web3, ethcoreWeb3); - const rpc = new Rpc(request); +export default function () { const localstorage = new LocalStorage(); return [ - logger, - localstorage.toMiddleware(), - rpc.toMiddleware(), - web3Interactions.toMiddleware() + localstorage.toMiddleware() ]; } diff --git a/js/src/views/Status/status.js b/js/src/views/Status/status.js index 185091a21a8..cf836141e9e 100644 --- a/js/src/views/Status/status.js +++ b/js/src/views/Status/status.js @@ -1,24 +1,12 @@ -import React, { Component, PropTypes } from 'react'; -import { connect } from 'react-redux'; -import { bindActionCreators } from 'redux'; -import { extend } from 'lodash'; +import React, { Component } from 'react'; import { Actionbar, Page } from '../../ui'; -import { updateLogging } from './actions/logger'; import StatusPage from './containers/StatusPage'; import styles from './status.css'; -class Status extends Component { - static propTypes = { - status: PropTypes.object.isRequired, - statusLogger: PropTypes.object.isRequired, - routing: PropTypes.object.isRequired, - actions: PropTypes.object.isRequired, - params: PropTypes.object - } - +export default class Status extends Component { render () { return ( <div className={ styles.container }> @@ -31,18 +19,3 @@ class Status extends Component { ); } } - -function mapStateToProps (state) { - return state; -} - -function mapDispatchToProps (dispatch) { - return { - actions: bindActionCreators(extend({}, {}, { updateLogging }), dispatch) - }; -} - -export default connect( - mapStateToProps, - mapDispatchToProps -)(Status); From 7db9235472d963335e72ecf40005cdb8fdba97e5 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 13 Sep 2016 13:52:05 +0200 Subject: [PATCH 0448/1062] apply all case-sensitivity fixes --- js/src/ui/Modal/ModalSteps/index.js | 2 +- js/src/ui/Tooltips/Tooltip/index.js | 2 +- js/webpack.config.js | 4 ---- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/js/src/ui/Modal/ModalSteps/index.js b/js/src/ui/Modal/ModalSteps/index.js index 08e0460607f..4ac9ea401d8 100644 --- a/js/src/ui/Modal/ModalSteps/index.js +++ b/js/src/ui/Modal/ModalSteps/index.js @@ -1 +1 @@ -export default from './ModalSteps'; +export default from './modalSteps'; diff --git a/js/src/ui/Tooltips/Tooltip/index.js b/js/src/ui/Tooltips/Tooltip/index.js index 17f06b52ba6..7819891f326 100644 --- a/js/src/ui/Tooltips/Tooltip/index.js +++ b/js/src/ui/Tooltips/Tooltip/index.js @@ -1 +1 @@ -export default from './Tooltip'; +export default from './tooltip'; diff --git a/js/webpack.config.js b/js/webpack.config.js index 7998a4b5ea2..2d7d2658d0b 100644 --- a/js/webpack.config.js +++ b/js/webpack.config.js @@ -122,10 +122,6 @@ module.exports = { return a; } ), - new webpack.NormalModuleReplacementPlugin( - /dapp-styles\/hex-grid-tile\.png$/, - require.resolve('dapp-styles/hex-grid-tile.png') - ), new webpack.DefinePlugin({ 'process.env': { NODE_ENV: JSON.stringify(ENV), From e6d3f01b124678818250914a855431eed8b5b807 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 13 Sep 2016 14:30:17 +0200 Subject: [PATCH 0449/1062] show all debug logs on a signle screen, stopped message --- .../views/Status/components/Debug/Debug.css | 8 +++--- js/src/views/Status/components/Debug/Debug.js | 27 ++++++++++++++++--- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/js/src/views/Status/components/Debug/Debug.css b/js/src/views/Status/components/Debug/Debug.css index 8129f408be2..f6e333c4e0f 100644 --- a/js/src/views/Status/components/Debug/Debug.css +++ b/js/src/views/Status/components/Debug/Debug.css @@ -22,9 +22,11 @@ .logs { width: 100%; - overflow: auto; - height: 50vh; - min-height: 400px; +} + +.stopped { + color: #aaa; + padding: 1em 0; } .log { diff --git a/js/src/views/Status/components/Debug/Debug.js b/js/src/views/Status/components/Debug/Debug.js index cc2cc47a974..b6987dc7101 100644 --- a/js/src/views/Status/components/Debug/Debug.js +++ b/js/src/views/Status/components/Debug/Debug.js @@ -28,13 +28,26 @@ export default class Debug extends Component { <h2 className={ styles.subheader }> { devLogsLevels || '-' } </h2> - <div className={ styles.logs }> - { this.renderLogs() } - </div> + { this.renderToggle() } + { this.renderLogs() } </Container> ); } + renderToggle () { + const { devLogsEnabled } = this.props.nodeStatus; + + if (devLogsEnabled) { + return null; + } + + return ( + <div className={ styles.stopped }> + Refresh and display of logs from Parity is currently stopped via the UI, start it to see the latest updates. + </div> + ); + } + renderLogs () { const { nodeStatus } = this.props; const { devLogs } = nodeStatus; @@ -43,11 +56,17 @@ export default class Debug extends Component { return null; } - return devLogs.map((log, idx) => ( + const logs = devLogs.map((log, idx) => ( <pre className={ styles.log } key={ idx }> { log } </pre> )); + + return ( + <div className={ styles.logs }> + { logs } + </div> + ); } renderActions () { From b740097571664bcfa0408eeebaabe26b859e83fe Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 13 Sep 2016 14:47:01 +0200 Subject: [PATCH 0450/1062] text description --- js/src/api/contract/contract.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/api/contract/contract.js b/js/src/api/contract/contract.js index 414eb06de24..0866b24ccf2 100644 --- a/js/src/api/contract/contract.js +++ b/js/src/api/contract/contract.js @@ -245,11 +245,11 @@ export default class Contract { let event = null; if (eventName) { - event = this.events.find((evt) => evt.name === eventName); + event = this._events.find((evt) => evt.name === eventName); if (!event) { const events = this._events.map((evt) => evt.name).join(', '); - throw new Error(`${eventName} is not a valid eventName, subscribe using one of ${events} or null to include all events`); + throw new Error(`${eventName} is not a valid eventName, subscribe using one of ${events} (or null to include all)`); } } From 8c0a42fa95e29b17bf9a8191c1dbf3598e78bba5 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 13 Sep 2016 15:12:55 +0200 Subject: [PATCH 0451/1062] install npm modules & run list & test via gitlab.yml --- .gitlab-ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bf7f51d7135..2f8e5fd7c36 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -4,7 +4,7 @@ stages: - deploy variables: GIT_DEPTH: "3" - SIMPLECOV: "true" + SIMPLECOV: "true" RUST_BACKTRACE: "1" cache: key: "$CI_BUILD_NAME/$CI_BUILD_REF_NAME" @@ -227,7 +227,9 @@ test-linux: stage: test before_script: - git submodule update --init --recursive + - cd js && npm install && cd .. script: + - cd js && npm run lint && npm test - ./test.sh --verbose tags: - rust-test From 3e2d01b412611532b6e7362301f3f93e42d15ad3 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 13 Sep 2016 15:15:44 +0200 Subject: [PATCH 0452/1062] eslint issues with ws --- js/src/api/transport/ws/ws.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/api/transport/ws/ws.js b/js/src/api/transport/ws/ws.js index 786b405ecad..8698f70d113 100644 --- a/js/src/api/transport/ws/ws.js +++ b/js/src/api/transport/ws/ws.js @@ -16,7 +16,7 @@ export default class Ws extends JsonRpcBase { _onMessage = (event) => { const result = JSON.parse(event.data); - const {resolve, reject} = this._messages[result.id]; + const { resolve, reject } = this._messages[result.id]; if (result.error) { this.error(event.data); From aae2696f4fead4e90e44e5f32fa555fa254e3a97 Mon Sep 17 00:00:00 2001 From: Jannis R <mail@jannisr.de> Date: Tue, 13 Sep 2016 15:30:56 +0200 Subject: [PATCH 0453/1062] registry: use contract.subscribe to fetch events --- js/src/dapps/registry/events/actions.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/js/src/dapps/registry/events/actions.js b/js/src/dapps/registry/events/actions.js index 5f01fdd7055..2998f63f29c 100644 --- a/js/src/dapps/registry/events/actions.js +++ b/js/src/dapps/registry/events/actions.js @@ -8,12 +8,14 @@ export const subscribe = (name, from = 0, to = 'latest') => (dispatch, getState) => { const { contract } = getState(); if (!contract || !contract.instance) return; - if (!contract.instance[name]) return; - const channel = contract.instance[name]; dispatch(start(name, from, to)); - channel.subscribe({ fromBlock: from, toBlock: to }, (events) => { - // TODO there's no error param! the `fail` action is never used + contract.subscribe(name, { fromBlock: from, toBlock: to }, (err, events) => { + if (err) { + console.error(`could not subscribe to event ${name}.`); + console.error(err); + return dispatch(fail(name)); + } for (let e of events) { const data = { key: '' + e.transactionHash + e.logIndex, From c727e2d02324a4653eb959fb705a1a70177b34aa Mon Sep 17 00:00:00 2001 From: Jannis R <mail@jannisr.de> Date: Tue, 13 Sep 2016 15:47:35 +0200 Subject: [PATCH 0454/1062] registry: cleanup, code style --- js/src/dapps/registry/Container.js | 12 +----------- js/src/dapps/registry/Lookup/reducers.js | 9 ++++++--- js/src/dapps/registry/accounts/accounts.js | 2 -- js/src/dapps/registry/accounts/reducers.js | 6 ++++-- js/src/dapps/registry/events/reducers.js | 6 ++++-- js/src/dapps/registry/reducers.js | 9 ++++++--- js/src/dapps/registry/register/reducers.js | 3 ++- 7 files changed, 23 insertions(+), 24 deletions(-) diff --git a/js/src/dapps/registry/Container.js b/js/src/dapps/registry/Container.js index 8c0c70c730d..df1a73dfec0 100644 --- a/js/src/dapps/registry/Container.js +++ b/js/src/dapps/registry/Container.js @@ -22,17 +22,7 @@ class Container extends Component { } render () { - const props = this.props; - return (<Application - actions={ props.actions } - accounts={ props.accounts } - contract={ props.contract } - owner={ props.owner } - fee={ props.fee } - lookup={ props.lookup } - events={ props.events } - register={ props.register } - />); + return (<Application { ...this.props } />); } } diff --git a/js/src/dapps/registry/Lookup/reducers.js b/js/src/dapps/registry/Lookup/reducers.js index dc0aa80b31c..384517ba49b 100644 --- a/js/src/dapps/registry/Lookup/reducers.js +++ b/js/src/dapps/registry/Lookup/reducers.js @@ -5,26 +5,29 @@ const initialState = { }; export default (state = initialState, action) => { - if (action.type === 'lookup start') + if (action.type === 'lookup start') { return { pending: true, name: action.name, key: action.key, result: null }; + } - if (action.type === 'lookup error') + if (action.type === 'lookup error') { return { pending: false, name: null, key: null, result: null }; + } - if (action.type === 'lookup success') + if (action.type === 'lookup success') { return { pending: false, name: null, key: null, result: action.result }; + } return state; }; diff --git a/js/src/dapps/registry/accounts/accounts.js b/js/src/dapps/registry/accounts/accounts.js index 7b26ea22199..89801c8c82c 100644 --- a/js/src/dapps/registry/accounts/accounts.js +++ b/js/src/dapps/registry/accounts/accounts.js @@ -2,8 +2,6 @@ import React, { Component, PropTypes } from 'react'; import Menu from 'material-ui/Menu'; import MenuItem from 'material-ui/MenuItem'; -// import styles from './lookup.css'; - const renderAccount = (active) => (account) => ( <MenuItem key={ account.address } diff --git a/js/src/dapps/registry/accounts/reducers.js b/js/src/dapps/registry/accounts/reducers.js index 1555d228d51..6bfde15d578 100644 --- a/js/src/dapps/registry/accounts/reducers.js +++ b/js/src/dapps/registry/accounts/reducers.js @@ -4,11 +4,13 @@ const initialState = { }; export default (state = initialState, action) => { - if (action.type === 'accounts set') + if (action.type === 'accounts set') { return { ...state, all: action.accounts }; + } - if (action.type === 'accounts select' && state.all && state.all[action.address]) + if (action.type === 'accounts select' && state.all[action.address]) { return { ...state, selected: state.all[action.address] }; + } return state; }; diff --git a/js/src/dapps/registry/events/reducers.js b/js/src/dapps/registry/events/reducers.js index 19cfff1af0f..1e6993b0ff4 100644 --- a/js/src/dapps/registry/events/reducers.js +++ b/js/src/dapps/registry/events/reducers.js @@ -7,10 +7,12 @@ const sortEvents = (a, b) => { }; export default (state = initialState, action) => { - if (action.type === 'events subscribe start') + if (action.type === 'events subscribe start') { return state; // TODO store the subscriptions? - if (action.type === 'events subscribe fail') + } + if (action.type === 'events subscribe fail') { return state; // TODO ? + } if (action.type === 'events event') { if (action.event.state !== 'mined') return state; diff --git a/js/src/dapps/registry/reducers.js b/js/src/dapps/registry/reducers.js index 5e543501f9b..b2f3cec4522 100644 --- a/js/src/dapps/registry/reducers.js +++ b/js/src/dapps/registry/reducers.js @@ -18,14 +18,17 @@ export default (state = initialState, action) => { return { ...state, accounts: accountsReducer(state.accounts, action) }; } - if (action.type === 'set contract') + if (action.type === 'set contract') { return { ...state, contract: action.contract }; + } - if (action.type === 'set fee') + if (action.type === 'set fee') { return { ...state, fee: action.fee }; + } - if (action.type === 'set owner') + if (action.type === 'set owner') { return { ...state, owner: action.owner }; + } if (action.type.slice(0, 6) === 'lookup') { return { ...state, lookup: lookupReducer(state.lookup, action) }; diff --git a/js/src/dapps/registry/register/reducers.js b/js/src/dapps/registry/register/reducers.js index e6bbd160192..dc79f7dff51 100644 --- a/js/src/dapps/registry/register/reducers.js +++ b/js/src/dapps/registry/register/reducers.js @@ -4,11 +4,12 @@ const initialState = { }; export default (state = initialState, action) => { - if (action.type === 'register success') + if (action.type === 'register success') { return { ...state, names: state.names .filter((n) => n !== action.name) .concat(action.name) }; + } return state; }; From 56a7011df8e9df34e4b3f1e81cc2889d9c517fe8 Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac <ngotchac@gmail.com> Date: Tue, 13 Sep 2016 14:57:13 +0100 Subject: [PATCH 0455/1062] Redux introduction in tokenreg dapp --- js/src/dapps/registry.html | 2 +- js/src/dapps/style.css | 9 ++- js/src/dapps/tokenreg.js | 10 ++- .../dapps/tokenreg/Application/application.js | 75 ++----------------- js/src/dapps/tokenreg/Container.js | 45 +++++++++++ js/src/dapps/tokenreg/Loading/loading.css | 7 +- js/src/dapps/tokenreg/Loading/loading.js | 3 +- js/src/dapps/tokenreg/Status/actions.js | 66 ++++++++++++++++ js/src/dapps/tokenreg/Status/reducers.js | 27 +++++++ js/src/dapps/tokenreg/Status/status.js | 7 +- js/src/dapps/tokenreg/reducers.js | 9 +++ js/src/dapps/tokenreg/store.js | 6 ++ js/src/views/Dapp/dapp.css | 1 + js/webpack.config.js | 1 + 14 files changed, 189 insertions(+), 79 deletions(-) create mode 100644 js/src/dapps/tokenreg/Container.js create mode 100644 js/src/dapps/tokenreg/Status/actions.js create mode 100644 js/src/dapps/tokenreg/Status/reducers.js create mode 100644 js/src/dapps/tokenreg/reducers.js create mode 100644 js/src/dapps/tokenreg/store.js diff --git a/js/src/dapps/registry.html b/js/src/dapps/registry.html index 52036f3aa71..82fd57db7bf 100644 --- a/js/src/dapps/registry.html +++ b/js/src/dapps/registry.html @@ -4,7 +4,7 @@ <meta charset="utf-8"> <meta name="viewport" content="width=device-width"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <title>Address Registry + Token Registry diff --git a/js/src/dapps/style.css b/js/src/dapps/style.css index ead21fc7083..05207f778fe 100644 --- a/js/src/dapps/style.css +++ b/js/src/dapps/style.css @@ -12,7 +12,14 @@ :root, :root body, -:root #container { +:root :global(#container) { height: 100%; width: 100%; + display: flex; + flex: 1; +} + + +:root :global(#container) > div { + flex: 1; } diff --git a/js/src/dapps/tokenreg.js b/js/src/dapps/tokenreg.js index 1fe54417d3e..b16e69b7785 100644 --- a/js/src/dapps/tokenreg.js +++ b/js/src/dapps/tokenreg.js @@ -1,15 +1,21 @@ import ReactDOM from 'react-dom'; import React from 'react'; +import { Provider } from 'react-redux'; import injectTapEventPlugin from 'react-tap-event-plugin'; injectTapEventPlugin(); -import Application from './tokenreg/Application'; +import store from './tokenreg/store'; +import Container from './tokenreg/Container'; import './style.css'; import './tokenreg.html'; ReactDOM.render( - , + ( + + + + ), document.querySelector('#container') ); diff --git a/js/src/dapps/tokenreg/Application/application.js b/js/src/dapps/tokenreg/Application/application.js index e18981c1e89..6562ee06f03 100644 --- a/js/src/dapps/tokenreg/Application/application.js +++ b/js/src/dapps/tokenreg/Application/application.js @@ -3,35 +3,20 @@ import React, { Component, PropTypes } from 'react'; import getMuiTheme from 'material-ui/styles/getMuiTheme'; import lightBaseTheme from 'material-ui/styles/baseThemes/lightBaseTheme'; -import registryAbi from '../abi/registry.json'; -import tokenregAbi from '../abi/tokenreg.json'; import Loading from '../Loading'; import Status from '../Status'; -const { api } = window.parity; - const muiTheme = getMuiTheme(lightBaseTheme); export default class Application extends Component { static childContextTypes = { - instance: PropTypes.object, muiTheme: PropTypes.object } - state = { - address: null, - instance: null, - loading: true - } - - componentDidMount () { - this.attachInterface(); - } - render () { - const { address, fee, loading, owner } = this.state; + const { isLoading, contract } = this.props; - if (loading) { + if (isLoading) { return ( ); @@ -40,67 +25,17 @@ export default class Application extends Component { return (
    + address={ contract.address } + fee={ contract.fee } + owner={ contract.owner } />
    ); } getChildContext () { - const { instance } = this.state; - return { - instance, muiTheme }; } - onNewBlockNumber = (blockNumber) => { - const { instance } = this.state; - - instance.fee - .call() - .then((fee) => { - this.setState({ - fee - }); - }); - } - - attachInterface = () => { - api.ethcore - .registryAddress() - .then((registryAddress) => { - console.log(`registry found at ${registryAddress}`); - const registry = api.newContract(registryAbi, registryAddress).instance; - - return registry.getAddress.call({}, [api.format.sha3('tokenreg'), 'A']); - }) - .then((address) => { - console.log(`tokenreg was found at ${address}`); - const { instance } = api.newContract(tokenregAbi, address); - - return Promise - .all([ - instance.owner.call(), - instance.fee.call() - ]) - .then(([owner, fee]) => { - console.log(`owner as ${owner}, fee set at ${fee.toFormat()}`); - this.setState({ - address, - fee, - instance, - loading: false, - owner - }); - - api.events.subscribe('eth.blockNumber', this.onNewBlockNumber); - }); - }) - .catch((error) => { - console.error('attachInterface', error); - }); - } } diff --git a/js/src/dapps/tokenreg/Container.js b/js/src/dapps/tokenreg/Container.js new file mode 100644 index 00000000000..71b24ea8b04 --- /dev/null +++ b/js/src/dapps/tokenreg/Container.js @@ -0,0 +1,45 @@ +import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; + +import Application from './Application'; + +import { loadContract } from './Status/actions'; + +class Container extends Component { + static propTypes = { + isLoading: PropTypes.bool, + contract: PropTypes.object + }; + + componentDidMount() { + this.props.onLoadContract(); + } + + render() { + const { isLoading, contract } = this.props; + + return (); + } +} + +const mapStateToProps = (state) => { + const { isLoading, contract } = state.status; + + return { + isLoading, + contract + }; +}; + +const mapDispatchToProps = (dispatch) => { + return { + onLoadContract: () => { + dispatch(loadContract()); + } + }; +}; + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/js/src/dapps/tokenreg/Loading/loading.css b/js/src/dapps/tokenreg/Loading/loading.css index 6a864120621..05bd23d4a08 100644 --- a/js/src/dapps/tokenreg/Loading/loading.css +++ b/js/src/dapps/tokenreg/Loading/loading.css @@ -1,5 +1,6 @@ .loading { - width: 100%; - text-align: center; - padding: 1em; + flex: 1; + display: flex; + align-items: center; + justify-content: center; } diff --git a/js/src/dapps/tokenreg/Loading/loading.js b/js/src/dapps/tokenreg/Loading/loading.js index 186cb3833f4..9b381704600 100644 --- a/js/src/dapps/tokenreg/Loading/loading.js +++ b/js/src/dapps/tokenreg/Loading/loading.js @@ -1,4 +1,5 @@ import React, { Component } from 'react'; +import CircularProgress from 'material-ui/CircularProgress'; import styles from './loading.css'; @@ -6,7 +7,7 @@ export default class Loading extends Component { render () { return (
    - Loading ... +
    ); } diff --git a/js/src/dapps/tokenreg/Status/actions.js b/js/src/dapps/tokenreg/Status/actions.js new file mode 100644 index 00000000000..a3de4c6db84 --- /dev/null +++ b/js/src/dapps/tokenreg/Status/actions.js @@ -0,0 +1,66 @@ +import registryAbi from '../abi/registry.json'; +import tokenregAbi from '../abi/tokenreg.json'; + +const { api } = window.parity; + +export const SET_LOADING = 'SET_LOADING'; +export const setLoading = (isLoading) => ({ + type: SET_LOADING, + isLoading +}); + +export const FIND_CONTRACT = 'FIND_CONTRACT'; +export const loadContract = () => (dispatch) => { + dispatch(setLoading(true)); + + api.ethcore + .registryAddress() + .then((registryAddress) => { + console.log(`registry found at ${registryAddress}`); + const registry = api.newContract(registryAbi, registryAddress).instance; + + return registry.getAddress.call({}, [api.format.sha3('tokenreg'), 'A']); + }) + .then((address) => { + console.log(`tokenreg was found at ${address}`); + const { instance } = api.newContract(tokenregAbi, address); + + dispatch(setContractDetails({ address, instance })); + dispatch(loadContractDetails()); + }) + .catch((error) => { + console.error('loadContract error', error); + }); +}; + +export const LOAD_CONTRACT_DETAILS = 'LOAD_CONTRACT_DETAILS'; +export const loadContractDetails = () => (dispatch, getState) => { + let state = getState(); + + let instance = state.status.contract.instance; + + Promise + .all([ + instance.owner.call(), + instance.fee.call() + ]) + .then(([owner, fee]) => { + console.log(`owner as ${owner}, fee set at ${fee.toFormat()}`); + + dispatch(setContractDetails({ + fee, + owner + })); + + dispatch(setLoading(false)); + }) + .catch((error) => { + console.error('loadContractDetails error', error); + }); +}; + +export const SET_CONTRACT_DETAILS = 'SET_CONTRACT_DETAILS'; +export const setContractDetails = (details) => ({ + type: SET_CONTRACT_DETAILS, + details +}); diff --git a/js/src/dapps/tokenreg/Status/reducers.js b/js/src/dapps/tokenreg/Status/reducers.js new file mode 100644 index 00000000000..c6cb052c89f --- /dev/null +++ b/js/src/dapps/tokenreg/Status/reducers.js @@ -0,0 +1,27 @@ +import { SET_LOADING, SET_CONTRACT_DETAILS } from './actions'; + +const initialState = { + isLoading: false, + contract: { + addres: null, + instance: null, + owner: null, + fee: null, + } +}; + +export default (state = initialState, action) => { + switch (action.type) { + case SET_LOADING: + return { ...state, isLoading: action.isLoading }; + + case SET_CONTRACT_DETAILS: + return { ...state, contract: { + ...state.contract, + ...action.details + } }; + + default: + return state; + } +}; diff --git a/js/src/dapps/tokenreg/Status/status.js b/js/src/dapps/tokenreg/Status/status.js index 4b27e84edd6..228ca7bec9e 100644 --- a/js/src/dapps/tokenreg/Status/status.js +++ b/js/src/dapps/tokenreg/Status/status.js @@ -18,7 +18,12 @@ export default class Status extends Component {
    Token Registry at { address }
    Owned by { owner }
    -
    Registration fee { api.format.fromWei(fee).toFixed(3) }ΞTH
    + { fee + ? (
    + Registration fee { api.format.fromWei(fee).toFixed(3) }ΞTH +
    ) + : null + }
    ); } diff --git a/js/src/dapps/tokenreg/reducers.js b/js/src/dapps/tokenreg/reducers.js new file mode 100644 index 00000000000..4d9db9d246e --- /dev/null +++ b/js/src/dapps/tokenreg/reducers.js @@ -0,0 +1,9 @@ +import { combineReducers } from 'redux'; + +import status from './Status/reducers'; + +const rootReducer = combineReducers({ + status +}); + +export default rootReducer; diff --git a/js/src/dapps/tokenreg/store.js b/js/src/dapps/tokenreg/store.js new file mode 100644 index 00000000000..7e86c030204 --- /dev/null +++ b/js/src/dapps/tokenreg/store.js @@ -0,0 +1,6 @@ +import { createStore, applyMiddleware } from 'redux'; +import thunk from 'redux-thunk'; + +import reducer from './reducers'; + +export default createStore(reducer, applyMiddleware(thunk)); diff --git a/js/src/views/Dapp/dapp.css b/js/src/views/Dapp/dapp.css index a675151b44a..2c2ec0bdadf 100644 --- a/js/src/views/Dapp/dapp.css +++ b/js/src/views/Dapp/dapp.css @@ -1,5 +1,6 @@ .frame { border: 0; + position: absolute; height: 100%; width: 100%; } diff --git a/js/webpack.config.js b/js/webpack.config.js index 2d7d2658d0b..aa1d6e6f6bd 100644 --- a/js/webpack.config.js +++ b/js/webpack.config.js @@ -159,6 +159,7 @@ module.exports = { }, '/api/ping': { target: 'http://127.0.0.1:8080/index.html', + ignorePath: true, changeOrigin: true } } From bb55aaba2d2025e235b98857d625c69f9e5ab121 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Tue, 13 Sep 2016 16:48:45 +0200 Subject: [PATCH 0456/1062] registry: import globals through a module --- js/src/dapps/registry/Lookup/actions.js | 2 +- js/src/dapps/registry/accounts/actions.js | 2 +- js/src/dapps/registry/actions.js | 6 +++--- js/src/dapps/registry/events/events.js | 2 +- js/src/dapps/registry/register/actions.js | 3 +-- js/src/dapps/registry/register/register.js | 2 +- 6 files changed, 8 insertions(+), 9 deletions(-) diff --git a/js/src/dapps/registry/Lookup/actions.js b/js/src/dapps/registry/Lookup/actions.js index 3ff6b2d9ef9..26b16ef7f34 100644 --- a/js/src/dapps/registry/Lookup/actions.js +++ b/js/src/dapps/registry/Lookup/actions.js @@ -1,4 +1,4 @@ -const sha3 = window.parity.api.format.sha3; +import { sha3 } from '../parity.js'; export const start = (name, key) => ({ type: 'lookup start', name, key }); diff --git a/js/src/dapps/registry/accounts/actions.js b/js/src/dapps/registry/accounts/actions.js index 687e36b7420..912277274c5 100644 --- a/js/src/dapps/registry/accounts/actions.js +++ b/js/src/dapps/registry/accounts/actions.js @@ -1,4 +1,4 @@ -const { personal } = window.parity.api; +import { personal } from '../parity.js'; export const set = (accounts) => ({ type: 'accounts set', accounts }); diff --git a/js/src/dapps/registry/actions.js b/js/src/dapps/registry/actions.js index 8dda32f117b..181efca79d4 100644 --- a/js/src/dapps/registry/actions.js +++ b/js/src/dapps/registry/actions.js @@ -1,5 +1,5 @@ import registryAbi from './abi/registry.json'; -const { api } = window.parity; +import { newContract, ethcore } from './parity.js'; import * as accounts from './accounts/actions.js'; import * as lookup from './lookup/actions.js'; import * as events from './events/actions.js'; @@ -10,9 +10,9 @@ export { accounts, lookup, events, register }; export const setContract = (contract) => ({ type: 'set contract', contract }); export const fetchContract = () => (dispatch) => - api.ethcore.registryAddress() + ethcore.registryAddress() .then((address) => { - const contract = api.newContract(registryAbi, address); + const contract = newContract(registryAbi, address); dispatch(setContract(contract)); dispatch(fetchFee()); dispatch(fetchOwner()); diff --git a/js/src/dapps/registry/events/events.js b/js/src/dapps/registry/events/events.js index 35cc64f36c3..23fecb1e219 100644 --- a/js/src/dapps/registry/events/events.js +++ b/js/src/dapps/registry/events/events.js @@ -1,7 +1,7 @@ import React, { Component, PropTypes } from 'react'; import { Card, CardHeader, CardText } from 'material-ui/Card'; -const { IdentityIcon } = window.parity.react; +import { IdentityIcon } from '../parity.js'; import styles from './events.css'; import bytesToHex from '../../../api/util/bytes-array-to-hex'; diff --git a/js/src/dapps/registry/register/actions.js b/js/src/dapps/registry/register/actions.js index fa6c2deb21c..2bae51f0d0a 100644 --- a/js/src/dapps/registry/register/actions.js +++ b/js/src/dapps/registry/register/actions.js @@ -1,5 +1,4 @@ -const sha3 = window.parity.api.format.sha3; -const toWei = window.parity.api.format.toWei; +import { sha3, toWei } from '../parity.js'; export const start = (name) => ({ type: 'register start', name }); diff --git a/js/src/dapps/registry/register/register.js b/js/src/dapps/registry/register/register.js index 2e6446a7afd..23a9331e2fd 100644 --- a/js/src/dapps/registry/register/register.js +++ b/js/src/dapps/registry/register/register.js @@ -4,7 +4,7 @@ import TextField from 'material-ui/TextField'; import RaisedButton from 'material-ui/RaisedButton'; import CheckIcon from 'material-ui/svg-icons/navigation/check'; -const { fromWei } = window.parity.api.format; +import { fromWei } from '../parity.js'; import styles from './register.css'; From 21708e81c7ec9a433eed354f1056620a34e251d6 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Tue, 13 Sep 2016 16:49:44 +0200 Subject: [PATCH 0457/1062] registry: import globals through a module 2 oops. --- js/src/dapps/registry/parity.js | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 js/src/dapps/registry/parity.js diff --git a/js/src/dapps/registry/parity.js b/js/src/dapps/registry/parity.js new file mode 100644 index 00000000000..78e53db022f --- /dev/null +++ b/js/src/dapps/registry/parity.js @@ -0,0 +1,10 @@ +const { IdentityIcon } = window.parity.react; +const newContract = window.parity.api.newContract.bind(window.parity.api); +const { personal, ethcore } = window.parity.api; +const { sha3, toWei, fromWei } = window.parity.api.format; + +export { + IdentityIcon, + personal, ethcore, newContract, + sha3, toWei, fromWei +}; From 0d96aeb116022ab6be217c22135f72a44407142e Mon Sep 17 00:00:00 2001 From: Jannis R Date: Tue, 13 Sep 2016 17:10:07 +0200 Subject: [PATCH 0458/1062] registry: cleanup --- js/src/dapps/registry/register/actions.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/js/src/dapps/registry/register/actions.js b/js/src/dapps/registry/register/actions.js index 2bae51f0d0a..b24d4c858a7 100644 --- a/js/src/dapps/registry/register/actions.js +++ b/js/src/dapps/registry/register/actions.js @@ -9,8 +9,7 @@ export const fail = (name) => ({ type: 'register error', name }); export const register = (name) => (dispatch, getState) => { const { contract, account } = getState(); if (!contract || !account) return; - const reserve = contract.functions - .find((f) => f.name === 'reserve'); + const reserve = contract.functions.reserve; const options = { from: account.address, @@ -18,10 +17,10 @@ export const register = (name) => (dispatch, getState) => { }; const values = [ sha3(name) ]; + dispatch(start(name)); reserve.estimateGas(options, values) .then((gas) => { options.gas = gas.mul(1.2).toFixed(0); - dispatch(start(name)); return reserve.postTransaction(options, values); }) .then((data) => { From 6b11a7aa9d8180a1336796b136511d2049544ece Mon Sep 17 00:00:00 2001 From: Jannis R Date: Tue, 13 Sep 2016 17:24:12 +0200 Subject: [PATCH 0459/1062] registry: compose state from reducers Now, a reducer can process an action that is not strictly related to the reducers area of responsibility, which is actually how Redux proposes to couple components. See http://redux.js.org/docs/basics/Reducers.html --- js/src/dapps/registry/reducers.js | 55 ++++++++++++------------------- 1 file changed, 21 insertions(+), 34 deletions(-) diff --git a/js/src/dapps/registry/reducers.js b/js/src/dapps/registry/reducers.js index b2f3cec4522..4349b0eb17f 100644 --- a/js/src/dapps/registry/reducers.js +++ b/js/src/dapps/registry/reducers.js @@ -3,44 +3,31 @@ import lookupReducer from './lookup/reducers.js'; import eventsReducer from './events/reducers.js'; import registerReducer from './register/reducers.js'; +const contractReducer = (state = null, action) => + action.type === 'set contract' ? action.contract : state; + +const feeReducer = (state = null, action) => + action.type === 'set fee' ? action.fee : state; + +const ownerReducer = (state = null, action) => + action.type === 'set owner' ? action.owner : state; + const initialState = { accounts: accountsReducer(undefined, { type: '' }), - contract: null, - fee: null, - owner: null, + contract: contractReducer(undefined, { type: '' }), + fee: feeReducer(undefined, { type: '' }), + owner: ownerReducer(undefined, { type: '' }), lookup: lookupReducer(undefined, { type: '' }), events: eventsReducer(undefined, { type: '' }), register: registerReducer(undefined, { type: '' }) }; -export default (state = initialState, action) => { - if (action.type.slice(0, 8) === 'accounts') { - return { ...state, accounts: accountsReducer(state.accounts, action) }; - } - - if (action.type === 'set contract') { - return { ...state, contract: action.contract }; - } - - if (action.type === 'set fee') { - return { ...state, fee: action.fee }; - } - - if (action.type === 'set owner') { - return { ...state, owner: action.owner }; - } - - if (action.type.slice(0, 6) === 'lookup') { - return { ...state, lookup: lookupReducer(state.lookup, action) }; - } - - if (action.type.slice(0, 6) === 'events') { - return { ...state, events: eventsReducer(state.events, action) }; - } - - if (action.type.slice(0, 8) === 'register') { - return { ...state, register: registerReducer(state.register, action) }; - } - - return state; -}; +export default (state = initialState, action) => ({ + accounts: accountsReducer(state.accounts, action), + contract: contractReducer(state.contract, action), + fee: feeReducer(state.fee, action), + owner: ownerReducer(state.owner, action), + lookup: lookupReducer(state.lookup, action), + events: eventsReducer(state.events, action), + register: registerReducer(state.register, action) +}); From dc09d9df0f525c21be5755dbfa4e7a6b84831761 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 13 Sep 2016 17:29:06 +0200 Subject: [PATCH 0460/1062] use api imports instead of globals everywhere --- js/src/api/api.js | 5 +++++ js/src/api/util/identity.js | 9 +++++++++ js/src/api/util/index.js | 5 +++++ .../AccountItem/accountItem.js | 8 +++----- .../accountSelectorText.js | 7 ++----- js/src/dapps/gavcoin/Accounts/accounts.js | 7 ++----- .../Actions/ActionBuyIn/actionBuyIn.js | 3 +-- .../Actions/ActionRefund/actionRefund.js | 3 +-- js/src/dapps/gavcoin/Actions/validation.js | 2 +- .../dapps/gavcoin/Application/application.js | 4 ++-- js/src/dapps/gavcoin/Events/Event/event.js | 5 ++--- js/src/dapps/gavcoin/Events/events.js | 4 ++-- .../gavcoin/IdentityIcon/identityIcon.css | 6 ++++++ .../gavcoin/IdentityIcon/identityIcon.js | 20 +++++++++++++++++++ js/src/dapps/gavcoin/IdentityIcon/index.js | 1 + js/src/dapps/gavcoin/format/index.js | 2 +- js/src/dapps/gavcoin/parity.js | 5 +++++ 17 files changed, 68 insertions(+), 28 deletions(-) create mode 100644 js/src/api/util/identity.js create mode 100644 js/src/api/util/index.js create mode 100644 js/src/dapps/gavcoin/IdentityIcon/identityIcon.css create mode 100644 js/src/dapps/gavcoin/IdentityIcon/identityIcon.js create mode 100644 js/src/dapps/gavcoin/IdentityIcon/index.js create mode 100644 js/src/dapps/gavcoin/parity.js diff --git a/js/src/api/api.js b/js/src/api/api.js index 2efe426329b..57dc23155a6 100644 --- a/js/src/api/api.js +++ b/js/src/api/api.js @@ -4,6 +4,7 @@ import Contract from './contract/index'; import { Db, Eth, Ethcore, Net, Personal, Shh, Trace, Web3 } from './rpc/index'; import Subscriptions from './subscriptions/index'; import format from './format/index'; +import util from './util/index'; import { isFunction } from './util/types'; export default class Api { @@ -60,6 +61,10 @@ export default class Api { return format; } + get util () { + return util; + } + newContract (abi, address) { return new Contract(this, abi).at(address); } diff --git a/js/src/api/util/identity.js b/js/src/api/util/identity.js new file mode 100644 index 00000000000..aa5400a7dc3 --- /dev/null +++ b/js/src/api/util/identity.js @@ -0,0 +1,9 @@ +import blockies from 'blockies'; + +export function createIdentityImg (address, scale = 7) { + return blockies({ + seed: address, + size: 8, + scale + }).toDataURL(); +} diff --git a/js/src/api/util/index.js b/js/src/api/util/index.js new file mode 100644 index 00000000000..9ede0386c71 --- /dev/null +++ b/js/src/api/util/index.js @@ -0,0 +1,5 @@ +import { createIdentityImg } from './identity'; + +export default { + createIdentityImg +}; diff --git a/js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.js b/js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.js index 1db0fba782a..7a5782f33ca 100644 --- a/js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.js +++ b/js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.js @@ -1,8 +1,8 @@ import React, { Component, PropTypes } from 'react'; -import styles from './accountItem.css'; +import IdentityIcon from '../../IdentityIcon'; -const { IdentityIcon } = window.parity.react; +import styles from './accountItem.css'; export default class AccountItem extends Component { static propTypes = { @@ -31,9 +31,7 @@ export default class AccountItem extends Component { return (
    - +
    diff --git a/js/src/dapps/gavcoin/AccountSelectorText/accountSelectorText.js b/js/src/dapps/gavcoin/AccountSelectorText/accountSelectorText.js index 2ffff55cec0..19ed6a57390 100644 --- a/js/src/dapps/gavcoin/AccountSelectorText/accountSelectorText.js +++ b/js/src/dapps/gavcoin/AccountSelectorText/accountSelectorText.js @@ -1,10 +1,9 @@ import React, { Component, PropTypes } from 'react'; import { TextField } from 'material-ui'; +import IdentityIcon from '../IdentityIcon'; import AccountSelector from '../AccountSelector'; -const { IdentityIcon } = window.parity.react; - import styles from './accountSelectorText.css'; const NAME_ID = ' '; @@ -77,9 +76,7 @@ export default class AccountSelectorText extends Component { return (
    - +
    ); } diff --git a/js/src/dapps/gavcoin/Accounts/accounts.js b/js/src/dapps/gavcoin/Accounts/accounts.js index c24ab8814f2..624d12e585d 100644 --- a/js/src/dapps/gavcoin/Accounts/accounts.js +++ b/js/src/dapps/gavcoin/Accounts/accounts.js @@ -1,8 +1,7 @@ import React, { Component, PropTypes } from 'react'; - import { Chip } from 'material-ui'; -const { IdentityIcon } = window.parity.react; +import IdentityIcon from '../IdentityIcon'; import styles from './accounts.css'; @@ -44,9 +43,7 @@ export default class Accounts extends Component { - + { account.name } diff --git a/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js b/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js index 2575ca641f1..332461f7875 100644 --- a/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js +++ b/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js @@ -3,14 +3,13 @@ import React, { Component, PropTypes } from 'react'; import { Dialog, FlatButton, TextField } from 'material-ui'; +import { api } from '../../parity'; import AccountSelector from '../../AccountSelector'; import StepComplete from '../StepComplete'; import { ERRORS, validateAccount, validatePositiveNumber } from '../validation'; import styles from '../actions.css'; -const { api } = window.parity; - const NAME_ID = ' '; export default class ActionBuyIn extends Component { diff --git a/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js b/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js index 983d171c3ce..cde2bcf4210 100644 --- a/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js +++ b/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js @@ -3,14 +3,13 @@ import React, { Component, PropTypes } from 'react'; import { Dialog, FlatButton, TextField } from 'material-ui'; +import { api } from '../../parity'; import AccountSelector from '../../AccountSelector'; import StepComplete from '../StepComplete'; import { ERRORS, validateAccount, validatePositiveNumber } from '../validation'; import styles from '../actions.css'; -const { api } = window.parity; - const DIVISOR = 10 ** 6; const NAME_ID = ' '; diff --git a/js/src/dapps/gavcoin/Actions/validation.js b/js/src/dapps/gavcoin/Actions/validation.js index 4f1350aaec9..f6e35af06b1 100644 --- a/js/src/dapps/gavcoin/Actions/validation.js +++ b/js/src/dapps/gavcoin/Actions/validation.js @@ -1,6 +1,6 @@ import BigNumber from 'bignumber.js'; -const { api } = window.parity; +import { api } from '../parity'; export const ERRORS = { invalidAccount: 'please select an account to transact with', diff --git a/js/src/dapps/gavcoin/Application/application.js b/js/src/dapps/gavcoin/Application/application.js index c8f15d6ddd3..153281f56c9 100644 --- a/js/src/dapps/gavcoin/Application/application.js +++ b/js/src/dapps/gavcoin/Application/application.js @@ -6,6 +6,8 @@ import lightBaseTheme from 'material-ui/styles/baseThemes/lightBaseTheme'; const muiTheme = getMuiTheme(lightBaseTheme); +import { api } from '../parity'; + import registryAbi from '../abi/registry.json'; import gavcoinAbi from '../abi/gavcoin.json'; @@ -15,8 +17,6 @@ import Events from '../Events'; import Loading from '../Loading'; import Status from '../Status'; -const { api } = window.parity; - const DIVISOR = 10 ** 6; export default class Application extends Component { diff --git a/js/src/dapps/gavcoin/Events/Event/event.js b/js/src/dapps/gavcoin/Events/Event/event.js index ddd814c18f8..70830658608 100644 --- a/js/src/dapps/gavcoin/Events/Event/event.js +++ b/js/src/dapps/gavcoin/Events/Event/event.js @@ -1,11 +1,10 @@ import React, { Component, PropTypes } from 'react'; +import IdentityIcon from '../../IdentityIcon'; import { formatBlockNumber, formatCoins, formatEth } from '../../format'; import styles from '../events.css'; -const { IdentityIcon } = window.parity.react; - const EMPTY_COLUMN = (
    ); @@ -55,7 +54,7 @@ export default class Event extends Component { return ( ); diff --git a/js/src/dapps/gavcoin/Events/events.js b/js/src/dapps/gavcoin/Events/events.js index 22cca8841a6..9cd9e7909f3 100644 --- a/js/src/dapps/gavcoin/Events/events.js +++ b/js/src/dapps/gavcoin/Events/events.js @@ -1,5 +1,7 @@ import React, { Component, PropTypes } from 'react'; +import { api } from '../parity'; + import EventBuyin from './EventBuyin'; import EventNewTranch from './EventNewTranch'; import EventRefund from './EventRefund'; @@ -7,8 +9,6 @@ import EventTransfer from './EventTransfer'; import styles from './events.css'; -const { api } = window.parity; - export default class Events extends Component { static childContextTypes = { accounts: PropTypes.array diff --git a/js/src/dapps/gavcoin/IdentityIcon/identityIcon.css b/js/src/dapps/gavcoin/IdentityIcon/identityIcon.css new file mode 100644 index 00000000000..b2795dff158 --- /dev/null +++ b/js/src/dapps/gavcoin/IdentityIcon/identityIcon.css @@ -0,0 +1,6 @@ +.icon { + width: 32px; + height: 32px; + border-radius: 50%; + margin-right: 0.5em; +} diff --git a/js/src/dapps/gavcoin/IdentityIcon/identityIcon.js b/js/src/dapps/gavcoin/IdentityIcon/identityIcon.js new file mode 100644 index 00000000000..81c7abcd737 --- /dev/null +++ b/js/src/dapps/gavcoin/IdentityIcon/identityIcon.js @@ -0,0 +1,20 @@ +import React, { Component, PropTypes } from 'react'; + +import { api } from '../parity'; +import styles from './identityIcon.css'; + +export default class IdentityIcon extends Component { + static propTypes = { + address: PropTypes.string.isRequired + } + + render () { + const { address } = this.props; + + return ( + + ); + } +} diff --git a/js/src/dapps/gavcoin/IdentityIcon/index.js b/js/src/dapps/gavcoin/IdentityIcon/index.js new file mode 100644 index 00000000000..51b592d3146 --- /dev/null +++ b/js/src/dapps/gavcoin/IdentityIcon/index.js @@ -0,0 +1 @@ +export default from './identityIcon'; diff --git a/js/src/dapps/gavcoin/format/index.js b/js/src/dapps/gavcoin/format/index.js index c7244c0285d..c20f7ce725b 100644 --- a/js/src/dapps/gavcoin/format/index.js +++ b/js/src/dapps/gavcoin/format/index.js @@ -1,6 +1,6 @@ import BigNumber from 'bignumber.js'; -const { api } = window.parity; +import { api } from '../parity'; const DIVISOR = 10 ** 6; const ZERO = new BigNumber(0); diff --git a/js/src/dapps/gavcoin/parity.js b/js/src/dapps/gavcoin/parity.js new file mode 100644 index 00000000000..6f3a390f1a2 --- /dev/null +++ b/js/src/dapps/gavcoin/parity.js @@ -0,0 +1,5 @@ +const { api } = window.parity; + +export { + api +}; From 1460e0d0731648cc56de3797e17b0c3228567fc3 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 13 Sep 2016 17:45:46 +0200 Subject: [PATCH 0461/1062] ensure address is always in lowercase --- js/src/api/util/identity.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/api/util/identity.js b/js/src/api/util/identity.js index aa5400a7dc3..82da7d7dfaa 100644 --- a/js/src/api/util/identity.js +++ b/js/src/api/util/identity.js @@ -2,7 +2,7 @@ import blockies from 'blockies'; export function createIdentityImg (address, scale = 7) { return blockies({ - seed: address, + seed: (address || '').toLowerCase(), size: 8, scale }).toDataURL(); From 66016896028941879bc7d4b7f2378e6bccd97c09 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 13 Sep 2016 17:50:44 +0200 Subject: [PATCH 0462/1062] main app IdentityIcon also used api.util.createIdentityImg --- js/src/ui/IdentityIcon/identityIcon.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/js/src/ui/IdentityIcon/identityIcon.js b/js/src/ui/IdentityIcon/identityIcon.js index a2f8bb72c0f..9f48233fece 100644 --- a/js/src/ui/IdentityIcon/identityIcon.js +++ b/js/src/ui/IdentityIcon/identityIcon.js @@ -1,9 +1,12 @@ import React, { Component, PropTypes } from 'react'; -import blockies from 'blockies'; import styles from './identityIcon.css'; export default class IdentityIcon extends Component { + static contextTypes = { + api: PropTypes.object.isRequired + } + static propTypes = { address: PropTypes.string, className: PropTypes.string, @@ -18,7 +21,9 @@ export default class IdentityIcon extends Component { } componentDidMount () { - this.updateIcon(this.props.address); + const { address } = this.props; + + this.updateIcon(address); } componentWillReceiveProps (newProps) { @@ -32,6 +37,7 @@ export default class IdentityIcon extends Component { } updateIcon (_address) { + const { api } = this.context; const { tokens, inline } = this.props; const token = (tokens || {})[_address]; @@ -43,14 +49,8 @@ export default class IdentityIcon extends Component { return; } - const address = _address.toLowerCase(); - this.setState({ - iconsrc: blockies({ - seed: address, - size: 8, - scale: inline ? 4 : 7 - }).toDataURL() + iconsrc: api.util.createIdentityImg(_address, inline ? 4 : 7) }); } From 7453ab6c86d503c5ae76510b7cb0860d8be08770 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 13 Sep 2016 18:32:38 +0200 Subject: [PATCH 0463/1062] add babel es2016 & es2017 presets --- js/.babelrc | 4 ++-- js/package.json | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/js/.babelrc b/js/.babelrc index 34171cfa006..a855f26014d 100644 --- a/js/.babelrc +++ b/js/.babelrc @@ -1,5 +1,5 @@ { - "presets": ["es2015", "stage-0", "react"], - "plugins": ["transform-runtime", "lodash"], + "presets": ["es2017", "es2016", "es2015", "stage-0", "react"], + "plugins": ["transform-runtime", "transform-decorators-legacy", "transform-class-properties"], "retainLines": true } diff --git a/js/package.json b/js/package.json index 81e70cacaea..511c5705dde 100644 --- a/js/package.json +++ b/js/package.json @@ -44,9 +44,13 @@ "babel-eslint": "^6.1.2", "babel-loader": "^6.2.3", "babel-plugin-lodash": "^3.2.2", + "babel-plugin-transform-class-properties": "^6.11.5", + "babel-plugin-transform-decorators-legacy": "^1.3.4", "babel-plugin-transform-runtime": "^6.9.0", "babel-preset-es2015": "^6.9.0", "babel-preset-es2015-rollup": "^1.1.1", + "babel-preset-es2016": "^6.11.3", + "babel-preset-es2017": "^6.14.0", "babel-preset-react": "^6.5.0", "babel-preset-stage-0": "^6.5.0", "babel-register": "6.9.0", From b68b61fdb72969dde7b19358468175eba0f60782 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Tue, 13 Sep 2016 18:51:53 +0200 Subject: [PATCH 0464/1062] registry: simplify state In lookup/reducers, I changed `key` to `entry` because `key` is a special React prop. --- js/src/dapps/registry/Lookup/lookup.js | 4 ++-- js/src/dapps/registry/Lookup/reducers.js | 8 ++++---- js/src/dapps/registry/register/reducers.js | 9 --------- 3 files changed, 6 insertions(+), 15 deletions(-) diff --git a/js/src/dapps/registry/Lookup/lookup.js b/js/src/dapps/registry/Lookup/lookup.js index 94cfe11f91a..0493e8051f5 100644 --- a/js/src/dapps/registry/Lookup/lookup.js +++ b/js/src/dapps/registry/Lookup/lookup.js @@ -54,9 +54,9 @@ export default class Lookup extends Component { this.setState({ name: e.target.value }); }; onKeyChange = (e) => { - this.setState({ key: e.target.value }); + this.setState({ entry: e.target.value }); }; onLookupClick = () => { - this.props.actions.lookup(this.state.name, this.state.key); + this.props.actions.lookup(this.state.name, this.state.entry); }; } diff --git a/js/src/dapps/registry/Lookup/reducers.js b/js/src/dapps/registry/Lookup/reducers.js index 384517ba49b..c545bfe7ee2 100644 --- a/js/src/dapps/registry/Lookup/reducers.js +++ b/js/src/dapps/registry/Lookup/reducers.js @@ -1,6 +1,6 @@ const initialState = { pending: false, - name: null, key: null, + name: '', entry: '', result: null }; @@ -8,7 +8,7 @@ export default (state = initialState, action) => { if (action.type === 'lookup start') { return { pending: true, - name: action.name, key: action.key, + name: action.name, entry: action.entry, result: null }; } @@ -16,7 +16,7 @@ export default (state = initialState, action) => { if (action.type === 'lookup error') { return { pending: false, - name: null, key: null, + name: initialState.name, entry: initialState.entry, result: null }; } @@ -24,7 +24,7 @@ export default (state = initialState, action) => { if (action.type === 'lookup success') { return { pending: false, - name: null, key: null, + name: initialState.name, entry: initialState.entry, result: action.result }; } diff --git a/js/src/dapps/registry/register/reducers.js b/js/src/dapps/registry/register/reducers.js index dc79f7dff51..a41dc525564 100644 --- a/js/src/dapps/registry/register/reducers.js +++ b/js/src/dapps/registry/register/reducers.js @@ -1,15 +1,6 @@ const initialState = { - contract: null, - names: [] }; export default (state = initialState, action) => { - if (action.type === 'register success') { - return { ...state, names: state.names - .filter((n) => n !== action.name) - .concat(action.name) - }; - } - return state; }; From 168fd20ca7e8ca6b307d9724f3ef171ebe5e0695 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Tue, 13 Sep 2016 18:53:41 +0200 Subject: [PATCH 0465/1062] registry: simplify props --- .../dapps/registry/Application/application.js | 6 +++--- js/src/dapps/registry/Lookup/lookup.js | 17 +++++++++-------- js/src/dapps/registry/register/register.js | 9 ++++----- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/js/src/dapps/registry/Application/application.js b/js/src/dapps/registry/Application/application.js index 2bfecf453e2..e08c784a014 100644 --- a/js/src/dapps/registry/Application/application.js +++ b/js/src/dapps/registry/Application/application.js @@ -44,12 +44,12 @@ export default class Application extends Component {

    RΞgistry

    - +
    { contract && fee && owner ? (
    - - + +
    diff --git a/js/src/dapps/registry/Lookup/lookup.js b/js/src/dapps/registry/Lookup/lookup.js index 0493e8051f5..a5009353c9e 100644 --- a/js/src/dapps/registry/Lookup/lookup.js +++ b/js/src/dapps/registry/Lookup/lookup.js @@ -13,26 +13,27 @@ export default class Lookup extends Component { lookup: PropTypes.object } - state = { name: '', key: 'A' }; + state = { name: '', entry: 'A' }; render () { - const { name, key } = this.state; - const props = this.props.lookup; - return ( + const name = this.state.name || this.props.name; + const entry = this.state.entry || this.props.entry; + const result = this.props.result || ''; + return (
    - { this.props.lookup.result || '' } + { result }
    ); diff --git a/js/src/dapps/registry/register/register.js b/js/src/dapps/registry/register/register.js index 23a9331e2fd..701ae1d2136 100644 --- a/js/src/dapps/registry/register/register.js +++ b/js/src/dapps/registry/register/register.js @@ -11,16 +11,15 @@ import styles from './register.css'; export default class Register extends Component { static propTypes = { - actions: PropTypes.object, - register: PropTypes.object, - fee: PropTypes.object + actions: PropTypes.object.isRequired, + names: PropTypes.array.isRequired, + fee: PropTypes.object.isRequired } state = { name: '' }; render () { const { name } = this.state; - const props = this.props.register; const { fee } = this.props; return ( @@ -30,7 +29,7 @@ export default class Register extends Component { Date: Tue, 13 Sep 2016 18:53:50 +0200 Subject: [PATCH 0466/1062] registry: make props required This has a caveat: React will complain in the beginning because the initialState oftern contains `null` as default value, with means "missing" for React. --- .../dapps/registry/Application/application.js | 17 ++++++++--------- js/src/dapps/registry/Container.js | 15 +++++++-------- js/src/dapps/registry/Lookup/lookup.js | 6 ++++-- js/src/dapps/registry/events/events.js | 4 ++-- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/js/src/dapps/registry/Application/application.js b/js/src/dapps/registry/Application/application.js index e08c784a014..4aefeb6c7df 100644 --- a/js/src/dapps/registry/Application/application.js +++ b/js/src/dapps/registry/Application/application.js @@ -19,14 +19,13 @@ export default class Application extends Component { } static propTypes = { - actions: PropTypes.object, - accounts: PropTypes.object, - account: PropTypes.object, - contract: PropTypes.object, - owner: PropTypes.string, - fee: PropTypes.object, - lookup: PropTypes.object, - events: PropTypes.array, + actions: PropTypes.object.isRequired, + accounts: PropTypes.object.isRequired, + contract: PropTypes.object.isRequired, + owner: PropTypes.string.isRequired, + fee: PropTypes.object.isRequired, + lookup: PropTypes.object.isRequired, + events: PropTypes.array.isRequired, register: PropTypes.object }; @@ -34,7 +33,7 @@ export default class Application extends Component { const { actions, accounts, - contract, fee, owner, + contract, owner, fee, lookup, events, register diff --git a/js/src/dapps/registry/Container.js b/js/src/dapps/registry/Container.js index df1a73dfec0..5769a71ebe7 100644 --- a/js/src/dapps/registry/Container.js +++ b/js/src/dapps/registry/Container.js @@ -7,14 +7,13 @@ import * as actions from './actions'; class Container extends Component { static propTypes = { - actions: PropTypes.object, - accounts: PropTypes.object, - account: PropTypes.object, - contract: PropTypes.object, - owner: PropTypes.string, - fee: PropTypes.object, - lookup: PropTypes.object, - events: PropTypes.array + actions: PropTypes.object.isRequired, + accounts: PropTypes.object.isRequired, + contract: PropTypes.object.isRequired, + owner: PropTypes.string.isRequired, + fee: PropTypes.object.isRequired, + lookup: PropTypes.object.isRequired, + events: PropTypes.array.isRequired }; componentDidMount () { diff --git a/js/src/dapps/registry/Lookup/lookup.js b/js/src/dapps/registry/Lookup/lookup.js index a5009353c9e..ec5067121e9 100644 --- a/js/src/dapps/registry/Lookup/lookup.js +++ b/js/src/dapps/registry/Lookup/lookup.js @@ -9,8 +9,10 @@ import styles from './lookup.css'; export default class Lookup extends Component { static propTypes = { - actions: PropTypes.object, - lookup: PropTypes.object + actions: PropTypes.object.isRequired, + name: PropTypes.string.isRequired, + entry: PropTypes.string.isRequired, + result: PropTypes.string } state = { name: '', entry: 'A' }; diff --git a/js/src/dapps/registry/events/events.js b/js/src/dapps/registry/events/events.js index 23fecb1e219..91371ab8a59 100644 --- a/js/src/dapps/registry/events/events.js +++ b/js/src/dapps/registry/events/events.js @@ -40,8 +40,8 @@ const eventTypes = { export default class Events extends Component { static propTypes = { - actions: PropTypes.object, - events: PropTypes.array + actions: PropTypes.object.isRequired, + events: PropTypes.array.isRequired } componentDidMount () { // TODO remove this From b73b546b32ac3aa3a09fe3e81e251894db432bb5 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 13 Sep 2016 21:53:53 +0200 Subject: [PATCH 0467/1062] remove all '/index' imports (ex-rollup & there is a plugin to fix that if need-be) --- js/src/abi/spec/interface.js | 2 +- js/src/api/api.js | 10 +++++----- js/src/api/rpc/index.js | 16 ++++++++-------- js/src/api/transport/index.js | 4 ++-- js/src/api/transport/jsonRpcBase.js | 2 +- js/src/views/Status/util/index.spec.js | 2 +- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/js/src/abi/spec/interface.js b/js/src/abi/spec/interface.js index e498da57d81..744e1d83189 100644 --- a/js/src/abi/spec/interface.js +++ b/js/src/abi/spec/interface.js @@ -1,7 +1,7 @@ import Constructor from './constructor'; import Event from './event/event'; import Func from './function'; -import Token from '../token/index'; +import Token from '../token'; export default class Interface { constructor (abi) { diff --git a/js/src/api/api.js b/js/src/api/api.js index 2efe426329b..309a7eb6b3d 100644 --- a/js/src/api/api.js +++ b/js/src/api/api.js @@ -1,9 +1,9 @@ -import { Http, Ws } from './transport/index'; -import Contract from './contract/index'; +import { Http, Ws } from './transport'; +import Contract from './contract'; -import { Db, Eth, Ethcore, Net, Personal, Shh, Trace, Web3 } from './rpc/index'; -import Subscriptions from './subscriptions/index'; -import format from './format/index'; +import { Db, Eth, Ethcore, Net, Personal, Shh, Trace, Web3 } from './rpc'; +import Subscriptions from './subscriptions'; +import format from './format'; import { isFunction } from './util/types'; export default class Api { diff --git a/js/src/api/rpc/index.js b/js/src/api/rpc/index.js index bdc41705726..b868da03e78 100644 --- a/js/src/api/rpc/index.js +++ b/js/src/api/rpc/index.js @@ -1,8 +1,8 @@ -export Db from './db/index'; -export Eth from './eth/index'; -export Ethcore from './ethcore/index'; -export Net from './net/index'; -export Personal from './personal/index'; -export Shh from './shh/index'; -export Trace from './trace/index'; -export Web3 from './web3/index'; +export Db from './db'; +export Eth from './eth'; +export Ethcore from './ethcore'; +export Net from './net'; +export Personal from './personal'; +export Shh from './shh'; +export Trace from './trace'; +export Web3 from './web3'; diff --git a/js/src/api/transport/index.js b/js/src/api/transport/index.js index 2030aac81c6..4038308a05c 100644 --- a/js/src/api/transport/index.js +++ b/js/src/api/transport/index.js @@ -1,2 +1,2 @@ -export Http from './http/index'; -export Ws from './ws/index'; +export Http from './http'; +export Ws from './ws'; diff --git a/js/src/api/transport/jsonRpcBase.js b/js/src/api/transport/jsonRpcBase.js index 59c2d6f06cf..9ffb50e1da0 100644 --- a/js/src/api/transport/jsonRpcBase.js +++ b/js/src/api/transport/jsonRpcBase.js @@ -1,4 +1,4 @@ -import { Logging } from '../subscriptions/index'; +import { Logging } from '../subscriptions'; export default class JsonRpcBase { constructor () { diff --git a/js/src/views/Status/util/index.spec.js b/js/src/views/Status/util/index.spec.js index 52306ae6ce5..04c9d66535a 100644 --- a/js/src/views/Status/util/index.spec.js +++ b/js/src/views/Status/util/index.spec.js @@ -1,6 +1,6 @@ import { toPromise, identity } from './'; -describe('util/index', () => { +describe('util', () => { describe('toPromise', () => { it('rejects on error result', () => { const ERROR = new Error(); From 479d7dca5afd475971327730c5276865d00832ad Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 13 Sep 2016 22:06:32 +0200 Subject: [PATCH 0468/1062] .travis.yml not needed anymore (builds off parity setup) --- js/.travis.yml | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 js/.travis.yml diff --git a/js/.travis.yml b/js/.travis.yml deleted file mode 100644 index 9febddb244f..00000000000 --- a/js/.travis.yml +++ /dev/null @@ -1,17 +0,0 @@ -sudo: false -language: node_js -node_js: - - '5' - -env: - global: - - CXX=g++-4.8 - -cache: - directories: - - node_modules - -script: - - npm run lint - - npm run coveralls - - npm run release From f59f255b3c014f11c5be972a520f9c3f5774edd3 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 13 Sep 2016 22:06:48 +0200 Subject: [PATCH 0469/1062] update README, fix typos --- js/README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/js/README.md b/js/README.md index 1d42820c330..41252bc916f 100644 --- a/js/README.md +++ b/js/README.md @@ -1,11 +1,12 @@ # parity.js -JS interfaces APIs and UIs for Parity. +JavaScript APIs and UIs for Parity. ## development 0. Install [Node](https://nodejs.org/) if not already available -0. Install the npm modules inside `parity/js` via `npm install` -0. Parity should be run with `parity--signer-no-validation [...options]` +0. Change to the `js` directory inside `parity/` +0. Install the npm modules via `npm install` +0. Parity should be run with `parity --signer-no-validation [...options]` (where `options` can be `--chain testnet`) 0. Start the development environment via `npm start` 0. Connect to the [UI](http://localhost:3000) From 21c135f7f2ffa57b6d5367a2bc186fd063336b71 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 13 Sep 2016 23:32:35 +0200 Subject: [PATCH 0470/1062] initial import before tweaking starts --- js/src/3rdparty/shapeshift/helpers.spec.js | 53 +++++++++ js/src/3rdparty/shapeshift/index.js | 5 + js/src/3rdparty/shapeshift/lib/rpc.js | 56 +++++++++ js/src/3rdparty/shapeshift/lib/rpc.spec.js | 62 ++++++++++ js/src/3rdparty/shapeshift/lib/shapeshift.js | 23 ++++ .../shapeshift/lib/shapeshift.spec.js | 109 ++++++++++++++++++ 6 files changed, 308 insertions(+) create mode 100644 js/src/3rdparty/shapeshift/helpers.spec.js create mode 100644 js/src/3rdparty/shapeshift/index.js create mode 100644 js/src/3rdparty/shapeshift/lib/rpc.js create mode 100644 js/src/3rdparty/shapeshift/lib/rpc.spec.js create mode 100644 js/src/3rdparty/shapeshift/lib/shapeshift.js create mode 100644 js/src/3rdparty/shapeshift/lib/shapeshift.spec.js diff --git a/js/src/3rdparty/shapeshift/helpers.spec.js b/js/src/3rdparty/shapeshift/helpers.spec.js new file mode 100644 index 00000000000..86d7d40b628 --- /dev/null +++ b/js/src/3rdparty/shapeshift/helpers.spec.js @@ -0,0 +1,53 @@ +'use strict'; + +const APIKEY = '0x123454321'; + +const chai = require('chai'); +const nock = require('nock'); + +require('es6-promise').polyfill(); +require('isomorphic-fetch'); + +const shapeshift = require('./index.js')(APIKEY); +const rpc = require('./lib/rpc')(APIKEY); + +const mockget = function(requests) { + let scope = nock(rpc.ENDPOINT); + + requests.forEach((request) => { + scope = scope + .get(`/${request.path}`) + .reply(request.code || 200, () => { + return request.reply; + }); + }); + + return scope; +}; + +const mockpost = function(requests) { + let scope = nock(rpc.ENDPOINT); + + requests.forEach((request) => { + scope = scope + .post(`/${request.path}`) + .reply(request.code || 200, (uri, body) => { + scope.body = scope.body || {}; + scope.body[request.path] = body; + + return request.reply; + }); + }); + + return scope; +}; + +global.expect = chai.expect; // eslint-disable-line no-undef + +module.exports = { + APIKEY: APIKEY, + mockget: mockget, + mockpost: mockpost, + shapeshift: shapeshift, + rpc: rpc +}; diff --git a/js/src/3rdparty/shapeshift/index.js b/js/src/3rdparty/shapeshift/index.js new file mode 100644 index 00000000000..ee1ebfd670d --- /dev/null +++ b/js/src/3rdparty/shapeshift/index.js @@ -0,0 +1,5 @@ +module.exports = function(apikey) { + const rpc = require('./lib/rpc')(apikey); + + return require('./lib/shapeshift')(rpc); +}; diff --git a/js/src/3rdparty/shapeshift/lib/rpc.js b/js/src/3rdparty/shapeshift/lib/rpc.js new file mode 100644 index 00000000000..ad5ce64455b --- /dev/null +++ b/js/src/3rdparty/shapeshift/lib/rpc.js @@ -0,0 +1,56 @@ +const ENDPOINT = 'https://cors.shapeshift.io'; + +module.exports = function(apikey) { + const call = function(method, options) { + return fetch(`${ENDPOINT}/${method}`, options) + .then((response) => { + if (response.status !== 200) { + throw { code: response.status, message: response.statusText }; // eslint-disable-line + } + + return response.json(); + }) + .then((result) => { + if (result.error) { + throw { code: -1, message: result.error }; // eslint-disable-line + } + + return result; + }); + }; + + return { + ENDPOINT: ENDPOINT, + + get: function(method) { + return call(method, { + method: 'GET', + headers: { + 'Accept': 'application/json' + } + }); + }, + + post: function(method, data) { + const params = { + apiKey: apikey + }; + + Object.keys(data).forEach((key) => { + params[key] = data[key]; + }); + + const json = JSON.stringify(params); + + return call(method, { + method: 'POST', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Content-Length': json.length + }, + body: json + }); + } + }; +}; diff --git a/js/src/3rdparty/shapeshift/lib/rpc.spec.js b/js/src/3rdparty/shapeshift/lib/rpc.spec.js new file mode 100644 index 00000000000..3aa44f26235 --- /dev/null +++ b/js/src/3rdparty/shapeshift/lib/rpc.spec.js @@ -0,0 +1,62 @@ +const helpers = require('../helpers.spec.js'); +const { APIKEY, mockget, mockpost, rpc } = helpers; + +describe('lib/rpc', () => { + describe('GET', () => { + const REPLY = { test: 'this is some result' }; + + let scope; + let result; + + beforeEach(() => { + scope = mockget([{ path: 'test', reply: REPLY }]); + + return rpc + .get('test') + .then((_result) => { + result = _result; + }); + }); + + it('does GET', () => { + expect(scope.isDone()).to.be.true; + }); + + it('retrieves the info', () => { + expect(result).to.deep.equal(REPLY); + }); + }); + + describe('POST', () => { + const REPLY = { test: 'this is some result' }; + + let scope; + let result; + + beforeEach(() => { + scope = mockpost([{ path: 'test', reply: REPLY }]); + + return rpc + .post('test', { input: 'stuff' }) + .then((_result) => { + result = _result; + }); + }); + + it('does POST', () => { + expect(scope.isDone()).to.be.true; + }); + + it('retrieves the info', () => { + expect(result).to.deep.equal(REPLY); + }); + + it('passes the input object', () => { + expect(scope.body.test.input).to.equal('stuff'); + }); + + it('passes the apikey specified', () => { + expect(scope.body.test.apiKey).to.equal(APIKEY); + }); + }); +}); diff --git a/js/src/3rdparty/shapeshift/lib/shapeshift.js b/js/src/3rdparty/shapeshift/lib/shapeshift.js new file mode 100644 index 00000000000..01f61fa02db --- /dev/null +++ b/js/src/3rdparty/shapeshift/lib/shapeshift.js @@ -0,0 +1,23 @@ +module.exports = function(rpc) { + return { + getCoins: function() { + return rpc.get('getcoins'); + }, + + getMarketInfo: function(pair) { + return rpc.get(`marketinfo/${pair}`); + }, + + getStatus: function(depositAddress) { + return rpc.get(`txStat/${depositAddress}`); + }, + + shift: function(toAddress, returnAddress, pair) { + return rpc.post('shift', { + withdrawal: toAddress, + pair: pair, + returnAddress: returnAddress + }); + } + }; +}; diff --git a/js/src/3rdparty/shapeshift/lib/shapeshift.spec.js b/js/src/3rdparty/shapeshift/lib/shapeshift.spec.js new file mode 100644 index 00000000000..7e596a0059e --- /dev/null +++ b/js/src/3rdparty/shapeshift/lib/shapeshift.spec.js @@ -0,0 +1,109 @@ +const helpers = require('../helpers.spec.js'); +const { mockget, mockpost, shapeshift } = helpers; + +describe('lib/calls', () => { + describe('getCoins', () => { + const REPLY = { + BTC: { + name: 'Bitcoin', + symbol: 'BTC', + image: 'https://shapeshift.io/images/coins/bitcoin.png', + status: 'available' + }, + ETH: { + name: 'Ether', + symbol: 'ETH', + image: 'https://shapeshift.io/images/coins/ether.png', + status: 'available' + } + }; + + let scope; + + before(() => { + scope = mockget([{ path: 'getcoins', reply: REPLY }]); + + return shapeshift.getCoins(); + }); + + it('makes the call', () => { + expect(scope.isDone()).to.be.ok; + }); + }); + + describe('getMarketInfo', () => { + const REPLY = { + pair: 'btc_ltc', + rate: 128.17959917, + minerFee: 0.003, + limit: 0, + minimum: 0.00004632 + }; + + let scope; + + before(() => { + scope = mockget([{ path: 'marketinfo/btc_ltc', reply: REPLY }]); + + return shapeshift.getMarketInfo('btc_ltc'); + }); + + it('makes the call', () => { + expect(scope.isDone()).to.be.ok; + }); + }); + + describe('getStatus', () => { + const REPLY = { + status: '0x123', + address: '0x123' + }; + + let scope; + + before(() => { + scope = mockget([{ path: 'txStat/0x123', reply: REPLY }]); + + return shapeshift.getStatus('0x123'); + }); + + it('makes the call', () => { + expect(scope.isDone()).to.be.ok; + }); + }); + + describe('shift', () => { + const REPLY = { + deposit: '1BTC', + depositType: 'btc', + withdrawal: '0x456', + withdrawalType: 'eth' + }; + + let scope; + + before(() => { + scope = mockpost([{ path: 'shift', reply: REPLY }]); + + return shapeshift.shift('0x456', '1BTC', 'btc_eth'); + }); + + it('makes the call', () => { + expect(scope.isDone()).to.be.ok; + }); + + describe('body', () => { + it('has withdrawal set', () => { + expect(scope.body.shift.withdrawal).to.equal('0x456'); + }); + + it('has returnAddress set', () => { + expect(scope.body.shift.returnAddress).to.equal('1BTC'); + }); + + it('has pair set', () => { + expect(scope.body.shift.pair).to.equal('btc_eth'); + }); + }); + }); +}); From fc304c0aa9f13c01a0baff2450778367a0663c21 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 13 Sep 2016 23:33:22 +0200 Subject: [PATCH 0471/1062] GPL header --- js/src/3rdparty/shapeshift/helpers.spec.js | 16 ++++++++++++++++ js/src/3rdparty/shapeshift/index.js | 16 ++++++++++++++++ js/src/3rdparty/shapeshift/lib/rpc.js | 16 ++++++++++++++++ js/src/3rdparty/shapeshift/lib/rpc.spec.js | 16 ++++++++++++++++ js/src/3rdparty/shapeshift/lib/shapeshift.js | 16 ++++++++++++++++ .../3rdparty/shapeshift/lib/shapeshift.spec.js | 16 ++++++++++++++++ 6 files changed, 96 insertions(+) diff --git a/js/src/3rdparty/shapeshift/helpers.spec.js b/js/src/3rdparty/shapeshift/helpers.spec.js index 86d7d40b628..aa389a30d34 100644 --- a/js/src/3rdparty/shapeshift/helpers.spec.js +++ b/js/src/3rdparty/shapeshift/helpers.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + 'use strict'; const APIKEY = '0x123454321'; diff --git a/js/src/3rdparty/shapeshift/index.js b/js/src/3rdparty/shapeshift/index.js index ee1ebfd670d..bee544e4716 100644 --- a/js/src/3rdparty/shapeshift/index.js +++ b/js/src/3rdparty/shapeshift/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + module.exports = function(apikey) { const rpc = require('./lib/rpc')(apikey); diff --git a/js/src/3rdparty/shapeshift/lib/rpc.js b/js/src/3rdparty/shapeshift/lib/rpc.js index ad5ce64455b..91b4490b5d7 100644 --- a/js/src/3rdparty/shapeshift/lib/rpc.js +++ b/js/src/3rdparty/shapeshift/lib/rpc.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + const ENDPOINT = 'https://cors.shapeshift.io'; module.exports = function(apikey) { diff --git a/js/src/3rdparty/shapeshift/lib/rpc.spec.js b/js/src/3rdparty/shapeshift/lib/rpc.spec.js index 3aa44f26235..57128806b74 100644 --- a/js/src/3rdparty/shapeshift/lib/rpc.spec.js +++ b/js/src/3rdparty/shapeshift/lib/rpc.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + const helpers = require('../helpers.spec.js'); const { APIKEY, mockget, mockpost, rpc } = helpers; diff --git a/js/src/3rdparty/shapeshift/lib/shapeshift.js b/js/src/3rdparty/shapeshift/lib/shapeshift.js index 01f61fa02db..bb333e76da1 100644 --- a/js/src/3rdparty/shapeshift/lib/shapeshift.js +++ b/js/src/3rdparty/shapeshift/lib/shapeshift.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + module.exports = function(rpc) { return { getCoins: function() { diff --git a/js/src/3rdparty/shapeshift/lib/shapeshift.spec.js b/js/src/3rdparty/shapeshift/lib/shapeshift.spec.js index 7e596a0059e..922ef271cf7 100644 --- a/js/src/3rdparty/shapeshift/lib/shapeshift.spec.js +++ b/js/src/3rdparty/shapeshift/lib/shapeshift.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + const helpers = require('../helpers.spec.js'); const { mockget, mockpost, shapeshift } = helpers; From 6faff8f3c1f5cf37d9ed57e9d0697c5c3c425c97 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 13 Sep 2016 23:44:13 +0200 Subject: [PATCH 0472/1062] es6-ify library & flatten --- js/src/3rdparty/shapeshift/helpers.spec.js | 44 ++++++++++--------- js/src/3rdparty/shapeshift/index.js | 9 ++-- js/src/3rdparty/shapeshift/{lib => }/rpc.js | 12 ++--- .../3rdparty/shapeshift/{lib => }/rpc.spec.js | 3 +- .../shapeshift/{lib => }/shapeshift.js | 12 ++--- .../shapeshift/{lib => }/shapeshift.spec.js | 3 +- 6 files changed, 42 insertions(+), 41 deletions(-) rename js/src/3rdparty/shapeshift/{lib => }/rpc.js (92%) rename js/src/3rdparty/shapeshift/{lib => }/rpc.spec.js (95%) rename js/src/3rdparty/shapeshift/{lib => }/shapeshift.js (83%) rename js/src/3rdparty/shapeshift/{lib => }/shapeshift.spec.js (96%) diff --git a/js/src/3rdparty/shapeshift/helpers.spec.js b/js/src/3rdparty/shapeshift/helpers.spec.js index aa389a30d34..04d85f8d06c 100644 --- a/js/src/3rdparty/shapeshift/helpers.spec.js +++ b/js/src/3rdparty/shapeshift/helpers.spec.js @@ -14,20 +14,24 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -'use strict'; +import chai from 'chai'; +import nock from 'nock'; -const APIKEY = '0x123454321'; +global.expect = chai.expect; // eslint-disable-line no-undef -const chai = require('chai'); -const nock = require('nock'); +import 'isomorphic-fetch'; +import es6Promise from 'es6-promise'; +es6Promise.polyfill(); -require('es6-promise').polyfill(); -require('isomorphic-fetch'); +import libShapeshift from './'; +import libRpc from './lib/rpc'; -const shapeshift = require('./index.js')(APIKEY); -const rpc = require('./lib/rpc')(APIKEY); +const APIKEY = '0x123454321'; -const mockget = function(requests) { +const shapeshift = libShapeshift(APIKEY); +const rpc = libRpc(APIKEY); + +function mockget (requests) { let scope = nock(rpc.ENDPOINT); requests.forEach((request) => { @@ -39,9 +43,9 @@ const mockget = function(requests) { }); return scope; -}; +} -const mockpost = function(requests) { +function mockpost (requests) { let scope = nock(rpc.ENDPOINT); requests.forEach((request) => { @@ -56,14 +60,12 @@ const mockpost = function(requests) { }); return scope; -}; - -global.expect = chai.expect; // eslint-disable-line no-undef - -module.exports = { - APIKEY: APIKEY, - mockget: mockget, - mockpost: mockpost, - shapeshift: shapeshift, - rpc: rpc +} + +export { + APIKEY, + mockget, + mockpost, + shapeshift, + rpc }; diff --git a/js/src/3rdparty/shapeshift/index.js b/js/src/3rdparty/shapeshift/index.js index bee544e4716..5dd91e4f42e 100644 --- a/js/src/3rdparty/shapeshift/index.js +++ b/js/src/3rdparty/shapeshift/index.js @@ -14,8 +14,9 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -module.exports = function(apikey) { - const rpc = require('./lib/rpc')(apikey); +import initRpc from './rpc'; +import initShapeshift from './shapeshift'; - return require('./lib/shapeshift')(rpc); -}; +export default function (apikey) { + return initShapeshift(initRpc(apikey)); +} diff --git a/js/src/3rdparty/shapeshift/lib/rpc.js b/js/src/3rdparty/shapeshift/rpc.js similarity index 92% rename from js/src/3rdparty/shapeshift/lib/rpc.js rename to js/src/3rdparty/shapeshift/rpc.js index 91b4490b5d7..0e28d0f73c7 100644 --- a/js/src/3rdparty/shapeshift/lib/rpc.js +++ b/js/src/3rdparty/shapeshift/rpc.js @@ -16,8 +16,8 @@ const ENDPOINT = 'https://cors.shapeshift.io'; -module.exports = function(apikey) { - const call = function(method, options) { +export default function (apikey) { + function call (method, options) { return fetch(`${ENDPOINT}/${method}`, options) .then((response) => { if (response.status !== 200) { @@ -33,12 +33,12 @@ module.exports = function(apikey) { return result; }); - }; + } return { ENDPOINT: ENDPOINT, - get: function(method) { + get: function (method) { return call(method, { method: 'GET', headers: { @@ -47,7 +47,7 @@ module.exports = function(apikey) { }); }, - post: function(method, data) { + post: function (method, data) { const params = { apiKey: apikey }; @@ -69,4 +69,4 @@ module.exports = function(apikey) { }); } }; -}; +} diff --git a/js/src/3rdparty/shapeshift/lib/rpc.spec.js b/js/src/3rdparty/shapeshift/rpc.spec.js similarity index 95% rename from js/src/3rdparty/shapeshift/lib/rpc.spec.js rename to js/src/3rdparty/shapeshift/rpc.spec.js index 57128806b74..cdcbe9c61cc 100644 --- a/js/src/3rdparty/shapeshift/lib/rpc.spec.js +++ b/js/src/3rdparty/shapeshift/rpc.spec.js @@ -14,8 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -const helpers = require('../helpers.spec.js'); -const { APIKEY, mockget, mockpost, rpc } = helpers; +import { APIKEY, mockget, mockpost, rpc } from './helpers.spec.js'; describe('lib/rpc', () => { describe('GET', () => { diff --git a/js/src/3rdparty/shapeshift/lib/shapeshift.js b/js/src/3rdparty/shapeshift/shapeshift.js similarity index 83% rename from js/src/3rdparty/shapeshift/lib/shapeshift.js rename to js/src/3rdparty/shapeshift/shapeshift.js index bb333e76da1..a094e450710 100644 --- a/js/src/3rdparty/shapeshift/lib/shapeshift.js +++ b/js/src/3rdparty/shapeshift/shapeshift.js @@ -14,21 +14,21 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -module.exports = function(rpc) { +export default function (rpc) { return { - getCoins: function() { + getCoins: function () { return rpc.get('getcoins'); }, - getMarketInfo: function(pair) { + getMarketInfo: function (pair) { return rpc.get(`marketinfo/${pair}`); }, - getStatus: function(depositAddress) { + getStatus: function (depositAddress) { return rpc.get(`txStat/${depositAddress}`); }, - shift: function(toAddress, returnAddress, pair) { + shift: function (toAddress, returnAddress, pair) { return rpc.post('shift', { withdrawal: toAddress, pair: pair, @@ -36,4 +36,4 @@ module.exports = function(rpc) { }); } }; -}; +} diff --git a/js/src/3rdparty/shapeshift/lib/shapeshift.spec.js b/js/src/3rdparty/shapeshift/shapeshift.spec.js similarity index 96% rename from js/src/3rdparty/shapeshift/lib/shapeshift.spec.js rename to js/src/3rdparty/shapeshift/shapeshift.spec.js index 922ef271cf7..1997535d405 100644 --- a/js/src/3rdparty/shapeshift/lib/shapeshift.spec.js +++ b/js/src/3rdparty/shapeshift/shapeshift.spec.js @@ -14,8 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -const helpers = require('../helpers.spec.js'); -const { mockget, mockpost, shapeshift } = helpers; +import { mockget, mockpost, shapeshift } from './helpers.spec.js'; describe('lib/calls', () => { describe('getCoins', () => { From 1a6daa8ec2a8dea9fde9314c19e9b871f19ce39c Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 13 Sep 2016 23:48:22 +0200 Subject: [PATCH 0473/1062] fix tests with new structure, proper naming --- js/src/3rdparty/shapeshift/helpers.spec.js | 8 ++++---- js/src/3rdparty/shapeshift/rpc.spec.js | 2 +- js/src/3rdparty/shapeshift/shapeshift.spec.js | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/js/src/3rdparty/shapeshift/helpers.spec.js b/js/src/3rdparty/shapeshift/helpers.spec.js index 04d85f8d06c..a82b2f6c39f 100644 --- a/js/src/3rdparty/shapeshift/helpers.spec.js +++ b/js/src/3rdparty/shapeshift/helpers.spec.js @@ -23,13 +23,13 @@ import 'isomorphic-fetch'; import es6Promise from 'es6-promise'; es6Promise.polyfill(); -import libShapeshift from './'; -import libRpc from './lib/rpc'; +import initShapeshift from './'; +import initRpc from './rpc'; const APIKEY = '0x123454321'; -const shapeshift = libShapeshift(APIKEY); -const rpc = libRpc(APIKEY); +const shapeshift = initShapeshift(APIKEY); +const rpc = initRpc(APIKEY); function mockget (requests) { let scope = nock(rpc.ENDPOINT); diff --git a/js/src/3rdparty/shapeshift/rpc.spec.js b/js/src/3rdparty/shapeshift/rpc.spec.js index cdcbe9c61cc..8de9e86413f 100644 --- a/js/src/3rdparty/shapeshift/rpc.spec.js +++ b/js/src/3rdparty/shapeshift/rpc.spec.js @@ -16,7 +16,7 @@ import { APIKEY, mockget, mockpost, rpc } from './helpers.spec.js'; -describe('lib/rpc', () => { +describe('shapeshift/rpc', () => { describe('GET', () => { const REPLY = { test: 'this is some result' }; diff --git a/js/src/3rdparty/shapeshift/shapeshift.spec.js b/js/src/3rdparty/shapeshift/shapeshift.spec.js index 1997535d405..36b1506a271 100644 --- a/js/src/3rdparty/shapeshift/shapeshift.spec.js +++ b/js/src/3rdparty/shapeshift/shapeshift.spec.js @@ -16,7 +16,7 @@ import { mockget, mockpost, shapeshift } from './helpers.spec.js'; -describe('lib/calls', () => { +describe('shapeshift/calls', () => { describe('getCoins', () => { const REPLY = { BTC: { From cab8a6b1b8be5b7c6e83139f895b38f3ffff7754 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 13 Sep 2016 23:55:30 +0200 Subject: [PATCH 0474/1062] define functions explicitly withing closure --- js/src/3rdparty/shapeshift/rpc.js | 58 ++++++++++++------------ js/src/3rdparty/shapeshift/shapeshift.js | 43 ++++++++++-------- 2 files changed, 54 insertions(+), 47 deletions(-) diff --git a/js/src/3rdparty/shapeshift/rpc.js b/js/src/3rdparty/shapeshift/rpc.js index 0e28d0f73c7..087a69214f4 100644 --- a/js/src/3rdparty/shapeshift/rpc.js +++ b/js/src/3rdparty/shapeshift/rpc.js @@ -35,38 +35,40 @@ export default function (apikey) { }); } - return { - ENDPOINT: ENDPOINT, + function get (method) { + return call(method, { + method: 'GET', + headers: { + 'Accept': 'application/json' + } + }); + } - get: function (method) { - return call(method, { - method: 'GET', - headers: { - 'Accept': 'application/json' - } - }); - }, + function post (method, data) { + const params = { + apiKey: apikey + }; - post: function (method, data) { - const params = { - apiKey: apikey - }; + Object.keys(data).forEach((key) => { + params[key] = data[key]; + }); - Object.keys(data).forEach((key) => { - params[key] = data[key]; - }); + const json = JSON.stringify(params); - const json = JSON.stringify(params); + return call(method, { + method: 'POST', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Content-Length': json.length + }, + body: json + }); + } - return call(method, { - method: 'POST', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json', - 'Content-Length': json.length - }, - body: json - }); - } + return { + ENDPOINT, + get, + post }; } diff --git a/js/src/3rdparty/shapeshift/shapeshift.js b/js/src/3rdparty/shapeshift/shapeshift.js index a094e450710..7d20f155b36 100644 --- a/js/src/3rdparty/shapeshift/shapeshift.js +++ b/js/src/3rdparty/shapeshift/shapeshift.js @@ -15,25 +15,30 @@ // along with Parity. If not, see . export default function (rpc) { + function getCoins () { + return rpc.get('getcoins'); + } + + function getMarketInfo (pair) { + return rpc.get(`marketinfo/${pair}`); + } + + function getStatus (depositAddress) { + return rpc.get(`txStat/${depositAddress}`); + } + + function shift (toAddress, returnAddress, pair) { + return rpc.post('shift', { + withdrawal: toAddress, + pair: pair, + returnAddress: returnAddress + }); + } + return { - getCoins: function () { - return rpc.get('getcoins'); - }, - - getMarketInfo: function (pair) { - return rpc.get(`marketinfo/${pair}`); - }, - - getStatus: function (depositAddress) { - return rpc.get(`txStat/${depositAddress}`); - }, - - shift: function (toAddress, returnAddress, pair) { - return rpc.post('shift', { - withdrawal: toAddress, - pair: pair, - returnAddress: returnAddress - }); - } + getCoins, + getMarketInfo, + getStatus, + shift }; } From 186baff7ebaf9b48ead6ce0c23c52140ee25be8a Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 14 Sep 2016 00:13:11 +0200 Subject: [PATCH 0475/1062] call is not needed within closure --- js/src/3rdparty/shapeshift/rpc.js | 47 +++++++++++++------------------ 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/js/src/3rdparty/shapeshift/rpc.js b/js/src/3rdparty/shapeshift/rpc.js index 087a69214f4..d2df7f3e8c5 100644 --- a/js/src/3rdparty/shapeshift/rpc.js +++ b/js/src/3rdparty/shapeshift/rpc.js @@ -16,25 +16,25 @@ const ENDPOINT = 'https://cors.shapeshift.io'; -export default function (apikey) { - function call (method, options) { - return fetch(`${ENDPOINT}/${method}`, options) - .then((response) => { - if (response.status !== 200) { - throw { code: response.status, message: response.statusText }; // eslint-disable-line - } +function call (method, options) { + return fetch(`${ENDPOINT}/${method}`, options) + .then((response) => { + if (response.status !== 200) { + throw { code: response.status, message: response.statusText }; // eslint-disable-line + } - return response.json(); - }) - .then((result) => { - if (result.error) { - throw { code: -1, message: result.error }; // eslint-disable-line - } + return response.json(); + }) + .then((result) => { + if (result.error) { + throw { code: -1, message: result.error }; // eslint-disable-line + } - return result; - }); - } + return result; + }); +} +export default function (apiKey) { function get (method) { return call(method, { method: 'GET', @@ -45,24 +45,17 @@ export default function (apikey) { } function post (method, data) { - const params = { - apiKey: apikey - }; - - Object.keys(data).forEach((key) => { - params[key] = data[key]; - }); - - const json = JSON.stringify(params); + const params = Object.assign({}, { apiKey }, data); + const body = JSON.stringify(params); return call(method, { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', - 'Content-Length': json.length + 'Content-Length': body.length }, - body: json + body }); } From 329f295086fd1178dcabed87c314fadb85268ad4 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 14 Sep 2016 01:15:12 +0200 Subject: [PATCH 0476/1062] use a single provider for childContext, removing the context pyramid --- js/src/index.js | 48 ++++++++----------- js/src/ui/ApiProvider/index.js | 1 - .../contextProvider.js} | 12 +++-- js/src/ui/ContextProvider/index.js | 1 + js/src/ui/index.js | 4 +- 5 files changed, 33 insertions(+), 33 deletions(-) delete mode 100644 js/src/ui/ApiProvider/index.js rename js/src/ui/{ApiProvider/apiProvider.js => ContextProvider/contextProvider.js} (58%) create mode 100644 js/src/ui/ContextProvider/index.js diff --git a/js/src/index.js b/js/src/index.js index 7f8ac2a0efe..69c9b033cb9 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -4,15 +4,13 @@ import ReactDOM from 'react-dom'; import injectTapEventPlugin from 'react-tap-event-plugin'; import es6Promise from 'es6-promise'; import { createHashHistory } from 'history'; -import { Provider } from 'react-redux'; import { Redirect, Router, Route, useRouterHistory } from 'react-router'; -import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; import Web3 from 'web3'; import Api from './api'; import { initStore } from './redux'; -import { ApiProvider, muiTheme } from './ui'; +import { ContextProvider, muiTheme } from './ui'; import { Accounts, Account, Addresses, Address, Application, Contract, Contracts, Dapp, Dapps, Signer, Status } from './views'; // TODO: This is VERY messy, just dumped here to get the Signer going @@ -51,29 +49,25 @@ ws.init(initToken); const routerHistory = useRouterHistory(createHashHistory)({}); ReactDOM.render( - - - - - - - - - - - - - - - - - - - - - - - - , + + + + + + + + + + + + + + + + + + + + , document.querySelector('#container') ); diff --git a/js/src/ui/ApiProvider/index.js b/js/src/ui/ApiProvider/index.js deleted file mode 100644 index 7897c879e94..00000000000 --- a/js/src/ui/ApiProvider/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './apiProvider'; diff --git a/js/src/ui/ApiProvider/apiProvider.js b/js/src/ui/ContextProvider/contextProvider.js similarity index 58% rename from js/src/ui/ApiProvider/apiProvider.js rename to js/src/ui/ContextProvider/contextProvider.js index db35f3e113e..77df28076e9 100644 --- a/js/src/ui/ApiProvider/apiProvider.js +++ b/js/src/ui/ContextProvider/contextProvider.js @@ -3,11 +3,15 @@ import { Component, PropTypes } from 'react'; export default class ApiProvider extends Component { static propTypes = { api: PropTypes.object.isRequired, + muiTheme: PropTypes.object.isRequired, + store: PropTypes.object.isRequired, children: PropTypes.node.isRequired } static childContextTypes = { - api: PropTypes.object + api: PropTypes.object, + muiTheme: PropTypes.object, + store: PropTypes.object } render () { @@ -17,10 +21,12 @@ export default class ApiProvider extends Component { } getChildContext () { - const { api } = this.props; + const { api, muiTheme, store } = this.props; return { - api + api, + muiTheme, + store }; } } diff --git a/js/src/ui/ContextProvider/index.js b/js/src/ui/ContextProvider/index.js new file mode 100644 index 00000000000..6b6958db75c --- /dev/null +++ b/js/src/ui/ContextProvider/index.js @@ -0,0 +1 @@ +export default from './contextProvider'; diff --git a/js/src/ui/index.js b/js/src/ui/index.js index 763ecf8fd0b..23b6f9adaf1 100644 --- a/js/src/ui/index.js +++ b/js/src/ui/index.js @@ -1,8 +1,8 @@ import Actionbar from './Actionbar'; -import ApiProvider from './ApiProvider'; import Badge from './Badge'; import Balance from './Balance'; import Container, { Title as ContainerTitle } from './Container'; +import ContextProvider from './ContextProvider'; import Errors from './Errors'; import Form, { FormWrap, Input, InputAddress, InputAddressSelect, InputInline, Select } from './Form'; import IdentityIcon from './IdentityIcon'; @@ -14,11 +14,11 @@ import Tooltips, { Tooltip } from './Tooltips'; export { Actionbar, - ApiProvider, Badge, Balance, Container, ContainerTitle, + ContextProvider, Errors, Form, FormWrap, From 0e16b57e6ce7cf45c3e492eb995b92ded121fb88 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 14 Sep 2016 01:16:54 +0200 Subject: [PATCH 0477/1062] default class name to match file --- js/src/ui/ContextProvider/contextProvider.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/ui/ContextProvider/contextProvider.js b/js/src/ui/ContextProvider/contextProvider.js index 77df28076e9..ef013f5fd19 100644 --- a/js/src/ui/ContextProvider/contextProvider.js +++ b/js/src/ui/ContextProvider/contextProvider.js @@ -1,6 +1,6 @@ import { Component, PropTypes } from 'react'; -export default class ApiProvider extends Component { +export default class ContextProvider extends Component { static propTypes = { api: PropTypes.object.isRequired, muiTheme: PropTypes.object.isRequired, From 3ba148562416fe0dcb895eb17d5fa28fc496f549 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 14 Sep 2016 10:43:12 +0200 Subject: [PATCH 0478/1062] add install-deps & test scripts (easier access from gitlab-ci.yml) --- .gitlab-ci.yml | 4 ++-- js/scripts/check-master.sh | 10 ---------- js/scripts/deploy-to-gh-pages.sh | 33 -------------------------------- js/scripts/install-deps.sh | 15 +++++++++++++++ js/scripts/test.sh | 15 +++++++++++++++ 5 files changed, 32 insertions(+), 45 deletions(-) delete mode 100644 js/scripts/check-master.sh delete mode 100644 js/scripts/deploy-to-gh-pages.sh create mode 100755 js/scripts/install-deps.sh create mode 100755 js/scripts/test.sh diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a4a86326eaa..277acd34da2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -243,9 +243,9 @@ test-linux: stage: test before_script: - git submodule update --init --recursive - - cd js && npm install && cd .. + - ./js/scripts/install-deps.sh script: - - cd js && npm run lint && npm test + - ./js/scripts/test.sh - ./test.sh --verbose tags: - rust-test diff --git a/js/scripts/check-master.sh b/js/scripts/check-master.sh deleted file mode 100644 index a3f80d4bd93..00000000000 --- a/js/scripts/check-master.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -PROTECTED_BRANCH='master' -CURRENT_BRANCH=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,') - -if [ $PROTECTED_BRANCH = $CURRENT_BRANCH ]; -then - echo "Direct commits to the branch master are not allowed" - exit 1 -fi diff --git a/js/scripts/deploy-to-gh-pages.sh b/js/scripts/deploy-to-gh-pages.sh deleted file mode 100644 index 4458816355e..00000000000 --- a/js/scripts/deploy-to-gh-pages.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash -# See https://medium.com/@nthgergo/publishing-gh-pages-with-travis-ci-53a8270e87db -set -o errexit - -SOURCE_BRANCH="master" -TARGET_BRANCH="gh-pages" -GIT_USER_EMAIL="admin@travis-ci.org" -GIT_USER_NAME="Travis CI" -SHA=$(git rev-parse --verify HEAD) # reference to commit deployed to TARGET_BRANCH -COMMIT_MSG="Deploy to Github Pages: ${SHA}" - -# Don't deploy if -# 1. Pull request -# 2. Not target branch -# 3. Forked repo - -if [[ ("$TRAVIS_PULL_REQUEST" != "false") || ("$TRAVIS_BRANCH" != "$SOURCE_BRANCH") || ("$TRAVIS_REPO_SLUG" != "$REPO_SLUG") ]]; then - echo 'Not deploying'; - exit 0 -fi - - -# config -git config --global user.email "$GIT_USER_EMAIL" -git config --global user.name "$GIT_USER_NAME" - -# deploy -cd lib -git init -git add . -git commit -m "$COMMIT_MSG" - -git push -f --quiet "https://${GITHUB_TOKEN}@github.com/${REPO_SLUG}.git" $SOURCE_BRANCH:$TARGET_BRANCH > /dev/null 2>&1 diff --git a/js/scripts/install-deps.sh b/js/scripts/install-deps.sh new file mode 100755 index 00000000000..9a89382a193 --- /dev/null +++ b/js/scripts/install-deps.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +# change into the js directory (one down from scripts) +pushd `dirname $0` +cd .. + +# install deps and store the exit code +npm install +EXICCODE=$? + +# back to root +popd + +# exit with exit code +exit $EXITCODE diff --git a/js/scripts/test.sh b/js/scripts/test.sh new file mode 100755 index 00000000000..4bc7661ebf4 --- /dev/null +++ b/js/scripts/test.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +# change into the js directory (one down from scripts) +pushd `dirname $0` +cd .. + +# run lint & tests and store the exit code +npm run lint && npm run test +EXICCODE=$? + +# back to root +popd + +# exit with exit code +exit $EXITCODE From 94676c834859c7ed598548843002af189f00050e Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 14 Sep 2016 10:47:49 +0200 Subject: [PATCH 0479/1062] fix eslint issues to make the build pass --- js/src/dapps/registry.js | 8 +++----- js/src/dapps/registry/Application/application.js | 2 ++ js/src/dapps/registry/Lookup/reducers.js | 9 ++++++--- js/src/dapps/registry/reducers.js | 9 ++++++--- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/js/src/dapps/registry.js b/js/src/dapps/registry.js index 03ec8885154..a42326bcd27 100644 --- a/js/src/dapps/registry.js +++ b/js/src/dapps/registry.js @@ -9,10 +9,8 @@ import './style.css'; import './registry.html'; ReactDOM.render( - ( - - - - ), + + + , document.querySelector('#container') ); diff --git a/js/src/dapps/registry/Application/application.js b/js/src/dapps/registry/Application/application.js index 9c825a0f0fd..a72d9bced11 100644 --- a/js/src/dapps/registry/Application/application.js +++ b/js/src/dapps/registry/Application/application.js @@ -33,7 +33,9 @@ export default class Application extends Component { } Application.propTypes = { + actions: PropTypes.object, contract: PropTypes.object, fee: PropTypes.object, + lookup: PropTypes.object, owner: PropTypes.string }; diff --git a/js/src/dapps/registry/Lookup/reducers.js b/js/src/dapps/registry/Lookup/reducers.js index dc0aa80b31c..384517ba49b 100644 --- a/js/src/dapps/registry/Lookup/reducers.js +++ b/js/src/dapps/registry/Lookup/reducers.js @@ -5,26 +5,29 @@ const initialState = { }; export default (state = initialState, action) => { - if (action.type === 'lookup start') + if (action.type === 'lookup start') { return { pending: true, name: action.name, key: action.key, result: null }; + } - if (action.type === 'lookup error') + if (action.type === 'lookup error') { return { pending: false, name: null, key: null, result: null }; + } - if (action.type === 'lookup success') + if (action.type === 'lookup success') { return { pending: false, name: null, key: null, result: action.result }; + } return state; }; diff --git a/js/src/dapps/registry/reducers.js b/js/src/dapps/registry/reducers.js index ee05f5f7ed6..05e794d0b4a 100644 --- a/js/src/dapps/registry/reducers.js +++ b/js/src/dapps/registry/reducers.js @@ -8,14 +8,17 @@ const initialState = { }; export default (state = initialState, action) => { - if (action.type === 'set contract') + if (action.type === 'set contract') { return { ...state, contract: action.contract }; + } - if (action.type === 'set fee') + if (action.type === 'set fee') { return { ...state, fee: action.fee }; + } - if (action.type === 'set owner') + if (action.type === 'set owner') { return { ...state, owner: action.owner }; + } if (action.type.slice(0, 6) === 'lookup') { return { ...state, lookup: lookupReducer(state.lookup, action) }; From 772b6e36b977189bff78a1f4a8800100687a9ce6 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 14 Sep 2016 10:50:08 +0200 Subject: [PATCH 0480/1062] add missing GPL headers to all files (#2086) * 3rdparty/etherscan GPL header * abi GPL header * api GPL header * dapps GPL header (excl. registry & tokenreg) * environment GPL header * jsonrpc GPL header * modals GPL header * redux GPL header * ui GPL header * util GPL header * views GPL header (excl. Signer & Status) * Signer GPL header * Status GPL header * css GPL header * test GPL header * other files GPL header --- js/rollup.library.js | 16 ++++++++ js/src/3rdparty/etherscan/account.js | 16 ++++++++ js/src/3rdparty/etherscan/account.spec.js | 16 ++++++++ js/src/3rdparty/etherscan/call.js | 16 ++++++++ js/src/3rdparty/etherscan/index.js | 16 ++++++++ js/src/3rdparty/etherscan/stats.js | 16 ++++++++ js/src/3rdparty/etherscan/stats.spec.js | 16 ++++++++ js/src/abi/abi.js | 16 ++++++++ js/src/abi/decoder/bytesTaken.js | 16 ++++++++ js/src/abi/decoder/bytesTaken.spec.js | 16 ++++++++ js/src/abi/decoder/decodeResult.js | 16 ++++++++ js/src/abi/decoder/decodeResult.spec.js | 16 ++++++++ js/src/abi/decoder/decoder.js | 16 ++++++++ js/src/abi/decoder/decoder.spec.js | 16 ++++++++ js/src/abi/decoder/index.js | 16 ++++++++ js/src/abi/encoder/encoder.js | 16 ++++++++ js/src/abi/encoder/encoder.spec.js | 16 ++++++++ js/src/abi/encoder/index.js | 16 ++++++++ js/src/abi/encoder/mediate.js | 16 ++++++++ js/src/abi/encoder/mediate.spec.js | 16 ++++++++ js/src/abi/index.js | 16 ++++++++ js/src/abi/spec/constructor.js | 16 ++++++++ js/src/abi/spec/constructor.spec.js | 16 ++++++++ js/src/abi/spec/event/decodedLog.js | 16 ++++++++ js/src/abi/spec/event/decodedLog.spec.js | 16 ++++++++ js/src/abi/spec/event/decodedLogParam.js | 16 ++++++++ js/src/abi/spec/event/decodedLogParam.spec.js | 16 ++++++++ js/src/abi/spec/event/event.js | 16 ++++++++ js/src/abi/spec/event/event.spec.js | 16 ++++++++ js/src/abi/spec/event/eventParam.js | 16 ++++++++ js/src/abi/spec/event/eventParam.spec.js | 16 ++++++++ js/src/abi/spec/event/index.js | 16 ++++++++ js/src/abi/spec/function.js | 16 ++++++++ js/src/abi/spec/function.spec.js | 16 ++++++++ js/src/abi/spec/index.js | 16 ++++++++ js/src/abi/spec/interface.js | 16 ++++++++ js/src/abi/spec/interface.spec.js | 16 ++++++++ js/src/abi/spec/param.js | 16 ++++++++ js/src/abi/spec/param.spec.js | 16 ++++++++ js/src/abi/spec/paramType/format.js | 16 ++++++++ js/src/abi/spec/paramType/format.spec.js | 16 ++++++++ js/src/abi/spec/paramType/index.js | 16 ++++++++ js/src/abi/spec/paramType/paramType.js | 16 ++++++++ js/src/abi/spec/paramType/paramType.spec.js | 16 ++++++++ js/src/abi/spec/paramType/types.js | 17 ++++++++ js/src/abi/token/index.js | 16 ++++++++ js/src/abi/token/token.js | 16 ++++++++ js/src/abi/token/token.spec.js | 16 ++++++++ js/src/abi/util/address.js | 16 ++++++++ js/src/abi/util/address.spec.js | 16 ++++++++ js/src/abi/util/pad.js | 16 ++++++++ js/src/abi/util/pad.spec.js | 16 ++++++++ js/src/abi/util/signature.js | 16 ++++++++ js/src/abi/util/signature.spec.js | 16 ++++++++ js/src/abi/util/slice.js | 16 ++++++++ js/src/abi/util/slice.spec.js | 16 ++++++++ js/src/abi/util/sliceAs.js | 16 ++++++++ js/src/abi/util/sliceAs.spec.js | 16 ++++++++ js/src/abi/util/types.js | 16 ++++++++ js/src/abi/util/types.spec.js | 16 ++++++++ js/src/api/api.js | 16 ++++++++ js/src/api/api.spec.js | 16 ++++++++ js/src/api/contract/contract.js | 16 ++++++++ js/src/api/contract/contract.spec.js | 16 ++++++++ js/src/api/contract/index.js | 16 ++++++++ js/src/api/format/index.js | 16 ++++++++ js/src/api/format/input.js | 18 ++++++++- js/src/api/format/input.spec.js | 16 ++++++++ js/src/api/format/output.js | 16 ++++++++ js/src/api/format/output.spec.js | 16 ++++++++ js/src/api/format/sha3.js | 16 ++++++++ js/src/api/format/sha3.spec.js | 16 ++++++++ js/src/api/format/wei.js | 16 ++++++++ js/src/api/format/wei.spec.js | 16 ++++++++ js/src/api/index.js | 16 ++++++++ js/src/api/rpc/db/db.js | 16 ++++++++ js/src/api/rpc/db/db.spec.js | 16 ++++++++ js/src/api/rpc/db/index.js | 16 ++++++++ js/src/api/rpc/eth/eth.e2e.js | 16 ++++++++ js/src/api/rpc/eth/eth.js | 16 ++++++++ js/src/api/rpc/eth/eth.spec.js | 16 ++++++++ js/src/api/rpc/eth/index.js | 16 ++++++++ js/src/api/rpc/ethcore/ethcore.e2e.js | 16 ++++++++ js/src/api/rpc/ethcore/ethcore.js | 16 ++++++++ js/src/api/rpc/ethcore/ethcore.spec.js | 16 ++++++++ js/src/api/rpc/ethcore/index.js | 16 ++++++++ js/src/api/rpc/index.js | 16 ++++++++ js/src/api/rpc/net/index.js | 16 ++++++++ js/src/api/rpc/net/net.e2e.js | 16 ++++++++ js/src/api/rpc/net/net.js | 16 ++++++++ js/src/api/rpc/net/net.spec.js | 16 ++++++++ js/src/api/rpc/personal/index.js | 16 ++++++++ js/src/api/rpc/personal/personal.e2e.js | 16 ++++++++ js/src/api/rpc/personal/personal.js | 16 ++++++++ js/src/api/rpc/personal/personal.spec.js | 16 ++++++++ js/src/api/rpc/shh/index.js | 16 ++++++++ js/src/api/rpc/shh/shh.js | 16 ++++++++ js/src/api/rpc/trace/index.js | 16 ++++++++ js/src/api/rpc/trace/trace.e2e.js | 16 ++++++++ js/src/api/rpc/trace/trace.js | 16 ++++++++ js/src/api/rpc/trace/trace.spec.js | 16 ++++++++ js/src/api/rpc/web3/index.js | 16 ++++++++ js/src/api/rpc/web3/web3.e2e.js | 16 ++++++++ js/src/api/rpc/web3/web3.js | 16 ++++++++ js/src/api/rpc/web3/web3.spec.js | 16 ++++++++ js/src/api/subscriptions/eth.js | 16 ++++++++ js/src/api/subscriptions/index.js | 16 ++++++++ js/src/api/subscriptions/logging.js | 16 ++++++++ js/src/api/subscriptions/personal.js | 16 ++++++++ js/src/api/subscriptions/subscriptions.js | 16 ++++++++ js/src/api/transport/http/http.e2e.js | 16 ++++++++ js/src/api/transport/http/http.js | 16 ++++++++ js/src/api/transport/http/http.spec.js | 16 ++++++++ js/src/api/transport/http/index.js | 16 ++++++++ js/src/api/transport/index.js | 16 ++++++++ js/src/api/transport/jsonRpcBase.js | 16 ++++++++ js/src/api/transport/jsonRpcBase.spec.js | 16 ++++++++ js/src/api/transport/ws/index.js | 16 ++++++++ js/src/api/transport/ws/ws.e2e.js | 16 ++++++++ js/src/api/transport/ws/ws.js | 16 ++++++++ js/src/api/transport/ws/ws.spec.js | 16 ++++++++ js/src/api/util/types.js | 16 ++++++++ js/src/api/util/types.spec.js | 16 ++++++++ js/src/dapps/gavcoin.js | 16 ++++++++ .../AccountItem/accountItem.css | 16 ++++++++ .../AccountItem/accountItem.js | 16 ++++++++ .../AccountSelector/AccountItem/index.js | 16 ++++++++ .../AccountSelector/accountSelector.js | 16 ++++++++ js/src/dapps/gavcoin/AccountSelector/index.js | 16 ++++++++ .../accountSelectorText.css | 16 ++++++++ .../accountSelectorText.js | 16 ++++++++ .../gavcoin/AccountSelectorText/index.js | 16 ++++++++ js/src/dapps/gavcoin/Accounts/accounts.css | 16 ++++++++ js/src/dapps/gavcoin/Accounts/accounts.js | 16 ++++++++ js/src/dapps/gavcoin/Accounts/index.js | 16 ++++++++ .../Actions/ActionBuyIn/actionBuyIn.js | 16 ++++++++ .../gavcoin/Actions/ActionBuyIn/index.js | 16 ++++++++ .../Actions/ActionRefund/actionRefund.js | 16 ++++++++ .../gavcoin/Actions/ActionRefund/index.js | 16 ++++++++ .../Actions/ActionTransfer/actionTransfer.js | 16 ++++++++ .../gavcoin/Actions/ActionTransfer/index.js | 16 ++++++++ .../gavcoin/Actions/StepComplete/index.js | 16 ++++++++ .../Actions/StepComplete/stepComplete.js | 16 ++++++++ js/src/dapps/gavcoin/Actions/actions.css | 16 ++++++++ js/src/dapps/gavcoin/Actions/actions.js | 16 ++++++++ js/src/dapps/gavcoin/Actions/index.js | 16 ++++++++ js/src/dapps/gavcoin/Actions/validation.js | 16 ++++++++ .../dapps/gavcoin/Application/application.js | 16 ++++++++ js/src/dapps/gavcoin/Application/index.js | 16 ++++++++ js/src/dapps/gavcoin/Events/Event/event.js | 16 ++++++++ js/src/dapps/gavcoin/Events/Event/index.js | 16 ++++++++ .../gavcoin/Events/EventBuyin/eventBuyin.js | 16 ++++++++ .../dapps/gavcoin/Events/EventBuyin/index.js | 16 ++++++++ .../Events/EventNewTranch/eventNewTranch.js | 16 ++++++++ .../gavcoin/Events/EventNewTranch/index.js | 16 ++++++++ .../gavcoin/Events/EventRefund/eventRefund.js | 21 +++++++--- .../dapps/gavcoin/Events/EventRefund/index.js | 16 ++++++++ .../Events/EventTransfer/eventTransfer.js | 16 ++++++++ .../gavcoin/Events/EventTransfer/index.js | 16 ++++++++ js/src/dapps/gavcoin/Events/events.css | 16 ++++++++ js/src/dapps/gavcoin/Events/events.js | 16 ++++++++ js/src/dapps/gavcoin/Events/index.js | 16 ++++++++ js/src/dapps/gavcoin/Loading/index.js | 16 ++++++++ js/src/dapps/gavcoin/Loading/loading.css | 16 ++++++++ js/src/dapps/gavcoin/Loading/loading.js | 16 ++++++++ js/src/dapps/gavcoin/Status/index.js | 16 ++++++++ js/src/dapps/gavcoin/Status/status.css | 16 ++++++++ js/src/dapps/gavcoin/Status/status.js | 16 ++++++++ js/src/dapps/gavcoin/format/index.js | 16 ++++++++ js/src/dapps/registry.js | 16 ++++++++ js/src/dapps/registry/Lookup/lookup.css | 16 ++++++++ js/src/dapps/registry/Status/status.css | 16 ++++++++ js/src/dapps/tokenreg.js | 16 ++++++++ js/src/dapps/tokenreg/Loading/loading.css | 16 ++++++++ js/src/dapps/tokenreg/Status/status.css | 16 ++++++++ js/src/environment/index.js | 16 ++++++++ .../integration-tests/fake-backend.js | 16 ++++++++ js/src/environment/integration-tests/index.js | 16 ++++++++ js/src/environment/perf-debug/index.js | 16 ++++++++ js/src/environment/perf-debug/why-update.js | 16 ++++++++ js/src/environment/tests/index.js | 16 ++++++++ js/src/environment/tests/test-utils.js | 16 ++++++++ js/src/index.js | 16 ++++++++ js/src/jsonrpc/generator/build-json.js | 16 ++++++++ js/src/jsonrpc/generator/build-markdown.js | 16 ++++++++ js/src/jsonrpc/index.js | 16 ++++++++ js/src/jsonrpc/index.spec.js | 16 ++++++++ js/src/jsonrpc/interfaces/db.js | 16 ++++++++ js/src/jsonrpc/interfaces/eth.js | 16 ++++++++ js/src/jsonrpc/interfaces/ethcore.js | 16 ++++++++ js/src/jsonrpc/interfaces/net.js | 16 ++++++++ js/src/jsonrpc/interfaces/personal.js | 16 ++++++++ js/src/jsonrpc/interfaces/shh.js | 16 ++++++++ js/src/jsonrpc/interfaces/trace.js | 16 ++++++++ js/src/jsonrpc/interfaces/web3.js | 16 ++++++++ js/src/jsonrpc/types.js | 16 ++++++++ js/src/modals/AddAddress/addAddress.css | 16 ++++++++ js/src/modals/AddAddress/addAddress.js | 16 ++++++++ js/src/modals/AddAddress/index.js | 16 ++++++++ .../AccountDetails/accountDetails.css | 16 ++++++++ .../AccountDetails/accountDetails.js | 16 ++++++++ .../CreateAccount/AccountDetails/index.js | 16 ++++++++ .../AccountDetailsGeth/accountDetailsGeth.css | 16 ++++++++ .../AccountDetailsGeth/accountDetailsGeth.js | 16 ++++++++ .../CreateAccount/AccountDetailsGeth/index.js | 16 ++++++++ .../CreationType/creationType.js | 16 ++++++++ .../CreateAccount/CreationType/index.js | 16 ++++++++ .../modals/CreateAccount/NewAccount/index.js | 16 ++++++++ .../CreateAccount/NewAccount/newAccount.js | 16 ++++++++ js/src/modals/CreateAccount/NewGeth/index.js | 16 ++++++++ .../modals/CreateAccount/NewGeth/newGeth.css | 16 ++++++++ .../modals/CreateAccount/NewGeth/newGeth.js | 16 ++++++++ .../modals/CreateAccount/NewImport/index.js | 16 ++++++++ .../CreateAccount/NewImport/newImport.js | 16 ++++++++ js/src/modals/CreateAccount/createAccount.css | 16 ++++++++ js/src/modals/CreateAccount/createAccount.js | 16 ++++++++ js/src/modals/CreateAccount/index.js | 16 ++++++++ js/src/modals/FirstRun/Completed/completed.js | 16 ++++++++ js/src/modals/FirstRun/Completed/index.js | 16 ++++++++ js/src/modals/FirstRun/Welcome/index.js | 16 ++++++++ js/src/modals/FirstRun/Welcome/welcome.js | 16 ++++++++ js/src/modals/FirstRun/firstRun.js | 16 ++++++++ js/src/modals/FirstRun/index.js | 16 ++++++++ js/src/modals/FundAccount/fundAccount.js | 16 ++++++++ js/src/modals/FundAccount/index.js | 16 ++++++++ js/src/modals/Transfer/Complete/complete.js | 16 ++++++++ js/src/modals/Transfer/Complete/index.js | 16 ++++++++ js/src/modals/Transfer/Details/details.js | 16 ++++++++ js/src/modals/Transfer/Details/index.js | 16 ++++++++ js/src/modals/Transfer/Extras/extras.js | 16 ++++++++ js/src/modals/Transfer/Extras/index.js | 16 ++++++++ js/src/modals/Transfer/errors.js | 16 ++++++++ js/src/modals/Transfer/index.js | 16 ++++++++ js/src/modals/Transfer/transfer.css | 16 ++++++++ js/src/modals/Transfer/transfer.js | 16 ++++++++ js/src/modals/index.js | 16 ++++++++ js/src/parity.js | 16 ++++++++ js/src/redux/actions.js | 16 ++++++++ js/src/redux/index.js | 16 ++++++++ js/src/redux/middleware.js | 16 ++++++++ js/src/redux/providers/balances.js | 16 ++++++++ js/src/redux/providers/balancesActions.js | 16 ++++++++ js/src/redux/providers/balancesReducer.js | 16 ++++++++ js/src/redux/providers/index.js | 16 ++++++++ js/src/redux/providers/personal.js | 16 ++++++++ js/src/redux/providers/personalActions.js | 16 ++++++++ js/src/redux/providers/personalReducer.js | 16 ++++++++ js/src/redux/providers/status.js | 16 ++++++++ js/src/redux/providers/statusActions.js | 16 ++++++++ js/src/redux/providers/statusReducer.js | 16 ++++++++ js/src/redux/reducers.js | 16 ++++++++ js/src/redux/store.js | 16 ++++++++ js/src/redux/util.js | 16 ++++++++ js/src/reset.css | 16 ++++++++ js/src/ui/Actionbar/actionbar.css | 16 ++++++++ js/src/ui/Actionbar/actionbar.js | 16 ++++++++ js/src/ui/Actionbar/index.js | 16 ++++++++ js/src/ui/ApiProvider/apiProvider.js | 16 ++++++++ js/src/ui/ApiProvider/index.js | 16 ++++++++ js/src/ui/Badge/badge.css | 16 ++++++++ js/src/ui/Badge/badge.js | 16 ++++++++ js/src/ui/Badge/index.js | 16 ++++++++ js/src/ui/Balance/balance.css | 16 ++++++++ js/src/ui/Balance/balance.js | 16 ++++++++ js/src/ui/Balance/index.js | 16 ++++++++ js/src/ui/Container/Title/index.js | 16 ++++++++ js/src/ui/Container/Title/title.css | 16 ++++++++ js/src/ui/Container/Title/title.js | 16 ++++++++ js/src/ui/Container/container.css | 16 ++++++++ js/src/ui/Container/container.js | 16 ++++++++ js/src/ui/Container/index.js | 16 ++++++++ js/src/ui/Errors/actions.js | 16 ++++++++ js/src/ui/Errors/errors.js | 16 ++++++++ js/src/ui/Errors/index.js | 16 ++++++++ js/src/ui/Errors/middleware.js | 16 ++++++++ js/src/ui/Errors/reducers.js | 16 ++++++++ js/src/ui/Form/FormWrap/formWrap.css | 16 ++++++++ js/src/ui/Form/FormWrap/formWrap.js | 16 ++++++++ js/src/ui/Form/FormWrap/index.js | 16 ++++++++ js/src/ui/Form/Input/index.js | 16 ++++++++ js/src/ui/Form/Input/input.js | 16 ++++++++ js/src/ui/Form/InputAddress/index.js | 16 ++++++++ js/src/ui/Form/InputAddress/inputAddress.css | 16 ++++++++ js/src/ui/Form/InputAddress/inputAddress.js | 16 ++++++++ js/src/ui/Form/InputAddressSelect/index.js | 16 ++++++++ .../InputAddressSelect/inputAddressSelect.css | 16 ++++++++ .../InputAddressSelect/inputAddressSelect.js | 16 ++++++++ js/src/ui/Form/InputInline/index.js | 16 ++++++++ js/src/ui/Form/InputInline/inputInline.css | 16 ++++++++ js/src/ui/Form/InputInline/inputInline.js | 16 ++++++++ js/src/ui/Form/Select/index.js | 16 ++++++++ js/src/ui/Form/Select/select.js | 16 ++++++++ js/src/ui/Form/form.css | 16 ++++++++ js/src/ui/Form/form.js | 16 ++++++++ js/src/ui/Form/index.js | 16 ++++++++ js/src/ui/IdentityIcon/identityIcon.css | 16 ++++++++ js/src/ui/IdentityIcon/identityIcon.js | 16 ++++++++ js/src/ui/IdentityIcon/index.js | 16 ++++++++ js/src/ui/Modal/ModalSteps/index.js | 16 ++++++++ js/src/ui/Modal/ModalSteps/modalSteps.css | 16 ++++++++ js/src/ui/Modal/ModalSteps/modalSteps.js | 16 ++++++++ js/src/ui/Modal/index.js | 16 ++++++++ js/src/ui/Modal/modal.js | 16 ++++++++ js/src/ui/Page/index.js | 16 ++++++++ js/src/ui/Page/page.css | 16 ++++++++ js/src/ui/Page/page.js | 16 ++++++++ js/src/ui/SignerIcon/index.js | 16 ++++++++ js/src/ui/SignerIcon/signerIcon.js | 16 ++++++++ js/src/ui/Theme/index.js | 16 ++++++++ js/src/ui/Theme/theme.js | 16 ++++++++ js/src/ui/Tooltips/Tooltip/index.js | 16 ++++++++ js/src/ui/Tooltips/Tooltip/tooltip.js | 16 ++++++++ js/src/ui/Tooltips/actions.js | 16 ++++++++ js/src/ui/Tooltips/index.js | 16 ++++++++ js/src/ui/Tooltips/reducers.js | 16 ++++++++ js/src/ui/Tooltips/tooltips.css | 16 ++++++++ js/src/ui/Tooltips/tooltips.js | 16 ++++++++ js/src/ui/index.js | 16 ++++++++ js/src/util/abi/index.js | 16 ++++++++ js/src/util/validation.js | 16 ++++++++ js/src/views/Account/Header/header.css | 16 ++++++++ js/src/views/Account/Header/header.js | 16 ++++++++ js/src/views/Account/Header/index.js | 16 ++++++++ js/src/views/Account/Transactions/index.js | 16 ++++++++ .../Account/Transactions/transactions.css | 16 ++++++++ .../Account/Transactions/transactions.js | 16 ++++++++ js/src/views/Account/account.css | 16 ++++++++ js/src/views/Account/account.js | 16 ++++++++ js/src/views/Account/index.js | 16 ++++++++ js/src/views/Accounts/List/index.js | 16 ++++++++ js/src/views/Accounts/List/list.css | 16 ++++++++ js/src/views/Accounts/List/list.js | 16 ++++++++ js/src/views/Accounts/Summary/index.js | 16 ++++++++ js/src/views/Accounts/Summary/summary.js | 16 ++++++++ js/src/views/Accounts/accounts.css | 16 ++++++++ js/src/views/Accounts/accounts.js | 16 ++++++++ js/src/views/Accounts/index.js | 16 ++++++++ js/src/views/Address/address.css | 16 ++++++++ js/src/views/Address/address.js | 16 ++++++++ js/src/views/Address/index.js | 16 ++++++++ js/src/views/Addresses/addresses.css | 16 ++++++++ js/src/views/Addresses/addresses.js | 16 ++++++++ js/src/views/Addresses/index.js | 16 ++++++++ .../views/Application/Container/container.js | 16 ++++++++ js/src/views/Application/Container/index.js | 16 ++++++++ .../DappContainer/dappContainer.js | 16 ++++++++ .../views/Application/DappContainer/index.js | 16 ++++++++ .../Application/FrameError/frameError.css | 16 ++++++++ .../Application/FrameError/frameError.js | 16 ++++++++ js/src/views/Application/FrameError/index.js | 16 ++++++++ js/src/views/Application/Status/index.js | 16 ++++++++ js/src/views/Application/Status/status.css | 16 ++++++++ js/src/views/Application/Status/status.js | 16 ++++++++ js/src/views/Application/TabBar/index.js | 16 ++++++++ js/src/views/Application/TabBar/tabBar.css | 16 ++++++++ js/src/views/Application/TabBar/tabBar.js | 16 ++++++++ js/src/views/Application/application.css | 16 ++++++++ js/src/views/Application/application.js | 16 ++++++++ js/src/views/Application/index.js | 16 ++++++++ js/src/views/Contract/contract.css | 16 ++++++++ js/src/views/Contract/contract.js | 16 ++++++++ js/src/views/Contract/index.js | 16 ++++++++ js/src/views/Contracts/Summary/index.js | 16 ++++++++ js/src/views/Contracts/Summary/summary.js | 16 ++++++++ js/src/views/Contracts/contracts.css | 16 ++++++++ js/src/views/Contracts/contracts.js | 16 ++++++++ js/src/views/Contracts/index.js | 16 ++++++++ js/src/views/Dapp/dapp.css | 16 ++++++++ js/src/views/Dapp/dapp.js | 16 ++++++++ js/src/views/Dapp/index.js | 16 ++++++++ js/src/views/Dapps/Summary/index.js | 16 ++++++++ js/src/views/Dapps/Summary/summary.js | 16 ++++++++ js/src/views/Dapps/dapps.css | 16 ++++++++ js/src/views/Dapps/dapps.js | 16 ++++++++ js/src/views/Dapps/index.js | 16 ++++++++ js/src/views/ParityBar/index.js | 16 ++++++++ js/src/views/ParityBar/parityBar.css | 16 ++++++++ js/src/views/ParityBar/parityBar.js | 16 ++++++++ js/src/views/Signer/actions/requests.js | 16 ++++++++ js/src/views/Signer/actions/signer.js | 16 ++++++++ .../Signer/components/Account/Account.css | 16 ++++++++ .../Signer/components/Account/Account.js | 16 ++++++++ .../Account/AccountLink/AccountLink.css | 18 ++++++++- .../Account/AccountLink/AccountLink.js | 16 ++++++++ .../components/Account/AccountLink/index.js | 16 ++++++++ .../views/Signer/components/Account/index.js | 16 ++++++++ .../RequestFinishedWeb3.js | 16 ++++++++ .../components/RequestFinishedWeb3/index.js | 16 ++++++++ .../RequestPendingWeb3/RequestPendingWeb3.js | 16 ++++++++ .../components/RequestPendingWeb3/index.js | 16 ++++++++ .../components/SignRequest/SignRequest.css | 16 ++++++++ .../components/SignRequest/SignRequest.js | 16 ++++++++ .../Signer/components/SignRequest/index.js | 16 ++++++++ .../SignRequestWeb3/SignRequestWeb3.js | 16 ++++++++ .../components/SignRequestWeb3/index.js | 16 ++++++++ .../TransactionFinished.css | 16 ++++++++ .../TransactionFinished.js | 16 ++++++++ .../components/TransactionFinished/index.js | 16 ++++++++ .../TransactionFinishedWeb3.js | 16 ++++++++ .../TransactionFinishedWeb3/index.js | 16 ++++++++ .../TransactionMainDetails.css | 16 ++++++++ .../TransactionMainDetails.js | 16 ++++++++ .../TransactionMainDetails/index.js | 16 ++++++++ .../TransactionPending/TransactionPending.css | 16 ++++++++ .../TransactionPending/TransactionPending.js | 16 ++++++++ .../components/TransactionPending/index.js | 16 ++++++++ .../TransactionPendingForm.css | 16 ++++++++ .../TransactionPendingForm.js | 16 ++++++++ .../TransactionPendingFormConfirm.css | 16 ++++++++ .../TransactionPendingFormConfirm.js | 16 ++++++++ .../TransactionPendingFormConfirm/index.js | 16 ++++++++ .../TransactionPendingFormReject.css | 17 +++++++- .../TransactionPendingFormReject.js | 16 ++++++++ .../TransactionPendingFormReject/index.js | 16 ++++++++ .../TransactionPendingForm/index.js | 16 ++++++++ .../TransactionPendingWeb3.js | 16 ++++++++ .../TransactionPendingWeb3/index.js | 16 ++++++++ .../components/TxHashLink/TxHashLink.js | 16 ++++++++ .../Signer/components/TxHashLink/index.js | 16 ++++++++ .../Web3Compositor/Web3Compositor.js | 16 ++++++++ .../Signer/components/Web3Compositor/index.js | 16 ++++++++ .../components/Web3Provider/Web3Provider.js | 16 ++++++++ .../Signer/components/Web3Provider/index.js | 16 ++++++++ .../Signer/components/constants/constants.js | 16 ++++++++ js/src/views/Signer/components/index.js | 16 ++++++++ .../Web3WebSocketProvider.js | 16 ++++++++ .../util/Web3WebSocketProvider/index.js | 16 ++++++++ .../views/Signer/components/util/account.js | 16 ++++++++ js/src/views/Signer/components/util/logger.js | 16 ++++++++ js/src/views/Signer/components/util/react.js | 15 +++++++ .../Signer/components/util/transaction.js | 16 ++++++++ .../components/util/transaction.spec.js | 16 ++++++++ js/src/views/Signer/components/util/util.js | 15 +++++++ .../Signer/components/util/web3.extensions.js | 16 ++++++++ .../Signer/containers/Embedded/embedded.css | 16 ++++++++ .../Signer/containers/Embedded/embedded.js | 16 ++++++++ .../views/Signer/containers/Embedded/index.js | 16 ++++++++ .../containers/LoadingPage/LoadingPage.css | 16 ++++++++ .../containers/LoadingPage/LoadingPage.js | 16 ++++++++ .../Signer/containers/LoadingPage/index.js | 16 ++++++++ .../containers/OfflinePage/OfflinePage.js | 16 ++++++++ .../Signer/containers/OfflinePage/index.js | 16 ++++++++ .../containers/RequestsPage/RequestsPage.css | 16 ++++++++ .../containers/RequestsPage/RequestsPage.js | 16 ++++++++ .../Signer/containers/RequestsPage/index.js | 16 ++++++++ .../UnAuthorizedPage/UnAuthorizedPage.css | 16 ++++++++ .../UnAuthorizedPage/UnAuthorizedPage.js | 16 ++++++++ .../containers/UnAuthorizedPage/index.js | 16 ++++++++ js/src/views/Signer/index.js | 16 ++++++++ js/src/views/Signer/middleware/index.js | 16 ++++++++ js/src/views/Signer/middleware/logger.js | 16 ++++++++ js/src/views/Signer/middleware/signer.js | 16 ++++++++ js/src/views/Signer/middleware/ws.js | 16 ++++++++ js/src/views/Signer/providers/index.js | 16 ++++++++ .../Signer/providers/signerDataProvider.js | 16 ++++++++ .../views/Signer/providers/wsDataProvider.js | 16 ++++++++ js/src/views/Signer/reducers/index.js | 16 ++++++++ js/src/views/Signer/reducers/requests.js | 15 +++++++ js/src/views/Signer/reducers/signer.js | 15 +++++++ js/src/views/Signer/signer.css | 16 ++++++++ js/src/views/Signer/signer.js | 16 ++++++++ .../views/Signer/utils/WebSocketsProvider.js | 16 ++++++++ js/src/views/Signer/utils/Ws.js | 16 ++++++++ js/src/views/Signer/utils/extension.js | 16 ++++++++ js/src/views/Signer/utils/index.js | 16 ++++++++ js/src/views/Signer/utils/logger.js | 16 ++++++++ js/src/views/Signer/utils/parity.js | 16 ++++++++ js/src/views/Signer/utils/utils.js | 15 +++++++ js/src/views/Status/--remove-store/index.js | 17 ++++++++ js/src/views/Status/--remove-store/store.js | 40 +++++++++++++++++++ js/src/views/Status/actions/app.js | 15 +++++++ js/src/views/Status/actions/clipboard.js | 16 ++++++++ js/src/views/Status/actions/debug.js | 15 +++++++ js/src/views/Status/actions/localstorage.js | 15 +++++++ js/src/views/Status/actions/logger.js | 16 ++++++++ js/src/views/Status/actions/mining.js | 15 +++++++ js/src/views/Status/actions/modify-mining.js | 15 +++++++ js/src/views/Status/actions/rpc.js | 16 ++++++++ js/src/views/Status/actions/status.js | 15 +++++++ .../Animated/AnimateChildren.css | 16 ++++++++ .../Animated/Animated.js | 15 +++++++ .../Animated/children.js | 15 +++++++ .../components-compositors/Animated/index.js | 16 ++++++++ .../components/--remove-Footer/Footer.css | 18 ++++++++- .../components/--remove-Footer/Footer.js | 15 +++++++ .../components/--remove-Footer/index.js | 16 ++++++++ .../components/--remove-Header/Header.css | 16 ++++++++ .../components/--remove-Header/Header.js | 15 +++++++ .../components/--remove-Header/index.js | 16 ++++++++ .../MuiThemeProvider.js | 15 +++++++ .../--remove-MuiThemeProvider/index.js | 17 ++++++++ .../components/--remove-Value/Value.css | 16 ++++++++ .../Status/components/--remove-Value/Value.js | 15 +++++++ .../Status/components/--remove-Value/index.js | 16 ++++++++ .../components/AutoComplete/AutoComplete.js | 16 ++++++++ .../AutoComplete/AutoComplete.spec.js | 16 ++++++++ .../Status/components/AutoComplete/index.js | 16 ++++++++ js/src/views/Status/components/Box/Box.js | 15 +++++++ .../views/Status/components/Box/Box.spec.js | 16 ++++++++ js/src/views/Status/components/Box/index.js | 16 ++++++++ js/src/views/Status/components/Call/Call.css | 16 ++++++++ js/src/views/Status/components/Call/Call.js | 16 ++++++++ .../views/Status/components/Call/Call.spec.js | 16 ++++++++ js/src/views/Status/components/Call/index.js | 16 ++++++++ .../views/Status/components/Calls/Calls.css | 16 ++++++++ js/src/views/Status/components/Calls/Calls.js | 16 ++++++++ .../Status/components/Calls/Calls.spec.js | 16 ++++++++ js/src/views/Status/components/Calls/index.js | 16 ++++++++ .../components/CallsToolbar/CallsToolbar.css | 19 ++++++++- .../components/CallsToolbar/CallsToolbar.js | 16 ++++++++ .../CallsToolbar/CallsToolbar.spec.js | 16 ++++++++ .../Status/components/CallsToolbar/index.js | 16 ++++++++ .../views/Status/components/Debug/Debug.css | 16 ++++++++ js/src/views/Status/components/Debug/Debug.js | 16 ++++++++ js/src/views/Status/components/Debug/index.js | 16 ++++++++ .../EditableValue/EditableValue.css | 18 ++++++++- .../components/EditableValue/EditableValue.js | 15 +++++++ .../Status/components/EditableValue/index.js | 16 ++++++++ .../components/JsonEditor/JsonEditor.css | 16 ++++++++ .../components/JsonEditor/JsonEditor.js | 15 +++++++ .../Status/components/JsonEditor/index.js | 16 ++++++++ .../Status/components/Markdown/Markdown.css | 18 ++++++++- .../Status/components/Markdown/Markdown.js | 15 +++++++ .../views/Status/components/Markdown/index.js | 16 ++++++++ .../MiningSettings/MiningSettings.js | 16 ++++++++ .../MiningSettings/decodeExtraData.js | 16 ++++++++ .../MiningSettings/decodeExtraData.spec.js | 16 ++++++++ .../Status/components/MiningSettings/index.js | 16 ++++++++ .../MiningSettings/numberFromString.js | 16 ++++++++ .../MiningSettings/numberFromString.spec.js | 16 ++++++++ .../components/MuiThemeProvider/index.js | 1 - .../Status/components/Response/Response.css | 16 ++++++++ .../Status/components/Response/Response.js | 15 +++++++ .../components/Response/Response.spec.js | 16 ++++++++ .../views/Status/components/Response/index.js | 16 ++++++++ .../Status/components/RpcCalls/RpcCalls.css | 17 +++++++- .../Status/components/RpcCalls/RpcCalls.js | 15 +++++++ .../views/Status/components/RpcCalls/index.js | 16 ++++++++ .../Status/components/RpcDocs/RpcDocs.css | 16 ++++++++ .../Status/components/RpcDocs/RpcDocs.js | 15 +++++++ .../views/Status/components/RpcDocs/index.js | 16 ++++++++ .../views/Status/components/RpcNav/RpcNav.css | 18 ++++++++- .../views/Status/components/RpcNav/RpcNav.js | 15 +++++++ .../views/Status/components/RpcNav/index.js | 16 ++++++++ .../ScrollTopButton/ScrollTopButton.css | 17 +++++++- .../ScrollTopButton/ScrollTopButton.js | 15 +++++++ .../components/ScrollTopButton/index.js | 16 ++++++++ .../Status/components/ScrollTopButton/util.js | 15 +++++++ .../views/Status/components/Status/Status.css | 16 ++++++++ .../views/Status/components/Status/Status.js | 16 ++++++++ .../views/Status/components/Status/index.js | 16 ++++++++ js/src/views/Status/constants/index.js | 15 +++++++ .../--remove-AccountsPage/AccountsPage.js | 15 +++++++ .../containers/--remove-AccountsPage/index.js | 16 ++++++++ .../DebugPage.js | 16 ++++++++ .../containers/--remove-DebugPage/index.js | 17 ++++++++ .../Status/containers/DebugPage/index.js | 1 - .../Status/containers/RpcPage/RpcPage.js | 16 ++++++++ .../views/Status/containers/RpcPage/index.js | 16 ++++++++ .../containers/StatusPage/StatusPage.js | 16 ++++++++ .../Status/containers/StatusPage/index.js | 16 ++++++++ .../containers/StatusPage/statusPage.css | 16 ++++++++ js/src/views/Status/index.js | 16 ++++++++ js/src/views/Status/middleware/index.js | 16 ++++++++ .../views/Status/middleware/localstorage.js | 15 +++++++ .../Status/middleware/localstorage.spec.js | 16 ++++++++ js/src/views/Status/middleware/logger.js | 16 ++++++++ js/src/views/Status/middleware/logger.spec.js | 16 ++++++++ js/src/views/Status/middleware/rpc.js | 16 ++++++++ js/src/views/Status/middleware/rpc.spec.js | 16 ++++++++ .../middleware/user-web3-interactions.js | 15 +++++++ .../middleware/user-web3-interactions.spec.js | 16 ++++++++ js/src/views/Status/provider/rpc-provider.js | 15 +++++++ .../Status/provider/rpc-provider.spec.js | 16 ++++++++ js/src/views/Status/provider/web3-base.js | 15 +++++++ .../Status/provider/web3-ethcore-provider.js | 16 ++++++++ js/src/views/Status/provider/web3-provider.js | 15 +++++++ .../Status/provider/web3-provider.spec.js | 16 ++++++++ js/src/views/Status/reducers/debug.js | 15 +++++++ js/src/views/Status/reducers/index.js | 16 ++++++++ js/src/views/Status/reducers/logger.js | 16 ++++++++ js/src/views/Status/reducers/mining.js | 15 +++++++ js/src/views/Status/reducers/rpc.js | 15 +++++++ js/src/views/Status/reducers/settings.js | 15 +++++++ js/src/views/Status/reducers/status.js | 15 +++++++ js/src/views/Status/status.css | 16 ++++++++ js/src/views/Status/status.js | 16 ++++++++ js/src/views/Status/store/index.js | 1 - js/src/views/Status/store/store.js | 24 ----------- js/src/views/Status/util/error.js | 15 +++++++ js/src/views/Status/util/error.spec.js | 16 ++++++++ js/src/views/Status/util/index.js | 16 ++++++++ js/src/views/Status/util/index.spec.js | 16 ++++++++ js/src/views/Status/util/react.js | 15 +++++++ js/src/views/Status/util/rpc-md.js | 15 +++++++ js/src/views/index.js | 16 ++++++++ js/src/web3.js | 16 ++++++++ js/test/babel.js | 16 ++++++++ js/test/e2e/ethapi.js | 16 ++++++++ js/test/mocha.config.js | 16 ++++++++ js/test/mockRpc.js | 16 ++++++++ js/test/types.js | 16 ++++++++ js/webpack.config.js | 16 ++++++++ 603 files changed, 9576 insertions(+), 44 deletions(-) create mode 100644 js/src/views/Status/--remove-store/index.js create mode 100644 js/src/views/Status/--remove-store/store.js rename js/src/views/Status/components/{MuiThemeProvider => --remove-MuiThemeProvider}/MuiThemeProvider.js (57%) create mode 100644 js/src/views/Status/components/--remove-MuiThemeProvider/index.js delete mode 100644 js/src/views/Status/components/MuiThemeProvider/index.js rename js/src/views/Status/containers/{DebugPage => --remove-DebugPage}/DebugPage.js (53%) create mode 100644 js/src/views/Status/containers/--remove-DebugPage/index.js delete mode 100644 js/src/views/Status/containers/DebugPage/index.js delete mode 100644 js/src/views/Status/store/index.js delete mode 100644 js/src/views/Status/store/store.js diff --git a/js/rollup.library.js b/js/rollup.library.js index f21c5d4abbc..2412c42c0b1 100644 --- a/js/rollup.library.js +++ b/js/rollup.library.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import babel from 'rollup-plugin-babel'; export default { diff --git a/js/src/3rdparty/etherscan/account.js b/js/src/3rdparty/etherscan/account.js index 5d3bef451cf..fb764801dd2 100644 --- a/js/src/3rdparty/etherscan/account.js +++ b/js/src/3rdparty/etherscan/account.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + const PAGE_SIZE = 25; import format from '../../api/format'; diff --git a/js/src/3rdparty/etherscan/account.spec.js b/js/src/3rdparty/etherscan/account.spec.js index 590c34d87ab..10494690eef 100644 --- a/js/src/3rdparty/etherscan/account.spec.js +++ b/js/src/3rdparty/etherscan/account.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import etherscan from './'; const TESTADDR = '0xbf885e2b55c6bcc84556a3c5f07d3040833c8d00'; diff --git a/js/src/3rdparty/etherscan/call.js b/js/src/3rdparty/etherscan/call.js index ec21079c1e3..1324bcc9d4c 100644 --- a/js/src/3rdparty/etherscan/call.js +++ b/js/src/3rdparty/etherscan/call.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + const options = { method: 'GET', headers: { diff --git a/js/src/3rdparty/etherscan/index.js b/js/src/3rdparty/etherscan/index.js index 5daafa85119..55aeba47332 100644 --- a/js/src/3rdparty/etherscan/index.js +++ b/js/src/3rdparty/etherscan/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { account } from './account'; import { stats } from './stats'; diff --git a/js/src/3rdparty/etherscan/stats.js b/js/src/3rdparty/etherscan/stats.js index 8f0990acf89..ecefefe7d86 100644 --- a/js/src/3rdparty/etherscan/stats.js +++ b/js/src/3rdparty/etherscan/stats.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { call } from './call'; function _call (action, test) { diff --git a/js/src/3rdparty/etherscan/stats.spec.js b/js/src/3rdparty/etherscan/stats.spec.js index ea64774f148..788c1a18e23 100644 --- a/js/src/3rdparty/etherscan/stats.spec.js +++ b/js/src/3rdparty/etherscan/stats.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import etherscan from './'; describe('etherscan/stats', () => { diff --git a/js/src/abi/abi.js b/js/src/abi/abi.js index 2c2b2813034..cdf3b1f6395 100644 --- a/js/src/abi/abi.js +++ b/js/src/abi/abi.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import Interface from './spec/interface'; export default class Abi extends Interface { diff --git a/js/src/abi/decoder/bytesTaken.js b/js/src/abi/decoder/bytesTaken.js index 8224a08c4b4..49b443d2137 100644 --- a/js/src/abi/decoder/bytesTaken.js +++ b/js/src/abi/decoder/bytesTaken.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default class BytesTaken { constructor (bytes, newOffset) { this._bytes = bytes; diff --git a/js/src/abi/decoder/bytesTaken.spec.js b/js/src/abi/decoder/bytesTaken.spec.js index 32392e06f1f..65bb9e1b6f1 100644 --- a/js/src/abi/decoder/bytesTaken.spec.js +++ b/js/src/abi/decoder/bytesTaken.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BytesTaken from './bytesTaken'; describe('abi/decoder/BytesTaken', () => { diff --git a/js/src/abi/decoder/decodeResult.js b/js/src/abi/decoder/decodeResult.js index 4b493ddf624..8595642dfb9 100644 --- a/js/src/abi/decoder/decodeResult.js +++ b/js/src/abi/decoder/decodeResult.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default class DecodeResult { constructor (token, newOffset) { this._token = token; diff --git a/js/src/abi/decoder/decodeResult.spec.js b/js/src/abi/decoder/decodeResult.spec.js index ff5ec765861..892836d07aa 100644 --- a/js/src/abi/decoder/decodeResult.spec.js +++ b/js/src/abi/decoder/decodeResult.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import DecodeResult from './decodeResult'; describe('abi/decoder/DecodeResult', () => { diff --git a/js/src/abi/decoder/decoder.js b/js/src/abi/decoder/decoder.js index a7b3e8702c1..01d9d7b3201 100644 --- a/js/src/abi/decoder/decoder.js +++ b/js/src/abi/decoder/decoder.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import utf8 from 'utf8'; import Token from '../token/token'; diff --git a/js/src/abi/decoder/decoder.spec.js b/js/src/abi/decoder/decoder.spec.js index 29387d538d8..f825a3d7e2a 100644 --- a/js/src/abi/decoder/decoder.spec.js +++ b/js/src/abi/decoder/decoder.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; import Decoder from './decoder'; diff --git a/js/src/abi/decoder/index.js b/js/src/abi/decoder/index.js index dd1a4d5f44f..f9839c10d8a 100644 --- a/js/src/abi/decoder/index.js +++ b/js/src/abi/decoder/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './decoder'; diff --git a/js/src/abi/encoder/encoder.js b/js/src/abi/encoder/encoder.js index e7c378f96ee..bb3a17d264e 100644 --- a/js/src/abi/encoder/encoder.js +++ b/js/src/abi/encoder/encoder.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { padAddress, padBool, padBytes, padFixedBytes, padU32, padString } from '../util/pad'; import Mediate from './mediate'; import Token from '../token/token'; diff --git a/js/src/abi/encoder/encoder.spec.js b/js/src/abi/encoder/encoder.spec.js index 5c270bbf780..32d75e7ec91 100644 --- a/js/src/abi/encoder/encoder.spec.js +++ b/js/src/abi/encoder/encoder.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import Encoder from './encoder'; import Token from '../token'; import { padAddress, padFixedBytes, padU32 } from '../util/pad'; diff --git a/js/src/abi/encoder/index.js b/js/src/abi/encoder/index.js index 698b2b348af..e19ff81e674 100644 --- a/js/src/abi/encoder/index.js +++ b/js/src/abi/encoder/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './encoder'; diff --git a/js/src/abi/encoder/mediate.js b/js/src/abi/encoder/mediate.js index 20586103da0..cb7fce6a753 100644 --- a/js/src/abi/encoder/mediate.js +++ b/js/src/abi/encoder/mediate.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + const TYPES = ['raw', 'prefixed', 'fixedArray', 'array']; import { padU32 } from '../util/pad'; diff --git a/js/src/abi/encoder/mediate.spec.js b/js/src/abi/encoder/mediate.spec.js index 277ed0c7419..cfd0211f2f9 100644 --- a/js/src/abi/encoder/mediate.spec.js +++ b/js/src/abi/encoder/mediate.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import Mediate from './mediate'; describe('abi/encoder/Mediate', () => { diff --git a/js/src/abi/index.js b/js/src/abi/index.js index 0871bc469f8..f055a69133e 100644 --- a/js/src/abi/index.js +++ b/js/src/abi/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './abi'; diff --git a/js/src/abi/spec/constructor.js b/js/src/abi/spec/constructor.js index d46e56e140e..89ea99610ef 100644 --- a/js/src/abi/spec/constructor.js +++ b/js/src/abi/spec/constructor.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import Encoder from '../encoder/encoder'; import Param from './param'; diff --git a/js/src/abi/spec/constructor.spec.js b/js/src/abi/spec/constructor.spec.js index c64cd5e4fcc..e02f6cf71f1 100644 --- a/js/src/abi/spec/constructor.spec.js +++ b/js/src/abi/spec/constructor.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import Constructor from './constructor'; import Param from './param'; import Token from '../token'; diff --git a/js/src/abi/spec/event/decodedLog.js b/js/src/abi/spec/event/decodedLog.js index 01a72b414b9..3993b527b57 100644 --- a/js/src/abi/spec/event/decodedLog.js +++ b/js/src/abi/spec/event/decodedLog.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default class DecodedLog { constructor (params, address) { this._params = params; diff --git a/js/src/abi/spec/event/decodedLog.spec.js b/js/src/abi/spec/event/decodedLog.spec.js index c8a395c9fe5..e6ed1a02294 100644 --- a/js/src/abi/spec/event/decodedLog.spec.js +++ b/js/src/abi/spec/event/decodedLog.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import DecodedLog from './decodedLog'; const log = new DecodedLog('someParams', 'someAddress'); diff --git a/js/src/abi/spec/event/decodedLogParam.js b/js/src/abi/spec/event/decodedLogParam.js index 3fe390764bd..ed456fcce8b 100644 --- a/js/src/abi/spec/event/decodedLogParam.js +++ b/js/src/abi/spec/event/decodedLogParam.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import ParamType from '../paramType/paramType'; import Token from '../../token/token'; import { isInstanceOf } from '../../util/types'; diff --git a/js/src/abi/spec/event/decodedLogParam.spec.js b/js/src/abi/spec/event/decodedLogParam.spec.js index 56ea5e54aac..a031282ad87 100644 --- a/js/src/abi/spec/event/decodedLogParam.spec.js +++ b/js/src/abi/spec/event/decodedLogParam.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import DecodedLogParam from './decodedLogParam'; import ParamType from '../paramType'; import Token from '../../token'; diff --git a/js/src/abi/spec/event/event.js b/js/src/abi/spec/event/event.js index abc476a5494..cada4671ebf 100644 --- a/js/src/abi/spec/event/event.js +++ b/js/src/abi/spec/event/event.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import Decoder from '../../decoder/decoder'; import DecodedLog from './decodedLog'; import DecodedLogParam from './decodedLogParam'; diff --git a/js/src/abi/spec/event/event.spec.js b/js/src/abi/spec/event/event.spec.js index dd71c302fab..b1f6f20b539 100644 --- a/js/src/abi/spec/event/event.spec.js +++ b/js/src/abi/spec/event/event.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; import Event from './event'; diff --git a/js/src/abi/spec/event/eventParam.js b/js/src/abi/spec/event/eventParam.js index ff071ef926c..68a68729dec 100644 --- a/js/src/abi/spec/event/eventParam.js +++ b/js/src/abi/spec/event/eventParam.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { toParamType } from '../paramType/format'; export default class EventParam { diff --git a/js/src/abi/spec/event/eventParam.spec.js b/js/src/abi/spec/event/eventParam.spec.js index 5d1d962c6eb..b99f887415c 100644 --- a/js/src/abi/spec/event/eventParam.spec.js +++ b/js/src/abi/spec/event/eventParam.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import EventParam from './eventParam'; describe('abi/spec/event/EventParam', () => { diff --git a/js/src/abi/spec/event/index.js b/js/src/abi/spec/event/index.js index b36098be350..0925882d3e3 100644 --- a/js/src/abi/spec/event/index.js +++ b/js/src/abi/spec/event/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './event'; diff --git a/js/src/abi/spec/function.js b/js/src/abi/spec/function.js index 9b4d61598b2..c8b6bc66746 100644 --- a/js/src/abi/spec/function.js +++ b/js/src/abi/spec/function.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import Decoder from '../decoder/decoder'; import Encoder from '../encoder/encoder'; import Param from './param'; diff --git a/js/src/abi/spec/function.spec.js b/js/src/abi/spec/function.spec.js index 049589561a2..1650bd31464 100644 --- a/js/src/abi/spec/function.spec.js +++ b/js/src/abi/spec/function.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import Func from './function'; import Param from './param'; import Token from '../token'; diff --git a/js/src/abi/spec/index.js b/js/src/abi/spec/index.js index 3c69c622bf4..89354d49b5b 100644 --- a/js/src/abi/spec/index.js +++ b/js/src/abi/spec/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './interface'; diff --git a/js/src/abi/spec/interface.js b/js/src/abi/spec/interface.js index e498da57d81..dc6f36c787c 100644 --- a/js/src/abi/spec/interface.js +++ b/js/src/abi/spec/interface.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import Constructor from './constructor'; import Event from './event/event'; import Func from './function'; diff --git a/js/src/abi/spec/interface.spec.js b/js/src/abi/spec/interface.spec.js index 1520182ea12..ba5c38a28a0 100644 --- a/js/src/abi/spec/interface.spec.js +++ b/js/src/abi/spec/interface.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import Interface from './interface'; import ParamType from './paramType'; import Token from '../token'; diff --git a/js/src/abi/spec/param.js b/js/src/abi/spec/param.js index 5b4869b1001..95c3b9d18f5 100644 --- a/js/src/abi/spec/param.js +++ b/js/src/abi/spec/param.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { toParamType } from './paramType/format'; export default class Param { diff --git a/js/src/abi/spec/param.spec.js b/js/src/abi/spec/param.spec.js index a269d489d1a..bd172e4a6cb 100644 --- a/js/src/abi/spec/param.spec.js +++ b/js/src/abi/spec/param.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import Param from './param'; describe('abi/spec/Param', () => { diff --git a/js/src/abi/spec/paramType/format.js b/js/src/abi/spec/paramType/format.js index d3ba0851fe4..478485c4329 100644 --- a/js/src/abi/spec/paramType/format.js +++ b/js/src/abi/spec/paramType/format.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import ParamType from './paramType'; export function toParamType (type) { diff --git a/js/src/abi/spec/paramType/format.spec.js b/js/src/abi/spec/paramType/format.spec.js index ac2578701ab..90e5229d5bb 100644 --- a/js/src/abi/spec/paramType/format.spec.js +++ b/js/src/abi/spec/paramType/format.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import ParamType from './paramType'; import { fromParamType, toParamType } from './format'; diff --git a/js/src/abi/spec/paramType/index.js b/js/src/abi/spec/paramType/index.js index 640b6930981..23bb83f067c 100644 --- a/js/src/abi/spec/paramType/index.js +++ b/js/src/abi/spec/paramType/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './paramType'; diff --git a/js/src/abi/spec/paramType/paramType.js b/js/src/abi/spec/paramType/paramType.js index 5f68ed5fbe4..7d25700d494 100644 --- a/js/src/abi/spec/paramType/paramType.js +++ b/js/src/abi/spec/paramType/paramType.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import TYPES from './types'; export default class ParamType { diff --git a/js/src/abi/spec/paramType/paramType.spec.js b/js/src/abi/spec/paramType/paramType.spec.js index 3e2edf3eabf..0ed395eaf10 100644 --- a/js/src/abi/spec/paramType/paramType.spec.js +++ b/js/src/abi/spec/paramType/paramType.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import ParamType from './paramType'; describe('abi/spec/paramType/ParamType', () => { diff --git a/js/src/abi/spec/paramType/types.js b/js/src/abi/spec/paramType/types.js index 8b8c56f345a..d789a6ed803 100644 --- a/js/src/abi/spec/paramType/types.js +++ b/js/src/abi/spec/paramType/types.js @@ -1,2 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + const TYPES = ['address', 'bytes', 'int', 'uint', 'bool', 'string', 'array', 'fixedBytes', 'fixedArray']; + export default TYPES; diff --git a/js/src/abi/token/index.js b/js/src/abi/token/index.js index a02ad51a3c3..4b822b4bdf7 100644 --- a/js/src/abi/token/index.js +++ b/js/src/abi/token/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './token'; diff --git a/js/src/abi/token/token.js b/js/src/abi/token/token.js index 46279252553..84c675ee63e 100644 --- a/js/src/abi/token/token.js +++ b/js/src/abi/token/token.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import TYPES from '../spec/paramType/types'; export default class Token { diff --git a/js/src/abi/token/token.spec.js b/js/src/abi/token/token.spec.js index e5cb797a565..2abaad6ac90 100644 --- a/js/src/abi/token/token.spec.js +++ b/js/src/abi/token/token.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import Token from './token'; describe('abi/token/token', () => { diff --git a/js/src/abi/util/address.js b/js/src/abi/util/address.js index 6cc523872c6..f0e188f2c37 100644 --- a/js/src/abi/util/address.js +++ b/js/src/abi/util/address.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { keccak_256 } from 'js-sha3'; // eslint-disable-line camelcase export function isChecksumValid (_address) { diff --git a/js/src/abi/util/address.spec.js b/js/src/abi/util/address.spec.js index 105aee87b7f..9b0ec38cbbb 100644 --- a/js/src/abi/util/address.spec.js +++ b/js/src/abi/util/address.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { isChecksumValid, isAddress, toChecksumAddress } from './address'; describe('abi/util/address', () => { diff --git a/js/src/abi/util/pad.js b/js/src/abi/util/pad.js index ca5ab154170..b14991ac2fb 100644 --- a/js/src/abi/util/pad.js +++ b/js/src/abi/util/pad.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; import utf8 from 'utf8'; diff --git a/js/src/abi/util/pad.spec.js b/js/src/abi/util/pad.spec.js index 296984fd707..2ce9e65bf76 100644 --- a/js/src/abi/util/pad.spec.js +++ b/js/src/abi/util/pad.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; import { padAddress, padBool, padBytes, padFixedBytes, padString, padU32 } from './pad'; diff --git a/js/src/abi/util/signature.js b/js/src/abi/util/signature.js index 07384987264..34e467c123c 100644 --- a/js/src/abi/util/signature.js +++ b/js/src/abi/util/signature.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { keccak_256 } from 'js-sha3'; // eslint-disable-line camelcase import { fromParamType } from '../spec/paramType/format'; diff --git a/js/src/abi/util/signature.spec.js b/js/src/abi/util/signature.spec.js index dd520b96ea3..d5ab2264d71 100644 --- a/js/src/abi/util/signature.spec.js +++ b/js/src/abi/util/signature.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { eventSignature, methodSignature } from './signature'; describe('abi/util/signature', () => { diff --git a/js/src/abi/util/slice.js b/js/src/abi/util/slice.js index cb3021a2113..417efea54d1 100644 --- a/js/src/abi/util/slice.js +++ b/js/src/abi/util/slice.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { padAddress } from './pad'; export function sliceData (_data) { diff --git a/js/src/abi/util/slice.spec.js b/js/src/abi/util/slice.spec.js index 6fe9adb9a16..92608c5906c 100644 --- a/js/src/abi/util/slice.spec.js +++ b/js/src/abi/util/slice.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { sliceData } from './slice'; describe('abi/util/slice', () => { diff --git a/js/src/abi/util/sliceAs.js b/js/src/abi/util/sliceAs.js index 1d4e0653c0e..47c3e9758de 100644 --- a/js/src/abi/util/sliceAs.js +++ b/js/src/abi/util/sliceAs.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; import { toChecksumAddress } from './address'; diff --git a/js/src/abi/util/sliceAs.spec.js b/js/src/abi/util/sliceAs.spec.js index 54017e4784a..af68860089f 100644 --- a/js/src/abi/util/sliceAs.spec.js +++ b/js/src/abi/util/sliceAs.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { asAddress, asBool, asI32, asU32 } from './sliceAs'; describe('abi/util/sliceAs', () => { diff --git a/js/src/abi/util/types.js b/js/src/abi/util/types.js index cf3a89fec9f..649f26db6cd 100644 --- a/js/src/abi/util/types.js +++ b/js/src/abi/util/types.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export function isArray (test) { return Object.prototype.toString.call(test) === '[object Array]'; } diff --git a/js/src/abi/util/types.spec.js b/js/src/abi/util/types.spec.js index bc2ceb118c9..2e1a538a6a6 100644 --- a/js/src/abi/util/types.spec.js +++ b/js/src/abi/util/types.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { isArray, isString, isInstanceOf } from './types'; import Token from '../token'; diff --git a/js/src/api/api.js b/js/src/api/api.js index 57dc23155a6..5c6dc61c7df 100644 --- a/js/src/api/api.js +++ b/js/src/api/api.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { Http, Ws } from './transport/index'; import Contract from './contract/index'; diff --git a/js/src/api/api.spec.js b/js/src/api/api.spec.js index 6b316afdbf2..bbd140d4d73 100644 --- a/js/src/api/api.spec.js +++ b/js/src/api/api.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { TEST_HTTP_URL, endpointTest } from '../../test/mockRpc'; import Api from './api'; diff --git a/js/src/api/contract/contract.js b/js/src/api/contract/contract.js index 0866b24ccf2..bba76659a35 100644 --- a/js/src/api/contract/contract.js +++ b/js/src/api/contract/contract.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import Abi from '../../abi'; import Api from '../api'; import { isInstanceOf } from '../util/types'; diff --git a/js/src/api/contract/contract.spec.js b/js/src/api/contract/contract.spec.js index 1ac426a7dbd..4a9178f2bcc 100644 --- a/js/src/api/contract/contract.spec.js +++ b/js/src/api/contract/contract.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; import { TEST_HTTP_URL, mockHttp } from '../../../test/mockRpc'; diff --git a/js/src/api/contract/index.js b/js/src/api/contract/index.js index 4834a374db7..18051a69f91 100644 --- a/js/src/api/contract/index.js +++ b/js/src/api/contract/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './contract'; diff --git a/js/src/api/format/index.js b/js/src/api/format/index.js index 2f7497e2f84..bc888867abe 100644 --- a/js/src/api/format/index.js +++ b/js/src/api/format/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { isAddress, toChecksumAddress } from '../../abi/util/address'; import { fromWei, toWei } from './wei'; import { sha3 } from './sha3'; diff --git a/js/src/api/format/input.js b/js/src/api/format/input.js index 2cd80e37f12..ffbff17292b 100644 --- a/js/src/api/format/input.js +++ b/js/src/api/format/input.js @@ -1,9 +1,23 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; import { isHex, isInstanceOf, isString } from '../util/types'; -// const ZERO_64 = '0000000000000000000000000000000000000000000000000000000000000000'; - export function inAddress (address) { // TODO: address validation if we have upper-lower addresses return inHex(address); diff --git a/js/src/api/format/input.spec.js b/js/src/api/format/input.spec.js index 5e630062bf1..b08d15367b4 100644 --- a/js/src/api/format/input.spec.js +++ b/js/src/api/format/input.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; import { inAddress, inBlockNumber, inData, inFilter, inHex, inNumber10, inNumber16, inOptions } from './input'; diff --git a/js/src/api/format/output.js b/js/src/api/format/output.js index 5ff5e92f9d0..cb310c8a048 100644 --- a/js/src/api/format/output.js +++ b/js/src/api/format/output.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; import { toChecksumAddress } from '../../abi/util/address'; diff --git a/js/src/api/format/output.spec.js b/js/src/api/format/output.spec.js index 39370b175ba..af1280f3bf7 100644 --- a/js/src/api/format/output.spec.js +++ b/js/src/api/format/output.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; import { outBlock, outAccountInfo, outAddress, outDate, outNumber, outPeers, outReceipt, outTransaction } from './output'; diff --git a/js/src/api/format/sha3.js b/js/src/api/format/sha3.js index 38056fe3c9b..fcbda091a23 100644 --- a/js/src/api/format/sha3.js +++ b/js/src/api/format/sha3.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { keccak_256 } from 'js-sha3'; // eslint-disable-line camelcase export function sha3 (value) { diff --git a/js/src/api/format/sha3.spec.js b/js/src/api/format/sha3.spec.js index d8f964b8ced..69e676a67cb 100644 --- a/js/src/api/format/sha3.spec.js +++ b/js/src/api/format/sha3.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { sha3 } from './sha3'; describe('api/format/sha3', () => { diff --git a/js/src/api/format/wei.js b/js/src/api/format/wei.js index d1f6745d57d..d04e73921f9 100644 --- a/js/src/api/format/wei.js +++ b/js/src/api/format/wei.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; const UNITS = ['wei', 'ada', 'babbage', 'shannon', 'szabo', 'finney', 'ether', 'kether', 'mether', 'gether', 'tether']; diff --git a/js/src/api/format/wei.spec.js b/js/src/api/format/wei.spec.js index d70b0fa2951..2df743c0b84 100644 --- a/js/src/api/format/wei.spec.js +++ b/js/src/api/format/wei.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { _getUnitMultiplier, fromWei, toWei } from './wei'; describe('api/format/wei', () => { diff --git a/js/src/api/index.js b/js/src/api/index.js index d549adfe91a..b03419eacc6 100644 --- a/js/src/api/index.js +++ b/js/src/api/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './api'; diff --git a/js/src/api/rpc/db/db.js b/js/src/api/rpc/db/db.js index f13c69b2f32..9b20316006e 100644 --- a/js/src/api/rpc/db/db.js +++ b/js/src/api/rpc/db/db.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { inHex } from '../../format/input'; export default class Db { diff --git a/js/src/api/rpc/db/db.spec.js b/js/src/api/rpc/db/db.spec.js index 56cb201d7e8..4379b51c416 100644 --- a/js/src/api/rpc/db/db.spec.js +++ b/js/src/api/rpc/db/db.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { TEST_HTTP_URL, mockHttp } from '../../../../test/mockRpc'; import Http from '../../transport/http'; diff --git a/js/src/api/rpc/db/index.js b/js/src/api/rpc/db/index.js index cfcb94c67ee..cd7c2b0b84a 100644 --- a/js/src/api/rpc/db/index.js +++ b/js/src/api/rpc/db/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './db'; diff --git a/js/src/api/rpc/eth/eth.e2e.js b/js/src/api/rpc/eth/eth.e2e.js index 7ae441a139f..d0a20f82ecb 100644 --- a/js/src/api/rpc/eth/eth.e2e.js +++ b/js/src/api/rpc/eth/eth.e2e.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { createHttpApi } from '../../../test/e2e/ethapi'; import { isAddress } from '../../../../test/types'; diff --git a/js/src/api/rpc/eth/eth.js b/js/src/api/rpc/eth/eth.js index 046cc0dd637..e4ed53d934f 100644 --- a/js/src/api/rpc/eth/eth.js +++ b/js/src/api/rpc/eth/eth.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { inAddress, inBlockNumber, inData, inFilter, inHex, inNumber16, inOptions } from '../../format/input'; import { outAddress, outBlock, outLog, outNumber, outReceipt, outTransaction } from '../../format/output'; diff --git a/js/src/api/rpc/eth/eth.spec.js b/js/src/api/rpc/eth/eth.spec.js index 8f2b59d118d..65377db509b 100644 --- a/js/src/api/rpc/eth/eth.spec.js +++ b/js/src/api/rpc/eth/eth.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { TEST_HTTP_URL, mockHttp } from '../../../../test/mockRpc'; import { isBigNumber } from '../../../../test/types'; diff --git a/js/src/api/rpc/eth/index.js b/js/src/api/rpc/eth/index.js index bea81bad4f1..0d0e8c5570c 100644 --- a/js/src/api/rpc/eth/index.js +++ b/js/src/api/rpc/eth/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './eth'; diff --git a/js/src/api/rpc/ethcore/ethcore.e2e.js b/js/src/api/rpc/ethcore/ethcore.e2e.js index ba357995a7d..9c6c31c809b 100644 --- a/js/src/api/rpc/ethcore/ethcore.e2e.js +++ b/js/src/api/rpc/ethcore/ethcore.e2e.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { createHttpApi } from '../../../test/e2e/ethapi'; describe('ethapi.ethcore', () => { diff --git a/js/src/api/rpc/ethcore/ethcore.js b/js/src/api/rpc/ethcore/ethcore.js index 17f7e125aeb..8efdb7a3615 100644 --- a/js/src/api/rpc/ethcore/ethcore.js +++ b/js/src/api/rpc/ethcore/ethcore.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { inAddress, inData, inNumber16 } from '../../format/input'; import { outAddress, outNumber, outPeers } from '../../format/output'; diff --git a/js/src/api/rpc/ethcore/ethcore.spec.js b/js/src/api/rpc/ethcore/ethcore.spec.js index ed2204e1bf6..fd34550a71e 100644 --- a/js/src/api/rpc/ethcore/ethcore.spec.js +++ b/js/src/api/rpc/ethcore/ethcore.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { TEST_HTTP_URL, mockHttp } from '../../../../test/mockRpc'; import { isBigNumber } from '../../../../test/types'; diff --git a/js/src/api/rpc/ethcore/index.js b/js/src/api/rpc/ethcore/index.js index cb63d6fdc3f..2372a21715b 100644 --- a/js/src/api/rpc/ethcore/index.js +++ b/js/src/api/rpc/ethcore/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './ethcore'; diff --git a/js/src/api/rpc/index.js b/js/src/api/rpc/index.js index bdc41705726..fa4e0621168 100644 --- a/js/src/api/rpc/index.js +++ b/js/src/api/rpc/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export Db from './db/index'; export Eth from './eth/index'; export Ethcore from './ethcore/index'; diff --git a/js/src/api/rpc/net/index.js b/js/src/api/rpc/net/index.js index d4142b5dd48..0739111e6af 100644 --- a/js/src/api/rpc/net/index.js +++ b/js/src/api/rpc/net/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './net'; diff --git a/js/src/api/rpc/net/net.e2e.js b/js/src/api/rpc/net/net.e2e.js index c2d440bb8d9..86eb6886373 100644 --- a/js/src/api/rpc/net/net.e2e.js +++ b/js/src/api/rpc/net/net.e2e.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { createHttpApi } from '../../../test/e2e/ethapi'; import { isBoolean } from '../../../../test/types'; diff --git a/js/src/api/rpc/net/net.js b/js/src/api/rpc/net/net.js index c17ff5b2fb1..96e99dc51f2 100644 --- a/js/src/api/rpc/net/net.js +++ b/js/src/api/rpc/net/net.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { outNumber } from '../../format/output'; export default class Net { diff --git a/js/src/api/rpc/net/net.spec.js b/js/src/api/rpc/net/net.spec.js index 30c65b5c8e2..55029a29ef7 100644 --- a/js/src/api/rpc/net/net.spec.js +++ b/js/src/api/rpc/net/net.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { TEST_HTTP_URL, mockHttp } from '../../../../test/mockRpc'; import { isBigNumber } from '../../../../test/types'; diff --git a/js/src/api/rpc/personal/index.js b/js/src/api/rpc/personal/index.js index fbb50ecc8a3..a9ed260f255 100644 --- a/js/src/api/rpc/personal/index.js +++ b/js/src/api/rpc/personal/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './personal'; diff --git a/js/src/api/rpc/personal/personal.e2e.js b/js/src/api/rpc/personal/personal.e2e.js index d46d5ca2e01..f3bc8e7f472 100644 --- a/js/src/api/rpc/personal/personal.e2e.js +++ b/js/src/api/rpc/personal/personal.e2e.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { createHttpApi } from '../../../test/e2e/ethapi'; import { isAddress, isBoolean } from '../../../../test/types'; diff --git a/js/src/api/rpc/personal/personal.js b/js/src/api/rpc/personal/personal.js index 76150dbd95a..cd20bc4be59 100644 --- a/js/src/api/rpc/personal/personal.js +++ b/js/src/api/rpc/personal/personal.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { inAddress, inNumber10, inOptions } from '../../format/input'; import { outAccountInfo, outAddress } from '../../format/output'; diff --git a/js/src/api/rpc/personal/personal.spec.js b/js/src/api/rpc/personal/personal.spec.js index a17d37a5aab..70734c7ee3e 100644 --- a/js/src/api/rpc/personal/personal.spec.js +++ b/js/src/api/rpc/personal/personal.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { TEST_HTTP_URL, mockHttp } from '../../../../test/mockRpc'; import Http from '../../transport/http'; diff --git a/js/src/api/rpc/shh/index.js b/js/src/api/rpc/shh/index.js index 8ae0de51fcf..7b323aeed69 100644 --- a/js/src/api/rpc/shh/index.js +++ b/js/src/api/rpc/shh/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './shh'; diff --git a/js/src/api/rpc/shh/shh.js b/js/src/api/rpc/shh/shh.js index 422f63b9294..ad545cac598 100644 --- a/js/src/api/rpc/shh/shh.js +++ b/js/src/api/rpc/shh/shh.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default class Personal { constructor (transport) { this._transport = transport; diff --git a/js/src/api/rpc/trace/index.js b/js/src/api/rpc/trace/index.js index 5d6af73284b..a1408770931 100644 --- a/js/src/api/rpc/trace/index.js +++ b/js/src/api/rpc/trace/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './trace'; diff --git a/js/src/api/rpc/trace/trace.e2e.js b/js/src/api/rpc/trace/trace.e2e.js index 0a541a83be1..d93fed8920b 100644 --- a/js/src/api/rpc/trace/trace.e2e.js +++ b/js/src/api/rpc/trace/trace.e2e.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { createHttpApi } from '../../../test/e2e/ethapi'; describe('ethapi.trace', () => { diff --git a/js/src/api/rpc/trace/trace.js b/js/src/api/rpc/trace/trace.js index b60ae1156a5..4cf8fc8e5ee 100644 --- a/js/src/api/rpc/trace/trace.js +++ b/js/src/api/rpc/trace/trace.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { inBlockNumber, inHex, inNumber16 } from '../../format/input'; export default class Trace { diff --git a/js/src/api/rpc/trace/trace.spec.js b/js/src/api/rpc/trace/trace.spec.js index 4528d8a60b7..4a38f7a3f71 100644 --- a/js/src/api/rpc/trace/trace.spec.js +++ b/js/src/api/rpc/trace/trace.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { TEST_HTTP_URL, mockHttp } from '../../../../test/mockRpc'; import Http from '../../transport/http'; diff --git a/js/src/api/rpc/web3/index.js b/js/src/api/rpc/web3/index.js index 6ea8df283e1..d0bb22941d5 100644 --- a/js/src/api/rpc/web3/index.js +++ b/js/src/api/rpc/web3/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './web3'; diff --git a/js/src/api/rpc/web3/web3.e2e.js b/js/src/api/rpc/web3/web3.e2e.js index 514944fafb0..aa0d58b02b9 100644 --- a/js/src/api/rpc/web3/web3.e2e.js +++ b/js/src/api/rpc/web3/web3.e2e.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { createHttpApi } from '../../../test/e2e/ethapi'; import { isHexNumber } from '../../../../test/types'; diff --git a/js/src/api/rpc/web3/web3.js b/js/src/api/rpc/web3/web3.js index 81925b9b1d6..eb52a8bb72a 100644 --- a/js/src/api/rpc/web3/web3.js +++ b/js/src/api/rpc/web3/web3.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { inHex } from '../../format/input'; export default class Web3 { diff --git a/js/src/api/rpc/web3/web3.spec.js b/js/src/api/rpc/web3/web3.spec.js index 0b893841471..eb4a59cd163 100644 --- a/js/src/api/rpc/web3/web3.spec.js +++ b/js/src/api/rpc/web3/web3.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { TEST_HTTP_URL, mockHttp } from '../../../../test/mockRpc'; import Http from '../../transport/http'; diff --git a/js/src/api/subscriptions/eth.js b/js/src/api/subscriptions/eth.js index b99d4b88e66..dadc2834114 100644 --- a/js/src/api/subscriptions/eth.js +++ b/js/src/api/subscriptions/eth.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; export default class Eth { diff --git a/js/src/api/subscriptions/index.js b/js/src/api/subscriptions/index.js index f2b335e7179..7a71694dd2c 100644 --- a/js/src/api/subscriptions/index.js +++ b/js/src/api/subscriptions/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export Logging from './logging'; export default from './subscriptions'; diff --git a/js/src/api/subscriptions/logging.js b/js/src/api/subscriptions/logging.js index 9f6786f7900..b03558207f3 100644 --- a/js/src/api/subscriptions/logging.js +++ b/js/src/api/subscriptions/logging.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + let instance = null; export default class Logging { diff --git a/js/src/api/subscriptions/personal.js b/js/src/api/subscriptions/personal.js index 949ffdedee8..f67411fa29a 100644 --- a/js/src/api/subscriptions/personal.js +++ b/js/src/api/subscriptions/personal.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default class Personal { constructor (updateSubscriptions, api, subscriber) { this._subscriber = subscriber; diff --git a/js/src/api/subscriptions/subscriptions.js b/js/src/api/subscriptions/subscriptions.js index 7de5c181c2a..7db624b6760 100644 --- a/js/src/api/subscriptions/subscriptions.js +++ b/js/src/api/subscriptions/subscriptions.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import Eth from './eth'; import Logging from './logging'; import Personal from './personal'; diff --git a/js/src/api/transport/http/http.e2e.js b/js/src/api/transport/http/http.e2e.js index 02b7ca370ae..8f0aa48adc5 100644 --- a/js/src/api/transport/http/http.e2e.js +++ b/js/src/api/transport/http/http.e2e.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import Http from './http'; const http = new Http('http://localhost:8545'); diff --git a/js/src/api/transport/http/http.js b/js/src/api/transport/http/http.js index d5fa961e261..88b58ffc912 100644 --- a/js/src/api/transport/http/http.js +++ b/js/src/api/transport/http/http.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import JsonRpcBase from '../jsonRpcBase'; /* global fetch */ diff --git a/js/src/api/transport/http/http.spec.js b/js/src/api/transport/http/http.spec.js index 0aa2f2d1bd8..94441bc5190 100644 --- a/js/src/api/transport/http/http.spec.js +++ b/js/src/api/transport/http/http.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { TEST_HTTP_URL, mockHttp } from '../../../../test/mockRpc'; import Http from './http'; diff --git a/js/src/api/transport/http/index.js b/js/src/api/transport/http/index.js index 2cfe539e607..5ce7a652ea5 100644 --- a/js/src/api/transport/http/index.js +++ b/js/src/api/transport/http/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './http'; diff --git a/js/src/api/transport/index.js b/js/src/api/transport/index.js index 2030aac81c6..af243ff7dd1 100644 --- a/js/src/api/transport/index.js +++ b/js/src/api/transport/index.js @@ -1,2 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export Http from './http/index'; export Ws from './ws/index'; diff --git a/js/src/api/transport/jsonRpcBase.js b/js/src/api/transport/jsonRpcBase.js index 59c2d6f06cf..91d2ceda1bb 100644 --- a/js/src/api/transport/jsonRpcBase.js +++ b/js/src/api/transport/jsonRpcBase.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { Logging } from '../subscriptions/index'; export default class JsonRpcBase { diff --git a/js/src/api/transport/jsonRpcBase.spec.js b/js/src/api/transport/jsonRpcBase.spec.js index 295d7e8dc61..78fc6549c2f 100644 --- a/js/src/api/transport/jsonRpcBase.spec.js +++ b/js/src/api/transport/jsonRpcBase.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import sinon from 'sinon'; import JsonRpcBase from './jsonRpcBase'; diff --git a/js/src/api/transport/ws/index.js b/js/src/api/transport/ws/index.js index 30c6c0d3a50..7b6e3593467 100644 --- a/js/src/api/transport/ws/index.js +++ b/js/src/api/transport/ws/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './ws'; diff --git a/js/src/api/transport/ws/ws.e2e.js b/js/src/api/transport/ws/ws.e2e.js index 7af34cf9797..19e4ab8eb4a 100644 --- a/js/src/api/transport/ws/ws.e2e.js +++ b/js/src/api/transport/ws/ws.e2e.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import Ws from './ws'; const ws = new Ws('ws://localhost:8546/'); diff --git a/js/src/api/transport/ws/ws.js b/js/src/api/transport/ws/ws.js index 786b405ecad..b2fb26f56d6 100644 --- a/js/src/api/transport/ws/ws.js +++ b/js/src/api/transport/ws/ws.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import JsonRpcBase from '../jsonRpcBase'; /* global WebSocket */ diff --git a/js/src/api/transport/ws/ws.spec.js b/js/src/api/transport/ws/ws.spec.js index 419d5a62182..c417e89110c 100644 --- a/js/src/api/transport/ws/ws.spec.js +++ b/js/src/api/transport/ws/ws.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { TEST_WS_URL, mockWs } from '../../../../test/mockRpc'; import Ws from './ws'; diff --git a/js/src/api/util/types.js b/js/src/api/util/types.js index f3a6d51da76..7890aeeea74 100644 --- a/js/src/api/util/types.js +++ b/js/src/api/util/types.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + const HEXDIGITS = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']; export function isArray (test) { diff --git a/js/src/api/util/types.spec.js b/js/src/api/util/types.spec.js index 0fb6316cc0b..04de890e258 100644 --- a/js/src/api/util/types.spec.js +++ b/js/src/api/util/types.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import sinon from 'sinon'; import { isArray, isFunction, isHex, isInstanceOf, isString } from './types'; diff --git a/js/src/dapps/gavcoin.js b/js/src/dapps/gavcoin.js index 240d533d303..f250388e48f 100644 --- a/js/src/dapps/gavcoin.js +++ b/js/src/dapps/gavcoin.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import ReactDOM from 'react-dom'; import React from 'react'; diff --git a/js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.css b/js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.css index 377e00c0425..3b7457cb707 100644 --- a/js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.css +++ b/js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .account { padding: 4px 0 !important; display: inline-block; diff --git a/js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.js b/js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.js index 7a5782f33ca..a5397b9a871 100644 --- a/js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.js +++ b/js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import IdentityIcon from '../../IdentityIcon'; diff --git a/js/src/dapps/gavcoin/AccountSelector/AccountItem/index.js b/js/src/dapps/gavcoin/AccountSelector/AccountItem/index.js index 879f3142e5d..570b3415aaa 100644 --- a/js/src/dapps/gavcoin/AccountSelector/AccountItem/index.js +++ b/js/src/dapps/gavcoin/AccountSelector/AccountItem/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './accountItem'; diff --git a/js/src/dapps/gavcoin/AccountSelector/accountSelector.js b/js/src/dapps/gavcoin/AccountSelector/accountSelector.js index 8962c17d464..e37d23598a9 100644 --- a/js/src/dapps/gavcoin/AccountSelector/accountSelector.js +++ b/js/src/dapps/gavcoin/AccountSelector/accountSelector.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; import { MenuItem, SelectField } from 'material-ui'; diff --git a/js/src/dapps/gavcoin/AccountSelector/index.js b/js/src/dapps/gavcoin/AccountSelector/index.js index 0edc4e5de92..de529244a15 100644 --- a/js/src/dapps/gavcoin/AccountSelector/index.js +++ b/js/src/dapps/gavcoin/AccountSelector/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { renderAccounts } from './accountSelector'; export default from './accountSelector'; diff --git a/js/src/dapps/gavcoin/AccountSelectorText/accountSelectorText.css b/js/src/dapps/gavcoin/AccountSelectorText/accountSelectorText.css index 220c02d3a3d..0a969770d7e 100644 --- a/js/src/dapps/gavcoin/AccountSelectorText/accountSelectorText.css +++ b/js/src/dapps/gavcoin/AccountSelectorText/accountSelectorText.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .addrtext { position: relative; } diff --git a/js/src/dapps/gavcoin/AccountSelectorText/accountSelectorText.js b/js/src/dapps/gavcoin/AccountSelectorText/accountSelectorText.js index 19ed6a57390..a83b0ec87ad 100644 --- a/js/src/dapps/gavcoin/AccountSelectorText/accountSelectorText.js +++ b/js/src/dapps/gavcoin/AccountSelectorText/accountSelectorText.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { TextField } from 'material-ui'; diff --git a/js/src/dapps/gavcoin/AccountSelectorText/index.js b/js/src/dapps/gavcoin/AccountSelectorText/index.js index b77c08db772..c3aab3e52ac 100644 --- a/js/src/dapps/gavcoin/AccountSelectorText/index.js +++ b/js/src/dapps/gavcoin/AccountSelectorText/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './accountSelectorText'; diff --git a/js/src/dapps/gavcoin/Accounts/accounts.css b/js/src/dapps/gavcoin/Accounts/accounts.css index 9000ead4677..7c45117106c 100644 --- a/js/src/dapps/gavcoin/Accounts/accounts.css +++ b/js/src/dapps/gavcoin/Accounts/accounts.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .accounts { padding: 4em 2em 0 2em; text-align: center; diff --git a/js/src/dapps/gavcoin/Accounts/accounts.js b/js/src/dapps/gavcoin/Accounts/accounts.js index 624d12e585d..f510193ac28 100644 --- a/js/src/dapps/gavcoin/Accounts/accounts.js +++ b/js/src/dapps/gavcoin/Accounts/accounts.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { Chip } from 'material-ui'; diff --git a/js/src/dapps/gavcoin/Accounts/index.js b/js/src/dapps/gavcoin/Accounts/index.js index 09e26c97282..e9be1d55733 100644 --- a/js/src/dapps/gavcoin/Accounts/index.js +++ b/js/src/dapps/gavcoin/Accounts/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './accounts'; diff --git a/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js b/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js index 332461f7875..3857504f06e 100644 --- a/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js +++ b/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; diff --git a/js/src/dapps/gavcoin/Actions/ActionBuyIn/index.js b/js/src/dapps/gavcoin/Actions/ActionBuyIn/index.js index e9bb1176311..2c0c2374fe8 100644 --- a/js/src/dapps/gavcoin/Actions/ActionBuyIn/index.js +++ b/js/src/dapps/gavcoin/Actions/ActionBuyIn/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './actionBuyIn'; diff --git a/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js b/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js index cde2bcf4210..7386abdb631 100644 --- a/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js +++ b/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; diff --git a/js/src/dapps/gavcoin/Actions/ActionRefund/index.js b/js/src/dapps/gavcoin/Actions/ActionRefund/index.js index fda1b7ed239..d3b5b7e1bff 100644 --- a/js/src/dapps/gavcoin/Actions/ActionRefund/index.js +++ b/js/src/dapps/gavcoin/Actions/ActionRefund/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './actionRefund'; diff --git a/js/src/dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js b/js/src/dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js index 9105bd229f0..b05f70a9716 100644 --- a/js/src/dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js +++ b/js/src/dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; diff --git a/js/src/dapps/gavcoin/Actions/ActionTransfer/index.js b/js/src/dapps/gavcoin/Actions/ActionTransfer/index.js index 60ec1cc699a..848800e00fe 100644 --- a/js/src/dapps/gavcoin/Actions/ActionTransfer/index.js +++ b/js/src/dapps/gavcoin/Actions/ActionTransfer/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './actionTransfer'; diff --git a/js/src/dapps/gavcoin/Actions/StepComplete/index.js b/js/src/dapps/gavcoin/Actions/StepComplete/index.js index 3a03c2e121b..7b95b1937a8 100644 --- a/js/src/dapps/gavcoin/Actions/StepComplete/index.js +++ b/js/src/dapps/gavcoin/Actions/StepComplete/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './stepComplete'; diff --git a/js/src/dapps/gavcoin/Actions/StepComplete/stepComplete.js b/js/src/dapps/gavcoin/Actions/StepComplete/stepComplete.js index 63fc23ed215..a066a7c30d8 100644 --- a/js/src/dapps/gavcoin/Actions/StepComplete/stepComplete.js +++ b/js/src/dapps/gavcoin/Actions/StepComplete/stepComplete.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component } from 'react'; import styles from '../actions.css'; diff --git a/js/src/dapps/gavcoin/Actions/actions.css b/js/src/dapps/gavcoin/Actions/actions.css index eb8c08a2d69..90ca3e18fea 100644 --- a/js/src/dapps/gavcoin/Actions/actions.css +++ b/js/src/dapps/gavcoin/Actions/actions.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .actions { text-align: center; padding: 2em 2em 0 2em; diff --git a/js/src/dapps/gavcoin/Actions/actions.js b/js/src/dapps/gavcoin/Actions/actions.js index 73658d686c5..1ee73561b1c 100644 --- a/js/src/dapps/gavcoin/Actions/actions.js +++ b/js/src/dapps/gavcoin/Actions/actions.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { RaisedButton } from 'material-ui'; diff --git a/js/src/dapps/gavcoin/Actions/index.js b/js/src/dapps/gavcoin/Actions/index.js index e0559a64d23..865bd65ce14 100644 --- a/js/src/dapps/gavcoin/Actions/index.js +++ b/js/src/dapps/gavcoin/Actions/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import ActionBuyIn from './ActionBuyIn'; import ActionRefund from './ActionRefund'; import ActionTransfer from './ActionTransfer'; diff --git a/js/src/dapps/gavcoin/Actions/validation.js b/js/src/dapps/gavcoin/Actions/validation.js index f6e35af06b1..c4efb71f23b 100644 --- a/js/src/dapps/gavcoin/Actions/validation.js +++ b/js/src/dapps/gavcoin/Actions/validation.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; import { api } from '../parity'; diff --git a/js/src/dapps/gavcoin/Application/application.js b/js/src/dapps/gavcoin/Application/application.js index 153281f56c9..b54fca8a404 100644 --- a/js/src/dapps/gavcoin/Application/application.js +++ b/js/src/dapps/gavcoin/Application/application.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; diff --git a/js/src/dapps/gavcoin/Application/index.js b/js/src/dapps/gavcoin/Application/index.js index e586e404a90..236578226a8 100644 --- a/js/src/dapps/gavcoin/Application/index.js +++ b/js/src/dapps/gavcoin/Application/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './application'; diff --git a/js/src/dapps/gavcoin/Events/Event/event.js b/js/src/dapps/gavcoin/Events/Event/event.js index 70830658608..fa080290a21 100644 --- a/js/src/dapps/gavcoin/Events/Event/event.js +++ b/js/src/dapps/gavcoin/Events/Event/event.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import IdentityIcon from '../../IdentityIcon'; diff --git a/js/src/dapps/gavcoin/Events/Event/index.js b/js/src/dapps/gavcoin/Events/Event/index.js index b36098be350..0925882d3e3 100644 --- a/js/src/dapps/gavcoin/Events/Event/index.js +++ b/js/src/dapps/gavcoin/Events/Event/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './event'; diff --git a/js/src/dapps/gavcoin/Events/EventBuyin/eventBuyin.js b/js/src/dapps/gavcoin/Events/EventBuyin/eventBuyin.js index 95bc52b0469..571da1bef19 100644 --- a/js/src/dapps/gavcoin/Events/EventBuyin/eventBuyin.js +++ b/js/src/dapps/gavcoin/Events/EventBuyin/eventBuyin.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import Event from '../Event'; diff --git a/js/src/dapps/gavcoin/Events/EventBuyin/index.js b/js/src/dapps/gavcoin/Events/EventBuyin/index.js index c7222247064..77edc578af2 100644 --- a/js/src/dapps/gavcoin/Events/EventBuyin/index.js +++ b/js/src/dapps/gavcoin/Events/EventBuyin/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './eventBuyin'; diff --git a/js/src/dapps/gavcoin/Events/EventNewTranch/eventNewTranch.js b/js/src/dapps/gavcoin/Events/EventNewTranch/eventNewTranch.js index 0d227680663..16fa0535156 100644 --- a/js/src/dapps/gavcoin/Events/EventNewTranch/eventNewTranch.js +++ b/js/src/dapps/gavcoin/Events/EventNewTranch/eventNewTranch.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import Event from '../Event'; diff --git a/js/src/dapps/gavcoin/Events/EventNewTranch/index.js b/js/src/dapps/gavcoin/Events/EventNewTranch/index.js index a7ba5f09f5b..46d1d2df628 100644 --- a/js/src/dapps/gavcoin/Events/EventNewTranch/index.js +++ b/js/src/dapps/gavcoin/Events/EventNewTranch/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './eventNewTranch'; diff --git a/js/src/dapps/gavcoin/Events/EventRefund/eventRefund.js b/js/src/dapps/gavcoin/Events/EventRefund/eventRefund.js index 3084a4b4ce0..5c4ed656209 100644 --- a/js/src/dapps/gavcoin/Events/EventRefund/eventRefund.js +++ b/js/src/dapps/gavcoin/Events/EventRefund/eventRefund.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import Event from '../Event'; @@ -7,11 +23,6 @@ export default class EventRefund extends Component { event: PropTypes.object } - // "35000000000000000", "20000008" - // "35000000000000000", "20000000" - // "7C585087238000", "1312D00" - // 0x5af36e3e000000000000000000000000000000000000000000000000007c5850872380000000000000000000000000000000000000000000000000000000000001312d00 - render () { const { event } = this.props; const { buyer, price, amount } = event.params; diff --git a/js/src/dapps/gavcoin/Events/EventRefund/index.js b/js/src/dapps/gavcoin/Events/EventRefund/index.js index 015a4df996c..bac0f20dcca 100644 --- a/js/src/dapps/gavcoin/Events/EventRefund/index.js +++ b/js/src/dapps/gavcoin/Events/EventRefund/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './eventRefund'; diff --git a/js/src/dapps/gavcoin/Events/EventTransfer/eventTransfer.js b/js/src/dapps/gavcoin/Events/EventTransfer/eventTransfer.js index b3e5fab9150..64e489cb010 100644 --- a/js/src/dapps/gavcoin/Events/EventTransfer/eventTransfer.js +++ b/js/src/dapps/gavcoin/Events/EventTransfer/eventTransfer.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import Event from '../Event'; diff --git a/js/src/dapps/gavcoin/Events/EventTransfer/index.js b/js/src/dapps/gavcoin/Events/EventTransfer/index.js index 0d4378df499..a75b45a0ac9 100644 --- a/js/src/dapps/gavcoin/Events/EventTransfer/index.js +++ b/js/src/dapps/gavcoin/Events/EventTransfer/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './eventTransfer'; diff --git a/js/src/dapps/gavcoin/Events/events.css b/js/src/dapps/gavcoin/Events/events.css index c3438d7811f..6fca623540a 100644 --- a/js/src/dapps/gavcoin/Events/events.css +++ b/js/src/dapps/gavcoin/Events/events.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .events { padding: 4em 2em; } diff --git a/js/src/dapps/gavcoin/Events/events.js b/js/src/dapps/gavcoin/Events/events.js index 9cd9e7909f3..a369ea6c587 100644 --- a/js/src/dapps/gavcoin/Events/events.js +++ b/js/src/dapps/gavcoin/Events/events.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { api } from '../parity'; diff --git a/js/src/dapps/gavcoin/Events/index.js b/js/src/dapps/gavcoin/Events/index.js index 9bc705f2c88..88ad6d407c9 100644 --- a/js/src/dapps/gavcoin/Events/index.js +++ b/js/src/dapps/gavcoin/Events/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './events'; diff --git a/js/src/dapps/gavcoin/Loading/index.js b/js/src/dapps/gavcoin/Loading/index.js index 25ff460fa67..0468cab37df 100644 --- a/js/src/dapps/gavcoin/Loading/index.js +++ b/js/src/dapps/gavcoin/Loading/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './loading'; diff --git a/js/src/dapps/gavcoin/Loading/loading.css b/js/src/dapps/gavcoin/Loading/loading.css index cb93aac9d59..3ec65400f0c 100644 --- a/js/src/dapps/gavcoin/Loading/loading.css +++ b/js/src/dapps/gavcoin/Loading/loading.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .loading { width: 100%; text-align: center; diff --git a/js/src/dapps/gavcoin/Loading/loading.js b/js/src/dapps/gavcoin/Loading/loading.js index f6c34086e72..9e00cc8f11a 100644 --- a/js/src/dapps/gavcoin/Loading/loading.js +++ b/js/src/dapps/gavcoin/Loading/loading.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component } from 'react'; import { CircularProgress } from 'material-ui'; diff --git a/js/src/dapps/gavcoin/Status/index.js b/js/src/dapps/gavcoin/Status/index.js index 60aae301478..44079b22485 100644 --- a/js/src/dapps/gavcoin/Status/index.js +++ b/js/src/dapps/gavcoin/Status/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './status'; diff --git a/js/src/dapps/gavcoin/Status/status.css b/js/src/dapps/gavcoin/Status/status.css index 39bcfae9cb8..655bdb8bfa4 100644 --- a/js/src/dapps/gavcoin/Status/status.css +++ b/js/src/dapps/gavcoin/Status/status.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .status { background: rgba(25, 75, 125, 1); color: rgba(255, 255, 255, 1); diff --git a/js/src/dapps/gavcoin/Status/status.js b/js/src/dapps/gavcoin/Status/status.js index f93ebf5ece0..92b1efb7aec 100644 --- a/js/src/dapps/gavcoin/Status/status.js +++ b/js/src/dapps/gavcoin/Status/status.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { formatBlockNumber, formatCoins, formatEth } from '../format'; diff --git a/js/src/dapps/gavcoin/format/index.js b/js/src/dapps/gavcoin/format/index.js index c20f7ce725b..42898cafda2 100644 --- a/js/src/dapps/gavcoin/format/index.js +++ b/js/src/dapps/gavcoin/format/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; import { api } from '../parity'; diff --git a/js/src/dapps/registry.js b/js/src/dapps/registry.js index 03ec8885154..28e217d4142 100644 --- a/js/src/dapps/registry.js +++ b/js/src/dapps/registry.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React from 'react'; import ReactDOM from 'react-dom'; import { Provider } from 'react-redux'; diff --git a/js/src/dapps/registry/Lookup/lookup.css b/js/src/dapps/registry/Lookup/lookup.css index 97becf31afd..86885b3c1a6 100644 --- a/js/src/dapps/registry/Lookup/lookup.css +++ b/js/src/dapps/registry/Lookup/lookup.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .lookup { padding: 1em; } diff --git a/js/src/dapps/registry/Status/status.css b/js/src/dapps/registry/Status/status.css index 7ce7f2f0bf1..be71244b4ea 100644 --- a/js/src/dapps/registry/Status/status.css +++ b/js/src/dapps/registry/Status/status.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .status { padding: 1em; color: #fff; diff --git a/js/src/dapps/tokenreg.js b/js/src/dapps/tokenreg.js index 1fe54417d3e..0d5ff0e1f22 100644 --- a/js/src/dapps/tokenreg.js +++ b/js/src/dapps/tokenreg.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import ReactDOM from 'react-dom'; import React from 'react'; diff --git a/js/src/dapps/tokenreg/Loading/loading.css b/js/src/dapps/tokenreg/Loading/loading.css index 6a864120621..7f524d4572f 100644 --- a/js/src/dapps/tokenreg/Loading/loading.css +++ b/js/src/dapps/tokenreg/Loading/loading.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .loading { width: 100%; text-align: center; diff --git a/js/src/dapps/tokenreg/Status/status.css b/js/src/dapps/tokenreg/Status/status.css index bd465f8886d..07ac555c2c2 100644 --- a/js/src/dapps/tokenreg/Status/status.css +++ b/js/src/dapps/tokenreg/Status/status.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .status { padding: 1em 1em 2em 1em; } diff --git a/js/src/environment/index.js b/js/src/environment/index.js index bdf1cd55edf..d8e81f343fe 100644 --- a/js/src/environment/index.js +++ b/js/src/environment/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + // import './integration-tests'; // import './perf-debug'; diff --git a/js/src/environment/integration-tests/fake-backend.js b/js/src/environment/integration-tests/fake-backend.js index 60ab1a08304..16fcae3adc5 100644 --- a/js/src/environment/integration-tests/fake-backend.js +++ b/js/src/environment/integration-tests/fake-backend.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import sinon from 'sinon/pkg/sinon'; import mockedResponses from '../../../test/mocked-responses.json'; diff --git a/js/src/environment/integration-tests/index.js b/js/src/environment/integration-tests/index.js index 3ee1db3f377..d62acaa324b 100644 --- a/js/src/environment/integration-tests/index.js +++ b/js/src/environment/integration-tests/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import './fake-backend'; diff --git a/js/src/environment/perf-debug/index.js b/js/src/environment/perf-debug/index.js index a7ae638f3d4..29f84f50fb0 100644 --- a/js/src/environment/perf-debug/index.js +++ b/js/src/environment/perf-debug/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import './why-update'; diff --git a/js/src/environment/perf-debug/why-update.js b/js/src/environment/perf-debug/why-update.js index d47b0aeea48..35eef2edc36 100644 --- a/js/src/environment/perf-debug/why-update.js +++ b/js/src/environment/perf-debug/why-update.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React from 'react'; import { whyDidYouUpdate } from 'why-did-you-update'; diff --git a/js/src/environment/tests/index.js b/js/src/environment/tests/index.js index 383cbe06121..3e6241fb114 100644 --- a/js/src/environment/tests/index.js +++ b/js/src/environment/tests/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import './test-utils'; diff --git a/js/src/environment/tests/test-utils.js b/js/src/environment/tests/test-utils.js index a60d79fd7e9..785a6f3ad8e 100644 --- a/js/src/environment/tests/test-utils.js +++ b/js/src/environment/tests/test-utils.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { Component } from 'react'; const isProd = process.env.NODE_ENV === 'production'; diff --git a/js/src/index.js b/js/src/index.js index 7f8ac2a0efe..330f0330849 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import 'isomorphic-fetch'; import React from 'react'; import ReactDOM from 'react-dom'; diff --git a/js/src/jsonrpc/generator/build-json.js b/js/src/jsonrpc/generator/build-json.js index 4982855c894..362df7bf5fe 100644 --- a/js/src/jsonrpc/generator/build-json.js +++ b/js/src/jsonrpc/generator/build-json.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import fs from 'fs'; import path from 'path'; diff --git a/js/src/jsonrpc/generator/build-markdown.js b/js/src/jsonrpc/generator/build-markdown.js index 9781b5db083..278138d545e 100644 --- a/js/src/jsonrpc/generator/build-markdown.js +++ b/js/src/jsonrpc/generator/build-markdown.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import fs from 'fs'; import path from 'path'; diff --git a/js/src/jsonrpc/index.js b/js/src/jsonrpc/index.js index f9d6fd61ca0..18bd4302df9 100644 --- a/js/src/jsonrpc/index.js +++ b/js/src/jsonrpc/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import db from './interfaces/db'; import eth from './interfaces/eth'; import ethcore from './interfaces/ethcore'; diff --git a/js/src/jsonrpc/index.spec.js b/js/src/jsonrpc/index.spec.js index 32e2a0b8935..0f124747743 100644 --- a/js/src/jsonrpc/index.spec.js +++ b/js/src/jsonrpc/index.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import interfaces from './'; import { Address, BlockNumber, Data, Hash, Integer, Quantity } from './types'; diff --git a/js/src/jsonrpc/interfaces/db.js b/js/src/jsonrpc/interfaces/db.js index ecf8b7bb07f..ab4d35b34a7 100644 --- a/js/src/jsonrpc/interfaces/db.js +++ b/js/src/jsonrpc/interfaces/db.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { Data } from '../types'; export default { diff --git a/js/src/jsonrpc/interfaces/eth.js b/js/src/jsonrpc/interfaces/eth.js index 5b63d92d169..752b0801d0f 100644 --- a/js/src/jsonrpc/interfaces/eth.js +++ b/js/src/jsonrpc/interfaces/eth.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { Address, BlockNumber, Data, Hash, Quantity } from '../types'; export default { diff --git a/js/src/jsonrpc/interfaces/ethcore.js b/js/src/jsonrpc/interfaces/ethcore.js index d029584d40e..735b08ff9f6 100644 --- a/js/src/jsonrpc/interfaces/ethcore.js +++ b/js/src/jsonrpc/interfaces/ethcore.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { Address, Data, Quantity } from '../types'; export default { diff --git a/js/src/jsonrpc/interfaces/net.js b/js/src/jsonrpc/interfaces/net.js index 59c83e51bf6..9cc3bc07666 100644 --- a/js/src/jsonrpc/interfaces/net.js +++ b/js/src/jsonrpc/interfaces/net.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { Quantity } from '../types'; export default { diff --git a/js/src/jsonrpc/interfaces/personal.js b/js/src/jsonrpc/interfaces/personal.js index 3c46319560b..97618db0ac7 100644 --- a/js/src/jsonrpc/interfaces/personal.js +++ b/js/src/jsonrpc/interfaces/personal.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { Address, Data, Quantity } from '../types'; export default { diff --git a/js/src/jsonrpc/interfaces/shh.js b/js/src/jsonrpc/interfaces/shh.js index 99ce6dee254..e9f727dacc4 100644 --- a/js/src/jsonrpc/interfaces/shh.js +++ b/js/src/jsonrpc/interfaces/shh.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { Data, Quantity } from '../types'; export default { diff --git a/js/src/jsonrpc/interfaces/trace.js b/js/src/jsonrpc/interfaces/trace.js index b603eb95a6b..3dc4451f006 100644 --- a/js/src/jsonrpc/interfaces/trace.js +++ b/js/src/jsonrpc/interfaces/trace.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { BlockNumber, Hash, Integer } from '../types'; export default { diff --git a/js/src/jsonrpc/interfaces/web3.js b/js/src/jsonrpc/interfaces/web3.js index 07ee6b967f1..783663716ab 100644 --- a/js/src/jsonrpc/interfaces/web3.js +++ b/js/src/jsonrpc/interfaces/web3.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { Data } from '../types'; export default { diff --git a/js/src/jsonrpc/types.js b/js/src/jsonrpc/types.js index 8d7223ab000..026e010ed96 100644 --- a/js/src/jsonrpc/types.js +++ b/js/src/jsonrpc/types.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export class Address {} export class BlockNumber {} diff --git a/js/src/modals/AddAddress/addAddress.css b/js/src/modals/AddAddress/addAddress.css index c6a2425d791..7b9d8d18149 100644 --- a/js/src/modals/AddAddress/addAddress.css +++ b/js/src/modals/AddAddress/addAddress.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .header { margin: -24px -24px 1em -24px; padding: 1em; diff --git a/js/src/modals/AddAddress/addAddress.js b/js/src/modals/AddAddress/addAddress.js index a6d47fedd7e..b59f8f17874 100644 --- a/js/src/modals/AddAddress/addAddress.js +++ b/js/src/modals/AddAddress/addAddress.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { FlatButton } from 'material-ui'; import ContentAdd from 'material-ui/svg-icons/content/add'; diff --git a/js/src/modals/AddAddress/index.js b/js/src/modals/AddAddress/index.js index 1459ddc3dcc..fb891f0fef2 100644 --- a/js/src/modals/AddAddress/index.js +++ b/js/src/modals/AddAddress/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './addAddress'; diff --git a/js/src/modals/CreateAccount/AccountDetails/accountDetails.css b/js/src/modals/CreateAccount/AccountDetails/accountDetails.css index f5d283c0d53..bc005f09344 100644 --- a/js/src/modals/CreateAccount/AccountDetails/accountDetails.css +++ b/js/src/modals/CreateAccount/AccountDetails/accountDetails.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .icon { margin: 1em -100% 0 0; } diff --git a/js/src/modals/CreateAccount/AccountDetails/accountDetails.js b/js/src/modals/CreateAccount/AccountDetails/accountDetails.js index fbd5a0097aa..2145ea5a4f6 100644 --- a/js/src/modals/CreateAccount/AccountDetails/accountDetails.js +++ b/js/src/modals/CreateAccount/AccountDetails/accountDetails.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import Form, { Input } from '../../../ui/Form'; diff --git a/js/src/modals/CreateAccount/AccountDetails/index.js b/js/src/modals/CreateAccount/AccountDetails/index.js index d9e88fccdbb..c1911d8d8e0 100644 --- a/js/src/modals/CreateAccount/AccountDetails/index.js +++ b/js/src/modals/CreateAccount/AccountDetails/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './accountDetails'; diff --git a/js/src/modals/CreateAccount/AccountDetailsGeth/accountDetailsGeth.css b/js/src/modals/CreateAccount/AccountDetailsGeth/accountDetailsGeth.css index da9f6fb7033..fa7deec5dc4 100644 --- a/js/src/modals/CreateAccount/AccountDetailsGeth/accountDetailsGeth.css +++ b/js/src/modals/CreateAccount/AccountDetailsGeth/accountDetailsGeth.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .address { color: #999; padding-top: 1em; diff --git a/js/src/modals/CreateAccount/AccountDetailsGeth/accountDetailsGeth.js b/js/src/modals/CreateAccount/AccountDetailsGeth/accountDetailsGeth.js index 5fea7188b5e..017bd981395 100644 --- a/js/src/modals/CreateAccount/AccountDetailsGeth/accountDetailsGeth.js +++ b/js/src/modals/CreateAccount/AccountDetailsGeth/accountDetailsGeth.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import styles from './accountDetailsGeth.css'; diff --git a/js/src/modals/CreateAccount/AccountDetailsGeth/index.js b/js/src/modals/CreateAccount/AccountDetailsGeth/index.js index d8d7c3c32db..97d2ce159dd 100644 --- a/js/src/modals/CreateAccount/AccountDetailsGeth/index.js +++ b/js/src/modals/CreateAccount/AccountDetailsGeth/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './accountDetailsGeth'; diff --git a/js/src/modals/CreateAccount/CreationType/creationType.js b/js/src/modals/CreateAccount/CreationType/creationType.js index a29a30c4987..4e03dcf1410 100644 --- a/js/src/modals/CreateAccount/CreationType/creationType.js +++ b/js/src/modals/CreateAccount/CreationType/creationType.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { RadioButton, RadioButtonGroup } from 'material-ui/RadioButton'; diff --git a/js/src/modals/CreateAccount/CreationType/index.js b/js/src/modals/CreateAccount/CreationType/index.js index b22783fe8eb..cd00277c4ff 100644 --- a/js/src/modals/CreateAccount/CreationType/index.js +++ b/js/src/modals/CreateAccount/CreationType/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './creationType'; diff --git a/js/src/modals/CreateAccount/NewAccount/index.js b/js/src/modals/CreateAccount/NewAccount/index.js index c3fbef08be4..9b442283a23 100644 --- a/js/src/modals/CreateAccount/NewAccount/index.js +++ b/js/src/modals/CreateAccount/NewAccount/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './newAccount'; diff --git a/js/src/modals/CreateAccount/NewAccount/newAccount.js b/js/src/modals/CreateAccount/NewAccount/newAccount.js index f1aa1860ddc..a7a1da69144 100644 --- a/js/src/modals/CreateAccount/NewAccount/newAccount.js +++ b/js/src/modals/CreateAccount/NewAccount/newAccount.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; diff --git a/js/src/modals/CreateAccount/NewGeth/index.js b/js/src/modals/CreateAccount/NewGeth/index.js index aa8ef92b524..5801eb97008 100644 --- a/js/src/modals/CreateAccount/NewGeth/index.js +++ b/js/src/modals/CreateAccount/NewGeth/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './newGeth'; diff --git a/js/src/modals/CreateAccount/NewGeth/newGeth.css b/js/src/modals/CreateAccount/NewGeth/newGeth.css index c98a72ca7e6..18041bb8531 100644 --- a/js/src/modals/CreateAccount/NewGeth/newGeth.css +++ b/js/src/modals/CreateAccount/NewGeth/newGeth.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .list { margin-top: 1em; } diff --git a/js/src/modals/CreateAccount/NewGeth/newGeth.js b/js/src/modals/CreateAccount/NewGeth/newGeth.js index b12ea696926..840f0b3cf9d 100644 --- a/js/src/modals/CreateAccount/NewGeth/newGeth.js +++ b/js/src/modals/CreateAccount/NewGeth/newGeth.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { Checkbox } from 'material-ui'; diff --git a/js/src/modals/CreateAccount/NewImport/index.js b/js/src/modals/CreateAccount/NewImport/index.js index 9207fe651f6..0b260f4267e 100644 --- a/js/src/modals/CreateAccount/NewImport/index.js +++ b/js/src/modals/CreateAccount/NewImport/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './newImport'; diff --git a/js/src/modals/CreateAccount/NewImport/newImport.js b/js/src/modals/CreateAccount/NewImport/newImport.js index 1e2d591bc2b..49bf506f51f 100644 --- a/js/src/modals/CreateAccount/NewImport/newImport.js +++ b/js/src/modals/CreateAccount/NewImport/newImport.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import ReactDOM from 'react-dom'; diff --git a/js/src/modals/CreateAccount/createAccount.css b/js/src/modals/CreateAccount/createAccount.css index c3809765657..e665cb3c144 100644 --- a/js/src/modals/CreateAccount/createAccount.css +++ b/js/src/modals/CreateAccount/createAccount.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .paddedtop { padding: 1.618em 0 0 0; line-height: 1.618em; diff --git a/js/src/modals/CreateAccount/createAccount.js b/js/src/modals/CreateAccount/createAccount.js index 0c998c76de2..2c03b1b4252 100644 --- a/js/src/modals/CreateAccount/createAccount.js +++ b/js/src/modals/CreateAccount/createAccount.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; diff --git a/js/src/modals/CreateAccount/index.js b/js/src/modals/CreateAccount/index.js index f4ec003dae7..f75cecaacf7 100644 --- a/js/src/modals/CreateAccount/index.js +++ b/js/src/modals/CreateAccount/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import AccountDetails from './AccountDetails'; import NewAccount from './NewAccount'; diff --git a/js/src/modals/FirstRun/Completed/completed.js b/js/src/modals/FirstRun/Completed/completed.js index 04dac5a1997..43724f0341f 100644 --- a/js/src/modals/FirstRun/Completed/completed.js +++ b/js/src/modals/FirstRun/Completed/completed.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component } from 'react'; export default class Completed extends Component { diff --git a/js/src/modals/FirstRun/Completed/index.js b/js/src/modals/FirstRun/Completed/index.js index 2fafaadb31d..3e79033d81c 100644 --- a/js/src/modals/FirstRun/Completed/index.js +++ b/js/src/modals/FirstRun/Completed/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './completed'; diff --git a/js/src/modals/FirstRun/Welcome/index.js b/js/src/modals/FirstRun/Welcome/index.js index f4ce986b6a6..241e26fc210 100644 --- a/js/src/modals/FirstRun/Welcome/index.js +++ b/js/src/modals/FirstRun/Welcome/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './welcome'; diff --git a/js/src/modals/FirstRun/Welcome/welcome.js b/js/src/modals/FirstRun/Welcome/welcome.js index 630e25e8661..3afc62bed87 100644 --- a/js/src/modals/FirstRun/Welcome/welcome.js +++ b/js/src/modals/FirstRun/Welcome/welcome.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component } from 'react'; import imagesEthcore from '../../../images/ethcore-logo-white-square.png'; diff --git a/js/src/modals/FirstRun/firstRun.js b/js/src/modals/FirstRun/firstRun.js index 4cba426c040..9bcadc1bdea 100644 --- a/js/src/modals/FirstRun/firstRun.js +++ b/js/src/modals/FirstRun/firstRun.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; diff --git a/js/src/modals/FirstRun/index.js b/js/src/modals/FirstRun/index.js index 55155199c06..4dea9ba514a 100644 --- a/js/src/modals/FirstRun/index.js +++ b/js/src/modals/FirstRun/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './firstRun'; diff --git a/js/src/modals/FundAccount/fundAccount.js b/js/src/modals/FundAccount/fundAccount.js index 874ce80efad..5460c38356e 100644 --- a/js/src/modals/FundAccount/fundAccount.js +++ b/js/src/modals/FundAccount/fundAccount.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { FlatButton } from 'material-ui'; diff --git a/js/src/modals/FundAccount/index.js b/js/src/modals/FundAccount/index.js index be34a36e76a..77a74744e8d 100644 --- a/js/src/modals/FundAccount/index.js +++ b/js/src/modals/FundAccount/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './fundAccount'; diff --git a/js/src/modals/Transfer/Complete/complete.js b/js/src/modals/Transfer/Complete/complete.js index 0e2db69e2cb..5051fb26032 100644 --- a/js/src/modals/Transfer/Complete/complete.js +++ b/js/src/modals/Transfer/Complete/complete.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import LinearProgress from 'material-ui/LinearProgress'; diff --git a/js/src/modals/Transfer/Complete/index.js b/js/src/modals/Transfer/Complete/index.js index b86b7fba57c..60cfe000f64 100644 --- a/js/src/modals/Transfer/Complete/index.js +++ b/js/src/modals/Transfer/Complete/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './complete'; diff --git a/js/src/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js index 48b471b26da..326fb6f5b3b 100644 --- a/js/src/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; import { Checkbox, MenuItem } from 'material-ui'; diff --git a/js/src/modals/Transfer/Details/index.js b/js/src/modals/Transfer/Details/index.js index 6a9e0f60aa9..d0bf396b693 100644 --- a/js/src/modals/Transfer/Details/index.js +++ b/js/src/modals/Transfer/Details/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './details'; diff --git a/js/src/modals/Transfer/Extras/extras.js b/js/src/modals/Transfer/Extras/extras.js index e634d4a4a01..95d46a198a9 100644 --- a/js/src/modals/Transfer/Extras/extras.js +++ b/js/src/modals/Transfer/Extras/extras.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import Form, { Input } from '../../../ui/Form'; diff --git a/js/src/modals/Transfer/Extras/index.js b/js/src/modals/Transfer/Extras/index.js index 5dd7147930f..0b4d22a2ebc 100644 --- a/js/src/modals/Transfer/Extras/index.js +++ b/js/src/modals/Transfer/Extras/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './extras'; diff --git a/js/src/modals/Transfer/errors.js b/js/src/modals/Transfer/errors.js index 000aebe9f5b..cc6f9b365d6 100644 --- a/js/src/modals/Transfer/errors.js +++ b/js/src/modals/Transfer/errors.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + const ERRORS = { requireRecipient: 'a recipient network address is required for the transaction', invalidAddress: 'the supplied address is an invalid network address', diff --git a/js/src/modals/Transfer/index.js b/js/src/modals/Transfer/index.js index 4f097a4c526..24d36d79637 100644 --- a/js/src/modals/Transfer/index.js +++ b/js/src/modals/Transfer/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './transfer'; diff --git a/js/src/modals/Transfer/transfer.css b/js/src/modals/Transfer/transfer.css index f1809d9d226..70636387bf4 100644 --- a/js/src/modals/Transfer/transfer.css +++ b/js/src/modals/Transfer/transfer.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .info { padding: 1.618em 0; line-height: 1.618em; diff --git a/js/src/modals/Transfer/transfer.js b/js/src/modals/Transfer/transfer.js index bb02e5ec983..66943a2e506 100644 --- a/js/src/modals/Transfer/transfer.js +++ b/js/src/modals/Transfer/transfer.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; diff --git a/js/src/modals/index.js b/js/src/modals/index.js index 6f9fd90db48..f2225ddde0b 100644 --- a/js/src/modals/index.js +++ b/js/src/modals/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import AddAddress from './AddAddress'; import CreateAccount from './CreateAccount'; import FirstRun from './FirstRun'; diff --git a/js/src/parity.js b/js/src/parity.js index badbcf230c1..c0ca2e779cd 100644 --- a/js/src/parity.js +++ b/js/src/parity.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import 'isomorphic-fetch'; import es6Promise from 'es6-promise'; diff --git a/js/src/redux/actions.js b/js/src/redux/actions.js index 95cebaa5283..c4da73a9106 100644 --- a/js/src/redux/actions.js +++ b/js/src/redux/actions.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { clearStatusLogs, toggleStatusLogs } from './providers/statusActions'; export { diff --git a/js/src/redux/index.js b/js/src/redux/index.js index a78dcde95c7..a23f60659fa 100644 --- a/js/src/redux/index.js +++ b/js/src/redux/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import * as actions from './actions'; import initStore from './store'; diff --git a/js/src/redux/middleware.js b/js/src/redux/middleware.js index 2ee831859f6..e2c3a827be0 100644 --- a/js/src/redux/middleware.js +++ b/js/src/redux/middleware.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import ErrorsMiddleware from '../ui/Errors/middleware'; import signerMiddleware from '../views/Signer/middleware'; diff --git a/js/src/redux/providers/balances.js b/js/src/redux/providers/balances.js index 8da2476ca5f..d6dbf57305b 100644 --- a/js/src/redux/providers/balances.js +++ b/js/src/redux/providers/balances.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { getBalances, getTokens } from './balancesActions'; import { eip20Abi, registryAbi, tokenRegAbi } from '../../util/abi'; diff --git a/js/src/redux/providers/balancesActions.js b/js/src/redux/providers/balancesActions.js index 1897d081791..2771c455e23 100644 --- a/js/src/redux/providers/balancesActions.js +++ b/js/src/redux/providers/balancesActions.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export function getBalances (balances) { return { type: 'getBalances', diff --git a/js/src/redux/providers/balancesReducer.js b/js/src/redux/providers/balancesReducer.js index 955f3e8aa56..4da974f125c 100644 --- a/js/src/redux/providers/balancesReducer.js +++ b/js/src/redux/providers/balancesReducer.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { handleActions } from 'redux-actions'; const initialState = { diff --git a/js/src/redux/providers/index.js b/js/src/redux/providers/index.js index 52f1139be2b..a6f52fdaf3d 100644 --- a/js/src/redux/providers/index.js +++ b/js/src/redux/providers/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export Balances from './balances'; export Personal from './personal'; export Status from './status'; diff --git a/js/src/redux/providers/personal.js b/js/src/redux/providers/personal.js index 7369c03daad..cf5b1c163d1 100644 --- a/js/src/redux/providers/personal.js +++ b/js/src/redux/providers/personal.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { personalAccountsInfo } from './personalActions'; export default class Personal { diff --git a/js/src/redux/providers/personalActions.js b/js/src/redux/providers/personalActions.js index 9895c9d1f3e..2e422cb1afa 100644 --- a/js/src/redux/providers/personalActions.js +++ b/js/src/redux/providers/personalActions.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export function personalAccountsInfo (accountsInfo) { return { type: 'personalAccountsInfo', diff --git a/js/src/redux/providers/personalReducer.js b/js/src/redux/providers/personalReducer.js index d440f710778..67178d6cae2 100644 --- a/js/src/redux/providers/personalReducer.js +++ b/js/src/redux/providers/personalReducer.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { handleActions } from 'redux-actions'; const initialState = { diff --git a/js/src/redux/providers/status.js b/js/src/redux/providers/status.js index df1326a7042..c73db14b29a 100644 --- a/js/src/redux/providers/status.js +++ b/js/src/redux/providers/status.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { statusBlockNumber, statusCollection, statusLogs } from './statusActions'; export default class Status { diff --git a/js/src/redux/providers/statusActions.js b/js/src/redux/providers/statusActions.js index 809bce8f0c4..142cdabdcb6 100644 --- a/js/src/redux/providers/statusActions.js +++ b/js/src/redux/providers/statusActions.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export function statusBlockNumber (blockNumber) { return { type: 'statusBlockNumber', diff --git a/js/src/redux/providers/statusReducer.js b/js/src/redux/providers/statusReducer.js index eb16a4f20bc..6cc6e1a24b7 100644 --- a/js/src/redux/providers/statusReducer.js +++ b/js/src/redux/providers/statusReducer.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { handleActions } from 'redux-actions'; const initialState = { diff --git a/js/src/redux/reducers.js b/js/src/redux/reducers.js index 1843309a81b..ec41f7c234a 100644 --- a/js/src/redux/reducers.js +++ b/js/src/redux/reducers.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { combineReducers } from 'redux'; import { routerReducer } from 'react-router-redux'; diff --git a/js/src/redux/store.js b/js/src/redux/store.js index fb1a5932d6b..9b99bc6c47c 100644 --- a/js/src/redux/store.js +++ b/js/src/redux/store.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { applyMiddleware, createStore } from 'redux'; import initMiddleware from './middleware'; diff --git a/js/src/redux/util.js b/js/src/redux/util.js index 5fa86a7a776..047db47d2a6 100644 --- a/js/src/redux/util.js +++ b/js/src/redux/util.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { withError } from '../ui/Errors/middleware'; export { diff --git a/js/src/reset.css b/js/src/reset.css index 1d7cda5e988..dd05698547e 100644 --- a/js/src/reset.css +++ b/js/src/reset.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ :root, :root body { margin: 0; diff --git a/js/src/ui/Actionbar/actionbar.css b/js/src/ui/Actionbar/actionbar.css index 411ca810e74..e2569cdb94f 100644 --- a/js/src/ui/Actionbar/actionbar.css +++ b/js/src/ui/Actionbar/actionbar.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .actionbar { padding: 0.5em 24px !important; height: auto !important; diff --git a/js/src/ui/Actionbar/actionbar.js b/js/src/ui/Actionbar/actionbar.js index 8ba8b551cd4..d2efe126c16 100644 --- a/js/src/ui/Actionbar/actionbar.js +++ b/js/src/ui/Actionbar/actionbar.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { Toolbar, ToolbarGroup, ToolbarTitle } from 'material-ui/Toolbar'; diff --git a/js/src/ui/Actionbar/index.js b/js/src/ui/Actionbar/index.js index 62b3af19cd6..5955440799d 100644 --- a/js/src/ui/Actionbar/index.js +++ b/js/src/ui/Actionbar/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './actionbar'; diff --git a/js/src/ui/ApiProvider/apiProvider.js b/js/src/ui/ApiProvider/apiProvider.js index db35f3e113e..aa5ed72301b 100644 --- a/js/src/ui/ApiProvider/apiProvider.js +++ b/js/src/ui/ApiProvider/apiProvider.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { Component, PropTypes } from 'react'; export default class ApiProvider extends Component { diff --git a/js/src/ui/ApiProvider/index.js b/js/src/ui/ApiProvider/index.js index 7897c879e94..f92d79a01c3 100644 --- a/js/src/ui/ApiProvider/index.js +++ b/js/src/ui/ApiProvider/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './apiProvider'; diff --git a/js/src/ui/Badge/badge.css b/js/src/ui/Badge/badge.css index 04a694cfe3a..3653bdae86e 100644 --- a/js/src/ui/Badge/badge.css +++ b/js/src/ui/Badge/badge.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .bubble { border-radius: 50%; padding: 3px 5px; diff --git a/js/src/ui/Badge/badge.js b/js/src/ui/Badge/badge.js index 66753544923..1ffd4d83ca0 100644 --- a/js/src/ui/Badge/badge.js +++ b/js/src/ui/Badge/badge.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import styles from './badge.css'; diff --git a/js/src/ui/Badge/index.js b/js/src/ui/Badge/index.js index c7876f0c760..8dc0c9ef0fb 100644 --- a/js/src/ui/Badge/index.js +++ b/js/src/ui/Badge/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './badge'; diff --git a/js/src/ui/Balance/balance.css b/js/src/ui/Balance/balance.css index 99d399d5c39..6f9b7bb21b5 100644 --- a/js/src/ui/Balance/balance.css +++ b/js/src/ui/Balance/balance.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .balances { display: flex; flex-wrap: wrap; diff --git a/js/src/ui/Balance/balance.js b/js/src/ui/Balance/balance.js index 6d41fde45ae..b6318d1a92b 100644 --- a/js/src/ui/Balance/balance.js +++ b/js/src/ui/Balance/balance.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; diff --git a/js/src/ui/Balance/index.js b/js/src/ui/Balance/index.js index 3d9ac265646..24ed7c44e1a 100644 --- a/js/src/ui/Balance/index.js +++ b/js/src/ui/Balance/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './balance'; diff --git a/js/src/ui/Container/Title/index.js b/js/src/ui/Container/Title/index.js index 1e5dcedbfde..8ddd6868351 100644 --- a/js/src/ui/Container/Title/index.js +++ b/js/src/ui/Container/Title/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './title'; diff --git a/js/src/ui/Container/Title/title.css b/js/src/ui/Container/Title/title.css index 340f39f9cd6..d5105d642a0 100644 --- a/js/src/ui/Container/Title/title.css +++ b/js/src/ui/Container/Title/title.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .byline { color: #aaa; } diff --git a/js/src/ui/Container/Title/title.js b/js/src/ui/Container/Title/title.js index c20bce2fd1e..015ccfc4a65 100644 --- a/js/src/ui/Container/Title/title.js +++ b/js/src/ui/Container/Title/title.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { CardTitle } from 'material-ui/Card'; diff --git a/js/src/ui/Container/container.css b/js/src/ui/Container/container.css index 917c696c0e8..ca37dfb76d8 100644 --- a/js/src/ui/Container/container.css +++ b/js/src/ui/Container/container.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .container { padding: 0em 1em 1em 1em; } diff --git a/js/src/ui/Container/container.js b/js/src/ui/Container/container.js index b42786e3295..6e49a98054c 100644 --- a/js/src/ui/Container/container.js +++ b/js/src/ui/Container/container.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { Card } from 'material-ui/Card'; diff --git a/js/src/ui/Container/index.js b/js/src/ui/Container/index.js index 0d60a2fafc8..12d4155aa28 100644 --- a/js/src/ui/Container/index.js +++ b/js/src/ui/Container/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import Title from './Title'; export default from './container.js'; diff --git a/js/src/ui/Errors/actions.js b/js/src/ui/Errors/actions.js index fcbfcb4aab8..de401ccaa66 100644 --- a/js/src/ui/Errors/actions.js +++ b/js/src/ui/Errors/actions.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export function newError (error) { return { type: 'newError', diff --git a/js/src/ui/Errors/errors.js b/js/src/ui/Errors/errors.js index b78b92b2fc6..5b8ff4c18ee 100644 --- a/js/src/ui/Errors/errors.js +++ b/js/src/ui/Errors/errors.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; diff --git a/js/src/ui/Errors/index.js b/js/src/ui/Errors/index.js index d9a9f5862cf..608f22a1df1 100644 --- a/js/src/ui/Errors/index.js +++ b/js/src/ui/Errors/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import errorReducer from './reducers'; import { newError } from './actions'; diff --git a/js/src/ui/Errors/middleware.js b/js/src/ui/Errors/middleware.js index 76aa157ef7b..da660b49ea0 100644 --- a/js/src/ui/Errors/middleware.js +++ b/js/src/ui/Errors/middleware.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { newError } from './actions'; function withError (formatter, type = 'default') { diff --git a/js/src/ui/Errors/reducers.js b/js/src/ui/Errors/reducers.js index a02172dd824..f04a7529d2d 100644 --- a/js/src/ui/Errors/reducers.js +++ b/js/src/ui/Errors/reducers.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + function newError (state, action) { const { error } = action; diff --git a/js/src/ui/Form/FormWrap/formWrap.css b/js/src/ui/Form/FormWrap/formWrap.css index 91cfdf7076a..31a73e6ee9d 100644 --- a/js/src/ui/Form/FormWrap/formWrap.css +++ b/js/src/ui/Form/FormWrap/formWrap.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .stretch { width: 75%; clear: both; diff --git a/js/src/ui/Form/FormWrap/formWrap.js b/js/src/ui/Form/FormWrap/formWrap.js index 79e81e79ab2..ba3f0a9573a 100644 --- a/js/src/ui/Form/FormWrap/formWrap.js +++ b/js/src/ui/Form/FormWrap/formWrap.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import styles from './formWrap.css'; diff --git a/js/src/ui/Form/FormWrap/index.js b/js/src/ui/Form/FormWrap/index.js index b957d641708..97c1b0181d9 100644 --- a/js/src/ui/Form/FormWrap/index.js +++ b/js/src/ui/Form/FormWrap/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './formWrap'; diff --git a/js/src/ui/Form/Input/index.js b/js/src/ui/Form/Input/index.js index ff7b04a2790..3d9d9293e5a 100644 --- a/js/src/ui/Form/Input/index.js +++ b/js/src/ui/Form/Input/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './input'; diff --git a/js/src/ui/Form/Input/input.js b/js/src/ui/Form/Input/input.js index 1aff0bc19e9..4d62f997c00 100644 --- a/js/src/ui/Form/Input/input.js +++ b/js/src/ui/Form/Input/input.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { TextField } from 'material-ui'; diff --git a/js/src/ui/Form/InputAddress/index.js b/js/src/ui/Form/InputAddress/index.js index f7d231068f6..b0bb94c9480 100644 --- a/js/src/ui/Form/InputAddress/index.js +++ b/js/src/ui/Form/InputAddress/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './inputAddress'; diff --git a/js/src/ui/Form/InputAddress/inputAddress.css b/js/src/ui/Form/InputAddress/inputAddress.css index a7ae60bfc3f..d3ac9678ecf 100644 --- a/js/src/ui/Form/InputAddress/inputAddress.css +++ b/js/src/ui/Form/InputAddress/inputAddress.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .container { position: relative; } diff --git a/js/src/ui/Form/InputAddress/inputAddress.js b/js/src/ui/Form/InputAddress/inputAddress.js index 2bbd6888394..19a36f7ad2e 100644 --- a/js/src/ui/Form/InputAddress/inputAddress.js +++ b/js/src/ui/Form/InputAddress/inputAddress.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import Input from '../Input'; diff --git a/js/src/ui/Form/InputAddressSelect/index.js b/js/src/ui/Form/InputAddressSelect/index.js index 5844a89cfdf..19493b1cea2 100644 --- a/js/src/ui/Form/InputAddressSelect/index.js +++ b/js/src/ui/Form/InputAddressSelect/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './inputAddressSelect'; diff --git a/js/src/ui/Form/InputAddressSelect/inputAddressSelect.css b/js/src/ui/Form/InputAddressSelect/inputAddressSelect.css index 212ec96cbdb..2bf334101dc 100644 --- a/js/src/ui/Form/InputAddressSelect/inputAddressSelect.css +++ b/js/src/ui/Form/InputAddressSelect/inputAddressSelect.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .inputselect { position: relative; } diff --git a/js/src/ui/Form/InputAddressSelect/inputAddressSelect.js b/js/src/ui/Form/InputAddressSelect/inputAddressSelect.js index 68175a662bc..50cce72d477 100644 --- a/js/src/ui/Form/InputAddressSelect/inputAddressSelect.js +++ b/js/src/ui/Form/InputAddressSelect/inputAddressSelect.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; diff --git a/js/src/ui/Form/InputInline/index.js b/js/src/ui/Form/InputInline/index.js index a298ceb4ff2..e2a1886bebf 100644 --- a/js/src/ui/Form/InputInline/index.js +++ b/js/src/ui/Form/InputInline/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './inputInline'; diff --git a/js/src/ui/Form/InputInline/inputInline.css b/js/src/ui/Form/InputInline/inputInline.css index 4cc74d62d4f..fc320a3cadd 100644 --- a/js/src/ui/Form/InputInline/inputInline.css +++ b/js/src/ui/Form/InputInline/inputInline.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .inlineedit { cursor: pointer; } diff --git a/js/src/ui/Form/InputInline/inputInline.js b/js/src/ui/Form/InputInline/inputInline.js index 936f68f3d50..bdf5102f085 100644 --- a/js/src/ui/Form/InputInline/inputInline.js +++ b/js/src/ui/Form/InputInline/inputInline.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import Input from '../Input'; diff --git a/js/src/ui/Form/Select/index.js b/js/src/ui/Form/Select/index.js index 826d94545dd..471dad14af3 100644 --- a/js/src/ui/Form/Select/index.js +++ b/js/src/ui/Form/Select/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './select'; diff --git a/js/src/ui/Form/Select/select.js b/js/src/ui/Form/Select/select.js index 107436117c1..75e1ffca9d4 100644 --- a/js/src/ui/Form/Select/select.js +++ b/js/src/ui/Form/Select/select.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { SelectField } from 'material-ui'; diff --git a/js/src/ui/Form/form.css b/js/src/ui/Form/form.css index 995754188dc..d55a22dbc92 100644 --- a/js/src/ui/Form/form.css +++ b/js/src/ui/Form/form.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .form { } diff --git a/js/src/ui/Form/form.js b/js/src/ui/Form/form.js index 8468a8097be..c7e9846375e 100644 --- a/js/src/ui/Form/form.js +++ b/js/src/ui/Form/form.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import styles from './form.css'; diff --git a/js/src/ui/Form/index.js b/js/src/ui/Form/index.js index b8dfd6df169..dadcfe8469e 100644 --- a/js/src/ui/Form/index.js +++ b/js/src/ui/Form/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import FormWrap from './FormWrap'; import Input from './Input'; import InputAddress from './InputAddress'; diff --git a/js/src/ui/IdentityIcon/identityIcon.css b/js/src/ui/IdentityIcon/identityIcon.css index ddb04fa158c..0d25225b828 100644 --- a/js/src/ui/IdentityIcon/identityIcon.css +++ b/js/src/ui/IdentityIcon/identityIcon.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .icon { border-radius: 50%; margin: 0; diff --git a/js/src/ui/IdentityIcon/identityIcon.js b/js/src/ui/IdentityIcon/identityIcon.js index 9f48233fece..4aa1eb3c9ba 100644 --- a/js/src/ui/IdentityIcon/identityIcon.js +++ b/js/src/ui/IdentityIcon/identityIcon.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import styles from './identityIcon.css'; diff --git a/js/src/ui/IdentityIcon/index.js b/js/src/ui/IdentityIcon/index.js index 51b592d3146..76c107bfb75 100644 --- a/js/src/ui/IdentityIcon/index.js +++ b/js/src/ui/IdentityIcon/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './identityIcon'; diff --git a/js/src/ui/Modal/ModalSteps/index.js b/js/src/ui/Modal/ModalSteps/index.js index 4ac9ea401d8..1f98686271d 100644 --- a/js/src/ui/Modal/ModalSteps/index.js +++ b/js/src/ui/Modal/ModalSteps/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './modalSteps'; diff --git a/js/src/ui/Modal/ModalSteps/modalSteps.css b/js/src/ui/Modal/ModalSteps/modalSteps.css index 2c9faf8b980..ccae6654500 100644 --- a/js/src/ui/Modal/ModalSteps/modalSteps.css +++ b/js/src/ui/Modal/ModalSteps/modalSteps.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .title { padding: 1em 1em 0 1em; background: rgba(0, 0, 0, 0.175); diff --git a/js/src/ui/Modal/ModalSteps/modalSteps.js b/js/src/ui/Modal/ModalSteps/modalSteps.js index 967c4ef2936..80745e9828d 100644 --- a/js/src/ui/Modal/ModalSteps/modalSteps.js +++ b/js/src/ui/Modal/ModalSteps/modalSteps.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { Step, Stepper, StepLabel } from 'material-ui/Stepper'; diff --git a/js/src/ui/Modal/index.js b/js/src/ui/Modal/index.js index 2d77d4d6d03..1e75d9fd896 100644 --- a/js/src/ui/Modal/index.js +++ b/js/src/ui/Modal/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './modal'; diff --git a/js/src/ui/Modal/modal.js b/js/src/ui/Modal/modal.js index d84d3eb45da..064a5d54568 100644 --- a/js/src/ui/Modal/modal.js +++ b/js/src/ui/Modal/modal.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { Dialog } from 'material-ui'; diff --git a/js/src/ui/Page/index.js b/js/src/ui/Page/index.js index 13280f7cbeb..0ddc533d400 100644 --- a/js/src/ui/Page/index.js +++ b/js/src/ui/Page/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './page'; diff --git a/js/src/ui/Page/page.css b/js/src/ui/Page/page.css index e5f1651f504..379d5095ab0 100644 --- a/js/src/ui/Page/page.css +++ b/js/src/ui/Page/page.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .layout { padding: 0em 3em; } diff --git a/js/src/ui/Page/page.js b/js/src/ui/Page/page.js index d7d2e5c4f91..867c3fdf16b 100644 --- a/js/src/ui/Page/page.js +++ b/js/src/ui/Page/page.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import styles from './page.css'; diff --git a/js/src/ui/SignerIcon/index.js b/js/src/ui/SignerIcon/index.js index 5af9c3ddcae..0a871e6b288 100644 --- a/js/src/ui/SignerIcon/index.js +++ b/js/src/ui/SignerIcon/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './signerIcon'; diff --git a/js/src/ui/SignerIcon/signerIcon.js b/js/src/ui/SignerIcon/signerIcon.js index 4a7713ef7a4..82b3207848a 100644 --- a/js/src/ui/SignerIcon/signerIcon.js +++ b/js/src/ui/SignerIcon/signerIcon.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { keccak_256 } from 'js-sha3'; // eslint-disable-line camelcase import ActionFingerprint from 'material-ui/svg-icons/action/fingerprint'; diff --git a/js/src/ui/Theme/index.js b/js/src/ui/Theme/index.js index 619273d1751..ba15b212bff 100644 --- a/js/src/ui/Theme/index.js +++ b/js/src/ui/Theme/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './theme'; diff --git a/js/src/ui/Theme/theme.js b/js/src/ui/Theme/theme.js index 139d4528b91..3f5a360cce3 100644 --- a/js/src/ui/Theme/theme.js +++ b/js/src/ui/Theme/theme.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import getMuiTheme from 'material-ui/styles/getMuiTheme'; import darkBaseTheme from 'material-ui/styles/baseThemes/darkBaseTheme'; import lightBaseTheme from 'material-ui/styles/baseThemes/lightBaseTheme'; diff --git a/js/src/ui/Tooltips/Tooltip/index.js b/js/src/ui/Tooltips/Tooltip/index.js index 7819891f326..f24757da211 100644 --- a/js/src/ui/Tooltips/Tooltip/index.js +++ b/js/src/ui/Tooltips/Tooltip/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './tooltip'; diff --git a/js/src/ui/Tooltips/Tooltip/tooltip.js b/js/src/ui/Tooltips/Tooltip/tooltip.js index facb1e90d3e..c2718ef067c 100644 --- a/js/src/ui/Tooltips/Tooltip/tooltip.js +++ b/js/src/ui/Tooltips/Tooltip/tooltip.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; diff --git a/js/src/ui/Tooltips/actions.js b/js/src/ui/Tooltips/actions.js index a2926d35f6c..fba250fd7fd 100644 --- a/js/src/ui/Tooltips/actions.js +++ b/js/src/ui/Tooltips/actions.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export function newTooltip (newId) { return { type: 'newTooltip', diff --git a/js/src/ui/Tooltips/index.js b/js/src/ui/Tooltips/index.js index addd1f753dc..6edea3a3211 100644 --- a/js/src/ui/Tooltips/index.js +++ b/js/src/ui/Tooltips/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import Tooltip from './Tooltip'; import tooltipReducer from './reducers'; diff --git a/js/src/ui/Tooltips/reducers.js b/js/src/ui/Tooltips/reducers.js index 3661e012ae2..4a1d2619b5e 100644 --- a/js/src/ui/Tooltips/reducers.js +++ b/js/src/ui/Tooltips/reducers.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + const LS_KEY = 'tooltips'; let currentId = -1; diff --git a/js/src/ui/Tooltips/tooltips.css b/js/src/ui/Tooltips/tooltips.css index f7f7b10808c..b5b0f361c20 100644 --- a/js/src/ui/Tooltips/tooltips.css +++ b/js/src/ui/Tooltips/tooltips.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .container { height: 100%; width: 100%; diff --git a/js/src/ui/Tooltips/tooltips.js b/js/src/ui/Tooltips/tooltips.js index 5f84c2f7790..70160a3245b 100644 --- a/js/src/ui/Tooltips/tooltips.js +++ b/js/src/ui/Tooltips/tooltips.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; diff --git a/js/src/ui/index.js b/js/src/ui/index.js index 763ecf8fd0b..c6c8dad32a6 100644 --- a/js/src/ui/index.js +++ b/js/src/ui/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import Actionbar from './Actionbar'; import ApiProvider from './ApiProvider'; import Badge from './Badge'; diff --git a/js/src/util/abi/index.js b/js/src/util/abi/index.js index 9a897f7aa32..2ce929617b2 100644 --- a/js/src/util/abi/index.js +++ b/js/src/util/abi/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import ABI_EIP20 from './eip20.json'; import ABI_REGISTRY from './registry.json'; import ABI_TOKENREG from './tokenreg.json'; diff --git a/js/src/util/validation.js b/js/src/util/validation.js index b15e57a78a3..aadb4a31d17 100644 --- a/js/src/util/validation.js +++ b/js/src/util/validation.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import format from '../api/format'; export const ERRORS = { diff --git a/js/src/views/Account/Header/header.css b/js/src/views/Account/Header/header.css index 55bddf47826..8d08c3e7302 100644 --- a/js/src/views/Account/Header/header.css +++ b/js/src/views/Account/Header/header.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .balances { clear: both; } diff --git a/js/src/views/Account/Header/header.js b/js/src/views/Account/Header/header.js index ed9d948b543..8638561c337 100644 --- a/js/src/views/Account/Header/header.js +++ b/js/src/views/Account/Header/header.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import ContentCreate from 'material-ui/svg-icons/content/create'; diff --git a/js/src/views/Account/Header/index.js b/js/src/views/Account/Header/index.js index 91aac2ba57b..4a51219067e 100644 --- a/js/src/views/Account/Header/index.js +++ b/js/src/views/Account/Header/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './header'; diff --git a/js/src/views/Account/Transactions/index.js b/js/src/views/Account/Transactions/index.js index 0fc97ce2f42..f74dcd5e8b7 100644 --- a/js/src/views/Account/Transactions/index.js +++ b/js/src/views/Account/Transactions/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './transactions'; diff --git a/js/src/views/Account/Transactions/transactions.css b/js/src/views/Account/Transactions/transactions.css index 7d9cbdbbbe4..fec36696a52 100644 --- a/js/src/views/Account/Transactions/transactions.css +++ b/js/src/views/Account/Transactions/transactions.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .right { text-align: right; } diff --git a/js/src/views/Account/Transactions/transactions.js b/js/src/views/Account/Transactions/transactions.js index 9941d494f64..a1bd42065e2 100644 --- a/js/src/views/Account/Transactions/transactions.js +++ b/js/src/views/Account/Transactions/transactions.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; diff --git a/js/src/views/Account/account.css b/js/src/views/Account/account.css index e35b8d2b177..dfbd2fd7a72 100644 --- a/js/src/views/Account/account.css +++ b/js/src/views/Account/account.css @@ -1,2 +1,18 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .account { } diff --git a/js/src/views/Account/account.js b/js/src/views/Account/account.js index 1e2342bfa1c..28ae3b64635 100644 --- a/js/src/views/Account/account.js +++ b/js/src/views/Account/account.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; diff --git a/js/src/views/Account/index.js b/js/src/views/Account/index.js index 4a50165b949..55c215f7c94 100644 --- a/js/src/views/Account/index.js +++ b/js/src/views/Account/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './account'; diff --git a/js/src/views/Accounts/List/index.js b/js/src/views/Accounts/List/index.js index f85725446e1..11950acfa4a 100644 --- a/js/src/views/Accounts/List/index.js +++ b/js/src/views/Accounts/List/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './list'; diff --git a/js/src/views/Accounts/List/list.css b/js/src/views/Accounts/List/list.css index f82ecd36635..6258c7cd1c5 100644 --- a/js/src/views/Accounts/List/list.css +++ b/js/src/views/Accounts/List/list.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .list { display: flex; flex-wrap: wrap; diff --git a/js/src/views/Accounts/List/list.js b/js/src/views/Accounts/List/list.js index 31a0d1737d3..3f320f7a41b 100644 --- a/js/src/views/Accounts/List/list.js +++ b/js/src/views/Accounts/List/list.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { Container } from '../../../ui'; diff --git a/js/src/views/Accounts/Summary/index.js b/js/src/views/Accounts/Summary/index.js index 83eeac5270d..7cc23b215d3 100644 --- a/js/src/views/Accounts/Summary/index.js +++ b/js/src/views/Accounts/Summary/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './summary'; diff --git a/js/src/views/Accounts/Summary/summary.js b/js/src/views/Accounts/Summary/summary.js index 0b48019c1c3..68d0563cf4e 100644 --- a/js/src/views/Accounts/Summary/summary.js +++ b/js/src/views/Accounts/Summary/summary.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { Link } from 'react-router'; diff --git a/js/src/views/Accounts/accounts.css b/js/src/views/Accounts/accounts.css index 24b48ddb818..f98a09ea3e9 100644 --- a/js/src/views/Accounts/accounts.css +++ b/js/src/views/Accounts/accounts.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .accounts { } diff --git a/js/src/views/Accounts/accounts.js b/js/src/views/Accounts/accounts.js index b465553af35..3a2091e94cd 100644 --- a/js/src/views/Accounts/accounts.js +++ b/js/src/views/Accounts/accounts.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; diff --git a/js/src/views/Accounts/index.js b/js/src/views/Accounts/index.js index 09e26c97282..e9be1d55733 100644 --- a/js/src/views/Accounts/index.js +++ b/js/src/views/Accounts/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './accounts'; diff --git a/js/src/views/Address/address.css b/js/src/views/Address/address.css index b83b9a7f1a9..29876d9e799 100644 --- a/js/src/views/Address/address.css +++ b/js/src/views/Address/address.css @@ -1,2 +1,18 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .address { } diff --git a/js/src/views/Address/address.js b/js/src/views/Address/address.js index d3e6738b5e6..2365e423c4e 100644 --- a/js/src/views/Address/address.js +++ b/js/src/views/Address/address.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; diff --git a/js/src/views/Address/index.js b/js/src/views/Address/index.js index 49240c5e40e..f97d5b1aedb 100644 --- a/js/src/views/Address/index.js +++ b/js/src/views/Address/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './address'; diff --git a/js/src/views/Addresses/addresses.css b/js/src/views/Addresses/addresses.css index ea66c154935..5dbbe9aec5f 100644 --- a/js/src/views/Addresses/addresses.css +++ b/js/src/views/Addresses/addresses.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .addresses { } diff --git a/js/src/views/Addresses/addresses.js b/js/src/views/Addresses/addresses.js index a10d9cb03c5..1fe0b796ba8 100644 --- a/js/src/views/Addresses/addresses.js +++ b/js/src/views/Addresses/addresses.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; diff --git a/js/src/views/Addresses/index.js b/js/src/views/Addresses/index.js index 6e01dfe244d..97e107c00ac 100644 --- a/js/src/views/Addresses/index.js +++ b/js/src/views/Addresses/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './addresses'; diff --git a/js/src/views/Application/Container/container.js b/js/src/views/Application/Container/container.js index 83fe34fb845..3ba23930c73 100644 --- a/js/src/views/Application/Container/container.js +++ b/js/src/views/Application/Container/container.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { FirstRun } from '../../../modals'; diff --git a/js/src/views/Application/Container/index.js b/js/src/views/Application/Container/index.js index 9f6c229eb84..87fbc567ef2 100644 --- a/js/src/views/Application/Container/index.js +++ b/js/src/views/Application/Container/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './container'; diff --git a/js/src/views/Application/DappContainer/dappContainer.js b/js/src/views/Application/DappContainer/dappContainer.js index 624cb647b81..deff12c9d7f 100644 --- a/js/src/views/Application/DappContainer/dappContainer.js +++ b/js/src/views/Application/DappContainer/dappContainer.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import ParityBar from '../../ParityBar'; diff --git a/js/src/views/Application/DappContainer/index.js b/js/src/views/Application/DappContainer/index.js index 250f184aa0e..21837d4b1a4 100644 --- a/js/src/views/Application/DappContainer/index.js +++ b/js/src/views/Application/DappContainer/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './dappContainer'; diff --git a/js/src/views/Application/FrameError/frameError.css b/js/src/views/Application/FrameError/frameError.css index 2c7906d42ef..0cec767ba7d 100644 --- a/js/src/views/Application/FrameError/frameError.css +++ b/js/src/views/Application/FrameError/frameError.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .error { padding: 2em; background: red; diff --git a/js/src/views/Application/FrameError/frameError.js b/js/src/views/Application/FrameError/frameError.js index 14f91c3212e..35d2493b0f3 100644 --- a/js/src/views/Application/FrameError/frameError.js +++ b/js/src/views/Application/FrameError/frameError.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component } from 'react'; import styles from './frameError.css'; diff --git a/js/src/views/Application/FrameError/index.js b/js/src/views/Application/FrameError/index.js index 54a3231ea0e..e4358d46d42 100644 --- a/js/src/views/Application/FrameError/index.js +++ b/js/src/views/Application/FrameError/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './frameError'; diff --git a/js/src/views/Application/Status/index.js b/js/src/views/Application/Status/index.js index 60aae301478..44079b22485 100644 --- a/js/src/views/Application/Status/index.js +++ b/js/src/views/Application/Status/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './status'; diff --git a/js/src/views/Application/Status/status.css b/js/src/views/Application/Status/status.css index 92a1d093723..c8f81d0e63d 100644 --- a/js/src/views/Application/Status/status.css +++ b/js/src/views/Application/Status/status.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .status { clear: both; padding: 1em; diff --git a/js/src/views/Application/Status/status.js b/js/src/views/Application/Status/status.js index 59569c00260..10f4b18b56f 100644 --- a/js/src/views/Application/Status/status.js +++ b/js/src/views/Application/Status/status.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; diff --git a/js/src/views/Application/TabBar/index.js b/js/src/views/Application/TabBar/index.js index 1a0535838e8..d1a5eacbe57 100644 --- a/js/src/views/Application/TabBar/index.js +++ b/js/src/views/Application/TabBar/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './tabBar'; diff --git a/js/src/views/Application/TabBar/tabBar.css b/js/src/views/Application/TabBar/tabBar.css index 8eeaae89106..c79ae90c998 100644 --- a/js/src/views/Application/TabBar/tabBar.css +++ b/js/src/views/Application/TabBar/tabBar.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .toolbar { background: rgb(65, 65, 65) !important; height: 72px !important; diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index 8a84cab0905..e9d82317804 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { Toolbar, ToolbarGroup } from 'material-ui/Toolbar'; import { Tabs, Tab } from 'material-ui/Tabs'; diff --git a/js/src/views/Application/application.css b/js/src/views/Application/application.css index 7303f2ab110..a1cde11ea46 100644 --- a/js/src/views/Application/application.css +++ b/js/src/views/Application/application.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .container { height: 100%; width: 100%; diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index 4aa26d73fee..229314d95db 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; diff --git a/js/src/views/Application/index.js b/js/src/views/Application/index.js index e586e404a90..236578226a8 100644 --- a/js/src/views/Application/index.js +++ b/js/src/views/Application/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './application'; diff --git a/js/src/views/Contract/contract.css b/js/src/views/Contract/contract.css index 5f90fbb74c2..d1b6626b0b0 100644 --- a/js/src/views/Contract/contract.css +++ b/js/src/views/Contract/contract.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .methods { display: flex; flex-wrap: wrap; diff --git a/js/src/views/Contract/contract.js b/js/src/views/Contract/contract.js index 099b2d4b142..5acb225c14b 100644 --- a/js/src/views/Contract/contract.js +++ b/js/src/views/Contract/contract.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import Container from '../../ui/Container'; diff --git a/js/src/views/Contract/index.js b/js/src/views/Contract/index.js index 4834a374db7..18051a69f91 100644 --- a/js/src/views/Contract/index.js +++ b/js/src/views/Contract/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './contract'; diff --git a/js/src/views/Contracts/Summary/index.js b/js/src/views/Contracts/Summary/index.js index 83eeac5270d..7cc23b215d3 100644 --- a/js/src/views/Contracts/Summary/index.js +++ b/js/src/views/Contracts/Summary/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './summary'; diff --git a/js/src/views/Contracts/Summary/summary.js b/js/src/views/Contracts/Summary/summary.js index 9e06118c928..4d93ba2332d 100644 --- a/js/src/views/Contracts/Summary/summary.js +++ b/js/src/views/Contracts/Summary/summary.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { Link } from 'react-router'; diff --git a/js/src/views/Contracts/contracts.css b/js/src/views/Contracts/contracts.css index b6957859b79..26b9e952b69 100644 --- a/js/src/views/Contracts/contracts.css +++ b/js/src/views/Contracts/contracts.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .contracts { display: flex; flex-wrap: wrap; diff --git a/js/src/views/Contracts/contracts.js b/js/src/views/Contracts/contracts.js index a81b92546ad..45d10eefe3d 100644 --- a/js/src/views/Contracts/contracts.js +++ b/js/src/views/Contracts/contracts.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import Summary from './Summary'; diff --git a/js/src/views/Contracts/index.js b/js/src/views/Contracts/index.js index d7e79911f96..075837ce651 100644 --- a/js/src/views/Contracts/index.js +++ b/js/src/views/Contracts/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './contracts'; diff --git a/js/src/views/Dapp/dapp.css b/js/src/views/Dapp/dapp.css index a675151b44a..624437c440a 100644 --- a/js/src/views/Dapp/dapp.css +++ b/js/src/views/Dapp/dapp.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .frame { border: 0; height: 100%; diff --git a/js/src/views/Dapp/dapp.js b/js/src/views/Dapp/dapp.js index abe6292b093..306fe5dc82e 100644 --- a/js/src/views/Dapp/dapp.js +++ b/js/src/views/Dapp/dapp.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import styles from './dapp.css'; diff --git a/js/src/views/Dapp/index.js b/js/src/views/Dapp/index.js index 1a6b0393e44..6fbb5df2738 100644 --- a/js/src/views/Dapp/index.js +++ b/js/src/views/Dapp/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './dapp'; diff --git a/js/src/views/Dapps/Summary/index.js b/js/src/views/Dapps/Summary/index.js index 83eeac5270d..7cc23b215d3 100644 --- a/js/src/views/Dapps/Summary/index.js +++ b/js/src/views/Dapps/Summary/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './summary'; diff --git a/js/src/views/Dapps/Summary/summary.js b/js/src/views/Dapps/Summary/summary.js index 5dda1903340..43377be5fd7 100644 --- a/js/src/views/Dapps/Summary/summary.js +++ b/js/src/views/Dapps/Summary/summary.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { Link } from 'react-router'; diff --git a/js/src/views/Dapps/dapps.css b/js/src/views/Dapps/dapps.css index b6957859b79..26b9e952b69 100644 --- a/js/src/views/Dapps/dapps.css +++ b/js/src/views/Dapps/dapps.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .contracts { display: flex; flex-wrap: wrap; diff --git a/js/src/views/Dapps/dapps.js b/js/src/views/Dapps/dapps.js index 6f12f212a3e..6042556090e 100644 --- a/js/src/views/Dapps/dapps.js +++ b/js/src/views/Dapps/dapps.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; diff --git a/js/src/views/Dapps/index.js b/js/src/views/Dapps/index.js index 30e1dfff368..38a33260f5c 100644 --- a/js/src/views/Dapps/index.js +++ b/js/src/views/Dapps/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './dapps'; diff --git a/js/src/views/ParityBar/index.js b/js/src/views/ParityBar/index.js index a7398e9163c..98cdb674665 100644 --- a/js/src/views/ParityBar/index.js +++ b/js/src/views/ParityBar/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './parityBar'; diff --git a/js/src/views/ParityBar/parityBar.css b/js/src/views/ParityBar/parityBar.css index 4e42d406991..f6e2190926d 100644 --- a/js/src/views/ParityBar/parityBar.css +++ b/js/src/views/ParityBar/parityBar.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .bar, .expanded { position: fixed; bottom: 0; diff --git a/js/src/views/ParityBar/parityBar.js b/js/src/views/ParityBar/parityBar.js index 770d636fdc1..8605892239d 100644 --- a/js/src/views/ParityBar/parityBar.js +++ b/js/src/views/ParityBar/parityBar.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { Link } from 'react-router'; import { connect } from 'react-redux'; diff --git a/js/src/views/Signer/actions/requests.js b/js/src/views/Signer/actions/requests.js index 57ef5ec80ef..5ef21f17817 100644 --- a/js/src/views/Signer/actions/requests.js +++ b/js/src/views/Signer/actions/requests.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { withError } from '../../../redux/util'; import { identity } from '../components/util/util'; diff --git a/js/src/views/Signer/actions/signer.js b/js/src/views/Signer/actions/signer.js index d7f1179c527..58180ef8f1c 100644 --- a/js/src/views/Signer/actions/signer.js +++ b/js/src/views/Signer/actions/signer.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { createAction } from 'redux-actions'; export const updateIsConnected = createAction('update isConnected'); diff --git a/js/src/views/Signer/components/Account/Account.css b/js/src/views/Signer/components/Account/Account.css index e4818fc7927..c1695587c1f 100644 --- a/js/src/views/Signer/components/Account/Account.css +++ b/js/src/views/Signer/components/Account/Account.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .acc { text-align: center; display: inline-block; diff --git a/js/src/views/Signer/components/Account/Account.js b/js/src/views/Signer/components/Account/Account.js index 2068065def3..65a3c7169cd 100644 --- a/js/src/views/Signer/components/Account/Account.js +++ b/js/src/views/Signer/components/Account/Account.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; diff --git a/js/src/views/Signer/components/Account/AccountLink/AccountLink.css b/js/src/views/Signer/components/Account/AccountLink/AccountLink.css index 1e27734b420..e7489895da8 100644 --- a/js/src/views/Signer/components/Account/AccountLink/AccountLink.css +++ b/js/src/views/Signer/components/Account/AccountLink/AccountLink.css @@ -1,4 +1,20 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .container { text-decoration: none; color: inherit; -} \ No newline at end of file +} diff --git a/js/src/views/Signer/components/Account/AccountLink/AccountLink.js b/js/src/views/Signer/components/Account/AccountLink/AccountLink.js index 8ac2baecac1..8cf041fda74 100644 --- a/js/src/views/Signer/components/Account/AccountLink/AccountLink.js +++ b/js/src/views/Signer/components/Account/AccountLink/AccountLink.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { getAccountLink } from '../../util/account'; diff --git a/js/src/views/Signer/components/Account/AccountLink/index.js b/js/src/views/Signer/components/Account/AccountLink/index.js index 5604e3d48ef..90ae8634a1f 100644 --- a/js/src/views/Signer/components/Account/AccountLink/index.js +++ b/js/src/views/Signer/components/Account/AccountLink/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './AccountLink'; diff --git a/js/src/views/Signer/components/Account/index.js b/js/src/views/Signer/components/Account/index.js index c394212a501..c42a8a81038 100644 --- a/js/src/views/Signer/components/Account/index.js +++ b/js/src/views/Signer/components/Account/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './Account'; diff --git a/js/src/views/Signer/components/RequestFinishedWeb3/RequestFinishedWeb3.js b/js/src/views/Signer/components/RequestFinishedWeb3/RequestFinishedWeb3.js index 60c950b5102..9f42175c741 100644 --- a/js/src/views/Signer/components/RequestFinishedWeb3/RequestFinishedWeb3.js +++ b/js/src/views/Signer/components/RequestFinishedWeb3/RequestFinishedWeb3.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import TransactionFinishedWeb3 from '../TransactionFinishedWeb3'; diff --git a/js/src/views/Signer/components/RequestFinishedWeb3/index.js b/js/src/views/Signer/components/RequestFinishedWeb3/index.js index 915ab789bf0..bcf7341bb28 100644 --- a/js/src/views/Signer/components/RequestFinishedWeb3/index.js +++ b/js/src/views/Signer/components/RequestFinishedWeb3/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './RequestFinishedWeb3'; diff --git a/js/src/views/Signer/components/RequestPendingWeb3/RequestPendingWeb3.js b/js/src/views/Signer/components/RequestPendingWeb3/RequestPendingWeb3.js index ab494740159..e2052031992 100644 --- a/js/src/views/Signer/components/RequestPendingWeb3/RequestPendingWeb3.js +++ b/js/src/views/Signer/components/RequestPendingWeb3/RequestPendingWeb3.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import TransactionPendingWeb3 from '../TransactionPendingWeb3'; diff --git a/js/src/views/Signer/components/RequestPendingWeb3/index.js b/js/src/views/Signer/components/RequestPendingWeb3/index.js index ecc4053ae90..f664b571cb8 100644 --- a/js/src/views/Signer/components/RequestPendingWeb3/index.js +++ b/js/src/views/Signer/components/RequestPendingWeb3/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './RequestPendingWeb3'; diff --git a/js/src/views/Signer/components/SignRequest/SignRequest.css b/js/src/views/Signer/components/SignRequest/SignRequest.css index 537dbb25d74..d29b45947f3 100644 --- a/js/src/views/Signer/components/SignRequest/SignRequest.css +++ b/js/src/views/Signer/components/SignRequest/SignRequest.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .container { padding: 25px 0 15px; } diff --git a/js/src/views/Signer/components/SignRequest/SignRequest.js b/js/src/views/Signer/components/SignRequest/SignRequest.js index e9c64f750d0..f67f5074ef9 100644 --- a/js/src/views/Signer/components/SignRequest/SignRequest.js +++ b/js/src/views/Signer/components/SignRequest/SignRequest.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import Account from '../Account'; diff --git a/js/src/views/Signer/components/SignRequest/index.js b/js/src/views/Signer/components/SignRequest/index.js index d54140c6c14..4aec1d19c9a 100644 --- a/js/src/views/Signer/components/SignRequest/index.js +++ b/js/src/views/Signer/components/SignRequest/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './SignRequest'; diff --git a/js/src/views/Signer/components/SignRequestWeb3/SignRequestWeb3.js b/js/src/views/Signer/components/SignRequestWeb3/SignRequestWeb3.js index e7b22421b4a..5913aa9a309 100644 --- a/js/src/views/Signer/components/SignRequestWeb3/SignRequestWeb3.js +++ b/js/src/views/Signer/components/SignRequestWeb3/SignRequestWeb3.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import SignRequest from '../SignRequest'; diff --git a/js/src/views/Signer/components/SignRequestWeb3/index.js b/js/src/views/Signer/components/SignRequestWeb3/index.js index db8576565cf..d07d1d7e331 100644 --- a/js/src/views/Signer/components/SignRequestWeb3/index.js +++ b/js/src/views/Signer/components/SignRequestWeb3/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './SignRequestWeb3'; diff --git a/js/src/views/Signer/components/TransactionFinished/TransactionFinished.css b/js/src/views/Signer/components/TransactionFinished/TransactionFinished.css index 3c8a7aa818a..8c2b0244a2d 100644 --- a/js/src/views/Signer/components/TransactionFinished/TransactionFinished.css +++ b/js/src/views/Signer/components/TransactionFinished/TransactionFinished.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .container { padding: 25px 0 15px; } diff --git a/js/src/views/Signer/components/TransactionFinished/TransactionFinished.js b/js/src/views/Signer/components/TransactionFinished/TransactionFinished.js index b4e977670d3..7e9249b1b14 100644 --- a/js/src/views/Signer/components/TransactionFinished/TransactionFinished.js +++ b/js/src/views/Signer/components/TransactionFinished/TransactionFinished.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import TransactionMainDetails from '../TransactionMainDetails'; diff --git a/js/src/views/Signer/components/TransactionFinished/index.js b/js/src/views/Signer/components/TransactionFinished/index.js index d6a25956232..fe606e1d40f 100644 --- a/js/src/views/Signer/components/TransactionFinished/index.js +++ b/js/src/views/Signer/components/TransactionFinished/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './TransactionFinished'; diff --git a/js/src/views/Signer/components/TransactionFinishedWeb3/TransactionFinishedWeb3.js b/js/src/views/Signer/components/TransactionFinishedWeb3/TransactionFinishedWeb3.js index 1b0db2c04ff..0f23fbbeab0 100644 --- a/js/src/views/Signer/components/TransactionFinishedWeb3/TransactionFinishedWeb3.js +++ b/js/src/views/Signer/components/TransactionFinishedWeb3/TransactionFinishedWeb3.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import TransactionFinished from '../TransactionFinished'; diff --git a/js/src/views/Signer/components/TransactionFinishedWeb3/index.js b/js/src/views/Signer/components/TransactionFinishedWeb3/index.js index 7ca36900b97..2638e8eabd6 100644 --- a/js/src/views/Signer/components/TransactionFinishedWeb3/index.js +++ b/js/src/views/Signer/components/TransactionFinishedWeb3/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './TransactionFinishedWeb3'; diff --git a/js/src/views/Signer/components/TransactionMainDetails/TransactionMainDetails.css b/js/src/views/Signer/components/TransactionMainDetails/TransactionMainDetails.css index 72bf94dc598..2b898c64b70 100644 --- a/js/src/views/Signer/components/TransactionMainDetails/TransactionMainDetails.css +++ b/js/src/views/Signer/components/TransactionMainDetails/TransactionMainDetails.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .transaction { } diff --git a/js/src/views/Signer/components/TransactionMainDetails/TransactionMainDetails.js b/js/src/views/Signer/components/TransactionMainDetails/TransactionMainDetails.js index e96e9aff27e..447a4a5933a 100644 --- a/js/src/views/Signer/components/TransactionMainDetails/TransactionMainDetails.js +++ b/js/src/views/Signer/components/TransactionMainDetails/TransactionMainDetails.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import ContractIcon from 'material-ui/svg-icons/action/code'; diff --git a/js/src/views/Signer/components/TransactionMainDetails/index.js b/js/src/views/Signer/components/TransactionMainDetails/index.js index ee3c3c40367..f7b053acd3c 100644 --- a/js/src/views/Signer/components/TransactionMainDetails/index.js +++ b/js/src/views/Signer/components/TransactionMainDetails/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './TransactionMainDetails'; diff --git a/js/src/views/Signer/components/TransactionPending/TransactionPending.css b/js/src/views/Signer/components/TransactionPending/TransactionPending.css index 01888e06692..fd8bc51295e 100644 --- a/js/src/views/Signer/components/TransactionPending/TransactionPending.css +++ b/js/src/views/Signer/components/TransactionPending/TransactionPending.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .container { padding: 25px 0 15px; } diff --git a/js/src/views/Signer/components/TransactionPending/TransactionPending.js b/js/src/views/Signer/components/TransactionPending/TransactionPending.js index 55529f5dbe7..3b1897350fd 100644 --- a/js/src/views/Signer/components/TransactionPending/TransactionPending.js +++ b/js/src/views/Signer/components/TransactionPending/TransactionPending.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import ReactTooltip from 'react-tooltip'; diff --git a/js/src/views/Signer/components/TransactionPending/index.js b/js/src/views/Signer/components/TransactionPending/index.js index 956af9b0e08..1916d05713d 100644 --- a/js/src/views/Signer/components/TransactionPending/index.js +++ b/js/src/views/Signer/components/TransactionPending/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './TransactionPending'; diff --git a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.css b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.css index e19ae0db4c0..37c1a8317c2 100644 --- a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.css +++ b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .container { width: 220px; padding: 20px 40px 0 40px; diff --git a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.js b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.js index e0da942b40c..dca30d86ec9 100644 --- a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.js +++ b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingForm.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import BackIcon from 'material-ui/svg-icons/navigation/arrow-back'; diff --git a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css index 39e618a8140..41871b35d6f 100644 --- a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css +++ b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/TransactionPendingFormConfirm.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .confirmForm { margin-top: -30px; } diff --git a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js index 0a803726c6d..34d2b06385e 100644 --- a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js +++ b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/TransactionPendingFormConfirm.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import RaisedButton from 'material-ui/RaisedButton'; import ReactTooltip from 'react-tooltip'; diff --git a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/index.js b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/index.js index 6debf0bb1f6..ad0f9fd1ff3 100644 --- a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/index.js +++ b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './TransactionPendingFormConfirm'; diff --git a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormReject/TransactionPendingFormReject.css b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormReject/TransactionPendingFormReject.css index 593ae3c80e2..39c7f377a56 100644 --- a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormReject/TransactionPendingFormReject.css +++ b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormReject/TransactionPendingFormReject.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ /* the rejection button itself, once .reject has been pressed */ .rejectButton { display: block !important; @@ -7,4 +23,3 @@ .rejectText { margin-bottom: 10px; } - diff --git a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormReject/TransactionPendingFormReject.js b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormReject/TransactionPendingFormReject.js index ef8887abf63..f5ab082fa93 100644 --- a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormReject/TransactionPendingFormReject.js +++ b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormReject/TransactionPendingFormReject.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import RaisedButton from 'material-ui/RaisedButton'; diff --git a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormReject/index.js b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormReject/index.js index d1d6a16a218..3ac772104a8 100644 --- a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormReject/index.js +++ b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormReject/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './TransactionPendingFormReject'; diff --git a/js/src/views/Signer/components/TransactionPendingForm/index.js b/js/src/views/Signer/components/TransactionPendingForm/index.js index 3b014837ce6..2fe1e903769 100644 --- a/js/src/views/Signer/components/TransactionPendingForm/index.js +++ b/js/src/views/Signer/components/TransactionPendingForm/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './TransactionPendingForm'; diff --git a/js/src/views/Signer/components/TransactionPendingWeb3/TransactionPendingWeb3.js b/js/src/views/Signer/components/TransactionPendingWeb3/TransactionPendingWeb3.js index 2630f736c34..6b51892d9dc 100644 --- a/js/src/views/Signer/components/TransactionPendingWeb3/TransactionPendingWeb3.js +++ b/js/src/views/Signer/components/TransactionPendingWeb3/TransactionPendingWeb3.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import TransactionPending from '../TransactionPending'; diff --git a/js/src/views/Signer/components/TransactionPendingWeb3/index.js b/js/src/views/Signer/components/TransactionPendingWeb3/index.js index 4d7f027ada8..2765bbc1ce1 100644 --- a/js/src/views/Signer/components/TransactionPendingWeb3/index.js +++ b/js/src/views/Signer/components/TransactionPendingWeb3/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './TransactionPendingWeb3'; diff --git a/js/src/views/Signer/components/TxHashLink/TxHashLink.js b/js/src/views/Signer/components/TxHashLink/TxHashLink.js index 13c51276f0a..812c4461d0d 100644 --- a/js/src/views/Signer/components/TxHashLink/TxHashLink.js +++ b/js/src/views/Signer/components/TxHashLink/TxHashLink.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { getTxLink } from '../util/transaction'; diff --git a/js/src/views/Signer/components/TxHashLink/index.js b/js/src/views/Signer/components/TxHashLink/index.js index e7311c33dee..ef71992907d 100644 --- a/js/src/views/Signer/components/TxHashLink/index.js +++ b/js/src/views/Signer/components/TxHashLink/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './TxHashLink'; diff --git a/js/src/views/Signer/components/Web3Compositor/Web3Compositor.js b/js/src/views/Signer/components/Web3Compositor/Web3Compositor.js index 06bc9a41654..1be6d23be75 100644 --- a/js/src/views/Signer/components/Web3Compositor/Web3Compositor.js +++ b/js/src/views/Signer/components/Web3Compositor/Web3Compositor.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + // no need for react since not using JSX import React, { Component, PropTypes } from 'react'; diff --git a/js/src/views/Signer/components/Web3Compositor/index.js b/js/src/views/Signer/components/Web3Compositor/index.js index d6612d21d46..6c977ed2851 100644 --- a/js/src/views/Signer/components/Web3Compositor/index.js +++ b/js/src/views/Signer/components/Web3Compositor/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './Web3Compositor'; diff --git a/js/src/views/Signer/components/Web3Provider/Web3Provider.js b/js/src/views/Signer/components/Web3Provider/Web3Provider.js index 378b3507d8e..2e45233905b 100644 --- a/js/src/views/Signer/components/Web3Provider/Web3Provider.js +++ b/js/src/views/Signer/components/Web3Provider/Web3Provider.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + // no need for react since not using JSX import { Component, PropTypes } from 'react'; diff --git a/js/src/views/Signer/components/Web3Provider/index.js b/js/src/views/Signer/components/Web3Provider/index.js index 84674944c38..7e995a6e1a6 100644 --- a/js/src/views/Signer/components/Web3Provider/index.js +++ b/js/src/views/Signer/components/Web3Provider/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './Web3Provider'; diff --git a/js/src/views/Signer/components/constants/constants.js b/js/src/views/Signer/components/constants/constants.js index eec5c4bbf0f..cced99bf9ff 100644 --- a/js/src/views/Signer/components/constants/constants.js +++ b/js/src/views/Signer/components/constants/constants.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + // after user clicks 'reject' for the first time, // a second reject button is rendered and disabled // for a few seconds to avoid accidential double clicks diff --git a/js/src/views/Signer/components/index.js b/js/src/views/Signer/components/index.js index 103ac81078e..d32a98df016 100644 --- a/js/src/views/Signer/components/index.js +++ b/js/src/views/Signer/components/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export RequestFinishedWeb3 from './RequestFinishedWeb3'; export RequestPendingWeb3 from './RequestPendingWeb3'; export web3Extension from './util/web3.extensions'; diff --git a/js/src/views/Signer/components/util/Web3WebSocketProvider/Web3WebSocketProvider.js b/js/src/views/Signer/components/util/Web3WebSocketProvider/Web3WebSocketProvider.js index ec56c2c2bfa..3bb501f8290 100644 --- a/js/src/views/Signer/components/util/Web3WebSocketProvider/Web3WebSocketProvider.js +++ b/js/src/views/Signer/components/util/Web3WebSocketProvider/Web3WebSocketProvider.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + /* global WebSocket */ export default class Web3WebSocketProvider { diff --git a/js/src/views/Signer/components/util/Web3WebSocketProvider/index.js b/js/src/views/Signer/components/util/Web3WebSocketProvider/index.js index df5c7fbbd33..484bd1f3580 100644 --- a/js/src/views/Signer/components/util/Web3WebSocketProvider/index.js +++ b/js/src/views/Signer/components/util/Web3WebSocketProvider/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './Web3WebSocketProvider'; diff --git a/js/src/views/Signer/components/util/account.js b/js/src/views/Signer/components/util/account.js index 79058dbf343..d37f029c107 100644 --- a/js/src/views/Signer/components/util/account.js +++ b/js/src/views/Signer/components/util/account.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { BASE_LINK_ACCOUNT_MORDEN, BASE_LINK_ACCOUNT_HOMESTEAD } from '../constants/constants'; export const getAccountLink = _getAccountLink; diff --git a/js/src/views/Signer/components/util/logger.js b/js/src/views/Signer/components/util/logger.js index ec99c756534..671d4de8460 100644 --- a/js/src/views/Signer/components/util/logger.js +++ b/js/src/views/Signer/components/util/logger.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + const isLogging = process.env.LOGGING; export default logger(); diff --git a/js/src/views/Signer/components/util/react.js b/js/src/views/Signer/components/util/react.js index c5a99c70f5e..095f6e6b0d1 100644 --- a/js/src/views/Signer/components/util/react.js +++ b/js/src/views/Signer/components/util/react.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import { isValidElement } from 'react'; diff --git a/js/src/views/Signer/components/util/transaction.js b/js/src/views/Signer/components/util/transaction.js index b3ab3c176a6..b843b764376 100644 --- a/js/src/views/Signer/components/util/transaction.js +++ b/js/src/views/Signer/components/util/transaction.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; const WEI_TO_ETH_MULTIPLIER = 0.000000000000000001; diff --git a/js/src/views/Signer/components/util/transaction.spec.js b/js/src/views/Signer/components/util/transaction.spec.js index 7ad0bedeea1..af181a7f89a 100644 --- a/js/src/views/Signer/components/util/transaction.spec.js +++ b/js/src/views/Signer/components/util/transaction.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; import { getShortData, getFee, getTotalValue } from './transaction'; diff --git a/js/src/views/Signer/components/util/util.js b/js/src/views/Signer/components/util/util.js index 352c2c539fa..095a78d602d 100644 --- a/js/src/views/Signer/components/util/util.js +++ b/js/src/views/Signer/components/util/util.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . export function toPromise (fn) { return new Promise((resolve, reject) => { diff --git a/js/src/views/Signer/components/util/web3.extensions.js b/js/src/views/Signer/components/util/web3.extensions.js index 604fb4a67d9..acae683bd14 100644 --- a/js/src/views/Signer/components/util/web3.extensions.js +++ b/js/src/views/Signer/components/util/web3.extensions.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default function web3extensions (web3) { const { Method, formatters } = web3._extend; diff --git a/js/src/views/Signer/containers/Embedded/embedded.css b/js/src/views/Signer/containers/Embedded/embedded.css index c32f0050918..ff6f13a2f4d 100644 --- a/js/src/views/Signer/containers/Embedded/embedded.css +++ b/js/src/views/Signer/containers/Embedded/embedded.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .signer { } diff --git a/js/src/views/Signer/containers/Embedded/embedded.js b/js/src/views/Signer/containers/Embedded/embedded.js index d8942d339ea..611f5bbc653 100644 --- a/js/src/views/Signer/containers/Embedded/embedded.js +++ b/js/src/views/Signer/containers/Embedded/embedded.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; diff --git a/js/src/views/Signer/containers/Embedded/index.js b/js/src/views/Signer/containers/Embedded/index.js index 87ddbce7a56..ef42659387c 100644 --- a/js/src/views/Signer/containers/Embedded/index.js +++ b/js/src/views/Signer/containers/Embedded/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './embedded'; diff --git a/js/src/views/Signer/containers/LoadingPage/LoadingPage.css b/js/src/views/Signer/containers/LoadingPage/LoadingPage.css index 87ed92ff48c..8b249275fb0 100644 --- a/js/src/views/Signer/containers/LoadingPage/LoadingPage.css +++ b/js/src/views/Signer/containers/LoadingPage/LoadingPage.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .main { padding: 3em 0; text-align: center; diff --git a/js/src/views/Signer/containers/LoadingPage/LoadingPage.js b/js/src/views/Signer/containers/LoadingPage/LoadingPage.js index c65e5030ad8..561c5f46f13 100644 --- a/js/src/views/Signer/containers/LoadingPage/LoadingPage.js +++ b/js/src/views/Signer/containers/LoadingPage/LoadingPage.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component } from 'react'; import { CircularProgress } from 'material-ui'; diff --git a/js/src/views/Signer/containers/LoadingPage/index.js b/js/src/views/Signer/containers/LoadingPage/index.js index 0c2e8601717..fde867f4c11 100644 --- a/js/src/views/Signer/containers/LoadingPage/index.js +++ b/js/src/views/Signer/containers/LoadingPage/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './LoadingPage'; diff --git a/js/src/views/Signer/containers/OfflinePage/OfflinePage.js b/js/src/views/Signer/containers/OfflinePage/OfflinePage.js index d2db51907ce..22814aed062 100644 --- a/js/src/views/Signer/containers/OfflinePage/OfflinePage.js +++ b/js/src/views/Signer/containers/OfflinePage/OfflinePage.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; diff --git a/js/src/views/Signer/containers/OfflinePage/index.js b/js/src/views/Signer/containers/OfflinePage/index.js index 0dd930cf39f..b18d40367f9 100644 --- a/js/src/views/Signer/containers/OfflinePage/index.js +++ b/js/src/views/Signer/containers/OfflinePage/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './OfflinePage'; diff --git a/js/src/views/Signer/containers/RequestsPage/RequestsPage.css b/js/src/views/Signer/containers/RequestsPage/RequestsPage.css index 7601d261de8..78df744fbd8 100644 --- a/js/src/views/Signer/containers/RequestsPage/RequestsPage.css +++ b/js/src/views/Signer/containers/RequestsPage/RequestsPage.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .request { } diff --git a/js/src/views/Signer/containers/RequestsPage/RequestsPage.js b/js/src/views/Signer/containers/RequestsPage/RequestsPage.js index fefb81a9317..dcbb443708c 100644 --- a/js/src/views/Signer/containers/RequestsPage/RequestsPage.js +++ b/js/src/views/Signer/containers/RequestsPage/RequestsPage.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; import { bindActionCreators } from 'redux'; diff --git a/js/src/views/Signer/containers/RequestsPage/index.js b/js/src/views/Signer/containers/RequestsPage/index.js index 85e6b56ee3a..cb3fdd1439f 100644 --- a/js/src/views/Signer/containers/RequestsPage/index.js +++ b/js/src/views/Signer/containers/RequestsPage/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './RequestsPage'; diff --git a/js/src/views/Signer/containers/UnAuthorizedPage/UnAuthorizedPage.css b/js/src/views/Signer/containers/UnAuthorizedPage/UnAuthorizedPage.css index cf9155547ec..30b6ac03a59 100644 --- a/js/src/views/Signer/containers/UnAuthorizedPage/UnAuthorizedPage.css +++ b/js/src/views/Signer/containers/UnAuthorizedPage/UnAuthorizedPage.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .container { padding: 0; } diff --git a/js/src/views/Signer/containers/UnAuthorizedPage/UnAuthorizedPage.js b/js/src/views/Signer/containers/UnAuthorizedPage/UnAuthorizedPage.js index b18114f61ab..62f15818e2b 100644 --- a/js/src/views/Signer/containers/UnAuthorizedPage/UnAuthorizedPage.js +++ b/js/src/views/Signer/containers/UnAuthorizedPage/UnAuthorizedPage.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; diff --git a/js/src/views/Signer/containers/UnAuthorizedPage/index.js b/js/src/views/Signer/containers/UnAuthorizedPage/index.js index 30b5c5992c6..6f25ac436be 100644 --- a/js/src/views/Signer/containers/UnAuthorizedPage/index.js +++ b/js/src/views/Signer/containers/UnAuthorizedPage/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './UnAuthorizedPage'; diff --git a/js/src/views/Signer/index.js b/js/src/views/Signer/index.js index 5f3cc5b5ed3..ff804fe5b62 100644 --- a/js/src/views/Signer/index.js +++ b/js/src/views/Signer/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import Embedded from './containers/Embedded'; export default from './signer'; diff --git a/js/src/views/Signer/middleware/index.js b/js/src/views/Signer/middleware/index.js index 277b81d13c3..aac44f08c7a 100644 --- a/js/src/views/Signer/middleware/index.js +++ b/js/src/views/Signer/middleware/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + // Middleware classes (except logger) import Ws from './ws'; import Signer from './signer'; diff --git a/js/src/views/Signer/middleware/logger.js b/js/src/views/Signer/middleware/logger.js index 78268cd9bff..2281bf1573b 100644 --- a/js/src/views/Signer/middleware/logger.js +++ b/js/src/views/Signer/middleware/logger.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import logger from '../utils/logger'; export default store => next => action => { diff --git a/js/src/views/Signer/middleware/signer.js b/js/src/views/Signer/middleware/signer.js index 6e2af229a66..9b3033831ca 100644 --- a/js/src/views/Signer/middleware/signer.js +++ b/js/src/views/Signer/middleware/signer.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default class SignerMiddleware { toMiddleware () { return store => next => action => { diff --git a/js/src/views/Signer/middleware/ws.js b/js/src/views/Signer/middleware/ws.js index 1b562514acd..0879d58b8b9 100644 --- a/js/src/views/Signer/middleware/ws.js +++ b/js/src/views/Signer/middleware/ws.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import logger from '../utils/logger'; import * as actions from '../actions/requests'; diff --git a/js/src/views/Signer/providers/index.js b/js/src/views/Signer/providers/index.js index d3452eb3543..4039c693345 100644 --- a/js/src/views/Signer/providers/index.js +++ b/js/src/views/Signer/providers/index.js @@ -1,2 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export SignerDataProvider from './signerDataProvider'; export WsDataProvider from './wsDataProvider'; diff --git a/js/src/views/Signer/providers/signerDataProvider.js b/js/src/views/Signer/providers/signerDataProvider.js index e0103bcdcea..0a7d53255c6 100644 --- a/js/src/views/Signer/providers/signerDataProvider.js +++ b/js/src/views/Signer/providers/signerDataProvider.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import logger from '../utils/logger'; import { updateIsConnected, updateIsNodeRunning } from '../actions/signer'; diff --git a/js/src/views/Signer/providers/wsDataProvider.js b/js/src/views/Signer/providers/wsDataProvider.js index b065b3a5907..195f67ca76a 100644 --- a/js/src/views/Signer/providers/wsDataProvider.js +++ b/js/src/views/Signer/providers/wsDataProvider.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { isEqual } from 'lodash'; import logger from '../utils/logger'; import { updatePendingRequests, updateCompatibilityMode } from '../actions/requests'; diff --git a/js/src/views/Signer/reducers/index.js b/js/src/views/Signer/reducers/index.js index 3ca1a364b2c..73028cd025b 100644 --- a/js/src/views/Signer/reducers/index.js +++ b/js/src/views/Signer/reducers/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { combineReducers } from 'redux'; import { routerReducer as routing } from 'react-router-redux'; import signer from './signer'; diff --git a/js/src/views/Signer/reducers/requests.js b/js/src/views/Signer/reducers/requests.js index 7fa1c14893a..2c46d6d2bf7 100644 --- a/js/src/views/Signer/reducers/requests.js +++ b/js/src/views/Signer/reducers/requests.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import { handleActions } from 'redux-actions'; diff --git a/js/src/views/Signer/reducers/signer.js b/js/src/views/Signer/reducers/signer.js index 7089b7a757a..172124cac70 100644 --- a/js/src/views/Signer/reducers/signer.js +++ b/js/src/views/Signer/reducers/signer.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import { handleActions } from 'redux-actions'; diff --git a/js/src/views/Signer/signer.css b/js/src/views/Signer/signer.css index 5ce74048f65..83d1b800f36 100644 --- a/js/src/views/Signer/signer.css +++ b/js/src/views/Signer/signer.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .signer { } diff --git a/js/src/views/Signer/signer.js b/js/src/views/Signer/signer.js index f28414967ac..05d69eed34a 100644 --- a/js/src/views/Signer/signer.js +++ b/js/src/views/Signer/signer.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; diff --git a/js/src/views/Signer/utils/WebSocketsProvider.js b/js/src/views/Signer/utils/WebSocketsProvider.js index 6b6beb34aec..398bb04e545 100644 --- a/js/src/views/Signer/utils/WebSocketsProvider.js +++ b/js/src/views/Signer/utils/WebSocketsProvider.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default class WebSocketsProvider { constructor (ws) { diff --git a/js/src/views/Signer/utils/Ws.js b/js/src/views/Signer/utils/Ws.js index 9018639b3d7..8c4b3c2dd73 100644 --- a/js/src/views/Signer/utils/Ws.js +++ b/js/src/views/Signer/utils/Ws.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { keccak_256 } from 'js-sha3'; // eslint-disable-line camelcase import logger from './logger'; diff --git a/js/src/views/Signer/utils/extension.js b/js/src/views/Signer/utils/extension.js index d82573b17e1..a99a72d63d2 100644 --- a/js/src/views/Signer/utils/extension.js +++ b/js/src/views/Signer/utils/extension.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export const isExtension = () => { return window.location.protocol.indexOf('chrome-extension:') > -1; }; diff --git a/js/src/views/Signer/utils/index.js b/js/src/views/Signer/utils/index.js index 12a3fb7ccfa..9fba466575b 100644 --- a/js/src/views/Signer/utils/index.js +++ b/js/src/views/Signer/utils/index.js @@ -1,2 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export WebSocketsProvider from './WebSocketsProvider'; export Ws from './Ws'; diff --git a/js/src/views/Signer/utils/logger.js b/js/src/views/Signer/utils/logger.js index 993f8624f6a..a7db0b2f70c 100644 --- a/js/src/views/Signer/utils/logger.js +++ b/js/src/views/Signer/utils/logger.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + // this module disable logging on prod const isLogging = process.env.LOGGING; diff --git a/js/src/views/Signer/utils/parity.js b/js/src/views/Signer/utils/parity.js index ac02e7f6fb4..437c25242e1 100644 --- a/js/src/views/Signer/utils/parity.js +++ b/js/src/views/Signer/utils/parity.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import logger from './logger'; import { isExtension } from './extension'; diff --git a/js/src/views/Signer/utils/utils.js b/js/src/views/Signer/utils/utils.js index a9811d38c72..8c231275c8c 100644 --- a/js/src/views/Signer/utils/utils.js +++ b/js/src/views/Signer/utils/utils.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . export function identity (x) { return x; diff --git a/js/src/views/Status/--remove-store/index.js b/js/src/views/Status/--remove-store/index.js new file mode 100644 index 00000000000..6746f75eb64 --- /dev/null +++ b/js/src/views/Status/--remove-store/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './store'; diff --git a/js/src/views/Status/--remove-store/store.js b/js/src/views/Status/--remove-store/store.js new file mode 100644 index 00000000000..c1e8dde183a --- /dev/null +++ b/js/src/views/Status/--remove-store/store.js @@ -0,0 +1,40 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { createStore, applyMiddleware } from 'redux'; + +import rootReducer from '../reducers'; + +export default function configure (middlewares) { + const create = window.devToolsExtension + ? window.devToolsExtension()(createStore) + : createStore; + + const createStoreWithMiddleware = applyMiddleware( + ...middlewares + )(create); + + const store = createStoreWithMiddleware(rootReducer); + + if (module.hot) { + module.hot.accept('../reducers', () => { + const nextReducer = require('../reducers'); + store.replaceReducer(nextReducer); + }); + } + + return store; +} diff --git a/js/src/views/Status/actions/app.js b/js/src/views/Status/actions/app.js index 15621dd691c..d236dd84630 100644 --- a/js/src/views/Status/actions/app.js +++ b/js/src/views/Status/actions/app.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import { createAction } from 'redux-actions'; diff --git a/js/src/views/Status/actions/clipboard.js b/js/src/views/Status/actions/clipboard.js index 21914ae3f39..732b91d6e90 100644 --- a/js/src/views/Status/actions/clipboard.js +++ b/js/src/views/Status/actions/clipboard.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { createAction } from 'redux-actions'; import { identity } from '../util'; diff --git a/js/src/views/Status/actions/debug.js b/js/src/views/Status/actions/debug.js index a3719f94e21..3cd0c0a43af 100644 --- a/js/src/views/Status/actions/debug.js +++ b/js/src/views/Status/actions/debug.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import { createAction } from 'redux-actions'; diff --git a/js/src/views/Status/actions/localstorage.js b/js/src/views/Status/actions/localstorage.js index 75088953d05..2bf2d284113 100644 --- a/js/src/views/Status/actions/localstorage.js +++ b/js/src/views/Status/actions/localstorage.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import { createAction } from 'redux-actions'; diff --git a/js/src/views/Status/actions/logger.js b/js/src/views/Status/actions/logger.js index 391231120d2..c202efbbc80 100644 --- a/js/src/views/Status/actions/logger.js +++ b/js/src/views/Status/actions/logger.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { createAction } from 'redux-actions'; import { identity } from '../util'; diff --git a/js/src/views/Status/actions/mining.js b/js/src/views/Status/actions/mining.js index 95944a18405..e4854420268 100644 --- a/js/src/views/Status/actions/mining.js +++ b/js/src/views/Status/actions/mining.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import { createAction } from 'redux-actions'; diff --git a/js/src/views/Status/actions/modify-mining.js b/js/src/views/Status/actions/modify-mining.js index cae64c3e4f7..ff959c9f5c2 100644 --- a/js/src/views/Status/actions/modify-mining.js +++ b/js/src/views/Status/actions/modify-mining.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import { createAction } from 'redux-actions'; diff --git a/js/src/views/Status/actions/rpc.js b/js/src/views/Status/actions/rpc.js index cea5ec06c98..bedbb105689 100644 --- a/js/src/views/Status/actions/rpc.js +++ b/js/src/views/Status/actions/rpc.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { createAction } from 'redux-actions'; import { identity } from '../util'; diff --git a/js/src/views/Status/actions/status.js b/js/src/views/Status/actions/status.js index c9e5c34397b..8980e34c493 100644 --- a/js/src/views/Status/actions/status.js +++ b/js/src/views/Status/actions/status.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import { createAction } from 'redux-actions'; diff --git a/js/src/views/Status/components-compositors/Animated/AnimateChildren.css b/js/src/views/Status/components-compositors/Animated/AnimateChildren.css index 5c32516f23a..5d7b5b39ae4 100644 --- a/js/src/views/Status/components-compositors/Animated/AnimateChildren.css +++ b/js/src/views/Status/components-compositors/Animated/AnimateChildren.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ /* todo [adgo] - make local */ :global .transition-appear { opacity: 0.01; diff --git a/js/src/views/Status/components-compositors/Animated/Animated.js b/js/src/views/Status/components-compositors/Animated/Animated.js index 5bf4bbc5502..c22344c0150 100644 --- a/js/src/views/Status/components-compositors/Animated/Animated.js +++ b/js/src/views/Status/components-compositors/Animated/Animated.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import React, { Component } from 'react'; import AnimateChildren from './children'; diff --git a/js/src/views/Status/components-compositors/Animated/children.js b/js/src/views/Status/components-compositors/Animated/children.js index 42c9c2950ed..be7f910bfec 100644 --- a/js/src/views/Status/components-compositors/Animated/children.js +++ b/js/src/views/Status/components-compositors/Animated/children.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import React, { Component, PropTypes } from 'react'; import { isReactComponent } from '../../util/react'; diff --git a/js/src/views/Status/components-compositors/Animated/index.js b/js/src/views/Status/components-compositors/Animated/index.js index c620c98c640..ee48d0704a3 100644 --- a/js/src/views/Status/components-compositors/Animated/index.js +++ b/js/src/views/Status/components-compositors/Animated/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './Animated'; diff --git a/js/src/views/Status/components/--remove-Footer/Footer.css b/js/src/views/Status/components/--remove-Footer/Footer.css index 17f60784c17..b538df8c46a 100644 --- a/js/src/views/Status/components/--remove-Footer/Footer.css +++ b/js/src/views/Status/components/--remove-Footer/Footer.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .footer { position: fixed; bottom: 0; @@ -29,4 +45,4 @@ .off { opacity: .3; -} \ No newline at end of file +} diff --git a/js/src/views/Status/components/--remove-Footer/Footer.js b/js/src/views/Status/components/--remove-Footer/Footer.js index c165609f2db..9057b0433b0 100644 --- a/js/src/views/Status/components/--remove-Footer/Footer.js +++ b/js/src/views/Status/components/--remove-Footer/Footer.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import React, { Component, PropTypes } from 'react'; import IconButton from 'material-ui/IconButton'; diff --git a/js/src/views/Status/components/--remove-Footer/index.js b/js/src/views/Status/components/--remove-Footer/index.js index 6a67aecdeda..8d04903be59 100644 --- a/js/src/views/Status/components/--remove-Footer/index.js +++ b/js/src/views/Status/components/--remove-Footer/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './Footer'; diff --git a/js/src/views/Status/components/--remove-Header/Header.css b/js/src/views/Status/components/--remove-Header/Header.css index 60a563955e3..5f3ddf37494 100644 --- a/js/src/views/Status/components/--remove-Header/Header.css +++ b/js/src/views/Status/components/--remove-Header/Header.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .title { position: relative; top: -8px; diff --git a/js/src/views/Status/components/--remove-Header/Header.js b/js/src/views/Status/components/--remove-Header/Header.js index 69b9a78769d..0b1a2f61f73 100644 --- a/js/src/views/Status/components/--remove-Header/Header.js +++ b/js/src/views/Status/components/--remove-Header/Header.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import { Link } from 'react-router'; import React, { Component, PropTypes } from 'react'; diff --git a/js/src/views/Status/components/--remove-Header/index.js b/js/src/views/Status/components/--remove-Header/index.js index 2509393d237..4fa6f48de6f 100644 --- a/js/src/views/Status/components/--remove-Header/index.js +++ b/js/src/views/Status/components/--remove-Header/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './Header'; diff --git a/js/src/views/Status/components/MuiThemeProvider/MuiThemeProvider.js b/js/src/views/Status/components/--remove-MuiThemeProvider/MuiThemeProvider.js similarity index 57% rename from js/src/views/Status/components/MuiThemeProvider/MuiThemeProvider.js rename to js/src/views/Status/components/--remove-MuiThemeProvider/MuiThemeProvider.js index ea644d48d6e..ea8f7ff04e9 100644 --- a/js/src/views/Status/components/MuiThemeProvider/MuiThemeProvider.js +++ b/js/src/views/Status/components/--remove-MuiThemeProvider/MuiThemeProvider.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import React, { Component, PropTypes } from 'react'; import injectTapEventPlugin from 'react-tap-event-plugin'; diff --git a/js/src/views/Status/components/--remove-MuiThemeProvider/index.js b/js/src/views/Status/components/--remove-MuiThemeProvider/index.js new file mode 100644 index 00000000000..e47f95f6102 --- /dev/null +++ b/js/src/views/Status/components/--remove-MuiThemeProvider/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './MuiThemeProvider'; diff --git a/js/src/views/Status/components/--remove-Value/Value.css b/js/src/views/Status/components/--remove-Value/Value.css index b2c906bc689..8f528631110 100644 --- a/js/src/views/Status/components/--remove-Value/Value.css +++ b/js/src/views/Status/components/--remove-Value/Value.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .value { background: none; margin-top: 0; diff --git a/js/src/views/Status/components/--remove-Value/Value.js b/js/src/views/Status/components/--remove-Value/Value.js index 4650b0d7100..6927fd7685e 100644 --- a/js/src/views/Status/components/--remove-Value/Value.js +++ b/js/src/views/Status/components/--remove-Value/Value.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import React, { Component, PropTypes } from 'react'; diff --git a/js/src/views/Status/components/--remove-Value/index.js b/js/src/views/Status/components/--remove-Value/index.js index a017ab150e3..b56d2bc7821 100644 --- a/js/src/views/Status/components/--remove-Value/index.js +++ b/js/src/views/Status/components/--remove-Value/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './Value'; diff --git a/js/src/views/Status/components/AutoComplete/AutoComplete.js b/js/src/views/Status/components/AutoComplete/AutoComplete.js index 16075ce6795..c16dbd27635 100644 --- a/js/src/views/Status/components/AutoComplete/AutoComplete.js +++ b/js/src/views/Status/components/AutoComplete/AutoComplete.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import AutoComplete from 'material-ui/AutoComplete'; diff --git a/js/src/views/Status/components/AutoComplete/AutoComplete.spec.js b/js/src/views/Status/components/AutoComplete/AutoComplete.spec.js index ba17d502819..046fcfad6c8 100644 --- a/js/src/views/Status/components/AutoComplete/AutoComplete.spec.js +++ b/js/src/views/Status/components/AutoComplete/AutoComplete.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React from 'react'; import { shallow } from 'enzyme'; diff --git a/js/src/views/Status/components/AutoComplete/index.js b/js/src/views/Status/components/AutoComplete/index.js index 28d623ca69b..201b6646e8f 100644 --- a/js/src/views/Status/components/AutoComplete/index.js +++ b/js/src/views/Status/components/AutoComplete/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './AutoComplete'; diff --git a/js/src/views/Status/components/Box/Box.js b/js/src/views/Status/components/Box/Box.js index 6aa02524f3a..c950c0d659c 100644 --- a/js/src/views/Status/components/Box/Box.js +++ b/js/src/views/Status/components/Box/Box.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import React, { Component, PropTypes } from 'react'; diff --git a/js/src/views/Status/components/Box/Box.spec.js b/js/src/views/Status/components/Box/Box.spec.js index 883cb6f533d..0630dc99fc8 100644 --- a/js/src/views/Status/components/Box/Box.spec.js +++ b/js/src/views/Status/components/Box/Box.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React from 'react'; import { shallow } from 'enzyme'; diff --git a/js/src/views/Status/components/Box/index.js b/js/src/views/Status/components/Box/index.js index 24a93be071d..e27e2972453 100644 --- a/js/src/views/Status/components/Box/index.js +++ b/js/src/views/Status/components/Box/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './Box'; diff --git a/js/src/views/Status/components/Call/Call.css b/js/src/views/Status/components/Call/Call.css index 513fa87b65e..e9184490c14 100644 --- a/js/src/views/Status/components/Call/Call.css +++ b/js/src/views/Status/components/Call/Call.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .call { position: relative; border-bottom: 2px solid #CCC6C6; diff --git a/js/src/views/Status/components/Call/Call.js b/js/src/views/Status/components/Call/Call.js index bfa1a4190ed..31d20aa4239 100644 --- a/js/src/views/Status/components/Call/Call.js +++ b/js/src/views/Status/components/Call/Call.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import Response from '../Response'; diff --git a/js/src/views/Status/components/Call/Call.spec.js b/js/src/views/Status/components/Call/Call.spec.js index e3eb286b711..a4fcf7d01ef 100644 --- a/js/src/views/Status/components/Call/Call.spec.js +++ b/js/src/views/Status/components/Call/Call.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React from 'react'; import { shallow } from 'enzyme'; import sinon from 'sinon'; diff --git a/js/src/views/Status/components/Call/index.js b/js/src/views/Status/components/Call/index.js index 3cec42ec774..3556a61948c 100644 --- a/js/src/views/Status/components/Call/index.js +++ b/js/src/views/Status/components/Call/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './Call'; diff --git a/js/src/views/Status/components/Calls/Calls.css b/js/src/views/Status/components/Calls/Calls.css index 13cd5736f71..b881edda640 100644 --- a/js/src/views/Status/components/Calls/Calls.css +++ b/js/src/views/Status/components/Calls/Calls.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .historyInfo { margin-top: 0; text-transform: initial; diff --git a/js/src/views/Status/components/Calls/Calls.js b/js/src/views/Status/components/Calls/Calls.js index bde7c8989b5..c7b2100cf0f 100644 --- a/js/src/views/Status/components/Calls/Calls.js +++ b/js/src/views/Status/components/Calls/Calls.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import AnimateChildren from '../../components-compositors/Animated/children'; import Call from '../Call'; diff --git a/js/src/views/Status/components/Calls/Calls.spec.js b/js/src/views/Status/components/Calls/Calls.spec.js index 8570a17c65d..7a73fa528d7 100644 --- a/js/src/views/Status/components/Calls/Calls.spec.js +++ b/js/src/views/Status/components/Calls/Calls.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React from 'react'; import { shallow } from 'enzyme'; diff --git a/js/src/views/Status/components/Calls/index.js b/js/src/views/Status/components/Calls/index.js index c21d463cfbc..8508479128c 100644 --- a/js/src/views/Status/components/Calls/index.js +++ b/js/src/views/Status/components/Calls/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './Calls'; diff --git a/js/src/views/Status/components/CallsToolbar/CallsToolbar.css b/js/src/views/Status/components/CallsToolbar/CallsToolbar.css index ae680e0fa54..2dce82c0091 100644 --- a/js/src/views/Status/components/CallsToolbar/CallsToolbar.css +++ b/js/src/views/Status/components/CallsToolbar/CallsToolbar.css @@ -1,4 +1,19 @@ - +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .callActionsWrap { position: absolute; animation: fadein .5s; @@ -48,4 +63,4 @@ @keyframes fadein { from { opacity: 0; } to { opacity: 1; } -} \ No newline at end of file +} diff --git a/js/src/views/Status/components/CallsToolbar/CallsToolbar.js b/js/src/views/Status/components/CallsToolbar/CallsToolbar.js index d9cd15f2d68..10204dbdeff 100644 --- a/js/src/views/Status/components/CallsToolbar/CallsToolbar.js +++ b/js/src/views/Status/components/CallsToolbar/CallsToolbar.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import CopyToClipboard from 'react-copy-to-clipboard'; import { sortBy, find, extend } from 'lodash'; diff --git a/js/src/views/Status/components/CallsToolbar/CallsToolbar.spec.js b/js/src/views/Status/components/CallsToolbar/CallsToolbar.spec.js index d055d534574..0ff9f568b1f 100644 --- a/js/src/views/Status/components/CallsToolbar/CallsToolbar.spec.js +++ b/js/src/views/Status/components/CallsToolbar/CallsToolbar.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React from 'react'; import sinon from 'sinon'; import { shallow } from 'enzyme'; diff --git a/js/src/views/Status/components/CallsToolbar/index.js b/js/src/views/Status/components/CallsToolbar/index.js index 2e47cf4918f..f8162611e44 100644 --- a/js/src/views/Status/components/CallsToolbar/index.js +++ b/js/src/views/Status/components/CallsToolbar/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './CallsToolbar'; diff --git a/js/src/views/Status/components/Debug/Debug.css b/js/src/views/Status/components/Debug/Debug.css index f6e333c4e0f..4e765cce6a6 100644 --- a/js/src/views/Status/components/Debug/Debug.css +++ b/js/src/views/Status/components/Debug/Debug.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .subheader { margin-top: 0; } diff --git a/js/src/views/Status/components/Debug/Debug.js b/js/src/views/Status/components/Debug/Debug.js index b6987dc7101..e6f736c3540 100644 --- a/js/src/views/Status/components/Debug/Debug.js +++ b/js/src/views/Status/components/Debug/Debug.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import AvPause from 'material-ui/svg-icons/av/pause'; import AvPlay from 'material-ui/svg-icons/av/play-arrow'; diff --git a/js/src/views/Status/components/Debug/index.js b/js/src/views/Status/components/Debug/index.js index 32f46e9e79c..9e8eae2198a 100644 --- a/js/src/views/Status/components/Debug/index.js +++ b/js/src/views/Status/components/Debug/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './Debug'; diff --git a/js/src/views/Status/components/EditableValue/EditableValue.css b/js/src/views/Status/components/EditableValue/EditableValue.css index 68c26ccb55f..1f617dc1699 100644 --- a/js/src/views/Status/components/EditableValue/EditableValue.css +++ b/js/src/views/Status/components/EditableValue/EditableValue.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .input { margin-top: 0; width: 100%; @@ -55,4 +71,4 @@ margin-top: 0; padding-left: 10px !important; padding-right: 50px !important; -} \ No newline at end of file +} diff --git a/js/src/views/Status/components/EditableValue/EditableValue.js b/js/src/views/Status/components/EditableValue/EditableValue.js index f825bf7c218..84c5215a360 100644 --- a/js/src/views/Status/components/EditableValue/EditableValue.js +++ b/js/src/views/Status/components/EditableValue/EditableValue.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import React, { Component, PropTypes } from 'react'; import AutoComplete from 'material-ui/AutoComplete'; diff --git a/js/src/views/Status/components/EditableValue/index.js b/js/src/views/Status/components/EditableValue/index.js index d9d4affa790..bf91564d765 100644 --- a/js/src/views/Status/components/EditableValue/index.js +++ b/js/src/views/Status/components/EditableValue/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './EditableValue'; diff --git a/js/src/views/Status/components/JsonEditor/JsonEditor.css b/js/src/views/Status/components/JsonEditor/JsonEditor.css index 5837da840ba..243f43a59ef 100644 --- a/js/src/views/Status/components/JsonEditor/JsonEditor.css +++ b/js/src/views/Status/components/JsonEditor/JsonEditor.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .editor { width: 100%; height: 200px; diff --git a/js/src/views/Status/components/JsonEditor/JsonEditor.js b/js/src/views/Status/components/JsonEditor/JsonEditor.js index 32331c7b71f..c8707489a14 100644 --- a/js/src/views/Status/components/JsonEditor/JsonEditor.js +++ b/js/src/views/Status/components/JsonEditor/JsonEditor.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import React, { Component, PropTypes } from 'react'; import { isEqual } from 'lodash'; diff --git a/js/src/views/Status/components/JsonEditor/index.js b/js/src/views/Status/components/JsonEditor/index.js index d89d7dea1cd..db5b75fcae2 100644 --- a/js/src/views/Status/components/JsonEditor/index.js +++ b/js/src/views/Status/components/JsonEditor/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './JsonEditor'; diff --git a/js/src/views/Status/components/Markdown/Markdown.css b/js/src/views/Status/components/Markdown/Markdown.css index 3ea6f999257..a6a643632ab 100644 --- a/js/src/views/Status/components/Markdown/Markdown.css +++ b/js/src/views/Status/components/Markdown/Markdown.css @@ -1,4 +1,20 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .container li { display: list-item; line-height: 1.6; -} \ No newline at end of file +} diff --git a/js/src/views/Status/components/Markdown/Markdown.js b/js/src/views/Status/components/Markdown/Markdown.js index 5333e6e127a..155d3d7e358 100644 --- a/js/src/views/Status/components/Markdown/Markdown.js +++ b/js/src/views/Status/components/Markdown/Markdown.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import marked from 'marked'; import React, { Component, PropTypes } from 'react'; diff --git a/js/src/views/Status/components/Markdown/index.js b/js/src/views/Status/components/Markdown/index.js index 4d647107aa8..569558ede8a 100644 --- a/js/src/views/Status/components/Markdown/index.js +++ b/js/src/views/Status/components/Markdown/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './Markdown'; diff --git a/js/src/views/Status/components/MiningSettings/MiningSettings.js b/js/src/views/Status/components/MiningSettings/MiningSettings.js index 60417feeae0..c13e2eeaef8 100644 --- a/js/src/views/Status/components/MiningSettings/MiningSettings.js +++ b/js/src/views/Status/components/MiningSettings/MiningSettings.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import formatNumber from 'format-number'; diff --git a/js/src/views/Status/components/MiningSettings/decodeExtraData.js b/js/src/views/Status/components/MiningSettings/decodeExtraData.js index 5ed40a5e727..7fd07921e7f 100644 --- a/js/src/views/Status/components/MiningSettings/decodeExtraData.js +++ b/js/src/views/Status/components/MiningSettings/decodeExtraData.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import rlp from 'rlp'; export function decodeExtraData (str) { diff --git a/js/src/views/Status/components/MiningSettings/decodeExtraData.spec.js b/js/src/views/Status/components/MiningSettings/decodeExtraData.spec.js index 4eaa5bdbfbf..007e564b41d 100644 --- a/js/src/views/Status/components/MiningSettings/decodeExtraData.spec.js +++ b/js/src/views/Status/components/MiningSettings/decodeExtraData.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { decodeExtraData } from './decodeExtraData'; describe('MINING SETTINGS', () => { diff --git a/js/src/views/Status/components/MiningSettings/index.js b/js/src/views/Status/components/MiningSettings/index.js index d1ce56d820a..3eee1e0516b 100644 --- a/js/src/views/Status/components/MiningSettings/index.js +++ b/js/src/views/Status/components/MiningSettings/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './MiningSettings'; diff --git a/js/src/views/Status/components/MiningSettings/numberFromString.js b/js/src/views/Status/components/MiningSettings/numberFromString.js index 6c29eb880ec..6867345ab24 100644 --- a/js/src/views/Status/components/MiningSettings/numberFromString.js +++ b/js/src/views/Status/components/MiningSettings/numberFromString.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export function numberFromString (val) { return parseInt( val diff --git a/js/src/views/Status/components/MiningSettings/numberFromString.spec.js b/js/src/views/Status/components/MiningSettings/numberFromString.spec.js index 537013a4260..c0027349529 100644 --- a/js/src/views/Status/components/MiningSettings/numberFromString.spec.js +++ b/js/src/views/Status/components/MiningSettings/numberFromString.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { numberFromString } from './numberFromString'; describe('NUMBER FROM STRING', () => { diff --git a/js/src/views/Status/components/MuiThemeProvider/index.js b/js/src/views/Status/components/MuiThemeProvider/index.js deleted file mode 100644 index 84638ececa8..00000000000 --- a/js/src/views/Status/components/MuiThemeProvider/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './MuiThemeProvider'; diff --git a/js/src/views/Status/components/Response/Response.css b/js/src/views/Status/components/Response/Response.css index 81489380f39..be93437d4fa 100644 --- a/js/src/views/Status/components/Response/Response.css +++ b/js/src/views/Status/components/Response/Response.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .response { white-space: nowrap; overflow-x: auto; diff --git a/js/src/views/Status/components/Response/Response.js b/js/src/views/Status/components/Response/Response.js index 0db94280f3b..4ee664ad205 100644 --- a/js/src/views/Status/components/Response/Response.js +++ b/js/src/views/Status/components/Response/Response.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import React, { Component, PropTypes } from 'react'; import { isArray, isPlainObject } from 'lodash'; diff --git a/js/src/views/Status/components/Response/Response.spec.js b/js/src/views/Status/components/Response/Response.spec.js index 093876a8848..1eb37a340ca 100644 --- a/js/src/views/Status/components/Response/Response.spec.js +++ b/js/src/views/Status/components/Response/Response.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React from 'react'; import { shallow } from 'enzyme'; diff --git a/js/src/views/Status/components/Response/index.js b/js/src/views/Status/components/Response/index.js index 332abbde0b5..f1d89d75a50 100644 --- a/js/src/views/Status/components/Response/index.js +++ b/js/src/views/Status/components/Response/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './Response'; diff --git a/js/src/views/Status/components/RpcCalls/RpcCalls.css b/js/src/views/Status/components/RpcCalls/RpcCalls.css index df044a97aea..d33ea36141a 100644 --- a/js/src/views/Status/components/RpcCalls/RpcCalls.css +++ b/js/src/views/Status/components/RpcCalls/RpcCalls.css @@ -1,4 +1,19 @@ - +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .header { margin: 0; } diff --git a/js/src/views/Status/components/RpcCalls/RpcCalls.js b/js/src/views/Status/components/RpcCalls/RpcCalls.js index bbdafe44814..bebbfe0adce 100644 --- a/js/src/views/Status/components/RpcCalls/RpcCalls.js +++ b/js/src/views/Status/components/RpcCalls/RpcCalls.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import React, { Component, PropTypes } from 'react'; import _ from 'lodash'; diff --git a/js/src/views/Status/components/RpcCalls/index.js b/js/src/views/Status/components/RpcCalls/index.js index 661c859d949..1c55eea7163 100644 --- a/js/src/views/Status/components/RpcCalls/index.js +++ b/js/src/views/Status/components/RpcCalls/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './RpcCalls'; diff --git a/js/src/views/Status/components/RpcDocs/RpcDocs.css b/js/src/views/Status/components/RpcDocs/RpcDocs.css index 8aa504f0b98..27faba6dace 100644 --- a/js/src/views/Status/components/RpcDocs/RpcDocs.css +++ b/js/src/views/Status/components/RpcDocs/RpcDocs.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .autocomplete { margin-top: 0 !important; } diff --git a/js/src/views/Status/components/RpcDocs/RpcDocs.js b/js/src/views/Status/components/RpcDocs/RpcDocs.js index f37d1f066fa..e932ab728bd 100644 --- a/js/src/views/Status/components/RpcDocs/RpcDocs.js +++ b/js/src/views/Status/components/RpcDocs/RpcDocs.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import React, { Component } from 'react'; import ReactDOM from 'react-dom'; diff --git a/js/src/views/Status/components/RpcDocs/index.js b/js/src/views/Status/components/RpcDocs/index.js index 94453e56d99..f1a9be5c099 100644 --- a/js/src/views/Status/components/RpcDocs/index.js +++ b/js/src/views/Status/components/RpcDocs/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './RpcDocs'; diff --git a/js/src/views/Status/components/RpcNav/RpcNav.css b/js/src/views/Status/components/RpcNav/RpcNav.css index 68036aa966e..793620c4ae4 100644 --- a/js/src/views/Status/components/RpcNav/RpcNav.css +++ b/js/src/views/Status/components/RpcNav/RpcNav.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .nav { font-size: 20px; float: right; @@ -9,4 +25,4 @@ .nav a:not(:first-child) { margin-left: 30px; -} \ No newline at end of file +} diff --git a/js/src/views/Status/components/RpcNav/RpcNav.js b/js/src/views/Status/components/RpcNav/RpcNav.js index 73f20b2d5c1..690f4355e85 100644 --- a/js/src/views/Status/components/RpcNav/RpcNav.js +++ b/js/src/views/Status/components/RpcNav/RpcNav.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import React, { Component } from 'react'; import { Link } from 'react-router'; diff --git a/js/src/views/Status/components/RpcNav/index.js b/js/src/views/Status/components/RpcNav/index.js index d3db26cb395..8e2b2aa40a3 100644 --- a/js/src/views/Status/components/RpcNav/index.js +++ b/js/src/views/Status/components/RpcNav/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './RpcNav'; diff --git a/js/src/views/Status/components/ScrollTopButton/ScrollTopButton.css b/js/src/views/Status/components/ScrollTopButton/ScrollTopButton.css index 466358ea0cf..dfaf7193d3b 100644 --- a/js/src/views/Status/components/ScrollTopButton/ScrollTopButton.css +++ b/js/src/views/Status/components/ScrollTopButton/ScrollTopButton.css @@ -1,4 +1,19 @@ - +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .scrollButton { position: fixed !important; bottom: 35px !important; diff --git a/js/src/views/Status/components/ScrollTopButton/ScrollTopButton.js b/js/src/views/Status/components/ScrollTopButton/ScrollTopButton.js index 2b6928f9ccd..2947495a0e8 100644 --- a/js/src/views/Status/components/ScrollTopButton/ScrollTopButton.js +++ b/js/src/views/Status/components/ScrollTopButton/ScrollTopButton.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import React, { Component } from 'react'; import IconButton from 'material-ui/IconButton'; diff --git a/js/src/views/Status/components/ScrollTopButton/index.js b/js/src/views/Status/components/ScrollTopButton/index.js index 4cc21f04fc5..835969920da 100644 --- a/js/src/views/Status/components/ScrollTopButton/index.js +++ b/js/src/views/Status/components/ScrollTopButton/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './ScrollTopButton'; diff --git a/js/src/views/Status/components/ScrollTopButton/util.js b/js/src/views/Status/components/ScrollTopButton/util.js index 412ac8ead00..647bcfc43c0 100644 --- a/js/src/views/Status/components/ScrollTopButton/util.js +++ b/js/src/views/Status/components/ScrollTopButton/util.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . export function scrollTo (element, to, duration) { let start = element.scrollTop; diff --git a/js/src/views/Status/components/Status/Status.css b/js/src/views/Status/components/Status/Status.css index 873c978703e..d79d41062de 100644 --- a/js/src/views/Status/components/Status/Status.css +++ b/js/src/views/Status/components/Status/Status.css @@ -1,3 +1,19 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .container { padding-bottom: 1em; } diff --git a/js/src/views/Status/components/Status/Status.js b/js/src/views/Status/components/Status/Status.js index fc4feec2e23..3304ee2337a 100644 --- a/js/src/views/Status/components/Status/Status.js +++ b/js/src/views/Status/components/Status/Status.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import bytes from 'bytes'; diff --git a/js/src/views/Status/components/Status/index.js b/js/src/views/Status/components/Status/index.js index 64bb387b2cf..8885a04c6cf 100644 --- a/js/src/views/Status/components/Status/index.js +++ b/js/src/views/Status/components/Status/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './Status'; diff --git a/js/src/views/Status/constants/index.js b/js/src/views/Status/constants/index.js index b51bb7b5738..26850209ae7 100644 --- a/js/src/views/Status/constants/index.js +++ b/js/src/views/Status/constants/index.js @@ -1,2 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . export const SCROLLBAR_WIDTH = 22; diff --git a/js/src/views/Status/containers/--remove-AccountsPage/AccountsPage.js b/js/src/views/Status/containers/--remove-AccountsPage/AccountsPage.js index f2687c97826..b4e3d34c8a5 100644 --- a/js/src/views/Status/containers/--remove-AccountsPage/AccountsPage.js +++ b/js/src/views/Status/containers/--remove-AccountsPage/AccountsPage.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; diff --git a/js/src/views/Status/containers/--remove-AccountsPage/index.js b/js/src/views/Status/containers/--remove-AccountsPage/index.js index a4212184740..770a2d6abda 100644 --- a/js/src/views/Status/containers/--remove-AccountsPage/index.js +++ b/js/src/views/Status/containers/--remove-AccountsPage/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './AccountsPage'; diff --git a/js/src/views/Status/containers/DebugPage/DebugPage.js b/js/src/views/Status/containers/--remove-DebugPage/DebugPage.js similarity index 53% rename from js/src/views/Status/containers/DebugPage/DebugPage.js rename to js/src/views/Status/containers/--remove-DebugPage/DebugPage.js index 0ec8371c22b..7a99893ff81 100644 --- a/js/src/views/Status/containers/DebugPage/DebugPage.js +++ b/js/src/views/Status/containers/--remove-DebugPage/DebugPage.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; diff --git a/js/src/views/Status/containers/--remove-DebugPage/index.js b/js/src/views/Status/containers/--remove-DebugPage/index.js new file mode 100644 index 00000000000..a205744ddd2 --- /dev/null +++ b/js/src/views/Status/containers/--remove-DebugPage/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './DebugPage'; diff --git a/js/src/views/Status/containers/DebugPage/index.js b/js/src/views/Status/containers/DebugPage/index.js deleted file mode 100644 index 1167d8b91dc..00000000000 --- a/js/src/views/Status/containers/DebugPage/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './DebugPage'; diff --git a/js/src/views/Status/containers/RpcPage/RpcPage.js b/js/src/views/Status/containers/RpcPage/RpcPage.js index 768ad5d424f..93ff99692a2 100644 --- a/js/src/views/Status/containers/RpcPage/RpcPage.js +++ b/js/src/views/Status/containers/RpcPage/RpcPage.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { bindActionCreators } from 'redux'; diff --git a/js/src/views/Status/containers/RpcPage/index.js b/js/src/views/Status/containers/RpcPage/index.js index 27ddace7397..f94cbe2b323 100644 --- a/js/src/views/Status/containers/RpcPage/index.js +++ b/js/src/views/Status/containers/RpcPage/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './RpcPage'; diff --git a/js/src/views/Status/containers/StatusPage/StatusPage.js b/js/src/views/Status/containers/StatusPage/StatusPage.js index 448f9f8d6b9..afc7d60f7b4 100644 --- a/js/src/views/Status/containers/StatusPage/StatusPage.js +++ b/js/src/views/Status/containers/StatusPage/StatusPage.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; diff --git a/js/src/views/Status/containers/StatusPage/index.js b/js/src/views/Status/containers/StatusPage/index.js index 663789b706a..e36bc949c3d 100644 --- a/js/src/views/Status/containers/StatusPage/index.js +++ b/js/src/views/Status/containers/StatusPage/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './StatusPage'; diff --git a/js/src/views/Status/containers/StatusPage/statusPage.css b/js/src/views/Status/containers/StatusPage/statusPage.css index 6d86a0633b5..850ee08562c 100644 --- a/js/src/views/Status/containers/StatusPage/statusPage.css +++ b/js/src/views/Status/containers/StatusPage/statusPage.css @@ -1,2 +1,18 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .body { } diff --git a/js/src/views/Status/index.js b/js/src/views/Status/index.js index 60aae301478..44079b22485 100644 --- a/js/src/views/Status/index.js +++ b/js/src/views/Status/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './status'; diff --git a/js/src/views/Status/middleware/index.js b/js/src/views/Status/middleware/index.js index de9c57a63d9..169004a08f9 100644 --- a/js/src/views/Status/middleware/index.js +++ b/js/src/views/Status/middleware/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import LocalStorage from './localstorage'; export default function () { diff --git a/js/src/views/Status/middleware/localstorage.js b/js/src/views/Status/middleware/localstorage.js index c6087eb3142..a431fdd0a98 100644 --- a/js/src/views/Status/middleware/localstorage.js +++ b/js/src/views/Status/middleware/localstorage.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import localStore from 'store'; import { syncRpcStateFromLocalStorage } from '../actions/localstorage'; diff --git a/js/src/views/Status/middleware/localstorage.spec.js b/js/src/views/Status/middleware/localstorage.spec.js index dfa437a66a8..c522196d925 100644 --- a/js/src/views/Status/middleware/localstorage.spec.js +++ b/js/src/views/Status/middleware/localstorage.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import sinon from 'sinon'; import localStore from 'store'; diff --git a/js/src/views/Status/middleware/logger.js b/js/src/views/Status/middleware/logger.js index 29aeb337da4..e056309f341 100644 --- a/js/src/views/Status/middleware/logger.js +++ b/js/src/views/Status/middleware/logger.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default (store) => { return (next) => { return (action) => { diff --git a/js/src/views/Status/middleware/logger.spec.js b/js/src/views/Status/middleware/logger.spec.js index 3220f4d05e5..6aa7b914caa 100644 --- a/js/src/views/Status/middleware/logger.spec.js +++ b/js/src/views/Status/middleware/logger.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import sinon from 'sinon'; import logger from './logger'; diff --git a/js/src/views/Status/middleware/rpc.js b/js/src/views/Status/middleware/rpc.js index 623126132c2..4672ddec087 100644 --- a/js/src/views/Status/middleware/rpc.js +++ b/js/src/views/Status/middleware/rpc.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import web3Formatters from 'web3/lib/web3/formatters.js'; import web3Utils from 'web3/lib/utils/utils.js'; import * as RpcActions from '../actions/rpc'; diff --git a/js/src/views/Status/middleware/rpc.spec.js b/js/src/views/Status/middleware/rpc.spec.js index 133c688b3cc..918b76906d4 100644 --- a/js/src/views/Status/middleware/rpc.spec.js +++ b/js/src/views/Status/middleware/rpc.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import sinon from 'sinon'; import _ from 'lodash'; diff --git a/js/src/views/Status/middleware/user-web3-interactions.js b/js/src/views/Status/middleware/user-web3-interactions.js index ed42272b6d1..57cee260a45 100644 --- a/js/src/views/Status/middleware/user-web3-interactions.js +++ b/js/src/views/Status/middleware/user-web3-interactions.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import { Web3Base } from '../provider/web3-base'; diff --git a/js/src/views/Status/middleware/user-web3-interactions.spec.js b/js/src/views/Status/middleware/user-web3-interactions.spec.js index 6cee5aaa390..7a7b82dd9cf 100644 --- a/js/src/views/Status/middleware/user-web3-interactions.spec.js +++ b/js/src/views/Status/middleware/user-web3-interactions.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import sinon from 'sinon'; import WebInteractions from './user-web3-interactions'; import * as MiningActions from '../actions/modify-mining'; diff --git a/js/src/views/Status/provider/rpc-provider.js b/js/src/views/Status/provider/rpc-provider.js index 8cb3ebd1880..6356d22b219 100644 --- a/js/src/views/Status/provider/rpc-provider.js +++ b/js/src/views/Status/provider/rpc-provider.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import { stringifyIfObject } from '../util'; diff --git a/js/src/views/Status/provider/rpc-provider.spec.js b/js/src/views/Status/provider/rpc-provider.spec.js index 650b3357f9d..f9d262c40fd 100644 --- a/js/src/views/Status/provider/rpc-provider.spec.js +++ b/js/src/views/Status/provider/rpc-provider.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import sinon from 'sinon'; import RpcProvider from './rpc-provider'; diff --git a/js/src/views/Status/provider/web3-base.js b/js/src/views/Status/provider/web3-base.js index a51e63bdb77..694e9669559 100644 --- a/js/src/views/Status/provider/web3-base.js +++ b/js/src/views/Status/provider/web3-base.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . export class Web3Base { diff --git a/js/src/views/Status/provider/web3-ethcore-provider.js b/js/src/views/Status/provider/web3-ethcore-provider.js index 73b89215ae4..1042060edfd 100644 --- a/js/src/views/Status/provider/web3-ethcore-provider.js +++ b/js/src/views/Status/provider/web3-ethcore-provider.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import Method from 'web3/lib/web3/method'; import formatters from 'web3/lib/web3/formatters'; import utils from 'web3/lib/utils/utils'; diff --git a/js/src/views/Status/provider/web3-provider.js b/js/src/views/Status/provider/web3-provider.js index ee1ea8f947d..82c963f63c5 100644 --- a/js/src/views/Status/provider/web3-provider.js +++ b/js/src/views/Status/provider/web3-provider.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import { isArray, isObject, isEqual, compact } from 'lodash'; import { isBigNumber } from 'web3/lib/utils/utils'; diff --git a/js/src/views/Status/provider/web3-provider.spec.js b/js/src/views/Status/provider/web3-provider.spec.js index 85e3e4f14cc..af9a0c1c158 100644 --- a/js/src/views/Status/provider/web3-provider.spec.js +++ b/js/src/views/Status/provider/web3-provider.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import sinon from 'sinon'; import { Web3Provider } from './web3-provider'; import * as StatusActions from '../actions/status'; diff --git a/js/src/views/Status/reducers/debug.js b/js/src/views/Status/reducers/debug.js index c9029be5221..314470d3d63 100644 --- a/js/src/views/Status/reducers/debug.js +++ b/js/src/views/Status/reducers/debug.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import { handleActions } from 'redux-actions'; import { union } from 'lodash'; diff --git a/js/src/views/Status/reducers/index.js b/js/src/views/Status/reducers/index.js index 3d093dc40ae..3f6225ee035 100644 --- a/js/src/views/Status/reducers/index.js +++ b/js/src/views/Status/reducers/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import status from './status'; import settings from './settings'; import mining from './mining'; diff --git a/js/src/views/Status/reducers/logger.js b/js/src/views/Status/reducers/logger.js index dd41601b5eb..62085feacb6 100644 --- a/js/src/views/Status/reducers/logger.js +++ b/js/src/views/Status/reducers/logger.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { handleActions } from 'redux-actions'; const isProd = process.env.NODE_ENV === 'production'; diff --git a/js/src/views/Status/reducers/mining.js b/js/src/views/Status/reducers/mining.js index 2c4d340da48..3fe780bbdfb 100644 --- a/js/src/views/Status/reducers/mining.js +++ b/js/src/views/Status/reducers/mining.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import { handleActions } from 'redux-actions'; diff --git a/js/src/views/Status/reducers/rpc.js b/js/src/views/Status/reducers/rpc.js index cb9a9340fce..e2676260b53 100644 --- a/js/src/views/Status/reducers/rpc.js +++ b/js/src/views/Status/reducers/rpc.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import { handleActions } from 'redux-actions'; import rpcMetods from '../data/rpc.json'; diff --git a/js/src/views/Status/reducers/settings.js b/js/src/views/Status/reducers/settings.js index 51493c811ab..ae6582b02f3 100644 --- a/js/src/views/Status/reducers/settings.js +++ b/js/src/views/Status/reducers/settings.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import { handleActions } from 'redux-actions'; diff --git a/js/src/views/Status/reducers/status.js b/js/src/views/Status/reducers/status.js index 772ee263372..f6fec9ce281 100644 --- a/js/src/views/Status/reducers/status.js +++ b/js/src/views/Status/reducers/status.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import { handleActions } from 'redux-actions'; diff --git a/js/src/views/Status/status.css b/js/src/views/Status/status.css index 485140808b9..0ed554ae645 100644 --- a/js/src/views/Status/status.css +++ b/js/src/views/Status/status.css @@ -1,2 +1,18 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ .container { } diff --git a/js/src/views/Status/status.js b/js/src/views/Status/status.js index cf836141e9e..881c125ba01 100644 --- a/js/src/views/Status/status.js +++ b/js/src/views/Status/status.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component } from 'react'; import { Actionbar, Page } from '../../ui'; diff --git a/js/src/views/Status/store/index.js b/js/src/views/Status/store/index.js deleted file mode 100644 index aacfae5dff8..00000000000 --- a/js/src/views/Status/store/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './store'; diff --git a/js/src/views/Status/store/store.js b/js/src/views/Status/store/store.js deleted file mode 100644 index b44a104d718..00000000000 --- a/js/src/views/Status/store/store.js +++ /dev/null @@ -1,24 +0,0 @@ -import { createStore, applyMiddleware } from 'redux'; - -import rootReducer from '../reducers'; - -export default function configure (middlewares) { - const create = window.devToolsExtension - ? window.devToolsExtension()(createStore) - : createStore; - - const createStoreWithMiddleware = applyMiddleware( - ...middlewares - )(create); - - const store = createStoreWithMiddleware(rootReducer); - - if (module.hot) { - module.hot.accept('../reducers', () => { - const nextReducer = require('../reducers'); - store.replaceReducer(nextReducer); - }); - } - - return store; -} diff --git a/js/src/views/Status/util/error.js b/js/src/views/Status/util/error.js index aa03d892b71..8b680204e7e 100644 --- a/js/src/views/Status/util/error.js +++ b/js/src/views/Status/util/error.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . export function filterErrors (xs) { return xs.filter(isError); diff --git a/js/src/views/Status/util/error.spec.js b/js/src/views/Status/util/error.spec.js index a5e4cbdda4b..f3ba98cc8a5 100644 --- a/js/src/views/Status/util/error.spec.js +++ b/js/src/views/Status/util/error.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import sinon from 'sinon'; import * as ErrorUtil from './error'; diff --git a/js/src/views/Status/util/index.js b/js/src/views/Status/util/index.js index 0458fb7742c..9194cfd944f 100644 --- a/js/src/views/Status/util/index.js +++ b/js/src/views/Status/util/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export function toPromise (fn) { return new Promise((resolve, reject) => { fn((err, res) => { diff --git a/js/src/views/Status/util/index.spec.js b/js/src/views/Status/util/index.spec.js index 52306ae6ce5..df281bd6e9a 100644 --- a/js/src/views/Status/util/index.spec.js +++ b/js/src/views/Status/util/index.spec.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import { toPromise, identity } from './'; describe('util/index', () => { diff --git a/js/src/views/Status/util/react.js b/js/src/views/Status/util/react.js index c5a99c70f5e..095f6e6b0d1 100644 --- a/js/src/views/Status/util/react.js +++ b/js/src/views/Status/util/react.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import { isValidElement } from 'react'; diff --git a/js/src/views/Status/util/rpc-md.js b/js/src/views/Status/util/rpc-md.js index ac77aa3a852..5c0a3f793be 100644 --- a/js/src/views/Status/util/rpc-md.js +++ b/js/src/views/Status/util/rpc-md.js @@ -1,3 +1,18 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . import { isPlainObject } from 'lodash'; diff --git a/js/src/views/index.js b/js/src/views/index.js index 4fc21b5a4cf..afbcffda47d 100644 --- a/js/src/views/index.js +++ b/js/src/views/index.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import Account from './Account'; import Accounts from './Accounts'; import Address from './Address'; diff --git a/js/src/web3.js b/js/src/web3.js index e4b463649b8..1b560ef2c62 100644 --- a/js/src/web3.js +++ b/js/src/web3.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import Web3 from 'web3'; import './web3.html'; diff --git a/js/test/babel.js b/js/test/babel.js index 04cabb53f4c..fc37b94bfd2 100644 --- a/js/test/babel.js +++ b/js/test/babel.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + require('babel-register')(); diff --git a/js/test/e2e/ethapi.js b/js/test/e2e/ethapi.js index 17f7b50a590..2b7fe43d31a 100644 --- a/js/test/e2e/ethapi.js +++ b/js/test/e2e/ethapi.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import EthApi from '../../src/api/ethApi'; function createApi (transport) { diff --git a/js/test/mocha.config.js b/js/test/mocha.config.js index ec7d4a9ff2c..28d2ac2a55f 100644 --- a/js/test/mocha.config.js +++ b/js/test/mocha.config.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import 'isomorphic-fetch'; import es6Promise from 'es6-promise'; diff --git a/js/test/mockRpc.js b/js/test/mockRpc.js index 627e5d08375..800f483c9da 100644 --- a/js/test/mockRpc.js +++ b/js/test/mockRpc.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import nock from 'nock'; import { Server as MockWsServer } from 'mock-socket'; diff --git a/js/test/types.js b/js/test/types.js index 175200792a6..73b0aa14e86 100644 --- a/js/test/types.js +++ b/js/test/types.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import BigNumber from 'bignumber.js'; import { isInstanceOf } from '../src/api/util/types'; diff --git a/js/webpack.config.js b/js/webpack.config.js index 2d7d2658d0b..219da75f0b7 100644 --- a/js/webpack.config.js +++ b/js/webpack.config.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + var rucksack = require('rucksack-css'); var webpack = require('webpack'); var path = require('path'); From 9378f56f2fc76374fe55bdb87ac4fc84c1fae80c Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 14 Sep 2016 10:56:25 +0200 Subject: [PATCH 0481/1062] fix merge conflicts from js (GPL headers) --- js/src/api/api.js | 21 ++++++--------------- js/src/api/rpc/index.js | 27 ++++++++------------------- js/src/api/transport/index.js | 9 ++------- js/src/api/transport/jsonRpcBase.js | 6 +----- 4 files changed, 17 insertions(+), 46 deletions(-) diff --git a/js/src/api/api.js b/js/src/api/api.js index ccc58a44054..9f6dba707c4 100644 --- a/js/src/api/api.js +++ b/js/src/api/api.js @@ -1,11 +1,3 @@ -<<<<<<< HEAD -import { Http, Ws } from './transport'; -import Contract from './contract'; - -import { Db, Eth, Ethcore, Net, Personal, Shh, Trace, Web3 } from './rpc'; -import Subscriptions from './subscriptions'; -import format from './format'; -======= // Copyright 2015, 2016 Ethcore (UK) Ltd. // This file is part of Parity. @@ -22,14 +14,13 @@ import format from './format'; // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -import { Http, Ws } from './transport/index'; -import Contract from './contract/index'; +import { Http, Ws } from './transport'; +import Contract from './contract'; -import { Db, Eth, Ethcore, Net, Personal, Shh, Trace, Web3 } from './rpc/index'; -import Subscriptions from './subscriptions/index'; -import format from './format/index'; -import util from './util/index'; ->>>>>>> js +import { Db, Eth, Ethcore, Net, Personal, Shh, Trace, Web3 } from './rpc'; +import Subscriptions from './subscriptions'; +import format from './format'; +import util from './util'; import { isFunction } from './util/types'; export default class Api { diff --git a/js/src/api/rpc/index.js b/js/src/api/rpc/index.js index f36321c7542..e7e94b9edba 100644 --- a/js/src/api/rpc/index.js +++ b/js/src/api/rpc/index.js @@ -1,13 +1,3 @@ -<<<<<<< HEAD -export Db from './db'; -export Eth from './eth'; -export Ethcore from './ethcore'; -export Net from './net'; -export Personal from './personal'; -export Shh from './shh'; -export Trace from './trace'; -export Web3 from './web3'; -======= // Copyright 2015, 2016 Ethcore (UK) Ltd. // This file is part of Parity. @@ -24,12 +14,11 @@ export Web3 from './web3'; // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -export Db from './db/index'; -export Eth from './eth/index'; -export Ethcore from './ethcore/index'; -export Net from './net/index'; -export Personal from './personal/index'; -export Shh from './shh/index'; -export Trace from './trace/index'; -export Web3 from './web3/index'; ->>>>>>> js +export Db from './db'; +export Eth from './eth'; +export Ethcore from './ethcore'; +export Net from './net'; +export Personal from './personal'; +export Shh from './shh'; +export Trace from './trace'; +export Web3 from './web3'; diff --git a/js/src/api/transport/index.js b/js/src/api/transport/index.js index cbc5c40be88..8f67fba4d53 100644 --- a/js/src/api/transport/index.js +++ b/js/src/api/transport/index.js @@ -1,7 +1,3 @@ -<<<<<<< HEAD -export Http from './http'; -export Ws from './ws'; -======= // Copyright 2015, 2016 Ethcore (UK) Ltd. // This file is part of Parity. @@ -18,6 +14,5 @@ export Ws from './ws'; // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -export Http from './http/index'; -export Ws from './ws/index'; ->>>>>>> js +export Http from './http'; +export Ws from './ws'; diff --git a/js/src/api/transport/jsonRpcBase.js b/js/src/api/transport/jsonRpcBase.js index 7085600462e..aa8848caee0 100644 --- a/js/src/api/transport/jsonRpcBase.js +++ b/js/src/api/transport/jsonRpcBase.js @@ -1,6 +1,3 @@ -<<<<<<< HEAD -import { Logging } from '../subscriptions'; -======= // Copyright 2015, 2016 Ethcore (UK) Ltd. // This file is part of Parity. @@ -17,8 +14,7 @@ import { Logging } from '../subscriptions'; // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -import { Logging } from '../subscriptions/index'; ->>>>>>> js +import { Logging } from '../subscriptions'; export default class JsonRpcBase { constructor () { From 0f565e4ca1c8b71953b1b83a611e932650d5c777 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Wed, 14 Sep 2016 13:00:42 +0200 Subject: [PATCH 0482/1062] re-add lodash plugin to babel config --- js/.babelrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/.babelrc b/js/.babelrc index a855f26014d..b0b0d0ffa58 100644 --- a/js/.babelrc +++ b/js/.babelrc @@ -1,5 +1,5 @@ { "presets": ["es2017", "es2016", "es2015", "stage-0", "react"], - "plugins": ["transform-runtime", "transform-decorators-legacy", "transform-class-properties"], + "plugins": ["transform-runtime", "transform-decorators-legacy", "transform-class-properties", "lodash"], "retainLines": true } From 49ec2ebdf9e194bc609c4701d8f79551d28deed7 Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Wed, 14 Sep 2016 14:32:08 +0100 Subject: [PATCH 0483/1062] Listing Tokens and querying meta --- js/src/dapps/gavcoin/Status/status.css | 7 ++ .../tokenreg/Application/application.css | 5 + .../dapps/tokenreg/Application/application.js | 7 +- js/src/dapps/tokenreg/Chip/chip.css | 28 +++++ js/src/dapps/tokenreg/Chip/chip.js | 48 ++++++++ js/src/dapps/tokenreg/Chip/index.js | 1 + js/src/dapps/tokenreg/Loading/loading.js | 2 +- js/src/dapps/tokenreg/Status/reducers.js | 2 +- js/src/dapps/tokenreg/Status/status.css | 19 ++- js/src/dapps/tokenreg/Status/status.js | 27 +++-- js/src/dapps/tokenreg/Tokens/Token/index.js | 1 + js/src/dapps/tokenreg/Tokens/Token/token.css | 36 ++++++ js/src/dapps/tokenreg/Tokens/Token/token.js | 93 ++++++++++++++ js/src/dapps/tokenreg/Tokens/actions.js | 114 ++++++++++++++++++ js/src/dapps/tokenreg/Tokens/container.js | 47 ++++++++ js/src/dapps/tokenreg/Tokens/index.js | 1 + js/src/dapps/tokenreg/Tokens/reducers.js | 62 ++++++++++ js/src/dapps/tokenreg/Tokens/tokens.css | 4 + js/src/dapps/tokenreg/Tokens/tokens.js | 37 ++++++ js/src/dapps/tokenreg/reducers.js | 3 +- 20 files changed, 526 insertions(+), 18 deletions(-) create mode 100644 js/src/dapps/tokenreg/Application/application.css create mode 100644 js/src/dapps/tokenreg/Chip/chip.css create mode 100644 js/src/dapps/tokenreg/Chip/chip.js create mode 100644 js/src/dapps/tokenreg/Chip/index.js create mode 100644 js/src/dapps/tokenreg/Tokens/Token/index.js create mode 100644 js/src/dapps/tokenreg/Tokens/Token/token.css create mode 100644 js/src/dapps/tokenreg/Tokens/Token/token.js create mode 100644 js/src/dapps/tokenreg/Tokens/actions.js create mode 100644 js/src/dapps/tokenreg/Tokens/container.js create mode 100644 js/src/dapps/tokenreg/Tokens/index.js create mode 100644 js/src/dapps/tokenreg/Tokens/reducers.js create mode 100644 js/src/dapps/tokenreg/Tokens/tokens.css create mode 100644 js/src/dapps/tokenreg/Tokens/tokens.js diff --git a/js/src/dapps/gavcoin/Status/status.css b/js/src/dapps/gavcoin/Status/status.css index 39bcfae9cb8..b30a462331e 100644 --- a/js/src/dapps/gavcoin/Status/status.css +++ b/js/src/dapps/gavcoin/Status/status.css @@ -6,6 +6,13 @@ flex-wrap: wrap; } +.title { + margin-top: 0; + font-weight: 300; + font-size: 2.5rem; + text-transform: uppercase; +} + .item { flex: 0 1 30%; width: 30%; diff --git a/js/src/dapps/tokenreg/Application/application.css b/js/src/dapps/tokenreg/Application/application.css new file mode 100644 index 00000000000..bee3bd91a4c --- /dev/null +++ b/js/src/dapps/tokenreg/Application/application.css @@ -0,0 +1,5 @@ +.application { + display: flex; + flex-direction: column; + align-items: center; +} diff --git a/js/src/dapps/tokenreg/Application/application.js b/js/src/dapps/tokenreg/Application/application.js index 6562ee06f03..75c69d85685 100644 --- a/js/src/dapps/tokenreg/Application/application.js +++ b/js/src/dapps/tokenreg/Application/application.js @@ -5,6 +5,9 @@ import lightBaseTheme from 'material-ui/styles/baseThemes/lightBaseTheme'; import Loading from '../Loading'; import Status from '../Status'; +import Tokens from '../Tokens'; + +import styles from './application.css'; const muiTheme = getMuiTheme(lightBaseTheme); @@ -23,11 +26,13 @@ export default class Application extends Component { } return ( -
    +
    + +
    ); } diff --git a/js/src/dapps/tokenreg/Chip/chip.css b/js/src/dapps/tokenreg/Chip/chip.css new file mode 100644 index 00000000000..1f57b12f5ac --- /dev/null +++ b/js/src/dapps/tokenreg/Chip/chip.css @@ -0,0 +1,28 @@ +.chip > span { + flex: 1; + display: flex; + flex-direction: row; +} + +.chip img { + margin-bottom: -11px; + margin-left: -11px; +} + +.value { + font-family: 'Roboto Mono', monospace; + color: rgba(255, 255, 255, 1); + -webkit-user-select: text; + cursor: text; + flex: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.label { + color: rgba(255, 255, 255, 0.7); + margin-left: 1em; + margin-right: 0.5em; + text-transform: uppercase; +} diff --git a/js/src/dapps/tokenreg/Chip/chip.js b/js/src/dapps/tokenreg/Chip/chip.js new file mode 100644 index 00000000000..7580f8bbace --- /dev/null +++ b/js/src/dapps/tokenreg/Chip/chip.js @@ -0,0 +1,48 @@ +import React, { Component, PropTypes } from 'react'; + +import { Chip } from 'material-ui'; + +const { IdentityIcon } = window.parity.react; + +import styles from './chip.css'; + +export default class CustomChip extends Component { + static propTypes = { + isAddress: PropTypes.bool, + value: PropTypes.string, + label: PropTypes.string + }; + + render () { + const { isAddress, value, label } = this.props; + + return ( + + { this.renderIcon(isAddress, value) } + + { value } + + + { label } + + + ); + } + + renderIcon(isAddress, address) { + if (!isAddress) return; + + return ( + + ); + } +} diff --git a/js/src/dapps/tokenreg/Chip/index.js b/js/src/dapps/tokenreg/Chip/index.js new file mode 100644 index 00000000000..0b67e27b473 --- /dev/null +++ b/js/src/dapps/tokenreg/Chip/index.js @@ -0,0 +1 @@ +export default from './chip'; diff --git a/js/src/dapps/tokenreg/Loading/loading.js b/js/src/dapps/tokenreg/Loading/loading.js index 9b381704600..962c3778a55 100644 --- a/js/src/dapps/tokenreg/Loading/loading.js +++ b/js/src/dapps/tokenreg/Loading/loading.js @@ -7,7 +7,7 @@ export default class Loading extends Component { render () { return (
    - +
    ); } diff --git a/js/src/dapps/tokenreg/Status/reducers.js b/js/src/dapps/tokenreg/Status/reducers.js index c6cb052c89f..167e7b008d8 100644 --- a/js/src/dapps/tokenreg/Status/reducers.js +++ b/js/src/dapps/tokenreg/Status/reducers.js @@ -1,7 +1,7 @@ import { SET_LOADING, SET_CONTRACT_DETAILS } from './actions'; const initialState = { - isLoading: false, + isLoading: true, contract: { addres: null, instance: null, diff --git a/js/src/dapps/tokenreg/Status/status.css b/js/src/dapps/tokenreg/Status/status.css index bd465f8886d..72af20eae83 100644 --- a/js/src/dapps/tokenreg/Status/status.css +++ b/js/src/dapps/tokenreg/Status/status.css @@ -1,12 +1,19 @@ .status { - padding: 1em 1em 2em 1em; -} + background: rgba(25, 75, 125, 1); + color: rgba(255, 255, 255, 1); + padding: 4em 0 2em 0; -.address { -} + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; -.fee { + width: 100%; } -.owner { +.title { + font-size: 3rem; + font-weight: 300; + margin-top: 0; + text-transform: uppercase; } diff --git a/js/src/dapps/tokenreg/Status/status.js b/js/src/dapps/tokenreg/Status/status.js index 228ca7bec9e..c095583d14e 100644 --- a/js/src/dapps/tokenreg/Status/status.js +++ b/js/src/dapps/tokenreg/Status/status.js @@ -1,5 +1,7 @@ import React, { Component, PropTypes } from 'react'; +import Chip from '../Chip'; + import styles from './status.css'; const { api } = window.parity; @@ -16,14 +18,23 @@ export default class Status extends Component { return (
    -
    Token Registry at { address }
    -
    Owned by { owner }
    - { fee - ? (
    - Registration fee { api.format.fromWei(fee).toFixed(3) }ΞTH -
    ) - : null - } +

    Token Registry

    + + + + + + +
    ); } diff --git a/js/src/dapps/tokenreg/Tokens/Token/index.js b/js/src/dapps/tokenreg/Tokens/Token/index.js new file mode 100644 index 00000000000..a02ad51a3c3 --- /dev/null +++ b/js/src/dapps/tokenreg/Tokens/Token/index.js @@ -0,0 +1 @@ +export default from './token'; diff --git a/js/src/dapps/tokenreg/Tokens/Token/token.css b/js/src/dapps/tokenreg/Tokens/Token/token.css new file mode 100644 index 00000000000..f9ffcf6c5bf --- /dev/null +++ b/js/src/dapps/tokenreg/Tokens/Token/token.css @@ -0,0 +1,36 @@ +.token{ + display: flex; + + width: 300px; + margin: 1rem; + padding: 1rem; + flex-direction: column; + align-items: center; + padding-bottom: 1.5rem; +} + +.name { + padding-bottom: 0.75rem; +} + +.token > div { + max-width: 100%; +} + +.title { + font-size: 2rem; + padding: 0 0 0.5rem; +} + +.meta-query { + font-size: 0.9rem; + margin-top: 1.5rem; + margin-bottom: 0; + font-weight: bold; +} + +.meta-value { + margin-top: 0.5rem; + max-width: 100%; + overflow-wrap: break-word; +} diff --git a/js/src/dapps/tokenreg/Tokens/Token/token.js b/js/src/dapps/tokenreg/Tokens/Token/token.js new file mode 100644 index 00000000000..adb960d174f --- /dev/null +++ b/js/src/dapps/tokenreg/Tokens/Token/token.js @@ -0,0 +1,93 @@ +import React, { Component, PropTypes } from 'react'; +import Paper from 'material-ui/Paper'; +import { RaisedButton, TextField } from 'material-ui'; +import FindIcon from 'material-ui/svg-icons/action/find-in-page'; + +import Loading from '../../Loading'; +import Chip from '../../Chip'; + +import styles from './token.css'; + +export default class Token extends Component { + static propTypes = { + handleMetaLookup: PropTypes.func, + isLoading: PropTypes.bool, + address: PropTypes.string, + tla: PropTypes.string, + name: PropTypes.string, + base: PropTypes.number, + index: PropTypes.number + }; + + state = { + metaQuery: '' + }; + + render () { + const { isLoading, address, tla, base, name, meta } = this.props; + + if (isLoading) { + return ( +
    + +
    + ); + } + + return ( + +
    { tla }
    +
    "{ name }"
    + + + + + +
    + + + } + primary + fullWidth + onTouchTap={ this.onMetaLookup } /> +
    + + { this.renderMeta(meta) } +
    + ); + } + + renderMeta(meta) { + if (!meta) return; + + return (
    +

    {meta.query}

    +

    {meta.value}

    +
    ); + } + + onMetaLookup = () => { + let query = this.state.metaQuery; + let index = this.props.index; + + this.props.handleMetaLookup(index, query); + } + + onMetaQueryChange = (event, metaQuery) => { + this.setState({ metaQuery }); + } +} diff --git a/js/src/dapps/tokenreg/Tokens/actions.js b/js/src/dapps/tokenreg/Tokens/actions.js new file mode 100644 index 00000000000..e1625028780 --- /dev/null +++ b/js/src/dapps/tokenreg/Tokens/actions.js @@ -0,0 +1,114 @@ +const sha3 = window.parity.api.format.sha3; + +export const SET_TOKENS_LOADING = 'SET_TOKENS_LOADING'; +export const setTokensLoading = (isLoading) => ({ + type: SET_TOKENS_LOADING, + isLoading +}); + +export const SET_TOKEN_COUNT = 'SET_TOKEN_COUNT'; +export const setTokenCount = (tokenCount) => ({ + type: SET_TOKEN_COUNT, + tokenCount +}); + +export const SET_TOKEN_DATA = 'SET_TOKEN_DATA'; +export const setTokenData = (index, tokenData) => ({ + type: SET_TOKEN_DATA, + index, tokenData +}); + +export const SET_TOKEN_META = 'SET_TOKEN_META'; +export const setTokenMeta = (index, meta) => ({ + type: SET_TOKEN_META, + index, meta +}); + +export const SET_TOKEN_LOADING = 'SET_TOKEN_LOADING'; +export const setTokenLoading = (index, isLoading) => ({ + type: SET_TOKEN_LOADING, + index, isLoading +}); + +export const loadTokens = () => (dispatch, getState) => { + console.log('loading tokens...'); + + let state = getState(); + let contractInstance = state.status.contract.instance; + + dispatch(setTokensLoading(true)); + + contractInstance + .tokenCount + .call() + .then((count) => { + let tokenCount = parseInt(count); + console.log(`token count: ${tokenCount}`); + dispatch(setTokenCount(tokenCount)); + + for (let i = 0; i < tokenCount; i++) { + dispatch(loadToken(i)); + } + + dispatch(setTokensLoading(false)); + }) + .catch((e) => { + console.error('loadTokens error', e); + }); +}; + +export const loadToken = (index) => (dispatch, getState) => { + console.log('loading token', index); + + let state = getState(); + let contractInstance = state.status.contract.instance; + + dispatch(setTokenLoading(index, true)); + + contractInstance + .token + .call({}, [ parseInt(index) ]) + .then((result) => { + let data = { + index: parseInt(index), + address: result[0], + tla: result[1], + base: result[2].toNumber(), + name: result[3] + }; + + console.log(`token loaded: #${index}`, data); + dispatch(setTokenData(index, data)); + dispatch(setTokenLoading(index, false)); + }) + .catch((e) => { + console.error('loadToken #${index} error', e); + }); +}; + +export const queryTokenMeta = (index, query) => (dispatch, getState) => { + console.log('loading token meta', index, query); + + let state = getState(); + let contractInstance = state.status.contract.instance; + + let key = sha3(query); + + dispatch(setTokenLoading(index, true)); + + contractInstance + .meta + .call({}, [ index, key ]) + .then((value) => { + let meta = { + key, query, value + }; + + console.log(`token meta loaded: #${index}`, value); + dispatch(setTokenMeta(index, meta)); + dispatch(setTokenLoading(index, false)); + }) + .catch((e) => { + console.error('loadToken #${index} error', e); + }); +} diff --git a/js/src/dapps/tokenreg/Tokens/container.js b/js/src/dapps/tokenreg/Tokens/container.js new file mode 100644 index 00000000000..d4050b7ca56 --- /dev/null +++ b/js/src/dapps/tokenreg/Tokens/container.js @@ -0,0 +1,47 @@ +import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; + +import Tokens from './tokens'; + +import { loadTokens, queryTokenMeta } from './actions'; + +class TokensContainer extends Component { + static propTypes = { + isLoading: PropTypes.bool, + tokens: PropTypes.array, + tokenCount: PropTypes.number + }; + + componentDidMount() { + this.props.onLoadTokens(); + } + + render() { + return (); + } +} + +const mapStateToProps = (state) => { + const { isLoading, tokens, tokenCount } = state.tokens; + + return { isLoading, tokens, tokenCount }; +}; + +const mapDispatchToProps = (dispatch) => { + return { + onLoadTokens: () => { + dispatch(loadTokens()); + }, + + handleMetaLookup: (index, query) => { + dispatch(queryTokenMeta(index, query)) + } + }; +}; + +export default connect( + mapStateToProps, + mapDispatchToProps +)(TokensContainer); diff --git a/js/src/dapps/tokenreg/Tokens/index.js b/js/src/dapps/tokenreg/Tokens/index.js new file mode 100644 index 00000000000..9f6c229eb84 --- /dev/null +++ b/js/src/dapps/tokenreg/Tokens/index.js @@ -0,0 +1 @@ +export default from './container'; diff --git a/js/src/dapps/tokenreg/Tokens/reducers.js b/js/src/dapps/tokenreg/Tokens/reducers.js new file mode 100644 index 00000000000..8462645d5f9 --- /dev/null +++ b/js/src/dapps/tokenreg/Tokens/reducers.js @@ -0,0 +1,62 @@ +import { + SET_TOKENS_LOADING, + SET_TOKEN_COUNT, + SET_TOKEN_DATA, + SET_TOKEN_META, + SET_TOKEN_LOADING +} from './actions'; + +const initialState = { + isLoading: true, + tokens: [], + tokenCount: 0 +}; + +export default (state = initialState, action) => { + switch (action.type) { + case SET_TOKENS_LOADING: + return { ...state, isLoading: action.isLoading }; + + case SET_TOKEN_COUNT: + return { ...state, tokenCount: action.tokenCount }; + + case SET_TOKEN_DATA: { + let index = action.index; + let tokens = [].concat(state.tokens); + + tokens[index] = { + ...tokens[index], + ...action.tokenData + }; + + return { ...state, tokens: tokens }; + } + + case SET_TOKEN_META: { + let index = action.index; + let tokens = [].concat(state.tokens); + + tokens[index] = { + ...tokens[index], + meta: action.meta + }; + + return { ...state, tokens: tokens }; + } + + case SET_TOKEN_LOADING:{ + let index = action.index; + let tokens = [].concat(state.tokens); + + tokens[index] = { + ...tokens[index], + isLoading: action.isLoading + }; + + return { ...state, tokens: tokens }; + } + + default: + return state; + } +}; diff --git a/js/src/dapps/tokenreg/Tokens/tokens.css b/js/src/dapps/tokenreg/Tokens/tokens.css new file mode 100644 index 00000000000..0bd225b03f8 --- /dev/null +++ b/js/src/dapps/tokenreg/Tokens/tokens.css @@ -0,0 +1,4 @@ +.tokens { + width: 80%; + padding-top: 2rem; +} diff --git a/js/src/dapps/tokenreg/Tokens/tokens.js b/js/src/dapps/tokenreg/Tokens/tokens.js new file mode 100644 index 00000000000..2cf62375eab --- /dev/null +++ b/js/src/dapps/tokenreg/Tokens/tokens.js @@ -0,0 +1,37 @@ +import React, { Component, PropTypes } from 'react'; + +import Token from './Token'; +import Loading from '../Loading'; + +import styles from './tokens.css'; + +export default class Tokens extends Component { + static propTypes = { + handleMetaLookup: PropTypes.func, + isLoading: PropTypes.bool, + tokens: PropTypes.array, + tokenCount: PropTypes.number + }; + + render () { + const { isLoading, tokens, tokenCount } = this.props; + + let loading = isLoading ? () : null; + + return ( +
    + { this.renderTokens(tokens) } + { loading } +
    + ); + } + + renderTokens(tokens) { + return tokens.map((token, index) => ( + + )); + } +} diff --git a/js/src/dapps/tokenreg/reducers.js b/js/src/dapps/tokenreg/reducers.js index 4d9db9d246e..9810d8e93d1 100644 --- a/js/src/dapps/tokenreg/reducers.js +++ b/js/src/dapps/tokenreg/reducers.js @@ -1,9 +1,10 @@ import { combineReducers } from 'redux'; import status from './Status/reducers'; +import tokens from './Tokens/reducers'; const rootReducer = combineReducers({ - status + status, tokens }); export default rootReducer; From d713d483e51fc76e8430654aca2f13c727702a7b Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Wed, 14 Sep 2016 14:35:24 +0100 Subject: [PATCH 0484/1062] Added Token Owner in ABI and Token UI --- js/src/dapps/tokenreg/Tokens/Token/token.js | 7 ++++++- js/src/dapps/tokenreg/Tokens/actions.js | 3 ++- js/src/dapps/tokenreg/abi/tokenreg.json | 4 ++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/js/src/dapps/tokenreg/Tokens/Token/token.js b/js/src/dapps/tokenreg/Tokens/Token/token.js index adb960d174f..ebeedb13089 100644 --- a/js/src/dapps/tokenreg/Tokens/Token/token.js +++ b/js/src/dapps/tokenreg/Tokens/Token/token.js @@ -24,7 +24,7 @@ export default class Token extends Component { }; render () { - const { isLoading, address, tla, base, name, meta } = this.props; + const { isLoading, address, tla, base, name, meta, owner } = this.props; if (isLoading) { return ( @@ -48,6 +48,11 @@ export default class Token extends Component { value={address} label="Address" /> + +
    (dispatch, getState) => { address: result[0], tla: result[1], base: result[2].toNumber(), - name: result[3] + name: result[3], + owner: result[4] }; console.log(`token loaded: #${index}`, data); diff --git a/js/src/dapps/tokenreg/abi/tokenreg.json b/js/src/dapps/tokenreg/abi/tokenreg.json index fc813bc1cf9..d3fc43d8c60 100644 --- a/js/src/dapps/tokenreg/abi/tokenreg.json +++ b/js/src/dapps/tokenreg/abi/tokenreg.json @@ -24,6 +24,10 @@ { "name": "o_name", "type": "string" + }, + { + "name": "o_owner", + "type": "address" } ], "type": "function" From 589e3c1b95becdd9808e9a99bc141f77f6f19d2f Mon Sep 17 00:00:00 2001 From: Jannis R Date: Wed, 14 Sep 2016 16:59:26 +0200 Subject: [PATCH 0485/1062] registry: filter by event type --- .../dapps/registry/Application/application.js | 2 +- js/src/dapps/registry/events/actions.js | 15 ++++-- js/src/dapps/registry/events/events.css | 4 ++ js/src/dapps/registry/events/events.js | 50 ++++++++++++++++--- js/src/dapps/registry/events/reducers.js | 35 ++++++++++--- 5 files changed, 87 insertions(+), 19 deletions(-) diff --git a/js/src/dapps/registry/Application/application.js b/js/src/dapps/registry/Application/application.js index 4aefeb6c7df..967836a4642 100644 --- a/js/src/dapps/registry/Application/application.js +++ b/js/src/dapps/registry/Application/application.js @@ -49,7 +49,7 @@ export default class Application extends Component {
    - +
    ) : ( diff --git a/js/src/dapps/registry/events/actions.js b/js/src/dapps/registry/events/actions.js index 2998f63f29c..3b1ad29e652 100644 --- a/js/src/dapps/registry/events/actions.js +++ b/js/src/dapps/registry/events/actions.js @@ -1,23 +1,27 @@ export const start = (name, from, to) => ({ type: 'events subscribe start', name, from, to }); - -export const event = (name, event) => ({ type: 'events event', event: { ...event, type: name } }); - export const fail = (name) => ({ type: 'events subscribe fail', name }); +export const success = (name, subscription) => ({ type: 'events subscribe success', name, subscription }); + +export const event = (name, event) => ({ type: 'events event', name, event }); export const subscribe = (name, from = 0, to = 'latest') => (dispatch, getState) => { const { contract } = getState(); - if (!contract || !contract.instance) return; + if (!contract) return; + const opt = { fromBlock: from, toBlock: to }; dispatch(start(name, from, to)); - contract.subscribe(name, { fromBlock: from, toBlock: to }, (err, events) => { + const subscription = contract.subscribe(name, opt, (err, events) => { if (err) { console.error(`could not subscribe to event ${name}.`); console.error(err); return dispatch(fail(name)); } + dispatch(success(name, subscription)); + for (let e of events) { const data = { + type: name, key: '' + e.transactionHash + e.logIndex, state: e.type, block: e.blockNumber, @@ -25,6 +29,7 @@ export const subscribe = (name, from = 0, to = 'latest') => transaction: e.transactionHash, parameters: e.params }; + console.warn('event', data); dispatch(event(name, data)); } }); diff --git a/js/src/dapps/registry/events/events.css b/js/src/dapps/registry/events/events.css index 2c9296edb38..ff144dd6282 100644 --- a/js/src/dapps/registry/events/events.css +++ b/js/src/dapps/registry/events/events.css @@ -2,6 +2,10 @@ margin: 1em; } +.options { + margin: 0 .5em; +} + .reserved, .dropped { margin: .5em 0; display: flex; diff --git a/js/src/dapps/registry/events/events.js b/js/src/dapps/registry/events/events.js index 91371ab8a59..1f873dad922 100644 --- a/js/src/dapps/registry/events/events.js +++ b/js/src/dapps/registry/events/events.js @@ -1,10 +1,17 @@ import React, { Component, PropTypes } from 'react'; -import { Card, CardHeader, CardText } from 'material-ui/Card'; +import { Card, CardHeader, CardActions, CardText } from 'material-ui/Card'; +import Checkbox from 'material-ui/Checkbox'; import { IdentityIcon } from '../parity.js'; import styles from './events.css'; import bytesToHex from '../../../api/util/bytes-array-to-hex'; +const inlineButton = { + display: 'inline-block', + width: 'auto', + marginRight: '1em' +}; + const renderOwner = (owner) => ( @@ -41,18 +48,32 @@ export default class Events extends Component { static propTypes = { actions: PropTypes.object.isRequired, + subscriptions: PropTypes.object.isRequired, + pending: PropTypes.object.isRequired, events: PropTypes.array.isRequired } - componentDidMount () { - // TODO remove this - this.props.actions.subscribe('Reserved', 0, 'latest'); - this.props.actions.subscribe('Dropped', 0, 'latest'); - } render () { + const { subscriptions, pending } = this.props; return ( + + + + { this.props.events .filter((e) => eventTypes[e.type]) @@ -61,4 +82,21 @@ export default class Events extends Component { ); } + + onReservedChanged = (e, isChecked) => { + const { pending, subscriptions, actions } = this.props; + if (!pending.Reserved) { + if (isChecked && subscriptions.Reserved === null) { + actions.subscribe('Reserved'); + } + } + }; + onDroppedChanged = (e, isChecked) => { + const { pending, subscriptions, actions } = this.props; + if (!pending.Dropped) { + if (isChecked && subscriptions.Dropped === null) { + actions.subscribe('Dropped'); + } + } + }; } diff --git a/js/src/dapps/registry/events/reducers.js b/js/src/dapps/registry/events/reducers.js index 1e6993b0ff4..68ba784b7e6 100644 --- a/js/src/dapps/registry/events/reducers.js +++ b/js/src/dapps/registry/events/reducers.js @@ -1,4 +1,14 @@ -const initialState = []; +const initialState = { + subscriptions: { + Reserved: null, + Dropped: null + }, + pending: { + Reserved: false, + Dropped: false + }, + events: [] +}; const sortEvents = (a, b) => { const d = a.block.minus(b.block).toFixed(0); @@ -7,19 +17,30 @@ const sortEvents = (a, b) => { }; export default (state = initialState, action) => { + if (!(action.name in state.subscriptions)) { // invalid event name + return state; + } + if (action.type === 'events subscribe start') { - return state; // TODO store the subscriptions? + return { ...state, pending: { ...state.pending, [action.name]: true } }; } if (action.type === 'events subscribe fail') { - return state; // TODO ? + return { ...state, pending: { ...state.pending, [action.name]: false } }; + } + if (action.type === 'events subscribe success') { + return { + ...state, + pending: { ...state.pending, [action.name]: false }, + subscriptions: { ...state.subscriptions, [action.name]: action.subscription } + }; } - if (action.type === 'events event') { - if (action.event.state !== 'mined') return state; - return state + if (action.type === 'events event' && action.event.state === 'mined') { + return { ...state, events: state.events .filter((event) => event.key !== action.event.key) .concat(action.event) - .sort(sortEvents); + .sort(sortEvents) + }; } return state; From 0ae0107e482797b37fda459f43e945ec8c2ba1a9 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Wed, 14 Sep 2016 18:46:12 +0200 Subject: [PATCH 0486/1062] registry: toggles, unsubscribing --- js/src/dapps/registry/events/actions.js | 11 ++++++++++ js/src/dapps/registry/events/events.js | 26 ++++++++++++++---------- js/src/dapps/registry/events/reducers.js | 10 +++++++++ 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/js/src/dapps/registry/events/actions.js b/js/src/dapps/registry/events/actions.js index 3b1ad29e652..76809aa83b9 100644 --- a/js/src/dapps/registry/events/actions.js +++ b/js/src/dapps/registry/events/actions.js @@ -34,3 +34,14 @@ export const subscribe = (name, from = 0, to = 'latest') => } }); }; + +export const unsubscribe = (name) => + (dispatch, getState) => { + const state = getState(); + if (!state.contract) return; + const subscriptions = state.events.subscriptions; + if (!(name in subscriptions) || subscriptions[name] === null) return; + + state.contract.unsubscribe(subscriptions[name]); + dispatch({ type: 'events unsubscribe', name }); + }; diff --git a/js/src/dapps/registry/events/events.js b/js/src/dapps/registry/events/events.js index 1f873dad922..df88fb86d89 100644 --- a/js/src/dapps/registry/events/events.js +++ b/js/src/dapps/registry/events/events.js @@ -1,6 +1,6 @@ import React, { Component, PropTypes } from 'react'; import { Card, CardHeader, CardActions, CardText } from 'material-ui/Card'; -import Checkbox from 'material-ui/Checkbox'; +import Toggle from 'material-ui/Toggle'; import { IdentityIcon } from '../parity.js'; import styles from './events.css'; @@ -59,18 +59,18 @@ export default class Events extends Component { - - @@ -83,19 +83,23 @@ export default class Events extends Component { ); } - onReservedChanged = (e, isChecked) => { + onReservedToggle = (e, isToggled) => { const { pending, subscriptions, actions } = this.props; if (!pending.Reserved) { - if (isChecked && subscriptions.Reserved === null) { + if (isToggled && subscriptions.Reserved === null) { actions.subscribe('Reserved'); + } else if (!isToggled && subscriptions.Reserved !== null) { + actions.unsubscribe('Reserved'); } } }; - onDroppedChanged = (e, isChecked) => { + onDroppedToggle = (e, isToggled) => { const { pending, subscriptions, actions } = this.props; if (!pending.Dropped) { - if (isChecked && subscriptions.Dropped === null) { + if (isToggled && subscriptions.Dropped === null) { actions.subscribe('Dropped'); + } else if (!isToggled && subscriptions.Dropped !== null) { + actions.unsubscribe('Dropped'); } } }; diff --git a/js/src/dapps/registry/events/reducers.js b/js/src/dapps/registry/events/reducers.js index 68ba784b7e6..f732f0365cc 100644 --- a/js/src/dapps/registry/events/reducers.js +++ b/js/src/dapps/registry/events/reducers.js @@ -35,6 +35,16 @@ export default (state = initialState, action) => { }; } + if (action.type === 'events unsubscribe') { + console.warn('events unsubscribe', action); + return { + ...state, + pending: { ...state.pending, [action.name]: false }, + subscriptions: { ...state.subscriptions, [action.name]: null }, + events: state.events.filter((event) => event.type !== action.name) + }; + } + if (action.type === 'events event' && action.event.state === 'mined') { return { ...state, events: state.events .filter((event) => event.key !== action.event.key) From b2771fe573067e6e89d487e1ff8c6b213b6a9948 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 14 Sep 2016 19:02:21 +0200 Subject: [PATCH 0487/1062] allow className in Select --- js/src/ui/Form/Select/select.js | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/js/src/ui/Form/Select/select.js b/js/src/ui/Form/Select/select.js index 75e1ffca9d4..fde17cf37e6 100644 --- a/js/src/ui/Form/Select/select.js +++ b/js/src/ui/Form/Select/select.js @@ -31,6 +31,7 @@ const NAME_ID = ' '; export default class Select extends Component { static propTypes = { children: PropTypes.node, + className: PropTypes.string, disabled: PropTypes.bool, error: PropTypes.string, hint: PropTypes.string, @@ -45,24 +46,27 @@ export default class Select extends Component { } render () { + const { disabled, error, label, hint, value, children, className, onBlur, onChange, onKeyDown } = this.props; + return ( - { this.props.children } + value={ value } + onBlur={ onBlur } + onChange={ onChange } + onKeyDown={ onKeyDown }> + { children } ); } From cc87e5ed33a4d559f7f90ddace1229102cedac16 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 14 Sep 2016 19:02:34 +0200 Subject: [PATCH 0488/1062] add missing provider logos --- js/src/images/etherscan-logo.png | Bin 0 -> 8605 bytes js/src/images/shapeshift-logo.png | Bin 0 -> 15127 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 js/src/images/etherscan-logo.png create mode 100644 js/src/images/shapeshift-logo.png diff --git a/js/src/images/etherscan-logo.png b/js/src/images/etherscan-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3d7aaa29512ebd3da25201d767ca52456de1492d GIT binary patch literal 8605 zcmV;OA!6Q%P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf00v@9M??Vs0RI60 zpuMM)00007bV*G`2jB+_3mOjOancR|03i)YL_t(|UhSO+SQS^=$6p0$0-~Z~MZu1} zV~M?MtTC1-YK&%0Hl}A&)^$xUrkYJNi5iW)8`s_uyNC!j5D^p=P?0L2-}`@OhCBCi z3(e@}yFVYE=`&}}Id45@uBGlXWXF!3V)4KQDfixex|4C2m-nbtDI!l-XL58Xtsb>w z=dVGr1qm0kd6$Cs5>d;9X>NP2%|FkMbep}RS`dHk1dab95)9n6&{WI zlyz~Udu*{fut2>%vLkhAR8!8;Kf{ilN10+-q%Srcp-_i`o>q=94w~+lPpfES?a?p;QN0dTaq!~YNqo1~glCxuJ%7G8}0C99EMd?{N)UTC4t^3DF zb*~*ej~;~*qz-S)r(@9xhhr!o}sQ4sn2 zlvnrKvGee;X?J$E+Zg;?BBg?`c|d`0Sq^6T$Flf0l6IGF?tep|M}AQ}@`h z^Kda6BVnpf-Ra+nWx@=EKZC67T&hvggPh7ZkehQE%FVq;DeS&oxtU7Nyw6-Dhiu-a ze?Cb)o7PtM*s=3)Fe^yy-}seI$0mwp`ZIt)Ozqu*zImpvy2k+0?E~LkMj3Z=WXg~! zNIqPfKSSLz&yWvR(8<^v)Xv|B+Sjkff7PjN-D)DB=D3lPM(?i-p(T66X>i+mH1D~A z>XE`T_=DxNJ3Ln1BJ!{5MWJ)1s9SdaD&!NS9bqvvh#S9*Lus>CprnDt^Q}~lBEOlc z?#a)J1CccTs|`{nQ((#77#>LPj(JSolbYn`coVl0|U%0AnDct$}RdvnIUxj=XtEw&s|}QX)GkB?3g`H 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 literal 0 HcmV?d00001 diff --git a/js/src/images/shapeshift-logo.png b/js/src/images/shapeshift-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..586a01ef13a7ce480d46b88fe6dc457d3083c966 GIT binary patch literal 15127 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 Date: Wed, 14 Sep 2016 18:48:06 +0100 Subject: [PATCH 0489/1062] Webpack Improvements --- js/package.json | 4 ++-- js/src/dapps/gavcoin.html | 5 ++++- js/src/dapps/registry.html | 5 ++++- js/src/dapps/tokenreg.html | 5 ++++- js/src/index.html | 3 +++ js/webpack.config.js | 20 +++++++++++--------- 6 files changed, 28 insertions(+), 14 deletions(-) diff --git a/js/package.json b/js/package.json index 81e70cacaea..359b83434bd 100644 --- a/js/package.json +++ b/js/package.json @@ -96,8 +96,8 @@ "style-loader": "^0.13.0", "url-loader": "^0.5.7", "web3": "^0.17.0-alpha", - "webpack": "^1.12.14", - "webpack-dev-server": "^1.14.1", + "webpack": "^1.13.2", + "webpack-dev-server": "^1.15.2", "webpack-error-notification": "0.1.6", "webpack-hot-middleware": "^2.7.1", "websocket": "^1.0.23" diff --git a/js/src/dapps/gavcoin.html b/js/src/dapps/gavcoin.html index 9a7030201d3..c5382c75207 100644 --- a/js/src/dapps/gavcoin.html +++ b/js/src/dapps/gavcoin.html @@ -7,10 +7,13 @@ GAVcoin + +
    + - + diff --git a/js/src/dapps/registry.html b/js/src/dapps/registry.html index 82fd57db7bf..56803104ec0 100644 --- a/js/src/dapps/registry.html +++ b/js/src/dapps/registry.html @@ -7,10 +7,13 @@ Token Registry + +
    + - + diff --git a/js/src/dapps/tokenreg.html b/js/src/dapps/tokenreg.html index 874a03c19c0..f06cd6a532e 100644 --- a/js/src/dapps/tokenreg.html +++ b/js/src/dapps/tokenreg.html @@ -7,10 +7,13 @@ Token Registry + +
    + - + diff --git a/js/src/index.html b/js/src/index.html index 0450813e787..71aa2ff5fd8 100644 --- a/js/src/index.html +++ b/js/src/index.html @@ -12,9 +12,12 @@ height: 100%; } + +
    + diff --git a/js/webpack.config.js b/js/webpack.config.js index aa1d6e6f6bd..654647ebbdd 100644 --- a/js/webpack.config.js +++ b/js/webpack.config.js @@ -8,6 +8,8 @@ var WebpackErrorNotificationPlugin = require('webpack-error-notification'); var ENV = process.env.NODE_ENV || 'development'; var isProd = ENV === 'production'; +var extractCSS = new ExtractTextPlugin('[name].css', { allChunks: true }); + module.exports = { debug: !isProd, cache: !isProd, @@ -57,24 +59,22 @@ module.exports = { { test: /\.css$/, include: [/src/], - loaders: [ - 'style', + loader: extractCSS.extract('style', [ 'css?modules&sourceMap&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]', 'postcss' - ] + ]) }, { test: /\.css$/, exclude: [/src/], - loader: 'style!css' + loader: extractCSS.extract('style', 'css') }, { test: /\.less$/, - loaders: [ - 'style', + loader: extractCSS.extract('style', [ 'css', 'less' - ] + ]) }, { test: /\.(png|jpg|)$/, @@ -110,7 +110,8 @@ module.exports = { ], plugins: (function () { var plugins = [ - new ExtractTextPlugin('[name].css'), + extractCSS, + new WebpackErrorNotificationPlugin(), // TODO [todr] paths in dapp-styles is hardcoded for meteor, we need to rewrite it here // TODO [jacogr] this shit needs to go, e.g. dapp-styles @@ -128,7 +129,8 @@ module.exports = { RPC_ADDRESS: JSON.stringify(process.env.RPC_ADDRESS), LOGGING: JSON.stringify(!isProd) } - }) + }), + new webpack.optimize.CommonsChunkPlugin('commons', 'commons.js') ]; if (isProd) { From 24fff4498724d78d1bd46624390efcde19112ada Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 14 Sep 2016 20:57:25 +0200 Subject: [PATCH 0490/1062] actually export the newError action --- js/src/redux/actions.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/js/src/redux/actions.js b/js/src/redux/actions.js index c4da73a9106..29c05dd1e47 100644 --- a/js/src/redux/actions.js +++ b/js/src/redux/actions.js @@ -14,9 +14,11 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . +import { newError } from '../ui/Errors/actions'; import { clearStatusLogs, toggleStatusLogs } from './providers/statusActions'; export { + newError, clearStatusLogs, toggleStatusLogs }; From be99b0961b56c739832cb07752e6188232af7fc9 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 14 Sep 2016 20:57:36 +0200 Subject: [PATCH 0491/1062] add support for buttons --- js/src/ui/IdentityIcon/identityIcon.css | 7 +++++++ js/src/ui/IdentityIcon/identityIcon.js | 24 +++++++++++++++++++----- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/js/src/ui/IdentityIcon/identityIcon.css b/js/src/ui/IdentityIcon/identityIcon.css index 0d25225b828..810a98bc157 100644 --- a/js/src/ui/IdentityIcon/identityIcon.css +++ b/js/src/ui/IdentityIcon/identityIcon.css @@ -42,3 +42,10 @@ display: inline; margin-right: 0.75em; } + +.button { + display: inline; + width: 24px; + height: 24px; + margin: 6px 0.25em 0 12px; +} diff --git a/js/src/ui/IdentityIcon/identityIcon.js b/js/src/ui/IdentityIcon/identityIcon.js index 4aa1eb3c9ba..541a3b1f6aa 100644 --- a/js/src/ui/IdentityIcon/identityIcon.js +++ b/js/src/ui/IdentityIcon/identityIcon.js @@ -25,6 +25,7 @@ export default class IdentityIcon extends Component { static propTypes = { address: PropTypes.string, + button: PropTypes.bool, className: PropTypes.string, center: PropTypes.bool, padded: PropTypes.bool, @@ -54,7 +55,7 @@ export default class IdentityIcon extends Component { updateIcon (_address) { const { api } = this.context; - const { tokens, inline } = this.props; + const { button, tokens, inline } = this.props; const token = (tokens || {})[_address]; if (token && token.images) { @@ -65,16 +66,29 @@ export default class IdentityIcon extends Component { return; } + let scale = 7; + if (button) { + scale = 3; + } else if (inline) { + scale = 4; + } + this.setState({ - iconsrc: api.util.createIdentityImg(_address, inline ? 4 : 7) + iconsrc: api.util.createIdentityImg(_address, scale) }); } render () { - const { className, center, inline, padded } = this.props; + const { button, className, center, inline, padded } = this.props; const { iconsrc } = this.state; - const size = inline ? '32px' : '56px'; - const classes = `${styles.icon} ${center ? styles.center : styles.left} ${padded ? styles.padded : ''} ${inline ? styles.inline : ''} ${className}`; + const classes = `${styles.icon} ${center ? styles.center : styles.left} ${padded ? styles.padded : ''} ${inline ? styles.inline : ''} ${button ? styles.button : ''} ${className}`; + + let size = '56px'; + if (button) { + size = '24px'; + } else if (inline) { + size = '32px'; + } return ( Date: Wed, 14 Sep 2016 21:04:59 +0200 Subject: [PATCH 0492/1062] coin retrieval available --- js/src/modals/FundAccount/Options/index.js | 17 +++ js/src/modals/FundAccount/Options/options.css | 55 +++++++++ js/src/modals/FundAccount/Options/options.js | 91 +++++++++++++++ js/src/modals/FundAccount/fundAccount.css | 27 +++++ js/src/modals/FundAccount/fundAccount.js | 110 ++++++++++++++++-- 5 files changed, 291 insertions(+), 9 deletions(-) create mode 100644 js/src/modals/FundAccount/Options/index.js create mode 100644 js/src/modals/FundAccount/Options/options.css create mode 100644 js/src/modals/FundAccount/Options/options.js create mode 100644 js/src/modals/FundAccount/fundAccount.css diff --git a/js/src/modals/FundAccount/Options/index.js b/js/src/modals/FundAccount/Options/index.js new file mode 100644 index 00000000000..ac8efa820a2 --- /dev/null +++ b/js/src/modals/FundAccount/Options/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './Options'; diff --git a/js/src/modals/FundAccount/Options/options.css b/js/src/modals/FundAccount/Options/options.css new file mode 100644 index 00000000000..07719a9ca6c --- /dev/null +++ b/js/src/modals/FundAccount/Options/options.css @@ -0,0 +1,55 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ +.coinselector { +} + +.coinselector .coinselect { + margin-top: 11px; +} + +.coinselect { + max-height: 36px; + padding: 4px 0 0 0; + line-height: 32px; +} + +.coinimage { + display: inline-block; + width: 32px; + height: 32px; + margin-right: 0.5em; +} + +.coindetails { + display: inline-block; + vertical-align: top; +} + +.coinsymbol { + display: inline-block; + margin-right: 0.5em; + color: #aaa; +} + +.coinname { + display: inline-block; +} + +.nocoins { + padding-top: 1em; + color: #aaa; +} diff --git a/js/src/modals/FundAccount/Options/options.js b/js/src/modals/FundAccount/Options/options.js new file mode 100644 index 00000000000..fb4a87c59e5 --- /dev/null +++ b/js/src/modals/FundAccount/Options/options.js @@ -0,0 +1,91 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; +import { MenuItem } from 'material-ui'; + +import { Form, Input, Select } from '../../../ui'; + +import styles from './options.css'; + +export default class Options extends Component { + static propTypes = { + coinSymbol: PropTypes.string.isRequired, + coins: PropTypes.array.isRequired + }; + + render () { + const { coinSymbol, coins } = this.props; + const label = `(optional) ${coinSymbol} return address`; + + if (!coins.length) { + return ( +
    + There are currently no coins available to fund with. +
    + ); + } + + const items = coins.map(this.renderCoinSelectItem); + + return ( +
    + + + + ); + } + + renderCoinSelectItem = (coin) => { + const { image, name, symbol } = coin; + + const item = ( +
    + +
    +
    + { symbol } +
    +
    + { name } +
    +
    +
    + ); + + return ( + + { item } + + ); + } + + onSelectCoin = (event, idx, value) => { + console.log(idx, value); + } +} diff --git a/js/src/modals/FundAccount/fundAccount.css b/js/src/modals/FundAccount/fundAccount.css new file mode 100644 index 00000000000..b2654cd4170 --- /dev/null +++ b/js/src/modals/FundAccount/fundAccount.css @@ -0,0 +1,27 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ +.shapeshift { + position: absolute; + bottom: 0.5em; + left: 1em; + cursor: pointer; + outline: none; +} + +.shapeshift img { + height: 28px; +} diff --git a/js/src/modals/FundAccount/fundAccount.js b/js/src/modals/FundAccount/fundAccount.js index 5460c38356e..41f222ba2ce 100644 --- a/js/src/modals/FundAccount/fundAccount.js +++ b/js/src/modals/FundAccount/fundAccount.js @@ -15,22 +15,38 @@ // along with Parity. If not, see . import React, { Component, PropTypes } from 'react'; - +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; import { FlatButton } from 'material-ui'; import ContentClear from 'material-ui/svg-icons/content/clear'; -import { Modal } from '../../ui'; +import { IdentityIcon, Modal } from '../../ui'; +import { newError } from '../../redux/actions'; +import initShapeshift from '../../3rdparty/shapeshift'; +import shapeshiftLogo from '../../images/shapeshift-logo.png'; + +import Options from './Options'; +import styles from './fundAccount.css'; -const STAGE_NAMES = ['fund account']; +const shapeshift = initShapeshift(); -export default class FundAccount extends Component { +const STAGE_NAMES = ['details', 'awaiting deposit', 'awaiting exchange', 'completed']; + +class FundAccount extends Component { static propTypes = { address: PropTypes.string.isRequired, + newError: PropTypes.func.isRequired, onClose: PropTypes.func } state = { - stage: 0 + stage: 0, + coinSymbol: 'BTC', + coins: [] + } + + componentDidMount () { + this.retrieveCoins(); } render () { @@ -42,21 +58,62 @@ export default class FundAccount extends Component { current={ stage } steps={ STAGE_NAMES } visible> -
    - Placeholder until such time as we have the ShapeShift.io integration going (just time, a scarce commodity) -
    + { this.renderPage() } ); } renderDialogActions () { - return ( + const { address } = this.props; + const { coins, stage } = this.state; + + const logo = ( + + + + ); + const cancelBtn = ( } label='Cancel' primary onTouchTap={ this.onClose } /> ); + + switch (stage) { + case 0: + return [ + logo, + cancelBtn, + } + label='Shift Funds' + primary + onTouchTap={ this.onShift } /> + ]; + } + } + + renderPage () { + const { coinSymbol, coins, stage } = this.state; + + switch (stage) { + case 0: + return ( + + ); + } + } + + nextStage = () => { + const { stage } = this.state; + + this.setState({ + stage: stage + 1 + }); } onClose = () => { @@ -66,4 +123,39 @@ export default class FundAccount extends Component { this.props.onClose && this.props.onClose(); }); } + + onShift = () => { + this.nextStage(); + } + + retrieveCoins () { + const { newError } = this.props; + + shapeshift + .getCoins() + .then((_coins) => { + const coins = Object.values(_coins).filter((coin) => coin.status === 'available'); + + this.setState({ + coins + }); + }) + .catch((error) => { + console.error('retrieveCoins', error); + newError(new Error(`Failed to retrieve coins from ShapeShift.io: ${error.message}`)); + }); + } +} + +function mapStateToProps (state) { + return {}; } + +function mapDispatchToProps (dispatch) { + return bindActionCreators({ newError }, dispatch); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(FundAccount); From 39f736aafb0406aaaf520813e9dc6f7596fda985 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 14 Sep 2016 21:31:02 +0200 Subject: [PATCH 0493/1062] allow subscriptions to statusses --- js/src/3rdparty/shapeshift/shapeshift.js | 46 +++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/js/src/3rdparty/shapeshift/shapeshift.js b/js/src/3rdparty/shapeshift/shapeshift.js index 7d20f155b36..e7c99c1991b 100644 --- a/js/src/3rdparty/shapeshift/shapeshift.js +++ b/js/src/3rdparty/shapeshift/shapeshift.js @@ -15,6 +15,8 @@ // along with Parity. If not, see . export default function (rpc) { + const subscriptions = []; + function getCoins () { return rpc.get('getcoins'); } @@ -35,10 +37,52 @@ export default function (rpc) { }); } + function subscribe (depositAddress, callback) { + const idx = subscriptions.length; + + subscriptions.push({ + depositAddress, + callback, + idx + }); + + return idx; + } + + function _getStatusSubscription (subscription) { + if (!subscription) { + return; + } + + getStatus(subscription.depositAddress) + .then((result) => { + switch (result.status) { + case 'no_deposits': + case 'received': + subscription.callback(null, status); + return; + + case 'complete': + case 'failed': + subscription.callback(status.error, status); + subscriptions[subscription.idx] = null; + return; + } + }) + .catch((error) => subscription.callback(error.message)); + } + + function _pollStatus () { + subscriptions.map(_getStatusSubscription); + } + + setInterval(_pollStatus, 2000); + return { getCoins, getMarketInfo, getStatus, - shift + shift, + subscribe }; } From 3cca307e5e1171ebeb8fde08aa1f1cae365a84d2 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 14 Sep 2016 22:26:05 +0200 Subject: [PATCH 0494/1062] simplify subscription state handling --- js/src/3rdparty/shapeshift/shapeshift.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/js/src/3rdparty/shapeshift/shapeshift.js b/js/src/3rdparty/shapeshift/shapeshift.js index e7c99c1991b..79635e90ad4 100644 --- a/js/src/3rdparty/shapeshift/shapeshift.js +++ b/js/src/3rdparty/shapeshift/shapeshift.js @@ -63,13 +63,17 @@ export default function (rpc) { return; case 'complete': + subscription.callback(null, status); + subscriptions[subscription.idx] = null; + return; + case 'failed': - subscription.callback(status.error, status); + subscription.callback({ message: status.error }); subscriptions[subscription.idx] = null; return; } }) - .catch((error) => subscription.callback(error.message)); + .catch(subscription.callback); } function _pollStatus () { From 0b71fc8c088d46fcd729b4cf0abb0df577af9775 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 14 Sep 2016 22:42:19 +0200 Subject: [PATCH 0495/1062] fatal error indicator --- js/src/3rdparty/shapeshift/shapeshift.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/js/src/3rdparty/shapeshift/shapeshift.js b/js/src/3rdparty/shapeshift/shapeshift.js index 79635e90ad4..fb60ab171bb 100644 --- a/js/src/3rdparty/shapeshift/shapeshift.js +++ b/js/src/3rdparty/shapeshift/shapeshift.js @@ -45,11 +45,9 @@ export default function (rpc) { callback, idx }); - - return idx; } - function _getStatusSubscription (subscription) { + function _getSubscriptionStatus (subscription) { if (!subscription) { return; } @@ -68,7 +66,10 @@ export default function (rpc) { return; case 'failed': - subscription.callback({ message: status.error }); + subscription.callback({ + message: status.error, + fatal: true + }); subscriptions[subscription.idx] = null; return; } @@ -77,7 +78,7 @@ export default function (rpc) { } function _pollStatus () { - subscriptions.map(_getStatusSubscription); + subscriptions.map(_getSubscriptionStatus); } setInterval(_pollStatus, 2000); From b09c7c9bc263fa3eb93f440c7a6276caca88e95c Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 15 Sep 2016 00:41:34 +0200 Subject: [PATCH 0496/1062] render modal titles correctly in the case where there are no steps --- js/src/ui/Modal/ModalSteps/modalSteps.js | 32 +++++++++++-------- .../{ModalSteps/modalSteps.css => modal.css} | 0 js/src/ui/Modal/modal.js | 10 +++++- 3 files changed, 27 insertions(+), 15 deletions(-) rename js/src/ui/Modal/{ModalSteps/modalSteps.css => modal.css} (100%) diff --git a/js/src/ui/Modal/ModalSteps/modalSteps.js b/js/src/ui/Modal/ModalSteps/modalSteps.js index 80745e9828d..30e9d5b5d90 100644 --- a/js/src/ui/Modal/ModalSteps/modalSteps.js +++ b/js/src/ui/Modal/ModalSteps/modalSteps.js @@ -18,7 +18,7 @@ import React, { Component, PropTypes } from 'react'; import { Step, Stepper, StepLabel } from 'material-ui/Stepper'; -import styles from './modalSteps.css'; +import styles from '../modal.css'; export default class ModalSteps extends Component { static propTypes = { @@ -31,27 +31,31 @@ export default class ModalSteps extends Component { render () { const { current, steps, title } = this.props; - const timeline = steps.map((label) => { - return ( - - - { label } - - - ); - }); return ( -
    +

    { steps[current] }

    { title }
    - { timeline } + { this.renderTimeline() }
    ); } + + renderTimeline () { + const { steps } = this.props; + + return steps.map((label) => { + return ( + + + { label } + + + ); + }); + } } diff --git a/js/src/ui/Modal/ModalSteps/modalSteps.css b/js/src/ui/Modal/modal.css similarity index 100% rename from js/src/ui/Modal/ModalSteps/modalSteps.css rename to js/src/ui/Modal/modal.css diff --git a/js/src/ui/Modal/modal.js b/js/src/ui/Modal/modal.js index 064a5d54568..1a688015f31 100644 --- a/js/src/ui/Modal/modal.js +++ b/js/src/ui/Modal/modal.js @@ -25,6 +25,8 @@ const TITLE_STYLE = { borderStyle: 'none' }; const DIALOG_STYLE = { paddingTop: '1px' }; const CONTENT_STYLE = { transform: 'translate(0px, 0px)' }; +import styles from './modal.css'; + export default class Modal extends Component { static propTypes = { actions: PropTypes.node, @@ -40,7 +42,7 @@ export default class Modal extends Component { render () { const { actions, current, children, scroll, steps, title, visible } = this.props; - let header = title; + let header; if (steps) { header = ( @@ -49,6 +51,12 @@ export default class Modal extends Component { steps={ steps } title={ title } /> ); + } else { + header = ( +
    +

    { title }

    +
    + ); } return ( From 03b3a3670b767968baf05d6b887280ad9da3e45c Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 15 Sep 2016 01:17:24 +0200 Subject: [PATCH 0497/1062] fix children propType --- js/src/ui/Form/form.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/ui/Form/form.js b/js/src/ui/Form/form.js index c7e9846375e..930f3c51d17 100644 --- a/js/src/ui/Form/form.js +++ b/js/src/ui/Form/form.js @@ -20,7 +20,7 @@ import styles from './form.css'; export default class Form extends Component { static propTypes = { - children: PropTypes.array + children: PropTypes.node } render () { From 937f3d22f25dc4f0613326ae048922444a0c614c Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 15 Sep 2016 01:26:06 +0200 Subject: [PATCH 0498/1062] allow intermediate progress bar to be displayed on top on modals --- js/src/ui/Modal/ModalSteps/modalSteps.js | 19 ++++++++++++++++++- js/src/ui/Modal/modal.css | 4 ++++ js/src/ui/Modal/modal.js | 4 +++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/js/src/ui/Modal/ModalSteps/modalSteps.js b/js/src/ui/Modal/ModalSteps/modalSteps.js index 30e9d5b5d90..81c8931bf3a 100644 --- a/js/src/ui/Modal/ModalSteps/modalSteps.js +++ b/js/src/ui/Modal/ModalSteps/modalSteps.js @@ -15,7 +15,7 @@ // along with Parity. If not, see . import React, { Component, PropTypes } from 'react'; - +import { LinearProgress } from 'material-ui'; import { Step, Stepper, StepLabel } from 'material-ui/Stepper'; import styles from '../modal.css'; @@ -24,6 +24,7 @@ export default class ModalSteps extends Component { static propTypes = { current: PropTypes.number, steps: PropTypes.array.isRequired, + waiting: PropTypes.array, title: React.PropTypes.oneOfType([ PropTypes.node, PropTypes.string ]) @@ -40,6 +41,7 @@ export default class ModalSteps extends Component { activeStep={ current }> { this.renderTimeline() } + { this.renderWaiting() }
    ); } @@ -58,4 +60,19 @@ export default class ModalSteps extends Component { ); }); } + + renderWaiting () { + const { current, waiting } = this.props; + const isWaiting = (waiting || []).includes(current); + + if (!isWaiting) { + return null; + } + + return ( +
    + +
    + ); + } } diff --git a/js/src/ui/Modal/modal.css b/js/src/ui/Modal/modal.css index ccae6654500..034b7c5528a 100644 --- a/js/src/ui/Modal/modal.css +++ b/js/src/ui/Modal/modal.css @@ -23,3 +23,7 @@ margin: 0; text-transform: uppercase; } + +.waiting { + margin: 0 -1em 0 -1em; +} diff --git a/js/src/ui/Modal/modal.js b/js/src/ui/Modal/modal.js index 1a688015f31..c897344e2cc 100644 --- a/js/src/ui/Modal/modal.js +++ b/js/src/ui/Modal/modal.js @@ -32,6 +32,7 @@ export default class Modal extends Component { actions: PropTypes.node, children: PropTypes.node, current: PropTypes.number, + waiting: PropTypes.array, scroll: PropTypes.bool, steps: PropTypes.array, title: React.PropTypes.oneOfType([ @@ -41,13 +42,14 @@ export default class Modal extends Component { } render () { - const { actions, current, children, scroll, steps, title, visible } = this.props; + const { actions, current, children, scroll, steps, waiting, title, visible } = this.props; let header; if (steps) { header = ( ); From 3e5c8df9b382e4a610e9d5a24b3d3e1618fe73e0 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 15 Sep 2016 01:47:49 +0200 Subject: [PATCH 0499/1062] UI looks reasonably presentable, testing with network next --- .../awaitingDepositStep.js | 54 +++++ .../FundAccount/AwaitingDepositStep/index.js | 17 ++ .../awaitingExchangeStep.js | 45 ++++ .../FundAccount/AwaitingExchangeStep/index.js | 17 ++ .../CompletedStep/completedStep.js | 52 +++++ .../modals/FundAccount/CompletedStep/index.js | 17 ++ .../modals/FundAccount/ErrorStep/errorStep.js | 43 ++++ js/src/modals/FundAccount/ErrorStep/index.js | 17 ++ .../modals/FundAccount/OptionsStep/index.js | 17 ++ .../optionsStep.css} | 11 +- .../options.js => OptionsStep/optionsStep.js} | 64 ++++-- .../FundAccount/{Options => Price}/index.js | 2 +- js/src/modals/FundAccount/Price/price.css | 22 ++ js/src/modals/FundAccount/Price/price.js | 49 +++++ js/src/modals/FundAccount/Value/index.js | 17 ++ js/src/modals/FundAccount/Value/value.css | 24 +++ js/src/modals/FundAccount/Value/value.js | 42 ++++ js/src/modals/FundAccount/fundAccount.css | 9 + js/src/modals/FundAccount/fundAccount.js | 194 ++++++++++++++++-- 19 files changed, 667 insertions(+), 46 deletions(-) create mode 100644 js/src/modals/FundAccount/AwaitingDepositStep/awaitingDepositStep.js create mode 100644 js/src/modals/FundAccount/AwaitingDepositStep/index.js create mode 100644 js/src/modals/FundAccount/AwaitingExchangeStep/awaitingExchangeStep.js create mode 100644 js/src/modals/FundAccount/AwaitingExchangeStep/index.js create mode 100644 js/src/modals/FundAccount/CompletedStep/completedStep.js create mode 100644 js/src/modals/FundAccount/CompletedStep/index.js create mode 100644 js/src/modals/FundAccount/ErrorStep/errorStep.js create mode 100644 js/src/modals/FundAccount/ErrorStep/index.js create mode 100644 js/src/modals/FundAccount/OptionsStep/index.js rename js/src/modals/FundAccount/{Options/options.css => OptionsStep/optionsStep.css} (93%) rename js/src/modals/FundAccount/{Options/options.js => OptionsStep/optionsStep.js} (52%) rename js/src/modals/FundAccount/{Options => Price}/index.js (95%) create mode 100644 js/src/modals/FundAccount/Price/price.css create mode 100644 js/src/modals/FundAccount/Price/price.js create mode 100644 js/src/modals/FundAccount/Value/index.js create mode 100644 js/src/modals/FundAccount/Value/value.css create mode 100644 js/src/modals/FundAccount/Value/value.js diff --git a/js/src/modals/FundAccount/AwaitingDepositStep/awaitingDepositStep.js b/js/src/modals/FundAccount/AwaitingDepositStep/awaitingDepositStep.js new file mode 100644 index 00000000000..94d61530d71 --- /dev/null +++ b/js/src/modals/FundAccount/AwaitingDepositStep/awaitingDepositStep.js @@ -0,0 +1,54 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import { Form, Input } from '../../../ui'; + +import Value from '../Value'; + +import styles from '../fundAccount.css'; + +export default class AwaitingDepositStep extends Component { + static propTypes = { + coinSymbol: PropTypes.string.isRequired, + depositAddress: PropTypes.string.isRequired, + price: PropTypes.shape({ + rate: PropTypes.number.isRequired, + minimum: PropTypes.number.isRequired, + limit: PropTypes.number.isRequired + }).isRequired + } + + render () { + const { coinSymbol, depositAddress, price } = this.props; + const label = `send the ${coinSymbol} funds for exchange to (in your ${coinSymbol} network client)`; + + return ( +
    +
    + ShapeShift.io is awaiting a deposit ( minimum, maximum). +
    +
    + + +
    + ); + } +} diff --git a/js/src/modals/FundAccount/AwaitingDepositStep/index.js b/js/src/modals/FundAccount/AwaitingDepositStep/index.js new file mode 100644 index 00000000000..e888b6b815e --- /dev/null +++ b/js/src/modals/FundAccount/AwaitingDepositStep/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './awaitingDepositStep'; diff --git a/js/src/modals/FundAccount/AwaitingExchangeStep/awaitingExchangeStep.js b/js/src/modals/FundAccount/AwaitingExchangeStep/awaitingExchangeStep.js new file mode 100644 index 00000000000..b14336e8446 --- /dev/null +++ b/js/src/modals/FundAccount/AwaitingExchangeStep/awaitingExchangeStep.js @@ -0,0 +1,45 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; +import Value from '../Value'; + +import styles from '../fundAccount.css'; + +export default class AwaitingExchangeStep extends Component { + static propTypes = { + depositInfo: PropTypes.shape({ + incomingCoin: PropTypes.number.isRequired, + incomingType: PropTypes.string.isRequired + }).isRequired + } + + render () { + const { depositInfo } = this.props; + const { incomingCoin, incomingType } = depositInfo; + + return ( +
    +
    + ShapeShift.io has received a deposit of . +
    +
    + Awaiting the exchange and transfer of funds to your Parity account. +
    +
    + ); + } +} diff --git a/js/src/modals/FundAccount/AwaitingExchangeStep/index.js b/js/src/modals/FundAccount/AwaitingExchangeStep/index.js new file mode 100644 index 00000000000..215fea893ba --- /dev/null +++ b/js/src/modals/FundAccount/AwaitingExchangeStep/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './awaitingExchangeStep'; diff --git a/js/src/modals/FundAccount/CompletedStep/completedStep.js b/js/src/modals/FundAccount/CompletedStep/completedStep.js new file mode 100644 index 00000000000..3e9b55e940a --- /dev/null +++ b/js/src/modals/FundAccount/CompletedStep/completedStep.js @@ -0,0 +1,52 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import Value from '../Value'; + +import styles from '../fundAccount.css'; + +export default class CompletedStep extends Component { + static propTypes = { + address: PropTypes.string.isRequired, + depositInfo: PropTypes.shape({ + incomingCoin: PropTypes.number.isRequired, + incomingType: PropTypes.string.isRequired + }).isRequired, + exchangeInfo: PropTypes.shape({ + outgoingCoin: PropTypes.number.isRequired, + outgoingType: PropTypes.string.isRequired + }).isRequired + } + + render () { + const { depositInfo, exchangeInfo } = this.props; + const { incomingCoin, incomingType } = depositInfo; + const { outgoingCoin, outgoingType } = exchangeInfo; + + return ( +
    +
    + ShapeShift.io has completed the exchange of for . +
    +
    + The funds will reflect in your Parity account shortly. +
    +
    + ); + } +} diff --git a/js/src/modals/FundAccount/CompletedStep/index.js b/js/src/modals/FundAccount/CompletedStep/index.js new file mode 100644 index 00000000000..64e1d619939 --- /dev/null +++ b/js/src/modals/FundAccount/CompletedStep/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './completedStep'; diff --git a/js/src/modals/FundAccount/ErrorStep/errorStep.js b/js/src/modals/FundAccount/ErrorStep/errorStep.js new file mode 100644 index 00000000000..e786f6f06a0 --- /dev/null +++ b/js/src/modals/FundAccount/ErrorStep/errorStep.js @@ -0,0 +1,43 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import styles from '../fundAccount.css'; + +export default class ErrorStep extends Component { + static propTypes = { + error: PropTypes.shape({ + fatal: PropTypes.bool, + message: PropTypes.string.isRequired + }).isRequired + } + + render () { + const { error } = this.props; + + return ( +
    +
    + The funds shifting via ShapeShift.io failed with a fatal error on the exchange. The error message received from the exchange is as follow: +
    +
    + { error.message } +
    +
    + ); + } +} diff --git a/js/src/modals/FundAccount/ErrorStep/index.js b/js/src/modals/FundAccount/ErrorStep/index.js new file mode 100644 index 00000000000..93379cab9bc --- /dev/null +++ b/js/src/modals/FundAccount/ErrorStep/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './errorStep'; diff --git a/js/src/modals/FundAccount/OptionsStep/index.js b/js/src/modals/FundAccount/OptionsStep/index.js new file mode 100644 index 00000000000..18b819c67e3 --- /dev/null +++ b/js/src/modals/FundAccount/OptionsStep/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './optionsStep'; diff --git a/js/src/modals/FundAccount/Options/options.css b/js/src/modals/FundAccount/OptionsStep/optionsStep.css similarity index 93% rename from js/src/modals/FundAccount/Options/options.css rename to js/src/modals/FundAccount/OptionsStep/optionsStep.css index 07719a9ca6c..d52617af7bc 100644 --- a/js/src/modals/FundAccount/Options/options.css +++ b/js/src/modals/FundAccount/OptionsStep/optionsStep.css @@ -14,6 +14,13 @@ /* You should have received a copy of the GNU General Public License /* along with Parity. If not, see . */ +.body { +} + +.accept { + padding: 1.5em 0; +} + .coinselector { } @@ -49,7 +56,7 @@ display: inline-block; } -.nocoins { - padding-top: 1em; +.empty { + padding-top: 1.5em; color: #aaa; } diff --git a/js/src/modals/FundAccount/Options/options.js b/js/src/modals/FundAccount/OptionsStep/optionsStep.js similarity index 52% rename from js/src/modals/FundAccount/Options/options.js rename to js/src/modals/FundAccount/OptionsStep/optionsStep.js index fb4a87c59e5..eaf754fce2c 100644 --- a/js/src/modals/FundAccount/Options/options.js +++ b/js/src/modals/FundAccount/OptionsStep/optionsStep.js @@ -15,25 +15,33 @@ // along with Parity. If not, see . import React, { Component, PropTypes } from 'react'; -import { MenuItem } from 'material-ui'; +import { Checkbox, MenuItem } from 'material-ui'; import { Form, Input, Select } from '../../../ui'; -import styles from './options.css'; +import Price from '../Price'; -export default class Options extends Component { +import styles from './optionsStep.css'; + +export default class OptionsStep extends Component { static propTypes = { + refundAddress: PropTypes.string.isRequired, coinSymbol: PropTypes.string.isRequired, - coins: PropTypes.array.isRequired + coins: PropTypes.array.isRequired, + price: PropTypes.object, + hasAccepted: PropTypes.bool.isRequired, + onChangeSymbol: PropTypes.func.isRequired, + onChangeRefund: PropTypes.func.isRequired, + onToggleAccept: PropTypes.func.isRequired }; render () { - const { coinSymbol, coins } = this.props; + const { coinSymbol, coins, refundAddress, hasAccepted, onToggleAccept } = this.props; const label = `(optional) ${coinSymbol} return address`; - if (!coins.length) { + if (false && !coins.length) { return ( -
    +
    There are currently no coins available to fund with.
    ); @@ -42,19 +50,29 @@ export default class Options extends Component { const items = coins.map(this.renderCoinSelectItem); return ( -
    - - - +
    +
    + + + + + +
    ); } @@ -86,6 +104,10 @@ export default class Options extends Component { } onSelectCoin = (event, idx, value) => { - console.log(idx, value); + this.props.onChangeSymbol(value); + } + + onChangeAddress = (event, value) => { + this.props.onChangeRefund(value); } } diff --git a/js/src/modals/FundAccount/Options/index.js b/js/src/modals/FundAccount/Price/index.js similarity index 95% rename from js/src/modals/FundAccount/Options/index.js rename to js/src/modals/FundAccount/Price/index.js index ac8efa820a2..920094acfe1 100644 --- a/js/src/modals/FundAccount/Options/index.js +++ b/js/src/modals/FundAccount/Price/index.js @@ -14,4 +14,4 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -export default from './Options'; +export default from './price'; diff --git a/js/src/modals/FundAccount/Price/price.css b/js/src/modals/FundAccount/Price/price.css new file mode 100644 index 00000000000..8e56dd7d58a --- /dev/null +++ b/js/src/modals/FundAccount/Price/price.css @@ -0,0 +1,22 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ +.body { +} + +.empty { + color: #aaa; +} diff --git a/js/src/modals/FundAccount/Price/price.js b/js/src/modals/FundAccount/Price/price.js new file mode 100644 index 00000000000..2cbc2301405 --- /dev/null +++ b/js/src/modals/FundAccount/Price/price.js @@ -0,0 +1,49 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import Value from '../Value'; +import styles from './price.css'; + +export default class Price extends Component { + static propTypes = { + coinSymbol: PropTypes.string.isRequired, + price: PropTypes.shape({ + rate: PropTypes.number.isRequired, + minimum: PropTypes.number.isRequired, + limit: PropTypes.number.isRequired + }) + } + + render () { + const { coinSymbol, price } = this.props; + + if (!price) { + return ( +
    + The price information is not available yet. +
    + ); + } + + return ( +
    + = ( minimum, maximum) +
    + ); + } +} diff --git a/js/src/modals/FundAccount/Value/index.js b/js/src/modals/FundAccount/Value/index.js new file mode 100644 index 00000000000..588b4c42191 --- /dev/null +++ b/js/src/modals/FundAccount/Value/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './value'; diff --git a/js/src/modals/FundAccount/Value/value.css b/js/src/modals/FundAccount/Value/value.css new file mode 100644 index 00000000000..746b5d1686b --- /dev/null +++ b/js/src/modals/FundAccount/Value/value.css @@ -0,0 +1,24 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ +.body { + display: inline-block; + color: #aaa; +} + +.amount { + display: inline-block; +} diff --git a/js/src/modals/FundAccount/Value/value.js b/js/src/modals/FundAccount/Value/value.js new file mode 100644 index 00000000000..02d8465a37a --- /dev/null +++ b/js/src/modals/FundAccount/Value/value.js @@ -0,0 +1,42 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; +import React, { Component, PropTypes } from 'react'; + +import styles from './value.css'; + +export default class Value extends Component { + static propTypes = { + amount: PropTypes.number, + symbol: PropTypes.string + } + + render () { + const { amount, symbol } = this.props; + + let value = ''; + if (amount) { + value = new BigNumber(amount).toFormat(6); + } + + return ( +
    + { value }{ symbol || 'ΞTH' } +
    + ); + } +} diff --git a/js/src/modals/FundAccount/fundAccount.css b/js/src/modals/FundAccount/fundAccount.css index b2654cd4170..ca71080fa65 100644 --- a/js/src/modals/FundAccount/fundAccount.css +++ b/js/src/modals/FundAccount/fundAccount.css @@ -25,3 +25,12 @@ .shapeshift img { height: 28px; } + +.info { + padding-top: 1.5em; +} + +.error { + padding-top: 1.5em; + color: #e44; +} diff --git a/js/src/modals/FundAccount/fundAccount.js b/js/src/modals/FundAccount/fundAccount.js index 41f222ba2ce..9a84a082aab 100644 --- a/js/src/modals/FundAccount/fundAccount.js +++ b/js/src/modals/FundAccount/fundAccount.js @@ -18,6 +18,7 @@ import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import { FlatButton } from 'material-ui'; +import ActionDoneAll from 'material-ui/svg-icons/action/done-all'; import ContentClear from 'material-ui/svg-icons/content/clear'; import { IdentityIcon, Modal } from '../../ui'; @@ -25,7 +26,12 @@ import { newError } from '../../redux/actions'; import initShapeshift from '../../3rdparty/shapeshift'; import shapeshiftLogo from '../../images/shapeshift-logo.png'; -import Options from './Options'; +import AwaitingDepositStep from './AwaitingDepositStep'; +import AwaitingExchangeStep from './AwaitingExchangeStep'; +import CompletedStep from './CompletedStep'; +import ErrorStep from './ErrorStep'; +import OptionsStep from './OptionsStep'; + import styles from './fundAccount.css'; const shapeshift = initShapeshift(); @@ -42,7 +48,15 @@ class FundAccount extends Component { state = { stage: 0, coinSymbol: 'BTC', - coins: [] + coinPair: 'btc_eth', + coins: [], + depositAddress: '', + refundAddress: '', + price: { rate: 123.456, minimum: 0.2, limit: 678.987 }, + depositInfo: null, + exchangeInfo: null, + error: {}, + hasAccepted: false } componentDidMount () { @@ -50,13 +64,15 @@ class FundAccount extends Component { } render () { - const { stage } = this.state; + const { error, stage } = this.state; return ( { this.renderPage() } @@ -65,7 +81,7 @@ class FundAccount extends Component { renderDialogActions () { const { address } = this.props; - const { coins, stage } = this.state; + const { coins, error, stage, hasAccepted } = this.state; const logo = ( @@ -80,69 +96,203 @@ class FundAccount extends Component { onTouchTap={ this.onClose } /> ); + if (error.fatal) { + return [ + logo, + cancelBtn + ]; + } + switch (stage) { case 0: return [ logo, cancelBtn, } label='Shift Funds' primary onTouchTap={ this.onShift } /> ]; + + case 1: + case 2: + return [ + logo, + cancelBtn + ]; + + case 3: + return [ + logo, + } + label='Close' + primary + onTouchTap={ this.onClose } /> + ]; } } renderPage () { - const { coinSymbol, coins, stage } = this.state; + const { error, stage } = this.state; + + if (error.fatal) { + return ( + + ); + } switch (stage) { case 0: return ( - + + ); + + case 1: + return ( + + ); + + case 2: + return ( + + ); + + case 3: + return ( + ); } } - nextStage = () => { - const { stage } = this.state; + setStage (stage) { + this.setState({ + stage, + error: {} + }); + } + setFatalError (message) { this.setState({ - stage: stage + 1 + stage: 0, + error: { + fatal: true, + message + } }); } onClose = () => { + this.setStage(0); + this.props.onClose && this.props.onClose(); + } + + onShift = () => { + const { address, newError } = this.props; + const { coinPair, refundAddress } = this.state; + + shapeshift + .shift(address, refundAddress, coinPair) + .then((result) => { + const depositAddress = result.deposit; + + this.setState({ depositAddress }, () => { + this.setStage(1); + shapeshift.subscribe(depositAddress, this.onExchangeInfo); + }); + }) + .catch((error) => { + console.error('onShift', error); + const message = `Failed to start exchange: ${error.message}`; + + newError(new Error(message)); + // this.setFatalError(message); + }); + } + + onChangeSymbol = (event, coinSymbol) => { + const coinPair = `${coinSymbol.toLowerCase()}_eth`; + this.setState({ - stage: 0 - }, () => { - this.props.onClose && this.props.onClose(); + coinPair, + coinSymbol, + price: null }); + this.getPrice(coinPair); } - onShift = () => { - this.nextStage(); + onChangeRefund = (event, refundAddress) => { + this.setState({ refundAddress }); + } + + onToggleAccept = () => { + const { hasAccepted } = this.state; + + this.setState({ + hasAccepted: !hasAccepted + }); + } + + onExchangeInfo = (error, result) => { + const { newError } = this.props; + + if (error) { + if (error.fatal) { + this.setFatalError(error.message); + } + + newError(error); + return; + } + + switch (result.status) { + case 'received': + this.setState({ depositInfo: result }); + this.setStage(2); + return; + + case 'complete': + this.setState({ exchangeInfo: result }); + this.setStage(3); + return; + } + } + + getPrice (coinPair) { + shapeshift + .getMarketInfo(coinPair) + .then((price) => { + this.setState({ price }); + }) + .catch((error) => { + console.error('getPrice', error); + }); } retrieveCoins () { const { newError } = this.props; + const { coinPair } = this.state; shapeshift .getCoins() .then((_coins) => { const coins = Object.values(_coins).filter((coin) => coin.status === 'available'); - this.setState({ - coins - }); + this.getPrice(coinPair); + this.setState({ coins }); }) .catch((error) => { console.error('retrieveCoins', error); - newError(new Error(`Failed to retrieve coins from ShapeShift.io: ${error.message}`)); + const message = `Failed to retrieve available coins from ShapeShift.io: ${error.message}`; + + newError(new Error(message)); + this.setFatalError(message); }); } } From 62c4fc75f6939092e80bf5f4e52d8290b2f3e91d Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 15 Sep 2016 01:49:37 +0200 Subject: [PATCH 0500/1062] remove testing price info as well --- js/src/modals/FundAccount/fundAccount.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/modals/FundAccount/fundAccount.js b/js/src/modals/FundAccount/fundAccount.js index 9a84a082aab..27c082fbf78 100644 --- a/js/src/modals/FundAccount/fundAccount.js +++ b/js/src/modals/FundAccount/fundAccount.js @@ -52,7 +52,7 @@ class FundAccount extends Component { coins: [], depositAddress: '', refundAddress: '', - price: { rate: 123.456, minimum: 0.2, limit: 678.987 }, + price: null, depositInfo: null, exchangeInfo: null, error: {}, From 581efd81f636fd4fc433e2415a13f194c189d891 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 15 Sep 2016 01:51:16 +0200 Subject: [PATCH 0501/1062] 3 decimal places, display is unwieldly --- js/src/modals/FundAccount/Value/value.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/modals/FundAccount/Value/value.js b/js/src/modals/FundAccount/Value/value.js index 02d8465a37a..6d32df5243a 100644 --- a/js/src/modals/FundAccount/Value/value.js +++ b/js/src/modals/FundAccount/Value/value.js @@ -30,7 +30,7 @@ export default class Value extends Component { let value = ''; if (amount) { - value = new BigNumber(amount).toFormat(6); + value = new BigNumber(amount).toFormat(3); } return ( From 769892749839596b4f83438e19139474206df913 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 15 Sep 2016 10:33:08 +0200 Subject: [PATCH 0502/1062] remove debug for no coins available --- js/src/modals/FundAccount/OptionsStep/optionsStep.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/modals/FundAccount/OptionsStep/optionsStep.js b/js/src/modals/FundAccount/OptionsStep/optionsStep.js index eaf754fce2c..aefdaa254c4 100644 --- a/js/src/modals/FundAccount/OptionsStep/optionsStep.js +++ b/js/src/modals/FundAccount/OptionsStep/optionsStep.js @@ -39,7 +39,7 @@ export default class OptionsStep extends Component { const { coinSymbol, coins, refundAddress, hasAccepted, onToggleAccept } = this.props; const label = `(optional) ${coinSymbol} return address`; - if (false && !coins.length) { + if (!coins.length) { return (
    There are currently no coins available to fund with. From 81c8eeddc1af9097cdf9c5d1c839cd9defc3cb9a Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 15 Sep 2016 10:34:30 +0200 Subject: [PATCH 0503/1062] update coin message slightly --- js/src/modals/FundAccount/OptionsStep/optionsStep.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/modals/FundAccount/OptionsStep/optionsStep.js b/js/src/modals/FundAccount/OptionsStep/optionsStep.js index aefdaa254c4..6ed0e2af3b3 100644 --- a/js/src/modals/FundAccount/OptionsStep/optionsStep.js +++ b/js/src/modals/FundAccount/OptionsStep/optionsStep.js @@ -42,7 +42,7 @@ export default class OptionsStep extends Component { if (!coins.length) { return (
    - There are currently no coins available to fund with. + There are currently no exchange pairs/coins available to fund with.
    ); } From 885d321a4923b73d5bf2e80e0d34a59f86c4325a Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 15 Sep 2016 10:53:59 +0200 Subject: [PATCH 0504/1062] treat coin changes properly --- js/src/modals/FundAccount/OptionsStep/optionsStep.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/modals/FundAccount/OptionsStep/optionsStep.js b/js/src/modals/FundAccount/OptionsStep/optionsStep.js index 6ed0e2af3b3..b9b029ce5d7 100644 --- a/js/src/modals/FundAccount/OptionsStep/optionsStep.js +++ b/js/src/modals/FundAccount/OptionsStep/optionsStep.js @@ -104,7 +104,7 @@ export default class OptionsStep extends Component { } onSelectCoin = (event, idx, value) => { - this.props.onChangeSymbol(value); + this.props.onChangeSymbol(event, value); } onChangeAddress = (event, value) => { From ab7faf2ce16aca90c1f9632bb854ba0694b0331d Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 15 Sep 2016 10:54:09 +0200 Subject: [PATCH 0505/1062] busy shifting flag --- js/src/modals/FundAccount/fundAccount.js | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/js/src/modals/FundAccount/fundAccount.js b/js/src/modals/FundAccount/fundAccount.js index 27c082fbf78..37f9b60df9c 100644 --- a/js/src/modals/FundAccount/fundAccount.js +++ b/js/src/modals/FundAccount/fundAccount.js @@ -56,7 +56,8 @@ class FundAccount extends Component { depositInfo: null, exchangeInfo: null, error: {}, - hasAccepted: false + hasAccepted: false, + shifting: false } componentDidMount () { @@ -81,7 +82,7 @@ class FundAccount extends Component { renderDialogActions () { const { address } = this.props; - const { coins, error, stage, hasAccepted } = this.state; + const { coins, error, stage, hasAccepted, shifting } = this.state; const logo = (
    @@ -109,7 +110,7 @@ class FundAccount extends Component { logo, cancelBtn, } label='Shift Funds' primary @@ -197,9 +198,14 @@ class FundAccount extends Component { const { address, newError } = this.props; const { coinPair, refundAddress } = this.state; + this.setState({ + shifting: true + }); + shapeshift .shift(address, refundAddress, coinPair) .then((result) => { + console.log('onShift', result); const depositAddress = result.deposit; this.setState({ depositAddress }, () => { @@ -212,7 +218,7 @@ class FundAccount extends Component { const message = `Failed to start exchange: ${error.message}`; newError(new Error(message)); - // this.setFatalError(message); + this.setFatalError(message); }); } @@ -243,6 +249,8 @@ class FundAccount extends Component { const { newError } = this.props; if (error) { + console.error('onExchangeInfo', error); + if (error.fatal) { this.setFatalError(error.message); } @@ -251,6 +259,8 @@ class FundAccount extends Component { return; } + console.log('onExchangeInfo', result.status, result); + switch (result.status) { case 'received': this.setState({ depositInfo: result }); From 8b6b07cf6aded427d8ce426ed3b5d1d80784ed6f Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 15 Sep 2016 10:55:51 +0200 Subject: [PATCH 0506/1062] pass correct result through to callback --- js/src/3rdparty/shapeshift/shapeshift.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/3rdparty/shapeshift/shapeshift.js b/js/src/3rdparty/shapeshift/shapeshift.js index fb60ab171bb..fc4aa39c0fd 100644 --- a/js/src/3rdparty/shapeshift/shapeshift.js +++ b/js/src/3rdparty/shapeshift/shapeshift.js @@ -57,11 +57,11 @@ export default function (rpc) { switch (result.status) { case 'no_deposits': case 'received': - subscription.callback(null, status); + subscription.callback(null, result); return; case 'complete': - subscription.callback(null, status); + subscription.callback(null, result); subscriptions[subscription.idx] = null; return; From 902c8ace945d9fbef532137bc5f9be386243777c Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 15 Sep 2016 11:06:49 +0200 Subject: [PATCH 0507/1062] fix PropTypes as received --- js/src/modals/FundAccount/CompletedStep/completedStep.js | 3 +-- js/src/modals/FundAccount/Value/value.js | 5 ++++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/js/src/modals/FundAccount/CompletedStep/completedStep.js b/js/src/modals/FundAccount/CompletedStep/completedStep.js index 3e9b55e940a..6e49dd86f71 100644 --- a/js/src/modals/FundAccount/CompletedStep/completedStep.js +++ b/js/src/modals/FundAccount/CompletedStep/completedStep.js @@ -22,13 +22,12 @@ import styles from '../fundAccount.css'; export default class CompletedStep extends Component { static propTypes = { - address: PropTypes.string.isRequired, depositInfo: PropTypes.shape({ incomingCoin: PropTypes.number.isRequired, incomingType: PropTypes.string.isRequired }).isRequired, exchangeInfo: PropTypes.shape({ - outgoingCoin: PropTypes.number.isRequired, + outgoingCoin: PropTypes.string.isRequired, outgoingType: PropTypes.string.isRequired }).isRequired } diff --git a/js/src/modals/FundAccount/Value/value.js b/js/src/modals/FundAccount/Value/value.js index 6d32df5243a..d0b3845f48f 100644 --- a/js/src/modals/FundAccount/Value/value.js +++ b/js/src/modals/FundAccount/Value/value.js @@ -21,7 +21,10 @@ import styles from './value.css'; export default class Value extends Component { static propTypes = { - amount: PropTypes.number, + amount: PropTypes.oneOfType([ + PropTypes.number, + PropTypes.string + ]), symbol: PropTypes.string } From 38e2e426ba0aefaff34657d3b8d4673e4f909617 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 15 Sep 2016 12:16:57 +0200 Subject: [PATCH 0508/1062] slightly more presentable UI... --- .../awaitingDepositStep.js | 37 +++++++++++++------ .../awaitingExchangeStep.js | 9 +++-- .../CompletedStep/completedStep.js | 7 +++- js/src/modals/FundAccount/Price/price.css | 22 ----------- js/src/modals/FundAccount/Price/price.js | 17 +++++---- js/src/modals/FundAccount/fundAccount.css | 32 +++++++++++++++- js/src/modals/FundAccount/fundAccount.js | 7 ++-- 7 files changed, 79 insertions(+), 52 deletions(-) delete mode 100644 js/src/modals/FundAccount/Price/price.css diff --git a/js/src/modals/FundAccount/AwaitingDepositStep/awaitingDepositStep.js b/js/src/modals/FundAccount/AwaitingDepositStep/awaitingDepositStep.js index 94d61530d71..fd61d1ff82a 100644 --- a/js/src/modals/FundAccount/AwaitingDepositStep/awaitingDepositStep.js +++ b/js/src/modals/FundAccount/AwaitingDepositStep/awaitingDepositStep.js @@ -16,8 +16,6 @@ import React, { Component, PropTypes } from 'react'; -import { Form, Input } from '../../../ui'; - import Value from '../Value'; import styles from '../fundAccount.css'; @@ -25,7 +23,7 @@ import styles from '../fundAccount.css'; export default class AwaitingDepositStep extends Component { static propTypes = { coinSymbol: PropTypes.string.isRequired, - depositAddress: PropTypes.string.isRequired, + depositAddress: PropTypes.string, price: PropTypes.shape({ rate: PropTypes.number.isRequired, minimum: PropTypes.number.isRequired, @@ -35,19 +33,34 @@ export default class AwaitingDepositStep extends Component { render () { const { coinSymbol, depositAddress, price } = this.props; - const label = `send the ${coinSymbol} funds for exchange to (in your ${coinSymbol} network client)`; + const typeSymbol = ( +
    + { coinSymbol } +
    + ); + if (!depositAddress) { + return ( +
    +
    + Awaiting confirmation of the deposit address for your { typeSymbol } funds exchange +
    +
    + ); + } return ( -
    +
    - ShapeShift.io is awaiting a deposit ( minimum, maximum). + ShapeShift.io is awaiting a { typeSymbol } deposit. Send the funds from you { typeSymbol } network client to - +
    +
    + { depositAddress } +
    +
    +
    + ( minimum, maximum) +
    -
    - -
    ); } diff --git a/js/src/modals/FundAccount/AwaitingExchangeStep/awaitingExchangeStep.js b/js/src/modals/FundAccount/AwaitingExchangeStep/awaitingExchangeStep.js index b14336e8446..4b1bbf61755 100644 --- a/js/src/modals/FundAccount/AwaitingExchangeStep/awaitingExchangeStep.js +++ b/js/src/modals/FundAccount/AwaitingExchangeStep/awaitingExchangeStep.js @@ -32,12 +32,15 @@ export default class AwaitingExchangeStep extends Component { const { incomingCoin, incomingType } = depositInfo; return ( -
    +
    - ShapeShift.io has received a deposit of . + ShapeShift.io has received a deposit of - +
    +
    +
    - Awaiting the exchange and transfer of funds to your Parity account. + Awaiting the completion of the funds exchange and transfer of funds to your Parity account.
    ); diff --git a/js/src/modals/FundAccount/CompletedStep/completedStep.js b/js/src/modals/FundAccount/CompletedStep/completedStep.js index 6e49dd86f71..bbc4a3ab857 100644 --- a/js/src/modals/FundAccount/CompletedStep/completedStep.js +++ b/js/src/modals/FundAccount/CompletedStep/completedStep.js @@ -38,9 +38,12 @@ export default class CompletedStep extends Component { const { outgoingCoin, outgoingType } = exchangeInfo; return ( -
    +
    - ShapeShift.io has completed the exchange of for . + ShapeShift.io has completed the funds exchange. +
    +
    + =>
    The funds will reflect in your Parity account shortly. diff --git a/js/src/modals/FundAccount/Price/price.css b/js/src/modals/FundAccount/Price/price.css deleted file mode 100644 index 8e56dd7d58a..00000000000 --- a/js/src/modals/FundAccount/Price/price.css +++ /dev/null @@ -1,22 +0,0 @@ -/* Copyright 2015, 2016 Ethcore (UK) Ltd. -/* This file is part of Parity. -/* -/* Parity is free software: you can redistribute it and/or modify -/* it under the terms of the GNU General Public License as published by -/* the Free Software Foundation, either version 3 of the License, or -/* (at your option) any later version. -/* -/* Parity is distributed in the hope that it will be useful, -/* but WITHOUT ANY WARRANTY; without even the implied warranty of -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -/* GNU General Public License for more details. -/* -/* You should have received a copy of the GNU General Public License -/* along with Parity. If not, see . -*/ -.body { -} - -.empty { - color: #aaa; -} diff --git a/js/src/modals/FundAccount/Price/price.js b/js/src/modals/FundAccount/Price/price.js index 2cbc2301405..a1f97e8610b 100644 --- a/js/src/modals/FundAccount/Price/price.js +++ b/js/src/modals/FundAccount/Price/price.js @@ -17,7 +17,7 @@ import React, { Component, PropTypes } from 'react'; import Value from '../Value'; -import styles from './price.css'; +import styles from '../fundAccount.css'; export default class Price extends Component { static propTypes = { @@ -33,16 +33,17 @@ export default class Price extends Component { const { coinSymbol, price } = this.props; if (!price) { - return ( -
    - The price information is not available yet. -
    - ); + return null; } return ( -
    - = ( minimum, maximum) +
    +
    + = +
    +
    + ( minimum, maximum) +
    ); } diff --git a/js/src/modals/FundAccount/fundAccount.css b/js/src/modals/FundAccount/fundAccount.css index ca71080fa65..af8ef97bf3c 100644 --- a/js/src/modals/FundAccount/fundAccount.css +++ b/js/src/modals/FundAccount/fundAccount.css @@ -14,6 +14,9 @@ /* You should have received a copy of the GNU General Public License /* along with Parity. If not, see . */ +.body { +} + .shapeshift { position: absolute; bottom: 0.5em; @@ -26,11 +29,38 @@ height: 28px; } -.info { +.info, .busy { padding-top: 1.5em; } +.center { +} + +.center div { + text-align: center; +} + .error { padding-top: 1.5em; color: #e44; } + +.hero { + padding-top: 0.75em; + text-align: center; + font-size: 1.75em; +} + +.symbol { + display: inline-block; + color: #aaa; +} + +.price div { + text-align: center; + font-size: small; +} + +.empty { + color: #aaa; +} diff --git a/js/src/modals/FundAccount/fundAccount.js b/js/src/modals/FundAccount/fundAccount.js index 37f9b60df9c..239afb58740 100644 --- a/js/src/modals/FundAccount/fundAccount.js +++ b/js/src/modals/FundAccount/fundAccount.js @@ -199,6 +199,7 @@ class FundAccount extends Component { const { coinPair, refundAddress } = this.state; this.setState({ + stage: 1, shifting: true }); @@ -208,10 +209,8 @@ class FundAccount extends Component { console.log('onShift', result); const depositAddress = result.deposit; - this.setState({ depositAddress }, () => { - this.setStage(1); - shapeshift.subscribe(depositAddress, this.onExchangeInfo); - }); + shapeshift.subscribe(depositAddress, this.onExchangeInfo); + this.setState({ depositAddress }); }) .catch((error) => { console.error('onShift', error); From 26d7b27791013b7d5180a3957a4f83e19958f87a Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 15 Sep 2016 12:27:12 +0200 Subject: [PATCH 0509/1062] removed etherscan logo, doesn't belong in this branch --- js/src/images/etherscan-logo.png | Bin 8605 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 js/src/images/etherscan-logo.png diff --git a/js/src/images/etherscan-logo.png b/js/src/images/etherscan-logo.png deleted file mode 100644 index 3d7aaa29512ebd3da25201d767ca52456de1492d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8605 zcmV;OA!6Q%P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf00v@9M??Vs0RI60 zpuMM)00007bV*G`2jB+_3mOjOancR|03i)YL_t(|UhSO+SQS^=$6p0$0-~Z~MZu1} zV~M?MtTC1-YK&%0Hl}A&)^$xUrkYJNi5iW)8`s_uyNC!j5D^p=P?0L2-}`@OhCBCi z3(e@}yFVYE=`&}}Id45@uBGlXWXF!3V)4KQDfixex|4C2m-nbtDI!l-XL58Xtsb>w z=dVGr1qm0kd6$Cs5>d;9X>NP2%|FkMbep}RS`dHk1dab95)9n6&{WI zlyz~Udu*{fut2>%vLkhAR8!8;Kf{ilN10+-q%Srcp-_i`o>q=94w~+lPpfES?a?p;QN0dTaq!~YNqo1~glCxuJ%7G8}0C99EMd?{N)UTC4t^3DF zb*~*ej~;~*qz-S)r(@9xhhr!o}sQ4sn2 zlvnrKvGee;X?J$E+Zg;?BBg?`c|d`0Sq^6T$Flf0l6IGF?tep|M}AQ}@`h z^Kda6BVnpf-Ra+nWx@=EKZC67T&hvggPh7ZkehQE%FVq;DeS&oxtU7Nyw6-Dhiu-a ze?Cb)o7PtM*s=3)Fe^yy-}seI$0mwp`ZIt)Ozqu*zImpvy2k+0?E~LkMj3Z=WXg~! zNIqPfKSSLz&yWvR(8<^v)Xv|B+Sjkff7PjN-D)DB=D3lPM(?i-p(T66X>i+mH1D~A z>XE`T_=DxNJ3Ln1BJ!{5MWJ)1s9SdaD&!NS9bqvvh#S9*Lus>CprnDt^Q}~lBEOlc z?#a)J1CccTs|`{nQ((#77#>LPj(JSolbYn`coVl0|U%0AnDct$}RdvnIUxj=XtEw&s|}QX)GkB?3g`H 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 From 5b11cefbcf676e7a0e9b59ba238ed09e19964d44 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 15 Sep 2016 12:44:23 +0200 Subject: [PATCH 0510/1062] transaction list powered by --- .../Account/Transactions/transactions.css | 11 +++++- .../Account/Transactions/transactions.js | 37 +++++++++++-------- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/js/src/views/Account/Transactions/transactions.css b/js/src/views/Account/Transactions/transactions.css index fec36696a52..0cd8365e680 100644 --- a/js/src/views/Account/Transactions/transactions.css +++ b/js/src/views/Account/Transactions/transactions.css @@ -27,13 +27,15 @@ } .transactions { +} + +.transactions table { width: 100%; } .transactions tr { line-height: 32px; vertical-align: top; - /*font-family: 'Roboto Mono', monospace;*/ } .transactions th { @@ -55,3 +57,10 @@ .infonone { opacity: 0.25; } + +.etherscan { + text-align: right; + padding-top: 1em; + font-size: small; + color: #aaa; +} diff --git a/js/src/views/Account/Transactions/transactions.js b/js/src/views/Account/Transactions/transactions.js index a1bd42065e2..2b69739882d 100644 --- a/js/src/views/Account/Transactions/transactions.js +++ b/js/src/views/Account/Transactions/transactions.js @@ -151,22 +151,27 @@ class Transactions extends Component { }); return ( -
    - { formatEther(tx.value) } + { formatEther(tx.value) } ΞTH
    - { formatEth(price) }ΞTH + { formatEth(price) } ΞTH - { formatCoins(value) }GAV + { formatCoins(value) } GAV - { formatHash(tx.hash) } + + { formatHash(tx.hash) } + { formatNumber(tx.blockNumber) } @@ -128,7 +131,7 @@ export default class Transactions extends Component { { formatTime(tx.timeStamp) } - { formatEther(tx.value) } ΞTH + { formatEther(tx.value) } { token }
      from totxhashtransaction block age value - + { this.renderAddressName(address) }
    - - - - - - - - - - - - - { rows } - -
     fromtotransactionblockagevalue
    +
    + + + + + + + + + + + + + + { rows } + +
     fromtotransactionblockagevalue
    +
    + Transaction list powered by etherscan.io +
    +
    ); } From c767217137bdfee5c5446edb1216544bc0aa75e7 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 15 Sep 2016 15:06:18 +0200 Subject: [PATCH 0511/1062] token icons show up in transaction list --- js/src/views/Account/Transactions/transactions.js | 1 + 1 file changed, 1 insertion(+) diff --git a/js/src/views/Account/Transactions/transactions.js b/js/src/views/Account/Transactions/transactions.js index a1bd42065e2..0185b348d62 100644 --- a/js/src/views/Account/Transactions/transactions.js +++ b/js/src/views/Account/Transactions/transactions.js @@ -91,6 +91,7 @@ class Transactions extends Component { Date: Thu, 15 Sep 2016 15:08:35 +0200 Subject: [PATCH 0512/1062] IdentityIcon show up on the send button --- js/src/modals/Transfer/transfer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/modals/Transfer/transfer.js b/js/src/modals/Transfer/transfer.js index 66943a2e506..fd1731998f0 100644 --- a/js/src/modals/Transfer/transfer.js +++ b/js/src/modals/Transfer/transfer.js @@ -21,7 +21,6 @@ import { bindActionCreators } from 'redux'; import { FlatButton } from 'material-ui'; import ActionDoneAll from 'material-ui/svg-icons/action/done-all'; import ContentClear from 'material-ui/svg-icons/content/clear'; -import ContentSend from 'material-ui/svg-icons/content/send'; import NavigationArrowBack from 'material-ui/svg-icons/navigation/arrow-back'; import NavigationArrowForward from 'material-ui/svg-icons/navigation/arrow-forward'; @@ -181,6 +180,7 @@ class Transfer extends Component { } renderDialogActions () { + const { account } = this.props; const { extras, sending, stage } = this.state; const cancelBtn = ( @@ -205,7 +205,7 @@ class Transfer extends Component { const sendBtn = ( } + icon={ } label='Send' primary onTouchTap={ this.onSend } /> ); From f55c7f9bb54c8c89cdd7627b654906221883da56 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 15 Sep 2016 15:13:45 +0200 Subject: [PATCH 0513/1062] fix calculation where transfer value is non-ETH --- js/src/modals/Transfer/transfer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/modals/Transfer/transfer.js b/js/src/modals/Transfer/transfer.js index fd1731998f0..2415e9e8452 100644 --- a/js/src/modals/Transfer/transfer.js +++ b/js/src/modals/Transfer/transfer.js @@ -501,7 +501,7 @@ class Transfer extends Component { const { gas, gasPrice, tag, valueAll, isEth } = this.state; const gasTotal = new BigNumber(gasPrice || 0).mul(new BigNumber(gas || 0)); const balance_ = balance.tokens.find((b) => tag === b.token.tag); - const availableEth = new BigNumber(balance_.value); + const availableEth = new BigNumber(balance.tokens[0].value); const available = new BigNumber(balance_.value); const format = new BigNumber(balance_.token.format || 1); From 0f85eb0f1316b78584bd1b2544d1c06d1a0d27c0 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 14 Sep 2016 20:57:36 +0200 Subject: [PATCH 0514/1062] add support for buttons --- js/src/ui/IdentityIcon/identityIcon.css | 7 +++++++ js/src/ui/IdentityIcon/identityIcon.js | 24 +++++++++++++++++++----- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/js/src/ui/IdentityIcon/identityIcon.css b/js/src/ui/IdentityIcon/identityIcon.css index 0d25225b828..810a98bc157 100644 --- a/js/src/ui/IdentityIcon/identityIcon.css +++ b/js/src/ui/IdentityIcon/identityIcon.css @@ -42,3 +42,10 @@ display: inline; margin-right: 0.75em; } + +.button { + display: inline; + width: 24px; + height: 24px; + margin: 6px 0.25em 0 12px; +} diff --git a/js/src/ui/IdentityIcon/identityIcon.js b/js/src/ui/IdentityIcon/identityIcon.js index 4aa1eb3c9ba..541a3b1f6aa 100644 --- a/js/src/ui/IdentityIcon/identityIcon.js +++ b/js/src/ui/IdentityIcon/identityIcon.js @@ -25,6 +25,7 @@ export default class IdentityIcon extends Component { static propTypes = { address: PropTypes.string, + button: PropTypes.bool, className: PropTypes.string, center: PropTypes.bool, padded: PropTypes.bool, @@ -54,7 +55,7 @@ export default class IdentityIcon extends Component { updateIcon (_address) { const { api } = this.context; - const { tokens, inline } = this.props; + const { button, tokens, inline } = this.props; const token = (tokens || {})[_address]; if (token && token.images) { @@ -65,16 +66,29 @@ export default class IdentityIcon extends Component { return; } + let scale = 7; + if (button) { + scale = 3; + } else if (inline) { + scale = 4; + } + this.setState({ - iconsrc: api.util.createIdentityImg(_address, inline ? 4 : 7) + iconsrc: api.util.createIdentityImg(_address, scale) }); } render () { - const { className, center, inline, padded } = this.props; + const { button, className, center, inline, padded } = this.props; const { iconsrc } = this.state; - const size = inline ? '32px' : '56px'; - const classes = `${styles.icon} ${center ? styles.center : styles.left} ${padded ? styles.padded : ''} ${inline ? styles.inline : ''} ${className}`; + const classes = `${styles.icon} ${center ? styles.center : styles.left} ${padded ? styles.padded : ''} ${inline ? styles.inline : ''} ${button ? styles.button : ''} ${className}`; + + let size = '56px'; + if (button) { + size = '24px'; + } else if (inline) { + size = '32px'; + } return ( Date: Thu, 15 Sep 2016 15:19:53 +0200 Subject: [PATCH 0515/1062] with button images, trial header title updates --- js/src/modals/Transfer/transfer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/modals/Transfer/transfer.js b/js/src/modals/Transfer/transfer.js index 2415e9e8452..c4ede2812f5 100644 --- a/js/src/modals/Transfer/transfer.js +++ b/js/src/modals/Transfer/transfer.js @@ -85,12 +85,12 @@ class Transfer extends Component { render () { const { stage, extras } = this.state; + // title={ this.renderAccount() } return ( { this.renderPage() } From 2560246a9fd5b402a3078966e21a9ddd9bf7c6ed Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 15 Sep 2016 15:21:57 +0200 Subject: [PATCH 0516/1062] token images show up in Signer again --- js/src/views/Signer/components/Account/Account.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/js/src/views/Signer/components/Account/Account.js b/js/src/views/Signer/components/Account/Account.js index 65a3c7169cd..248a9d497ae 100644 --- a/js/src/views/Signer/components/Account/Account.js +++ b/js/src/views/Signer/components/Account/Account.js @@ -56,11 +56,15 @@ class Account extends Component { } render () { - const { address, chain, className } = this.props; + const { address, chain, className, tokens } = this.props; + return (
    - + { this.renderName() } { this.renderBalance() } From a67aeb6ad49d8e91a21161797f9b35d30ee7451e Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Thu, 15 Sep 2016 14:40:51 +0100 Subject: [PATCH 0517/1062] Webpack performance fixes --- js/src/dapps/gavcoin.html | 2 -- js/src/dapps/registry.html | 2 -- js/src/dapps/tokenreg.html | 2 -- js/src/index.html | 2 -- js/webpack.config.js | 42 +++++++++++++++++++++++++++++++------- 5 files changed, 35 insertions(+), 15 deletions(-) diff --git a/js/src/dapps/gavcoin.html b/js/src/dapps/gavcoin.html index c5382c75207..fb82bffef6d 100644 --- a/js/src/dapps/gavcoin.html +++ b/js/src/dapps/gavcoin.html @@ -7,8 +7,6 @@ GAVcoin - -
    diff --git a/js/src/dapps/registry.html b/js/src/dapps/registry.html index 56803104ec0..84669764349 100644 --- a/js/src/dapps/registry.html +++ b/js/src/dapps/registry.html @@ -7,8 +7,6 @@ Token Registry - -
    diff --git a/js/src/dapps/tokenreg.html b/js/src/dapps/tokenreg.html index f06cd6a532e..748e40c207b 100644 --- a/js/src/dapps/tokenreg.html +++ b/js/src/dapps/tokenreg.html @@ -7,8 +7,6 @@ Token Registry - -
    diff --git a/js/src/index.html b/js/src/index.html index 71aa2ff5fd8..e2ebcb99bfa 100644 --- a/js/src/index.html +++ b/js/src/index.html @@ -12,8 +12,6 @@ height: 100%; } - -
    diff --git a/js/webpack.config.js b/js/webpack.config.js index 654647ebbdd..b977dea023a 100644 --- a/js/webpack.config.js +++ b/js/webpack.config.js @@ -56,26 +56,51 @@ module.exports = { test: /\.html$/, loader: 'file?name=[name].[ext]' }, + + // { + // test: /\.css$/, + // include: [/src/], + // loader: extractCSS.extract('style', [ + // 'css?modules&sourceMap&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]', + // 'postcss' + // ]) + // }, + // { + // test: /\.css$/, + // exclude: [/src/], + // loader: extractCSS.extract('style', 'css') + // }, + // { + // test: /\.less$/, + // loader: extractCSS.extract('style', [ + // 'css', + // 'less' + // ]) + // }, + { test: /\.css$/, include: [/src/], - loader: extractCSS.extract('style', [ + loaders: [ + 'style', 'css?modules&sourceMap&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]', 'postcss' - ]) + ] }, { test: /\.css$/, exclude: [/src/], - loader: extractCSS.extract('style', 'css') + loader: 'style!css' }, { test: /\.less$/, - loader: extractCSS.extract('style', [ + loaders: [ + 'style', 'css', 'less' - ]) + ] }, + { test: /\.(png|jpg|)$/, loader: 'file-loader' @@ -110,7 +135,7 @@ module.exports = { ], plugins: (function () { var plugins = [ - extractCSS, + // extractCSS, new WebpackErrorNotificationPlugin(), // TODO [todr] paths in dapp-styles is hardcoded for meteor, we need to rewrite it here @@ -130,7 +155,10 @@ module.exports = { LOGGING: JSON.stringify(!isProd) } }), - new webpack.optimize.CommonsChunkPlugin('commons', 'commons.js') + new webpack.optimize.CommonsChunkPlugin({ + filename: 'commons.js', + name: 'commons' + }) ]; if (isProd) { From 2244c58b05742654548997ff9a7bb69bca6fdc22 Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Thu, 15 Sep 2016 14:41:32 +0100 Subject: [PATCH 0518/1062] TokenReg dapp : register new token WIP --- .../AccountSelector/account-selector.css | 8 + .../AccountSelector/account-selector.js | 81 +++++++ .../Accounts/AccountSelector/container.js | 33 +++ .../Accounts/AccountSelector/index.js | 1 + js/src/dapps/tokenreg/Accounts/actions.js | 38 ++++ js/src/dapps/tokenreg/Accounts/reducer.js | 33 +++ .../dapps/tokenreg/Actions/Register/index.js | 1 + .../tokenreg/Actions/Register/register.js | 206 ++++++++++++++++++ js/src/dapps/tokenreg/Actions/actions.css | 33 +++ js/src/dapps/tokenreg/Actions/actions.js | 56 +++++ js/src/dapps/tokenreg/Actions/component.js | 67 ++++++ js/src/dapps/tokenreg/Actions/container.js | 39 ++++ js/src/dapps/tokenreg/Actions/index.js | 1 + js/src/dapps/tokenreg/Actions/reducer.js | 68 ++++++ js/src/dapps/tokenreg/Actions/validation.js | 86 ++++++++ .../dapps/tokenreg/Application/application.js | 3 + js/src/dapps/tokenreg/Container.js | 6 +- .../Status/{reducers.js => reducer.js} | 0 js/src/dapps/tokenreg/Tokens/Token/token.css | 2 +- .../Tokens/{reducers.js => reducer.js} | 0 js/src/dapps/tokenreg/reducers.js | 8 +- 21 files changed, 764 insertions(+), 6 deletions(-) create mode 100644 js/src/dapps/tokenreg/Accounts/AccountSelector/account-selector.css create mode 100644 js/src/dapps/tokenreg/Accounts/AccountSelector/account-selector.js create mode 100644 js/src/dapps/tokenreg/Accounts/AccountSelector/container.js create mode 100644 js/src/dapps/tokenreg/Accounts/AccountSelector/index.js create mode 100644 js/src/dapps/tokenreg/Accounts/actions.js create mode 100644 js/src/dapps/tokenreg/Accounts/reducer.js create mode 100644 js/src/dapps/tokenreg/Actions/Register/index.js create mode 100644 js/src/dapps/tokenreg/Actions/Register/register.js create mode 100644 js/src/dapps/tokenreg/Actions/actions.css create mode 100644 js/src/dapps/tokenreg/Actions/actions.js create mode 100644 js/src/dapps/tokenreg/Actions/component.js create mode 100644 js/src/dapps/tokenreg/Actions/container.js create mode 100644 js/src/dapps/tokenreg/Actions/index.js create mode 100644 js/src/dapps/tokenreg/Actions/reducer.js create mode 100644 js/src/dapps/tokenreg/Actions/validation.js rename js/src/dapps/tokenreg/Status/{reducers.js => reducer.js} (100%) rename js/src/dapps/tokenreg/Tokens/{reducers.js => reducer.js} (100%) diff --git a/js/src/dapps/tokenreg/Accounts/AccountSelector/account-selector.css b/js/src/dapps/tokenreg/Accounts/AccountSelector/account-selector.css new file mode 100644 index 00000000000..08aad7116fb --- /dev/null +++ b/js/src/dapps/tokenreg/Accounts/AccountSelector/account-selector.css @@ -0,0 +1,8 @@ +.account-selector { +} + +.avatar > img { + margin: 0; + width: 100%; + height: 100%; +} diff --git a/js/src/dapps/tokenreg/Accounts/AccountSelector/account-selector.js b/js/src/dapps/tokenreg/Accounts/AccountSelector/account-selector.js new file mode 100644 index 00000000000..c3f5ad0a44a --- /dev/null +++ b/js/src/dapps/tokenreg/Accounts/AccountSelector/account-selector.js @@ -0,0 +1,81 @@ +import React, { Component, PropTypes } from 'react'; +import {List, ListItem, MakeSelectable} from 'material-ui/List'; +import Subheader from 'material-ui/Subheader'; +import Avatar from 'material-ui/Avatar'; + +const { IdentityIcon } = window.parity.react; + +import styles from './account-selector.css'; + +export default class AccountSelector extends Component { + + static propTypes = { + list: PropTypes.array, + selected: PropTypes.object, + handleSetSelected: PropTypes.func + }; + + state = { + open: false + }; + + render () { + let nestedAccounts = this.renderAccounts(this.props.list); + let selectedAccount = this.renderAccount( + this.props.selected, + { + nestedItems: nestedAccounts, + open: this.state.open, + onClick: this.onToggleOpen.bind(this), + autoGenerateNestedIndicator: false + } + ); + + return ( +
    + + Select an account + { selectedAccount } + +
    + ); + } + + renderAccounts (accounts) { + return accounts + .map((account, index) => this.renderAccount(account, {key: index})); + } + + renderAccount (account, props) { + let icon = ( + ); + + let avatar = ( + ); + + return ( + + ); + } + + onToggleOpen () { + this.setState({ open: !this.state.open }); + } + + onSelectAccount (address) { + this.props.handleSetSelected(address); + this.onToggleOpen(); + } + +} diff --git a/js/src/dapps/tokenreg/Accounts/AccountSelector/container.js b/js/src/dapps/tokenreg/Accounts/AccountSelector/container.js new file mode 100644 index 00000000000..77c2f6b795d --- /dev/null +++ b/js/src/dapps/tokenreg/Accounts/AccountSelector/container.js @@ -0,0 +1,33 @@ +import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; + +import AccountSelector from './account-selector'; + +import { setSelectedAccount } from '../actions'; + +class AccountSelectorContainer extends Component { + static propTypes = { + accounts: PropTypes.object + }; + + render() { + return (); + } +} + +const mapStateToProps = (state) => { + const { accounts } = state; + return { ...accounts }; +}; + +const mapDispatchToProps = (dispatch) => { + return { + handleSetSelected: (address) => { + dispatch(setSelectedAccount(address)); + } + }; +}; + +export default connect(mapStateToProps, mapDispatchToProps)(AccountSelectorContainer); diff --git a/js/src/dapps/tokenreg/Accounts/AccountSelector/index.js b/js/src/dapps/tokenreg/Accounts/AccountSelector/index.js new file mode 100644 index 00000000000..9f6c229eb84 --- /dev/null +++ b/js/src/dapps/tokenreg/Accounts/AccountSelector/index.js @@ -0,0 +1 @@ +export default from './container'; diff --git a/js/src/dapps/tokenreg/Accounts/actions.js b/js/src/dapps/tokenreg/Accounts/actions.js new file mode 100644 index 00000000000..82b8075e633 --- /dev/null +++ b/js/src/dapps/tokenreg/Accounts/actions.js @@ -0,0 +1,38 @@ +const { api } = window.parity; + +export const SET_ACCOUNTS = 'SET_ACCOUNTS'; +export const setAccounts = (accounts) => ({ + type: SET_ACCOUNTS, + accounts +}); + +export const SET_SELECTED_ACCOUNT = 'SET_SELECTED_ACCOUNT'; +export const setSelectedAccount = (address) => ({ + type: SET_SELECTED_ACCOUNT, + address +}); + +export const loadAccounts = () => (dispatch) => { + Promise + .all([ + api.personal.listAccounts(), + api.personal.accountsInfo() + ]) + .then(results => { + let [ accounts, accountsInfo ] = results; + + let accountsList = accounts + .map(address => ({ + ...accountsInfo[address], + address + })); + + console.log('accounts', accountsList); + + dispatch(setAccounts(accountsList)); + dispatch(setSelectedAccount(accountsList[0].address)); + }) + .catch(e => { + console.error('loadAccounts error', e); + }) +}; diff --git a/js/src/dapps/tokenreg/Accounts/reducer.js b/js/src/dapps/tokenreg/Accounts/reducer.js new file mode 100644 index 00000000000..e6e003da99e --- /dev/null +++ b/js/src/dapps/tokenreg/Accounts/reducer.js @@ -0,0 +1,33 @@ +import { + SET_ACCOUNTS, + SET_SELECTED_ACCOUNT +} from './actions'; + +const initialState = { + list: [], + selected: null +}; + +export default (state = initialState, action) => { + switch (action.type) { + case SET_ACCOUNTS: + return { + ...state, + list: [].concat(action.accounts) + }; + + case SET_SELECTED_ACCOUNT: { + let address = action.address; + let account = state.list.find(a => a.address === address); + + return { + ...state, + selected: account + }; + } + + default: + return state; + } +}; + diff --git a/js/src/dapps/tokenreg/Actions/Register/index.js b/js/src/dapps/tokenreg/Actions/Register/index.js new file mode 100644 index 00000000000..275d81deabb --- /dev/null +++ b/js/src/dapps/tokenreg/Actions/Register/index.js @@ -0,0 +1 @@ +export default from './register'; diff --git a/js/src/dapps/tokenreg/Actions/Register/register.js b/js/src/dapps/tokenreg/Actions/Register/register.js new file mode 100644 index 00000000000..131cda42243 --- /dev/null +++ b/js/src/dapps/tokenreg/Actions/Register/register.js @@ -0,0 +1,206 @@ +import React, { Component, PropTypes } from 'react'; + +import { Dialog, FlatButton, TextField } from 'material-ui'; + +import AccountSelector from '../../Accounts/AccountSelector'; + +import { ADDRESS_TYPE, TLA_TYPE, UINT_TYPE, STRING_TYPE, validate } from '../validation'; + +import styles from '../actions.css'; + +const defaultField = { error: null, value: '', valid: false }; +const initState = { + fields: { + address: { ...defaultField, type: ADDRESS_TYPE }, + tla: { ...defaultField, type: TLA_TYPE }, + base: { ...defaultField, type: UINT_TYPE }, + name: { ...defaultField, type: STRING_TYPE } + } + }; + +export default class ActionTransfer extends Component { + + static propTypes = { + show: PropTypes.bool, + sending: PropTypes.bool, + complete: PropTypes.bool, + error: PropTypes.object, + onClose: PropTypes.func, + handleRegisterToken: PropTypes.func + } + + state = initState; + + render () { + const { sending, error, complete } = this.props; + + return ( + + { this.renderContent() } + + ); + } + + renderActions () { + const { fields } = this.state; + const { complete, sending, error } = this.props; + + if (error) { + return ( + + ); + } + + if (complete) { + return ( + + ); + } + + const isValid = this.isValid(); + + return ([ + , + + ]); + } + + renderContent () { + let { error, complete } = this.props; + + if (error) return this.renderError(); + if (complete) return this.renderComplete(); + return this.renderForm(); + } + + renderError () { + let { error } = this.props; + + return (
    +

    { error.toString() }

    +
    ); + } + + renderComplete () { + return (
    +

    Your transaction has been posted. Please visit the Parity Signer to authenticate the transfer.

    +
    ); + } + + renderForm () { + const { fields } = this.state; + + return ( +
    + + + + + + + + + +
    + ); + } + + isValid() { + const { fields } = this.state; + + return Object.keys(fields) + .map(key => fields[key].valid) + .reduce((current, fieldValid) => { + return current && fieldValid; + }, true); + } + + onRegister() { + let { fields } = this.state; + + let data = Object.keys(fields) + .reduce((dataObject, fieldKey) => { + dataObject[fieldKey] = fields[fieldKey].value; + return dataObject; + }, {}); + + this.props.handleRegisterToken(data); + } + + onClose() { + this.setState(initState); + this.props.onClose(); + } + + onChange(fieldKey, event) { + const value = event.target.value; + + let fields = this.state.fields; + let fieldState = fields[fieldKey]; + let validation = validate(value, fieldState.type); + + let newFieldState = { + ...fieldState, + ...validation + }; + + newFieldState.value = (validation.value !== undefined) + ? validation.value + : value; + + this.setState({ + fields: { + ...fields, + [fieldKey]: newFieldState + } + }); + } + +} diff --git a/js/src/dapps/tokenreg/Actions/actions.css b/js/src/dapps/tokenreg/Actions/actions.css new file mode 100644 index 00000000000..edc912bc65f --- /dev/null +++ b/js/src/dapps/tokenreg/Actions/actions.css @@ -0,0 +1,33 @@ +.actions { + padding-top: 2rem; +} + +.button { + margin: 0 0.5em; +} + +.button button { + background-color: rgba(50, 100, 150, 1) !important; + height: 56px !important; + padding: 0 10px !important; +} + +.button button[disabled] { + background-color: rgba(50, 50, 50, 0.25) !important; +} + +.dialog { +} + +.dialog h3 { + color: rgba(50, 100, 150, 1) !important; + text-transform: uppercase; +} + +.dialogtext { + padding-top: 1em; +} + +.error { + color: red; +} diff --git a/js/src/dapps/tokenreg/Actions/actions.js b/js/src/dapps/tokenreg/Actions/actions.js new file mode 100644 index 00000000000..11fa2db7c09 --- /dev/null +++ b/js/src/dapps/tokenreg/Actions/actions.js @@ -0,0 +1,56 @@ +import { setTokensLoading } from '../Tokens/actions'; + +export const SET_REGISTER_SENDING = 'SET_REGISTER_SENDING'; +export const setRegisterSending = (isSending) => ({ + type: SET_REGISTER_SENDING, + isSending +}); + +export const SET_REGISTER_ERROR = 'SET_REGISTER_ERROR'; +export const setRegisterError = (e) => ({ + type: SET_REGISTER_ERROR, + error: e +}); + +export const REGISTER_RESET = 'REGISTER_RESET'; +export const registerReset = () => ({ + type: REGISTER_RESET +}); + +export const REGISTER_COMPLETED = 'REGISTER_COMPLETED'; +export const registerCompleted = () => ({ + type: REGISTER_COMPLETED +}); + +export const registerToken = (tokenData) => (dispatch, getState) => { + console.log('registering token', tokenData); + + let state = getState(); + let contractInstance = state.status.contract.instance; + + const { address, base, name, tla } = tokenData; + + dispatch(setRegisterSending(true)); + + let values = [ address, tla, base, name ]; + let options = { + from: state.accounts.selected.address + }; + + contractInstance + .register + .estimateGas(options, values) + .then((gasEstimate) => { + options.gas = gasEstimate.mul(1.2).toFixed(0); + console.log(`transfer: gas estimated as ${gasEstimate.toFixed(0)} setting to ${options.gas}`); + + return contractInstance.register.postTransaction(options, values); + }) + .then((result) => { + dispatch(registerCompleted()); + }) + .catch((e) => { + console.error('registerToken error', e); + dispatch(setRegisterError(e)); + }); +}; diff --git a/js/src/dapps/tokenreg/Actions/component.js b/js/src/dapps/tokenreg/Actions/component.js new file mode 100644 index 00000000000..e64dbeeb6cd --- /dev/null +++ b/js/src/dapps/tokenreg/Actions/component.js @@ -0,0 +1,67 @@ +import React, { Component, PropTypes } from 'react'; + +import { RaisedButton } from 'material-ui'; +import ContentSendIcon from 'material-ui/svg-icons/content/send'; + +import Register from './Register'; + +import styles from './actions.css'; + +const REGISTER = 'REGISTER'; + +export default class Actions extends Component { + + static propTypes = { + handleRegisterToken: PropTypes.func, + handleRegisterClose: PropTypes.func, + + register: PropTypes.object + }; + + state = { + show: { + [ REGISTER ]: false + } + } + + render () { + return ( +
    + } + label='Register Token' + primary + onTouchTap={ this.onShow.bind(this, REGISTER) } /> + + +
    + ); + } + + onRegisterClose() { + this.onHide(REGISTER); + this.props.handleRegisterClose(); + } + + onShow(key) { + this.setState({ + show: { + [ key ]: true + } + }); + } + + onHide(key) { + this.setState({ + show: { + [ key ]: false + } + }); + } + +} diff --git a/js/src/dapps/tokenreg/Actions/container.js b/js/src/dapps/tokenreg/Actions/container.js new file mode 100644 index 00000000000..668c761e147 --- /dev/null +++ b/js/src/dapps/tokenreg/Actions/container.js @@ -0,0 +1,39 @@ +import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; + +import Actions from './component'; + +import { registerToken, registerReset } from './actions'; + +// import { loadTokens, queryTokenMeta } from './actions'; + +class TokensContainer extends Component { + + render() { + return (); + } +} + +const mapStateToProps = (state) => { + const { register } = state.actions; + + return { register }; +}; + +const mapDispatchToProps = (dispatch) => { + return { + handleRegisterToken: (tokenData) => { + dispatch(registerToken(tokenData)); + }, + handleRegisterClose: () => { + dispatch(registerReset()); + } + }; +}; + +export default connect( + mapStateToProps, + mapDispatchToProps +)(TokensContainer); diff --git a/js/src/dapps/tokenreg/Actions/index.js b/js/src/dapps/tokenreg/Actions/index.js new file mode 100644 index 00000000000..0403d9f1e64 --- /dev/null +++ b/js/src/dapps/tokenreg/Actions/index.js @@ -0,0 +1 @@ +export default from './container.js'; diff --git a/js/src/dapps/tokenreg/Actions/reducer.js b/js/src/dapps/tokenreg/Actions/reducer.js new file mode 100644 index 00000000000..bba0eab483b --- /dev/null +++ b/js/src/dapps/tokenreg/Actions/reducer.js @@ -0,0 +1,68 @@ +import { + SET_REGISTER_SENDING, + SET_REGISTER_ERROR, + REGISTER_RESET, + REGISTER_COMPLETED +} from './actions'; + +const initialState = { + register: { + sending: false, + error: null, + complete: false + } +}; + +export default (state = initialState, action) => { + switch (action.type) { + case SET_REGISTER_SENDING: { + let registerState = state.register; + + return { + ...state, + register: { + ...registerState, + sending: action.isSending + } + }; + } + + case REGISTER_COMPLETED: { + let registerState = state.register; + + return { + ...state, + register: { + ...registerState, + sending: false, + complete: true + } + }; + } + + case SET_REGISTER_ERROR: { + let registerState = state.register; + + return { + ...state, + register: { + ...registerState, + sending: false, + error: action.error + } + }; + } + + case REGISTER_RESET: { + let registerState = state.register; + + return { + ...state, + register: initialState.register + }; + } + + default: + return state; + } +}; diff --git a/js/src/dapps/tokenreg/Actions/validation.js b/js/src/dapps/tokenreg/Actions/validation.js new file mode 100644 index 00000000000..ab492288bc0 --- /dev/null +++ b/js/src/dapps/tokenreg/Actions/validation.js @@ -0,0 +1,86 @@ +const { api } = window.parity; + +export const ADDRESS_TYPE = 'ADDRESS_TYPE'; +export const TLA_TYPE = 'TLA_TYPE'; +export const UINT_TYPE = 'UINT_TYPE'; +export const STRING_TYPE = 'STRING_TYPE'; + +export const ERRORS = { + invalidTLA: 'The TLA should be 3 characters long', + invalidUint: 'Please enter a non-negative integer', + invalidString: 'Please enter at least a character', + invalidAccount: 'Please select an account to transact with', + invalidRecipient: 'Please select an account to send to', + invalidAddress: 'The address is not in the correct format', + invalidAmount: 'Please enter a positive amount > 0', + invalidTotal: 'The amount is greater than the availale balance' +}; + +const validateAddress = (address) => { + if (!api.format.isAddressValid(address)) { + return { + error: ERRORS.invalidAddress, + valid: false + }; + } + + return { + value: api.format.toChecksumAddress(address), + error: null, + valid: true + }; +} + +const validateTLA = (tla) => { + if (tla.toString().length !== 3) { + return { + error: ERRORS.invalidTLA, + valid: false + }; + } + + return { + value: tla.toString().toUpperCase(), + error: null, + valid: true + }; +} + +const validateUint = (uint) => { + if (isNaN(parseInt(uint)) || parseInt(uint) < 0) { + return { + error: ERRORS.invalidUint, + valid: false + }; + } + + return { + value: parseInt(uint), + error: null, + valid: true + }; +} + +const validateString = (string) => { + if (string.toString().length === 0) { + return { + error: ERRORS.invalidString, + valid: false + }; + } + + return { + value: string.toString(), + error: null, + valid: true + }; +} + +export const validate = (value, type) => { + if (type === ADDRESS_TYPE) return validateAddress(value); + if (type === TLA_TYPE) return validateTLA(value); + if (type === UINT_TYPE) return validateUint(value); + if (type === STRING_TYPE) return validateString(value); + + return { valid: true, error: null }; +}; diff --git a/js/src/dapps/tokenreg/Application/application.js b/js/src/dapps/tokenreg/Application/application.js index 75c69d85685..d91323f4d7d 100644 --- a/js/src/dapps/tokenreg/Application/application.js +++ b/js/src/dapps/tokenreg/Application/application.js @@ -6,6 +6,7 @@ import lightBaseTheme from 'material-ui/styles/baseThemes/lightBaseTheme'; import Loading from '../Loading'; import Status from '../Status'; import Tokens from '../Tokens'; +import Actions from '../Actions'; import styles from './application.css'; @@ -32,6 +33,8 @@ export default class Application extends Component { fee={ contract.fee } owner={ contract.owner } /> + +
    ); diff --git a/js/src/dapps/tokenreg/Container.js b/js/src/dapps/tokenreg/Container.js index 71b24ea8b04..c4216a1fc17 100644 --- a/js/src/dapps/tokenreg/Container.js +++ b/js/src/dapps/tokenreg/Container.js @@ -4,6 +4,7 @@ import { connect } from 'react-redux'; import Application from './Application'; import { loadContract } from './Status/actions'; +import { loadAccounts } from './Accounts/actions'; class Container extends Component { static propTypes = { @@ -12,7 +13,7 @@ class Container extends Component { }; componentDidMount() { - this.props.onLoadContract(); + this.props.onLoad(); } render() { @@ -36,8 +37,9 @@ const mapStateToProps = (state) => { const mapDispatchToProps = (dispatch) => { return { - onLoadContract: () => { + onLoad: () => { dispatch(loadContract()); + dispatch(loadAccounts()); } }; }; diff --git a/js/src/dapps/tokenreg/Status/reducers.js b/js/src/dapps/tokenreg/Status/reducer.js similarity index 100% rename from js/src/dapps/tokenreg/Status/reducers.js rename to js/src/dapps/tokenreg/Status/reducer.js diff --git a/js/src/dapps/tokenreg/Tokens/Token/token.css b/js/src/dapps/tokenreg/Tokens/Token/token.css index f9ffcf6c5bf..3456253c52c 100644 --- a/js/src/dapps/tokenreg/Tokens/Token/token.css +++ b/js/src/dapps/tokenreg/Tokens/Token/token.css @@ -1,7 +1,7 @@ .token{ display: flex; - width: 300px; + width: 20rem; margin: 1rem; padding: 1rem; flex-direction: column; diff --git a/js/src/dapps/tokenreg/Tokens/reducers.js b/js/src/dapps/tokenreg/Tokens/reducer.js similarity index 100% rename from js/src/dapps/tokenreg/Tokens/reducers.js rename to js/src/dapps/tokenreg/Tokens/reducer.js diff --git a/js/src/dapps/tokenreg/reducers.js b/js/src/dapps/tokenreg/reducers.js index 9810d8e93d1..29f59c53c00 100644 --- a/js/src/dapps/tokenreg/reducers.js +++ b/js/src/dapps/tokenreg/reducers.js @@ -1,10 +1,12 @@ import { combineReducers } from 'redux'; -import status from './Status/reducers'; -import tokens from './Tokens/reducers'; +import status from './Status/reducer'; +import tokens from './Tokens/reducer'; +import actions from './Actions/reducer'; +import accounts from './Accounts/reducer'; const rootReducer = combineReducers({ - status, tokens + status, tokens, actions, accounts }); export default rootReducer; From dc5da45ba8befaf44ebf0ea01f29c1152c992909 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 15 Sep 2016 16:17:58 +0200 Subject: [PATCH 0519/1062] cater for the cases where the token doesn't have an image --- js/src/modals/Transfer/Details/details.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js index 326fb6f5b3b..4de75f715b7 100644 --- a/js/src/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -129,7 +129,7 @@ export default class Details extends Component { const label = (
    - +
    { token.name }
    From faccd7404a60fd805b8bfb08fb9ada0e225537fe Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 15 Sep 2016 16:30:22 +0200 Subject: [PATCH 0520/1062] don't show tokens.value === 0 in transfer --- js/src/modals/Transfer/Details/details.js | 66 ++++++++++++----------- js/src/redux/providers/balances.js | 2 +- 2 files changed, 35 insertions(+), 33 deletions(-) diff --git a/js/src/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js index 4de75f715b7..08c896f9bc7 100644 --- a/js/src/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -116,42 +116,44 @@ export default class Details extends Component { const { api } = this.context; const { balance, tag } = this.props; - const items = balance.tokens.map((balance, idx) => { - const token = balance.token; - const isEth = idx === 0; - let value = 0; - - if (isEth) { - value = api.format.fromWei(balance.value).toFormat(3); - } else { - value = new BigNumber(balance.value).div(balance.token.format || 1).toFormat(3); - } - - const label = ( -
    - -
    - { token.name } + const items = balance.tokens + .filter((token) => token.value.gt(0)) + .map((balance, idx) => { + const token = balance.token; + const isEth = idx === 0; + let value = 0; + + if (isEth) { + value = api.format.fromWei(balance.value).toFormat(3); + } else { + value = new BigNumber(balance.value).div(balance.token.format || 1).toFormat(3); + } + + const label = ( +
    + +
    + { token.name } +
    +
    + { value } { token.tag } +
    -
    - { value } { token.tag } -
    -
    - ); - - return ( - - { label } - - ); - }); + ); + + return ( + + { label } + + ); + }); return ( diff --git a/js/src/modals/Transfer/transfer.js b/js/src/modals/Transfer/transfer.js index 66943a2e506..c4ede2812f5 100644 --- a/js/src/modals/Transfer/transfer.js +++ b/js/src/modals/Transfer/transfer.js @@ -21,7 +21,6 @@ import { bindActionCreators } from 'redux'; import { FlatButton } from 'material-ui'; import ActionDoneAll from 'material-ui/svg-icons/action/done-all'; import ContentClear from 'material-ui/svg-icons/content/clear'; -import ContentSend from 'material-ui/svg-icons/content/send'; import NavigationArrowBack from 'material-ui/svg-icons/navigation/arrow-back'; import NavigationArrowForward from 'material-ui/svg-icons/navigation/arrow-forward'; @@ -86,12 +85,12 @@ class Transfer extends Component { render () { const { stage, extras } = this.state; + // title={ this.renderAccount() } return ( { this.renderPage() } @@ -181,6 +180,7 @@ class Transfer extends Component { } renderDialogActions () { + const { account } = this.props; const { extras, sending, stage } = this.state; const cancelBtn = ( @@ -205,7 +205,7 @@ class Transfer extends Component { const sendBtn = ( } + icon={ } label='Send' primary onTouchTap={ this.onSend } /> ); @@ -501,7 +501,7 @@ class Transfer extends Component { const { gas, gasPrice, tag, valueAll, isEth } = this.state; const gasTotal = new BigNumber(gasPrice || 0).mul(new BigNumber(gas || 0)); const balance_ = balance.tokens.find((b) => tag === b.token.tag); - const availableEth = new BigNumber(balance_.value); + const availableEth = new BigNumber(balance.tokens[0].value); const available = new BigNumber(balance_.value); const format = new BigNumber(balance_.token.format || 1); diff --git a/js/src/redux/providers/balances.js b/js/src/redux/providers/balances.js index d6dbf57305b..16167a6361a 100644 --- a/js/src/redux/providers/balances.js +++ b/js/src/redux/providers/balances.js @@ -18,27 +18,20 @@ import { getBalances, getTokens } from './balancesActions'; import { eip20Abi, registryAbi, tokenRegAbi } from '../../util/abi'; -import imagesEthereum32 from '../../images/contracts/ethereum-32.png'; -import imagesEthereum56 from '../../images/contracts/ethereum-56.png'; -import imagesGavcoin32 from '../../images/contracts/gavcoin-32.png'; -import imagesGavcoin56 from '../../images/contracts/gavcoin-56.png'; +import imagesEthereum from '../../images/contracts/ethereum-56.png'; +import imagesGavcoin from '../../images/contracts/gavcoin-56.png'; +import imagesUnknown from '../../images/contracts/unknown-56.png'; // TODO: Images should not be imported like this, should be via the content from GitHubHint contract (here until it is ready) const images = { - ethereum: { - small: imagesEthereum32, - normal: imagesEthereum56 - }, - gavcoin: { - small: imagesGavcoin32, - normal: imagesGavcoin56 - } + ethereum: imagesEthereum, + gavcoin: imagesGavcoin }; const ETH = { name: 'Ethereum', tag: 'ΞTH', - images: images.ethereum + image: images.ethereum }; export default class Balances { @@ -107,7 +100,7 @@ export default class Balances { name, tag, format: format.toString(), - images: images[name.toLowerCase()], + image: images[name.toLowerCase()] || imagesUnknown, contract: this._api.newContract(eip20Abi, address) }; tokens[address] = token; @@ -164,7 +157,7 @@ export default class Balances { this._tokens.forEach((token, tidx) => { balance.tokens.push({ token, - value: balanceOf[tidx].toString() + value: balanceOf[tidx] }); }); }); diff --git a/js/src/ui/Balance/balance.js b/js/src/ui/Balance/balance.js index b6318d1a92b..783019cb9cd 100644 --- a/js/src/ui/Balance/balance.js +++ b/js/src/ui/Balance/balance.js @@ -49,7 +49,7 @@ export default class Balance extends Component { className={ styles.balance } key={ token.tag }> {
    { value } { token.tag }
    diff --git a/js/src/ui/ConfirmDialog/confirmDialog.js b/js/src/ui/ConfirmDialog/confirmDialog.js index bc05761e1a9..7a0be650a1c 100644 --- a/js/src/ui/ConfirmDialog/confirmDialog.js +++ b/js/src/ui/ConfirmDialog/confirmDialog.js @@ -11,16 +11,16 @@ export default class ConfirmDialog extends Component { static propTypes = { children: PropTypes.node.isRequired, className: PropTypes.string, - iconNo: PropTypes.node, - iconYes: PropTypes.node, - labelNo: PropTypes.string, - labelYes: PropTypes.string, + iconConfirm: PropTypes.node, + iconDeny: PropTypes.node, + labelConfirm: PropTypes.string, + labelDeny: PropTypes.string, title: PropTypes.oneOfType([ PropTypes.node, PropTypes.string ]).isRequired, visible: PropTypes.bool.isRequired, - onNo: PropTypes.func.isRequired, - onYes: PropTypes.func.isRequired + onConfirm: PropTypes.func.isRequired, + onDeny: PropTypes.func.isRequired } render () { @@ -40,17 +40,17 @@ export default class ConfirmDialog extends Component { } renderActions () { - const { iconNo, iconYes, labelNo, labelYes, onNo, onYes } = this.props; + const { iconConfirm, iconDeny, labelConfirm, labelDeny, onConfirm, onDeny } = this.props; return [
    { contract && fee ? (
    - +

    diff --git a/js/src/dapps/registry/Lookup/lookup.js b/js/src/dapps/registry/Lookup/lookup.js index ec5067121e9..8b686fc1c73 100644 --- a/js/src/dapps/registry/Lookup/lookup.js +++ b/js/src/dapps/registry/Lookup/lookup.js @@ -3,6 +3,7 @@ import { Card, CardHeader, CardText } from 'material-ui/Card'; import TextField from 'material-ui/TextField'; import RaisedButton from 'material-ui/RaisedButton'; import SearchIcon from 'material-ui/svg-icons/action/search'; +import renderAddress from '../ui/address.js'; import styles from './lookup.css'; @@ -12,7 +13,15 @@ export default class Lookup extends Component { actions: PropTypes.object.isRequired, name: PropTypes.string.isRequired, entry: PropTypes.string.isRequired, - result: PropTypes.string + result: PropTypes.string.isRequired, + accounts: PropTypes.object.isRequired, + contacts: PropTypes.object.isRequired + } + + static childContextTypes = { api: PropTypes.object.isRequired } + getChildContext () { + // TODO let /src/ui/IdentityIcon import from the api directly + return { api: window.parity.api }; } state = { name: '', entry: 'A' }; @@ -20,7 +29,7 @@ export default class Lookup extends Component { render () { const name = this.state.name || this.props.name; const entry = this.state.entry || this.props.entry; - const result = this.props.result || ''; + const { result, accounts, contacts } = this.props; return ( @@ -47,7 +56,10 @@ export default class Lookup extends Component { />

    - { result } + { result + ? ({ renderAddress(result, accounts, contacts, false) }) + : '' + } ); diff --git a/js/src/dapps/registry/ui/address.js b/js/src/dapps/registry/ui/address.js index 0e607e77544..c5234947676 100644 --- a/js/src/dapps/registry/ui/address.js +++ b/js/src/dapps/registry/ui/address.js @@ -11,14 +11,14 @@ const align = { lineHeight: '32px' }; -export default (address, accounts, contacts) => { +export default (address, accounts, contacts, shortenHash = true) => { let caption if (accounts[address]) { caption = ({ accounts[address].name }); } else if (contacts[address]) { caption = ({ contacts[address].name }); } else { - caption = ({ renderHash(address) }); + caption = ({ shortenHash ? renderHash(address) : address }); } return (
    From 164376e7e8d4eab6841ef53fd8917853a59da7fc Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 20 Sep 2016 17:51:29 +0200 Subject: [PATCH 0638/1062] save abi along with contract meta --- js/src/modals/DeployContract/deployContract.js | 1 + 1 file changed, 1 insertion(+) diff --git a/js/src/modals/DeployContract/deployContract.js b/js/src/modals/DeployContract/deployContract.js index e5719f39c0f..0ee283e3a87 100644 --- a/js/src/modals/DeployContract/deployContract.js +++ b/js/src/modals/DeployContract/deployContract.js @@ -215,6 +215,7 @@ class DeployContract extends Component { return Promise.all([ api.personal.setAccountName(address, name), api.personal.setAccountMeta(address, { + abi: parsedAbi, contract: true, deleted: false, description From ac2e8220b0d43e99708e121295c53e6014f68dd9 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Tue, 20 Sep 2016 17:51:31 +0200 Subject: [PATCH 0639/1062] registry: refactor getChildContext, typo --- js/src/dapps/registry/Application/application.js | 7 +++++-- js/src/dapps/registry/Lookup/lookup.js | 6 ------ js/src/dapps/registry/accounts/accounts.js | 6 ------ js/src/dapps/registry/events/events.js | 6 ------ js/src/dapps/registry/events/reducers.js | 1 - js/src/dapps/registry/register/register.js | 2 +- 6 files changed, 6 insertions(+), 22 deletions(-) diff --git a/js/src/dapps/registry/Application/application.js b/js/src/dapps/registry/Application/application.js index 7f1f1989e58..e9d0a331795 100644 --- a/js/src/dapps/registry/Application/application.js +++ b/js/src/dapps/registry/Application/application.js @@ -12,9 +12,12 @@ import Register from '../register'; import Events from '../events'; export default class Application extends Component { - static childContextTypes = { muiTheme: PropTypes.object }; + static childContextTypes = { + muiTheme: PropTypes.object.isRequired, + api: PropTypes.object.isRequired + }; getChildContext () { - return { muiTheme }; + return { muiTheme, api: window.parity.api }; } static propTypes = { diff --git a/js/src/dapps/registry/Lookup/lookup.js b/js/src/dapps/registry/Lookup/lookup.js index 8b686fc1c73..4b6f594a06f 100644 --- a/js/src/dapps/registry/Lookup/lookup.js +++ b/js/src/dapps/registry/Lookup/lookup.js @@ -18,12 +18,6 @@ export default class Lookup extends Component { contacts: PropTypes.object.isRequired } - static childContextTypes = { api: PropTypes.object.isRequired } - getChildContext () { - // TODO let /src/ui/IdentityIcon import from the api directly - return { api: window.parity.api }; - } - state = { name: '', entry: 'A' }; render () { diff --git a/js/src/dapps/registry/accounts/accounts.js b/js/src/dapps/registry/accounts/accounts.js index 677e5221e34..dedb48486ce 100644 --- a/js/src/dapps/registry/accounts/accounts.js +++ b/js/src/dapps/registry/accounts/accounts.js @@ -28,12 +28,6 @@ export default class Accounts extends Component { selected: PropTypes.object } - static childContextTypes = { api: PropTypes.object.isRequired } - getChildContext () { - // TODO let /src/ui/IdentityIcon import from the api directly - return { api: window.parity.api }; - } - render () { const { all, selected } = this.props; diff --git a/js/src/dapps/registry/events/events.js b/js/src/dapps/registry/events/events.js index 7dc40b57087..e34353162d6 100644 --- a/js/src/dapps/registry/events/events.js +++ b/js/src/dapps/registry/events/events.js @@ -63,12 +63,6 @@ export default class Events extends Component { contacts: PropTypes.object.isRequired } - static childContextTypes = { api: PropTypes.object.isRequired } - getChildContext () { - // TODO let /src/ui/IdentityIcon import from the api directly - return { api: window.parity.api }; - } - render () { const { subscriptions, pending, accounts, contacts } = this.props; return ( diff --git a/js/src/dapps/registry/events/reducers.js b/js/src/dapps/registry/events/reducers.js index f732f0365cc..89ee0647ed6 100644 --- a/js/src/dapps/registry/events/reducers.js +++ b/js/src/dapps/registry/events/reducers.js @@ -36,7 +36,6 @@ export default (state = initialState, action) => { } if (action.type === 'events unsubscribe') { - console.warn('events unsubscribe', action); return { ...state, pending: { ...state.pending, [action.name]: false }, diff --git a/js/src/dapps/registry/register/register.js b/js/src/dapps/registry/register/register.js index b23f330ce2a..6099d8beaae 100644 --- a/js/src/dapps/registry/register/register.js +++ b/js/src/dapps/registry/register/register.js @@ -47,7 +47,7 @@ export default class Register extends Component { /> { posted.map((name) => (

    - Please use the Signer to authenticate the registraction of { name }. + Please use the Signer to authenticate the registration of { name }.

    )) } From d3be336c70eeb64dbb5eb5e8b534100299db7052 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Tue, 20 Sep 2016 17:51:54 +0200 Subject: [PATCH 0640/1062] registry: show latest events first --- js/src/dapps/registry/events/reducers.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/dapps/registry/events/reducers.js b/js/src/dapps/registry/events/reducers.js index 89ee0647ed6..f98ab33949c 100644 --- a/js/src/dapps/registry/events/reducers.js +++ b/js/src/dapps/registry/events/reducers.js @@ -11,8 +11,8 @@ const initialState = { }; const sortEvents = (a, b) => { - const d = a.block.minus(b.block).toFixed(0); - if (d === 0) return a.index.minus(b.index).toFixed(0); + const d = b.block.minus(a.block).toFixed(0); + if (d === 0) return b.index.minus(a.index).toFixed(0); return d; }; From 8e9df449e1f5aa4156ee7be39f013b0f51601efe Mon Sep 17 00:00:00 2001 From: Jannis R Date: Tue, 20 Sep 2016 17:54:06 +0200 Subject: [PATCH 0641/1062] registry: eslint :lipstick: --- js/src/dapps/registry/accounts/actions.js | 2 -- js/src/dapps/registry/addresses/actions.js | 2 +- js/src/dapps/registry/events/events.js | 2 +- js/src/dapps/registry/ui/address.js | 2 +- 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/js/src/dapps/registry/accounts/actions.js b/js/src/dapps/registry/accounts/actions.js index 23f34fd848b..5a8d180aa29 100644 --- a/js/src/dapps/registry/accounts/actions.js +++ b/js/src/dapps/registry/accounts/actions.js @@ -1,3 +1 @@ -import { personal } from '../parity.js'; - export const select = (address) => ({ type: 'accounts select', address }); diff --git a/js/src/dapps/registry/addresses/actions.js b/js/src/dapps/registry/addresses/actions.js index f39511621c4..281d2d2ec75 100644 --- a/js/src/dapps/registry/addresses/actions.js +++ b/js/src/dapps/registry/addresses/actions.js @@ -10,7 +10,7 @@ export const fetch = () => (dispatch) => { .map((address) => ({ ...data[address], address, isAccount: accounts.includes(address) - })) + })); dispatch(set(addresses)); }) .catch((err) => { diff --git a/js/src/dapps/registry/events/events.js b/js/src/dapps/registry/events/events.js index e34353162d6..54c2be9a0b9 100644 --- a/js/src/dapps/registry/events/events.js +++ b/js/src/dapps/registry/events/events.js @@ -3,7 +3,7 @@ import { Card, CardHeader, CardActions, CardText } from 'material-ui/Card'; import Toggle from 'material-ui/Toggle'; import moment from 'moment'; -import { bytesToHex, IdentityIcon } from '../parity.js'; +import { bytesToHex } from '../parity.js'; import renderHash from '../ui/hash.js'; import renderAddress from '../ui/address.js'; import styles from './events.css'; diff --git a/js/src/dapps/registry/ui/address.js b/js/src/dapps/registry/ui/address.js index c5234947676..54b6315eddb 100644 --- a/js/src/dapps/registry/ui/address.js +++ b/js/src/dapps/registry/ui/address.js @@ -12,7 +12,7 @@ const align = { }; export default (address, accounts, contacts, shortenHash = true) => { - let caption + let caption; if (accounts[address]) { caption = ({ accounts[address].name }); } else if (contacts[address]) { From 5193c2426fdd4abca63c010e739f93c7a4cee829 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 20 Sep 2016 20:51:07 +0200 Subject: [PATCH 0642/1062] Basic contract deployment in-place - not end-user friendly, internally friendly though --- .../codeStep.js => BusyStep/busyStep.js} | 28 ++------- .../{CodeStep => BusyStep}/index.js | 2 +- .../CompletedStep/completedStep.js | 31 ++++++++++ .../DeployContract/CompletedStep/index.js | 17 ++++++ .../DeployContract/DetailsStep/detailsStep.js | 24 ++++++-- .../modals/DeployContract/deployContract.js | 61 +++++++------------ js/src/ui/Modal/modal.css | 2 +- 7 files changed, 93 insertions(+), 72 deletions(-) rename js/src/modals/DeployContract/{CodeStep/codeStep.js => BusyStep/busyStep.js} (51%) rename js/src/modals/DeployContract/{CodeStep => BusyStep}/index.js (95%) create mode 100644 js/src/modals/DeployContract/CompletedStep/completedStep.js create mode 100644 js/src/modals/DeployContract/CompletedStep/index.js diff --git a/js/src/modals/DeployContract/CodeStep/codeStep.js b/js/src/modals/DeployContract/BusyStep/busyStep.js similarity index 51% rename from js/src/modals/DeployContract/CodeStep/codeStep.js rename to js/src/modals/DeployContract/BusyStep/busyStep.js index e03cf4ff6f7..2c26ea94c2b 100644 --- a/js/src/modals/DeployContract/CodeStep/codeStep.js +++ b/js/src/modals/DeployContract/BusyStep/busyStep.js @@ -16,36 +16,16 @@ import React, { Component, PropTypes } from 'react'; -import { Form, Input } from '../../../ui'; - -export default class CodeStep extends Component { +export default class BusyStep extends Component { static propTypes = { - abi: PropTypes.string, - abiError: PropTypes.string, - code: PropTypes.string, - codeError: PropTypes.string, - onAbiChange: PropTypes.func.isRequired, - onCodeChange: PropTypes.func.isRequired + deployStep: PropTypes.string } render () { - const { abi, abiError, code, codeError, onAbiChange, onCodeChange } = this.props; + const { deployStep } = this.props; return ( -
    - - -
    +
    { deployStep }
    ); } } diff --git a/js/src/modals/DeployContract/CodeStep/index.js b/js/src/modals/DeployContract/BusyStep/index.js similarity index 95% rename from js/src/modals/DeployContract/CodeStep/index.js rename to js/src/modals/DeployContract/BusyStep/index.js index 1222d6f74c3..17bf2b13114 100644 --- a/js/src/modals/DeployContract/CodeStep/index.js +++ b/js/src/modals/DeployContract/BusyStep/index.js @@ -14,4 +14,4 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -export default from './codeStep'; +export default from './busyStep'; diff --git a/js/src/modals/DeployContract/CompletedStep/completedStep.js b/js/src/modals/DeployContract/CompletedStep/completedStep.js new file mode 100644 index 00000000000..e3f450a686a --- /dev/null +++ b/js/src/modals/DeployContract/CompletedStep/completedStep.js @@ -0,0 +1,31 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +export default class CompletedStep extends Component { + static propTypes = { + address: PropTypes.string + } + + render () { + const { address } = this.props; + + return ( +
    contract deployed to { address }
    + ); + } +} diff --git a/js/src/modals/DeployContract/CompletedStep/index.js b/js/src/modals/DeployContract/CompletedStep/index.js new file mode 100644 index 00000000000..64e1d619939 --- /dev/null +++ b/js/src/modals/DeployContract/CompletedStep/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './completedStep'; diff --git a/js/src/modals/DeployContract/DetailsStep/detailsStep.js b/js/src/modals/DeployContract/DetailsStep/detailsStep.js index 0e48d378de2..a2d6a07c5f4 100644 --- a/js/src/modals/DeployContract/DetailsStep/detailsStep.js +++ b/js/src/modals/DeployContract/DetailsStep/detailsStep.js @@ -21,12 +21,18 @@ import { Form, Input, AddressSelect } from '../../../ui'; export default class DetailsStep extends Component { static propTypes = { accounts: PropTypes.object.isRequired, + abi: PropTypes.string, + abiError: PropTypes.string, + code: PropTypes.string, + codeError: PropTypes.string, description: PropTypes.string, descriptionError: PropTypes.string, fromAddress: PropTypes.string, fromAddressError: PropTypes.string, name: PropTypes.string, nameError: PropTypes.string, + onAbiChange: PropTypes.func.isRequired, + onCodeChange: PropTypes.func.isRequired, onFromAddressChange: PropTypes.func.isRequired, onDescriptionChange: PropTypes.func.isRequired, onNameChange: PropTypes.func.isRequired @@ -34,7 +40,7 @@ export default class DetailsStep extends Component { render () { const { accounts } = this.props; - const { fromAddress, fromAddressError, name, nameError, description, descriptionError, onDescriptionChange, onFromAddressChange, onNameChange } = this.props; + const { abi, abiError, code, codeError, onAbiChange, onCodeChange, fromAddress, fromAddressError, name, nameError, onFromAddressChange, onNameChange } = this.props; return (
    @@ -52,11 +58,17 @@ export default class DetailsStep extends Component { value={ name } onSubmit={ onNameChange } /> + label='abi' + hint='the abi of the contract to deploy' + error={ abiError } + value={ abi } + onSubmit={ onAbiChange } /> +
    ); } diff --git a/js/src/modals/DeployContract/deployContract.js b/js/src/modals/DeployContract/deployContract.js index 0ee283e3a87..5e67893d871 100644 --- a/js/src/modals/DeployContract/deployContract.js +++ b/js/src/modals/DeployContract/deployContract.js @@ -23,10 +23,11 @@ import ContentClear from 'material-ui/svg-icons/content/clear'; import { newError } from '../../redux/actions'; import { Button, IdentityIcon, Modal } from '../../ui'; -import CodeStep from './CodeStep'; +import BusyStep from './BusyStep'; +import CompletedStep from './CompletedStep'; import DetailsStep from './DetailsStep'; -const steps = ['contract details', 'interface & code', 'deployment', 'completed']; +const steps = ['contract details', 'deployment', 'completed']; class DeployContract extends Component { static contextTypes = { @@ -62,7 +63,7 @@ class DeployContract extends Component { actions={ this.renderDialogActions() } current={ step } steps={ steps } - waiting={ [2] } + waiting={ [1] } visible> { this.renderStep() } @@ -71,8 +72,7 @@ class DeployContract extends Component { renderDialogActions () { const { abiError, codeError, nameError, descriptionError, fromAddressError, fromAddress, step } = this.state; - const isValidStep0 = !nameError && !fromAddressError && !descriptionError; - const isValidStep1 = !abiError && !codeError; + const isValid = !nameError && !fromAddressError && !descriptionError && !abiError && !codeError; const cancelBtn = (
    +
    ); } renderExpanded () { + const { background } = this.props; + return ( -
    +
    @@ -84,7 +89,7 @@ class ParityBar extends Component {
    -
    + ); } From 661a9828090fdd832b5a5156c270aad1da6c4bca Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 21 Sep 2016 19:41:14 +0200 Subject: [PATCH 0668/1062] remove min-height, container specifies --- js/src/ui/ParityBackground/parityBackground.js | 6 ++++-- js/src/views/Application/Container/container.js | 8 +++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/js/src/ui/ParityBackground/parityBackground.js b/js/src/ui/ParityBackground/parityBackground.js index 125272f1d8e..8864a24610d 100644 --- a/js/src/ui/ParityBackground/parityBackground.js +++ b/js/src/ui/ParityBackground/parityBackground.js @@ -17,6 +17,8 @@ import GeoPattern from 'geopattern'; import React, { Component, PropTypes } from 'react'; +const GRADIENT = 'linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5))'; + export default class ParityBackground extends Component { static propTypes = { children: PropTypes.node, @@ -47,7 +49,7 @@ export default class ParityBackground extends Component { render () { const { children, className } = this.props; const { background } = this.state; - const style = { background, minHeight: '100%' }; + const style = { background }; return (
    @@ -58,7 +60,7 @@ export default class ParityBackground extends Component { updateBackground (seed) { const url = GeoPattern.generate(seed).toDataUrl(); - const background = `linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), ${url}`; + const background = `${GRADIENT}, ${url}`; this.setState({ background }); } diff --git a/js/src/views/Application/Container/container.js b/js/src/views/Application/Container/container.js index dcf4b069317..e57b67688a6 100644 --- a/js/src/views/Application/Container/container.js +++ b/js/src/views/Application/Container/container.js @@ -33,16 +33,14 @@ export default class Container extends Component { const { background, children, showFirstRun, onCloseFirstRun } = this.props; return ( -
    + - - { children } - -
    + { children } + ); } } From fee4f807405c5d00eb645dcbff46cf1cd6542b28 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 21 Sep 2016 19:55:29 +0200 Subject: [PATCH 0669/1062] simplify seed passing, using muiTheme s the global theme --- js/src/index.js | 4 +- js/src/ui/ContextProvider/contextProvider.js | 5 +-- .../ui/ParityBackground/parityBackground.js | 39 ++++--------------- js/src/ui/Theme/theme.js | 8 ++++ .../views/Application/Container/container.js | 5 +-- .../DappContainer/dappContainer.js | 7 ++-- js/src/views/Application/application.js | 4 +- js/src/views/ParityBar/parityBar.js | 9 +---- 8 files changed, 27 insertions(+), 54 deletions(-) diff --git a/js/src/index.js b/js/src/index.js index dd9736aba1f..4e89dde8eee 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -47,7 +47,7 @@ const parityUrl = process.env.NODE_ENV === 'production' ? window.location.host : const api = new Api(new Api.Transport.Ws(`ws://${parityUrl}`, initToken)); // new Api.Transport.Http('/rpc/')); -const background = api.util.sha3(initToken + Date.now()); +muiTheme.parity.setBackgroundSeed(api.util.sha3(initToken + Date.now())); // signer function tokenSetter (token, cb) { @@ -68,7 +68,7 @@ ws.init(initToken); const routerHistory = useRouterHistory(createHashHistory)({}); ReactDOM.render( - + diff --git a/js/src/ui/ContextProvider/contextProvider.js b/js/src/ui/ContextProvider/contextProvider.js index 4ebd99e0393..7af6d342e87 100644 --- a/js/src/ui/ContextProvider/contextProvider.js +++ b/js/src/ui/ContextProvider/contextProvider.js @@ -19,7 +19,6 @@ import { Component, PropTypes } from 'react'; export default class ContextProvider extends Component { static propTypes = { api: PropTypes.object.isRequired, - background: PropTypes.string.isRequired, muiTheme: PropTypes.object.isRequired, store: PropTypes.object.isRequired, children: PropTypes.node.isRequired @@ -27,7 +26,6 @@ export default class ContextProvider extends Component { static childContextTypes = { api: PropTypes.object, - background: PropTypes.string, muiTheme: PropTypes.object, store: PropTypes.object } @@ -39,11 +37,10 @@ export default class ContextProvider extends Component { } getChildContext () { - const { api, background, muiTheme, store } = this.props; + const { api, muiTheme, store } = this.props; return { api, - background, muiTheme, store }; diff --git a/js/src/ui/ParityBackground/parityBackground.js b/js/src/ui/ParityBackground/parityBackground.js index 8864a24610d..0eff462e84d 100644 --- a/js/src/ui/ParityBackground/parityBackground.js +++ b/js/src/ui/ParityBackground/parityBackground.js @@ -20,36 +20,20 @@ import React, { Component, PropTypes } from 'react'; const GRADIENT = 'linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5))'; export default class ParityBackground extends Component { - static propTypes = { - children: PropTypes.node, - className: PropTypes.string, - background: PropTypes.string.isRequired - } - - state = { - background: '' - } - - componentDidMount () { - const { background } = this.props; - - this.updateBackground(background); + static contextTypes = { + muiTheme: PropTypes.object.isRequired } - componentWillReceiveProps (newProps) { - const { background } = this.props; - - if (newProps.background === background) { - return; - } - - this.updateBackground(newProps.background); + static propTypes = { + children: PropTypes.node, + className: PropTypes.string } render () { const { children, className } = this.props; - const { background } = this.state; - const style = { background }; + const { backgroundSeed } = this.context.muiTheme.parity; + const url = GeoPattern.generate(backgroundSeed).toDataUrl(); + const style = { background: `${GRADIENT}, ${url}` }; return (
    @@ -57,11 +41,4 @@ export default class ParityBackground extends Component {
    ); } - - updateBackground (seed) { - const url = GeoPattern.generate(seed).toDataUrl(); - const background = `${GRADIENT}, ${url}`; - - this.setState({ background }); - } } diff --git a/js/src/ui/Theme/theme.js b/js/src/ui/Theme/theme.js index a7904e448b9..491990f11c7 100644 --- a/js/src/ui/Theme/theme.js +++ b/js/src/ui/Theme/theme.js @@ -35,4 +35,12 @@ muiTheme.textField.disabledTextColor = muiTheme.textField.textColor; muiTheme.toolbar = lightTheme.toolbar; muiTheme.toolbar.backgroundColor = 'rgba(0, 0, 0, 0.5)'; // 'rgba(255, 136, 0, 0.5)'; // 'rgb(80, 80, 80)'; +muiTheme.parity = { + backgroundSeed: '0x0', + + setBackgroundSeed: (seed) => { + muiTheme.parity.backgroundSeed = seed; + } +}; + export default muiTheme; diff --git a/js/src/views/Application/Container/container.js b/js/src/views/Application/Container/container.js index e57b67688a6..a1b9124c7d1 100644 --- a/js/src/views/Application/Container/container.js +++ b/js/src/views/Application/Container/container.js @@ -23,17 +23,16 @@ import styles from '../application.css'; export default class Container extends Component { static propTypes = { - background: PropTypes.string.isRequired, children: PropTypes.node.isRequired, showFirstRun: PropTypes.bool, onCloseFirstRun: PropTypes.func }; render () { - const { background, children, showFirstRun, onCloseFirstRun } = this.props; + const { children, showFirstRun, onCloseFirstRun } = this.props; return ( - + diff --git a/js/src/views/Application/DappContainer/dappContainer.js b/js/src/views/Application/DappContainer/dappContainer.js index a8fad45bd95..e3e3d2cb0cc 100644 --- a/js/src/views/Application/DappContainer/dappContainer.js +++ b/js/src/views/Application/DappContainer/dappContainer.js @@ -22,17 +22,16 @@ import styles from '../application.css'; export default class DappContainer extends Component { static propTypes = { - children: PropTypes.node.isRequired, - background: PropTypes.string.isRequired + children: PropTypes.node.isRequired }; render () { - const { background, children } = this.props; + const { children } = this.props; return (
    { children } - +
    ); } diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index 05b26f94db2..fdea0a264db 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -48,7 +48,6 @@ class Application extends Component { } render () { - const { background } = this.context; const { children, pending, netChain, isTest } = this.props; const { showFirstRun } = this.state; const [root] = (window.location.hash || '').replace('#/', '').split('/'); @@ -59,7 +58,7 @@ class Application extends Component { ); } else if (root === 'app') { return ( - + { children } ); @@ -67,7 +66,6 @@ class Application extends Component { return ( - + +
    + ); + } + + renderEvents () { + const { contract } = this.state; + + return ( + + ); + } + + toggleImport = () => { + this.setState({ + showImport: !this.state.showImport + }); + } +} diff --git a/js/src/dapps/signaturereg/Application/index.js b/js/src/dapps/signaturereg/Application/index.js new file mode 100644 index 00000000000..236578226a8 --- /dev/null +++ b/js/src/dapps/signaturereg/Application/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './application'; diff --git a/js/src/dapps/signaturereg/Button/button.css b/js/src/dapps/signaturereg/Button/button.css new file mode 100644 index 00000000000..8abb549a4d7 --- /dev/null +++ b/js/src/dapps/signaturereg/Button/button.css @@ -0,0 +1,33 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.button { + background: #f80; + color: white; + border-radius: 5px; + font-size: 1em; + line-height: 1em; + padding: 0.75em 1.5em; + cursor: pointer; + display: inline-block; +} + +.button.disabled { + background: #888; + color: #bbb; + cursor: default; +} diff --git a/js/src/dapps/signaturereg/Button/button.js b/js/src/dapps/signaturereg/Button/button.js new file mode 100644 index 00000000000..e1220b5ccb7 --- /dev/null +++ b/js/src/dapps/signaturereg/Button/button.js @@ -0,0 +1,49 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import styles from './button.css'; + +export default class Button extends Component { + static propTypes = { + children: PropTypes.node.isRequired, + className: PropTypes.string, + disabled: PropTypes.bool, + onClick: PropTypes.func.isRequired + } + + render () { + const { children, className, disabled } = this.props; + const classes = `${styles.button} ${disabled ? styles.disabled : ''} ${className}`; + + return ( +
    + { children } +
    + ); + } + + onClick = (event) => { + const { disabled, onClick } = this.props; + + if (disabled) { + return; + } + + onClick(event); + } +} diff --git a/js/src/dapps/signaturereg/Button/index.js b/js/src/dapps/signaturereg/Button/index.js new file mode 100644 index 00000000000..f69a65e3d53 --- /dev/null +++ b/js/src/dapps/signaturereg/Button/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './button'; diff --git a/js/src/dapps/signaturereg/Events/events.css b/js/src/dapps/signaturereg/Events/events.css new file mode 100644 index 00000000000..4a0d272aa29 --- /dev/null +++ b/js/src/dapps/signaturereg/Events/events.css @@ -0,0 +1,44 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.events { + padding: 3em; +} + +.events table { + width: 100%; + border: none; +} + +.events td { + padding: 0.25em; +} + +.pending { + opacity: 0.5; +} + +.mined { +} + +.highlight { + color: #f80; +} + +.right { + text-align: right; +} diff --git a/js/src/dapps/signaturereg/Events/events.js b/js/src/dapps/signaturereg/Events/events.js new file mode 100644 index 00000000000..c97866ce813 --- /dev/null +++ b/js/src/dapps/signaturereg/Events/events.js @@ -0,0 +1,74 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import { formatBlockNumber, formatBlockTimestamp, formatSignature } from '../format'; +import { attachEvents } from '../services'; + +import styles from './events.css'; + +export default class Events extends Component { + static propTypes = { + contract: PropTypes.object.isRequired + } + + state = { + events: [] + } + + componentDidMount () { + const { contract } = this.props; + + attachEvents(contract, (state) => { + this.setState(state); + }); + } + + render () { + const { events } = this.state; + + if (!events.length) { + return null; + } + + return ( +
    + + + { this.renderEvents() } + +
    +
    + ); + } + + renderEvents () { + const { events } = this.state; + + return events.map((event) => { + return ( + + { formatBlockNumber(event.blockNumber) } + { formatBlockTimestamp(event.block) } + { event.params.owner } + { formatSignature(event.params.signature) } + { event.params.method } + + ); + }); + } +} diff --git a/js/src/dapps/signaturereg/Events/index.js b/js/src/dapps/signaturereg/Events/index.js new file mode 100644 index 00000000000..88ad6d407c9 --- /dev/null +++ b/js/src/dapps/signaturereg/Events/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './events'; diff --git a/js/src/dapps/signaturereg/Header/header.css b/js/src/dapps/signaturereg/Header/header.css new file mode 100644 index 00000000000..add245dccde --- /dev/null +++ b/js/src/dapps/signaturereg/Header/header.css @@ -0,0 +1,57 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.header { + position: relative; + height: 13.69em; + color: #eee; + border-bottom: 4px solid #f80; + overflow: hidden; +} + +.header img, +.content { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.header img { + opacity: 0.15; + width: 100%; +} + +.content { + text-align: center; + padding: 3em; + color: #f80; +} + +.hero { + font-size: 5em; + line-height: 1.2em; + vertical-align: middle; +} + +.byline { + font-size: 1.3em; + line-height: 1.3em; + vertical-align: middle; + opacity: 0.5; +} diff --git a/js/src/dapps/signaturereg/Header/header.js b/js/src/dapps/signaturereg/Header/header.js new file mode 100644 index 00000000000..e70350e6914 --- /dev/null +++ b/js/src/dapps/signaturereg/Header/header.js @@ -0,0 +1,45 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import styles from './header.css'; +import blocks from '../images/blocks-350.png'; + +export default class Header extends Component { + static propTypes = { + blockNumber: PropTypes.object.isRequired, + totalSignatures: PropTypes.object.isRequired + } + + render () { + const { totalSignatures } = this.props; + + return ( +
    + +
    +
    + { totalSignatures.toFormat(0) } +
    +
    + signatures registered +
    +
    +
    + ); + } +} diff --git a/js/src/dapps/signaturereg/Header/index.js b/js/src/dapps/signaturereg/Header/index.js new file mode 100644 index 00000000000..37b5835f054 --- /dev/null +++ b/js/src/dapps/signaturereg/Header/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './header.js'; diff --git a/js/src/dapps/signaturereg/Import/import.css b/js/src/dapps/signaturereg/Import/import.css new file mode 100644 index 00000000000..4403083d811 --- /dev/null +++ b/js/src/dapps/signaturereg/Import/import.css @@ -0,0 +1,151 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; +} + +.overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: rgba(55, 55, 55, 0.75); +} + +.dialog { + position: absolute; + top: 1.5em; + right: 1.5em; + border-radius: 5px; + width: 650px; + background: rgba(0, 0, 0, 0.9); +} + +.close { + top: 4px; + right: 4px; + position: absolute; + background: transparent; +} + +.header { + font-size: 1.3em; + line-height: 1.3em; + padding: 16px 24px; + background: #f80; + color: white; + position: relative; + margin-bottom: 24px; + border-radius: 5px 5px 0 0; +} + +.body { + padding: 0 24px; +} + +.body div { + text-align: center; +} + +.info { + padding: 0 24px 24px 24px; + line-height: 1.618em; +} + +.info textarea { + background: rgba(80, 80, 80, 0.25); + border-radius: 5px; + resize: none; + padding: 1em; + color: #eee; + font-size: 0.75em; + font-family: 'Roboto Mono'; + width: 100%; + border: none; + box-sizing: border-box; +} + +.info textarea.error { + background: rgba(255, 0, 0, 0.25); +} + +.info .error { + color: rgba(255, 0, 0, 1); + font-size: 0.75em; + line-height: 1.5em; +} + +.buttonrow { + position: relative; + padding: 16px 24px; + border-top: 4px solid #f80; + text-align: right; +} + +.keys { + position: absolute; + left: 24px; + top: 16px; + padding: 4px 0; +} + +.keys div { + font-size: 0.75em; +} + +.fnconstant, +.fnexists, +.fnunknown, +.fntodo { + display: inline-block; + margin: 0.25em; + padding: 0.5em 1em; + border-radius: 2px; + color: white; + line-height: 1em; +} + +.fnconstant, +.fnexists { + opacity: 0.5; +} + +.fnconstant { + background: #aaa; +} + +.fnexists { + background: #964; +} + +.fnunknown { + background: #000; +} + +.fntodo { + background: #494; +} + +.hide { + opacity: 0; +} diff --git a/js/src/dapps/signaturereg/Import/import.js b/js/src/dapps/signaturereg/Import/import.js new file mode 100644 index 00000000000..a552283c0f5 --- /dev/null +++ b/js/src/dapps/signaturereg/Import/import.js @@ -0,0 +1,180 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import { api } from '../parity'; +import { callRegister, postRegister } from '../services'; +import Button from '../Button'; + +import styles from './import.css'; + +export default class Import extends Component { + static propTypes = { + accounts: PropTypes.object.isRequired, + instance: PropTypes.object.isRequired, + visible: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired + } + + state = { + abi: null, + abiParsed: null, + abiError: 'Please add a valid ABI definition', + abiMapped: null, + fnstate: {} + } + + render () { + const { visible, onClose } = this.props; + const { abiError, fnstate } = this.state; + + if (!visible) { + return null; + } + + const count = Object.values(fnstate).filter((style) => style === 'fntodo').length; + + return ( +
    +
    +
    +
    +
    ABI Import
    + +
    + { abiError ? this.renderCapture() : this.renderRegister() } +
    +
    +
    to register
    already registered
    constant, skip
    +
    + +
    +
    +
    + ); + } + + renderCapture () { + const { abiError } = this.state; + + return ( +
    +
    + Provide the ABI (Contract Interface) in the space provided below. Only non-constant functions (names & types) will be imported, while constant functions and existing signatures will be ignored. +
    +
    + +
    + { abiError } +
    +
    +
    + ); + } + + renderRegister () { + return ( +
    +
    + The following functions have been extracted from the ABI provided and the state has been determined from interacting with the signature contract. +
    +
    +
    + { this.renderFunctions() } +
    +
    +
    + ); + } + + renderFunctions () { + const { abiMapped, fnstate } = this.state; + + return abiMapped.functions.map((fn) => { + if (fn.constant) { + fnstate[fn.signature] = 'fnconstant'; + } else if (!fnstate[fn.signature]) { + this.testFunction(fn); + } + + return ( +
    + { fn.id } +
    + ); + }); + } + + testFunction (fn) { + const { instance } = this.props; + const { fnstate } = this.state; + + callRegister(instance, fn.id) + .then((result) => { + console.log(fn.id, result); + fnstate[fn.signature] = result ? 'fntodo' : 'fnexists'; + this.setState(fnstate); + }) + .catch((error) => { + console.error(error); + }); + } + + onAbiEdit = (event) => { + let abiMapped = null; + let abiError = null; + let abiParsed = null; + let abi = null; + + try { + abiParsed = JSON.parse(event.target.value); + abiMapped = api.newContract(abiParsed); + abi = JSON.stringify(abiParsed); + } catch (error) { + console.error('onAbiEdit', error); + abiError = error.message; + } + + this.setState({ + abiMapped, + abiError, + abiParsed, + abi + }); + } + + onRegister = () => { + const { accounts, instance, onClose } = this.props; + const { abiMapped, fnstate } = this.state; + const address = Object.keys(accounts)[0]; + + Promise + .all( + abiMapped.functions + .filter((fn) => !fn.constant) + .filter((fn) => fnstate[fn.signature] === 'fntodo') + .filter((fn, index) => index === 0) + .map((fn) => postRegister(instance, fn.id, { from: address })) + ) + .then(() => { + onClose(); + }) + .catch((error) => { + console.error('onRegister', error); + }); + } +} diff --git a/js/src/dapps/signaturereg/Import/index.js b/js/src/dapps/signaturereg/Import/index.js new file mode 100644 index 00000000000..d2f352cf3db --- /dev/null +++ b/js/src/dapps/signaturereg/Import/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './import'; diff --git a/js/src/dapps/signaturereg/Loading/index.js b/js/src/dapps/signaturereg/Loading/index.js new file mode 100644 index 00000000000..0468cab37df --- /dev/null +++ b/js/src/dapps/signaturereg/Loading/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './loading'; diff --git a/js/src/dapps/signaturereg/Loading/loading.css b/js/src/dapps/signaturereg/Loading/loading.css new file mode 100644 index 00000000000..b77d1a23725 --- /dev/null +++ b/js/src/dapps/signaturereg/Loading/loading.css @@ -0,0 +1,24 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.loading { + width: 100%; + text-align: center; + padding-top: 5em; + font-size: 2em; + color: #999; +} diff --git a/js/src/dapps/signaturereg/Loading/loading.js b/js/src/dapps/signaturereg/Loading/loading.js new file mode 100644 index 00000000000..b884597d763 --- /dev/null +++ b/js/src/dapps/signaturereg/Loading/loading.js @@ -0,0 +1,29 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component } from 'react'; + +import styles from './loading.css'; + +export default class Loading extends Component { + render () { + return ( +
    + Attaching to contract ... +
    + ); + } +} diff --git a/js/src/dapps/signaturereg/format.js b/js/src/dapps/signaturereg/format.js new file mode 100644 index 00000000000..24ab3ed8f06 --- /dev/null +++ b/js/src/dapps/signaturereg/format.js @@ -0,0 +1,40 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; +import moment from 'moment'; + +import { api } from './parity'; + +const ZERO = new BigNumber(0); + +export function formatBlockNumber (blockNumber) { + return ZERO.eq(blockNumber || 0) + ? 'Pending' + : `#${blockNumber.toFormat()}`; +} + +export function formatSignature (signature) { + return api.util.bytesToHex(signature); +} + +export function formatBlockTimestamp (block) { + if (!block || !block.timestamp) { + return null; + } + + return moment(block.timestamp).fromNow(); +} diff --git a/js/src/dapps/signaturereg/images/blocks-350.png b/js/src/dapps/signaturereg/images/blocks-350.png new file mode 100644 index 0000000000000000000000000000000000000000..16e0c213d5b341e729454b9951f8a641938b4c3a GIT binary patch literal 1073157 zcmV(nLGr$dP)uoUc12Hm`ioIp-LSV?ZKxh_Mdm1WBHejS8d^)a!MkD8kx;e!q`%4r?v7iU#1V zx8A}zSb5+K<55gu4JS^VV4^uqSP96oj3|nzR01lM3ftS8+`4rOCnO6C3sk}yNs=-( zHG`BAQ#gbWq(#ck?iN{=F+Dv^tJNe30)imG+5+P&L8x#xM@WNGie|OR{f%9|@r`fs zpa0@pY;UjgPyX>odHTr*=^bpNwI)jq<0MC6@G2f!E0hvA0YzaENVH!?*ch!fTKfnz z<8h4dRgqHB>2z3Lxxlq+@A1SFPa{zL?2R9D;lji8dt=r&?(*DAALPpA_gJ2oW#{5` z-umx9V6icYQXZo$K{)95`^0fftyZJeYT=wC&vS$j7-uPp0$UgWlv4OgBc%jDYmE>B z=Nv^*;G9EBiPq&~cKTh$MM~8;ln`XTqOI!S2Ymhd+gu+<_?{q%hOC^L=SyGu4PJin zSCAs7$WpXlW6&QlH8YDTEK!sYR_kP021tCRiIXwWxKFKCWq*H{Xc(cjht@uR#RDME zbJ8?rYikSV9B0m)p;oJ5te`$M%P2N@(&80kY!V~zuBF9&bPztVGe3Q+4cWJj;Byq-QG-fy)l-FD2x|sDH)H)jK^aD!Z4&L3IvMG?vM@y*4KRfjXwXdJw>Jt2+|RGCMaB=@hC>i zCbe3PalA(qMbxXas9KZZU=x@3&^WXRuojeWnVoCnQ^y1&v~j2$GMSV69Xylp%sI;! z&fnukH{j1-f0&_{P>FL2a-wlU_pP5Y5)LIL5{EMxSvH{A@Ob&9=lJ+1KFY)A9-t@+ z(lkXlkV=r}IW{lwJdZ4Oy!P5_6h+3Pk37Q0#s*J4^#tGg#y2^2>J-&_4bSuF^?LMr z0~(D6=g*(V8hG{9S2=t30@tox!8yk#KlyPcIxSv(^;J%tT1HCA?(Qx^2)f-ajYfm( z*RS*N!w+-u;zhzRq|vDJ_~Vabtz}_hfuK@hJRTDS0ePPDm2Z8EpZ??>-g)OXg$bxu z+hnF7$zqfz$dj0MyUiEA@C9a1%#`O-K%S@6>vhJXAqRW=47)vs-2n26Ve!ob{QSY9l?xI2s~^pjK}pgk(HQX-zcA(h)*> zym@JlpI#l{g|nnlpV`TPfBQjr{jdI(?{CLE`|`*5!aw^YfAW9)Km7Qh;Exq9^~qrsTbXoN9_>FH?}7Z|9fT9alm z&N;OFHoe}7@G@B?x-4Y&f%QHP~JN6^LlZ@ z;&~pqF@)6$)6>&f0o`7&>~~5bOo1#c&RD!^lbbtTHb)sYs1g{+vIJiXf>4oXF^-(& z!c6BGE_BTqBZD8}HJr(*1R;59x%lSWtgo-}tDpQN^UEuw#uA1h(V)vW{^Gx}y|K&7{ewXim|NH#s|MFki-c1>g$0((adx{VOtu=X`qjkX_ z{ri81_I9sUB=@va|`oKO-+Fi6h*<-))x0SR_QD*Fz<3IZ~TPmIK@@#B*LQ8AxbpK zixeRowx+o+Vs7>}kx|0wN((X9V4~7Ojtp{as0$C9=38 zak|A`3w)_4RGnU2;l`Z--~86!GVI3KEJq_5;i!ZGzAuq32b;4vKg*{+`3XMrnNM+I zb`onXS)QVVBn-n6_vJZCDWneA+}vbybMyGj?(Xi=>-E^%+vCjXb5tr7wDw7o1Y=VA zg9ENyeV3V;4%TSe?GBwzhi0?Ipg$tZ3MMBf5kla3<$2AElr&Aj7{ZEw*fS(fc*JRf z7lh;meD4RZ@}K_8f8(8ZFPAveXe0_LOPpM!2|^l@bj*ie`5@1}^l3)@0n4Xqbhj15 zQN+TjDm%M^`&&Cm8xZG1hNB*Nk`whuxGW;n5$7J9qtk3q6b0k)7%9tM5d^{Ec@Y?q zk!2Z5DXP`OK99i|L!Re!{EYa$TQtWR$^+r~*g~?sKVo1led`k?F}ZVCz&Oe|@4yrV z_!{hC@3JLkcT$vnP71OjCBVa3ixD6^f#)nuEK@<1cE#a)5Ms#*`SJFMzdPvTf)+t$ z$z+LXwS;QLLs*M-8IL{kFdzHXkMhrc^Vdm|3~McZ7*ON}Yc10A8I4BxG9->;q9_8u z^Soce&Pf^}r9>%J*3)6{J?e=T5Yiog4O2d!vO7DJ^l3C}03=C_l%RBpfwC;4TCEbt zG0qCK9}xHBwR0&%RaE_=uqKI>%B4=+fpnEW8Fz6BZK3Z$ue)A2Y(FloP zVxq-oKl>rR_{A@>w6w&qKOzi6oO7gcf|L@^^8v@&+C476_bv~dIm_haG*Wmd&!m;IG$6qMMzrr+3N1#r8&ms4Bowg*J!cu(1VCtohVQ7oM7+nT{dpt;rz4j zW4N==ZZzO_cau4<&g9TCdwPl1bLZ*q9#HcX*T4Q9Uj6B7yz(2L<-@Ohgg5@*uk(ZN zy-Igt0&6YK3W_Yl*NU(bAcWx~AAW_W&Obxnk10%_(Hn0gFWtcx9?8i$8qYmWSe?dN z*xcOY>tFjOy}^)LwN7RVio)XQDuK>OO_#GzKFk9TJ3-x zGG`t*&v+CwH+O=KwROJv?LR~N0na}BEK7^atgUS#wa?7V4E1^g?Q4d^AxWH4sZ@|s z5=9BKv$Gr=9AJu!PN(y8zJG{!r2IKXJUWxwllZ<*7>38+7l&GaGZu_RYf0cM?%ln{ zAOG?HN&m`_Ni)Ie>LQbVlOl^LiVTkc--e82imH0dpI#)98OTFCm|K*U*gzcj3+LQ% zk37;S`u!gJckkn6lEABg(g>}P#t+w4G(;KJ;SmROAKG-3{$ow43dOk%_ zkQD{am3=7)^>MFq&K>u!qvw$uiP4%ANR^SsL4<$5tl9I+5QI@i^v%~D{2>`0qT8TRkHI2L|aggVE z2vK52V+?Vevb(!Wn(iZ|W@cuFz^~w(pw()lwJz~(o-rH_vDT6#37+SXrs?q_*oSx(PPqKceu;4x9}U_&3*u9FPM$jt+qR+468l&T>ENmit|BE=JuN~6wDfY)hb zCh8<JWt zHL$R-Pzq?K1Uz}3m%uO2$g+YkPzY%eu3$9o(QJnN&cFN;OXnWqPyXcpCP^cTB0GWv zfF|%gusPNk&;nx|xhe3pe=LYeQG$IbC0Ul@c?x4w9FoDX%bRcg7%isA^Mo5WFEc%P zl6Gr~%U9mu(MMinJRZ~U_nA5OC|&Ok&N-4KAq*u-NQ^c3zE75wz%@-%lq!i|5CkMy zc^_LAg)xT0m0(UObquz^fB=c!;om4V68nK#GdxBN}+_q*c8vN@u^RKj!%8^ zBg{^F%wUXRdwZL;wKZmEX9?<6a%Ztl5GNVR3&9rb>~^_x<0?xl573&@U^DJqzeXI# zv|25i&1OlMYc+<^m|C?#7zX5din9X05>R9@Q8dQ)eH?~(JfPjK@*7|HG!LFV%U8ep zm%RDbHMAE{BqKD?s8y*19)S`i2zD0b%4_CqMxK|V^iflm0M<~LtZY119}2S|Wr*h~ zgeb-7!C+9JEK3+2PEYGxT~r z=H}*DSXjUqb4+~N?KY1;{y14~P@c!?t=lvj4Hg;=3N2Ask}TniU;I2zJn;ly``UN- z;Sb*?j$`~vNDu@dK?e5tT}2O~Xol?e4!C>w zF8ljkCMG7Bnwp~5>#@1HiM5tyvssFDjcI0QC#g1S3`c#&<1v0v!Sj6b%+c*1;Cme^ z)du&rEHF3*16pe)CK^mlO<_0har5R)Zr!>?Q4~}v_0m8Hf+H3LQsNGYPGJv$2o@nr z0SC|fB|;U3A&pjrnVFeG@vcBBD2f7KN^pWGic64CM09(*ES%`@p$|RJM?U-#XCF94 zIvmqzRx!qrWjPbAHd=%eDDm9KK=w>``Z8D?TgnCUPutuN)zChK&u1i z@Klw;r5Kx(z3tGzIqDrhC!_M%z&awV&Xwf51jh#F#4r8K5jZ#!Sfy21XF*Gp@{mFk zMFaNtyI7Y|%L{6aD!x@{BMF3u&>_}=0dkvw5E#H1TmCKtQV1kaU@_7mwI)+AFe$Z0 zgHEFah(W!HNfNUDfOr^VRe;iCoHQ6Au+~rs0)()nX@uuF9y))H&wln(eEe5GhNmU9 zT8%t2$Z8Fm6O0C9^4w9cG>P&tb8~a_dOf<`K1wO#C?!h|O5u=%RG;fNKFjvjI>T|w$>kL|B&8ZbmK6*J zrFl`W*Gs{+;+OBAvz(Zp<~RPy=lPZQKf@pYUw_IQZ@fViMTcUYJr`<#z;Sj`HYmY^mBa)G2+3~EeR4T{fn^KC=XhfcuB&u4i((U(Yx7+l3J@)ta zsnu#!Yc(pB3KJ6(G@2n}2kF5sp0hYnis?pJv~mvGWV)2cU+LXg;$*kw$p3c0aZC2)B`w%a3|tx{W@U~|38elOM7B1sagD+siQktJ~)^#^EaIeF?_ zDW(jE?Ck8|d*Pw!07a3L=LW4Md2SgG#*D`Uq;S;hb(+mOeo&)QuVbA47f8zcDTGwgXDN|)w$XUfCVns!Iya)tB-?MX?2A~711I(#GWD&_an zx z1tG#6k}{>p(+p=EN=cLy2NR;@wC}|H#xbN$dhzmm;M@&z)_{^t&oiBXh^PD+-im11R?}x-iK@wS% z4iLh_8i~MTFc|!j;dCSvCP~70JjS|`yJ#JvRQY_$=TweNCrX?y%j1kikmo6RQQ)kl zRt=7cY$?VWjLi|k5dvrg}+k#^N#z@(Tp_wT--epet%K)E$gww zlt({*B!DO-5z=A2(ugSgPz_^ztjmxBqAVe>l3`ph?Nxd2>MeFIUWMI0zOShojhtvw zZPt)}hSC*oUb;kdg)9q)K*JX^MC~|te9$Q;mOm?R6ya0hF z2r9(+m@G|@II<*Sd1;<%Rg%ORZ(aNc_V&jF;ROmiW_@)FAzaz7#-&j^9QQFr1~zAQ zdV#Ne<>qe+Ly*`0Qst%`?wD#kcwN2*-@w@tH|J?ink7^!6-L0u#s+gs zQ*_$Xgi=%U0^WQ360RF_{^jRrg*Br7E`A`9N+GqvSqo`S=mZl%6{)KXi?XK1<1uj( zmj)p@P}WMG=d@~dk}P6MD8y*Yz3Z1qKKCKcoL}IbH#EDh>;=9j2|`Vt#wE8mmYX+k z^Z41PiAFK10!63^0uOIwIoRu>q7h+rnxZI}pP#2S(Pk9I$Mxy^KDH1@Cy7R5UVH5| zUVr0lKKRlr*evGi+drdOohOi*Xq=#RK_v)D((G_v`T_z0M<#Jjj)+msnnT2;bLiZf>%@bwDL-Qmr=m_^*AA{r!EydYwwG#mSYh>_?+9 zt|;gyDV`V5Y*&e*2t_8k4Tb)cDqd&R?xb{;ibvtjty4r{oGuK z!(OXAiqxQ;L@S>p8uQ=3`Ip?hd5KqEc$WWo|GV6~b(@1h#QB*OYEn?GczD92802Vu z)P@bt8mu))1R9A}g5pqUI>IDcYl0vsdx;P<>ur)sge!8C3n&VQv*0Y`)}UkoLLl-2 zPk?rcA_rwGuCTu}7mrN%5-Df|si8KCAs+DVTbG%gKS6757OxUutt+(zV`)@E#%aRIlPkv?|ivEHE)y2CJ-bC{G{ue0SWl2ZKS`Gqk|ioGeeded`9hJNsB`nVmnuqmMtv z-Fxd)Dm6M2Q^e^3Q8Xq=BA^VJL8X{^viu$$M9>@z|+FUV7g% zJoxwpl5s?ur!*&9cws=4XQWmlq(nPKo?8$SKdc~)BgqSf6ifu=Omwp3`)QOOYhf#A zPIK$pEv6^uxpCtL4?g%HzV9;}4oh7lia2rN1o!UUI}RJ2I(3RTj=6mKGN(?RBFi$) ztgP^@Z~qnjal$alanhrZ8Yewe=u_620E1nz87H9n7W3a{M~C@y>^vaeS&Vc$LZ52Nr(5j ze&s!a&}T3j(3zZ|Uh$D8W8>a+JR5WC+9hn7;H)L|JgQ+xf6zxsNkM`1Bz~Zg(lIsN z;mIc+rP1(t@A6L&x(!*v`NbtZ_S~;fLsJW?45N(9O2&gVJn6`WLwfrM6uH3$aI%H?-BR+F@sI&W{aAMVQ>$Bw1pb)p+*PD@isEqBy@WSvxyw7 zA_iSV*2U%<=;1!$V2i~@pL0to>$`QX+*-p}iO>q2DVnm%-f%=yX^Ln-yW#WepZO^N z`uBdD3+GlSq6le0T7j^jrN)yADI~a37_z1yH)8@{GCe&>ty*P$b(Q(~MV6M9F`4E5 zaL6;yJc|;7)5}XtbvhK*5}N{138_epF)91|dsM;zXAAcC_UKG>NaC2))ly(Qabg~& zG|S6N1VO;^@-nSf3%?pNIW@(8w@YpeovA4b>##y%g(OQyOw?<9_yfBM}4`3opL#A{Wk`Wunz&d3llPnQ5xE8m34wc?n3j_jXxZU+4DSyWGFONyQI2 zf8iXbPA+r)p$p6(Cb(v1<|wRVZGD4VH?FX?vq|@0pFw}fjhnZ)as38^{(x@(0Hqc6 zTEJwd!`{J|cQ4(;5MW$^=fm?W8Fwzf$JN~d=O25L4}Ro%-uk;sto8+g*Fb5FmI^Hu zN(h8=P?(auS_h&`@Q66YCS9~Q9rq}1)0 zDBoi;&?Ms>0-f>li%;{rzxzc#{)rDWJz0VVUpqixjK%juoGk%Qd!m6;x#fHf811io7t~xVcIc7o@o(4C;)w2Nd;?sO7U8_bH-;c2L85lD}+ijC7Rr{5Ppa$ z4A_*Jc8$+}>L2mtfA#x3|Lk*E>u@f`7UpmUg0+%Lt%1@ZQJNu~PbF-E4Dq}wwfY1W zO=ofrgol@I5f2WSXtud}-wzm%Bl5yft2d}Onlu_MoCV)2f&BhKmn2T9)f)ssh}IsyHY_cj z#`ir2yZ4xNmTEUgQl($7aWL+3>CP>B;}J8{vpmo_!P)jS)n>@5>oPTL69t;0E~zVv z7!Qfk3`Ix~hh&~dq$?~#tVdi}S;53Rn50Xn zKw6CoEyLapC*~&j{onZ#zxO*|;(?Wu6j@3#imBB@w30Yy$@4Oekrg?fAJXj&=y$hR z-?+!rREK+OtL*jmX-rNqF*A({e6;iE_4){Dkjj!~V|I2nnVf2I>eMM3&8bp2OjC-Y z!1FayL7a?07^Epm(>)#Y!ymrNVAx}3c8X@FL0V*J&p$LifkQkt)o$|GL+5zq123>Y z>a)6bo1(}Glz*5cab#)2((*jMo?&}u6|EXZ3OAE5JAR5MK<>O3AjIae+8c}31l|a*|Rj7s@)zHTm zj?wxyMZZsO4N;nqXO;rN&}2l$kroAs$uZ7>5LhRW$kMD84rlFgviuP2AdY&51W~xd z+SgbC&RMjSctX*}q5_4H7VTHr=tu0u1yNB@3j&nVWJyf58t|bHKF=ThyFcVppZ)|v z;DHe2#*yR>FQ_maC0Hj>hiPEvph$D1IIN#6p;Fbv@es%mqCg{QHycPCmBWAq)}Wtn+P#!+ z7xwzA^r9h=QS3)ski*bqTpRDvdf+6D+~M8bXRg`C)&i>2lgtGj)(0^Y&pk@Z59s~$ z8qLlEtFpovkA62L896pLcG*AZv)k=49QRSyFcDZPf#$@CX=(v%-M+-9Kk+jE`rm$; zr(SpwoWd3kS>)7wg^xuGP=1K93XNkl7_zss$H}ErByr03zxzGHz-NDNhs(FF(CZJ_ z-PvV%agkQFg3TiS=C8lWxWB`NC!gouy?b1J?=rV<-ePxqi{0%VR&U*5JQ#5I#$BWp zJo(sDY^-nb)1SOaHK=j+^n=`AUE|%K{+MJuWPNp&ix=PF)~!|Utgch3wRrm358wv@ z((}p$m9Qu+@jQW)23$sE9HOL8AsoG=N3|L7{QIBa!NnQg{n?Lr^5Ms5Pqk?X&E|X8 zah}K2%1JivuCcv#pGmL9?9xeWl;ae%7N+s7MT}yMR_Jb-=Bm$4Gu8ruAPpqNY@6xD zd76zT8+TVJBup;OadPGay}KKQ{>_M?Co-IEVyw{P~;KMK2XIQ-l4y7i?BIK<}A4vGH{wfS{hdsQ4qKoYc+8a z;rR-LA*^bm;eglw{zsgcndXsaKEl--_vw!eA9&$qgz`W*ywJz5_=J@f_4)+$`UKhw zaY9pA@WM(NT*@VZ^ba>Y%MG95s879KCCL+dci$u#?Q!+eTg=Q%5mc)rxxslMP6yOP zLB;n_Qs8?Yd6ALkDLU}5Sd>suq-c?F`K`a>>;LsXa^syhX)4WPXO63zt6W=KW#8qj zM+c-bXCkc7G(Ju1v+pu=wMw%yNrA*sYC693vBuzp#u|`9qgC14vb3PcEmCN_R1gmn zl+Y!ob)ba=;V=qh9ukX~f!oLU1%*n9~Mr)W)1Fu!z?shI_4=1wvse~b3rGnBvX_8T`HBh2V#qaEH^VVB$@%6v_ zA??l_+dDn>_XmLD-n~^$udJ}UvrWBT$MdROzkZwUK_8{{AwRJo1kU9MQ=o*ySxI4i zx|!l`-|(Yr_hIiYD)8vcPEpZ{3S}5;I2@9tVZiW8D@R!sS>BoOR^VQ7b_G?|=B){{aM9 zmY0gI_Hj6jaTF#;YDJ!BAfQ^S0*<`MQA$#n0zZVQnF+4nyvq9hRi1e2QF{F@-+%SH z%*;(qw$#6fASNycDBfif_E-m0x1Zq z754V_Xtr871X6n>S;pGteRg^Wbo)J~7gj(Wts{-8kkizVb$7V+-n*<`eTV(MK0o={ z6;|)=g9tb=b%IcPP!we(*yb2#@H{~fD6BD91HKM1#n0CqkCIGBF2A)F?J0`f;`sqd zk}*7tK~GJ00L$*~77sphfz|a@?%%jg@9ri+UJ|20nv??4FRX#*hpS*mYja2IFh@y= zqg9sUM5wf-z(cvNY@H*{W3oKMn4D?t;};GOjrM$UPcyOwBWDoxD*yOj{1(qV{Upss z9g`L0g{4t#5C#=YZqY#vPeC;3@xvc{pVwdi3H!Z121#dX2H*3E;vv)1Q>?AurQ7W? z7!2@ypUwN5OtdC2#?bBeIeF?d`@3EGy&n5}J8W;=XB=lt&&-hLIX7}B;n1sE|TOH?fIl>j`lU4@0W>8G}0+B zmNZVWSwXc@Wodqqr=EP0Yj^LlyR*jfi77tx^7C~2`=lo>)9i{~WCWlMp9X_{h8al8)j_SE6mQ8ZgLO=?C-CtN zoWv9b(Rj?v^fV{t=E%~NJj?L3Mk+~~B>39n^y$+)_Qd04MZx;UI)>7y(ZaB_I7h#K zz`fNw?CkEay|cq;G$M}1C{Gi3KFwy6rNt%ApFhvi(h_Nwaq05Abh}-KgAsS{-Q&iM z8|>}v6UAk+_S}OHaAJO*#l=PD=ND+T+qBygbUGcvN=TYzq{)~hNm<|QbK~v-!fPOe zqgv6NZEUl8^(HrZDFvGO?)g)PrWvQ6+cfF9uwEYTL7gk@hC$HNwcX5yomQb zbAc?Fvy^1q4d@c%yBEj2QQJdF=7C{O14mSw8oUsY0TCmn0S(bD6&K=g));M?eL6W$9Z?ZI}QLkf)oGeR$(vV7$ zn8Bb=yIZO~7 z&crGpg{0Y;z^{5lX-u~_W;Du>_*lJ%WXuzfJ;3k(-WU1Ir$2F+IMz5Jky0FP8Aw2p zWrie4F~%ZNx>a8}{u3saM`%F!===Tm-TU+JkjT>CMc8$rYDPDZ( zWja%3J>^AqoRZ)$jc=_bcLmQs{{fzP>V4!%%Ep~_l5tF^eSGE7nQHO$`<_Av9)+_c zSxUFpC(ARGP?)?RiXu!=9B&Zt3xasL?yZmC^P_~uQA*+{@m8zVkh=Vn5XIp-yOffH z{x1DEM@omvy3~pkn>u17x3=%o-QJ{GZ*p>JnG@5~Xa`9iL!fC+O;8)`ljMDTPttBp zqI8usv0ydY4+*s(A8w-Q;&qzbkuAP`tIuCwyU+E#0rTD}E3=Yc`^5X0J5l4uum6}# zC~O!q#NfM>&wTomeEHw}0U!TIAEDE3k;E~sFr~n#Aj>kOl+^1Dj4|B2d6TWJZ6+rt zdH0=*oIH7oAgHjqw#JzU&a!;+6mgVbtYdJn&qSw%Qi2;duCu$lL%rT$ZuSIP`9yJc zyslWQ)eci!>-2g(s?{pH+gse@-idwDu zzu0=SSi7?HzVElzp7)vWJd(V;oQlPoOV#R0YPZyKEX%M3J67PxNgT_8gd`4-2R|kV zki6$54?!$=RE$WnrASU>#gQ3*4!t_6G@vS%Ik6$%_n8CEU2N#ee=ce}P~8#b4m+)yoJJs;Zbo z5k;2LX*W4PJtIvL0^diV$dZ(PuSZ#C_<@Jx*aU$`6ix7a&)97p4?heTPa?Yg9>*sq z%r7o5iDSP1gZDuS);2b57K;>y;fuJ9mu#LF z=Y|k3Z0jW@SGTtL`qzJgS{U-#XLp%QCbZ|~D9eJI^Eo%JZ(x&=j7O*p92p|;$x@AN zPn}~^N1qTzk36%<3;6}r=fyo@+xB$FsAlsm+5p*N3TUIDtO|-8cAuw=#}=i^D3ze9 zBtM>PU&zWy35;oyx@T49K+`^ZuwrNhvImDjEjs*3p0KDB0x1C?R>o>{`R z`7ZgMPc#`b9F0kmguUHe{CWe=3+SC5acgUX|K^u}iCedC(>p&$s0!b;5tgLV0;MI| z@{yKJp68sOo^bc>T^fzXOjW7N-o8$$G;h80W2~;NbM3|r?%ckEZCfZRoM{Z2Cmkf9@)BJsZ0TUR4lxn9peRUo`bXi_mM%5j9 zgFcS5k#(QZ@iD@(a26KGElD6=9)NjiotGclN25lDU;d%65Rx z6&4kfXM0%vF-OBL^{q8tzj250gMB_d+`*O>WnQ5$K)z)gw^5O0)U1HpufK-ZX@FED z=RM-nGelq!+ZAGY88`Hh0zxe~dA7%76j9oeZWeQRdQLBjh?OMOin)g5$6wu`8G>co zJbUs8QKYmQb(-}Wa!R6K50p-!Llh zz^C2r5QYIop5yx-T2*LOA~0a9d9AP{)B-_K#(05+WeY4DY)gQEsw_C(-9b1mC+B@? z%_g1Bym9PGNf5YruBKEalQ;q(@O^CC#g?{F)R!ZkJ^7sXzw<}@@cr*l=EmxM@7_a> zkIo1eR(SsGfV{NG6~yU;Q5unGMdnzvIt?ma;CK$MW8=C8*U&;?I}Vm>NVTHO47nzh zi4c(*grZ1NhNA(xte9R8STZWg=Ll4Yq@_9ZJ_B z_iS`6Ks5p)+lDZ}uGLV1OD14k<|L{hrzA;oEG=m@nsgdXl1a+$^BuZpXXpyhW>>c? z8_EhtSG;!p8cWRvq9~}>8zz=1iioq6I7=zD!u33C%ceh$$cqx!cd0kqNXw?kGKAJN z!jPgYNs?q{<1eQc`o+aX>h(IG-Tj2sH$yxyO~+wT$xB-2Hlb&r2bY z(m2?Z*6i=?^6|qbJb1Q4B?QY$OEf(Xl}3mnrOZq6DkCpb(26Y2$OKr;8p?N3+MEek zg5$GO(j+75N9;b`<@U{2`0VcIv)QcGtP}VirzgkM!hk%_xN&`(AAa}|bBjyV+Z}>N zn}d^ce*fG5mM6RWC@1`a>+a=!$~b*B2#Zn*{7PWQS&HZSNXJG>neXJ?19%Glj~hLn<4J7f}%_~_%$uq=zsOINX- zfd270o?j;jjrDmUP4Ru7>({Rvd%RM-^UgbLZEc~o;>N9;xQ<7fE2QmU+cvMFv0Q94c@be4PSv*slgVUeak;QoUkuq7AFkG#EX&Y!hb&9TtCCh& z$Fc>E(8Sq`f$&mJ92bGi@?;NwR*rwHKQuj1fp(sR! zDdUq#p+qw$23ZlB&LqC^nXTpZV8F`OgMQ;IA#mMu%7i;PCy z;nuaw{JsDFZ}Z!~{_EuZ9;eY6i_0yNXhM_>2x^jeBuL|w&~|6pdRl9WJSUlE&j6JA zMgAXBper>~gSr>stZgLmLI}d3ZtU|}LMbX#CGp&lu-2qrlh{EEOS=@=3c5^4We;t+ z_{{~Rmm}RimLsv6tGH2{Djy?Ng_Ki^v|FJ&b=oS&(HXW5v0a7a{p`u#F_x0aQ$y1LH%;xbiL;rJe! z${hI@%h5}V>dc;3Cn3DLfoIAWd>gHDRIMLKGRkulS{3 z{*QU=HA;bQF^V1V<-+G16 z59oILbh}+HUAn}0G$0IpDrHEhN|h*G;Q1D=Cz-@UvMeLdb0(7s-LA2Q%+1XiC4H9B z2m^Lco{^OWiwpBK>kZO4K@|mIy-rr72n^}qINsEnY{&|ML@5(j5`+#_F@dV!r~ll0 zT)MQt@BYre&|DkR~OrC#fnkgrQBWf~ux=O<^G{Lq4X- zgfcG)J;`KrMi~0^&bs{OZ~O*(dj~A6tn>O?@9>rRC5lSn*dEfc5xU})SMRX1vqRXJ z^*TbA{Ko(JPx<+u|9Os2&iKI({)AUveT~;&e}l_gSD2q)BrB(9KE}3X zoEk6UPr_QAEX#QH<}Lo0|KWe+XTI@W{`ddmSNY)w9}(8;oSwzlzDsLyo@j3$$97p> zsF4;q<4N=)OL}^*NGY)bqqH#3QEg_Uy|Aqsm7$o;2cG9quh)@|0RgJ%UDRwgalK6* zADogp6|H8-$yv$sN1uTX@aI~*cI~DCC9n{=#uXNMrbzn{Vc?+Z7LC$FSDJnjQI#2v zR@hZWT;z|_ zUVr^9f-poVfoD6!SxQ)Q7>x~Sa&&mY!omW+7lJk!UVg1M%aFUU8Xq4YV_6nUOG|XS zC-nP$Y}caG=}@cHskB7k;@A$Fa+cqI0g6^th3A>9d|NC2?yvkEZePF2ul|F7%m*KR zLSEzu%Qi}Asj;L&s~jOsW}4?pJV)SrV0ksL3WP8Ko+vdG3GJ3RU7JkO)itT7m#W7|gQ zWTLhL8ubpY>vDE}#CN{)9i)^jEiJLWzRvmi`E1Gk{N4k$E^qSW$rEnhzQz5|?{Rv1 z%wRB}QLB*^CSv6A;RUF<%a0YWb>sZ=n_8s@H5gZ zAsZa=wYP6^@1yrQKiOydl{Zj!h(?iQ6-WnZIp|zb6$#O3%!xnx<+V3eSgU~zthts6~-!#*pk3pAQ@RF&C-9LE8rX?K>fENezg zYOPsWzr@1wnu)Fe7M9mozkC@X1XphvyKj;tY;JCHetvF%F=>D?N`WO!Cj-(o&!Dy# zdO403=<$g22T#~}{{y<8JV0``)j9wGAOJ~3K~$dfxg%@*`hzFj+ui4nzWrU+8*_9z zZCY2>2s(Anhh4_~A#3gp8bKXZX=0(VeGezFIZek@u4TYM%VhsjX|mCTv%xuM_a3qJ z_UpK=%kkbbKHY!Joz*KQd-Y-;RVKPlD9xM`GN&Cr`~DC4)|bA?(i_+4eD(oZUZSNW zEpoKwQxyfOETB@vlN_W=cQ8a)G@VscoLkeaHw1^^!Gk-E6SRTg?(V_e-GjTkySux) zYmnd`+}+Om{bQUPZn&WttJkWkIpEH?9d>p*)Y34Q|cSWNzmZR(0VDz zl1UTPR}NxesoAdQA1-t9^9&$*sV*<;-tkilq!%}8es@xlH(_r6Z~4b}azQxBJo)l| zXYE>pY1mgd&@QM%)v~s>)o3@YJhH7x2Dnw*n$6h%!sXf1OO!cON-|9j4<{+z!gc+Z zD2fFwlFdpG>Gtt228jJP4!~5+9)$2eA?dV%=yeSA^^+hVXRPJ*nH9oIBRTQEuF8nA zZLsQoU;LjvG{ZWFmT@#5YT~-KI1Wx##jm=ST>P1ozY!!gp8r#Yt9(*l(gSxn&3c-f zLOw`HpC-PNcpSq?-GB>S3jrji=+2j9UGOEPzh1nQ+S;$)T9R#1@TNW&H2FbF5O(eX zV@8L-t)Eq|JQxt#5P&f}5bA^uw26C~)OjTfr%qc6@~YqPB*I8hA?5z=m*+<+)t3tw z!nZ57HvP_>%bfO&{YJAAuh|eij<|QzGu0AB@B0*Hh%QT_y8D2wm z){0%CfJ7{$gMjd&p|QPxr;j;>!Tj$Oj5}7{?HltlorkQlRBN(qKE=aIp4d`4j$O`4%eKTZkG(Y+wUh)zf1Xt z(@hjn_DGC%74$So%{aoW`$~C;t5`1h+h-cGjEr%qnDiF_VIfFXCCvo*esYUAIp z7n@xZ!+#M9`nXzbyZT{?K2WRZRN2|h85tZO`wTz+$?+BQgpMWkmg5Q>PVg*FxaOb+ z-(?6C2pU%8=ch6VR3FJ7LsI;ZOcB>7p|;l!sh{Vp9=wMH+_|tJ9g(7BH((JI2knIw59S@B$6o>yF4RF5FO_Ld1PTWx)3>o}8wAY&0_6#)(ZS#(;zX5HEFUG0Q1CPI8$A z4LC;?m4=BYf9UR7_hSTQb3R5XA$p`MtBf%t>2y)^W+u8XCVrv&I4?tTPW&8Q_f#ig2ar*Dtc|yf+4uzym+E z(c!9*s<#`(vB`EID~TTL%=eUV>9DtSIyqIPVC#|^Inw!l;h9Ou3!ERWY<{`)A;5?I zzc5Y3LNPVMKs{ZM7Hbh~1%Aq$V10dk@X-nZ(U~HO*CAH2+vP})f1|eca>=F@`jS_^ zSs?bJIGrCl`(KwUZIqENdHyu7%(iw!{(BX^mxLI%k2kJ!o*J}8OX*-TygWJdRcff_ z)BonF?TdQr$)hPGZoFWEX^X_`F*R`P1~Pnn7#G1GXB~T-!m~)SG)JJpXk{B}J8nqf7Bn>-a1AtC7W`mr<%0 zS!P?(`Lp~if;Sf1-g2<3haYlFQO?f2K~j(qj=#C*X?e2b|0J3NzMjM0jZ1-kH1MV2 z@ojC;H)lbb&!i;}q!S(jBma{GRH z6G&K3&&;?td~j2hh(aq@z-DG<)^>GSI~W!hajE<}|KgN$X&FMflNzezFixc!Ubj@6J55?zZ%eixTW=pkZ)ilm zS9}11py4AlpKXXP`>3wIbM#MznuexkzN-r#-K&Fj!4)6px*=eQzHrY;YWidDw-~zF zm}p{SgRCzB^k;1@=iIuev*!=e7nQ1aFWxs`s&Iqg1alV^{nW$qa&=9OJx(v#294`~ zb7a|Icfl&%lFUR*7wDx3B<7Dr(!wV8?XE=8@1#%~s&fL1nh|U)5 znQ7?IE7S0r;_~c>-IxepHI*P*OqJ|{N(32B=yPcSAp*JFO6vMl=;eYxx=hce?=-o` zFJ>cowBu{%x$P(Uj8B5rr3AF9j}asT`-n^C&BGW z6#YlS=ULA-RnG@T`r*%f=A%fCxVkq-;r2`ssm~v2U zqk-)aO_axI&3nRDJ{rs!~l_z~Zp&{%bW|vOyHGIrFHj4QPYI}O*YL*LjG&}2^0}?hFJ}g70Xf<-+dt@N<&?^?qyr^Cil6`r-pZMPZhghqMZ2 z5ub3NFOZyGfRcbPlj+RwbP-3!gZwxZL_gbBJT4k3CSOAXvMv}$7%3}0u{L=wM;D+# zN+n$K^4h|D5vP$>&2svQQb&Nl=7`oVoCIADi5Pa&S_qxXrfJ?tJ=XwM4oYU1zP;B| zZRqhDQ8wFGcCKc!z~K5K^3{%_OlD>uJ*i}c^eBsCYgcRQiQD&`@zdQ(i-j;VwKT~? zJl$kbD5Yh~D=Q!X7$S=;T6~q~g7u_I49edk`d<}4r;rnZLR4R89|p)h+Z=8$PAO_O z8|=7;d#Oh0I#@6Oc?Uk=BeX)x1U76pb&lGA4G(RESwx|}wiapuyp-=hXT~<+;z|$# zsGymEre~AJ95q*hCz@F% z-!r7;9d^Z6&lWns91K&CTVqVR*J+K7+||SVb2K5MP%fxOk%an-hxIXjY5c#f1_Bj< zJOu4Ep_D&~qfT~qr68ir@Vw;E*}anoc5B8$ejKtAqv}ewZl@I*N>0QIH}yN@8R@hn zW2U=z4tgEXNkVl+~RQnd`0Rw8WLe$zw z0a(x!<1eYG{!(Xa5*Z^AmE0m>DWQG|o`TP(-@TLyLbnzXjbwmV?X?{K!-N@rz#k!{t);Pdkw67C z1!J$tk{($W4mlGam_0H50Zi~AHWkGwDDn>tp$Ri%(jGywe9w{7Jht^6u29V}yvx6= z%rDL_6$1JC;bR5!2w=1Dmt!cB1m=^9kJpe2AT~Dm#*BK6R*LF;0_>hyvJN2=6mmd} z_E%{0#q;R&L`v*nj~?**$n;O_D+}3KrpQ#j)^P@PURT6~gmk~~-UGn}G@GPX7Tkbc-G%t^!{+245 zV_Uyd8NZouZNx%TrKhir6m{My(s0AZ!Sxj5%@XyPT7Lb45=f)kY2NKv>eM5YL}`M3 zx;0|xGO_BE4C3mE?&g6${h57&;WS)Sy>+>@VHgW}3s)zjvt$YBY>Z7?c62#iacXvsFU^Nqx>30gogmlISG*gdd#7gtB zG8kp!(5-p+xnvr0PW-{Qokza?+m6S!y1MZxsg&oNtPJXrd_}yx?}u1eW;Hff|ISiB zA3e83D7d6fE6%>Ba?wYlThs(uY5z5vk7@JRL%8huB4d{y75v**ofCz>AtkDQi1~7o+kFiD`ey};g~hncwzARS2pp2=(_Pswi4FO} zf3XN5sx6f;adWT0Aqfc>e6MG$K+e(JJZvIGFAsod;U=bPR*9Cd#+;&bL@d?9 zvT+)pE*Js#_{KD3>4=(siEkyIfR<3rU&!15z!&Vr2zbN6@{PF06qld>5;v%*tn{|F zHy(8X{S2D+J4TFHL+v&C5n|pM_IVa|rCUhaXsv#3jxSX6Y zS9RZsG|UN0BfIvLkYR+7#SGD_;7@-zeM4_tThw$^78&lFCUNz3is9Jw39ziuEm^8A zD3fph43*1(T27AzrVB;UKnP54Mf9Xhw|8o&Nv z)}S&pH^(*Skrw63Rx8*<3LS>8e)Xs5;gn~@dIHbX>0sObRbDY;0}M%6t`!|@>CQHr zoqZj)-F*OHATptWPf#67APOuuwj1ci)?2R)_`&`sf1SHz3=KVNWZMvk4UPqZk0%ZyrbCpKl@%xbq6&=slvO6{Q&$@j?Rb(?LI%eMGHdPf}r!w`j3xkG~zNqj8gg<(`S*bPt3`kcxDkF zzXs1;FYNA5R6aPL38R%*p~bP;pUqh>f-FpniR+|o)K${o%n(C%?8I9*eu2|a-Ejpb zhMEn=sl~$3%n6u%C2kD)eX`ha^~dn^)dw1M!t+_SlQ21(BVrlTTNc<3p8h4)g8+&a z(9k(}xQTac=yTGCFdGX{bZv4aAIyHoIXK@NiJ5BXY2|Dn*Ij2mIy! zryAx{XH+J5jK1brnpn8TyLZP1O@8l@MLHH5jC*jw*KGVVPTw z%QhTh?Pcg^gRm42ghD!K#n`{--$oJxn6IB>pNxc!`&zm`2zzeyK3Ue5FSk7)R5Y0R zmqjh7$R%-+Unz}r!&Y58%8R+&jH9hP#No58doT71zPM!b8CNeDuyK}blr{i(t(5K; z)?%w`3jB^Gyb<=F`KO#n!9s<5lfk_QLD1oByF6RZhD*yFZg)@2dhaiCSFHT6DgPeC z-aalrEjPU{M*!oAXI|#~!KBGad-2a2kQ8_%iyaEvNF*E|M!U;9NblqF1KHO1oZjc& z_eC$PT?cDS9OaRveh{kon?gZThD@M*6_uwMRNk4I75{B?dPCWQWrLcz|8FA{dW0+rF|pbXgfExsqF#Y1 zUNrg&{~{TsN#83mvOg9$j-1yuIqSelOR?pCXlG~lJL&Ej__ga16jBV1H2J{^Ov)*V z=_-j9$CA2E&sfj3?3WZEPC)^g(tca5aFyzSvvxR(P(JWC17orWmxp7NXkZRDHRTTE9zzpCfl(oV z!~k^+Z5#QkR!W%PM26UqNAeW$s=oPKaHnXjETH4v zO3O(=i*2i8bzLy)clG(+OZg@Y1!48PJbscy%m2@>Sjl9pK3CfB2z^R7!P$QRrvB;f zmM4e&7RH~>XYgiDNntUelY&u=V-{nSqElBcWurseLm^Yp(k%((B z+bo}aIP>0?vtRR3)zg=<<&oucnF^wrON3Kl4yR(v_}=dlRU+qNuN{#eo0*km=jAnN zhFRC$ERkG9Ku9=$##RfONR&}$&(;Fwgj0u!q7`Fu-lrupK9zfb4ecjFa!Lx&(^>sl zgVO<^xLyfhIrrD|mNaS7+iWU~w^{+5VBkOSb*(w7+}JXrWzz$3#6EOy>`WSX;){{G zh+F&9<$5@nikjPV$LV}-D)e?ow!9NKF4p(gK6jU&?&e5pY^L@?tY;x7n#L+ZD{*!> zqZm<5v9Gll6Rdn+jtpx4n^kg-MeR2V?N7vH`_Go!`TaLb9bwWlNX6Vx>)ReV$v?I< zEnVR#jGGHMJ##zqhdU*ri1?}`kx1X^N5Q?#-P_Vbl9{8shmcRr&TOM=wyS#=@x&&@4Y#&p z+{E7Y4|_0)CR>Fq!`W(;1*(9JnZsDaKfQd%N1;- zISMNl9U>JHZm9o7p;RX3(>+#cIO&wTi``(rCfZ}pWv#Ytyp8p(l2!^lD8&ivM_ytM zi#eE>B)T12%&ekHdMd9#Y8^5(VaY}xVbUpVt& zfO)EoYj}kBMnc-QegGvHtx0PcZaMk+U*8u#E?#ocd;|<$lL&{C-{rORVRRJ9vx$PJ zNq9S)P|1QrN15RCSzcZv^HcT;wPt_|G=?CfFbGG{=Rza-<-b38&a^sdyrSaSmteAJ zN-JBP!;dbxI%AO@?7HS=Q9$$SAbyZbW*V14Mj7mPtu9fL-=4uHpC`?-eV z_V7lc$>kJbqzYNNfY3r|Upu*Ev6}f8zU!7Zx&UH1h28!BhCKyqX|`EZ?OPB__3v^I zi1^j!-sIrP<#9o3#5{6Eb>-slVQ_bGKnR8Z8QD}lDv{8*qFTfQgOj7z8HY%15le0kcW9gm8l8-REhg!^1TK zf{Qt`Kc=@olX0a7&>1CP!qE#4q+P{s`SK;nB4guOGKdrHr6kr!6~d{gFkEB_0i#ie z*UcDJ=j*}a)A(|?bcaHTq*Q+S{`OsDz^&3a^&SW>-iTT9_qm&Ne4=W@z?IYJ<}_=y zt*wj{sw3aa9qZvyN^J8KkTm$bS=%b$Cvb4!>qS1@hGUD@Wy@Pi7m|T#*f^Le71GPi zhuIe~c$D)jt?WmX*-I;@)t*@Kq1W2e+++i-Q)dGd7eP2+ra$!Xz^?KQT?9>$yAp)o zB%7Q*%+g4+YEOVTflzD}PCg-NwZ;-My2=$25&|?s_6OtN8mo(Qa}?564br7Jr{XM@ zwa+BuVnRwmhqp0369b-)Ts+)E^T-;NT>Q8RgWsC>7G?<<(AT7JE8z1hYa0X3o9({m zaN^&*6M+vu26%Nn-)U{T>!y~L@RF-=?xw%~x+>B9t>>e}n21|mI;&*-+i(rDStDIL zNq?1nBY`YBhAgm}T1tf8DwaG!W1>?r94OyVp;+&&(u-MtogV}}1&K&07}F#VtD|FP zQsNpX&*ca^g?u4Yv|l`p`=Z(vyohIos4sCc1p}Ze1U1lJ=waT8>|NGH5Y^Y!iLL&~ zC)FX}zd~nQ-U7UClisK>4RTuA!$Yi8Y4qe2RiOSP`2HQ}H&)eq2Iai=OmV(aMN*=f zr#n86Qv#QUR1Lq8Jf20<vJ@ZEm~t0X&R!v64) z0-0GGhk3@(5JHc6p(kb=GLr8j1ksd(dx3wFoPn28#ezi#6~>wJ`d4wfi_RBhZKN*( zz`%_!d8CmEWNK&_;K9qb?T-lpP1bcb_pi^>_TQMXXRIhPM~X^Q8gff%QL9WXg0X+s zpSG`ezcZ9ix*bh%aDu`6W}m-1#kn{+f3dBw^(_bh`X2!2rW}~Buf_j*GF4nRMqhn9 zW}0*Lbj%9$IkGC|f{eMD`|GbyN5QyLBo8E%@Vs^Ke=rbr z`o_S{#Ly%i-X4i{dX!Bq>uwo%8b(i_fbB_(r&`+}1nG;dhyCkI?X+JJlb`tuw!M#U zy8k<3NIuD@w%cdB)0MPZPV-5@^ux|o4wB!--Xg0t*VNZ`4qwdS&SYQM?Ja%h z&O%~-=SM8kgCstvJXf}a&_rh!0(;H72{WI}h55d(^-L{&knlfjs%cm; z#>$f3@`WQvX|fV8K4=pdFFKA5f>^Sx4OjpL!bE|*`w~B*Gm+7lPL1`?)lh>Y(1Ck- z_2zmC7M$1CuJl>M3oGWWhr2D3T|vf|=hNmUibCwFGjvmk*M|qy$1o_?gT&ksXIm#_ z5w?8W2dH9Du7yVrntyrrnas%?)4_UrXH5@7I-Y(%8AFpzmX{7*f8Q56agOM@S@uc3 zubRjl3IVx^`o)_30gDy= zT-o@6T-+3;0*qWtt!op;LM6X(RvQs~<>ceafd~e?VNcyNW^95q1?%*Rwe&d!2|`d< z0xN~IQj`gBsKu4TODoNT&enl!BJ9Dnbzue=b*M{T!2wFzVpkD8SGQJgpH^KX3C0rH zS&wb6f8;_YBPYdmG&Ei0T$dNAk(dG?#PPzuPSxh&nrl0b{g`~B>TQLB_%byLAvV_w zQC#9#T zDUm7Fy0~vF!p@(Ws1cUF33V%Y8Whp@m&94v$fo2ccH55gW!pcn&mv4f4Z5}f2tutj}5lWTKZeeC6MU5_QNxCX zRO;%QJL651JUpK2WN-tiK|#=!&Ysca66zZE%RjfpZmB!d5&JK2kKFkr6mzzO2&+_K zivX-Abfx@$L-;`wbo+*3y_2K@XSFj~8HruU<1x9j;G13lfs|U=a(bb;$I>VP6h!xB zR^75J^qg06!|a88a=I0_qfnn!f8QoybNZajmyd;+ZUe_lFr!Y_=)oU~zkVUGix>ec zUtLqPicDpd<-A$lZo7lj_4zQ99M?k>!?o3JFQ>o5Z&XVCiu?)3BQ_e^@SZ-Hd$?|H zna6=we>bm^&uP+WA3CYMJJrgVs-g08H+$pH9Gsk%G}W%%I$1rTUyb&j>$XBphN&= z4Lr)(I#iR(so&JxcJ28jL+=TuaY+0@F3>CeGCf@~rExO*NNi5gI8Bc+sbs^$!z0{2 z5QKvSeo=g?9^NM6}q{<^F=(Tw^w^M*m>fEc|0zC5k34SBNplC#M9~ z8L+@ww)!5?>2}u1l7)`q$t+4vj}@3kntm(q9^XyM0OLeI&G5gsSe+3TXh|}!+Ssa8vKbfGU z$(bleFcPh@Zc%^z1fg2u^w;@f;~n7}=NH91x`!BKE-o&8U^HRLxcyzWAeq=+Y!)Vf(kG8eMY9}F84&;Q-UQt)~Qfe+i! zdEY;wt)aE|c0!xnhEv=`mj@Ghqz^_Z6jmW|z!IeR`6AEFP|X}XuGu)s6eea)f+D1> zNY+Bwz%ueEE|>PVAQRYfLR0AWuMPmX5HH-zZLP_0+IU{75$R76q80<=K(dxsO` z64FJi=~L~Vx>@{U1)F`midn>Zw(RPfn!8s|a1`HRjsOAY?L@67A0)L@qixJhN8RKi za|RRt55M6LO}xFcbCPb&$o%{~*tl%&Z}#;`mKy{0gqMxOO*a>ZX2ep_t>7g8%%Bof z_ri%ugH`mTWq!~;@x=3M2R;~2+T8)XowcmDbC^UYJjJbBHGJ|HI@;x77Atus%ar@O z(njkQL44qnaZAXhl{p`+Mfta@U4yCR(nK^^q>ohN4_igIyj4OnMx-Chf9CwzY zZR1swKHHh1(w1}AhliIgLX5@5AoP`m&!`pK;r`Q#i0+ph(US9BdJ)<1pO!o!<0INV zfV0D9y>P>(13ramFicG408T@pf@2+0PgWajn?7gJgcBud#pf-_8xHqH?I&pPT^iy1RY%1C5>>JW9@a~k*jUP;~OsQ3e5Lm`JHCeo-?2FM_%5)%A#6tEX!~if;SpW6vXtT8)ko z3)gdW($li_P%}$nQN*l>z&4IlD~-Iu?<$tJQc>MvWev$~I;S{8Z=s4g^3rklyK2q| zO<{%or+7!I^D?qV>Tp(F!|WrQf&wTv!v5Q_AOm%*Gn8Q~*A9XhQ6qgp1qrV$`~N1q zPR5zb{W))N3&x6-gi-4n>xXyyNkx+9c#c^osGP7=YgH9Bgt*fbV=yA^FDg0VX_|6Z zwYL}K_>BR`wpa||^=<^C!|kDSWAnf9f;l9bC=-1yeP7=Yla8U6mv6f6&)*7RQF6e* z0o3M*a5k8Ak}TNhSMwL>ndrNQ@5cbDs%+l28Q7i|=zfcAe$T@1@C4=_%ZaPq__QBp7l+)>42*5 zAO9Y^<<3Ifx--I)lOpI4kc`tXD1O9lh5jjl#kP*hh<{HPc}?UkIpjCIK{HMxO&Yqz zAG8IkQ=QKBL*wdY@;6 zh=~cCyz22wCYxI@zvCAefuEQn`$3df8xWiJ8Il%`Hd?xcfpH^kO)AMVIwst71eAhi z56wBX4OwlLU3N(GfQu0v12nh5t|p5g(I_F)UzH9LllBsqPRDSy>bEW(fv4rgn~Gr2 zJ`^=sv|xvwy2!xZKFpk(Vur2CBjlqGp8s=f=4t5Fcg9E^_31}^FBK!39HDK)wO5Fx z8snATX9K^{@j44Ya|O1AO#mMs1DFb!VS7gjexB*?g+KrRRt9vwkXNGfb9CY8ikGuh z*5L)3bC>^#m@oxE3{?s$dr#}I?X@yXN@DLddGnXJ3b(+&`M)B7Ui2jId+26g>_jlE zmlN%+wT&L1Pb<+G%312zs#n|4HNut!WF3xWzVW}Wp{%%Fps8{J0P!NO**rD`IZ7*= zb4RcFgZ^~KRf~$Nq7dw-NfXxc@mgT94JuS7!6Sj~={i?rUFZE$2B4S%_8Y;`XQMwQ zYv+d0ixxIQY2?lT8cHE?k}Gfa^nR9m@9p_EvB>d=TU1*-o;(_N$qGG?WGZ@(^{c25 zLv=M^PLWM79+WVgo=ku%)3zFKB@Jb|sq42^yakV_LKb}Mc^hJUTHybbBII-H*PJK5 z(IhZs`d38Y8q@k|mb0weKK{7r5s{MO4awh+C#5T$%M$1lh>Fe|Bb$>?DGOco8IN&y zNBHWDU2@7dKRHk1vke$q5E0>vg07AJjk`Dv?ibF~@)L(!2FC4)q~#aZqrUWM7=0}A zk`)Q76R<;H751x*w}pZO8mni^aE!&hI!!_=TT*2aMPJ3Nd=hVnE;a9sy43)^9ic@Rn%$Q`q3M4Bb@_y`ZeKOAwts5~BU~urfJzTyMB4#;~O9=LC znLgHz98@q~g?ygn0D4ZKqW_rF;o$G>jv?}r>y8n}JFY+Tv%l=#)DewewMu71RuPT9^QJG&Q zxn^lSIE22CftLWom%o;3?#IJl-|9!E z2egnD2)h0n*-G8s&UF9!JAspPc6+_mH4~JPBC!U2FDi%{Y~(I$Oy5M^he&!e?hVtB zh7k@_c^UxpW1iv&=>|N!!0hwy_H5NKu*pr)&aF}Iaz7P_4rR%D;`$k|q@js09D)g4 znAr{4@a8OP?05R1xwEEm)vhpQ*a(o#e_#s)OH(~_49u{Iy~xgncfDw9vsKT|C2Xz2 zg0i#Un@b*S1Lmnhh&0Uu_)2c5ptjY99wPE9hY4pN6=5I%!IQ4Twy0E<15qS zzhTT59b0*5K9gWpSuq|nK~g5|c=>LCZxKo-E(fRFU|1P`_9^-kAgZaH}fK^ZJuil(_ zsxf1ZEoyQl3#@*?lD(y6ow2=RT^;w6$)R(o5nHIe`b?CS5Y~L^p9p=m%SSbzFEvkB zYCR6qjYeTpVscz~=U3O~WV-4-qbOUQ(^GUZSXy6=4j#l20Isc5dvwQ>jkD^%JNjRE zC0m2XKfKd#xODVnG5D8Q)w2p@pxqd7e?wO=iwJ1$ch>s&b9IK3g;qstfC{AA0BUftT{#@CgCvhNTwMp}s+1Ch~5`nQTG zd@~XWGj#}@J>&Zb|G1!3)APzw+x&o_vs@OJl4;P$>Bx7CEIZs%k?6|4+Vs41_?$lK zyg!7l*6SEEW7{k7eK))T16r~kDOUK5t*>CR@m+LGY2!}+UzV|<+sPY9OQe3$QFm?u z1V8!t`)}eB^wG2CDI=~uh0CW6?{8>Rsv&B6-f7ovw8xKG#1u%44C=W3m3?M54mYIIc?`V?YxI+1Y?I)G*uf8X;*&E%H#NkoByr96jG+ z2LdpVjizHZ-6MuH`}_6-$-}7ujTO#I4h@DR`$#Fu^e)?0N$ZDcKDmt<8H9mm%rt%^N6oSn&k0p$pjl~TzlZI69ur^|YW{YlHA*bL}TUvJtd)l|7eswE6eJ=%Tt zXn{nqsT|QQ{?;d9j#vH66uxbHQ^Dr`-+SyZgT&I?Vu~W4-+~b=g*TZ~ZSqU_I1ua0H7N-=3O2->`A3JZ#o^?HRB)7W7e|Q+7_Ehy~<5P0ByXIfI7JBvlU{!te zHoSh(O;`LEeNmZsKNMql?p)!HSR@q}E3ji0(RBBa#&>XteS_rQDZuB%?WI{uoJM5c ze2z$t^W=L2e_B09+8n)Pv7|meyn$7iKa>(~stVLR*%hziIXfJ%W=G$NCD%sqr32Ot zy??M^DVkYj2pC{%Y9*_x!S&;iX`fbvXCfk>b{q?79~H##?Y`WfYPWfW_09fB7WqJM zPn$bq8?A^WzJp5~0a~gr+*QzlN9skuGErD4cZFY7z?QIC4b8%XcfzinP<+NsVY2@@ zaL!Ho3t(N{?+@@3u{^r?rbMGe=_!%5&EsmweUuC00518FGnQ>?SeM<&k)!t)u)$e{jSL8T+R-il=_};|0UuIqUVrVqG=+YMUVD!!P zTtq*?o|`;Oem&U5h+m|PEGA1FRo8_x^JMMZ!751j3Nj2#k)QTZ9$;W8FX;cFtUy}K zYjuE@V!3jSro!g{8DJN}b*v_iXZBTe9}Yi&W#w1o67!JJ;L6PN!7y5mj|vMeX!eTC ztA}_@Ux8t^?nrzOxM?I&gK*g7vNsQ|O8bVS)Xbd!LOD)vl(F6=`nh`ijL8pV%gW~c zSv3cY2GV6E77|yj4xws1qDpsuEvoS4{jrEErkTm+C7W6gI2=o$`kxOHuy6xLMBD<_ z8AqG-);=KRYtGF(fG18<`&ZG3%UIXW=bnI3yGNj9jUuak>l7AI{J5^R7Eb(QLGL3q z#`gp5{T*XmLV&9wG+j__8XjE?t-oUB@86x7kF%Ml9owD>DGoibBS@#yuFqK$8lqb{ zlYj`)&TFxVpWuIHujUrlHn(H+DA9p74==SVX1q3%`Kb(!|1s`2d}5BRg3IRHYM*8N zf_QR&b}czYE34G?^vnRogO@kMVKnw9PgPGf=wAk0hZK6UyCncVk@wur^;bq2;j68kA@-RKS~?N+y>&Qya+42rmM62rj3$1k)A7{Sbf zL+dXu48VT5cT2vHf0j4evu2gMB^Zw%RUwf)>JG^B7{PiuSF3v{&owrQ>t5G*YBia_ z!moKJ?h)%JOm_*?mo41lHxH@Xnh}Me7CV9^O>o(jf2#S8fe^6K)}$gVv!U|Q1qHrp z+l+}Mr^vMI%gk-53G~y6^m;`(0^NODDH+<6gws;BuEof~{9ivoU=MRp{%RSka(a|P z&Kwij#e;bhej_Xm>?)RAw)c1dm1pOB!PZe#%a$QHyDd)?74l{BhjAqd94{(!*JfhD z-j{5?){&(LhO7f)pSu9pHm7r#s6$8%^SF631Pn@6DovPdVwr{pXV=;DIqmLHDoLPJ ztFFq~8_4OI8JbXguG;$aPF9;{o}g&hNz|+wBd4#0({2@Yi9Sl>kF~kTHAgupz8d{u$^!3 z94zI?pEJu0qyBG7^F2dYU?(_6b`(GRYn+^6o#_D9maEr2F)`f@E9EodW#{m_R!r(~ zBpXp4I@~GRM}FbI`>QJ^#ds6kVsy67*wM$iKbVG+ltH9c+WV)xV{#u440{N=KIbsD z6zLHouq#%hbJF!!{Xcx}#v?$5h8{WZ-vQt#Wzh_FLnKduOmk5&$A!IP(NG&X2~N!F z^Aln;Lrj~?JAwpRUyNYsy1Xt71iSOa>lEPeQb-55d;m(LAd$m&*aFzmE2t^@PKZB~ zZRh@ue)(}2Q#t~#I%MhvA^{EP=ghhFj$4FiS_eg(a?Cuac3(cQl&C|JKt;6=yfr;Cx_Dy!{AWA<$XK?Whr6;HpeKBf(y;WiFnZRlLX6A(0A5<-|g#tCmlS)OwM5V ziF~fm0_IXHQuKD3mbVW3555J$9cL+TKkpwTYH%BH5-3e06iy#Ef`IqJQMHWnF1~@+ zh_gqRxbJT`@xvi$Hz&qaM0sjT=f4IlH96(|gGj67{2)^7crYE!t-qw&^tZx&*LlhA zOP=HvFDBZaq-c9_l6T7k=q-tI=F#o3F4McpTvI_jQhhA?xM;`yMW*k(M(^|P)jE1q z;X=cEeBF&t0>Y@l>SdhAkN=#o1ZWYgwbRm@p~k5c(I6$#O@OUi{o>4cUypVR1+*rH zq*A6Q;j)iN4&f_1K^u4&BIM)WWZ5%hME4*B#iL_lG}JXIWR!qqXa#ejK|w*RkH$S) zRM-6t`fAxnrZj#Fh4Sc>z+5GQL)SA27UlAK>}~d9G*S;CRnlw_AHJ#J1{osls~M=Nxw5{erW^-9C7UR_cA~_o-IEoYJHiDuwzU z>G1;y8WwA0t)etmS-hKO+Q3J2EIg7rjH{(NxH96Rpc8B-?eB%xnwm;Suc@c#ni{U$>5z|zAr&?CN! zq-xc=EBdj`dsc|7`4m$(`?qYiuVn|*|o}(^%fR%`?$+0F}iXMv=XivcfQ>I|APj3$*pRs3~VII=MQAZoDv~R-WWU+h= zlB^9BD*q(s=ShX0AjYTpUlmC!DO5UE3aQKT*1$c7J@V@xOhk_PJCU zpHw7(FIEvyw6GA|#hzmt!JfncbJ|nsaK97cA&mna0f89 z?z|bNn=B^Fr`~Sad`HXoLAIo?k_~CqEucmyyv+J~X;NmX5|a?C{~1`HTGzgQ_+%8| z(<5c-4vh~J=qJ@1MQPYiJd7ylf)c&@yiWzBxo0hwvdq$rD{HD6W^Lk*xOiT9Wo4tw zew+l_OZ&2sBYmmfYV9AtagTPKnqFddzX-o>Yzn3BFHgN-GVDVsvl1~uD95qt5MZF| zUiY0$$T_=8c=a9Xxa^)Fdg~*y+Z+B$nnZkKtB5%4K@A3dvo_E&B8% z_yK+9F>YQ+E8@quao4GvrIX801CwaaddSKe>YzPZ&u%CB3rYFuIB}L6np*@Sfr$v} z+sx|+h=S|ixf{Q(|8Ruu0xlAX2AV3D0FRAt)-ZV^X6dcyEcCJ2ayV1~H`ZbO{JMWC zB{Ts!Ylu=MN$D7go1)TL9UC{DAU&GHt!-{iqX+p_bapM6hs* z0vHO;tZdsc73f82ByeEZGQN6k9qkSwN|#_T=xCa9XZ_ElKD?KxS}`=&H|F}3mwluk zIH>x958Cu%~z*P_N zo4{=FZ4IRf2-6Nkc6oY)HuP9o$rS$=CJ@@1tLq9eTt8za^N2hoRXmGXm0!Bz>R8)c zC0`5=7k(NI(OhirX&{gC8g^D&LC07w28+}HgQ^4LwU)mOm+xH^vLrjA4i^^EAJweI*mm}@tkNcX1{s!m6X+>BRp;@smA>Q zaep*;hHu}9ZRgUcXXu{A(D#xawaSVP{Rp|3VVIh)A_~|w3>p>H~l;n``kuK8C`X{=izU!Z_~a~-K+a&yqkRxny!Su1*ywc z5^Esof=(pgK$K%9rfk|sK_(^xGtVcEvpan4Z|y^UJ6I}IqK!W#%xc_1v+tIlwl4S| z=S%j8z14L@-PyLTSNIc_3e@>s>2+*e2$U@BV!bEE0(*3hYP#an0;7B1c{c9^`CBUF>F!t8a)cc%Vkr+#2g6kVCSR2_`*w6Tu>Xw; zPYbx&4}7{v0-Fu}!kqD0sWQIrOi{{y4^T3V@a2QmcXW7R7k&W_ zglgYcWD7xBk0C@bKx+z4=%P>4LDdyAR#~v*l5O=qfqJ+AnYi2L82d?F6pl~bqkWss z0W$wEbl3U$8&-dgn6~I?L2%h%W~J0Z`Xn9?Uw?I*b4W0kqGwlauW0qOop!>M(nw@r zOcvJ3;)twDU2ha)`pTm%4;sTUzSh$W@kjXKy5ejBV!3Cw^%0LtHg_VgTz zM85g!h;$htMBGegODk}9{pZj+i@ACUiVckKAQv&ESuo|{@uYKy*Dk2uMXGE)R9!YU z-$6U6*FmD_P6ua(A0Hn`J5v9m8XJ?84Z%y5GiBIaYVsBN2cKG=pNT9ex`iD&!#f3H z-P;b5jt({5@O4i-3TtIhXxF2B3pyG)RUS)a{ax%{w*6OcWVqPd)SDgHmFp#1i#dXRAS~eGmgwe z=;e3|Rj{VD_9P=NaePSi;vCG7bp+>y=b4}7+XZ9r0earjvx(@c67^^GP zs5XtxuWgygqK(z=b_*hV9}@0Ucm1-GTiAm`Uq6E={jxf7P2cDSU!B}yVZQ0ku3kky z23;ryBLs_QKD=Zc`+g>9*Y)9yCiI50F8C#~=i(7UC*;uv)*65b0Bb~h-rmwT+i#jX z)l3(iu<|)llGghc$x?~#d>BwUuM-lC@l6R{I zfujHcw~~j-_jZbrTJ}Hf^RKIW8|&T!DigOIVtuGa>UYIoOVoh0mf?J1N zc>o%7az$shgmQ+fpM2d-3TaxuYuAw)*p>dFh%w((0yM{oU$hA@T3aV@^L%nLZK6?U*K+7}t(IZ2Ej+{He-nqRem~N+TVF zB`#LKP@FdKxK~&pu7DP^RAgPrjzaqh1y>4hU^3jT-!dJI0Nhr11XG0?)Qe$DeRfZI zH-zQ8rJa)%0@rW6NfA~E!x-1JHO?xW7cYSz2by-OY3~Oj1BANxTq&!;d6bu5Z5m;w zKT$b1p=UduY?Po~Bu&c%`U^JyxOtqR>MI?hZSJD{(a7KRfEy&;-1@-lH)`p3m$U5k z7`;KhKU1%meug#;_Oko&RT=?5jYp27)X3TD(TCI2)H@0iCsiWZxsCk<7u@~@f>f#y zN%jOmQY~N?3%ra^>ZyRTd zcUMy3oXRC!3==L;YW)y+O$Mv{3*POak~_xm7@?DZ5o-Si5AI~sR3X=(QZ)O#FAi+*7|7G0ff?{GegYv8-DsHwStpsql&a3$f- zf+EQ|a6kz5dqVVk>HZLWCR;y9mkD=5)r=ecufj)en)U(2QB)eIO?4H$lgQBz!K=_u z3%>>Vlqom$MZt8TMKA`;;O&NJL-V+!w>H;KzQ6ldL^0pHxm$-};wLAkMIfEMJkAc6 z$F0m#;`Po6K6tb>N;WhFrzE*VPtUIKkF~|d6ZzdBJeiSIn%mpP4lW>p+h{9a59B*u zj#qEbe>k@|%Mg0ujBPC^*a#d*X#Hh1r0nobGjffYOho*+8WuhTe{|T;qlBBI zg1u!b;=01_Xy{Ht%bN0Wa$f}|I1D=eY(39om~z@tj8;H@ci1U&$yB2MS?I)MH62y@ zL~627)a{(Id<9pRsTw5?T>L|>N*gGfk*Kg|$Fg|E_U9@WN$j;+w*zpY3q_D*vz3-s zeSa}yuYLH3EcA3_Xfl^s z@W$fp9Y&3sb7w2hlw)Z2VAOMPj#Gi7@-I&!qH2h`cIP>!qO!7j<}>;d_)`;FtZW4m zB$geC1{zqEzl9akKrp|gMnIjF`9mr<|L2Pt8%wMAA-}u5Filo66PEy2B9WY}Li`M| zn2Nx0SsfOb(GGTBfvTa82)1kZrvEdK8_%UFdgaitYLQxbk1-MhR}o9C7{*}yDq|Av zDmtL3;T*#$yi(C@Jq&lW;4)^Glj-39(AK7PLoN{2g7jffDKD55N+I?GhR>RnQZ@P* zG6Z#;t@-06@;;gABoXVNDW`nLU*!%oiVLb%mu50XpCW&Z*|`LNjx7xls~x?2_m z9oTPt@K@b)OonKX?;J!`bEZYNI6YlwiVGZ!?N^{ko8sZ8SaE&J%)Is3-`4`FCH~kD z`TKh`Z5;!1Z`&}<_Wn`Xl*vidUubJ=a^{av>M+9s#?rT5V1i zh~U7(yb$b)DrLIFU1L4R5|xQ)GgUeZPFZ_Dg~>0<1j&NmOI5Fr5XKUC4S#-aph;pk z6!saSbtn6ilY~;AFowK#p^_j&Fg!f36eegs%|K|xfau&ir;8z${q{MSxLiI$D=D~% zaxfRTdOenWFqG2-t4MS&7BI;VyC7113Btq;EvG{~*zz?+Nt%%XPfC7vS02BKF0VXL zYrz~IrUjO!-Q1h3{t_F(05eJgiU?v<&8g~EJkB%S<7gMu>F>zcaJS?zGsV{s-Z zG^)Dl^rNwy=?0$|#0?JAXPNWI9#pca$DNCxa0+uZqh{t1)pG;?BOWyCk_Pt-IrJ<} z^Dcc>BrH*L(l>^DDj@FKN4NpewrIlT6`JlMMwK#b0FDd;ZJj)W3ihRSX)=`7CLdA? zl8^GwL+YNgGZ`33aEZ8ok6mE`IT#VDC?S}5^4d{lyhMOvqEOY&{>RNAzF}MPrEUz6 zz>Qm9|7y_kgf-4sq5ZvV{)FW7kLxJI_rR(ueW_jcA>H&U9!Z_c=8F$zTlw#ic4Kw| z)H#ZymZrstP(qXe_G=kA<@<7d9gsSW={j0WUld-?=M4NXW?6JEPYl_!8H5HrMr>WY8|01*!7) zB}9Z_8_gIXe$Jb`N#Y|;S(G_fdH(u}A4;KuLy@%lHzYe&%*oF=s=BF(oq-%fNE4PW zvHgCrMwFy6URRAMNP$SgAWKJ}SN9CcO}_X%21~upni1k^J=*bl&co5_=0;h1{_|`;%ft|Jl(NNR59i`=aT~fZ6NCH% zPi@ngq^Okngy6v<^Bum-_T00Mqrdz)WBK{(278?k8{!DPfRG26oBYZtS+mvA(-v?p z%ob25sUGJqSqZ}~_LSPVBuu8SKmYG*dYn0@(k#V61?qYC2fN|>-o=p+&`>o!p5&oK zp$}l1l#R(tIVda=-J!tz{Z*5|XByboWh1z?ZvOT^;(5p0!naEO7Lm@4Egi7G0@M*YI{N$n{)GdZpg<&=kB=|6oZ)}Qjpt_pmCmU_XMF2Mv03PIVM2Ch z7|$duFLuA%P7U3COm}zr;_RKt#Z8L~tCX|DpJP@5+VmjfUI89eYuu#U+A--zikQ%_ zN$C+M1v-wd{B_L!iW(e`EawRrza*N znnO+ax&1kF29c;B4027zYyOeJx~3eIW7FKBN7vVQ%+9a>^95!7Mo})R?iXi<2GRE5 zU!u=}x)G^`;M91VI;S;!b}AOMH?HAhFFTS=3UXtD`=GRR+q{Lh%faxP~Hnq5p+2IY>OkPgfLEWwyN9Rz+=B4nMv$|gj z=mij-_KsLg-~IYF_Qt1n6>eT62Y5H0HZrkg{-gdcVT&okB!Z}1-A1dqO>h6V+v@O! zr>T9%)#i3%=jBwC(0!TO?^^xiay)s}hy=MpI>-MIO|r2^uBIM*O?@y8209Vr)EjR| zNaJLvIj>ML?K>`ja4C8j3~6W`mcpT$RDsa{psjernSw7UDg+#a;F0>Z<;WPCQKvfU zpF3#m=Ug!<4AS=u!l%glNXcIhLsRipyP zZbmr*O7CR68TB-1{9eX~NunP-cJ)#&PPvwOV5tckW4Mp24Y!B|r{_p4NPfB`<`{PM z8J=zK4ll>OSO=sL*yXZC^#{iqTUJfFcR#@)j2m(7I0y_9O-`QhF0Fb`tc)>KxkWK4 zW{!)CxEBpirG4h%S=3+u0z1S9-2w^B9|_NoJ3IT%!`mF5Pf)e)O2-&P7A&EnfHQpi zzXj;kTupl>-)beCPzgsFf>8A~%4vNx*COtE>b!LTG0hus!VNi8!JERff-Njlqvbtu z^#QAzIbT1altUY8ONF(YB~lcp2C=AQlQYUys`}g>;r`wr%dGrqecW|%w)($CID@@j zw_eS{r_61u0iOdKimH-ep@|Zr%_#PyPkIxUG^2W)ImrrAgnh{hC3A^-e?jh%PumXv z=#B<)I^AVb@wD^k%Q6l65DKrY;at5Y@v5X&=h1cK%o!O_vXap3UED8$mR43Go$L-h zmMw;_h>GS2M{f$!G&&t-^mRgkr<5>r+Ft0`$bK3uBg}duch~b>vq%UX>p+T$ZImi^#etm%% zgGbg9YVGTN7pm@lCW1$geY}Gw+nF~xu3$c2>mEOf(O}71rVv~@JR^JMcCYpu>(Ah& zYcx*93D=E^;k4vCCA(=6-apT3N63qt^&aCUuUT+#v1)NVi4%N4qvPWG_C25cKRJ-j z_7O`TUqTCxTfFl(kEgmWwhj8cAF@%kh2HewNC} z=MZXtO{FQR@n2oxfbtJFkE3Pe)Ad&AG;@!}xXx|NG8Vw0F|ze9^~&QF=3lMDPS(KC z(i$o=B&-z6prdBUW>tEpGFx6``}!o?4Gf6BI|Z8w$<9s30o}TyUaU+c1S<-kw{(!* zGf(y=&}(x4_WO7Hx}P=~ zUr*Fe*Zn-kSuIhjZR(nuO5@b?I>*9i)iXPpux^^pq&Vg#Ja8@+pfIp@bU0z~`#AhS z|F}%?o4R@vtmLtAA!biv0Y)m5{`L&ewg{EI&2ZJTbo%)&qrw)1Aqxc52h`bpCKZx< zy@4|N$IujbxkgolxA4Gwd_3q|vxpbS`-*ZhiS&k2S_}8gD`s+DLvulMMt02TBkrz# zHM89#Teo;L)KvGd=`tuTSA)vCV|qqf3qw+r0Oqex&ZyNusm0TMhP{dc764@zRT|vz znV_5YJb!h5?e)7c3_847o+p0Yv-}tk?0$q@{Jk!vmE1V*s%81sl$wjJT-s}-!q8J8 z$CCNO@kk7xhG_}odnB!4z028GTx4|}5dsiBqEAkKCEqbRLG%!gr&9flgltfak|dqO zMcg&c0#c2~y1&l@yPq_ZIgv6hKN zi-MuCV+P{Y606&VR14g8Z)t_=xZzl|5zZJ4w79)v>9b6c*F)jJKhmE zCP5@5IH2O;rf_R(D|~%jI($sn@f*v<@?memee;lfmXCp~Py4?pPk)xyhWh@r816p4 zo+uEo4CDo+NuLS#xpIM^ilTyzDV2GF$-jYS1@agWs0>I2<~+qT@w9iHu6`bEBZ^kd zh%v4Gx00+)k6_F0SOD0_EOvo!sfu+81Oo6d@OU?{AQr^AZ@zGo`CLNnUIp7O{+>H_ z8NCUVj&;*Hs&aZ8YE1MPe0%$;sj0cNx>{gR{RvR(@O$4g4G$07+1X|K+q%2C5uk+y zs|=X!90y%FKr@BX9*h$19-TZ%F7&GMKQ{=PJ#9+_y2Y#6WY<*){wrL-ecKh%$;Otz z6vde><;K*duZ%+3=zUU)EufkM8^MU)sC z`%`+V+ty6$1}W0*?ZE+H?T~*RTc>4nAdgG`rJg+x|55oi#;<+pi6actRE)@G`%Y=W z%E6-lEifUyeunS+_l7yC3%mg(s+;@Fg!*On1H->dqV6J%Gf+_#kl0J zG6z3g@_dwfJRWbcrJRXD`Eey-A~c$IIPcCS@%sh)%V=iA?^H9w>}yd( zb&MU^lsj3Swh$ep39NHdrdemn*g+fD)wCLLDb^(9aTln@!qpQ-J+E#4?C&m!wzz|KavT`~N&2^MOe+L( z71k0;Dv(3|Zm)|)y-u&Bsw&i}9KTTK!zss`14TDCCCBqMLd#(UXf(8YkJm@`w|A(U zzr7e}=%0W71e8)t&cSO+CA;VP3DAj&eVhILoTRb|amlW_j#+e(1bbystUBL%Zyr=c zqZzOms7jd#SY2!k!Fd?|y$Yn1*TIxzR3mgZh|Y|E+Hy5x%Oa835Eyd;Ill6@Fy+A8 z#(WztbP=6LPVh-@`}8GcyuJHZDT|dHu;JszeFdsBWEctInqs#xed{cx*sbg4=Qmz>Gl|~KSy~SB0lsu+qZ0~=@JKKg;0AM11d6_dlR!* z)947GkG(Eos8i;sXrS~cp2#YPv&`uD*kTubjGMCr&yk_gHCX&K&FJ%rMh}brV(O%? zx)M2ptkQ?N1GN1aJJCGTIMZTfis?0Q$vaZ%F6pX_RQt?8mR#8!*;C;s+-5l2TBJPi zW+MBr6IFSuwvOk0&aXT6)ts5;FpZ=)pu?1lpFp2y%m?!oWgp>N`S_Y6ALy*MPF$>x4EmP%vZvGv&oL(D~W%w)bfogLFIG3?I8 zvZ~n+*x8+8z$i{-eMOh)`l$Y(X>Ugd%4zbnLxtG$E3)@z)_Cn~?{j|Ni*K7-r%#9B z&>>-i#WV*0R3ak-16zpa;v#q9AD;g0f&mOEY(`3@jO1UdL?sIx>rfOQ=;>u*MGaLQ z>4b+$@<_1}*tyZn-K(!?=p+NX?VE4^LwVo6NCPnwAj$pN)mf-yHr=9Lmg+b2zlk5L zGM2wvVOw0?Yk7dM6=09(LzkJ0)KN_+A&n{R?I0)^B*501$iPiou*y978GvM>f?K|QQ??WNpu}tY~BNkK0HKHw2 znWgsrm?kgC?ImTNMphHUpK*h6^6H)Hefz?%=iBBx-f9V$zhu@!N7Bi7M>-n#1wIUY%S6YlEsKY(y&_HHcpmFHFNpNCfh+c;$55SgJxq?`GZ}f52!EN0LP92x1%!Bw>`xAS4xZj5&VK^n?uPY2@&rRD=4#SBGGH zuf17XTnD`a^&v?xuDRHp?VsqCtvmLBSXHcPBxvd*7ljI36BX*DyqrUl3C`joNo2Ak zNf`BT$*EP2hwHtq_KE9TXb6r%UEoYV)qNP1()X&mS=-qL=&Yj0G0G6*qB*LJ6ouH( zzdLyC^Bq0@tUFb~jrn zO~$K!e@@FO!04u9%LSxEN4ffUp^TMx_vNc8A>@@ImEEoVPxyxUmka`(UlS|5pV9f`+W$$Rs&|f)*7QWsDcalD23L(!Risk zI!a3i+kvWe@YCfORhOG}#-ZDS_IK&WBFT|R5e=&oo4QH{`e>0S%sM6|rUXMf0U3Jw zIu!Fx>?zTG!a%+~E6@P&M4j5Htbu|fK3RKpQJ0IAGwjyN0%bBy^b{W{N$z-NrSSIo z+czsiCm$D)$?6;~)0`gzEO`NWmf4v9Ws6EQNx%Lh z1rU;r4Smr`h5}$NP-|_qrIssgl#Hqjp9+p(*g*BIQ&{dL^VVt(jh@- zqca9S*RI#)8#Wxo{&C;^hV90Z*{=$eq`oQ?V}ZI`1@+NaDt$F_I$5~ELuXM00T5CS z1bQ5ps??a=1M--*EqmeCsri>??amrt>c*+0YVfk&Y*lHe0*3t~k~|>}wp5y_;Fh6WRSnnq4=iKF2?UShJHM+<7<}xn z(aQYJuHN2W%yrG^Duy3=Z^0RhLJ~`agDw-h>(YMiY$p@n!7Ma&bp#bxg@cAYNX*GzUn%dPQ%=4Sj_Dk4X{daM8onn)4gJNQ z&k)GghX6mOu9{#*ukzJ|?^I2LX7(mc2@qQ`qoJYkb$BK1zDIi|INq-ZVu*8USK2PRX5a{WmbxHotL^@kV&U| zJcLtZt70n{{`z+1wIRyriG`WC*w9Xs)!V8#K|PAIJIc}-RfS&v6(ZueloM~*F5iw_ zU*8xqmFssI*D3u%Le1ZGvCG^3yJ?;!azvRt+SbD_prJ;l`>?r=pbMd@abfvme&^l0 zN-5>aMJhSvG*f7N9nj|L>(eSa1t-O66ehx`5!F%C{#Zb?VOLo<$BTe1V*3>oA}2p< z#ifK)=Y_+H=On6a|EFr6Z3(;0n9_MnC*T6{c)`i%1dUht)&GsSnN7BDV^{oIy?|5R zdcA)W2Wpkltn>P)T%ee#cEx`N!8R^Rd5MN@r`dH%;wB+&JpXGmem>VadDIxl1;jhs;gixX^idcBTZ#&$_WBZlN8dWkO zfyNnn8sMm!ma;1zpfnh>o!?mT>~C20oSR8)dzR*g#$-U4O8ec|q2`ph&8o)1ze_KJ zB^Zv-XrkgQHyj}76Z0!p60!~Elf?L?&i5|8sS`seO?}X zFA(`#9R`&F{}B4ezwSU6iOyy6YOdB9h;IGEBm1Q8DRiW{=vTZ{(VTYo^E&SfmN55o z%qe++3g#aQa4v|5U&+qkOO-w?+r&*Cs;|&9Bcq1=rel<+L8*f_X42GM>`3;jU~Nt(7qNt)LdTH&eO4{a+TFMz*#0SBnTY&ETU9LS>)1c5`kRo=JJffh{EBJ zJl2A#Y`<9A5G)Z?jj0iV#Kps;A}YC`w3Sr4L>WEw3`>yWcPJAoG^r#~LY#<#BAdWT zszir(F97zCG2HPK3gP)h+M?H!?ZulMwSo0YS>%J&)cwfmNa9rEH&R$Wf=3u)YirA; z%e>Pfm0p7E5kTd}2;TC3&o5JB;h~JexOYarFyrVam|X0BcNKbn1jKN=JA+ZcdV9&9 zjzV!Cxm)D-Dq-mn10gUz%h%ZK5^6c@ESotQ@n>LAx4n8%_Y!+i&q(7DS*}6#>5Fb6 zf%IY%f{$KdnD*<9*%lPE< zt54PO{#3_{G2`^~)Zt`-d56yexD^<_9c!(%I0o@)RplZzIl25E z`nh^BRdw91OQrt^z>L8u57x5HzFydR2QSRVa2gs3#m;a+rcF&v09eOht)He*SvV<{ z9*ia=8BY-$v}>jVpyhWiFCAvWt(2>WY2kB~pY^(Y(&{bUJubJPbds;;t9_FIDn%BK zSVhHGVEl0fl1-onBq`5t!!W?WOr>Q0o9UmN>k_~F=8m_1_kUzD9u@7A7Vc5oR(*B= zRX;2aN<)J@h7t+JsWv47w(3tCFJ@e2gVzMd*}r4s&$w`FCl5y-w@4ShE{VdgV`wQX zLj6ZEuD3oCJnsDQiiXC8UnY}7f(1t3LA5T>s@~exwdMKcFvb|gYJ;w~=uzx3*50o`6a}z!9%$;wPG=@%iLXe?FkfjX6PdUM-8xV6qs6gaw$+|t( ziMU91FI$rA9D|!}NLJ6$7(S89YB%?D8+66j5Au?@au}NyTHDWgj%~HWa`~I9BYBGz zlN=|Bo6Vl9&4nxXT)^IZ@m0iF<{Ek$yRe>}F$)b|I!vbGDGbQH7Qy54%oh^^4T77GT`ag7=S8Mf_KWt(FY3w}$t(l9%2NfO(F z$N5K;T8Yw(4HsP!`mA{$bJB^bfNeHbB-AgRd@ht!njyQ)?V1(=BT`AG(f;EqIaypf=c;Ac64hh_bHC+p(M_k?mf|%@ z(Bov&)~J(Y8=Tg{YNG& zVad58m3Y^v_`mt95u1_s3m4$qO)>P17&QY16yoVsXwCK;1145nrjTQ-L5eDiMbX*? zo~5NF@<_@AGo`eW%Bm{z9KUQ`5-}A%8aw5ZjpLoL8AQ*^>=SS9uZ1jzU&T8rWT$AK5fO@R#eZ==kUbumL6)J{RU-&Of!6H=7(fKmhfx$= z<0(~m<>jiDv_IrFAFd#Ue__u`l_u5K{0_fvd~Ca!r3E!S^)=r6Z8j@eMg^8vDF|I3)fXnW205XSC zl!v=$EsY7GG0&c{T_jxVp0xiB91YzsFCBO5_D&Z@J(GM}@E4uqZ|>Cz(nM-dvsBkq zkXy{L{DzRo#Ly+-hi#(X9N}sZvz)HL>Zw@c=|WP86Kn{)7~p2yJNLaiCiT>aLnU?O z0b^mCA_)pWfpp#m-cx*f5Ew-uykv)bMwCC1<%;I{#m(PwrsA!jSi)9Q~Dk^ zLA$pNxl7W}1lzY*ipk98nRzhzz1h)}T#(K{{km^{=Y|F$^4&A`$fk zoyvg5bG-WH=;5#zg)i6%I$}DSbhud0P{3V?i}&o%i6tb?5bFxGF4748cu})l-S<+_ znEDaJ5%sEe*vCFZ&UF4JZTb^EV2~jOi8<_#X}oWKJbq#^=os-a0I~|w^~?Lc z=PVT`#HT{O63KYL{@X5$SO$QWnF+u0n6NttRU6;7?7|S#>+p!@Qq5~U0M(Nq%dL%)4ud1ew%Lw`#K_wY^;BG%L1Q!i{?ZS&}C`ag@E{d~bVk+vX zDq z(k@`N1M5D{X;A-FFGXjghD9Phw{YRS6}#*q%FCy}0|o16vsT=-3w5=v2S~R}MR?;c@ zqC2HO{fhlD_kM~w{34wx=>E%jIJlpdpk2#rvGF%i|Jq6k2z;`EiN z;G>5%{bCAjf(#iI=_`P_=Z+x20Q@kaQzgfV!=!$`=oaSfDHv#M-dH(BpDkQzdbupL zJ$B-S`~m%Y0Cu5^IS8{1QtrnXMD_W^mUsT6hSZzA1NT?yY+4_$eU3Y+5iLW%w9&`# zobDU!g{CHttHG4A#m|zuC$x!ScazMaZ%|3x1jcJ{Bwltop2-FkgEsadf-j4ypFcYu z_S;UJx1tdH0X8TF4}WQ@Tk8sOAURKj;CMPUQ9Y_@W)C5z;+S(-#|%A17#z>q zk+bV~21+#3NDfoJsmCi?bUtsc-B-;F%LOf+h+G8=oKX^;)*TI|QzD&Yev#g~IC{AR zN{aFjm;mWc%=)@n^OsvZ{ptWiIGo}>AdjXN6$wB!PN>C4neMFZ>~o_F{Za!WN}t#R zoOFz(_DgejdIRc*m}MOT$S6UM`CBd_wT}s(eU~A+EG}U2{OqPL`?8TWpLLF;mE-fz@uY@suxTM(nKPh-QKw(d7@J}ta;4E7zpydwS5 zgd?i(gKN$QSg>I0qe3(3kTW@i)hJ`1g_XDcei_`Xj4e)s(nu$;tPW8fsQr{reG@2{ z2><%F**W>p{qYm{6-Mf#Ot#x2x7AZ2uO4_ZpPu*La4tn)_4mJtLuZTnG%7Q2NpKYp zaA4CRVdR+rU`9^ZU0n4fqjbFJLqyn!UlobGzn-5(iAco{mw=X|S%zi8^-7fHx#*_t5zmVzuk31lJdGa7ET9Q0} zE->1Wdr4B{WrG`USin$$&F#E}`v|*KF0o4yJfJ3|$xMl4kuD+|t)-eq66JkxNUtzV z^Wpx1R1K1OJkMZtIC6=VfrBg)*dc2CQk_ifUsuIF6NVMTqAM|K;5WCnYF_Pl^hpVN z_wT(-m1+-JJd4L`WyA&zx(MXe&xlHrx*afuwUwvR&>t0iB09s%N>W6yITdm-K9lap zl>LF>8;oS@!5~7s`=5~cFO;9qhIvVSQF+R6%cvuqlV(iT4U2R!CVz7%-vqvQ54UnE zcHP@W8NOXk6Z$3J2yVWawrzgE8CQ#c%s>@g9fjjn{Rn$vqCpT-Zi(dINtR|HdVqzG2>(xg4ss4MklxB@?MS)MwjFp0) zhk_~(JAzqN=pFT!as7oPW6@sRRHR4-cNSRFxE0agfpkVfX*d1dFBD|JOm_4AzWHg& zy-U)2{j-Nu0cPST3wXi3Lyk`^#0&kTC^NMK^V6pOf!t*Zn;lJMqHHVxkx3$1(2Kn3NhL@{`~ zPkUzemv5JQ{v9MNIFj#0pPC@E`g3g5jd=PH9P`i`AqMq{!rnVjf2 z0cm_^b&Z*5l8L&yAKDjnE-+$kKmX!mQT#;=E@IOAdFmNu$5MqTmeYHM35>GoZ2p}5 zsM$Ed_|6;NPqeF&!xp{n;EjpBMW1uz5`75kF`I2R&H^PPuU!&E2uF}jXW|l%osZFH znr#6S6W+k}*kwXvV_Gx7y*NO28=DIG`K4b7mD<-}wk9yq6REf(GKu5#M^lRZDIcnv@-56f`{I$NywR!>fA+Sk2Sb69x%3KV8xa@AT(< zz^F_hd=j-r3fBCaA2;eC(b*`OTC8q7QNh|R^YxxRNzI3m{_(7n%c zL7rX{!f%(Xo*uhMhMsSVHW~OG;$WMykdQ^4ZPcWuToTdtK1vn;;<`YQudNnhGKD_S9?VFS6IREfsD`?vWT;Q| z-LJ#|8Gz{HIAha<=6Adn+%$TGt?QKCeX19(BPKbgeEJ?t)qgY;rPN>OQ+4PRM;jPq zcjHoWItQkGpGc=O{eIm~S+jKCuzb81Y_c^*CV8Mz$b+V#NMd@I%ea-ctx@|vUJ2i# zy0bI21`df0+h$YiBpx$Sbdr-jM-zop_7NSoc3&{tWM;~u`c-6J%gJxWis2tp(a=h( zL50n4OpL3R5rQX`Jhl^|YQYUGbrJ|TQ>ZIe&6kkDXCalz-sE8RM^&RL3!$9r%k7`Q zisD79^Bc<`UkFDLDbdE`ik8U0>to5q^=XIUPiAQGidegS&-me2B&*?Am(6H$in1v`KnTrw~ z!VCxucHu&U5gF7}ZG!NhA00)eu5XYR;dA8_`7=1PX`_)8In!p>*Qk%V5c>p%9@0wa zC9`*A0SP!zk${9L6`g&bHeP@zX8pXmxp@>H3$Vrp6#hUwsP5-8&J7pEN~BfOx5~=O zn)>>F!0}>GUEkO^*dK-tpuZGKltx*Ku>FBcI3UOcZ)E{?k&erqBFQ(LudP!{topnA zE3f=)^J>3-?LWUY2s+ctx%4aq<~w}FDZ#n}=l9t7MprY5b`B96{)|}!J^)q6_qKqn zmUmR?-A{#C%>NU4@(+xGe63wN@VKRpfL4L_LCAHH!RDxQ*T@_9kLU>ZlXSH&^xKX; zAo6nV5k_%$XJ^Ol1NA1#Y59Y>V7g!QuA?e$BmX=`hBRYccw8p|zj6USaZ4C2MfmGr zp&SJ@3>}1fPclFOt6VlG7RW^wfbEsDk-poDcml+1fqs#Mx!b6_cZtC z;CgTBw^-6kBR~yCPF;_85?0y*r>T5EBo|btw9$#6?BGC40~R}t`F-hw9-yrdl8w_P zslt|~;Nfz{qCw)^&@Sy{8{4swUpsG_O$};s!#?50Orv^IR2=e}?5`Mxn9DLpBYqF( z5E4UH_}z=7Zl=;iInL41qKGk6`MuJ}E}({{(W_^YxOv(8^}k*C%te}IBMHrak{eqL zK!sSxVU?FUfqfi9lud>O3&lA3B^wvi=9*GL_L1=3_%Z?bQ>bj_&fNg7io$j9#sW`~ zEWvSfIbBPRQmbFfFi18$5{X9SiBw9$O!C|WeNQa3Gu7yC5P_j5Ep`#pB;F)~v`P+9 z%e}`)uZMzPQ=hyg?~;{E89aNF%U^EOTSTAnhpfix2_|cuKQ;}e&BQJ?s36?@DnSuM z*Z_Q^3YdsqRz`IcV|`T%-0a2y)R4cSQu5mosUpD;=W!PfV=n$LqoL6+KfIW$n!_DE zt|y31m8cKFiP zpi%(je?=y?1#`}^H+b)%-S*N|*Vx%R5Prx7#Kfo`GMH=qA|nz0^E-Y#AEwAq0AsR? zi_5g8r+n9ze*2t|3xXBXBdWX@=CGhYl5vmYdEe7(kOU$QJ?< zkA`(j&u2*ScM1boStuRD9|>4X^~hkBfps~Ogv6uqk(Mn<->aVI(()P(M&^<14X%@B zt@Y$q_7@}9*P+HuPz&dnGE^VQl$^}tdAK65`zW(K0p^5(VITGA(&FM3Z}c;rAoaky zhwE^71dFMwx|Wt9d)oC0ZB@%*cQ^lUaz;EX1`J~A7;{BsXhmAHJ=?3VJCKFEWF|y~Sc}8sY(L4}`p1 z9G4wKMr(&JrfSqI(l}3&&g>pr(S<)FE6A1xH{ZD z1S_fuaH<8Vvg8B%*-U@LfsM8cJXZ>o*IUAqpb?eO{QY_G8rB_+btm5b{;=wK)dS`E z`RfCS^=1IO7bNhn10-2$G=Un+yMLcY7XLv&thYE8&QaGHW@#;5qAo=Zmj$!3vtP%7 zhQ#^$^hZ}YXn_rV!ZDK;!CRT^NZ~j%*32VH<0S7`8YV+d1BKh8q26Q_-+REXwX~aR zGiGZMaG{w+uvjgMTp~4ye>i@;zuMs-wKRknh-_G6M~kM(d(|hievEBwe9hZt(pp_j zSo|*Z{)0OMq{jc8usy?si<_4IZ^eGec4oXh`0MN=rmW~+uCv$g4x)b{3+V1S$s|!C zzE3X#fou~J*q_iMSR@s7NmA69ugcEM-7}*oRMFFam5rq`6P`v%kuX9FvA8|bbgti-)v#hlmKV9pAR#) z5%(7?^Op2DvX^9&z`#PBsOMZU0BqR;?3+)DZvy>==;>|7mT|D+_^|rwe{vHrrohYJ z$7w2YHFKH^yw$DD2A>2liJ{&#qC?l`4)o( zfCXBDq`Pm^|4k^i;5g?LD@kojB9`Y4A5!fbMt&QUq!kp%2FoXmo!Bxn;l#nO^=92k znbT3#q;H(8iYqeoGyy!dkj z@*LaNDv$==1@5t49WE#E_8q>MOAqCf)Zekp;<_jbs(B<`Q)>{H@*Kb4~oM|{u z8LYXVki)~I^Od2hRU9d5spWLgCw{s`lb2q%2z;GvfSfoM*vRPYCU69{75%{_M-U~J zsO6&Zaj%N%&dZW}I)*}5yCk@}{ud!_%H96ZOEHyhqi{Mn-|A;Y5M!KzyU5@W_7?$I zp!ZP8R}zzYL9OCYDB+Y9nU&v5*sL3G5Kbo&3nJZoUf*Xy zF{?&~CJ8|kjZv%_C5Wao_Zw4U$t-brj{ih&JByCmy@C2GeG^fDJtC|?3hA3dBuK)+ zo!2*U-Jh|f`BDAw!>jFUahrTotAf`h*K2vlL)*rq+n=d?DL2MteGey*4TP4DEdq90 zMp41YJPV5u#*pD5>edCfv#ocs52~13?f6dbs+s>qb+~Vn0i_WQQqDK9klV#e< zk>S|{dFj^mkeLUaj|-lx+K00;?LQCFbXA$;b|?`L`!hlf_RuiK3P_^Jg2l+S=Dqsw zF%(xzQ&^v^(G{hF*`5fgxF@YU{BKvUZv($RJoujXaEw!trDeO;4ch-276>#MK(h|w zfQG2osdARimDnD1srO`vPtx-gA^m%j_2V`4(+;BV!aQFkWZgY4ct(PMR1UkA8PPrPhfYbDcUZsKov+P(E4a$k1`yGz{Mp+kssN_f6xMtJJF^xE=R6f{r-v2u1X zqdz`7r1%+c^Vn!hkp_=zsA^d>2;A&AZEjG0KHGknF{d{NOg2Ln20nn;%F1)}9GB3J zb=k1_Gv<1R4^vLZq;iuygTU_af_u(fj7fH773b>aZ zzF{6L`BH>R!#ejb)&yPU97^&QPA85GKbgNsTE!2T2G7Ywi@ILs$=czhU_emOUm?V+ zZRptL>W1E#=5MoJDDF>VdBiN?Z&*~<^3EwfN48vHp{S@UKG+P>mrz|YJN~9olPL}d zrl4hXF1(#!!HkBK+$)a*VebQD7}iR1EHdFXOdF7R^&(>dT-(U{!SBx;NT47g9?(O8kvx6XE}f{o>{&=vCh_ zmV&9P$C`;0Of1)J$82I_@B6BStF5jJ;N71mX1QKE2sD!18ib6OS2y(;d5tQ&x=&7M zSldGw;ek%7)Qfq&0}4GlD41RIaZ|n^&?Ue>tG3PnV$iiA# ziSVVU%1ct@Xq*5m&@Gjwr@QO$VBash9mzf4H$m5bb0l!zyENlg=vY)966xFVr((x7AaM@=MvUsM^$+Y={d|#qdy`F zA#i>T?4Pc#>y2q?;W{u%8;5o$p@@2^m+h8f4!&?%UIU2Pl>B-4A_=sXGKh#=YpdkP zjV+HCLr#6k?HoVLmI~{ZgS!QZfKb-X{IQCkfC6@Kh4jOtBk)0hgS&m(qvRi4466Eb z&X(DF!wodrfzxj6A-VH8m)5z<(CP8Jvu+MnvWm!_T76&*suA4-%(e1=F6MvM-Uz`m4bqQV4^ZSO)Xb&AAIp zi_Esa1u6GIGpRf;i?r496`apFg`~KfsAjX4j_pz$)fmW92eP3rF4T!FUf)d+_BvGl zdIcK5`+YI)I&pGooDXwc`ND7uGIpZzkT$rJ(t>E@K=uU~-;?Ev0AAe`!KmcUO2$yt zA=&52Q`d-5?*w7T#GnUZo%gNM%?Q>C?68%bX=$^(knUgg{4RcD0eo0k!x2m2^N6m; zKJhT|^sL%b&TeY|`9EPNZuA>*N8uil3QtfnXbsEjTn4U()}1#e(r?#8+^kSdM@oebI}|%Hr`7^Q3O#K4_T>nEMc{4{nU&9 zYe;2oDJ)^HyqvvrRLM{bz7Uf@8a%OO0@5&%*bbxUg|)C;uCfm-$!vW#Ic{Z?V<(k( zx{qNSs;7w~3EnZdKh>B?QZw(AscbNS!1{cDY;n3K0RphPRUABLlKYQ_hv2_nX3>HF zB^6_nwNAzeQ^ZTaa0X1doOmoLGRnaUk*n90k22ncEdSUZWh82=gK@g~XK7^-O*hw#~< zNH04nMKft*{84jOn8I2axJ?-}ZhL<& zp-k{(ev2r`(n4m423qJHEFa*`0&*AT@Oyf}+<9%Aw}9#%Ac4%=JYhOnCMWdT_P*_RjbKfe5qzTSHqtk5>JZ6~y5p|pT4Y6I;o zky^<6`F5MmIXc>=S5Mu_Z7@ahjo&%1Oq&^ ziUftF!2-#cCEmX>+vr4T6+snu2<_#pyo`G2@U=46d=aTY``Q#E!cFN#+UW){ORAf& zjPoBKO`p%++Y21JfD3eUZ!Pe)K6g=Oh5;9&I=GTegKdbpqNSGdusYKz6so{F-5HF4buk_Dk-F_X z5;e^mgK=$F&$}^1TH0P8&Op)c=s_sEj}>3hgjxu;w|d}Vdos^SJ;y|w=@W-cBZb6L zd<~BRjC=+*e{7~V4l|Y0#;`&!q38@BfiqR^c+%OtK{Gj&#OiUR4xw@ zL#iVnqMcL*CR9k@GT5G=hAbB;-WXx*0$EtuGSUSnU2ORae1b|SS{RjNjFf^3c4Kjk zKD-dA_Ft$rR8TMv-2=H==8u8dS!Vxt(j+wu(^9O>c4jA!^Mhxnc_N+mzP!y#!^nI( zn$l4eGA4VTLcww747rliRMn!sx1HRoa2jb{crM4_7>! z^XVDnP}K;rV0Ch6r-(W}=))tkkhrfJ=fP$1*D;qsh-GZ?9dTtv_HD|tA%-NoGy;*n z9?}wDqhPo;jtW}i%!#Q{k2!TqSrn-ec?8d6*KfTqfd|pihF9i!cFwDkudctqQMzA2 zjw4FmyxWPJylPbZ(Wh>_VHInCx>bNm@)*8=O}qUKEdb|M56&FOxN`CSGiAxLGi@K* zb^;GH;gm|byqmUfGe5(%%|k;ecOU=brtO-^`&-)7PVvQkDOAJjC|`gBfiZfCn$R)? z-@A(rKd*r-%HU>AL5)p{-GY+1#rvG&Y@=)9bbJjAw^$I?ImWMDQaAOd)-I`)2B!WdGLyH6Ce3;N7L>L5akBL0z4>gp@p>do2P!d;Kx2>KLaVNw zCa;hzf2#-Sv{t|1rUudOHEW4V`hMgk_wak%o5l0dbAa3ZT4j&2SAcwaRy zZhuBDXC`8NL=8fG`}#k@j%vS(R(}y4PvoftBzzU~X#k^qTge`WBn@=6)jtCkqe`o92f~@52dnTrkDSrNo^w=eD-E z_(FN5>Pn3)5jN@=8VGIYt9NTQ{OjWis{K7}^9o>!Tm$IO{8KRbuWp&U={a<;4~SxW z@o|0YqzOr!r{0Aq1Z?~H-z;kyGHNsitiIf=&?Qs4#YWTWk~ixAC3F-rJygafDd1OH z{pW7kejkOTkQ7oYbc{qv*4U^F62T(P!*E6t)T@^AQB;STXH!YiuTALYiet>hZ=jw_ znE5?!_UJP?OH!28GQL(4(084@db;`_iRJ8)&~AH&#i>pF?odr#lMi?jsq>>?0F3<` zuXH$V`VWt!ncoo!alp7ZnZ-XiSxl8FSQs?oHY5cf2egbngLkNStlbJcdcb}^K=`SFp zx;^LU675v?|KH3Z});Q*&+(-V*(;NrzH2#HaQPYc@;f!^Ge zRk(g+76G;-`{gDHM~B~kL^^78yKU3#@{*r4mYm?=KN+1JJ4q#CMu4J< zOT!lCOtF%QrKkybf#-Ic*mNqBJdEU~T_3cQ7OE(e8ku}S$hf?$514@2`8uX76co^~ z{kMJIx53M^G0B|D#n6%#9`N84XD5r4=jJH`2arLs$7qrWiZs1M;M9zTeuaJK7Eqd= zsuUicb)G#GSIhbNAOh$12Ja`TZ-dx3yyOWmnh*ASYi(@jUeLI-xAg-agw(f`mg(rU;Fw+LQ!1AOU=ix<;zu9=sN!%Zwt+X4;VE=9AmW z>|A-5Yesgt#tc11E7*So7#UrkT^~X z57&v1I)&2{hu%cYKb_{Kvc+=wD-opw!`p0F>vuu*ULt|Ch;lk41+WTG+HS%-;zf1G zkFAmhwvX^bhS$Q}JKS+2=Iiz*3Kfv(2@Zmc~%xlnNptap1*GOvo-{(9tp27p{=jFV2ewDUOuK@L*TYox3P- z>zSHDS<=Uk1Tez4*lmN^qc|K+;%BXuE5ICq+=^A@^ zWe|3~(>^RcLieGqYo@GZ#gX+G`E8rY)W$p^p>q+#3a7j0@4;J3rQj>bJ;W}=2rN*M z*O)P1ZVoJ<_hQE}_Hs*WEb>{2Q_JW)GdFCj!ahFfx?A<#LB$kaS)r*;wxk&BEW^6C zyCmFLO#^=>V6Y!d){ysYQvY2fh!s@VH#uVG-wJ$6d5!e-D^r3%PYYEWIe;t?0BpN= z=;q}+?zzb|t=-$r=1wysgQ3&)x%iE z5EVuQ^yr19lG4KT??xmMUWS?N>FAJySOKbgr6g!y=aCb>avstf#P-t!OGGvym4XUF zp3J<)Ga|coZvsVi-L^G8<}j0R?;BI79S2}m5d#msObUdFjvilu%TYbtg+_EcCnu34 zHFY9r{}ndbxr7BJS|T>V<%8{muT7V>OmYYf$aLQ`iJenN)n#<^60*uIVHzu`3k@x1 zh!tT=;5DT*?IqHwa)<3t&Y1aMM;MZ$fS0dqlF71!d!iiA_PmrxquQ3@fTw9_Wn6iA zWV2_dv~7Fj`kDdOUCJ+QiWuU`xQIbMwp+r_Iq%-NDc)~`weBbIf@mzM2Xu55dV$$I zT_UOpRI$K%*`{+UoS}2LK)Otu(+gu8Tq;OCO`$OGa07!a2d(^GYpv}Xx$Al0XUgjq zUxz>)BfmI39+a^!E65t$URTL7a`r1M5039a#078<`I# zgb~z0YwqR{HBUCpkPH6xd1GCv(>6F(<(b0K`JmG2bWf9^yTnmc=Q;S3Pj!b7u?D~} z+VdO=9YPEi?0vqE$pWG@oE3HZ<27^Lj~DaF@^MPWp=D@=Xv4}R7R641&c2A5c79}% zM^p4qJ6aO6BgFnA3EOtVY8$^ZUJ)0W097BUACVBw*laI}TP6z^jzd>@a#oh9xpU;k z360#obuHfixd1OOBizEvcBQASV&>v#lzS@)tu*ZjI?p*REDeZe%#f&LRN#tCa9I(# zdM@Qb&`0_I7jSxL#E zr1F7OBYofXKGOd({4O>l#zHnE<>4VRGSp3Ws@V}jq0_Y1=_DLrYHq;si=p-E&^l+?)CtB`u9<%A0V#T`Oq7=g}N8|<-3x87dx1q=b`< zS@;^v7{QEFNb&EuD>P8o5`bqhN;SVmjKts^ivJieG}wUwRLA%2PP&mGrCAb6dI#gxBv!* zmv4*Ba2p~A?wMjF8>C@+)7|J7OSnR`fKbfngm^S9o`3q7hiJ#m0^myW#8M25Oi`QK zSvT7a)|q_3-q3XFx_J_;2-~;v$H3)nKWA8r?gRha-}!`y-C4hBV~! zXBrP7)Kn%U;MC+DRAjVpGT(cCyA%q?s-Z8c_G4JVy7E28WULE+?{ex6JnR%H~G`!9|lZHwM+_AKisu{)Iuc!*gUJz2ec=Glgf4jgB$goQ*0aaFfr%tQdu* zErHWI+L^>gL-DM6ToT(b9?1Nf++QJ{-`(iF8 z!oEAJRMb2SX8Zmm%=dO=NP~;ic*uow!3fx&AGw$7^ipot5*co<&vB2)wzn6F`)`jJ zb0(F_=as2oO-m5w6NNQ>(ZDF-p{sh;m_=yMnLv%XbmwPhkD{^)_`hH6txuxh4#4w^3X3~mC*{7zlZ^8*!&zNi zU9G6_(iN@?ibm(BoSPuD{p0-yYo0FUEk-D%gnAfSP#pMvg zw(IeG$}K1$_ip@(wW^pFD^fA69ViG6LGcDL0ZIOj^>088_)GGyhJ%J zuzQv2J-Ulv^Yh%rqYy+t2Atrg-rnBMGzr?k-<%)(qT*!^;(uj{_xi>7b)A1f5$k{l7%}8MQbayK&E5_#LBf%Z; zg-#K<1WDRf40fM-!Qq$;wKbiS$G3+oo15Z|s4s$9k~*_Y_%hoer2(p40~NSUEx(^p zxRr+mVoT6pa(eKsnO>goZ8~3ZLF|vzaEt|pV?cWdwX{9A3Wdbf{4lB0q2ABOj8gDP%VQZm)!;1ST{gASJep*a!JLUL&sX2;Um0{@YoY`U{peHTTMs}J| z%v*>v@9Fwh4P%L;pcyQILXy+tGis6VFkcz)kMcwknKiUx!ZHB^$2mzJCAF`)Ob3;n z#2&@s{CqeR#N;f8MSU<;$r#3*^zYWm#!owx(Yo2`o;4S>+O2-QBNy0#~I1y2q%H_*V1^Qg$zEb#HzA zt=%^_%oTy;kk1L4SO(;tA%EG%rzr6v*^x#aEUdBP)koV-t=^vS#a>^lo%>7W&&YJl zD4lZI-x+%(d&p>)vtHyQGbLAW3H8FkQu^tNK{oTg4s-kD@durblT_#}H1ju#jS;`gr!dN+Kp~QF+7N0GHZ;`c%ataQsji{m)50 zs5B)PSMg>@dE3YyO?e??D(UrQt-w18i11$wX3!3yaM`M`TCWpY30&u#x#iO7h9>;{ zgOJd~K;Bz+wEbbi-4GfVG$L8@E~#RkWNfw8F{Ec2Jy-OzuC?`KMVBgUR*y^qooPZ^ z_xC>f=s!kVmdQ-5dzr>EHC~p=@5YaVNZ=FgWn6+iot!~L$#Ryi`@K2MATAq(Q{0FXG*I+;xV|U2*J?7mj`kURL z-TUrOPHt`kSMTl}PatdKnWCSG1PN&lZqN90J4(P=-Vx?6H?F69O!c zk_h6}nXKh?%vRxP*LlALPv$|<zXRT=f%I3>O6e1Lrbil2d^-Q~--&PNU)4*X~% zpBUA0VP4xR@1WdpZ^SPtjCF$tK)-`%3WcHv&a(e1gRi_!Ybw$ zi$O~NPf~NR%z3Pknxf!N>0TJddGEmM&*A=9`^y@2 ztGiSRq5^kNv$U)X3U`==MB9RB5I%cjqt{6@lGEWKmh9kN9C!iA!^N6l5VB;OaH48C zedbQK#P8>EJt~ z*V9OsFk`NjkSdVt)i}NGS;cb>W*w(uOG22T72JDWKQ2GN=@`BBGnjmfUhEaCY35?(jx zX^h~Oib54?1^XKtyx%vg+*Ctsle)Dg4-XVOgXg9~N+OtX2u_l_Zv6lv3dz-oJFr(` zp~XM{U|z)e^BnHl>~hXs)qcb5eFe3-Q}Fkf5lTRWSm$wSzjZIsgOu|zVu+Vl=KDL0 zMn>O^aAz(1e#@pt4!Ugd8XC(5G95$h)egDbD#5$Qw|`A8R2v%ucve>!Eo56aDPSP+Q+P%33vY zlg=3S<~Rv^Ql4Gxp!`K@HE6&@kTX|a;Q;;k?yIKwmQa3(JhPtWK{Ac$AM;Fo3tr}- z#pID>2j>0)(pKkC2eyVpaM?a4D@Jbp`Bbh_Aq4Xz;s%mxzPH-6`kKQ0V&-fyDO*$y z*w3?)w<{qUS?f0eIV@ic&>9-4KvOI9%s190+siAxcb|$1QeC%wY3+8WAhOwc=Mge# zQ_t$sQcrPr`f1-*6;x4aWa+>Q@%-x12K7{iFP3Xu4SNR%kq_l2uFnF={j$l1 zrOCF+vrEBpH&9{~6IMcMv5*3B@YR9JgOq~?Gre>=5;XR#wexguEIRgX58o<{@%nnquVija^a){>N-j-Ucsy>N6xZV5Ul3be99c%8V^ zIWXHmN=D#jWZxf}O$SHwP19M@YLS(W#^M}b2EE{?)Z#`fwN9uqWC^$+oKF0zAz?(^sAlcIl8RWU3b-+bnYR`sVsxmnn{Mb zua6Hd&2@D>f+>a#Vq-DQ*vv-8AL_zN2MxBp(8)Mc4g4j%?z05eNC_?h@?R^%B!+U- z8b^9p=?hH%x^h>f!~=DIu3||4qJg$|970lM=8Wbmk5vW@Z6@yJ&ONv<8xnUXB2WGPj!QXW^<}R- z2bJo?z)v1FuU(0VR*_p@fGq=s3}zN4z_FOZes$3}Zy0sCm!yFNIJt)hR9(|Wg;K@T z6JI#&!HW}aY|r67KC4s>sQqdgEqQaxO}stIgRxMye_Tg=?@CPVlfUU1gmf)p)5n@U zr`L-V4e$$fQKywGx7~TpEaCyNxzUM8Ls0s~W>udP)E%g7Wu)oV6y99c(9CG+Uw@y7 zf6z6AKTtPc2KTYpPUT)ADQF4=Sk?FQpPnP*qBH>lsj#LF2RfoHZo@Y2SyspJ(wN^3 zcSN0BL#2YrcyP=4+eZfde-?|U^~V~zIj0b5@7i(io4HDn{R?R9MdQ+Z(#MNEIR2Zp zZKiy6wf&WF4SjhF*54ucq13?3HLb2FvnL2**Io{dyjhVnokBiUpIZPTHQXkeWu5)e z8rKh0NZ>08WAvrepXq^R!h{gk9Z#lAZVQ}#mJ8fu5e-gdFC}VmNgU|;qR0en?fU=t z81nus0_3uK>4vVZ(Yf{YDk2$b0s8Qbg%+tH1Pl^={%m~Xt-k|)yRlNaVMb07@+)r}RdNrrRSUS-W z#m@g@u0*Jb3t<1Eqz@Nbj?2Rf>iMD^(sL`>_Qg$7v#<#X#6_fG_=fkB4VLz1_! zX4B?U)I#*dW6)ZH*?6F68PE4IwI}hFAwkp!jvXU!iD%eC4zR-Ai z+FYNKW3Ya0iE4zNhJu0u7O})gc%UeC9>;%}cD@G(=UUp$Z>();TH}u|K>ZrnK`Efk zoZcrFQpYOb;a$vFG$DhMFfdmyVpchnAlkeleonKhwL=O1oewor;Gss;$xFEwuA6NVQW$e|hvx zfJzi*g1MJ$){7G8vKi zqn)oom(&QMjE05=@$6UMFpczIM7;ZR2SItlS=m}D^R-v;kp@DvQR>M*-&h|Q_Xl5w z@;NS9o}MUr)lq1VU3i=vv#@@~$Y)n`GLw;NDIGv0s`9Os&Itv;%r1zWW0WrVwF-&( zB4RST6t*i#5&M0a5op;zyi$o;O0vkmiLPV|L0#mbCU0_eZN9brAng3CBfLGg_42Rk zy2j~HO`ClZPIHR7HWMhC%T2sPY7|(BbD=7U%qu__wW%?NXb`l3O4PHxjPb}LHrT58 z(8odn?@YcjzljuDU71SBM#w|nx#^WK<}iC>S!v3ETVy#-5QU*wZ!YHHkn>g5-JKp|8NIcRl`8C36;$^34w9lZay>xoSfy#3?l)bmu!)Fkx8 zzsKkH053x~dh_k&^64sXGrJ8lB}oak=(9x<0i2yoYZxbB<2a2nI7j^&x+wGajSN5L56gx3rxoqmwKfm`&f&^Y%gV%U_@n zQq&m9Pp(Y_g$C&B!8s6DW7RVu{FE@Tx^D^Yh@XC(!f=X~$GY@%=ze(!fI@V6dZEQ^ zscwy^V3y${i;%KdAw6*!31FEFX~=x;#WFx-ug zE`|zrLT+whe^v-;jJ6tNjo?nmM;AYu)?z=UKq8F+t1xzyUy?XYyg|9fKFva_-Ii{f z;@ve}YEsCYD?S1WwOt?gRc=>X1k%#dZ!`QasH$pep}8SI0;#mrz+OKExTn3u(+`v9 zIu~)cPaFfk2g?~Nwve8`aI|^m?U4JMIhU|>QR8*XK9H@KjgEWnljU{C7wk6LErd^w zby`eMWyv&4Y<#u+@nN)MrlA@#9sB_d*64%t=2Ay^w-un3neVgEy3KFo0Q>QBCQ5T& zLlo`x;8vA8KdWD)gI$iQ-j_(ZnWSJ1*WTl^$q4g%+_>{dguWS_)axr&_PQl$hSlsg zx%06Cs_3>`mG!zX1WX~ud?IOtFt;R>C2S#-#~lxoN{W&k#a`dneW!q8SQPqLU+$i1 z6c$JaowSsDbxTo&1c^LGIiiG2ua64VQzrCuq#^x4U5&jy214q?Ol``}u>Fh z7)_Xe=K)k<#rVnpNKSCb!Tg31ae%Az0jCf)>ba5R@G(d2&#fOe?XP@V9Jb8so5aXb z5)fz_LGv#xzC@Ip!Ju!O)wC8Cu4na3|MfB=#68Xk+~6E%e|2NOQZ*xeVwX-;PZJ=D z+o!{~>$$KCJym59T-aT0e+TF_{eW7!VkWGdmCcR4^|M3m&nwhSfR9jKnV!q>H)fwr zl&NRiQka_jm@^L|AaQ@=JPp`tcu%-~9(Y(?T-4ON1mzAh4k~K+Q+p+svc`b>kwO13 zk&&`!55qXG_U#MgqZ(mbL6q}Rf-I^q1>r_hGvh=!%`fUjc6mGX{cP|Z?c`mFQrZrc3qUpi+v^$dCOzD{ambEyD{tdGU9 zv^K83GE_wl?~ncMCVa6!{^5vn(?0b#e?9o+A4ND1$;)JPS_4<#8qOAKY*xQ~X zC-j}6{x8aXwFrnnKk(V3o*i&3r@OU&Yky_fr}nvUlfW_){hYu~vtOHRt= ze_Vh|2$9_IpS7TO<$#l^K*D$pYnPB~PB1$C!GXuxCYJr-T(I_^57>A~*;&|;IzV0> z6d^b~Z75k>ts-VkQ=c*$X0Rhdl$cZLC{NsK?!rx5oc`64uj!9>K2=hdq*d0ntPcQ) zPx^~l14a?g#2o`b`#a-eWD$?=xjo+}Z1pk#k@?2<~zY_jt zmC8(WS*AMNFSP7Cw{(T6uE%c>az>--he(_OY?%x;-9`|`nTjUQXB|)-;J#$^up#Yz zWpvWLR6c`=c^w&jQ0*x=#B0}k(cBgG%-zdzoUqVfQ%}~%A*$t^IG_$JrYXs}gpQ6M zKoGY5N*-W71MNijj*SRJcPlP_PR`_-ooL*QAvXj~%N@?b)pLiJJ9A)KRo8vkKJ@VL z0A^SBj?AAq3@oLkzxVD?Z~A}a5NN>-5lhv*9`@_f6@ab2dBx+-A5$b4%OxI`mw&&R z;PC#-{}Io>cWnB-x~U1cbdltHIU=>$Z1GKqD;QAW&LB`U%WQL+^aj}nI0gj8kcrj}r@m4zoc+K(6wti;&8%Mn zlXo;RrC`FPajp~}Zv&;JjCX#43PG$X7140_;x#xI+B6vLXoQ8-pUFQBg95qoRpSS- zVXr^oyU+dWDc(80;(ic~in6(Ardw!D41_g$b+G{kv^lo)7)-srvW72DECJQeAZH@N zI?42Q^D`JWkevI5lp)*iv%{A@Ds)yfl)w-X>JxmdG++j|rM7VGZxO z)*?_5VCJk2CJJ@6gwb9CGYY96hM6+=WFCO%kWkQoj|T_8al`i%{sxihuolP1@0e4W zhUaf?QQ8w5J$#}nvuVFb8-kiw3zwvei@5Gq>ywgT4%u@%!h?=L^f9x4f*|iOqL>UGHOKRkftz3fp4SV`yPX z+5|c$(uY}6ZR25W2xD1Fvu(iLTcJZx$*;$oDSz;FBsB7*xyH!>f%Emr{rAmR2bt~X z+#p+>v?*(=9~Q}~SEg=L$@a%J$Ii>o_rH?d5B+_#&?f@^lC8&M z3|;-lb440_Zeglzk@Bz=yn0mHlB}>Z`lw{^WeH+P)w5>$UJ{=V1P2Yjkg%m$A5?DC zZ|e0-IkU$d#oiH0bGs9x3ZqgGQxi%@vZ*8hRKIHeBvWs!q-Y5lbyROsa{X3);<5m; zWF%4pd7u&)?a5Wy^oT2)HRN?=u!{;!=X(X=&0N+;dYKx72Z70d95ZqhL9 zD{uvFdc2eOw$2Ki#vl_nVD*bUI{cGoWKY;agiNHzx%j!ylUGp#( zMT_GNo44nT_P4^5n7>B~(OHsT-LkCA-&zyeDNj=wLtR~6M{e7b`lnpE?05QE&&VcT z#wXaGyP;02$*|dCyLm3#WnC*L0v%0j7JDbG82+CHaJaZLAFVZV<=KBG{0t!UJY3cG zc;#-q1J{T1&*sP3jx;>_QJ`F0EQ-e#liQt&V)~<#wO=8k0^SDx$m4Q`M)1XNKBBn1 zFoBJwq!wgqL6O8T;k9&bw(II0&#OUuzoHCb+TzG)^h#OQ{xXTv^^zm)dFHRCaZ*n; z%hy7EML`}#20Xt5X}EXpKXMQ7JYK)e8Vvt?q3E~9_?bRvFJl9%x0s&j>hrgZv)J9xvEBKF07phQ#bp-Q(GW;dNG@k2K0xR zup(j<=dAj{6++NaFsVec?GgpiGgVmxx0~-rrNJ{Wqz|WNQh)UV@A4w7-IJJ9qQdng z)*Y+@bRmlb5KLYGYor7>yab&C$n z_1C)>9`V*uwK+!puvjXQwu!0wRqtt9Ib8sNVUeiQp|pGiv7e?yaXc}FP#A?k8w4nl z$t|3~7>-yE3VOr+MKlirvlf55V(1)g;Mg!YUBsy^mq;K}{koxPw2$Q5IrVvUC*9W!)kfNZ!|_GTw&|%HLCY(K9FCeGsYO!f#*_>A4oH zs{dF<9{#x_?R-B2!0Ihx`9cS6v{ts~+q*c~WiXh#-n`RFSM*Y}0gB+Q4>|0{f*16{ zO7b)+TG-90T!$Hg?*15+Vl;te8ae-zaDpr75b%i-EBlQ6zL=ir``qe$DcFVlXRJG~ zyTDy6IxDpka~27!+toN2$>0^L_UD0w@}IR$0z{L|25}SEs&28@k`9xO?KUT?>5jK< z(n1a!k4IOOw4nDicM4dB1>SJsw|2M~U3^VTRGF=-t*wpA%zw@iOV?+XsUQ@STa5N1 ze9`1l;))!s2&^dPGdq#XMfwY?3;6+_@doa6F1IN4p*xTR=s`SRLo#k$X>YYyU@j9; z14SoEE`!vfeuePC?R^kL=(*DoFoD0g=z2`|D2X#>Wm7(9NGSo6g8KZu~+J}Li zbH{2VI$d3_6~{u!Lq``tCV6g7<7K_CB1<;If;Flj|D^Mncs(=8F<+qP}nwr$&XGOz1|>4*2+x~w6jascfbf(D}_ayX0xj$|&12}R42o~fQaa7puDWz+Wd@qCe#m9=$U zZLL7|2`xQ6acPJh(3xy(Z5aNe%+CXu$185k&KlK1=0>m}Y13wJw?}S;aPY(BVuDkhkmjz=1W$PCH zObTMl$>5*ckoLHDiy=9?zy`Btw{u~F-q-jq?-&yjVmx5hf+XAL%Wc`F<}dJ_abF2U zt?=CrCVVXEexv_l&^Z+Dxz`6)bE_!iIgNVkI3yhnLGazaK)F7xnZ9l#W*1QYju#7= z4L%IQ3c;zc7uXq;Tb_aw8|F=IJsGN$%jOva%E>=~Y&wPX`Rp6Tt83<-`oS$NmtK$g zJ|w&#@Tk=Ca!fc#$Kwto;Oc#itD-_2r1yM{!B$Z!7EBts+G!s!wSi+q0!7|ygaHr- zgWmUTmJaPQk_Bh!5>UZ6pLFy;BNxpjkQyGjoINA=9$eX_WTY&cYN60US@?m~2iEm_ zkZ4g0f4ww@&rV1{;n0w!`*$~+aN(?oLWF)gGkecqSrJ0d zq0lo+mMT~oEBA`c!|_Cqk)=b*P^n}Szk#JK;_nnjO!zg|D?E%Ez~Y~T(e^vbmPx0M z#$WBTp{KNy1CChJ(@q7vxy+4$0?K{Uc@D}7=Kh1 zBgGC?41^WT+rs;mG0}9) z(-jvSAKxVc`z2)v(HC(+c^<#?yE5L`yKolv_-^*s5+?yjBQn7OktaDmemb@(GhbbD zcVlv2T=ppO$MISfHTT0CwzaxbVDTI_@`+?ZG}34CQxN;F38Z86P#qrs*xVCIL`ytC z6QV!>Ol#C59>-w4vujOE#!Znj?-cJRl_8UXeRhqh*$}#>Aph3HM4<&S7x8^jeJa96 zWP13GSjJDUtP_k`CpwqP15z}Bno%{F5iIDo>y=X{S|*QEc;Q+cixqs%zsrNWnMI{NG76-bWSI@{ByHB4~ z&Gs(IP0!?k8UwNzrT|hPCWT-!EiLQn4$Ue~Fecu9*I-yI zWvCqn1_o&qDPb3Pp&_ZNP&o~K*6BVIrhZ&AelR3}*fHx|#z{a!WfyMw5{b4u#F5d! z`xW$)dW2nw@2hPmPvU21!m4~6OGctEm13jf z!;BeLs(Ba?0H_)9MY=zvQ34818^QaMA%s@zc1|obKj;6?4cgkcxL< zjN=oIu1;wbv&>lKB8qzmDM^Vv-2ZevD!aQl@ix~p=7$KW&8^L%QRewQByxx>sgsA7S2w$!lDmrYeF#0C2P!(Q*W#<6c+whmv4MkEkSfUurVtW>v4e-? zIh?;nq>IvGYNTpiK=8agEvX55zTd|+`6eiA-eTPG;L zBYW7UqR@$MeZVl(7Lh=wpE_qOs_SfE-cM&)d*23dB_|3?0Wo2y0hVOtP$4w z$OAtogf50HUgPqvuK`v|H6L&g3jo2WN~)_o0|rQbxv0UN{|anx&nNiz0_1oHgb{mU zmOmu>1(XhhZGE0CJ)bvr4x4m4{acVm;GM-ep$Zafm-OvwgPwCm1TY~*?5}YCw57{* zqtNXp^-GHCB&RZqTMA-|1OoQUv36Hr6XRSfkg8QvIn{PW={(qnm%K+0O!K0D9^Dk~ zx*-Xy1F#d9_hVVH1OT8}yS|O}R-JdSOLj4Gp8E%#Hw6UyPqlJ4HZjif6$^n(zS*Gn zfF-9yfhE7c<69-ynVD$`ee3p34~IR=a_2>LjTz~TM=FebH5GTSq{F)01Lm8@(SGFxqL{uvK4-Jl?HM2e4v}%zwX^2)J39t0 z6(fI21PN*LXeIsQWe?LVLmaizg(B_fhg7kEEvdE&2XBg&Q3QyM(eC{Ca{C-yjn9!{ z19dZ{Af$O1k@Fykx^9vD9|Jol4?Uk)_4RrlrU9*Swe>tRK2H=rgSOuL37%(CK7DFA zpMt!BfANdR{Ge->SDMUJmO$nYAUnFn6Ph?xht{Ex6|VOPq^I$DBn0(oGE46Y)uA(g zrijQ)`7Vu~+r~lqpyu4JV_1 za;4?wc3Io%p16v_pDOG-f5iF2Lr31<23!28{sKk;ex5+#+VfntQ1qgLpTU*EbufT$mAck93mXUX`^L`h9+k9oB+_(p^&ImoRT;hG z@`vd5rNCLl#Y5Qn>1Qda-vT&#V-q>>h{Gj2JD3Eaa2A%-t1hLIfk22u#MWYH%gU5Q z1WRNQV1)qYp8#p}q`wT^SSqYQ&U=!$#`u*r0+zKu+ju896vEWBGCDZR7LBS|wcIFR z*~}ux_sa1-l=A_W?fIb~tzvio&@&X0YCaPyT}<8zY4bvmG_8MXe84d)0`X=y68 z!$VJ{E*Hw65N_arY`kcZd}=om(r_M1qucW5vdPwmZUXDAW4|rR`VXc0)^@ za3y#>BkiP9o#yXej9A0^5Ook6E#dZK0d}WU zzM7`zp8asG4TL5sslGHV-neq*dZJ2PT?sYDe0?(J8ImC`Tg~h?@>p$h7t@nU7F(4Q zQIXNqM;~5}&5O;7d$ak^0X^K8Tr*NUo9)hl@6Q^b!Q!#X)_$*_lU~~^J;GG(uLb8& zd1{+j2whS{U6jo&@$psuy9WTx_(2f?giF|mP?xHtsUPf zfZRMwSB%peq1dRs-r1n-6Qw*C$fjU@vvWvSm)CT5m6xfdoPuC>N#)j-AoPTI_M7}x zGO!#cjy75T&#YT)v3Y&byylJL?qR#*aao513%4s>mJ76bVoXq zcolAiF+#a92+}d!G~3&V4Y2EfHuoQv!rq@?4m@9{5c>j5>o+7>d;i9X!DZad$0;vo z363hQpMV{fF&P=$lz0UP&UlUS=+8o!CjRJsNvcfqHrL9Nww z%$ZJ8QmKW4MNiV*I&er)xo5dBn0$(x}Bs*uT)ij-Q+on6CMx}E*&7q$k= zD|W_`?~59Zinwqzok2)4yJY6sTN@LNLLnduGU@m=5CP>{-|HLW9+B*ea*=~*#@a5e zck;jd@NU+oxeJq@i*)d_450dWZFww*786#vLLO$#8e8oT$bq%xcMPs)MJX?fC456b z#3YQr?_TYoY4(qSwjhit>VfNOC1s2ovVq3^BAk}jJFOO1Q!jyRi})APylDAh!wUP` zpcM5RyKRHA^IKM1=(&(oc2vpv!&kX|at-4?q2!{~dIMv9kRmh}wq^;8<5p+Oq{0mo z+r^yXEHTXjY~+)yV#V4Vg#VZ>z(Zc9re=NyOISi+Eu*UixlSP%8ymapojCvg^0`bk zk7v?PL|*CDtO_sPi7-u~k~y5_u2{Pu&8_^k7_EV}WS|wHQMoJXJGH zf!roy=n+9zXU}eT82Y^{%NF&HroPvorfr_DM8J@lY)2yuCoY24=QPH;jzfUjE%m?8rXt=L8mh&d>C0^l=FstTMe7tudL1>A4dx3 zm^FR{sHB5OcCELv+Q_2- z$kk47$}w{e7henJnsuoy=ax1l_bVqR1=U&cA=$LkN7u`nhG8fCz5wF#e}dwPivTK6 zsCZ=6jg++-Rl0@1qoq=2a*Z=SyS&~ypjh=VgN;PPl@O}-2E%@{WJDMhnLOHzUoCZn z>LE~I8>Jl;scjz`5`2?N77Q#O<42hVBn>ISxpOz-gg3UxP^cHCL1Rbx4ylSzVCelG z?_(?9AWw`HK|TdHC96({0X*JoUwjYDl=alCD74cDH!h>C#d6Gj^xb^Zf8P>(0eL8% zX>)p`n}0I$Cr5;tC+rvx7srghHhjKHc%ELMUWQkChUC28K)12-TP4o{fi8_1bmKf- zH6dK?s`xE8GJ@Pih-;+oAW2Q9lp-Op+R?&E*MMY%)eNyM=QGlLQcJ`6??PtFKxdU{_;e>%Mf`2Yc&WIq!8h?Q;mebR+ zGUVn>>e^LT$xlyDt@pS8(aVy_6qf*{dbrUQhMZ)qGTC#Iz9-Q3Jgp`M|42cl9kRrmIo`hTE)D(7Pn(M9b>Zde5p)YgB9Q*MoR`mEg5K<06M+u z6#yimW~Z?o7cS;>PIbe%1+m0a96+FVKw*qxI1n2D1}4SV*k~*;Ah-`+f(?IcAc-sC zZ#^m%g9It!JD}wLa~d@itF1FtG8Z=>O`Pm;6tV&G?EtJ^){99w20#5k29q;Qf#wTLN`&fzRY1H_s<;FleEIB)bA#=~?p>|PzG>d*?{Aj082$6fWOf#02L=%PHv#%ze1!fr9oE!qwd|n|> z=&$eYV!CsrQe+Eo@ang5S_OvzD2!a{rd~cNRaYv3ey^{_!ET6-61ePVkL)nfcgtKK znu8s(yBCKqT#Yv4&__CVTp)un%mk(@19QFYYx@38U$G1_@U2@9+_Du`msuRUQS96M zPghQ|IecTlw*i1^I_ppV(m7C#4e*{u^tu22HTC`eYg1iY7=lUC6eN$Vx>Bq3l>>y# zGKO0TnL|`b;%OY^z(E>`s8Fa>b0%jaTp?S3IQV9Jp8zx4n#0S- z+?(s?cXJdqe=WS@6rb$%MHbV=Ir_E*`?T2ET07W#%R+0J)JiH~{8T}vmwwnx4Kx0> z8m!BaN7_lb^?=Tle|%SVXO2}iyOKz+wKqky3ROiA6rm&u1S`@zGP**?K8znC%=?Ef zY6gQE_5dLZLrkEE4MoWaYf7f5?kGEMmc)6E5>97&*fK`nY? z2Hp?vr-hW4p&6e(V6E5G3EwlPYz}Xb16kJ-cy!#_g6pbf9Gp> za7_l}3-|UM6)b(quuKZv8;~TsLeZ-l%f(gQ)vbga{71VS@K;xcSuO!(|ISfLYsoka zxCrDD%@Pf-6Kmj2Y*;f;5x0#tQmRztDa-D(bBxex`d~ zruk@k6uW_?GeT5%O(RSHXfb21O{SCU#H-4#aTX^LDy0-b@kpFxmXU-OPP0kbA$tB? z)wSvVeL94p&*l`Qu~1B+GD$=ZCW<00q{R!^vflQ5J?XqJxM^@W;0kkT49e%gjHkc| z>U9rccXFWh{}E773eeP)`TTd@ev6N@$_Z?kBPYN`IuEU<#X<<-d7Bh}y*%L?Xls!A znCSU44G%uV{_nZ*$1!TDWV%4ClW*>$#_sNprn?o zW8KgBJn@`a;9oQa1@=Ijlz6s;bVd0xSL{E2eJZFT$u zZy_Co>eS9^IJA7|hFb5wo8j z4+rT>0nPewMXu#yb8q^6u3NuB(^lu6LOP#l2;qnF=)2+mQ$@1br#IL}7R#oYx=cE# zH$RruZXTMlOB@23OEEC7a1A;PEX)~FOU2Nsuo9KCsUJs4>)v&SIbBCXVHjDl!hHs7 z1x0Z={uavb2r*uaKvUepiWLPCF2pO`N}wRG&Hap4uKSzm>x|%&o&wk_#|W`b!}q)< z_pnW)_VU30E!BP3WLwKy$qS#f7#KHQNda%sjX6Uo0j%`hC(_h#4Ym_8bZiy+F z40iqgtvfxB9F~m*&aw^9eeJMRL{nmayiakzPh-A8dLEzoL@To73x#jv`}6{zlL;5m z+@gOwF?ZZ01J5j|p1T1tcL6v2BPl)itlRDvc!{vHlD(8yD`2oD8hPHs1B-H1XZVd! zTqm{DO8{_Op+&w1W>^VF>86bw$Yys2lSRVa&H@yCWQZna>ks^}wU9q>mWhpV-tF382-xnpYj3BRig4Du5h_=p$xnqdb2SGv;K zDP6Ll&xmRF_2C8-P|qCCYsn2QB8J~Q>kV@?@HA1yB^8~fOcemT(nEw&bJ*2?_-1Uq z&sSbAP5CFrg;E&dBo~M{RH3Jp)a^pcgzSVmTf3YyI$Un%t(uXj51Z6>NF|AZ z<1#CR8wj?2zaAryw2mYSQzBP&>(TSR!Si~U0Gvi=?*FT4E=N&H@>Mp7Tv%ETW>xZ; z^u$x@b*cmt%4_X#4!PbJ;+<=Zp0iVztKX0T;0FDsrDvGiSl2hVk8|vanS$+fV9Aha zTo#dxj5bVo;#2^5}r-Z!#aWcH11`aCuZNqzm zP15i(AHVDu4{2Cow@xchF711KxrhFoL9_(wt&L>Mu&k1n~edeC! zjCTh2#fHcjE>|d4@oOD^v3M8p&J+~n&Gm!YlBN(W$e5hkdkI zizq(VhkU*36Pi>M8$C^EyS1z~C*oCLmX?bdt#jLYx3A9G{BKS-pV5y^P>PL*R)PJ$ z0cNiEUwrknoJ>8yy}^Jey9Cyf^B|`CL#=b^6YFye?6Ovm&s-jBAbV_7T9N^$_BV%K z+0rnlq(X5iN^N$14%0uB3)1?=(sFQWMWy_}L054a*>lN4#mS#?`Jfmb4<{rRn@AL$E2L1C2m%tCEUdHM*xYmiQ4x)( z@v|mnjp@W!DHEF5?g-PeGV$?5a34Wn2X6Toot{iV@pdeq&>AyfiFh+`v?^k=vTN`{gn=Ffvee zE~I{h(O|F)qm>1=QkATs0wnp+HE7#E$HxzXDtOVGO2NPYKev}@6(03!9qKXg(bNyS z#Hm9{un7d5+^@~l8?cixfMR{yG<$d5uo8i1AVu~Y=Fh3{jDij20@!)pTO#^$5UG@6 zQUwW34M=mrmW5*K8%Y@xV+N(ypZ9)#Rw3ASWxZR5p|agITQ&skHw~6&9C8~4mW<&R zISb|G2z8MZ{4{fB=)}gKzXSSWEmv%6d;Z5fpmBf?@8hfKX&Bz|JlgR50Df@bc!gpDV4>%XDJ{g@ux#3RLo zUkww3mGtjK4EzccRlsjRQd`QT9M<@n=|{(bj)8zBtr{MT-6NO>a_bY!!jDn*QeK!)$N9^+3B z+uJq%H}OpGdl)exMeuASxl`tGt&Pf_Cv0}_F9)%Vi$+74h6U0chB~2mM6tkSAeUeB zu&JI@8N7J=;X~aVSq!<)Dm1ntf=+46(4q`0xMufDFK*4j12lD-?WO@l6tLwHOzzRi zGFDYlzWvKWGnj0>}S(_OtWfJi|+r9N*MH4BsTsq+%$SseiG~m$A|Dai7)E z`SK>i7Lh8(BbP}DT)w?TGXs^O=ZS|R($9{9hTVdYAt{JrK?HN{k_|%)5@ysPTF0Z8 z;N`J}ZGHy7#-f_a*59pbb>3_ay}gb!baezU!1gne!@@@m(Fe@MHjbKuGu?fx{#xTI zuirmfVvTo>cpaj@3KA8;C5E7#nyO0`>3p5uD17I=-tHbsb2w?c&lXqzqiJBH8IQ$qqa#zbz>O@J<0?}M)s|E> z*=%hSt64et56wId1P`!~0UHM}FCUh#t(TjX6iL>et>IAA*0?})U=yJUE4$j^2_v~L zYZxAh$dfsU?fKmimRZO3pWLQa%dx8UOJg39}D@EGk83DIK2FNdj z!xm#EKE1i84KDJ3|K|0L4Fwj-g2ezY$|H{}I(uv1FDsXo-2;lH>a!?kx#e(z9YIZ; zc?h%h%}}+? znEvtnJ&<$H4Xk+h-uV7vc-fBe1{?*G`U$<%wUjtL`ij6rW?MWEaJW7rwz`B!P#M~O zml<`}Kg0i_xPJlCx7Z}8!t<#t9oZZ$`>`LZ%P*X@Z#ImX5MbcJ0u#+>Fpo$W(d~&P zK!GVrZmS(WJ-%~2>X^UL5)y$esnjHtba*GT_5tJ$7^ zRCn8)ZrweW4O4f0O6xEwrCTyJhOE7?5rX3bIsUPl&+`zN0*r!5ByePaM7aKN(ZjD7 z+pm8;`vnBv;olcCU;a&6P5t6j;z+^j1F5A4#lFjxJ0F+p9MNR%r=QYL;O?H^7d#1= zGDU{Ko{&7kq=NU7#4mYW9*^Xy@~>zmC|RNOELLb_|77S2Xh#XIb)%9NS(hW~{uBvw zXcEa1ZaEioEXPsGskP0qv7Zr(GRGKl^Ve{#UMC34#^Cy>C&D@&k966ur{WxSjf1zj zGf!LGJf6n*WKXZ7HGG2Uk9nJ5d9#{(T?QpCy>_vG4UEH7>t&D%&5#3ThFALbgG6Cp zs|%wFo_rJfmbzw}xkOHZi31s6s^^Pj`+b{6*?72gha?&_GnA>A6s}+M={gr^>^5sW zC4d{d=ldC9&G+rmGnGK__Cxo3*yZJ|VQ2SgSQ|SEviaW#3SF^jwBikR`Qhc><3VQ$ zql)#fV)Sgy`DnP<@+YvY(y%NCxC;N=g+WNCs}m>QzgEFa)s>-Lq&2kUHRninbaw}W zuDLAjWiavNNsgn0B4&OH@z?vX4=TOm`@TchJf?D4#mGaIwDk6W-HMX)v_{TQDc1NK zMwX;fur3MguK%TJrct3wJ^Tbtk#@jr6woN8uB&^p+2-)?-3z$+0x#fJS5_z^cZ)h@ z<<$S-{(-F)7Z(?_RkZOZZq_rX%N81bx#i>bl-iD`SUiAWKtnpnpCl{*H{aVFB5<7g z!oTs^X9D(^tl}&^R;I9MHNElR6pJVTL)l~u@IaSp(aMIgsc8t1A9hjG6YT)Jt@n(3 z`}|j)5hXS`^iyrv)L4hco_geuWpq9zrb)nhGflYL;W@PtepQe3&$g`j7e8~IXmWeJi?$O8I~i-Td; zNR(JF>wD?k0lha?PgF9KxsUj@`~328;}xAiA-C_`Qac^nxB;EQ*oZ(O9Pj*73oE#* zgXig%Y}?_e=g@G*Gt%c-&1b-+`x*7=={fC!Ucn^5kXM!*>YY~4eKVMl!aHPIuCHDU z#h~iw?eQW}U(%;yBiivQF3dRMFvjQSw-}3TeiLW2bHWsfwGU z1V$5nTBj`#|KDnTiw0j^f7?((Vt<|M9^AWe%;3-REHK$A2BIPpdmBHH=m4uhe~D9+ z1?vzN43cAR2ehNm@ubrq#}la*?E9Bz3zHMElZl~?BATm|Vwssarc~y?f3cpMEaN-{ zdj*CBP2+~Oh{(oih*RJxvQpENKBPK^s`#7Lg{dN6Wq~E0FU@A<0d6r`9P(B}#8W-Xe5mgAXQai5QnKi!^b-~V#DhkZT} zb@!IDc=t=A7D3!}_Uys+16k3HS%s*04as$tR2pJGY=_&AbR}6MCyuxj!wx3P_NA3@3ncZYd?QJ;6>u8?Ib}39F z+-Uf>5J?&a4L(TOPOV2}^Vj^Eg{~-WxGo<2rIWZ60BV78T#G%=p!DRGQ!X)UFM%S? zffE~51?g$r>+zSSY?jr-Jid^^Vy03aFb{Q!b2Gfo=Q%|I|0p6vU@(=cZ%GJ^r!sfq zvGY#e^{FkZFe-tb&KBOzXk^4 zAW0CUE+~9G_{L+b@5w!m3rBhAhm@e1WJEJNpVykyD?reII;D*z4e${ca<$pfIRT2F z^z=@x-WP1TpKpk+XHDFs4m6XjC#x4~ELwER>htojN4UlcwX;^U8XEeH*a{p2XG3HL zH*LRh>v9msBG9Z^Z=Nscda`Ov^Y?G_tj;%d-+b^)bYwkNdwHlx3BAv2A{oRXRj3EmX+$#hIdf)9GfM(nhh$WW znUm6$r#|A+)6@8w)2QO5qhzdvF9oDm?R$|Lz=iz6)wY|b{*cqzmHSTd znG7Is3*Xqj19!KM+B;@r@ctIR{5Ul&+z@^f734mXryfyN*+>58@iWxZzm&He`Ij~+ zqvpIb6<63v>Ks&#A8KBtsJWl&9j(g2*4|!>g*uRzN6bzUiqETyiy;!=pf)~>4XeLz zEn`NsOxc7(4+Z)5-Uflhy|Zsm@%rL3>* zcSmBjLMvXe>+=8jZ#*IoAZCWC)N-9BlY`GMD!&u-L}7FJkw_)R@oYdv81x%46Acv@GL5_@ zH+U`0yksoAlyG3GZ4p{{h4xh%oVO2h$3z;n1{yF;?^%T@T6ZEwa~6STIU~m8Q99^& zo}m;a{gcbyT{F!&3A(bpbV*J-#V-oQqM2c85kA6Q4phh0RG^XE<6(`iR_wFpcY6Lk z5-<9p=zMsYRgZBYY+!{CxMxMU!}giZ%DZ z_^;Ca{V?Ca7GAgll-mMxf6||>dlX&ZS8A+pm7L&P#NmNvO zB~OBQ*%gbUp{XIXZTTJNDz2!h?~v%SGPiyQKD2&oOS@X93!s4ZkISnvWc|?fCUsg} z=PZ-S$A>diOfE#rLAYv>q*LTIb@Zo*0_sHg2m$}d&RdO7jK_8RFFKx$fC|U?!1rtZ z3I5NL?^K|$=J4@F;FF$`-Q|yxE`fXLvdmrCpgcW~a^_Ulfx~2M8%UEuJkg1=ODYj^ z*UX6%q^wUnB+Zij)j(vAx;*yUlTEHr{GQx|VeW9gjxt20fRd@`2Y*9(j&d;|u)Inw zV%C6Bx0#0%E4Y&)?nmNx)b|TZl{ZUb$sFX@Ba)PfJ}YW*;I_i;8r*zr5J28?A81v@m)M!hbzXG}Q$oj|BSRDSu?6m42X>&Wp>wYFZ z-z|DG{6{X~juB&Il%5Kg!>LfUAKvM@F zAnS-p-=}9~Woc~U=`mvFI#FJB0ul8JiM8F`(@#%q85tQO3L>~8|6yxSvOS_J)M}7>!o1e`{r!C^O=Q8MiNoO-ZeTBVX-VZj1Hhj@My93=XdXDi*(ZZjzX>L# z|6(NM5Z@n1IKF?fy}I_!&x78$-EhD5)^x=jP^gYQ5IJ!YNof&rDkUXO)lx+(7NSLp zp~l7o|4%kk-LST20GN|*JGp+R3Wx11T)MXRyb>`?uY-eJId$1sY&u$Rn#kmIXckle zw>q+`4Y_gRbb8|$Sx#;{s1|?y&tbLF{nP|0gN4!!QdGn_e({O6|Q4z#Pt{B3T#-wb$k3Oo; zyaE}_Qt|=+=V{1gS8G(qBQ2mO7IeWt2bk#czfCSVSM!Z0X-HLYyy z&!96Cak3?Sr~K(VM2JHoMram9yA45Iw z2x>Z-C0Vp2_KD2`L-I>>?sd7E(1x{4VVs@o)qg^aBBnZ%Bh zre4vb@O2K3g@pv>swyJbRF3Jjm@XQpkDSe&lZq|E>{4gs$kpXQ?53E4Vlvr=2U&&| zH=2x;Hm;Mxvc8hAF>Ny(qjjDkEZN#Xh>W}{(6Q!jO%){COkAkYN@6fPmqQ1wX@g;y zSV~wrg^-&U6dNpMkvXIaVP76fns^jjihtKWLU5EN*PZr0vo+N(6ho7;^17Mh6*uGa z6>*uI-K--pky?khmqa)h-j1K=gu_5CQN=`VMadN|{Lxge{yjeXDV&07S+`6C;g_^p zn_tnHOL>mNTwWZKP|l<0v7};eCK1#^gr`S0toae=TKbGnJZc>(UtsXpa!x405d%r+ z_Of(;BIg#p>CgXr0X`9ivU3;sCyGN#F=z*o!x*UY>9<;skCTbBBhMO@kf@CJ;))3g zRB(NkG@`ZoqP0ykSLC&r(SgCu2#W#UEk0xKC_0UN?O<6_L+U~o9<>&;o9Hvmka`&V zY<wbMjSBHA8}YNV3>EkwkW zA3h>nV_PRSCtEk}47P3)T8zVYX)~U|GoHu4UC|*kHIj+Y7M;xESn9XlX9tTvJYRF6UEIo{a~9L!~fJ5B}H-WNLR;#13f_lfR|*H;i;$?R#D7{ zCy02i4Gc>>jF#?mAMx$D?OnV8(_?zB;io4llnIkZ#yaT`nk{j<@Fj3dGPBSyrK*z zc&m?Ce+7G-+7O&PQ&wcEF893$mM;>qnb1ye%qnK8>EUW}q3p%Z2gYOHFtLTYfg-sB zWU?Y!IOW2KrWL~_MUCm&cZ^LH?VgG^*1YWl3@M`PxHm1Qt^GyBH|;N~{B+szQN^+S zC{)u`K~;YeU&Xc;Z>emeRRQz(Qm#4m{AEar_V$K@NuRiQC8Xw)MjZL~;q9fbXAAs$ z`wcU8BXlL4&5aW2gOMR5i6NCe{ttW{v<1+3;*INLL@d(UDAOm zL71oi*kf*QUHwlz`nbON;CkNj;okuU3h(5;YQ94zP8g6)qb1OdjHkdw=dJZC!abP< zHG)v$G4$ow=TTpMRbl$8`#MZ8$Fyj15-O@%Z@{LZ{z0ygtn(vte; z10*Hqi(D>e#~09GKn|;9rot8FT7HYU}lW;rc;$b2wDR4^6w9PYysaidV!iv{E7LLdePE2%Xne+co*C zsS#0M8W$B&T~6HzXT7;Rd@7OGSW^0=abEIqEbbGr^JYnqw=q$w9ef+@TsR9)O%Z13 z{V+gqShv!hEcemlGoI4(4;>iURvaPfx5BOBASb8vUUb>uha_xN2-; z#@6fXTL;%tIh73=SCtNDYC?w-_}kT+}J+^ zO6cP?JVP~K>+ffdnt8D`^yWo$jyge3xgSxh?9;Eyn_ zq=5qA7Lxe%P!zoEW^?~pL(77ej^UraWxYsy`IY2xF2^JgAZdt6sNVH&)b%kva6O)t zeP47FqB(n*XYd|Ru!~Y6)k29U0uTxLSRjV|vWQ7~y|82Dt;~5!BErVd8yd z=HkRTV;C{E&J(m^%*ZYc=VbHh`SK}Gn`kXZV&-&DiHs;&bv3k2TwGGVgkqWwMmRhk z%!d=a+&|e$WC==EE@p3@*S0ncu3lhQn$Z_fP)4;Uy>kVjQk@w@SM% zl3k_AGIVfA0IJACQVjO{i<0zRo>)|5z|(3uvkWnbU|Hz8vg`lRbdKS5wO!Y~lcsTF z+ctOH*tTsqc4J$OZ99!^r?G9@-+GSkczneq0 zA=Me!5kYGrqVIKJ$AztZ|3CJ29#ZZs29NB-a|EOs6!2FsSbbF{kFQT&c$s7WS+y z(5kA9{v1sjodU^GJGTb`BdvfBWOTlSX=o-^`~31E!I=d(B`U@vbvhifjjgTG3WzU2 zKk&#g*C{P=NL7Ncd1O?f7B)00?f)=NeLpOT5cW?<2(@Wzu#Ec?tXQ)*KiN*9YRs6z zqSJFk$v4C^N0z~rmk9^Al_Y@r$0DwHXK7zGMk%jqVi|>=ZGr44oRfcOnEz3cp!G?w z5mvU6K%NkkhIDXcieIUppE^|N;`v03JkuCVfYsGkGA4@{Y1ugEmersPtY74f`Mj=+T z3%;->Nh3JE;v4K0eqV;>zq|#jc#Tq-m0D`!d@7@&oLRY^nBiWoM2k6SBSqySFOe=W zEL@|}11!@YbqTzA9@YXui4x_>)i|b(s(+G(OWcTn01Nz=TjooP!fl5mSh1RxC)OBmr2|e zYYdr-A`2Eg79(XNU!%@M)h}dmSwp%E(b2BaI+}u+TGZZRPMb9tj~_x}RM@i(;5F#< zVBsivE%SuXU2W9MARP8|nEWZCbpH@r9F3A=#3MYBogO@;@ zYG^Y;=+6j;WA-6~EWuHW!=1FRscI)Cj_KZ{E#41?K;u8cid$!yr_aJN0|j=Pe8WVY zvt;hCnX+J;cMQf?e02(q^HHnOy*yf32=20V0`Rk?DY#4(>s-y!M8qu^6%b_5Vby4`L5A&9zYKkH1o?*81R_(j=N1~B z@1-?6^Hj#bSU|D3*)f(O&XNfV|8{<33^UgysJQs|{BA@uodU*L@_Y|y_I__`T)yvQ z0FcG5WxURK*yFs8^S1lr>MN=W1kG_!NG26vTtah-1eOlVE`&@eX!FBylSJoowqaVY zbbGmJQE5$qmnC`;4!g^`N|^MzD7EJ1?ubEY0q!5_cr8Pj$RNmNy#u4+pZ@M?FwEYC zE=Q%&zjTN3Tg`mB@5-SrRCC+KgL1GPBGiI-ks(iH7L+I%_KAq0HVE)<7YRI5nZUyE z2<6vx;`@|vO%A&REbbH@F*^=~0kwC(Y`Rk?jlbQpYU1er%$;kJ^ihz_`UOQ}p;Yix zeviJD^qBXpblRkNs4C|#HyA-G=|mLc_o(osV(j3u+Gdh*6d>DB)n5rE53S&apu}G9 zP`3Nk4roQ)9Nuheb}6UdlLP>F=kq0^@4!JtM&mBRK_LWMJVJ*dZ81V;Cf#^CTwX>~ zDr}yaT=1M~!-In-P6p;Bc+U8&94o}$?|SACvIxW*#aN^7#nxpHd3ZG#2pg5;qPFo2 zVG!+aJb6_0l~}P9SUZjyT3JDAJfxRTz`aj59@Zq}F>P^#)4%g)k9NFa+%j8E((>Y1E8PO zERp6!)$GZ``Y~Z4cUYif*TEwa z2v0JKBDOA388SEpuR@EDD24M1L>cHGRMKo8cVL74UUT6}6@n^=S6LpgDI~&$%~VDM zXgPuJkM+tcvHn`Pn$r}$X|jV>M3S1Z-gS( zwb`Lfc$9x+h6*J!^xC6c*j06jOrzPayGk}Eq4=-C?7BZ(=h(8d1m?*4R%)Lts_GaT zl|x6GZ9&!KdgOGB47In%r0c$K7wc|YTwS*d-PScrydb4l6ECQ>N@7(eoHTVhKS!7TKX}wJk9cQWP&?YSPBKy>mj5PhD@4 zzHe^)kcy!LYS|gPiUo>Ix$Ew4Jo9svm~&J zu?ral7firK@Rs18{7!aIW?*jcktnCSmR1#^FqT>ax$}XnnWs=m0Tz3qi*n}5pFo`% z3k8&!6z@s=fB!&)+&;ChZRg!cpNLn@`-@ z8yo)I5WUll5LtLq3WNV!^mnXa*RnK1R|0lRG}GB4NH{nav13CsK`zz?AaP{CDvYV` z?f*Z1VN(-3@Vo9WW8^8RsqrkCJGZ>%Ov^wn8ufZk`rXstx69q;wNI$eTd%Dn{f|-e zmlvmQXmjNn1xFDc>1)*3M~?qq&e|yCP-RT7>tGYpsDu{5#@ZSh06u(4CCzImK{JQ* z8h%7R*+nyOc+Qf6t{>f=G>#u}VgiJ`1j%^yEK$n(2O#}xtYA?Gep_}Zm491nV+KMT z5%Uq0rVu25dDdQEqGR)Q{k?~lclhhx7fD5?*UHtb&Buc`IO_jhdu&MQvWGq6C!TbK zr%*~?8msmDVJQDV1);|u-9f-9)~MA^Ct{Q z9?>(sKQz(F>oNm>a%ONqH%g5t;V*~&SW}V=zD6J>hl7Lr9|=;*lUqPQjNx|*nYKkk z?TjHWK|_~s+Ciy&%>sq2wsU?G+ifL1L*k}4tq+Ob=F0ZiOJwDycY2pptIG?>7TfV* za6AwHZjAY~3atMjx@Y94(@RNr5A-w~W5@4y=j6l>_J~>N5aS_|f_f z+r4rlC3GqiBzWE6d-CeBI#W5*A0&3j;&Ec&C-5&OzfqADQ{tOYf+S8F=M>O(;D;>B z$F?^b@u+p^crV*z-LsQjW`eAUQOFb{M~ae6CF4_pc}RLOl{UvEj4&6&iL*BEbx&Z& zUY7iA`cg-Ts|xBc&KXUFcMw{DEA4-OB1tIcv)ANnZl69gwhm^YuJ*s)_DfnFEVEqA z!)IGXkdaTA{!&{9);-AdFcrg&Uo%qUx9b(|gxKzIMr>+ZE5`GaVaOn&D`$M<^`HHa zLPXI0ZHF`us$vhncJ9bS=VgR8#99duBtN#7G-(&Dp9z)2U5S~^LJ)egJkpix#KX%c z)ouWYg^H}mDcs5$3rBxR%ypLF?{G@cBr|8Djg4sYngOo1NwlC?^gixAkOfJ-cpxRJS-DPGH-0K5%e%5~wON5y)z2>gmSXCA)WtYW#kAA zZ#aUwsI>wu2wN2ZI_)%PB4Ba14D@6(vLQ7YzbjvpyKBhN*scz?_);O84|Gz%T? zyEuS9_aAH-nVLktgrV$@d?Cx}RxC#&+hoqp1DB4ctk|2GZ-^w!I-oCBIlQyGr_c88 z$)~Tq*yk4D(c|}WL5M0o|1|x-HD9=05v2w8MZBak*{yy{6PHu7!O3uR@kexQOBvHJ z=ctMwYinznTn~_ojCy8&yP0T(xVYhY+yw&KXSmlI|4C&wsZ1GU_4A0AEKo33Amx0& zEvLAp9&>N5u|*wbzOW0ms~A`6?oYXgvgvJ0uhLH(HF^B1Xd2p~#w{H7R@}~OEq-eF zMOXFBY?zzVnhznm%2%zAEQx;r#M=QmCU*SvEM}0j>-l(?cQgaHOO+-%9Q@w~Xtwj| z{*@X4Bv_EQzFqRTKk?-3U)cN6a&G;?ID-F&ZY?c+eu>Cc*EaF>8v99%$mbp-|Jh6U z>*Rn|0)0TJie0lJm^r1sJdUa`rmmU)_B?_shzVw1vG0+oe9rufb!>M&KhbNmzU%>e59`@g;So$gN>fvpYVY4I89k@~1M z$sd;3%h}4IhrMnlHIW|#_>gj6T}|IFrod6PXQi}sRwg7Hk~sN4#nja0=T2;K44w>eT6<}ZM|X*FR86; ztmM-GJs07X3+q4l?-Y)B%IUm1MlL}Wzc#-vIq#lv^(NK3A7wwUmA}#n`9Dxsv%Uw( zQ4gW+g2*GlrLm6Edn3uFo$@8{smId4Vv5a!&sO{!{Cjj@3^Yh_Id^R0{Cf8JsLTx2 z0L*IJlm{q!p65tH3tLEXcU3vXur||OQUw>{yB7JsA95sYy>K+<)E$FEu;%?ttm7<6 zj;(F5ZrbKJC3f47mI00=f>TpMTGr*b=$~>+1-LK+;!|px+%4Vh-|khPZO|7r)G*YA z(o1mI-EPvMfI*hm=9}H-bI8)niL(TXs2)77AzwlHm_l16Ne>6Y8mzWF{u(&GAll$^ zTmByvGD+ajyCJLb+rWK(bn_b_{2Z4DoID6uYJqGCe}ah++!#vk=ek7w5GH>EMd*(lCsc5$cQAkvFH7#hz-f?0(Kk>TXcnA-ktq2>QP@1&z*G}dom7=P8 z17egb-I7d2^R2vfQ6K;l@P(emBHz3(J@N;$S&p+}-!OWs%#h5fS2}W=pWr;?3jq;uq3=P6L=OR`?6INns zq`$f1MM4QyleR4z96ajqkl%o~`~O>iQ6V+G(5M2%cvH%}Mo`;_J`PEhE6?Zg3 z`kv2n4aVCz;DWf;Ym0ED98_V~qyZe#0#k3BcVwCg`AJ5ABx|i+U0Yk*BUFPs^P1vh(RU!KMBsf#KfaKeQjP%e`FDNp(uJ}rDGL70 zeum!km{Dkn-#fhi>zsP4r)g?=Wtb86D@~haAtPasDWiO zRtidnHy!knPzvo#INxQ-oh2!Sy|AQmamQ!KxfVm15MQ$ljL6QvV?oUJW8OOKI47C% z5A)W81hSqvZe&aP?rG*Uv{|yx8yaVJvaURN2wz4*|9+g)>$E!fU-=wqCy7oC^S>gi zrC{J3g_kUx0!@a*e3YKOzg^3;0TVzm{G@T)aKYS!Y6UiRzkEF5e1J}Y%d1&jF-Ae@ zy1Av(zrlRzdA<7sCFiYyv975>yrN0M6weZco#?4{CMcAP4mwd1ITP`uH-yo&^^Y9p zEkM03j4^2n?PHyAa#fwAFG)QaqSUB?q`Ra9$nO}bsmFNwMkch6V=y1CvHZy9t51q0 z>8TvmwX9eM5eb9I-wC{)!5&3q56G9sz)E;%fe)p;4r8UFI~JaVC*7%Y#I3-V-%7yM z1*@Sn{DH8z`8oV=Dk1f|3Puu?P9>OKs-aZ=Rtq1{v-_F;><+h!8J>=W-G7>xON57r zT*!w5$aYMl-SN-teu5wXvQ8jX>~|jKqoqe&MS+nn14aB(1W1z7w$({efC*;6%deaf z6+|hrz)hrcW!__63=KSO=Fq8v<rwBT$>oX!1ycBgmj}q6w zjG1Qv$r}|hKkJW~CM%`AP^JB!7l1UV7h8OxbvwAlox1ESLXC2eM_4ubxS1`s^U}q8 zKk({kHk9xut^Wgi^^Tb(dAJdu)3+a??Ttx$SD%wxhjpC1eF87tUtIcMi*87(D3pNz zCcaX1Nv`kO=Mv z@O&lY5_$YRzxOx4SaCw1Aio<%-yFivZSf?JKj4gv4DqqI4w|;<9$DY0g-!TdTPDwq zn6C2EFp9Z~x1@vF*~M_jlpIbDe15Hwk145;&x{#Mi;r=%Z2SU0K~wkj&2C_zh!vzC zs;s70+$$|aIH2qjf?>B#f0SiyK=XXWR@GD1#hyWiT{)Z8o3wO+IMQD(UeFy-W!DRS zu49I@agZYwVr7#eFq517o0a8sznZ0~@=1lu837))yOKRC_=mlN9(G%Q(p?3&@qg?|i{~`&;*zFhEm4N0s@D*ynh@ z4DO=Ky1BJ~sV)C&c-om5!( z&P*+t5<)!wFW9Lxu5WrZ=Zr=t%JTvti*0YtLB{QYZ7vP>HrZSlam64mbJzoyfrF(_ zTUb-Qx3ie6x&FSrvot+RV!@4-s=IuqJ@wAp^M7CPTq5vc*>!!iWoB<5TVI*6Rbi72Htfzq5v>Xme(ncXS%!Ldi5bK#QZ+k5 zLg@A??Z3F0AXkjJrHYLhY-sPxboaTZWBGVc=5Ni4SY_FHf62Lh_Ujq*ZsH?J(W&O1l`&zso0 zbaeq7hB@tTMBvzp=-_$q5O-)U=pj(?Dnz-i2)4uLwg)2Idmr+Aqk)J5J%m25tlm4c zep5qDvYu5KrkYA=fg}7~j)LRr1atbsdPk+$hMovN-WHNf^;Ibxa2JyPdKc0Lyto_^ zfw`*4WZd{<4X&aXLd4r;-b@u(i<9)AacydvMB$YxfHx$%M!LpYKCc&6Q z8WlDn;c#{PW~~6(MdCDNWo^rfbt4XX2R9U|%cQ+kH=zrGZp_Ma7urkC*b{^;oJksl zAf}UYm&?)G?Ue5feBygx0Msar)9)$7)rCtZZ0217pac=Ac}XomXN$ILiEc1E#6s6Y zrtUT2C5d6zWOW~@0E>@tzqPgBpIXx&#O!|d=mK~R+qcOTCYGV~jS@wcrn*CWyz7xM z@XQERewh0sM)NBtb8N7)$_7cL*ApwDuc#-}}} zqmm;$12$;tyV-^4oD~?{+ZJo|Of5ZERGf9WQ2y5xl8&#(*p7tM!7o``dHHx4$${*uzo)Z#gsGlF7P*4Fk;7b^Z|xuqNb zpIi#?GXYukmbYZXuA#2(e?S!AE#|xg^L8zNftLY{vw^X3;N;}wO1Bd*!_TLp!bOuv zF=Z_&T};=j2}O#KD+y#~H%$u_jGvJa;{wI1Wot-M6wvG49ryFz3@z1hE*tKRk-vWU zI`miz`jO{OlzU6?$YRBYPG+kXs76Xyb8u7xWj*H5g!lw{wP^D#P+cxt<7vzp;iAC5_;v>|43RB^nECXI? zk(X2Y8fNgqgdlc5)$_U?`Z>swGDxcnX47pe8u~+!{7zq@DYhbA0D0$Fc;ntfjaN|j zL(3;O;pa6J$mJFkn1wG^K)m?RMsH*LIh@`1Ci3WIi1Ra`vzLFV*-c^&tqcuQzing) zP`h0QSp|GT%za;q(Mj|V1)o3e5$s^n92c&kgKKgHsqJ)GeE%aixM(`Q z-%EOTiyj@KX8t`f8w&Jk+d!~v|6cW{t|Dv|8+R=u$xAy^Pvb!9uRN`+=H!Qb|u+Lm*6slM%jD#&MvV5&QR_R#}(f&?vFIS8CiPB}KM6H0^8Bi4Hd zq!?^%m}%%lZLwnDAPbmRv72f8i)Mo^`nFBc2IL4uNQw6!V&Xi8``EzA$S>ri$nr+S zmpz40VC1SF-FL&6ZnX)&pb4LwN?Jdf8@8<~M@LaalcAt2E3%M>XKhYT@GS82uD8dC zHZg^r$vn;bo4#uV^6rg|W%g>8$;c_B~=Smf!%JmSd0=5@9sa>Ce~n z_N$KY#9_?zMQcahLeIxLLS+76>Rm6q8_-r*PIbvleNGqj70D? zNSWB7&{763I7IObE~vu&dVS+Pwfkx9{jkO_OxqsVT1Vf+4)KsoF)^_WXhPWGlSJ98 zlMxe!V1F?YD%sfWdb>0R5>6^`)mJpSrO;?~uroQh=M1w%AXl4t+9;NvZdI$j^OrGMBf3p#)P zQqUYe$jPQ8H{IvO-9uIyc3!35B_objYMXOh8v}=PjH(Ujs1{O;;%rPd(^#^R{q<{a zv>ritMCCxJnCJow$g!0rm|x z?)Ahk)qNVzmp|3_^xZ^JI0 z%n~&)L+Fb>aTLoK@EZQ81^oz6MlyYXZ@>MzdnlH7 z)irH9vaf0?VLjrts3#jwu+_*7d z=Pwtk?{`KWb7EO<_nU8S`~Iz3T#YL%j7TmnAN*n=w;93J@o{(6I4Tc?c-ni9i<<|X zTgpLPIA-HllHcp=c;zL|C12}4sz=qgJx5->NhQi@qt0j;b@^(abXOvB|AgOv@G5sf z*%~av@C%g_%&Ot@dicay_W}i<8KQy%XKOy$x|#*BA3rr08ni3Wq&l2t3Mz5)46$Tw z&i-ix6e1_G86}lNlShT{;Bhq$q<+4`z0VT*L{uQqCz3^&ZFit3JUe?*eEyJ&M@UhpntJ|+HV4xMxkV2)j{fKa4WwvbBPEOX%@8%z{+hF*D*uUfrBhxRc!`Qkzh{Za2L=Yx$*X2v(-;%BC)6p<>xEGB`hp}&bLngBUWik89&?p_xL zAN1J(VhMy-r3M^Vho6X>(?2+MrY-)NA51p5kTU;gezuL}56wHSqytvsAlZ40rv=K4 zgMcp12so?GCP%=_br4#B-CEXWJrfKrwM}8dV2+Ac@VZKk40s$5^q|x+k3!sG;(u0v zB%W0hw5JN|$Eu3PJpRY06-~+>(nMk!hWQNNfEG!v1}2L>11(IKGG|3YY4si@3==*H zmky4xstayRDd=6S<|l3#=HNStj4+jg-AxdUL{+_L{SxwUE$!rAbvGtOAp2&oNl@;vE)-$yj0=|jbt)umqI~P{z z1T$<&l$TC8x6ussM69by+&85SCO>hP@V{>rT6w&)P*UB#qA&5-us3r4y z!N;w{olorKgCcZAr&ndx$#u*jKS4pPNMtsc5y@GZkLSLd+}$xzIB2UiA5+|D0V`#e zVg+pkBg!acCn7O_^+vj0AX|0SrfpdH*nQEP7!V^TL*FfS` zP^Lo=@IMcppr2src8*h@uD;pDt+3d0LJVRBfnkI@Ac=O#8$?k^3MGhzagbZCijOC} z33wBJ9r=B3wcbswS-7l8R$XhsM)PVZn?3laaME#bbB$9BvFD zRo~S$=&(GDC5$(SCMuY2=7LBGVQGC>TF8P!j9(?;xYo2ZCul?y*ock-r$S&`Kqgoq zIAej*h>JueRq(N)j%}ltPp9y5r>}4YR>T0)7uUKnAPJTyG*su7z!jI=8}my>4RAUD zla!5fg%tAf@$o{-vEAK#^D72=!>FCpiW)KM!OxGklLt=-!5;P{9l$tnG?OPB6kj7L zp9$(68XDTa3r4~d@XcIUSO{-p8)pHuTE@rN z9Zh8cK8f(bL2^C6j~@hH=aed@;YwiLZyWX=9}k=s94J%SeB)zdu;yFdi3@PF9k-{_ z5<7p=E*-w0K7YTwSVF$UH91*Bi0aK*HBpTxh%NVGkK5Qsd`|uTHa-sDyr{X}A`@>0 z2<6~qR8IDa=U3+}UJl`aV*_|juwub$XlNLCd1bsDkdLLisA9`j{}A2wP^hm)r8&!x zlcLV2f*^@~Be@wEzKWu&S0coj} zF~+_(|92O0a5O=S*!0UgUSzYnnz-sU~BEbi92G5!XuE(J;9xIO7{@@6$Ri(PpGj&1E zafo49gpkO-y;2psnM>+y1?I7fxy1l6i=1ZFror1e4$u_lqBgB;Y?zg@HoM57L;g=u z&t(-Z#4D)!fsomnKAB}}hH<#EbgXE?by0>99gJPhL~`{Ho(3IhO1_S_Gw1T0t-@?% zCDnJl0+*Jz`w{Z3#2iV?$+uC~f_@HXLZW_i%cyQ%SleF)>O3Njm)67f2pp;yb4AYS zRxtujSj<9gu_aDymZ*3IcBCl}2R)O=&!5ba$%ZZLKWEV`^p2F`%&lc|+V3nW(8&MZ zHIbBbXBR<+|H}U>qEl4RzOG2JBi&s+t3C)hlfUixaGSGh0a8eKw|f7^*|kI_(ckh? z$_Pc3jWi?>-6wo8DeQX$v&S8f8xn1G{Ck1|EK20d*?r8Z3VxR(69UH8 zw$go{gNgbdYz88P3Sq`nRIym13`m39Ge-0cJFDRveIooo)_)teCo(~`#UBe|(qqi( z;Z_vhA5L+1lMHx#)+I+1T77k>?g>b+GD=mQe71$!kd&%zIxcTjscR_VvZ^A7-g8r7 zT-v&^g;enfNN9cqal~1vEayXmW4;+e8)fE45PS>7?L-vjPxvd_x=yVx)M&vZ2@_bhOp{o|#aD-oFv~t_3}n=^;OC^Qp+fjkqr; zMB@{Sgp=UUm>MJUuVr|!AptvDZnN9p*JI?*JHJ?E`f^V#ZexrIofm z+e@1xVeemQ-2J^yj|t`bP`Q(S`=|jcNj=z2E$nxBINj^5?P7WaBZ*@*UQ7}>VJzVrdiV>fG6K{f6^LW(-^7nc7L z3k<51vJzFYmE24eJFmPkRJ}EFa^-A!>IIqF-XCmNMq@?ocWb_#mk2?dEa<%Pvr0X5!Z*iiaZ?9!O;C5{83pH zw$b|3AoBWFBS`Q`s*1~55a=%UdV~pg?q#nILj^vux4wGixx9Rn@7h9y0^-#Mgx@KFOx&)2ONAt=&zgHw;T%m*39+#8c7ZRZ!XE zI70I8f2=6PTw!twf=dunAQYFE1BnDeERaXPGSNX`TB%sNzvD!jjFiuJKBHeMQ;krT z`;87zzONl1K>Ua8-XfF>5fjl{8=DZYHyrDD`j5Knnli`G)fK~<#?@6BybM}(8%i6& z1gW8uwekir8fJ5pJ238g7I9;^szm;#A?FM3>v_`t=B&i`O!EXbqJs#5G_!sACk|@m z(A)0vt+(V7-cfR6pYE>6-wp9LOv^Bj(af=l zO2md@Yaa}^w0=EQ)u>0w!<#2K@F85{73lP(V`?Bl5z|~Rsih{X{~l%*YHe9SKozqv z-5jFWs2D;h_^*((8V>;4$V$@TNr)e?Ig<7!eP6Vybn&hF?yQ-h_Wh!GdJEckiz;dA zirUoY#~!G-7RUCSeDa(Kx>hu1ja2~)F(T+8#n$kNCU9e)tF5t^qp58fr3{JqL%}9f z&%Ww#YR&#=(+k*%VOO8E7@$)0SLMCCZ|Hcubpkg2Ltb9KS2nTbLqV`}Z?6GsZbLHOo*l$*Qp#IzxkNg9qBqUIYg@6rOqzd{$ z6|ws_<%&-{;M}hgXEk?!u4SY+o25)v*>Z3&572P!bnnMb351Pk94@i$=lm`s8UwE^gOEoF^}Gx2kX&~yKw#3-wZw=yaZ4m0fb@7v{W zDiHaHTe?4Nv%PPR;Gul-LB$K{;A9@z`W*s=JvajQ7(+_YEFyolX};y@+eMW!NfCpG zy97vSi+~r+LO2FF=gLC*3sD6+#*o>`2t8!NGNDBMSJ6SEO+~@sY06ih%K}-%K8G_l zr+t8lf${$0%Vq?^t8Z=|0&E%f9XJ0AK||#~1rp7GqPgScFk|x|;jQWZdZ!=gBpn~m zH35DZAWL6d*oqY(Tc*oB<^l}hzCLiE_WrL?`$qy<8S3)KPeypsO8m$Ry8d2@@wdb0 zC%^lWb+2hJMXB6ayd7YGLJk-}=;-O|Hnxg3?hvxf{l2^aD}I)1#)TkZ6??y-RC;k? z0Z@~x0$m7ze0x7F(|6iv;#$)6`qu9pgzE4<(8OO*GBuEvmS*<#`7tpyRo@DVWex%M z?SdEX8dsH*l1Zb|&)59o0H#`IV;yvio(~>*2kI&mTkripwztO%V_>*SCJ9a2D@^DW zr+w+oDeyV92eH>fW{mfdg`eY1Kz5HqUz~0`w?Pk}@y;;SfaR~;3Ao~RKCyn{MXcM; zII(T}6yOi^dI;J6!QYu?`AgZu`d6|rwM0|k*fWHw_RBxBR8&aEjh`@#kZ>Rmm=iC`Y@bI>J@*@OxlE8hQUI=9TR1>%yPdT6O;n)qeOfdB z`>?3(0o<+uN!eLW*B_z4lt;D~(eK$f`*o6a-DAybWdq+~|JX3;-h=k<<1c?E1$eg> zz>+e~=e9N0ZqGFc(5DeQT3Xo4{?7|=ee3Z*3SD3rC>*Ki%bSu9oCq4c@j>~oBY43S z6y}90OCCCBn&m@SK%AZ%!YYiV>h*0#h0JsS4N=8n>&$d%((Yu5uRK%x#K?Ct@xv7@ z&61oL_mi@%UpB63Vt7uU4-Fzttnj8ez;10ng(4LUxM0gt-b$1u8)=H!;W0dZXQ42q zU2c@TBw{8}5^@<+kmLD6wZ}m}xXDi}Zom*fu8eO(+AH&*5dDWGj!y0g#Kb!7-5_l# zj<%Ys8pZ(GxTdS+C<6h~MFxp;kNrW!Ik)*i-SiU_>C%=x^tLcZ`1?_-tMh^~DKAuH z4Ue3DN!Ks)?XokG=c+Y0@GX_g?NJpNP&?w)HO!ZEv-hNscW$CdBIT=wRYAx}N*Pl{ z3m7CPQ@|Uo&ck74DHZxuMq9KPgHw(`u0agl&J1r&M|0{-7HoYXZ@o?-y6;WUWL?q; z{xfkhj%+1_M{;ow;~OB`i1szeiw4ac+V;0~LN!pqbe>K}XXvK0 z;iC)^1LvCeF;FthKoM>axo!MJg0QizT*B=jK@e(o;|Md(3ChCkZ}Z2@k2e1q&GP@F zdm1{M1apPDo{xZL)yrc%dsds-=0J*8F1&{*KTOJf_h zAq3GpBmZTG3~qY8?e<8^rWa(}R#QfpCc9S@qJY&!Sy4vzOYp#q{!I|N+_H+e{Lseb zL-4y1HYWbz!3<89B^TL#*`A0fa7_$klgP4$*J{mg$x=IyzE98vvH@WM`3Oiz8fai3 zK`aQeDuUwLupWo^^a4EYUrA5vu5erLNA@?%djdsk8O2nvnTkybn(~hVRh^v^E0Na2 zdTjA=;CbGAA~@28WPq*_nGw4s%Ynzdlvd<0xRxE=c?nK^YR!tB@ZH38)ZkCT5jo8- zm1IHONJoXk@5$^@x5#svIF6x!FSCVna`6(Qm}VrjoxiEk?h{iKjE1Nzxm8YI1WD4G zpDmbUgaHN?zNl|o)!QNd%^gPHLw?@4rpPUT4JR>YbBDm=ZSyp2?>}-p(X=@$ z%FM14NdAu#`J0|^h;gy5;rY;&q_oPvvSzK_PIKt7&C<024~RGM?fR$*l%C<1gVTCb=&pAyL_<5W}EmdtENQUm$+@vsO?~ zmhWHhl1T0^U)U3&ktqgN&Y@SrwXf z01fOo;UP;kNeM9FsURt-eN)*UVTolMuaBB_fU>4%Rb*M|zKb{Y@yV#V0Lzk#6;gNR zk@egl(B?S<;-jyQUe980_J*^!bGlw^eV^VikqsyAokQ6eb6+``_#Une?O8u=wTvbZ zvK&Yh2^3X02fV*U!dx2ny=MNm#4yNlVcY0s-Hur6f}kHMp~%S#A&9kor$n~+55pT7 zN#X#zcyXb;I8tD^ZFM6+2xqJD##%uVpbZyT%t44)o8T=eE%FKH@yU#j_see`GASU% zY^cM=n%Ab6l`%v{-tpdt67K3=af_CqD<+Ya{~DP}F||DT@2cyC&qfb4KG#P=DZkm{ zG~L-#t5N+j4dyL$`IONzn@=HfqBh#-d1MbT8v66ir!JHzN2wOKF2)*C|`Eh zc|#HKjl8TAuY8`w@z%R1ZVHy}7GLO7QlJ2~kdV{%49oai>alZ)1|Tnq#~^fo~@H|djcX_j{bW!O?OVmy%?HyZ%J=)|J&Mui~ z=COH#%YM1A*U;WFv2w+*g_ol_JUl#h=5{VNPfJfXGV~pdJPqifOjAc6y2N+qxy={K zfJGM*QT)vYyMREsBqSBinlfu3p|+3Len``GkNM^Ab>+nv>-#nQe%AdNaZzO(KtuwY z$cQ8$q2=QiptM4k$p$;fEpF!Rv=oX3lc7>;;=O~kTgEm83O zy~7^-(UUJC-@woi=pzt+9nTOqyFvmH=}ZCw)92?l^j#5D5djAWrhwlF=rW7}J@t;3 z7Er>wx6FY_v2VBh|D)+F!=h@VHLOTWcXtfkFmxjgL#Kjtmvl)t(%sESx3nPL-QCii z!r9+B*ZIjmn7P>deb;)P`%Xavu9oy8oc?4HA9~pHK=NXcWNPIcf#12lm)EP`c5btT zpYgQx=e7Af_RBXWj~XAx>L*OHzrF?Z-h}aY`8~MgoeRu9hSYzXu4^qs77OK^jn z$6i*k&b!WoQcW@8#Kr2Tpw9uHJ*bYwE8@OSwQ!m=aDBBe`Oj};6c0R*42@A0+T;C)uC#R(Av^OQk|4bJcjq>|%kvJ9p9{%gO zkLSCfuSqMRz}TGx2mfggWmpG>)~SR_g+~npQ061C0=v0T`msr!LWZh+!`O=z@RWaw z%K%Qu05QS|jJZB(I9ZIcr%Cl%z`R_pUi$Fj|A0te#jlJdeR5`B$jqG(tO`$HQht^2 z6OG)=$%=d-w>3cPXW#rdFW?oXnW=YK^_gi~?D7{?lYf0|+t_M7uG$%lr>?NGk1Jv5 z@;(FhFwrW$e~tZadI!=n)3@gDSED&-ldDu^Binma*%dzl^%0ebowNzxSCy6nU-yf- z>bLM}pFO7byJcb!ZTQZlWch8H3jTcTr-=+s7>Ow(;I2XaDYmAOKd-qpw|rg5EQ7i* z4P>3CAuDK`P?XWK=y|8~3C!6oU@=h5H=mi}SzlSnrUpP>SleouG4#?V&b2nqs2 zFGOU^3l;vuaNSogFFXygoMaEm$VznIKq$A4ItP?{-tsF^+ zg=hW%HM)NwaC^C|ba;!S_rF64$`)DEYSzkd>if`33swGQG29+D#|;td4BAtiW4KJE z=lNU(-=PMY(6MW324(Be9{&)IxAVAFCYY>AScKz-C^AXYNX8x^6Ec>RmZs(A7B5*P zaKrR~CFI5HlDU|#{XfH9^3pA_6J1D8f{*#umasEISbs zjU#~&PSGtF!NAkXEdEP@+2)MXTvvC$fvEG6ljL;TipTTb+kVT0{8{p>b%z&Akc#}Q zAn3amb%5R)DeY+nWcCvxxe%80`ut%Qx&*Rh2xZ>XUr*iwRqzMt&vo2t8h2;wJUJO!?^yeut!dW;Pl@HhhwtWEC7-3ZAyUnwFd*HkK`&llkH1 zds!;3k#mmy^LyTuk-2etUV2U9EmCCg*(^#FWYjIbelm+*OqDSTgp8$M2c9d+vcHn> z3}p;6FYODbw5p;W`_mBffQdVEz z%ydyss81lG_)-LLpi$p}G|G|%0-C)91Del}wlo)96X_!|P3?m*ShhW+6qoD+qk40d#oMizxCr9AwD!k6py;5F<;bKMQH$t0vEb`9~t>EHjd zbiH#bD--fo^2-=Sv$X?N5hpnKI%Q?#Y~vTkv;vk3rO3#O3{KSusY&|Fr*>^OV-tahRul!0gZ!~6WuI#66h z7HE^z;S5w97a(Qx)=>zO3Z@iL0+^n5Sr*|RgBm;I$@#E=e*+uMHZv!;cy{|up~b}V za)#}9%av!ldi_p{6|9W#l3SW&t!QY!5(G_O-cU`!#)6^7hmuSoVsi*)0R_tInKY&6 znrLTAIU6e&q+Ry+>{4t4=^kgma>N`K28~?g&!@MGUZ3q9atqH5A)s~G(31wd1f(%f zwNh=lsU{S@P-_wGz&!P0wlWKSM3p3XdM}ny(m)jwDfumjbH(QRQS_1Ie$|D||81kI zhp+Qesg7y`yI*Gq6z#3A#mO~DBNRzZ&dtruvUvqqF!r{)`E|4TUw|?*Z4^&4&Ft-CxyiSpEovWq)z6XI zYqcwy*BP>~@bgR+%Y_kG*W8MNM2ItEt9>5Nbr}Ri%sQ7S*c7193%qZ*YI}YiFU|0i zgvQ_4>rh?ve|>o1=PCi8q@9J&16RK#+x^@^l-)DHvAQ~G_hYDrwO(f|GDq*|GZmHG zA4aLsodyiuuT(ak&^BJ~0K<6YwJae<*&!C|zjd2~>dN*C`_++&jxq_Agc9vXFZ$!6 z{PdD?^oR2F3C1{YcC-|V@bxD982?-+>=MvN7?^FEd}PT;sHujf>1xrSa~AZ{?zS-% zF@d6pHqRMG=s zcOA*`VG{H6@aL_~S4m*K7VR`T#xfgupH|Kg!GS9uYHM#>|Ep8JbdIJhxk=m5H7?|r zZjS#YZY+71+jM)aUSXw~Th)NY+XL6C+cV1xPz~EAetS?SDZ%3~{MM)h9$%)~UE%N8 zaqXXdZ)uWhMG(sKw^R!ezmJw@FYU1{RaBtLq7o0gXx-!VvN0WSP{_hL5lpJ6YiaXA zTs{r*Iirz)yZ=5#ML&Hoz@0>aJC%{$WQ--T#$b{=WDZb>2#jNH24Xr1xVWEU$uBI# zSv+oI7IeF6lm$qf{za%8QGNDv4H}CvJoDQaLz!`H?Z5+8#uO7gPP6^U=U2bs2nBFfn%v_*Lu+j0Jl@U#+c?nT&i*!X(4crYsv?2o2$OLu7`Z2(>ZgrFBXfB2f;Q zAtwkSLCnRpL=AdmJ31*JCgiG@y2gqEQ1h3pU7k;yopxgQu1076bEElWm*#lEQ<7pG zaS0SrV7xDo;m7ejI~KN!e-F0fsOphZZS1aM#&&k-ya zn4o$z%xCnW%RzZuvtP`(MmLm&G5SL88Yui>Rd+ry0vclyG{^SVD|j?FVw#h3WSgUYse)h;vO*(ED}_2ovpy~*b{T;|zxMX^BUU)n*H{6haz#ZI zhoG?JswEa*M*IDETbgK1czwYuDPS_H;(GVu)zrd1_REE-z2yn(Q>=kf{gNqIQI3cM z__a9|K0b#R#QFbQ@c-|rk!jx=|J#V2&|ptjxq9K}GrcMfp{^E&G^TDwf_B2^(!Jcd z8u8E3j#}8TSjQxGdtv&=g8I8Su*ClWBwWhk+Iqg=oH#yz;Z~e|TkrTj9`scA-Kkq@ z6f)HL=sA7*zN0ZI;9|9@M1E3E;&W0k z9!xpA%;S)Lkx-$cTow#YS*znG`HGtvQx0W;Ie7IHOXk{(^4qVrZE|4L4 z5Dkd}#o;Pp10)1vm{F5$>s`1DYktR(K8ek*uX(|=xiZtqRjFqz*(^D$K z4$1%MA4QSZra?%R^|HG<6}iqtSi&DylZ|Py#w10Y-g>u$N>CnX-W>B0PS^jBL20iW zNxT{LHhTfnhe4KB4yAQHBT8E=I3VRn^$#+BW)zj2I+5=l_Gh5#>+K6&$yz8o-84nd zyCu7tU+WfnvL(Sqib9=YQ5Y++R_9HYqvKD~V}&_W^YP|rGto<=`?7OlveMMHQ?V{o zOLPU|ir;ZULA;~#hldGGIJ=c}$%x@adDyOtl~2JCDXcyt9?fiX`fTl|b)P2!@;7(# zy(ahEk_9_8b4mC%>TPobv#)hMlh({}5GrXYhpMrZ)dCP_j?eZ1GxNBj#yfR&by(S9 zTcBBOYhN{~#0{D5Ps5ly4E(Ex=2lizD1|i~Oi>doK2CZrGFr*^PsQgg?5)TD@n@I0 znMn*qS^)?-f#xziQvR8$h?yZW5G0ETD|;aJ2vA!_dc=S`4MAhlRTApu8Gq}dxu-eLoX$z!LPSG=^9%S%w8i^OJgm@MRMI2 zio;-}_C(xIF54*6z#Ol^oe?R?<$_`=%R5|~+{-YeRX89M=lt8$mPx6E@e8w#Tp-md z(KM~;Z${qtg|JP^WUNGi^q4kiASk|N7UIshf6Q zu=)KR+Hy9lPJ=kmMAD%2Zz>TxQI{Ue>Az&X_~&$C1uIp#pCf)Sz*zV_KcANP!XDs z*C&~o1Ai0zk~uA^cN&66lV8T=8~$P-DSX~v9A(EXTAc$VR|oD7`Gf^Q3{b3$-#8MI zCGhJ{+M?vfIF#1jEZ?gF?!ZcAn>Xd^LRaZwzwUFqt@tu<%yN4?4t+9k8!}L3+E#Qd zj%eQ}w_Bnj2Y#P5BM0>`Ls_J1{;Sgaz1hDxOz^-&`0iY0&Jr7~G z`}MD=CPfc@qRzTj`ta96BrcMBjH9?Do`yho(-xZv&dDY+GRwBe$~D&5R^})J#WdP7 ztmX82v@!ICh~p^a{ioY-7rD%9^X$xOFFt|#!7~(%6jg$6X-2~+CN##A6~DAUNG0ts z2H{}-X3F?!+rvuxc*Q#s_SNs^n6RmU&hVboGo^-|OR{<DDhn&Bd?6PMu~MC?ri z+k39t9|c86!wECTOF+y&!v!+^s%aYHQV||&Q_lIr%{1(n3y!st;t2Q_zB*ZEv<&~U z@pd%vc(fzB)3)*Wo~`o=FFf4bJ5s*aF$ue{b{tb~ZvkDKoVBrJ$(9OPNh>*zLTU`0d_i=#ZKesRqJ8rf1gEmOVmDzJ9*+$VTl! zg1$3>Fm^B7nU|D49tNRb9fgVfzUmQbVq|c4vr>rQ%AkpE4@42H{qsYH8U~kAQJDnx zPpx)eQhDfLp|^P{x{>Ygr+HT38HV`YOknfk)e~r$zhL=4bPK=S`ad%Q;~AHEt>$oI zyQ0XU?0gW4I02dkE#^@xGchstfP?|^$yP2Q&>Ra`2S+`=ha%&DK%U(P= z9I;>x2V&+ETxrFOI&Ttm@B!g(W3dvKB3CJKsg#4@{DSxfaJx@*qqcwFdG0GJ@KP#P z#*gWaRZCzOQxFf49ELVsek5Pn%0g$&m=&-t;QYXkWPx3vTq{FunrqHwo~GcOJ$=G* z@%k+KTgiQOaG~=J{PuD>fM}=1XMk#q6Ug%?A}}wHk+jy@i2IMREDmCwZ5Rbc`+Z7~ z(A6)tiyXoA5rgU>K-fVh*92F{dVH`j#Hi%9h58jz+j>c~(wo5j)8n@90C8&den^x) z=S(f~9WM8;v)wUMGw}?PKm{fyFhu760m^5}iny^GU&NZGItf#7ahO8uknj~-|yB=3=rk%Ms&?OuqegqmcD5wy7ETN|#qDtPj7l`!vq z!@`Rzr-Ok6RD~RsK(2Qhv5Miu-JO6Lyqb(6k44!qNjY5Aw<6t06xz~r z@9!q1%9qpUxd;3AWTqRPzN!nSwr!1y}v^sAS;T>?!3$hTXa;ExU=`zSNLgBN=9 z`lDada~qI_ZMcM<_-bdHaudbhhcyVCBH8zDvP=K2l?>y5SQ6cz*LOGo1~n=|uMgNj z!XP%o)rG5DS79;KIxPrsN-k*bn-rHVB~KCLBR%VUl2)byJZ`JV!U?I@DXE54rBi>~ zoPqG4hyqK_$y$QwVZ=aIg13rPUg`e8e3E1&_U!fA<;W)2vQsX27Q}M@4@ppMXeR=5a zXvS*T2vLue=ON@6IcqZ0`8FjTwD|bjw<@2IM#lv7E!6s9nb4%x_~QX1l<}ZyWqr)z z?Qq7xeQgeGSabIj^#>~blPd)CeewJ*>*g$rJIi!h%>QQrW)zA37Ve#bIV-`ezhbrtY2)%d@0dgeG^Z2C=qlOi(eIy-u4aL0APX}>>i$E|0r`HwkF~H$=Doo{ zq$NIY9`ff4ziGzOSvZ#&bt&T>$HU~3AEK``$3JcUJC+;x-f~P=h=m|$Td{#L1KE>q z5ZeCBX{9Uo09ZrASW-cm<7H~u)M-SPF5kcSK>l4b3~jTbc+H+uSXfC@7iNwk66;5^ zl>pRQmU%}muSjf4mMR*8m%qZtv?m zLoXF63gK>dAtm%8F-k~)1S~RPSmGpnL|G+Pqf(LbLxYyd2r{L$LeNz{7tHYogkY)Q z_pHdEVA_RHuIjE~Yn(jVb$BZhc~80eN!)BLshm3o+uyhJRr^4-XQJg+xHNuT!MYKS zfmE(=>mv^>LsUd{feBgxtbY8osZY$X`67F>db6_B0&MX0+rn|7HvF^ zILsfE8=rpR^A0V)3Kuk@xNkpupsaCgG3M^MjSG4k05$cxZf*l`oyV1M(4Py0oWkxF z?>`>+cmEDT@O&AvC_Bzz^S>p2ISfhlczfOeo?CPlH z8{S#MQQjDf6;)(Lo=)ih<^N4wVxCg;Wv@6sp_A_WKaszBllksCz1~cS46vzmNvA7e zOv@mtYRrCj$TV%abnKpsO4Vs=?+53ww|m6+!3@U-d*dVZU}!58xP9!J>T}C)bRZ;r z1i;6Qm8b&7QK82(LUrTH2i#STD*DNyX`FYODj!iHj2|I1Lth+~JhXB$EqWL+JBK!Gi*QQ1NgqO=PH0A?w$o z@tRX2Dyu*xA-GNnSR%}TQ)F9aiHSlo#r?2?okep}En3|aEE!DC9DsUy*pvy|*}MP5 z6H6{S?$UMrpS?ZkTdPtqBSX|5oO)wf!v#8NmMhtWV0POC3mzvD74d$@gKT%_t!@6` zn!{T!K=`!dp^>~jn!bP(_}vEwo5zM|3@%YG>hVcl17!V8Ga=Tbh?`e?!Rc`lVSQq& zaNseM?H`Z-+nT@Bob@>J&04nsR#L%|Wn3|T>~UTxvrLlQkXz||HVunIP0VV=O&niw z#YTl+E$OlL$!(W1shLW0Nn0hGtKm#7Z50kTiMYBBxK(0-2bvXUoc}R~7*;1I>WbFP zD8D$0IHV*XQ`59C%?pQGA!0_Sh`c0=)Xv$eL3*42u%Kt0=h-pBu|zIbrgFiZLyOL8 zXP@5_VzOYQ+aJjri4BYp_OXRmnm`I%$@Y!jwc5?2ciH%Dm~rS1EoV}vO4=~JB+~&wXPV=vzGsoi)exdY zpHvAlVpom_lw3|s!Lxi}mfY>9hvR>+c}jVVIi5fDQ%FwzVce{1d6Ft(ebw z5?_0`%SZ?E=T0!Cl?*26CQKw7G%}_pi!{d5Je%xx9uw5v*MI*V{+#3WmqFw$^~>(_ z#xvzVkHPJ2PHA2B6x^y~U3V1T z;*$pNW40d6HKk{*At`XWx)@EPOYvre;uxxBNI538?q(qaWWL`4*oPb%>FTHWn4@!) zh?no&N(W>{x7;i0N(2f4w4~GE{afuX#d`?hdhsg#G6DI~)bF?02~b;_+;9i( z!(qaH_&-PrdAxn_*>ULVbbnND)W^%gkK6BKeP$ozKUjQmkKfC~X*$kN`kFv@ee;D4*~&Ygp`!Hf+S2hZ7|kk! zGkV~g;K$Ip)C0wS>d2lV)s?0g*3uANL!~Hg^%t!f)8o(Hm!VtZW4)P6IpCEMW~V~^ zZWIY~xCSxV>khen8Sw(B2k|B}E;md$vMBw+<0)nUi71E`SjKVO1}Zq)n0 zwei68zZz>embaM|GhIiynRdH;Eqrxs;=eardz>Vif(HXHk{9h$0Br~Mb&@lLl48m1w6=}A2^<8zKPfDl*g8|HEU zygu@F*Yzgo_geoYj`qVUMNw5g^VOq~Ctid80>(0BrB*OT0u4vd&Qe}2$eAuN0;%&_ zShWP+OrRq76t&HeZvF<#eXRp%PFr(y4ImodLG<;&vK4BSOiCk2x|agBv$V1wNdj1{ zk$+PCM8-;vD~mSg5@U?PqHO~5{Y5oQjM|jMy!I(Gni$4AOeW>1BSZ@fs8^*;rOI&P ztm1M}de&Fv*L33_5q%nJKv1lKrW)Z)iQPpt^*JOgu;&1&&vqjDR(UBo{e>Of4rUHM zrWac8YpiaNp8C&7=9z{S(z_}$G1)NlSsEdy1s_xk-F}J5?QT0JQ@Qc^I{_ylbEoow z|F(SNckc!+Tkdn7%Ws3Zl{_D|KI!V~@AULVJ@^d*G=4|BC@{;B!};WqD+4r3k9ggi zgt&CwxAbi5BERrIP_ECZ&Bo^KjD=EK8vD{m&(Bkc#7V_PP^HSR;BGj-$r4cI7pLAa zmho6md$+b%`*k)bRc>3Ey}3S9aonfb>R!gr)M}@LA-JXpq<`?`+Un+# zcjS6h$gly&amA9r*4`@PdVYzo+@^1<_Y=}fcuWjSRmGP+NWx{_kMsM%nP79lKT!q+ zpA+ZIf8@SyYu52i)Oc;OXA)o0Q4p;o~onp)Iyq zq^tN|-9Kil_>xRC65Q}zmS!1g>e}8TfQ)A>8)G~^Aqy?YSjVifkDU~NM%U`+wuk3P z$Ful*=kMr#2w$P3(8?t&f_tD?3~+$26`;AyHP*LZ4clDDHyX3OJ*Cia_ z%>W25$G0t~O(s&1%mUSuHSg~mi>TK(?K&!GttaEFXkwAmAbD5@) z$_gM?Vt2sYD>6LG$G3p;oX=oVCg>wRYmLPO*?coE1ZHPHmR>_|>l0;^cS<(=QyoJk^Jgw7+c3$?M>%}QxtSf8aisa-mV1W;Y zsr_L)>SU$)2T=Sm(dCT^<#NXy?@69t01~>R#0Kpi@q_hN+$&Nsc%o02QHxE$cyK@W zZLjn?SB~j75VpB!?+)iL`RljgUY_hkW@l$t+tOkgY8C^47zt&{%v2;jT^g!tnRgU% zrcpYlnduy1gjOh7aNG!Bi{!rI0I|)UI)<}<6nRxPR7Yc(nYw(G>3@KG_qKD-*XjWZ zIZO8p#U^KgF}h6r@p=nSLQSpU92En`q6Vj|a#Fhtv~wf`ed9FwrVvLv6Tvu`q^&|( zyF)Aqn<9AN8HJUvm?y2d;E^xJ04jzw&&BpiE!d)j*~WxQb-;h#RR6q2L5L6X*2Bmj zBRoA6C=?>J__^R_ctb20d)nMt!~MX7;SLf=ma-&@r& z8#_70Q{3z;Vc5x0i565*D7nx$PIS0)5s*-@sliOpDao`b4?FPRG1+Eygo}=r8%9yp5GE74q3Zu574RcI5};}A zsaKq7sDoQ}0kH&FBSgc0u!b13HC(*F7pv)1epj}@q-VOA;JwVk07&n8h_yr_IX2j= zJXUnRB!*kV8Csi@$i9ELZ=}jl26#_WhAiLdBFk^Jk|kqE<%d|92&l_LlHsItRFgO| zhTA)#@2rgF5LTuhs=6C_4zVUR8l|)LlV%Vqt9~8{8y0Gc=h(pTb=SfMz2bSNv{-}^qP%(x09$}%rR5~bwe6s$7 zFFaEdOYfy(LQ+AblR>Uqb5M;ENGn|>T!Od~9ISTzpC`*4#3zq{eblTYAu!b;sHb!?;yjrIl>D=i@Zhu5khX`i?#G zSeowE@XPNK#K&Hr^kMZdbZM0jKIVLoFbJS=wKdi}Kq`tRgVw-P6eW3br)G&~UsvCA%P^ zg=?`{^_6NWw$S!x(jON?Dt-yx%4;FisA>PEpELn>mx)vD0C1hZ7rI;A`QsFQ;7KCr z7G;H@kEi=J>5G}}IPQ0NRpIn=xzY`x-s_EL5g@Y3DbzqDF;U#MY-VABpdfn%K0ui8 zPc2=)RL=2yCM6Mcj!u1jJa`$y@A^aRU^ip!Ru0YL)Ryuyn%B=F92uL<`Jz4nxV?p& zGv_sh*?6n;)2sQ~P~9)IiSz5bxKv!$aQ}S!Ac=F!WMl0j;9-HFb&Q} z&YYE3*JOZBN7pCWWTLrQQqOQ;#o&h+t?UAPocWt-d+Hf1eH{&5U7x>V$ASE%+0FVyCD%LGs@H~)W*t@o0rz?C~#8!*)|3rEY+ltQ+g9-lhyu@ zcl|Q9)Z_2afR5ft-f`gREmQx#29rEv!>q^W?`B8|-2KgPoen1lM?$-@*eX~(H5|gZ z%>6r<34yyMq47xxoE$O5%4~U8Y6dI&znina=CACnw<-Ux?n?WMZ!!%ZemZotrbwxJ zA^nR;uZ*mwDIX8H{cf?Iv?8P^$xNP_z-7d)Ij%HvYd%~#i=%=!Tn&kDmlVj>i6Y*4^5Ry2;}{oa*wX^ElM;3I<~Mgo7^M`&F;Ww3D$ zSsPQ!zP1|F!5TQhztzM08*1^@9N6!t7!MI=R9wTCvnw^TTXT}214l=8`v1U6WK?`^_zc_f{FIDg0)JaYaZAtcKl}K3*MWuX8TBn*q<~ zTbUa^Irwi!w7h%^mJM3rJ81=jaZO6Qyk*dg3J_x8JHry$;>pGwt`-{>P(n0wd5zHh zQ)l;?SjN$@iT+}2P+S67i9o6Uk7sP%A5^V>Yq24^A4~!FOa5S;EmWCdXvXwR8ABp1 zPL3g;m+^B^NYXwl^u6XuosW$%!OD}DiBiO00h6k#@({U!j`2m7i+@JL)Vl(bjtd>r zLaFde><(4X3@EEp7NQkWBo+0Ip{;&hW5@Vq;ire$($_fmj%O=iexS^mo~DX4kO56o zR1Fk0v1H&m2*?cmDg33rZQ?IshG|NV5K+wj-`u5hJ6_ou=BW1Y#|L_mo)t15;@p4N z6PJw+FQmko`sUzc&%x<%+MC&Z9hD$kl7ZiDzQez~62A0y&+>6|IG`~QxW+IJ)C)%f{}wVzR~JKJo_DAB7jtYc!bjtDo^M2QFikd;j7qvpK_40Cva$t4 z3+;O*Ug#9M=7|O_Rf{D)1{}A5?Uk~3Pi*bBd1*9p)pl_MR*bLAv!|r5oqnM^lH}03z>gtIYeNk3bBEXBYmG^Yj$BZ zl%wW)2b_xg@goD);Bbnen6YDS{!yUDMT0gO9Jq!R-qeL^r=u%o~*P$`>U@@B)_ zD)I!>uXWtC;S#|(F90*TbkLd1??QY$TW|os>jv&WK1>k$nu?}omWXdgZ`hBzj*c;x$917<~9p$x-V3yn3WN0TzeyL-Hy2QR~fqVCml{9WXuB7XJ6oAB^Q zRTf@%7KRJ5kU&Q#5^}}>N8;emgT;+XEp|c58Wh7y%GqGqc+|rtpE6E$LB_C=)Oldp zZ|@$j+!ls`w@_sVcw#i`SHvTixLU@xXuEHOvlk>gjC62*$FPj-9?5iUN=RzVzHYse}r1H07?ElYulA# zD9fP2U#pqwK{aLu$6&f_6j^8N*0h5VrykFJ17XL_cco{)GC_xm{tJq^a$K{5F8jy; zEu0n+XjT%8I9u_w{c#%p<#Hf9lLS;tw|lU}F=|>JM4#`^Er4y#wTnoEdR)nnAaQJ( zfYuHet$EFj*#Da&d3A?#x!cV>_!Q%1kQ<)?GRq$ z#XQic@K+$3R2(8LQ;2kGZqw-|JVA{j3Bb-B4O5eGd)I_K9zbTgbq*UMkpgAZJou&=T<{(nwzIghrD8nA+D+lLrKKnck{v7#qX;-?ub^1k9}?m$v2xt?wH*- zJilLVGNzmma1^qX4PzN<&rTQPW%zi(d(A|r0{W|IOKuN9P*)O*4fo$OH}QZUklgQ= zvb_ZlnfBxedoQjo0j|Kyetmq|nb{f{zNX6pyvlW~9mr^36h3fkP%hX>7$x*sE5t1=C#s|a(T_m%w({O^chol!>@+>Jz3rp7@MEjyF7*GH?o z<}$7G%pBD^8u5Zr%nfA)`|ZAayY+tz%WAm==RU6cMJA8hbXVqNF5I5`Jqs?Fk0>Q^2O-LTx ztXbbLzKOVIfJW2Gjn^73kIm|8S#fj0jE?Jp6CX13&B{%%V%>|t=I0MLp{%?BVxIWe zPr6#O$r5`!LEr)0j26{kd2uV2 zvv+W)Z?$;8!tqiDRkM5#?28ueqfJGS%ZDiofAe;dPut4S6pHAk)YdK1dfj|JYriJg zc)fFf==tK8evMzfxhN9rSSy+9lo3xuI}2n(x0ca#trEQ5RaD%+5V_;4)%P!s&CIPu zmSsv(+9SGTa4z_feu2mjy#@$}jfKU=u;k%HMia4cp9UZ)V4{+<9p(vOu2gNRWhW}i z*aGf}@Sjc?Rdy<6uY^2^SNP)<$ zfEzirf*sC5(?Xpm=_?L8*!3RC@9q8#_lKxYq&Y#pt8@n4{x7Wz09gPO!#<&rZVeZY z?0VYMnY`U#z4N|5HJQ4h zXpMU~U%s>-xlB_yQ!M8Busm zd>Vlg#<+zaCkd*oj$^9`jkf{uX#46ITAbcj_$HpcHO)rPb(SGhwM>htI)I$Zo#M3^ zFtNWc09Ue=^{2moEz*{m5>yvFRHmYvW`1aY5&}(Ul>a!~{$s}zC!}D?w%($43_;CLj(o{LpR)Ji%kaDuXHfH)0kgP)3UK4lZLuf zDzyJtLYneGw?5};n*7aBYhja4B~194l95{sG*3y1r?WuorgaO{LQv#>ig)pBmL`3P zqJqHz{Qk|!@kEP;r{=U}Bj{&fd$<#`+-DltoZiZ2lFc6?*Tz7njuPlu?KmkO{(6Y5 z&GL*NnDBQC1w{f=B6>s^p$Y0(lMJOqGP_?T@mX}(t=V`7yu296+l%?V6<=D8jJYD4j)Zjk%B z;~|0@xMlQjA^6`3GO%N-UJ}2)#C5vGpAfRpN5f<*?&C)q3J9JxpO9nJoC~d&)VYVEDTG<&8r{=#t=V0kAdv zHwOa{;uA*{94K#kT-ug4EQ57D;NAwQV`7BrHr(X4iIlbbu#G=|U*4`?g(fcTEM7Z7 zk&b^801ICHmzRg*_Qzo}=p|b7nPDC#f6|cAG7fKy+d>BXa}ute3d_Q_fVM&T@x;r? z!}6F+wxC!Nm4bR*k$LUH-Vi<6!P-P;(A#tM>-+K;ra|WqSI)sw5NM^!jM&^uKUpl=g$`h=)}Wx=4CTnHE3xhYBRLx1kE&(ZlW`~2F%|A~KHz&jqOw&8@! zCqN@Jh!hY7DtVjC0C|SAam~kA!8Mms4<4k&rXSe4mUiW0n`~w=r_34PRiV(YUz0N|_1$B{a~7)w8NDgz!nqRDu!$57C}O zd0xR$R&HMCMI%X?&GI}}>b!l~aPqi)_bHa_D*#2Iktv@eu*UGy6h(Wf=&6&;x)M;EXd=N0P0w*wrlAc1@wpODDAkm%uG;mCA)5+Oo#seMi23 zHB#-ozp8mxd3G?I%tKTOS7oqbypb<$J5pN41T#VH=o?yydUv`uLjLlb{Nne$sJVpq zuqlz(iQ+wziC}DfmU)}FE>i-y&&iHzqNMBB@1up!#z&hRcz7unKI94l4*?1U@QT~; z@~MdBglOJ5%ZN^WJ~;S)9{@lpXiUQ(%a+qDV)blB)F|EZx&H-M&pp zH|1J<{e%QLumloZAf~CI-Vk8(3n!UBj2I$Dz^&WDwtH7N@auRS|6zZ_FKjA=$zQ+=ZzsH`&U~id%dU9KvV~vXLszo0cth3NEU!hJF*sa*ZBYLiP=IsMGt~ zDud61RdxkqNPNF%zcpye`CegLk2SkbI-#DwQaQ6S##Nw$^>}8BYS2o}yFZy}VZVpL zs_nl4yLmnT#8bT5e-}n0_RZmCp1L|CGuK?q_tKOj-byXW=g%JFyq|uM?cMTyDPB5p zzS{Lg`NV%PUg`31L3ZU7a_q5)<*aBQB|{bbD^XiBqX_c=)e?xX0jq{_brsP+z=8>w0?1{^GXN0%UNY|DQ1dvg}<2W=k>3BbM?S44#Cfc(UCJO(K&00K47^VcfbC#!QqY2CV5a z2_70&c|P7gj1lDlg{wV$(Qzg#E7wT6)~qFCetcC-gPqSrA-T%pa!XGQvuu&{84{=S zFeLPt>5f!)Z>-M9#Ui?d=EC-@^_f-Vr562iv=_auX3@B&KExzFYJ1~#4Pe=>uVbOXjFi&-{Fn% z?WO)F4YY_-$aW#0P#PSAXq9{d7GYAB+T=kBQHh@~atb^gkY$shkPSp_pdCs`deu)w z%HYtfNB4}dg*TWaOjXXMM9pXkP@yKw7gks7d`ir9EQ_O&8=?rSY@twx(@Y@pOFQRe z%*PJV&=M=KiIh`Tqcb@AQ5GzXt3T@r*GQEb2;1joFqxUu;wo27sLD9`D=*i|l(G!7 zMPf%cp;a*=ahAKigb{HeIZq*xvCLYa5`Mz(P}t|HS)_kjEt8p0RhxfBU(#hO70X=@ zG1W{CL)ybns(xyZ_g-s$fln^c`7?o)p}HoV8uDG$NiIGG0QO!;;c9N8(^Z;n7_2je z()|vm4ORk9$3u5sx7Lv@?J(~qP?up|vD%)s8t z%49B*kx%;S=rRQ&r-55#GYxH%k1OTZ{Cr_Pk#5&xd=T^^_T zfqOyk9@7E8>%qTW&;OL}Y_AV+tY11ufk}YJ1>mvw^GJR>0}eB6UB`s4+b;fnKl~o3 zQb;%X?das>4OOsbij7$_QCCn(BMZ_H5>_kDR(*|`Be%7gOJ73am(OlFp4-#09Gbm6 zntMwAgq1~EG&@RTJ0lw8+Lwk@_e*JhgedC7l6alI(>(xG>IY#uIiEh4L=TfbwQd99 z7yG-RF#aJLIxRTEN)YVLHKr(8X;E^R1JV^^2nt>P=C{wPhmjD<+84Y6#YxSGfF2Ex z*iR5e+2JIU0kn%7AfND12tXAs-jmQyLQ5);d%7j%OHfBMx={y@BW2p8NlF(b*a-$& z)G)vafKfN_4$G{(TwbYus(9{1b%94vQ2z!&|N6k8Bs`PB#9VQTlb9$(!R{^y9DCVI z=bqD&EU2>nAFY1WLi8EHX>E}^sY*d)6HIAzV|EDiCz)G!6aYn&h1EjU>@E4_q+yWnu+TZf&!Qi_Gdq?4T z4`^N{PlLbV;Lxqa2-xs%>mN7RDpWnI26>%B*!F8fmFuI8SDc^TKGWQ0+>5+AQOh{b zdjCVyS#ZU%HfuB?xVyW%y9ReB5FCO#1Hs*c4DK2ng3I9UPJrNU0fM{3?end5|G=!V z?yk4$slAa{4O-ZB2yy{8Fh6fiUT)N{5b~ct%tFz*S4n`SSo)}_(mXG?-Kvi>>UsRr zG4o?hwJZ^q4a&{!pDXPCAUx~nAiR`Yw9%K1V=sa{cV?bFAA;IFFWTSx@ZSE_2>84~ zsV|k#gI73^mHX^iaH?-ELZ!d#+sDb+qr!35+VJ=!ySbR9k8zj#FAV>R!W^%YuTKVL znh5YVeJ@MIS0D507tE{gw0aJ6SS{Js(HYt~X!)+MJod|kUyfnc{?`Tc7oCS#aD;5O zIjj&l%@@N$El!6g#Uy&axwpcxA11%lKB~>T#a7-38!TqzKJvlBF1U$oN|Fpq=%d=$ zh@Qc*N+5-%%GsD944Mn?^#u97Y`Es_d?NE@Lqam-<~j1T$IgpYO~9K|!_$mmVP>ua zP{%qFUXHbPRmL90Cys$rXY3Zbz&t)jC1P}dJj^oNx{5~}Jzb`ym?1k@cv>xXCqb5M z4`_B?&({QmO#9z881Od-Stxfq7So4<0+y@6r+U~5sv+r&$+&#TqwY-4{)X&@Ue9s* zf1Mn2H;Df&S#y_Ne|zF0T1>Y?0HAWiu_PgV2eU_jN+CuHd&$iqGhimTA&iNgL~mOQ;+*_BEQNir@DF-7Qy5A9W0|EV+Ms zRi$7&M%@6t(L3f@$iV;FO(J1iM@TCvF!F#imP?^nz~hJ$4vj3oxn*F=Ibvf6s(Bp* zHI7=#97)AY2u2^iS8J8|iu-GXehiUlywXF2Wr!^8jt) z0~?NapN5i-WZqmp67$F-awVOjUz7}VFZJD{kP0DBO3E*YEHJa~2`SsubiejogumG{ z-4uP+;n9HKU0^^`sOqWv9q4Yr_0r#miMir775Tl9C>se@HD&TJI95ikyE4Pz=eZcE%pJvn^@i}21CTt-zAtYyY zDYhpe%JfTO8V;lym{1puF~I6WgW>ZPW;u8FIz3!hFZJ=M&43@d``)KJV)rXEbLP`s zt|rBoV*DQ*ablOG*D)!y$rnw#9vMcGzfEg#=Ki&Gyj)Ea40Cv_f#CAV)YP`V!d7gr z;QoY%3JD+G0rX=2fo8I3mmy>?fi=FT&jy0;w7Q}L*TQY6hSSMNN(+Xxe{=yO4kf|Lo?71wvnsEQ=T=EFPWd(Xopl`g9WEb&^2mT!~;| zW7|=-EH%#)>)>o-X9vuWLXr`San!A~0MB$!2A2~M-l=hkurf+>TnzmStOsj;p~-c^ z?2YKJD~}8@iHb&AYWH9R-f8~g@%C2~$!zEBa-m{#fWQNsy9}mFa@!Cr<*Ibou~pA` zy3SQnDwYih^l)e_4AsBjM8~S)!+tN6Bz`#EUGq4{dO7NT7V|s;>$Kii_lGWUy8n@C z!L+bxgaOwEH8R)N_f+!$u~J-|0w|y*xT~#{GvUp8sHqWXX6nV7ntf%RH1Nmf*U+Vb zeN5XIe%>#+6wHz5Vb;E(stm6ADh27kWZ3MgNCh9*E51RsS5xC_Lf`>XX>{oe( zgoOSBU;^ox;D*u~hlb?=5OHB5Ga}IDt8>UQemOaK*}-GGY*_T48WlS4zrA-pQW%<= zioZ^yUGx5);XX%$%-kpfNcbK%OxV+PEiY)AH@umoO<`xn(UoAhmOCO1E20JmrBO-O z!~zzWSIJ?}NCdghLm;aFBnkM1u{O~JzLzQI9#mEtT5uDB029(yTZ!zfO_)KKZ!S6f zS0f{UdTdYRyJ^Y4HiU+}aM~84xYHW0-q{K1H}<_$w9oDAyXx()JQE8wT)-Lh>|nZ` zl1b({?cug^FUk3mLrZVs>a)sT`j4>4{B;(G5F9U`Si7db1*o`Aj17x5czo`vYYSsm zC$j}H6%Ppn;PWlhejGs?{qS-*&8DJP^0o`>@i6Sq$hS1urA>7I{ zZpyhOT65*?8d1zlz{U-5fsO;Wv8`pRy#0a5q{^zQ%a`j-Nq$kX*F)JOH@x3^Sg@jQ zhV`vpU=hV=d&js3F#r_2H9DNTw;e%d>EpAC-JU!7=I8T}_YN?>fV?Pfz-w{M1#qH9 zr!ym*3_Np5E1UaSw`6gF!v+nXZ7CL3Ffhjx%bT{Zpf`||JO(};;&zvjCzX&a^Hw`U2m4eMXxi&wh|)9q%^3s zBF_b>r6s6t2u_ek9T57EKNu_yUi%UY{anY5312OepX%$wbZKK9N&=ew&cl(bBbvxb zPGkH`h}V7{Z%@Z9)#IZ{9-2%`D@U5x1VQKdwhn~b(#n7A>pJJ@rWF9p*A@8N(aXM~ z!K%S--7qN?8zyJYRg!rBna=ykt=lXzkHZR7xr~o6psI`Qiu_*jkC5Sjq zxW>JlMj&T&tIG;uHCN-)GjjYG*M7hU4hU3hM`=j~vT1*ERVk%_Bm7Mn$_ zVJ9{<0e>~mTt1P#38|CE^VjrC{*rb5oo&Ae0q+<0wslevvFpM5eLQZ7crNv*@4tfx z<#4k(xgUfqz-eEqxnZQs5AM)Sf6e8ET;4aa*ExyYz})TjL&#gYqf^Fs8e4FO%u;u*cY8MyOJFovj5_0PKL5|zC8Qo$b*JtGDOVK!cK(Js60JCgjKwbfQ$HWK9( z@E^Gga3R(76~yCr%IuK++9kui*_4Wxn^Ljesdkn6#@}X~DofeOBXdxv)N)5VUKn5* ztSVE0!e(cO$1sM_Ic1cru_vvptL$YRD+bv|?C6nYa7Z3$0$a5&<%Y=Q+YaW?#a`3B zpORhQ0zhnl5<_%yBMY1tin%RJGsT{0lZVcDwpvLLtv*Ok{`(f#sM*Bk&~U%p{dg;HIl@Yi-`J@p`C4xgrOx z{S=ACD5;d2>zD$}C0nV|{f$7P76E|{Mg>r>_CTW71MDxbJQ2J{z06C6b8?|J7wX$SAZ-Bu@i zm{+oTNB!(;SWgCv(y55Dtv-}_*ulSjuy)n4!&o#EFo#_)5xHVbC=Ixx zdl;bekMx=xzqtxohJmGDBkCFXMR>k=RGmBW*V7-?~I5>)P+2 z0Q*91W22OA>cqqZJ0IV$Gk@dcn0O%LiT9ZhtFFzDLJF)&*zOBgRoACIgtvz{(f&tQ zyst)vG|0b{xGSXO#j|5p^B~Hy8Np=o>F{P$9!_M;FD-}v-icIiPLZdZqYDdX;AQ1} zr{Q!lhcWc%CR9~id^gRgU#*r~9$~!%2kwcuUl27AVL?)+$g%asf%GW+yQafg(=}{= z469uqshA}jU(cDR)qeGO@c3^h(r^@t=TWjb8|wchq>&6(D-cn}yuWPx=GZjY{n{DO zj}_OQwjdP(o)tu!%1+=d5izESVqV5u(G9jJ4 z$1^cD<+p793>=Nw#&+ENo*@GHKm8C%mLf_o%Z~CEfyGOECerlRf3=OPiDA%^< z^6l;%0=#Aqdrt4Ps;>jjWk?Z5&35PD+&J{$-r8u)_6~db)FS9y*_!rAq8j6(bw{dV z$|)p$R`(}pn@sglZp_~DkZ9t}tYR`SJ`KmY;3eyh`H0x-oERsMNbhc(*i_h}k(H}! zRs^Xp-E5Vfc?Oo6I;vOZ?_Yc)v-s0)0s(Kto3Cfh0&f41A$llPG(iVRX)yD)fvI;n zU|134;G2Q^poPQD?0)$7!DXN5D_6xs+091pw6!|TY) z>ySxQ`hmEU8IL?Z$nncaSHOK5^G_{p_6eoPLW5+p^t>t#ALpPnBhOg7w9PFNwCukx zt!Wv#x#nhO(Y6+e{Sm6J2UBiSd1Bqe-RmT|VWuN>yRzxocV)a;0~S%6$ku32^iGN5 z%nV4%zGgYgt-F7IB~?~KT3w$}Z*9Xo|5z1#Dc#)YT_jZQ-J75$dt5GkxQGzzkt&oI z{D%QB12d%y2c(to!+qdGWC~;De9{Y~~A)18MycN43j&x@@brWzmp9Z z$3p9jE|iU{ZK(~6r=eB-T`ggYrvpD=BA0-ZUi5PWQOXqLZQ;n_x9?f@B|Q-kDa=9d zxAIG@zKPl_@)a%VSJV&u45gjM(%(rxNENRD8kgtLsj6OXH&dtp+v*}0dS^5kkF5JROXXc~-kr;P!XkIn&dZm0V z8z+}9Z@#1Gz@=pxF^pJU&BAWX$X3e8s#HgTiFJ2Scd;QKSI>>Z#(l+u{wPsacik+} zEk@3U_-rKfpIH}wx8HHIYqCnedC1^*A^^DpJzSWgk_nCgk+2_y7^NyX65wfGuUyyN zArx&L9UEot^sKDHnaayqG~=zmlUWNXZIE67cUrc1Opd(y{&o+5ciFqh62SrP)w`TA z;lB6n)0ZhVzF|7m8|D&^!~(9V!<*0WZ2|(lwN^Q@Ij6j?Tn$Ab7?b6QA^s6%6Q7x8 zTgc18V`kI!D(dL;cpKvV+wHt0S4kLm@qW!%|0cN^j#lMxq)&yXK_3&R_#7Jsu4^CY z@O#oHbk6DY)TKp+fyrV1=C@Rgg(eSC)hHP#fmY4`l*fK!vrzGe5y!TuF_v@>l7e$b zCNx#^Hso}90gN;18f3bg#ntr0=~!IC`$f5){|W#~TOC&8{%a(l%=_GFbny1P(fj8Q zw#3&#ubLEXZ0KCdC`P<&;uG|(0Ne8ejFv$xFr>ztrz46D3P8Scm zssO1LBRnLu`)Qo*xAmWg-w|R;B8|%7ypAG$*Ht^+O-+4d??(rbyV*>OPPN~yQkIu( zNIkbc5|b;NN&Pw46}vaxxZjX{JnnuB`|u&<|FZya0O!1WBn+vhp$!s_%3Qfg($4VW zonqo2<)2V68~o^)rpCk3HISFnbItwOR8aX?lq=Qz&%8^rm{fxw5yM-ngf88hw|q)z zmIA&4J(OGL$vTPYoR7li#-wk(4!2lN2zFbU&db4(h9Zz~C zY|HLfMOOR#iL%h7IhF}e!ECwSpUl=;pJLfqf4T;#rGC<9l%AhcQdI@WSptp0)){#A zf6=2b+77uUG-oMGzFf8({6P?XC3~x4X~QT7F99nh^1o6Lhw$~lfz)6?AK22B^OJ+M zL18XfXuQHbamKzNSrQxNzYAZT+r-;4F~@yircm}io3-nF6~VU3l1?P4;pPb#Bw6|S zg~f7AC`|)9B>)|R>*#Cl$6+HF+41H7*#W`uSGDCsVSkG2nbLc$p=wyr*I9I-dE(4Kk2M_vFrUlMo}X zd?;%%Um~igIVRIn@ub)>q+=Xfr*E7 zv?#NM04^X`T)M8@&3*vnV!1A&PZ}@pYEXB^<$X*x#Fm^sanJXQzF?*E>qu2i2a5J0U-9 z?%yHL>k#1fI zrZxgJw0{^wX_OT?jsPV5Z(SsAeSu9;IK69G3np=p@e{SmL$OE-iSg)sE z#V{)G;{AQWmTszPsFZEkF2PNUGLETN_}C1$El(_|=)lojsesQNbKYx1_s&b0;$CY$ zw1EZHL(H+o2IUW;$U?h4+fY_yB-fAVTq}ewEwhv(*hYi-%Vp%($O#ti3QpMY^75vI zU<;L0geXq91ob^k8y8+acYdzA&kUMM>1qxzmDS7%L#P;%1@tu2r+O(?1hY%@>C)HO zK7n`5Vx=C#-vb6Pu9`N-UnUb_dER_pzLaxs3<$M@Log8@2cURyzMp4(w$fC~}{3F+i} z+nUFwUrTkgW-{_K6)qaFWpWXiCgnGy#O zLt+bmuhjWEaK;2NpRs?re|X(|#f}rbVt+p%^9x79+x+=Yr_%Ej@oMBJJAaqrk~O9Z zF9=pZrmVU0(ZjXOgP>q2y|Xd&&L9SxKNd&y8uVgd_lg_4bT%y#McK!`=Bgv5tI(ic zs#g`eE&@9gET2v5o`(QcP){wd8LC14={R`fb#0)UY6bNU67R%-*`eQv^`rB?(nJ`3 zHnYQ=jX)inKsq5VXS#hqxT(0y$Z4k?ru#7~Z>NyVFEi3Inp*yZ)a0jjITqSe*>59U z7FN>%6{pWYt7|$M4w-1*8~5aV!ZCL zyMOV%{N|4CP{n|De&?B0LQY?zp`9${E(3q=V3YWb;h;JoqJ`-`h{V^AcDD7p%!v z=+aGdC0ff7%BFKRN0zT}r?6AYQ(_}BkjKJi3;4yn-{igNbX`}GUC8D=Vs*XmFk!!j za!0dUDA3%{BjP1D^8wDiAL_*U1CD|;!>$7@Zn~!_-X{g>SHi>dnf1x3sv>W~h4kLX z8BNUS87zD8E3yUjU|OzBHC>NpEyT#rX;AqJnJdy%7+n$+?7EJRLDE5ty~?g~m2r1pP&%9#+zAQ^)C7GoFuyOI^S+PPyatzV6Iko3It64z(m z*DBs2{A!j>OS?Y@uVSwhQ3YGG#ftxJo=&ix0IB)h$A6195L(@IV_<)VP=c_)I&Qm?jG1G`_M&y#FZMsA{?#66mcL~6l#_=iEHzbxnPk+2y$8itV$+QOL?f97 zXEVy_e#0ZmXNuYRz2E9#l}%Lg;GcAONV2v=;?x~&(EZ<9`}_4xk@hn|$Yxi`OH1$b zYV_y(1?)lx0wNk4BXW9z8%)@B(FRQluB2$@O+7P9+f48zZ!Ve3-3A;1G8gZP2+%M0 z_xC@6UpHkxEQFYQdj~&0>cZ-(@TCq&$LN>uEHd4AV+>g%Cl+P7oc?q8`}eNl`vIzA zv(wc`|9u0bOKJ=FRQ4|WJ1{E5LPOne>#CshPs8lAwBYB5AX*X}Yv>@&;-BPEi6Ru9 z?1VeR4v5?;U+K6AUf(|Clf>qn83qXatqwi?RgeQax2SJqsLdKOe+id1j}^hh&4581bj(MS#lW5wN`Rs zWlKZ_mP^3nFyhrP^3`^bov^N}Rlao2YrK;VS@OfbTS0I*4s3M6&lzhq5exP+Fe3GQ0lAKkPaH@8lf8$1!i6Qp5JqyC8>g0}m-p8P5VjM_Yd zu;^6KQQ(rjhE8s<=h?T2jD0Mp$<=E3K#hu-`#?HdvE!y+2RJATkB>7cDW4wX?+$tv=Y`~2;styQNn-ELVGJh(fM~vdY1}=B`I3gjEX-O#c#M+s&dfeN? z@nBBpLrVe`badWN!EJGPf?C4L4chr%DmbfQ|>Q2m$<1Gh#&oxT? z2~r<3T6nGP`*TBF(+$GPC-HyO5glEAR++U~o&9ud;(|Xk(-Qj2-0O&O^Kr@pfD+^1 zXLrWw7zqq-OAe>&^M59k^^7$`qVJ3E!@nx%ArNC%V5r9w=G%Hz73GOFL;%)v*#Lmn zN708~G_{y$c=uii(Wyh<8cmds@O26s$j&Bg^SN`=0+1xk{1j_qOuMTmeBk#QSa{-; z@O~Mid!te9c$a^>e}6Lex}Dc~d}{6r(zmWQ=ol!g8|~$y`^wL*TteN-u6CPY@YUP| z^B>%Svn|Cp$|CP;LjS74o3~G)!+1w`&wCY7qajF2XU3lq%nzRIT~ z+wFd@GN!YKA7dU)N7k_;+NK}QDxkmkl%^;0b5S#9=Z8w^CzsEV*#Z3ClaopZUw4)O zUi`Ea-I6g9!BvL2xd!A2Nm^RkyRYW1u1NoF@zcwz>$$!>fWrGpE11TUEk>u@v#Kh= z6oncX_V(*N9tL-lBs2;*3U;f1=tw5;?bq!8$kivGPJTf>$@@DOaN(2vIz{CB#`c~~ zq*J3`;WJ-KOh)U0hS{E0x-R|bIGk6}(cDsgmRqzj8T~ksNO`O)3?DU~8$Kpo5Bj3BRaI<)(Q88;giG$Yh>RbU;@o z@9&1sR6KG-QK4vcp_*R7Iy!>{@ib?V@UYPe-@;-m$s^P6vuzIYQnZ36qY?U)3$0BFoO&BJUOCXJh&!?zpIU>MIjdG8MX| zEW=wE%LGL0<7_qBEBfxDPT8GSATtHAad@+n7?PfV)5~=xobRS zkqxx7q~3K~<)q%Fqfw>ANm%U)0Q^{uy}&=A=u}B4czFI(kN5TUZR8iz_ufMFDWGKB zAKv*O!(mh#OC#37`Jz?u5L+xStf+Uqzn)tGvYMAcW53)Q(Q9QHb#p~asYfc-kzZI@X3u~TwX?c3(X&^HaAe;o3w2;e>Q$b67fgf z{2pyPEPj^qxhVbex%NN~lK2{jA+?F^IqTWeX*GRuY5YPDv{QZ51}bYdBork(chrh7 zJx&fGl-F6TW%bOh?{Cix^+-r zib2+|^nWdgPx*$ny!Lagby8`*83?CY5QGJ7vr8+486$uiC1c6Kn(^*&4NxXBjuWJ0 zWWZzD8PEg2^^^Jj7bYNt{96)XEgNA3NXshiz+YwhGWTBC(ySJw1SpNn%#zp}LmHV? z;a?Crcs3#2Lo- z!E-<6N>MLYyKfmpuja%g4PhFEj->{FEV3Dp#|lnl3r|6qY5=XP%>!xYsav>ER?94T zR5G}VrG6G22T@FqLdEsp99&tWL^3Y5bnl-R%5%@@=Q0)2=KWl~`nsm6s~j4A;tCO! z96`xSX8pCfj~OHKyA;U;r+2jaSrsQ@-k8HF)bdK)CrLvX76}P)m#CWC%+jzLZ3}+6 zmhh&|#FN%b`b<7sb~L@!70mvo`|s#T=3n@5;*2rD)*?Ic&7Tt#=4bDhkJ z$(~G(;tH*JLNN5R?Fvm&0{*fEb#@h>ZKV?q;_2vh(5B%8e9J;0Wx&=n@x(Nm2Z^Mx^=?^&=`C+alP-U^OhB7F$4Wmnxdr3|j_1Yof^& zis{4oly!ZucIQ-$|CRAor11m2Q5pWAUlI2Liw?fQaKCycH<$xk%^bT}#4Zk&VSS3X zrsE1xQBhI&>LLUPUh_6JT}nz;5OUf&UEc@X;UV)jWn|WeXRN&G`qCV_xBvGL)GSrm z_Rjo|5z76K<-aPU-gAq+(-V#b$1CIa@>Fa#TnW@Re;^5UTa4#)ANm@q6N_szOq6I>h{xOha#?ltHg+!4U;3fil z*~N-!0Q?oe^%r{P4g(suma+?FnfvN$4MZOqJ%C}wmaD(LGnn=L`D2|=C^sIz3z9k- zeIkoY*j5&s@c1zw>($=w`CqzRpnElnAhZ61d(zpSD~m)T`6r15&o7QyhSJ7o&%kDJ zQY6UZGsO2{RT+pk3)O-#U}iZg(N@>+?JsBlvNWw>@~ju6mF~fIFy!gYnOX{(wC!_f zqNO`P%38h@IQEfsc}CZCx<^J*!FldjZH(U=Kca5>yd6`&vX-Kf6py$j2bp7Qq8%f* zQKdSvUH1Tm%Ji$%s0>EzLb6xTIe$9yPy+jM<@L%q+f@Xxem7@7`QJI*>#h~3;KSG6 zW8v;_^%$TPB0(pO1L;u3(76Ygbf1dqk>U^9{{WmO|3?de&>&lk=>iOm-j2w+2mbvd z!Nt43o<$4j*?e8cYxR9ZJUt~nm@@neEUWbc3Dr*zv7JjWU8>qeF%6Vb#juN|n6NFn zY37fNIaz7CZLNJ3HHMNWG3gcD83=^Pt3o%;LO@D%)I_edQ~65^c1h8)Z9YV?d(O(L zLQ$l0x0S-%7>DoT(9wa*+T(YzcuUlT&R%{fJLHCzS~#YlsXRHCBT!gYwjk4lXIOwhHEG^UI3mP7m-zVypQbR?Jkl%d7;`iM2p zNVw(@oVM5Oc)K(QJ6|Fa?$e<0B^ z*ntmXGGtT>gDAyW}uvRXfmG~7H_A0x~7x1B5!}P94Ja~l~ zi%Yg#m080~bCnX}JYm z0pD`NEZI*+(bXB)h&bLyo$e>@yobTk3`gy9&!z`@_)npQ>LK%! z?;b7Amxv0BHchA+3NR84>l=T2BhD?ntK}Ime-j8GR8tX1ry__D)9l&A9xzPhijH=c z#&M{l;ooX6ZFGd4(<7c(KzQc2COS(oK(-`ByVK|j%s@&eCAsmmLK}|pzRMj#K?4I7 z!g1#_){xAs$Pi7; z=wZFN{LQN2({+F)^wv9@#@A8>B#`zA~uJ`txI0 z1&)O6adtAQw5fAgbcLT3YVmRXnsRH?2Au|J#t4RyxCXK{x1aw3me^pa|L(5vRgcYV zSu{gsV5$X8HQCB5)~B(v1Kk8O=m+u7RYs*N_87&u;~21j@SHWD?6bD>V;|0ocZfpO zRIQj4lKf8|R#;X1Mh0v8v`L}nR@YZSFXEX>n93Sv^@^}$i(o7*xjE?J8FQOZcW4Pj zVO7`1D+?%#IU4DVd>(G1k3hRNCM2Sy)#a8ZeAPktsGvwTW1o1Fuip<27rr4oe3wcp zTsu)XHldhhL#Y9?kbCTUc~qmV|3^JLJoT?eX`UH+OYSIVD7h}zEedUpqXAJ3QvMkO60iudSp#J_xID(#N z2fG{zdlXi5q(bF!4W_ok9~NcxA#@ZOB~_*CpwiredHcHWK9Q4PH=jEU#6 z2@pP@24^n~6e-M1L$~Tvq-XE;i@pCFn3nzjEP&#T%*V9qF7bdy<*zutFJ`LOWMZ#k z7x|?dvb_HiT3{6L%=<+bjf7PDLG-XxW7Y$+^A+D^CH0c9CeE^~{Mr>6CH1a{<-m%C z9MYZ_r2pW^N;m_=lAfow4jHKlAU#%_FHkrv2t3J!B&juq-~KEYeW{73LjcknSkI_> zj@6-#R-dG0N*iK_*tvM*(RmYOIEiEM!I;6d;RiY+i2S}M)S!<+ngv&=f~%IbenhhP z^%H74yC~}H!VZ1dflnYglf$tOy7ou|cId$M zC*ef`p=J~f#4F*#opvoo*4D@bRC=A&ZZ<;~igH0sUPl&`))9>A@dcH<`BT0?gDaB(ZmlP~K#(SbfCy2n8^x6T~=2ZXup96m8xC1zVm5A_vTm5fLhDX)zD)1@R1`iX6CuH9-XK3L7b|>$ z&V%K8IwphXq*LHS|l`ZbihDEP+_$Q60RmTqyfD(71 zc}Tqu3IT;>_+UuH#cQCpT^}wcp(I1afQ@*zMN7V_t|fo9WCGC`P?!qI?Ylg#FxD7# z$ZWRwUaqoTU(J&|spo`n!A^sIFYz}PNm=z1BjlT%s zlK!_x+-65(v!gr2<729+JYx!XYBHZIP_A%Y-o_J4;@b~3Ep$CiZf?CtYFetaaE%ZQ z@@uFRY(Wvjmg-qR50BA075%c(9{S z(s)hY?%lj%cg=Lyk?wbdUq3EghlJLfL?j4OEc1cyx-wwpbyON7wQ?eUa|EKWPA_jLpJJ66%bT;9?x3_7~Vr z^@)KKVu8fP8pHji-jHlz5a0wuA*`aU>AE8XpsnP$k@8JKhJDUt!zydC#iH^7$s7tU zjpq%X5BTT)FCgN@i+#4YPY3=Ngz$Msk`XNj+Yz4A?W7c1wY*COcHinvC+N8jf%X$+ z*~3R^M}E)=eZOfaM)=wuvinn`9?Mx}4TpfhWbJ0Do>TqY(N-HPK>X3J5O0_-7|^St zqoq9phbMmpDYdgs@lyr|6)NB_%zW0)RcOEEYyEZHD^V+S>NZU|P$?6V8eXm|xL`n@(4EeQO1r^m&B?m)EKWk)2+C9r?k^axBrQGPa3AL z>Wp8!Vu=O%#@V_jZh;#L#P}JQtc(3smA~p3K=TDQx2v?H9X*Dlh~;DPp!s8m!9;vR z9RGd*Jr=v7|67H(P0DV1(MC*P+u`4T;HM8}2B+S7)* z5VSpbTU}34$N3!9l^k}pn9+4%NP#8JVkSO%x{}df4ljM2jMc_%5>8$utxiFD4dU@C z+bVpKVflGd-^2Y}9OOJ!8kLp)ESpw!4oYS0FmXAuFwKab#qzV#cgB zZ802a&fxrV#L*%2-IRu5Z9$dJ#|o~G zW{bLty`Rm!=RR+M5+{&H$Kbyp7S$*D7n(&;QjEG}YZT_7R}DE#>dIv9;eP_l*wvi6 z^Pijx(1r9A&Xmk-z#6J}3CYpu3YdU^N90wwtt!zcQ9dQBvr2t z@?M2{~uDN+iHbhyRQvk55$dqDM%_)-1xd5m$*#7FF=JF8%Ca=wYF`YtWi|XT#^b*r*2Uk1f6#J}TT^BxS+CHF4sf ztG|Lm4#&<|P?{1d3S!e3ZljUA!@4i0RKkyM9@lhvkId8l?>KE0Le^Cm#N+)qySFk7 z(%LcWu6n1frqnwuShvk-W^0CJSME1`>-IhCo9D5j1ZHLSw`v{>1gNXu`{Mnzi?e7B zzkOzeDkvEEk*;@`XovTu#JswPpD+nKxvM7yM@d5>arw6Jhq{JFTQKBvJp;G$B3-pD z=P)^m_*Pq^a2}-_h^S%29_%6ZMqirejdm{TCUy;$zxs?JyHKT`x`aEWz;Ai2$EO3) z$QQ%^&p>?iAMD~YgLI7$IbrONaKC@^@v@}8KOCDCx$#~8?lDYt`^L^ga8OD3heng= zGW64n*Eb5*H?~hi?lr2oTRks10mAT3ijI+2bi1~~=mg-~Wazp|si|#kodnuwxtf+P zF2QJ`TgSF_jPr8&aq|&QQumYD+XFF!Ze%8 zAS^k!e3Y<(D=B@RwPXT+s5S>hJ(iX!rt`oi@=vT^07Rx0$~>0N7m-0-!sH5h5oHAP z_`)ri5!4Fa^|W`4J+!xK5hO;MrULFdv812Q#z7Q`i2$HQ7;l(E3e=%PSU4x4KLuB41J0)w3>5Npg2Rb(XwkY{~0rU+TpO0rQZR%b^E2+ zux6lFIB%ODW{JKZSR#kiS1Z9G0|5|}(Y_~UWB}*!lEw{fyJ1~%aUQU>D8N!Zigz$udv zUx-TL0Xa$=H#v`j9aBss@KId)hyG@U-T9EFe$`m|hS77sE<&NII8Mhj4rEb*)ra%; zY8-4uCi=GOXbgcdb)WsuHke6P?q#&aexwb|RBQ_2okC8jh`7a_#OGIM%HoiPHJ=*y z)k=?bnLC0RPk$JyT8Xw=N}oiq94tdDl?^u(uRCu-b-yH<@Id$D;(OHa#w~iGsZ))b zDL0|+UYMO%8PLOAYXOB=HmKyL0X=Q-`&#v&mp0HruC|(kZnqaaHd6k*B3Na>M;^N? zLbs5@qytbsft90+Nhkj#@6M^eD}-?(Plra-s>w9cnLCWq2{bJV+d@s^K1=5X#p`H9 zkSGfnZ&Gzks;O-{3jEozK=ah(^vMCW60wk zy#6iO5U-kQKF%%lEdVlc{+8iRz5gz`lr=b#vTozw?RrM)BXyQxo~U$I$v7{QVwU$uGQ%hBLF4NAX>~edUF2Bq^M|FJ`inf| zSJW5gGrKc_gp9iN*A3SfXUf8_EH+Aka*3Z4M@L!?UeeB={TOAf3vbj5$mL~1Uqw5O z;syt4+#_BiZ>tqDQOa9BcAcW5_Sul1s-s+6(-+mbq;+$bNyCdoUcMeFGlG5EJ z-QCjNARyfgAzjk-ZQtYg_znDkJ^Q}yYpr#zeOkNA&w0GX>*p98L-RDULOYXdZ8C8Q zyENu;#&V{g$Rt85Jh8eoC`eINw%&Mx>VaLuJG{iaJ6N#1X%k6cDlGc7JH<>7h! zW@LrXUrv)YoyAe}@d&l|PWFY~i6%{MQ~H&U9A9$u*acQT$KU$b_2fJ+3Gu8?0wseL zla?Ne=<%RkD`ZGrU4LCqGYCKrT2@Q1rKob3^!_%YMICE*oZ%|$Mr}%9rkRin*Mr^T zL4XBWGv-c9Rd2F#GLf8@+B3hH2Xz#3levOeBiB2NuwN6{4^TmEiPW>MeZpO}Qs;Ij zne-yH5VRR+Tvcc_SS@+x3$^FLHc}07dZ?7#Qy? zin3uo{|5rE_9;LI@O%!uU0OTa-eGXmZymkudiBlrd$0~5-#oq_^0@6lhpuISK%mXL zL98{0=He|T(L(OV7g96?fIS4bqHJw#0q~WFAh+n(YkuRzEiJf(3n!KlUTg{3ka@VN za<*uQgJIhcFVnfNe{Ukr--ov^m!Z`cTW#S}g5GhKIa0-JMKJa_+l7k}LL<3l@N?pzFoZti9E&#bw%NQTJ4iBLb(edB&D{RWAV2!TnbX!P zp#?w5gHBCHYajkc!yk~wSd9@;dXGox44N0SmZFFf`cPObsIqa3S(W*-DUYk~DxlQlFTKy9jP}t_v@-g%oSgl^iRr)hf6&or z>qAnft@=+-Svj*F6edAU zk-pi>)#!aef-x5^e&j_I|FU8f!k9D~Kezn z_rhSY0AjwW{VQ4Oy0jdZMeEV2Vl04he1Y_&C1 z`Q3y~M&A}e8zN`k@Od8BJ+PHxL*CvA?FNb~0nK_iOx?!XI*eKFJ0*72j7?*U-!s4E zWTvsde-1E71v~n{h%E@y79NUT2o={%72Vcia1S zb07V`0ZlTO`~D9s{CyJFTveufn9my`8)q?cLwjaA{TE{<6#Av`XlB`AtM0WOKDz?7=?mrei& zQUxAf6HVkO;0Nf7gz{2@Vq|>CNThc1`pYy>RcEeiaFyx7U}P>|a8rKfL||fYy-S6o zo~bp`Tk+eB5;5YN%%pslZ18%CmCP+css^N*+bpMa?XXHkLC@Iy)D-{)}nihzmL>NjS+WAidN{KOKT~jM8s-);$85$AEwvAk^*c@ALUSaP^7iEG=n+7HDOWRa=mQ z8-8=4lFN=CX;v>Vj72UOzG5~zZtSI5W^X+-+WP#RmTu6Ym3-LT{5nMHZ8tiFLdy`H z%_W!qC39OghT~)H=Ne42V8TW242#mjM3Y|v-PQ2F%ReY)@=k6%p1m-2`oM%W z*i=r_b3q5_tx(jh{R6$+}CUM1$nrCPyA$8 z?C^UQqJ)PKOHHeQ{YJ$EfkZa`{CrE?VWTDbY!OIO*SK90=n~&9Eic3203pTksVP8t z9|b}0B%$9)a`#~ zU4Ym2#?Hfq~+Munk(^e9oA+0KL3}8fh6D1X;SUfPI%JdJp zQ~kQ)=yG=RS&uQXp_Unc%n@=04xdI`L4)oxubq&7OYGN{<%!YK(jF*Rk2R0pUqrM= z$m`{>X@yvUtf_*6=lQIwre{ptT_T+P#}yYXg%SB&?7nRc7x|Mr1&deN(FY#z{W9o=-Cjez(nC3eSj4@?+jvEr$7*RB3L z-(2?%LOoYf7a_D1&DWq9gUoOkU-u)6HcGJ*ZFz){5D(RA*H9qB;05GlW)cAs4w!4g zYvR26D)SF{zcZ7a!>Y8^fPCBF%?&B;f>9WMC4a;iZ37dS!)}3MOfK)@yH0)2fhyfS z*~^Q6-|H3nE4%Q^v@U8NDcF5jeS{n|a}EdBC6!EL7L25H3Bn(WqvtZ_kSN76Mk+A( z7?90Yxg}8ziulSqrYtGTij%!>jKqh;&4nWMDc6O6rZ*d&HO}8I>5F~}b#&yRlgSF} z_HX9v#KA0PjKWw%+W^bB)S5!+7Q-fcRh)rDLjHkHcoq??=)pvtEe~430bH~lqDoUV zv|DWhtsTb~X+zkp|Lbj9mM!Ngda1h4j4Zujhk+$<4gioMz&0By{It~{P;wy{3OpYe zpjc``mDHM_UT{NLU)sEn&xp&9RJ?3)f)fN5(-D~OJEwrB61XZ9XM2UauX~09?|A6V zI1xZeZ)^9L_M?wrcf~}AQwv*{m>5h76l)V>(vG8U!8{V%*Je|F6lFh6vb4^8>BVfwr#ySMEML;DkYFEtaVn2(0NG%O| z2)?A@-MT=n&-)qz;E~GF=a4 z94lQo>bJghxn20EbNF0mZfGnQPAQJdV6X|nEU(xxGYfNpQJymXO#k{P% zrte}8O%P%bM|-5>mz-lP0C7m0On&d|;9!~{Q?2u8d<+Y;Ybo3;Ivh_h15TR&QiR+P zMzkCz>C71^)`$1ZAG7*V;BIc3msUDsSa1%gkNYbTGKIa9ueRY%THkpEexF}O?U)ew zZS&!ZBR|1ZgFrGF$;fBT2#=A*$2WKB`r>!UGWJ5Y{(|by)vG+TY(Xa>j z8RqD14~ckcRi@&7f|L=JhHBXRL~}(IP~oq@qa`h@1TT9zyHW-pR%1w+Th-Pq}pyLpZt{Zh*TMzaO~h%)9KRf=imKg7qL6QHzU|nFE9LGdc$~F z0_uueElZAAN+!Qcx@FEIDlz&3pSMMnTZgEld#Dqa6d$+ut>e`R06Hlq>yjy6+R^oY zQGifrX$uYBRAwYDb5K~Pne5(C#(b`YpDCPWm-jIbI}nos_8rH^T-Q2?qVDc7I+cS! zh`YuIWL%26@rK48x$;*bAFL4z=Vy03S~PAfb^ZZ{ zzDvXR*OsXfPR`~Uk_brBAF;IMq08_2nOzU=!WPD*;rn2OM>K1Q)7~mpwEkADQe}-d zJpq0^^GJTZ$Ds?o}KBZko207RiSIswy>0M#`7jIu~w*>}Q#aug| z4Jt6$Zmeiq22M^So3b804qthh9M_y#*)KfrKY0=5Z{2mDYa-K^Wuq6DoH_1rt?r=; zr#eE~q*u>mPc*u^#F>Jg@z+t0pc`~vL4vyW_F<2@^J*pr_l_gbs(&tH<>^n> zhxL1UGw;oKfiZe%^3hf0tj40u!8t85mrfLyg?y1aG(PT?_u>Y=u(wrf8+%KfbRK)# zu!_k^stEXEA|s?I$w9sPUM*z3jlOGNEAIazu7OXmp4SJf~U z=8JyLsjKnAh~H&GRT_xK>urAZle7CD&u4F|YHHgCq;)eE4PWs$Ht+Ebe#~V8oysDM zc)dWka*W{xFZ6~hinCu=*^dnv!QOcK2W0&y^NN;C!t3-|d66=;{wqS-7$IM5#HrR!@Jb7v~BkYaS3 zd0L!JvmU*v&|DO3v~il`7(N+Ph1F+1zr;TGVKxzy+oRKnu8>00&ezC%V%pG8uX=a? zHxovACHZwpSG#w29PzXQvJ22E&-=0Si4UO92?nYR5AJa{p9yVV?v7PdRb2uD4D@9A zQxFCqSKZv)XzAz~`@(vt7)5iK$LtBT?Ztjahcxx4{U)GvSav_l>RtUI|cVzYsHTT#46M<_Vvb`QuK?3f{ zxYI_N#b!U@S43L#t>jhAxDM4R7Y4;*C#JBGLR(w;FajRNnUf|_J@p_6AEGsN7IE=0 zxn!6n50mY*-nbPa=|GYhmM<7MK7ds=^O(tYab&sz@Znn+zjjOB;o1}`G|u!^B_^hE zE#xsfO%r`V4 zA{3;nBaU~qIfp4Ts>en|aGfzDBqr04U+XNJPEB1atKk9~`uZz4wP3T1q1=XztuNT7 zaWohOU;eFoBIH4)-nU?zL%ed3x_^uQ2ZcE={nFZ6A+QSA-a#(=O)YDd_}>;mA@Zo8 z1(%=^?{R%g%Xian1=Qi=Y(iHirTt{ z@p1W#@Li?*?qCjvtWMSE;IJ)e@l`6%M97%F6#RU^rr;GW34pB zVxMj{cRkzxv*{KKKU*UNzPa|w0=lyde6Q8L*4{>w2uQW9WnWg7%`tYK5$kGNNz8G~iN~2Pr30bPfNofA{p)AP=RW}2ztRyigxznTr+J)B zB!vc==qI-1sTL_%_VSsLHil@`5YLYyNF*YstA@?5jk~mpEH+yS_=9nCz4t`0n@-eFeXEyLi-T0yqi72Z}9kXbu$-|Q- zBW@EwjB6qid>&WL)cdShJloS`Z{Ts^S!K`xPA&$v@X*U0S)Yw!jdGxcj6nWQG=D4A zGRHF-5E}x-`dVF(l!TwTguVAk0JRnh0s zvtJIVW$7alD~6$;hv=i3gtW62L%^GVGB+OA3@w3a|Mk%D1&OTFJ@5~k6msy1S4lwx zz4#uU{$9HM=~;AXGO2hafhS%}H8ZS*6=(3lZi}L3x=uniY7bCYx$3+E+>+pwfHDDAf^c8Df0 z$xve|&>ZV+839}X;;AXl%RSc3x{Yk>ZX#5J^sWj0Q1)6Nm49!}jmm{QutG{l->e=UFHk2Gn%v z?Bv-u&(pVlKo8tz&)bkbiv6ja;*~XX;0tR~&G~HobCrJE;KtqBM*fnW^L73$fGI`| zxhgtH%`#^rh?R$vH}KhV0h)gkA?^2j8JPm^(E!v$53m;%%AumS{S%RZb|ff}7UJfa zfb8vE$7pG5Z%tMb`w$F84wW(O{G8CGa)k?0LX2Pjcj`HxtR~0~NFNFTxns>FDD<>8bK3n!sPL!sdUb zhro@|qgaDm7}jY$^)fE&evi^m7sMOpwvLgXh@f?Q@#cI)rlnEai5%)y7Z>_}7w!+F zEr+|#j+7aD-C1H;#pLS5X0>(pF7R`J!q=*O1BlYeCGuc_veCnsG9WlK{Ai8lDlD>NQ zw3&)*{?L7JgZZr8yo#iv!Pgq*rrQV9eE5ZONM-Yd581-)A2)B_stD7!^fS}{2|EqD zhVSdD!M%@&XJesv9r57(vF)W+uAZz|y~+C~Ym!6p*A^SA$Mw*{ou&UJ=ECVUZzN7s zNCXddO+9g)JImIfR}U-#&2ln(b9_m1`AS_a?T5N(T9OAuMZ+R2?>kpCEeeWi48k|0 z!|%PnnIGtot-l2)Td-*)r+3$j?kme6k4aH5I7^P~IDk=@b+`Fx7Zn81($JvssQ7_w zrjQk|InEycL|6oB7`cmm!o=2!RG}W;Z+%g{yXsezNw#R&v3RHso1$~U5oG{T ztJPIPvt#~f&@5fb1xU1-tgg*Fqj1-gKU+me^GN8MVc~CtT;nBfv;gW4_uDC50UGb3 zY@&E0c?JJ$$&6*@01qka=fN-(d|v1_ys7oH&D6Fgk(!NbvW>!%j%nHXU%?o|=SITA z>j#M_8|;v+284=*BMVOwt4BoR@3KvCm&<}eGra2i(H@Q7-2cT_EXKrH(=b0C+MB6T5bt!)J<$%QX*pX zcb*DWSA{`Whez&rBafdQ?1v%~MSknW_loV3c8*7isTl>S^`d@B`@vE$s?ePSiR^{9 z7WmCSmI#J==TC{A#kyCoZeLA(9+Fe~ENi4&LM?_U3qq^ikD;J_{)wbt2h|r%vp@|s zg=;h6z^?<*u&AjJPykOd_!>$22h^2dNWWv<$igC7qiv|S7gTAHz=q1_a>@+sTM7q~ z!j5Fwge^lR1AD&OE>vB-cx%#Lee(siNn!kUBJqdFC1Mu`+w$fmpvFkoa)24YB4zR0 z^dL1N^YR7~3^XE1)^~AVkn)29>357`IaKQpe*5rWfA#uA9wrWsQ|e7eDS*Mz0KYp= znd{J=3ek?I)&2F!AZ+Y zL|cRQI%TpY;M^7dD56fpV-GM!Yra8WIwNy7eWbW;%cvMaZsrIq0k?aNR=0nNE}TbX z>Kt%-`p@zPzG|VTiGQaw3Xe6J3BxUnkt%3rwcRtzt0OEnJ!Gx-3gqVQ4y^P%I{)3} zv-cGOn8fCJNZB|!#Z@dkPKS_eER0CyPZm70f!8KAeK|a8;LTu^?HBL1f17T>skD>v zA8Mj1dv*?j|48k##Yzbh>;P)(_|%$Iuzd)yASo!T+9BUu&{HzOOKLz|%RquHQ`fd< zs)vjxd&p;q}`Ey%! zlek%dKOBgU9^l%=bYniNy0$g(qZu~1!hYv+nV|w?3+u2&hmv@F7{mGIn z+b@?svaMuNl&IG-izd?)8Dn4#xzR?&7BO?2uC?*(8fcWOE9MA&RybHYI*r9=2z{Ra zYx39E--`m2i~ldF7KE|-(>0=8vwG&}ntm)Ez+A?e4n+e?-2v~jj-kOpg#F1ZPCSGm zV~<~1+%{Qhc-HAAD|p5PmjFz>uA!zsOx0p|UKmu@(L5&iv7`U^SP*OrDvfIu!GD*{ zs^zfoU6J*wk{Rahe=VNvyQSK2_`$ANEHk6G`S5<$r5wv+_Ut5I<2FCyc6w*Ci?sc( zRl?(fdXe;7IDw{?ix+z=4m^Q+y|s}g0yL-a*xpi#RYpm|+8tdGKGrs7E`9Cue@eW6 ztiDdt2ryKji0*kTj-Izdh;6_McueV^cb$H4Ib?6|5C-r5ct&`<_>Wk&Ufa^AX6n87 z=Xg_!;`vEV9v*2N$-j^9sjcOc$v*Y%@zK|gV;H99y5y5?%0%#jVv88A_fT{EZV0z| zEzCW`E*2L_m9n(*A*BHKQlty;(%NqFN(I-}H1ron#MC!85B-l|ih^Gxeo3|2YOeiH z$fgb(H*#hBu_0{63sPi95AjZfwMoTUuEcu?n(!X0R%!qdjFNEa+nS-Y1g598*KKsq zlTgQt>emTdJJcK5paL4z0-01pC!`?hhJ+tf1D%QlT*!NSD~P2E;Oa!JUNNIwi7+he z4DYzyV0cXQp5H_XWcuICKJ9JXp=%3r4_Td2Q1Xm&&_o52%f^RItn}S7AsTP}6!KIt54TO&|0LNTt)~zGkYph=H=B^{HGVP{Gf|WF(QK9i-ZL3hBq773W{c60!#?+$05Ir0a zDJcYm1Bj4;T&P@AwS0>!`5Q;Ib#=X_`$|_`FH^5n9|fPOU+;4KBeJ62S8(rHYX}C- zQ(ON<3i%tCuxC0@co*FFtE+1G$y|64hKajC9gAPctxz!xRF)Nc++V17-uAh-UiOiZ z2lwFi%aRRo?&nU;$HpfbYJ<4;4bl<{*)^;EzGK8MwZ6kk zj>e>8ND8SPb6enP@r5DmD^_3ho9-{IFB{qV1_md20{^AxBdq8LHDZObtam`_T*c}z z3C(Y=x9Od%_IBg4&zJnM=GP}npVzsZX_5&Qe)~+YR4*RPgzRADZXN{d-=%AAYH8x! zxm$a$rLG{VYRXWR*b*SjrZT82Ubvn7E_3@Oa1~Ahx%tY3Wi>3?4CbO-omDAUlbpx*} zVe%4He$4_{hi7Y(%VKS-L>?_;d$$SmsZMZk zWC$)u@()5Y8KO;r*W)AE)KyIybGzCkKwi_@SlpV=dOSWpP3Y%K7T!6%MrX)-%PI_w zGu@xO=+pEUBcSWI{)Ue@3dh_m$_lSZ7Twa^(NlOu!Yb^NjO~K8fnKAmTu{QnW8AHi zJ|$2lM@#mmz}){SvW-@4ypGw9qQ@08!RY6f6C%=TJNM4Ol%W_xJT>$W+CzgS(1^Ys zJ5bLA3gLsP{m>6(W27GqnC3OdAyrPXK%%Zpv?-kA4PRPZH1hV&0AzR#ZYRMEol4{0 z#CO!##9d-kJ}AX|s=P#Y#Ff-w#4ikAvB-WI%jnRXDNFA0nP*cm;WAHADbVd_WYQP2 z6A)JA!_Zp9r| zJ0}2VQZ(lfeyo^kH8-yr2RtsE`?e8lUXU3GQbg!!ou5dZLXN4NXeB4)jL+6{r==>I zWWEIKNVvJV|1|`MQvxORKz(MUl&RZ|+l6nA6G(j1SerC7l*-K=ZBc8(!rz~aB9c6l`|nbc|icRMob=#7^weC}wFD(sMejw~r*< zuJ50p$2M>Hd4~%@LGN?9I5{~hNDTp`cOW`YUk$t+w_D$Q?0WK?pPz5>J3*+{_x)-~ z%&Bp^8QWtdQMqJnYMEi{eg@1;-)YRis?|KT9rMf!r;g6guP^@htM4`M$6coC+`N*q zPFOn)(~7oPS(!1U8Ir)k%uFSX8GyIUn70?*2K2@I-)ySe>`+(N!sRRKyFsVKd70NA zhd1LwUqC&>2aR{W`VrbhV_q2$pB{vzPJ35He*SiuBnB9YVGmjcBB?kPw?9{ZzQ&gG zoc*fbAD#(lps%(6W{F~FT){F$ocz_PTm24CC19nTiO`I~;>vf{_M%R|T8 z8}0=L7gKXbZX2ma+&kbjF)kC@P_Vt1RtY^*pOXgldt-=K;1Dh_!c!4RB=ce@T-4a`_#_e#U7z##o?L0{| z_QP${{RVL81Wt8az5}=_hU{SYDZ1(OAJdzQt8h0nsKM_{Rh-#CzYMhV=Bzl}ebRd4 z;8DV%I1qa`#B_BVx)kMa6He|iqf>Yc?*|bGija&G$@AgMe`~cWgiwM_2B8v?DSreh zn%^DlbkigMl9X8`%SZW!tF{y~6bWMwRFNs87~1%_SOe^-^4RhqHV_s~ct?jma2qrR z2>oj;4fFr*nJDzB7e?VXdQs&YPim!?1uYVD_=4{(YF`$Ock2R%8Uh!P&oy4-QTsPGANq8CR{~CEx&zY zx@(aH(Wg@2{bV-_kN=7j5V=9xG>T#BgtzY_(cYt?z1ONlfN>S&P=m@c4bp1!KM`Al zd1Qa(i2^0{%?%X;u zBMw>Fr}r$~^Oao_A&MHLZV$WaW28S%uykG(`wwPi+!EfPwRE~>=%SMX%*GUty@TS^ zBj)&is=*6HX=I%f1nW$nJmcr1re3O~KOc!g(nb5H(51=D!}!4}wZ6$2B*}Yw)-msc zMtd3cAlj0$qSi@j`Wflwxnr3X-&FvDCDZZ=!nYOb8bP=*+9cBKCWW7^OjfuwQw>b; zRg$)u7d`7j7pJ6>LLx~4W}vM*ykMLHsMMO9Ohl^ftwY`V8f+%GI4vs+SYjj_IL7#O z33s3bVPMl5f!o%KhE)qj2}8xvygma$3m}*QJ-~b@l&XIjKh-ATtaf;Zj-?1I#3%nn z4+S(EDv}5`kV@IVG)VsUjpcM!X5fd`9NhEts!dk7qohpv8$N>bWyT`x(uZxe@yrb{ zibELE&1q?PPh-9hvM1SO4NNjy#*mp7(Q0q3<#k_t2HdW>O)n?quYm0Z|`GQz)(O`3X9WHRbK@p~^U5|=OEH(q#s`l5%B8KFN?Rk(Of7){_s)C#_6JzA$Hmf6%irIsktPHm zLIEi03?Obm$^#n0A|jy#dBOI{2mr1=wt%LPqfdGT2}pu!TcmR?xMCi{aubetCE~W; zqgTt9DR&l|OeG=_(kl&^>83;!Zf)96_oQ;$2al=6AmO_>hXPGn#Xfni3QD!e{Z z%L1*%v&KhTTNIXxhUDRtWl6Lr^W%wRhl`~3oL6@S=4G^odIZ41Yr2@EJ-A%z5~3+s z%VyB&lNKZNFkCW@5{MzPoY{3pU~4(K^(geuG|(_#0TLFiUdUg{?zv`?@t*lTmjSqk zLd0yD7YfzS02PQI%%E76ZR7wAdv=KN^A{Ge&jnoMf3TV08`E?~T{X7=ZAWaq;>bt6g+qGn@HGingo{T0-m_iIzW+fnz9ykSfx7U5_;sX-&H;)*ws-Ob7~?fe-R7R8n;7vo_YZD|qm?dI@70Ci~5b z9vm7*nY8GTPmePT6@$D7u?j4K)2Wqtr`z;daFzJey93%IeMXKE3kH7KfD;ASkAL*s zODjI_ZQ=|ie~O(q19xrY&N?h4;)B*f_yO<6_pTB&T#qC_2Z3!by0~b> z=uih;%zm3)uM*9B$OG|I?j&bW%cXO(680 zBrF;9Np0p&4--o^D)dxg%b&lrD=wd&5Ar16_uLBaX`Zd`9r@qU^v?6Y&nINGsquE| zkB=z@E2$*?AvXpZ5LzpyY?G4Y(Lz_-eRG&{*3GgBw+o`Uwk(miLEsVWw-VVC+77Hl zok_|n8CXGBjVt{pw13=u>8{|;B<Btbfe&lD>~rnDN(g<)td` z88v_1eb~TrHBP+lB>lO-;zxei7Uxp6w^rsc{T@OdObh;*Sk&t=ChbmI)7mz%(Dn4L z^JNhKf?t9M(tsA*X@M3`y4v((L7XS~j75XpP^EpRlA3v(L+71c zHpLDO3r2tFdUADMm{HMxiWi-+WJ})mav7g~a_4Ef+qprwB|YO{ zApyIOpk4!}3;?b1L95gj0KJaZQF(%dpc;04Qh9Ig_DLAe6Hl1HUw#Q!zw-rdFZ z0xO$yA|H$t_D_QI=y!iZ!Vlcz;QvtXvgNR6DS18|TR+)N4i^jZE$&Y`jrO(o|ET4s zkvCBe&{)c=K>O1uX!ttHWOc?)8`6zQt>6Wt8ca~|`P5hL8(tA?gqy3|&tYc!7mlr$&OjzVfzVMKb zn;?uvK-}VU-(w~nI{y=kqSP_I-oqNx)a3a*r)kxsD=$TLy6z2h-d0rI{$aglC+(%) zwG!;nkuHH_)V!Ei>YQ2+WVfCpPa<*RD;z5s2le6Lb4@e;_`#c8Z^@UN6ZKc_*qmNOT%`Yluf*$X_QNkM`W zhLP!dO;MYPyW&V>-IhbCM*u zd{Q(XXKC`ZbOYMoqLsoqXBtG?*7)w9GF^OLu5v8d2sX1ew}Z#NEO#WpMQu3^b505N zEp*;|0&?qssw1FnIVwrG3bjsg{S@KA3(AzxNG!|B8|ur*-)g}ddiY#4%ZH}~qCqXj z_Ir+KZn?S2adx^w5MBI%-OT3DpFc!}hPJ-n)4>AR-zVC$NX7h~`AzPWwe zj_evkd}a>4k-*S@T0cWBqpLD;2Hca(hQ2QxV{4=d*Myvfh~_=xQj1IQN+YcnT^ggRco_iep__31;7RHC@; zb20Nuh(n@EBG&W1TW51JSUf$Y2yf367V`p$B%OB!QK^DV?1L0RJ^P&D%yep4XQ-kj z-^*j^f2T6`-F&o`Lcj1=N^0x+Z67u@QHI4!E+O)2ULjXj4qK|; zTt@m~VV0%ZYC2p@d!KDxX8NhlDyt%RYa&TX{IZ>v`KiW1T15=NVPQL?_BVP1w2OIGcY*{4FR^px_%ibPKp2uf(gtPGmSEI3glZe=n zs42<4ZH&cZ41Q5yeb|B9?~s<>8d2tmqzc#0@|dn;4P_pSr~k!8Zy;IZ5(Xp_H8gXEbmY>D zxRMp0rM{@UPD{2mizQFBINf7iRSeqpLnCYPa;c%|&ZP_Gp<1FHlS;1o{jGIw>7GKu z#zwLX=S^jy(}SC3;ZgZm#BPgg!aFaM-=!bKw2q_xP@ui_1`rwK&_v$WePYYG{O2Yp|^pe%Wo0W@=>S zVR-09Y+Z8NhU0w7&}C9w%(qa9rz?<3t-uS492nauAo}s5lT;c?B=oDLOoBH;1B)cM zMTC=BQJJzJ>4q>RI+R$z$9bQ$%j*@J^z0bAhvJW506p7dxp8Z{Pw>B%Zr~@Wz{VNO z{+|2nmosA4tE%*Q0LTZ#>RWJ#6t9RC}on1uzIO2{fJ0QxrUuGt`}eDq-Pw4|NM zSz*`om$Zn#N``yCmr%ZVj|EwWUR3mNt6;$$wKzW$MJa|}yX;$YwZTK;@o7B5zQZ#j z@~y7-q(?FeQ{odYROyw5T0PGK=X6*xYqoJ=%H`xo|A9v0X7(b=lj@o;hkE)lb0@!K zbpOy7)P-<-Of}~_u@G~BS0df@`Er7^asN`iFxte;ti4=X)$Ho>O-q$Mkj*w#?#~tCvn5i+9B}FMS=kIk)OmAzDBq}AJI@;!s* z1*+DT_XZZSrGnV|#K+d&(>%`wd80Q0rSj&246)7{FrVpq@i7#-s8cC@1 z&72)3A85hQ)2NTgEK5L{G*wW?|L{IwSmyr#j6rk0QUbKAI~OVs($`2Ad; z2y0Pzl(lu~Sw2ObjZiwqdWZ9pvb0!g=5!P$oc`kJx(un)qO3C7?JinHn98%ZwoaB! z@SeIvdvUI5HQNL_L?GGQ-{plDUZUNti-@hM5K01qPNzpzdd5|Sj8BpKh#$RmkAM96 z1MX}~g64U=hRTm9vr&C+J2^Kyw2lz^cu}qeT`6iKg;26KeK?O^B-*f!s>+ZEw3L7) zo7E+>UI~J*%|Vs(w?F;~@87!3*Z$zk{Hs6y7c|mFjoF&aPzzpp=^T}_Bs#%qg_MvL zIZ|nK5Rg?BMtR~iuFrT<(rUFAs5D7cTCyx-GM+J;W;o~A-rnZ^g9ki#@PK>w?lGNC zxqJOVT?ARxy(M^wH5Mr(QtFfQd_Cl^2gi+OEs`SY&*ZZyhu`gPsJzB6c%a7SNDn%Q z2&F+FMXLLj(POpA^-lb{vUqwiw{^?S>lz?e~H!g z^H?Dn&ogu!(Ov2B`qP)VdjB3zc6YdS>ozVkeC~6fb$Ya$E#fFZ1_3LpYs5*4^I)B) zw4PSG%XB)WnFKgzsj8CMY)YroW^ZqoUa!k^I>C6s&D%Gz-ceQ+onDusDzVPtyhD0% z5*aw264b5J3(ke97sq4wT^z?JihrZgKzPHIk3Qz_{`#-^(f5AH3dp)u|=g#dr>_2&e zw(#uP3&_ebFmozv8IDKXyM2dhmenn<-Z9JPOr~=l-M9m@oXKp${&>jl!9G4O*nPOk zsbWH2&IpxftmFMTYPmAvCkej8w)XdQOC(lg6}L4ZvW_ z84c+fZa?OSpWNlcjR)Kv9x)LL!WiQepvenEQpT9-kn?9l{^Vc2&Z%CH;n5tCw3#7j zGr{{AODmcvEjSuJ;b=6*+lWZ_==2*138V3dB#DuVx^3~9rzwhzIIc@B*4Iw~o<<{O zHk&dS9MbJ}SX*5`iGf*L$Ba*kFPtL`>IL%PV4t0xZPwP7Sv$3gwG~-5V`cpUOUuh3 zBu_u{G#4*jVs&+ejYp3-I6UCB*FVq2OPA|N?IO;hgOF?2Z}QiF^DTbxgExtM!rA^) z__@PdL)wkl89d?s<9p;Xt({fgqqL@~EQ5nF4H1kg^w`mI zT!`>l)|On9M}4+s{Ma!$8jY~mw`plbGnAyEAl4QwN}QWfnkf&BVWb6Fq!EpnwA&*| z8-y|-l$vx{5J*Mb@4~4*cVe6+>h{u4GgH`&|WrzjWiu98S42m*z7oWy`?w@GnQ zvQ-oXc~&u*OqtE*SnH5dQB{VrtPnzy=NU;^OOmD}jV6^fwJUo%1K`%x8+_~U z{*GIpe!^-P()JE%C7Yu;+cSfd4G@aK;eh)O?lCyrqmf4RdTru3#2WWo5%=E}zmK1l z6V~H`$8#cDddg=zK!o7MwCA zdNRb!j}Y@IdNxJR2Kb{fhmW^-^6(+!$J?-bfZg6q5dtE*kU`QkCYWkTdK+tn?Z*G#?XHmfnABQwtgD;=5q;a%pMg2{|k`*A8A`YV8;ulwowJHb#k~F2)X_MzU zQb@F}MdT<9iQ}Yp1(qdYkT5MOt~}h}#~**pPj24kZaydLcQ92<)H}t+mtR505lR|% zx3(A!$AnRn)n17Awb)$076Prp-#8__q0wwI8Bdsu#&p^pnvDkY*&Jsqm!COLoJ73% z!iz|yIkk3%Mx(Qct@ZIyijyG*O^~!uQ3Dk1S1YqvJ}=bwFm z)@?@989#sb*HniOX`~6O%d50{UCjGfGV3}vKg+* za8-^kb9|K}Y)MhMlQOL1%lu~<%ECezHW51Jy-#oRogco%Tfh96`s{XlCzdz0if+)ZP zUI=s$k{2aXX`J_jI;7uUTC~qP#^Vvf!{g1zy#4mi`0;=KXP&-zo~JHcWID^)AB>o1 zB@gf3=E1ESxW*EVM&qP}<+Eo90J9Kpe>Y|D*}dlX38E*C@IaviSYru-`q>wz;EOLm z#eef({}FlR*?aVe$dq)_s747UkRtaW zjt~x%ObMa_g~A#QB1Hr(tcutj&A7F>O|gG_!KmxweT{hXi}R({nka41YBmW%Rj*}Q z;jFDO1WJ?H3Lhz4AQ5aa99_!-Ms&ZM~^m0)0j@X&0v3*hj;GMYj=44 z)mK>Ug&gcWq1i}@l9Zx!+_-gzqBLlsDcz7DiBLg<$|g7)phSpP9wkeH)}<`6qJ;S@BcB)KSFf zs!~W1BgrtXZhV(Q5+yO-8>H|!Z&(8U^_SkD6DWj+%7C&8y%53-HTPP1kk%6lNvI@M zkux41@NjrYRTU^*8#c7oIL`v>QlCLvtro-Kkg_aD)5ZcJ5RlD_MTY=Lsp@heV+q5E zAP8~JbN1|cI_)lD6yu!7S?WL6VeLNb&S>^lxO;cb-~9a*e)RShW3kRG>M)j&$^(R# zP|2EGALK}B5Tb>U>mcUH#lY4&U!zaR8E@Z57DK!^UaxgMAa@=mJkoo-GbC|~st+sY;JB6>E?+} zP&Xvi-%AuGcz0a%TwzR|`a-xx+AKp#0iyogJe~_rKhNn)&tg$%DN#7Gs(wCnAP5v_ z1yYIyO2xp!m8^rXE`LK}MLvq`Q+GakR^XVraVXS319MbRgxp?k80{HHCzstAZe3N_k?(x*~uknR1ez`U)R23^L zDjME& zQ8@`w%D8acc(}y}AAUr>u#elSBGn3QOYCI8>3)+Z`JC?RGL3c%<1DcX+1=V^t+&M9 zqb;UauQT(8hqD1U#=9ISi*3b}LNJ-mP~8@tmS(LjS#5aw?U1D1;=l^-98US`kGA;v z-5u^7jlPmAV8`RkH$EQ7j?`oQVQovzV@{*^3qF}xpVhAo0}WN zaf6p%_#Cl{D81#ymtNpYue?m(OZ@&3A}gt~3gL4SELApRR%TQo1dSMBEkS88fg+4z zN@Iz_n5wL8|8WrEtm8lZ{eNWZ@nas|zt7;{fY(0v3KGHJ{>`^IIy~aig>%O|W}Fnn zQH1gWTU5kSlSyBTSZWbB5S}=|$#snY03ZNKL_t&lTV;$6w)y`5^&j}z_x_Qs+joh) zKvWg3DoB!$v=MW9(XamWfw5G|JZu4=F5Q(GsdC!YfCoVfgbu{{mhP@WNq? z$7FMM2K)4v&Z1=lg(XfZgfhJO<`1}i=LySaE^+ScQ}lc5l!c|=>9f4Df(jI?>ua=H zODe1IYI0ubJ7pWu6!tv59o3RJl^BIk8kk5|8M`6o1Z*HG?sYf z((|;m!v_UYd*;I_2cv>pJG&qRYH^?NNW2KJGGJc8-Z10+kMFUub%YN>+PyYmD8ZLl zQ&Q$RK_qe3gV$&gqh(aLIeLS08P18{D$6-OXhWB+i2o3}ooD93c$ zZG=+@7lLqP*&HG2jRZVFpwU_p1ezocNYfDSE%W&VV~P_8l9B>z4Az=Dtm!PX*_0yB z84ZUt8x7L5$(1YDXtg@@dP`^>qEtYm(IScx0u|8dv`H6^b0PfV>v^=2q;rcij!{t} z(-<8ow5>3EJG}F~?{MpT|3o!>M5mw9S~-QwEq*#?e>7w}tH`ZFsQ@7Z^2)QhJ>crC zN9-M0bh^e;w}nSwC@?+)${Nlt1yU-)U~%{q4o}Siw9ePPmqOu8S;yHHsD)z&?eV2E zc8;6xU!gl1kxp~AA008--l3IGnC~Bv&-N%M2drqrDJsHzOf^5Enj8_%r!YH0cyLa$ zzda^WE#?LaA(_lFes+J0Pxq%h$Ru7hNM%qv>8-Cz(}YAy!_rEFSHAc>MwK{MqD;-r z4s|^su+DNc7%-lUNz;U0zl{zgN1&?Bs2}_p6k#0@4IOK8FvU@cA`GGfqim zK$<3~BqC^~Xc>^mm@>#QuEJM_I0#9D08^HjsvrynlfodwkhIgOogk&58#idH2sfOv z8LjZoH}3QQzW)*byt&OIBdByrN=&QN7zzj+m!7{w5QlghgYGagAvd-UFozjBZm_i4 zBWenquYV3wY9tXdsH5_EQE)h@_ojBQL)wg4J-tfUTqbEPksCn}r5wD}@UB8@u*RUJLJCFC=1g5q zmI!hou(@G=G$ktw)-PY=Oq3G(l58^O?ybAL|K3N$VT`3l7<}+>$~)H{@?c|&cC*3y zYL~Jc6Q+`^8ZxZ}MksXLq}5%)S(r~I#1XXHAu@BsVMx+QP;rRYg4~p-Kocf0>q#5w z97?J>>W5)gWu)B(%WHiC!D4N$FLA~?;vggr1H7rgW(cW}Dg+Mzc9Gh}k(f zqPw)p{@wv=YwOIW`y^?Iu@ySdC?Rmp5(q`0Gz4;So-vDyup`h4Ybru1$tqL3>}BnU zkxJpbuSE^#klv$}t}jnQqLn7l0p5A=poC;Po?xnyswluYLM_o!P!%~UlxVF;qJTix z=hQT+`Jc{M2Ii2$6(|P>qY>lDm^=UJhqya;8JI)1XI;9T87ut`(<8-=TX!hEAPQRy z$J^Y!c8&eb2Z(acQoBX7m4cui%6MpZJCw#?oI@(Pz#7z?S8EJ~HK;(>>!+`ojY{j9 z^XuxyS?>%=N<0!JAQTlMJLH33{e&x5?vfuJ(N99!aV?M_9e9UE5Mpbmr4)5}$KvPU zFgRD?d_bTiF(sm^IjdFB;>b7IoN0c#<#;rajH(z!joy*2#5s$xp8x7AU*XlSeu?XM zu9H33;LP3>ed8g+jSY79pU{i~>};k|=Bu%LY?nXeTLpR@HqDfy608 zJ{_{$NVsz6m(0rv^L$Ld-=fOr+`91zOG{0zUU>(#cc1L>1I7=C5CsWI7*k4(lsUqUz|06$j8lqHHDyp9@ZBGG z`P(w3$D(d4*8Qm`QsY>fMGT{;EmUx<8#lR zrWMX;HP@+x=C8i>T}Ce9(o0{$3C(D7L|M$pXBnMViYew4*{qJ2#wk_h5i&%ZNiBrL znjq24$_y_c3^leW>U*mluS73caBUD6zrjjXf+N8>I22;bmeZ#~BIMrqQaLPC{sIM5vH?mf?IIUp5}B zhaie-RMLEo^YyUG8c&)!zVXIubejP)GsjCsECZAh6sADPdLZm22rco_k>@k!qXETu zNHd?%D05SdvCa zOc(1a3^`J3v`7hsB9=KxFyYRi&v$=vjc@(*I#&)1v$W3~i?pg25w0#LYlbOFv&96DO%img&0s#k zx)ms_^+*{k_@EkZ4aQoYefbqu&pi#Q-oJ&jNG*{Pyca-#^8wCl zte5o}Q#fRx>$8cLcyDp0M0i7}K*k9{+{V)(FFOp51basrgV~rlC83|xdOoz!d>KyxfL#}*!muvSQare!(&=>Rb~?mKLQz&svYe$(m*L=urGAern-glq z;n5+7gF|lp{2fL`MWr+Z5rwhjl|cmot!|eB zxV+=Wt($!R``_oA-~1*U8ymdw#v81yt?|)EAMxg!Z!#DRn2bkk@9Z$oGCI8;^{oZG ztK*{csw9bHqySr%Nbi}C#{A-~xA^ye`IqcGxX=FnE~csoBSjL2wAv}{PK!pPc9UXr zj5QS2p%t_n2}Y(|-Poff{;kOB@5Waxt}ZMv1|;g;5FV{O z##ii3C$!rwyr~GKCzOgPj>&R^7n-vxOIQ&ysvP(B2Yh`05mz5S;qhp~QC1*i@O$_e z^5pr30O>NCan2w8;S0pNAPf=&k}RLoYql94jcSm#Ovp{jkAHfNyBjm^+~4EWf7bg(q&C zqR4B3Jy0~8DXmt6Fbr_cBc-C*Y@)m;QfhHgsvSiriHZXny*4^Xh^)Zn74Q7wUH@OjBdE(2#3D&Lm`=F4xq*}V_r}?eU4MZV?C$S#^TtgcZ$2Ri z0@hYf6UA{IaV!mSoX|)cCInYLUD`S(79o)g2$e=S zM^#p2ra*{<$}4OXQneE1X~3?mcuJ>KjA5)nr7t@5VES=%i{skK03PaK0 zdmFd7H=VLwTBbr_^|9zI2$jM(kD%hzTAMGt{t`-A@@&p%JSGT3&YwPqQX!pohi-QX zYXnDwF-2i$qz!cN8wc%Y%cYJToqjQy4}uzlQ8OFE6M%Fa#{j(Z&O4ktcaAK}`1ZHI zO_J2yovT+rr7R1QBxX1~qR~j{blQux5Sq;tr6fXt3hK4Rd52Wg0-Kgh$`b2pH_~`- zpIh&L%;uFF>^yjcEgZU;(pX+0NLu7aBYaVCRC+e&78x|^4Y(>nc(hhjRmJ|nKKJh3 z$Co8Ki0F2^D54Spm|YxQ>i5ltn?F=k;?E2Anx_fljy2%BfQs6~b#~ zqbVD^I~=%*?(@&^+E-QyV}(>Xm7P$T9K1sM6m2_{)}aGkUz9UL5w_U7H=uhrr)yH~ zL{pyr;tCH3bKd^7r4$;WX1F{AH{=h`r}SHG0zhkt3N>LIp`|8}8lfWMuz}PuUTV-G zUMos#nPeHREGTDlWLdLn(?%PcG`KSw^2?2T{NsDqxbb+C-C0JV0<2V2u5KYl*6)~1 zVlF)QEGh^P79=&hP=}hs|BtXYd$RL7&;5RD_{Kf;+>IH;K!D&pSUi*^%d)Lw9oxsL zq)w__so0guRsM|p1*uBqTqPH$Dmf>vr0gWtk!0)0ltj%UK@uP_qX9H}9(VVizIm;c zi*I+MK~c%RAqbF--n-Yg)_ULfd7j^1kL~UO{bYpa`LvrY0;Q3rLb;M*GC~Out|p-$ zu6w0DJU_scW6PVUGcHBF{IFG7)9HmfQsErt&q^uqd`%bx1im2fG!lm?bL{w>4?Ioa zd1$3ERZ5o2r-A25j8TjRLmoeQ%)`Y;^oAq6xXJ9o0zn*6RwYR~q~G7CEHZEgDeC)J zRaiWwa8h8zIHtupu#RRB(GFvxF#w|$f7JPPg)Q-8pGGr63t8v2AKO>-_*u)c3~O>c z&qr&&E+-`To&r%)7AacQ@laZONbOTvg^C(j6|lZ@z<>Dr@A7xw{Qk=trcvw=m$kM?6SJ}IluVP_u1IoCzgV#(8CoYlm@9~4LL(nDuuCNoPe>axK@`5 ztO0>RxQYTvr9u+fU^`bVZjX4daX=~kXXly_^<7ZNqk87z<&#WJPtq}99;`66mvMRS zBwND+@=&ol+M(a?GaU3uMkz&A4^LZhgDNi=35T!}DSWID2u~s?*m!cEo#lrVyIYKQ zc4$aNU>)m^9&!7lPZ;iO)8E==BN^e8PvI=5U%1GnYcDf(`V`^RBw@RSs4|+J5Tqe5 zGFr_R?M4S%)iEO?Olwe`svUMYDQRK({PqFg`M>Y-&p-K$wT(@*iijF5DpNO4#w!tN zT+KH?A#6pNY+k2^u;^1TmXc$x@cE)a|i9Oc+!pg_NM{L6aI&>=B3W%N@(Ee0Kk6wiLhr^*=)B z26hAJ!S zNW55+<|$cOaR2c#x9&YAs}xbtA@tiUKYqy8+7io;9xylE;?=7cYEX-EIBSr;haUtS z^b+y@a?l05sOydV_nynT= zB+-8TSr`KtjaCu9a8#us%?o@bQOdA8%GoU(gHkaVl@z60&ApJ`C! zC25-1j!Y*gijvKZ9TpcKBX#r~RPHc#<9O86;lCd${A(3`eeSgb$2WiPZ6;$MBP}Qo z?KDt>{e<$zd!NOc8e$3cbLIH~(=#&&<&otj{b9mzlu(u>!dX1w$X$t37LEiT;3`8| z7;I@!!r;qVU1+T#FKf!Wbpq=ol}oXeKvw~QkoZA`@!`o%!S#CyfBO#~ap&OvhP6{FoHRNlqO z;OKdJ)=+fMT1)nDtsGlJ;+g9p4kL!cgq5c&JbwI`o$Vc@khI!unym@aJjZECQ5h-> zGV}>r5vt*nRXNMMUHXF|%d6`IVaWE@HjPHiy?b|=nw&tQ+1}b_b!DB8KmL@1{XWJx zJkKZ3$~u4kO8|n$84bsw#b10$r4Y`5a9q0f3bUtQz@U(TbOxmUowbh;0;Qh^jvduS zhb{>-@b#~8;qnD0Ivvo8hTlMc@dG^i!P~kRt5vOvt=)aT^SvK%>&`v?>|g!~ zuf6&*WtkH-YG_iHriiIYiYjMfb`qyS4Gs|VvmA8ysFIo{7X$%Ovq7WXLi-*wZH)>W z>}Q6>jcsl|ddic{eGYPqQEkXFpw6eNtig?Ql@2dDUxc#!mTg9WDGYg@6Ne$Mzxpa~ zzWF9ng$NZ834yN_S+~n@a~(e^i2b-$#W{%mRt-Ta9Z~Efr5jsTGgL4jJaGakptPpG za7%$7)ZwOai3U;j0y7v?$W_Yj_@*=#Zx4(rQZ zsvP1>iK#NGGQ(Cm#yN~rq*clw$;r!- zrgBJEM-$+{DTNGTwll@j<~EC)J3Q&`v()X;HxBE^Sglddy&o}_@Vgq|fkoI7LH&?u zCopA2mJP^DLBGF8t^=y7pwXG4NPOP^;10j~Xq&_YSgpap|MB;K$1gtoIse(e{tI5d z`ZAchnKkGQh&uJO<@}|~6j?%PN(M;}tsKs#N5#wGr6LFdf*?5BWO}_3u2)f+fH)4v z`Lnf3PAi|`V86~D417v!D5?@$fKURz)5IGp7H{3*$-M`B{@^}4yE~kD;U)Tmlzx)X z4kz)$U>wCzqNPWm1&v0d&Jz0nVHBiQh4y2LvgGqSYiw*BaPQtSZ@qPm%a>ljl?6yh zvmw^xND037>chV>2eD|80}LjA8TuidsS5kYwKo|7gJ{T zC|6M_MKLa(lO(~EJ`&5^!YPChEInCedwUyW>SFTD+4IcJEga=_Dy1k(Ly{zQ?oyE- z9cXn>c{MIXYh{@4``o;Flfhs>tJUI{zx*Zp`}@4|$}5aUBW~Zh$$Rg;$DO;MF&qwg z_0?B-&b0}{5I^+BguQ^c)xz{fJo@Y&%XjWE*xIBmB{T6P z%RP$@H8N~sM2L|AUf4qTB}sOG4#&@vsFls0uc#_Xo~P_)dwlnMAF!}6!|QKebLgC!^7WN3*+3v@Jcd^Dbda+44aF3fC^p(P%`Nbcm=FR6eGZsL2NTut(sB1nmYgm}GxxpOeE1f{fJU1TD$V-7dIJ zZLRea^1|Wr24z{+sxj-RimFyqNP#p0X9ZObK@<{%j;yM|EmGAgd*K|?q-de>(BviT zj8Y!e!LvB1-M3ya#kQf!=q{dh%$Fx_cz;`vI=@6pjoWr_0uNx^4%}LfreYS3| zu(5r>E0<1l>C_AjUt)?8N+^_Yc!5VSJIyf3*xlVFj$;*B ziV7_QLQkN_RyB^@36J&;Ye6w?uu6R2$5;9}$AahiRMsIeC|$#uiY!BE$3(M1QdG2> zO`>Lp63r+v>~x1*zj2HAfBXR}+k12e83Zj<5Yw$Fg85 zR1iIPH$HqFM)Y9abGGus!s)OfYMnuQ3WPsCr_A_#hA4_DO+n<>kch#cM-+xAE%1~e zONQ+C27K}jkoMI803ZNKL_t)^Cp@}!pTZNIK6e^791+Jcd;Oe)gA#K}J!c~~rKzDk zUft+##Sx`-JY9Ui+Ug3oKmU}s-uVhIz5ELC#2iA@_lG>s>*15CT@uz9gm`wZI6OZN z-@otsi@nfDoSgJn+@Lh!*B4XU%ke6zWWny|Kb;qnF_WG8Vv-OJb*6bvelQpUtm0^?k}u_f0YD{#BL1GcudIMHr! z?bTP<`SlGRuPzf#M0lR1YkIsm)uv@&u=JFM)U0l8Q=aKDJvUFMHHS13Dbq|%cYCw;KF65J8eW+GS!(tO3C)Y0Yz5laPO}! zF*!BE`3o;HIkmuOm{R6BVdx`)q)3q>AS(-ml5~5HAN}Me@Be6-ovnaWWi^F#)c?Q0VV6ZDcgHbxxKi_g%{3n z?#xNvINQSWCE5NC*{DxAF-fP{U?59MTa(U1=a7}F9V*TdDN(D8r64VAt!#^YJPSrt zq(w&MGMomd1Z8TVsBFBx7;{%7oz13Pv;A;?;&=1hQ zM>a}u#?pwQI!87e@NjX7M@t*@M-{EsET^XCNJcrU_wO(~Si_eE-}u_wh$_s$jia zu)ANd__x2}_rLlI@4bD2xsH#gYEe;uqAVRnYN&Jx!lH0ETOftSk36OqIy}9>Kc z^XTno9P~FheR7(G*%?+=mbr5`V{UGa!C;8Bj(hj+ljk{ko@1=Qjw5`I$ATO-wvG?6 z4l}$Dfq{qnyAaPeP-}JWcxW%incskOw!ZI3P})C=?Gvibe6&@Cz+j9eEecHk06z!_ zUpQaGnw+4_N=#YXs3ktWA5f&*s4xcU)$7>_v=@wN|lzBqnS+w2e)Z~b_&z_|yV)pkQvoRV%+pooQLeyuN z^{8Bi5ehtsa;moKAD#K;xALfet1ohli!m4(qzuu1%tm*}#?L?G!%sfr&6lq7`peh2 zbYd1;8T@vOcBhHckeCtDhIE=9aS+lt*&-_}3kxUd^#(*i%+$mbWmfX=;S!&G@+tk^ zkRrFlv4=I5EG=j@>o}(`3YLz)JkR@`e-*cxOr~5sf0`g@;*_SaC7u-Ax%G(e{KNNIUEAiR z-}?$D&YXf|#BMJosx;GqU{?unn&l_k+*!WG<;#}|FP|VjIgd9eIdS?F+uOV3dCHkn zrcGh8TCig%kK;gDgqw!zc{7zxb2~kN+3m zcsMVx7*}_VJ z^L!RJw)t#vjk~M6Y!5O@G};RhTH%ZOgEr1mmE(t8NtCE>O0fV($uQjA8l!jQl^+SAQCKv}6;vaae)t}F|L za7fR?7Iok)O5yooohy~QFQsyRk%lQzb+dzdqFxmxo~H@4N8rVD^AZ2}qn~p9<}H5j z$`$_f-S_Cs&!A#WYi^prdGz+W_@h2`FWjlni$X;|6XWTQVIQ4;INXfFV#DYANc<;IiNXX@v% z!q^G4sIXOu9Lvs&tiV{rXGNVH}?IvZGQJQC)ajhiNMI7+U+)-&ICnKQ5J@<(;&?TEWR*FZCLcfK4{g$0s-iLuV=Tf-ROJx1KvpHV zl8&7utXw^P7m`WkGvh~0Mh#kiL~wS3xu8iy1Z)lyezCR4&$jn?Feo@Mio|cCghp9~ zuyxa2xN%cU@tjH~O;ak9Q|1{$h#GD)DrvRaOik3(zc}jAYECdee*z%{kDn~^_{k!d zE?wfp!YO*a8q(5iHp#M#W-F#F%&~k-cLet+OG8=a?Cfmu;)|E)_YZjdc#$htE@N%Q z&6_uwo15Xnh4XA}ZE*Yc=e+##OK5#az>G0f39hym24P4sD%jrMByKk90?~QwZ|(8; z)_uCGTX@EDYW5VKt=O$B^XDch{DR!~sf3Rgwg`nHP8?3{J_pP)rld+Lgmh?K=jw%V z#O8LF&42nO_wPU9op)a2%GFD>T9Y^oCL16GM~WjY6-xS8D=`)LV}-M)@0_DJ zD7bs$0bLTDfV)MD((`Dmf=Vt~S)S`~FwrC~G7id=q;&Ys2T!n*Kj6;x4mVfV zDT9bSs|b`P(jG}w99=RGFQUic7|+O!$8vFHt#SoOi@Y9i_=>bh>q0yX>m1o+K>u-% z_4Q@WoH@tLOkD`r(hx<>dOgKWTCG}DR%AH>Mbv2FDMgkQ4DysP2$5P+8pqn&Q|{fl z%j()Pd73eO;slLGgV$brjqUAi9zTA}*T4RCW@cvC-Q7iaA(PYdc)ntDa~~lTCl*dI zH@!fbWc>IaKVV~HjkVQfj47F)nW_sBTahNidSIsmvcgd03C_71QsfL;3$iRDXt$`G zqACgoR^s~&5}~-Yw9EhaZl1s)pDDe}UR775C$ z)hf*>Kw8FmS0zUI_(9Cb2o^Utx&CB@8|z!Fl{vZJp`ju$V2s0NbwLqmh4cXFaHV_J z5Y>7N9I6WoC%}0Q9W}9;=E?ei?(QAd&rI{urPG`~HH}}`qk^;1XyAu+<7{JNgU>#{ z&FT3$=I3kjbCG3qyIrcPB8np7I7Wqa##E8#7*i65K5^h9$9r3rj2IRLqtSp~uSc4u zIA@N&XQd_0MvJIX!`~`v3Bm@(2>QJd5BK*NJz3|32$)!S0Z}-NuStrMd!OHDal7LB z$De@?X*DNmXds%Mojsh(34%7gQHmGD$e_ib%;;_O*!%Hsc=ULMx88o06ALq(JbR8Z zAF;l?!ojG^WK$pmL3c1X`d+Pdvb40sn{U3!M<0EJ7Lv1P&-2#X@AA<{zv10?-{s1c*ZI+p zf6jaFeg#Lx+}sR}R>WR+m;R_v;I)rbo^c#g1tDpgj@4NeMOA)jL-eRIT2;?wGy_;y zH)M{3fwb1daX20X4##^_Okpg=IAcypLBHR_S2bX9Yio-i{^L(rUS4Lf(B4hQ9zbuc#ItsQe!b>y?q|s8nUyw&h=mYf_K01 zZBCpx!R-7Tao`_4D@9e-Un}sA08@v1_~F^1l%hfq#8FKFHiBm4W0Qm%H*WCw#?M$? z?IL6yf1tHP>Ja7E!`wIyG1Uku^;l(UFb0HmctW8)&4J%xZ&tFpbzrOwp*32H>*_dQ2#ps-Fn)1%uS2+_;QLP`awYEVf zHM>+)`H+LXP3BLY8|MYLh+?0j%F)_qdVY@m?R7fmU!Zx;a_ZD6hQox$x$|7G&}y}q zpPy%|h!Cct)%M7;gkEo#xYzVv-^!YDD;6h_RZout@2n{Tke7%ewilg``3wsOtNz(p06y^L*U6 zY5GN2)zSKPRju0fJg^>Fk+8B~urpld^T*q)p7(k6>LpIjOw-XCXDg~?h%YqS*H}Da zE%7UhC@rag%9d2F7Q9pntQ_9~s2yxgE%B|R8jLW$0->nFfX&RXx3$e~Ua%<)!$1>i zA1lC!TI6G09d?4KT|Dj!?#;u7=;8a_-7mQD*&-*;7EI61Ffq}o;~`9mu?3w5h+)PH zXD3OsivQ}r_!CZ^zsCRcKmU97`zdE;e-9=0xp@90#rBY7IO6~MlZPyBuCu+@XK8JZg@yB^ zS;dck`~j13%-IujOuaNU7XN70S01yrzDuidkuYviR&`xBG0~>74IV7rV`b|p8#}vo zBUx#jtG-k@clb}OeK6w&A_Y=vl<(CL9s-imqS&FhE%?wUQ^s|Jj3>l3o8jV@>=r+Dlg`@|4x}9V)BFJp#eT_8w|1 z5(%Q1tSFuXi5~9B$3O39u1;}uk3OECd_1?<9S*9;^}!@qi8XaI zKU4}Qp~{97qaFp&t8yBx7Gc~#dlA|Xu?o`MFc>DxwI^y}m8qk@q*Qnql+=Kr$RjE< zqSUb6cYN^i2Jc^g%JM;mi(7bd9!ySUa*QdSxf3dZEe(F?AzjMLS6-y;DZH|eD@VL} zbrK^gKHJK%WmY>Rl#d|7x&UMAOwm9*Ut2u4PMkx08I12(&&ksbN>fl6K@hfae#}lX z@p^2x(xUcY>bm#@6YD_5^lMge7&;x|L^1P2GZRHnolOOhlgA<43WrKM%=-+##a z|LKQV<1-ix>+?4XvBr+MB*oD=|GU(iLe#*=FRuIJ@AZrO=3z6Gag31pEy3iM4_A-Z zM$frR-}ovU zYZr*3+DS4@hTMPfn3!c;>#|BrS$CIuk^)K{*;C0MFM@)%N>PN}^Vi z7{$iw3T7}MXv9p-&Js^f;!8ncEMX($-o1O=xN(CkSFZ5xyYF)T{CPGvH@ScRJ}{L+U*3tGWgVgk5P&^Xx3SJktP?8y)@y;{yrbAuJCkc59c*VijvX~5uT3_8d(Wc zWeKdLQ1-BM_gqu-=unYk(wgw7N>HJXA9+Zj$?Xv3JG8IZ8z%hhSD#WbMJY5wJNlzt zI(nhDT}3VS_Yb)K@l7_C*SUJ>1mFJl?=uxoQiUM~$!J*8YIO+WI;#rp;Ya?nCXcDG zuC_%ADNtJAOAo0mjA{#?l#*t%g|mVr$#4xoYeFsYrAKx!WaH@?YfH-j`90S?t&vTW81!>fO&GC3tFVzZAc{nLf9{jyG{r34HAn#FJ#%0S_K; zu(r9!;{7Fl|Gjs3^UbR$&j(V%(8H9L?cFY&$%)^BAQN8qRv9CCM+%fxZnu2 z=KMiMBlKwpA)#`FQqu5zA{44L?5#azPc`Veh+CtA5BK(YIP7DEq!mPXr4P2wOQAF< zXAr91xQ%mEV+%?g$2Ez4e;-@rSRl&_27^HzU7$RKP;@$zL{Y@_^dxDTva+^Hx7%fR zcZ)aPc#AV<&K{|_!my303jAQKUJ;tAs_?vEe90`>+1cX!`SZ-q&N3Vh`NlWC!P&EC z8I4A~^Uga&v0`Fkf|p);iTn5ObMfNE8rIP7*N~LBwtSCLG)WnxDZRA= zOjgo#A!lBEg)-0C+S))wG1o3$q`Q~1o9(il4>49#c_G?b!l;Q3W2h>uJv=PyeF$5t zugjvqNQLLOaa1g=bXi;f5vM=B#XE1m!7Hy`qZzdk5^Po5F{`q`^8~(*(1F6q>ZpkQ z;-vhrFS7OaFhnUK_5rO z;-mZQP3&>?@->w7>Gu+%AjaSjTH)zhg=MLU)3dX)3>W#{`_D48=7%MufIp^b?`ioWSH}dpMJ#0 z*Ke@9ygXLs1WZg#&}>9#98Q3WBGSkC7xCU+CzmQdEO;2`$!@1q(d0P zXpo^BK20y8bQ3&&YFT>nIUjuRh=2X3uk+{MdYMxTZSrh~KpTWf==XD+Yk>imI7X#m zmmZxHO>`WxvujC`l$J?Il8oUfM`Q|LYrL@q+Kh9qY8tD>R2I*dRHndICFQ^(l_pdX zp{NHvUEgD|+vUdcDxYs`vO35Zs#$Q%}o z(t#GZe2B9WEqz?jraS6${r(1X9Zblu?7M!rZv@M)ZgXKy=9&}-Q&#JdA|1En_RtmmibeLG#SwdW0FD2 z`r3dn3~A{aG*VU-f%FJGzXtXlo>k*>%pG$g7-NwB_?foPR399RHWBvl*9zrH^3sxx z2bX?hl2SFo+k%VnyBLqfBvFJgLCdYeEXe;GjpIr2NZ2 z{u6%u!O!R(^qHKTUcyN1a{02xGm?Ci;dvg#F_mhh zJ@Tr~C5!x!MjTrKA$-d8z$?mT|nz$sb7T%?a3E2YY^e6CnK zR6sf9$g-k_)p#BV#c-5@Wqi&$hRJ}cs;Hzx>Kg23aZo`+Tb#?m)eur6>js#yP+7r) zo@RSLWxZe3@l-)X;LD?Y+S18qj)L*9{@FPr5oONK>I&yhpP=u3Aao`7KK%^`i}yKy?G@s=(@ZR!uj4j_V&UwI4AP2tVvaBj zX-rHYn<*3H=CN~vQV7CQQW^sW2E8HoZr$bWx8G(mZV@(Oq&G+7U+Shoe+lt0i_hq)QvZZ1j~_&=J0H_ zmHE;}z|nnG739W{mKLQ1($grfcKPI)<%8SnEbV5ze)$a7&do91QYcEwGN&pA2qKh} z_@1hPQ_>-1NogudS7C*Z@)S~7$Z{MC517zR5;Tbn*-i>}(mvfZr=Jv*C~_@9_@vbL z0wGm>_a1{JwNyywD4lo~^Ytao3FkaEx4P{0Gn`&zc6O4pXHGIT(WKpq*c|kjooq82 z)ZoImUpe^WXkAf6Z$zUt(kTDMhl&>G>9C7v^v(7>h~- zM%1DaW9ng&?}Zqi7Y!WlFNdzTD(@q;BJv|tRX^8HS5|ra;4Y(KpI&0=G^YvGkdLo_ zNE}9-nV;qK!VKq6w}1pY-DYiVg@uI$`d!7!>IN^pbd@YgX|#P-*S6T&%gBlpp#)JJ zpp2j>YRJ)-)wPGOsstzMz1~q_$!l>+&6p<)B78l~N_W8j`MsMwc+};a?_J}?vy*6< zp#vY0Y07*=Rn?zC;I}cApr1(=PR#Oju}iPphn8S4=;L`AFJ3;&`Liea)%p%k9Za9m1F>=A z$~jSks`6R{QdS0u1zX`$*QedJ4TyT=aZEfp#l+kRf@XtKI}^Xy6ct}oRDR*llO!Q- zHjthqEo$JP_F|-zbTiA(Z`|UeJNJ0y>OH>pFMf|JFJ7eCX<}VTODQJv3?l@Solfok zEK2U)z0cPA7QNmGB^+ASZn?vug71e%@Z!TW{fi3FXHf3yOKbO|_n{4|C39$N?dq(#nTqlK?R9<6QTtv=@IZ^U&ne*Pe)=iH;gFyiGs;WSQ9(0q@MLL))kkZnP&fbk=dwfj!c;-YBP)uM zb^cZuM<}UD)11}S6+XLlhoUs&9Hcr&rqyh+v%N>L{E$W*6SrH06O$C$A5A&xa9D9{L5t_6X;Mmp(8t<> z*Iv28yI*+&=`1)XOIs6dg(2D7C*RqHyrAFPXMfnkDnU_JW3`y832o9cs!Fn=fYPF@ zAkvbw*Qd9CK$@mlYtVj(AA~q-Sy^5oO;i5jFaCm8UU`L1r^C$53{RgvWp;L!%37{} z@-Z)6yT@@r=RfkJ?|+Y{5AT!q_K~(EkPwF+?M6tW8KCuHqt6j~ z8tv7zM64wUJ-n!eDRQJ2Q`&$m$?5IwvC&Og?WU9jzcX&2o?6QzLRsL4bz@k{T1qb^ zyJO??vp1>&CRp6w!+H&M+8WO5*S}GN)wXafQO&m#_S%jKkT#L z8xZ&*S${+_Oc~}GNm=rAV~1Xvv(oMH`SJ!IK77i}l?~RDoH7W>Re%d3R1ks_n9@RJ z(L$h=rWEez!YMeOzcc=Y)CdeSlOFH9bAe_<(e6y*q+qAJg^&{CVt)PMLl&R(vARuG z6bMxj_ySpKoHRITks>4xTMW88>~7to6%UyXBYYp?xQTTFHO~4GDB_@n@}H5jk6Y&t zRg#q{2}7SC@F}aDG|3P`5`_(dAguFD3{*);cWsx)w-#Ca>^}P|+t^V>o)~%Bm!cBIGd@%3;&O+M3*3 zRTZnZmXVbsaFV9*XgS5C^f(d3wIZSEqeFour^tr%lOYF5&Q6}OnU#1GEj~UN@V$*4 zPzUFU001BWNkl!0~Et#F2!CFJ35i>tOhv#Xe6iiJ`GBq_pnxGxk)B6Zr$u3cRmgyTsYkCz-x*m2)p%I3jYf;gR7fF7lZ4%FmnaN4 zefk8=R#+EJX@+r*>8WWtoe7M!G~y<4+&~Be&L9v>PEOXu%lQS)y>NkRue`<|eB%$9 zn_FOMX&E6D7cXAs{P_!-ir6WqCd7i$G5Np1>?)ZhgXQ5@l5++cQ4IRd{yn#11SfbH#F`hyX^7jo`} zbDTPPg36T`s~Ke(qrnJcEDFg~XOfx8X|SMtS!by_L1he5L50DOeEdMu4kDbX-5FI? z9i2yISz^nYI&EB4Q)Zn(h9Np?QOSr=Dfsl!7XSPI^#I=E-}V%(Crh2F{ZMtJYC`Q&u?@0?mhYkeOj#!T6p!4%#?UdO|u;%_XnJq zm|;&<>?e-5UO&aD`4gBj;@15K?2j^}^l7zy%3?fFKv9{BBugps93>UaI6@l3=GroM zZhgka`WjIbFg-Ix82!JDy;pObS$gOBJLYw1;Rq5%vOKF;zI}I6msS z3o_tXv3~zPbF;I|&CVm8;GnQ%jV4hXQ`JQn+Q$u4(q@0?_|=D(`0Ky@hmS&RS zMTCw-@Zs|wsbg}f*>TYGg7v|KTYEj0MCQ476=)r7$3T##8I7zFHV_Y5C8TNgAj<`lBd*`P#qPmAakGurnk1GX+hGdYr&*iTUd?{p zAj<^(-64@oXg5-ntf}h}TU#4!Zf`OgmsEA=g%E-`Nhr%2>nu?m2gdMk7{Wiw7M1e& z&_4W5Cxw6e&95`pOsFv!7wm$h0ORe{^H@I29t{8Z6ciI!H)XAR7d%D}CHn}vNs~lM zd{t8v6Y8p@HWg7MX}6k`g~NJFZ7b@!q_%dt<{Kaqw#%Bo`{_mg@<%thu_JJ;E;3cv z%HncGot9`7l&=zxZ~`IJl*9x|S7fa@*4Gc%+d81#Y;*4AXLMZqk&Be0Lc;UPlohVP1!S_CsEw)BEoTLwMxtM%KjG;Hhq07?kQLLU@5Ojwsbk zD$BjiO+LMRh1HEMqO3uCW}c+c<=XNx-oeGo*SL9WnNL3bg4?(5Fd2<$HCkw$gaLO| z9g!=9bUly`3En_WQhi{w0#`B3j1``U9+W zoLqVWB_v;bev$Xz{g7nb$Hpn8P`D_ftV@Omdz?MFz<0m;2G6|u3awU)b|VE-v9q;J zS=Xdli{YeTXZ1c_crM?%$zU)+Wl`%-4}s9b4dd|I1`x@krbg~kN{TY4s_Nh|pd`i$ zq>lLP^Ut|?;|A?!i?gRsQ%rI?%@*bA8uL$_!DVf3?CkN&D>wMn<(u5x8BjzSPQ)SA z%Q~D3g-INThT2bk>5hE2ra?#H&3*XBKfWOxKOBp)KncfpzV#K}{La@fb(jDt8PRHW z$nAvcU_idJhqN`ds~Oi7PI$)o1f@KcDRB~1BSkhE$S5I+GE$WgR~3;IL3&@;Op21S z4l>JTtIdfMi+uH~U*-AdpFaY8W@l%4?X}m!<`qS}`pT=EJ#&WP{ytl)YrOySpYu~o5PJ*Z1kE$K8;X1YzfGfk3MVO@!J4(BY=b5!(72okWYiE&|qU)O?zp<#G1 zVl)^qC>?vbqOkI@6SN0Ygm8eUDO0zogB;)c08+QJjJ(VNkB%b7lY*i&Oh!3(Z?16u zsWVKr_K?GZ-K{Mqc}_K%z_?`V#vNWdxxnm9mrg6?xie=t*>1BmKgVphMV7_ftu5<= z5m)c;aCK{+^yJILru{4@jy2>w7m915U_3&+;ob#8uk zl{;5%vUh(6mm4CP(uf;)sc2pJQ8!7qWv%-5Dq)WCy2uBi*WPVsNP`%SFPX*N=n z4#~CB8>*_n`yjL3-|thF0rcG7-lBFxoU?Ri+BoO9eB~0oUXPjCE@e4E%V-)(6d1sD zZKln6jrVRU1$9JG#EBCpD9e&KjyZMe6wW#N{XUzUTdb_yby2hGdM62o+OR7LOoHn}DFV-{YK5Iy_kNnU^b zMXW8+TH$P%#5?CvN)zcAYduw6h4x;BCa|t7ahy!S)gU+A*jlI8+osh{Ns=HlcFxh6 z>5?{^>}+k(+v_nH3`ms4Swp+kq|==x%`)0E3oI_3;l#<)2yZBhl8uc`o`3!vufFo? zG_*?)M=@F`HaFJz{F9IQ=l}YTy!WeLQclKnTOGQMj3|>KHQ9%Ofwc}>hwq&U>;ms4 zLPf-}qSI(=Ogta%UxOu0?2Or(V zM;Rw(PBQ<*Nz$alC+}Qg_}LauCbJ9{65jZu7rD2!%YXgBm`NGaIjI=*G>U{I@_c8} zFyHA?PbS1lB9q_|DV!h@Du5tWjdT#l87^(HYZVvPclr6%TfBYkHuw5tCPWZ7um()! zkWL`A#8cv&q4t*AJ8CSox1atv|Bo0AHk;c~rIE(Qy)_JV6Q}6AN9*zix`OW4GaT0~0t~XT0klx-F zqrpDj)wsBeaSo(J>Ig3c#`%!Q?mfmziptVE7;<-gi<`@9+`7BYaO{ZF4&C+)S}HDl zc7e}6`vhNmTAev$dxo);G<-!q-r?D^r+DGHXL$eJ4;fAhL=rR1Cp2^uXG1_y8VM3L z4YR8q)+x||aos-{u)em*_VymOcEo9lk`c4B^GqfaYHMhOBBY4<8TC`3J0$I0;R3UDq@kU3PbST=?h$AAb02HaEA4 zRYI0EkwQ~c6~@;n3~47JP87w;1~X~Kjw!giJ>ZFx3XG%QGhDs3jFC}bclsRfg5s&F zYmnhwi=!ClgJ)=hAyN`+Dt2~vxN++`%gf6cV>r1u4J9~z1 zl2Fx}(icwO9+Z z6etmb!?Gl%Dodh7QTuwDG@g()TeR9;3<8xUOo}1K7BpK8WZYyhmV9<`oxlArzu>?8 z{YUH{Bse*Tk26FpD9RBs&~Pw$_Dfk0j9%kjzrA6*I1Y%qX<+G0CiuN?eS_I%Okqom6KEf-Vrpjs^ZM9z@l1V?r+t53 zjHf=60h2*Wgw!|$&OxLiv{IoCw1#RjAwSrs9u84uPS(tbq@y-Dld`~|aZ#JSv0!C$ z$p8NLAM*L_5xp|SsU}WXyfsL#P$I$T>A<*hI1{WAm5M?piZFOAg%MaXoQ&!9`w+wO z>K#70a+OFw1+s@1J&dL2m3eHdI8^-4#J`U;XU5exT;3@A}9n276wX1BszEvE1?*AM{jGJxps@$ zPMgb@F7p2S@3XbJ#c((#ZfZI+bJ$76?)o}$rg`ew)0}_dS-$y|*HQCx)MZYcPv|ro zC?VP0-eqNdgKM|$uzc|fQY)fvi!{zqS=9W~<={;HnhM9MUNNcPQhfEY{ zqBJ8fD%X%sV9Sz~Wh@T<=+^TQ85=Gx{S0}@Kzq*P5*Jwhvq zp4J84dmK=ssGLVyi{mf>Gz!U)Q!rFTIwbKOOT0Snmm#GjP9nUkczYZfs~|LB)wm70Y zH;=KN-rxWb%*`(x1+W}HG={?<^~&18Bks=fGQa%SxB2V8_;YSwxrUz@1O1%taYukdu@HgfN&gXReXb5T0%vVXK0J{tiFBx5B+%pY7aH$P^p5adPU#R#jjX zF#>5EwkU%4koFh_g>*z-^XU3MJ`plr5h=mqT*|p~a~$+HndAjg5)(Hf`umpm-@C=m zZcI@|I57=Hs6EOh#9ESMq41A%18*cVEy?%4`z)`$I!i|uO!6UlRWhj^aibO3wbl|v znySi?GNg-wpGw>G}}Zb<)ZUVmAJ zbnKy2g103Ci&UYA_0}Ur2;QhLSSJ8YSsL!Gta5AlCe{=zo}4E=1~?r`Zj3Qg56zmJ zA6;RRPq5At$C^0NB&jA&V`L;~*c6jj81Jx+CY!P1gM7fxhI_m{>2qLah{~9`O42Z% zN>v=hj!B}ak`!+%jPe+1F*3-Ytaso9(g$grt#e*DcZTnO@7wJ4Hn64+(#$j^R*t2m zQ=EJL1!iaGvDUM&aDvmPm#9t6INzn+X$5b!IO6QtGi+>ZaQ)h~Dd-wcC5?6}1B-~F z;DwfD+0h}^?RJl35+O-^NS0;v_V&4P{U-nJ-~D?US(7AA+1u>}K(DM(Sxh6%DD#pJ ze(^rHuH0a0_5|Ie#b9?p?LFh7ByO~rnV%;~8-b~epxtP&vAv7aj!Jl(gURLwvdq~T z=3H35Hx2nRN3ZSB|40ahwGN$m$|^{Q<2WOZk{~CvcFG8mZ13)HYxyP{_t%ihF*Dnx z(TIbr$8p3SuIu0ncbrM=wt5U#H+i+yLhc`M>-IL)XoQ>$80{TU_iFNk9!Xs=+S%ln zA79{aKKO_WTf0=91&o{eFF8wOJqeOTX_O}vi}K+xrALd<#{r^B$*?bb&^n?lYn%(< zgHjrSJXWa7DXTar5u!K%i)B7xW#tamr8FB2fWR1@-iysvlQ@d$_cl1__sR2uyeP3K z(zK29f{pE61fIo{OPqV*Jg1gUGZ>C3$~t&S>zK=5e8ex``5AX^Uk6ta%b+8Z-qCG0 zh#L_))-NNdL9F@xaWuN_qVqA;`(i@N`r}g70mQ2V~86K z41%Jv)W#Bv1nUKr%c(_yNI|HG(n?0T;O+N5iSU9ju#}ocl2I5zBqN$x1B>R$ z`WA0rS>_kFSNUSEk8R9QI*CLRd5tiE#pAS~a5agt0R+Y4V~tE=WD=AbI*O?B3E51S zr(S#k2ShSR_z@w6UaMwcmH;}^Xf1-AzpjIoN2JN~g27fl?bB1IG@L`j6L#dKimh$2ZGfvZY{sOh$wOiYS37Cck6O&IJP4nw1)Nq;!v z=B;I}-MG#EU_z2~$XatGS(~l9YkYd?Gv5F8dqh&P(CShY7TNAnWEovw^6b+~eCzA4 z5oyhjfBdi1PEtBglqJYYki@~GTuVz;j6)sh1X9KbU4#anaGnhIN8Gq^i_Oh#oP(2# z^OR*tx6@(q#0l!M4Dv%Czk ztP7GxM%M0d{mu%1@i%|ZU;X`$xOjD$1JOc68P-ek%5aq9>K$>ULtR!^*t$f^Ad`3A z;)Fu!nD2e>P4Xh=)Tt#9l6HHB%U7<^>U2ob24!`?xffpG^Upt}(P(jE{sjB`1HSgP zZ}8!V7r>55M_de#r#~0Y#*dUH$(ln#l2k@O99vIFS}{o$Vb*q;Z*`IT!-jK_P0F=Ld7@j`?&+^IaYoDSrbQmAqgl+)a zuH9pGZH>8wC88)I%d#U7_mJh9BuNOxbAH-nD(c!`%OR(_39r5IByp6ozj>d;*0fVa zRp&@8h$2Ommw1&?x`@3TZtqOEx^ckm{hECmnC1d4A3*icUP8%AT25CUT*7krO{O|+*_V0el=NC7T`h^fWmz31LVp4ddZxU;btwvKoSfF%- z@Sd_P!dgodQKZns)ZT;CXyGZx>r};kv=TTU<6ZSz0a53INxt+dD8!r$-&+x^PRPLt zYNtV^R8F(Lv(2rQd#v2w;Q56Hai>YQ(FpAEC?YOANxvi}!VIgBcMvIREx6m?=bhWj ze7LvEJ#VQSDWy^WowotvlGo@F%7 zIXIYbXJwt+E9;q!=QEWAWrk)>b#!-Ry^ft8iZeagJjIwGGl1=_S%j z6fsI=;1W!&iJT9EPib+=1ix1l-ZznQfg86jv%kBA#?hVaki`-y9qW4s_|6Hssbr=- z$L(7y+`YR@QH{u}F>#U-MH#gXnH-ZzPMRhZML8W>5e9M($=@HZ@(lr*001BWNklUk9R>Gih#

    pRN^SdMJq+B6{4!ChQmNKvtyL6(XkAEv`L5F$n*AxSNVVc;ip_3J;TU2 zR8$j7i>NfxWjGIo9pHTf;lqGiks^c+Lk>!;2-nA{6p^$U7X?sp{pMu`lY)~cpP`sU zD1Cre`_$eceUpYr7;oRk4DX{v@(`$ZTp=xGP{=;|{PBBH2^#_pedu$nF~mxfPKPdN zg%=X%M8LD66z>J=_jkB+dkrtgtlV2=b88omqLH>SwM8pURhA+5p$h5`tu@|TCX+Er zL#x%Kt{(CKe8da&aUkYH{d=Sz0z~JZcpBrx5g_V>d^|Js(3jttFYUd@*JD-NkVOA`CQYGu<&Bqk;kENP9|q8RCiErBTUuGh&h|Dxd;1+OU%Sq55<&)@uq-}x zn#rU@wbIU?hClQeN@wya%l!oP|=3F*uMhLT6M~u)K1QOE<5x zy1m7fon_v=c7yBp`dGTeY7SpJgsq50fforvY0BDA8xuUZ90+U3B1IicbwDcoG&No- zftXJ6Md(}+55s;EXQ<19MkA)tN^lAWqXQ@hB<+~E z)4=$!2qGj&7E_5Dw|<}Z{^iH~^I!cPmp{CK9gGmRL~BFZ^2{wXY0orBvgoK;!7FSf zsB%w38)7NIJA_aqjV4K>O=&$_y&+exu2YOFJP9i4VvQw|mRf2y202EgQ>km13>{8W z!x|4J-(kZDi&##>wuB=j;Hv285LZgzU10hOB@mG$_Ze&B5g)8xMV@N$^y|-Z{*9Mt zFD}@&!v?%pIo_v zkshHP)`sNo($o-nh%0&r+ccss^?{`k?em>CGrsrTml*aWuBAvD2@O@y_S=j%FH-il zNaY;Gq>Zur!G=Hx#(7SXG;qcd6BDDca*T|dSkXczU3$GfpS=4aJ2%!?{p=2-{upN+ zk(Q*1B1$}3dvxqV2tX8}r#`7x3UdAZ7!T8)+$VdTmX1cG5f=s+iUw=xw*sAQk%{~ zhqwhr)dMPGmEg*VRL*eu#^?0&0Zt0?%1{`~K~XXBFe2C@jMJF=D&mX0;m?K- zMac|_z)DY{pw=PLH9-@5LF7EvxUi1VC=|-8smE}TGT}5)Y6>kP=iqDZCY)Y2(@1Y=vU)!RnMz>E^k zAc~sH@Bf-h@4Uz0?kclUi?6)$6?D>Jdw)!Ce}iI@BfX~_kMXr3i&N^#Q5Kfk?$O)r zlcp_dS5i&}4EM*Z?e)2~b{9wVP+*1gHiU8z z!sIWqH%xT7C%jAMUGRLz6**g=Qz1|ibk4HP5Rh;NHg+8C+5kGA#HR}X_HiGye(N@ zxz79V{gkU8enjdFEn&!9O*@uETB2e_)@h+CM>A5i6HP0TbQ+pgJ3}QJCp>eV7ULqP zswW6hQx_wKTtd%2bo5i!bWq*F*V&Vh{*Rt_}3 z{%pd#KUrnx`VbXIOip;7fAI{jeM|7?f2H{1-YL3E^EhWIs=(@K#wEYIWH`CFL}@%o zPa_kQ`G6=%iINsGfK?gS_iKJ|=^j72dXFo;AtUclQAj%uDnTDqEJtc8NhCC0#7L2# zWkf7Ak&q}S@D@yMQA9Lm=Xn0*mjdVs#7g0eqcj%0nM#p8QKXM#PKN+hjmN15MzzSv z*xsLTZ~Z=2NET0?AW{-cji@RTsc2>?LJM*XweY0Vb5lnehoYzjx-m;@_AD-%0qrTu z5zb5yc1$D+q|d2}0kO6mtgLf;d6{dsSLy9n#Hvj@o1wq8!>1p<&%5t^%F5;*Rn!1t zVgp@aIgwhv_Us(zzV-%BoIXvOwAdex`KN#WA(OJA)tI3gh4}NmY$+J%qM~Y|8o@M#^ z4N|Q*^~7oF+H&sPi(I*Sm9nll`NSzUwl{h0E3fhHd%tEEn zynUMwKK_L5J8KA_-D(kO9YFmkqBbV@HQGEdPDIMW6HBB@5FLz2n;mZYii7@u7oTrX z^it|7;`6JQs7wU1#8uPlIkhG^{H&${L^zLA5yp$qsC!Q$6%8fvlQDbuR#>@yk>X&7 zR;*|>Qgjr4zxIL}iEzQwwJ;STi%^M1nv!aJgU##LxV1K9bZ|g7@tkNX5>w!+3WLTZ z4X%#bT;DCZyggxcXc?2BbV4Q+skg!ZPDzATh)^sMl(jB+xA{Y6S77Z0j+UPe!v$}C z{RLiHnkC)7gV3EvHm9CB z%fV#KxGWjuBl>xdOSe9y-nvgy3!06TgHcYDwkb^rl!}Z5mw+#%nC>Y8F9lwOhmm=7?47 zogs}PzWbFIInj=(D?uDJkv2yPOYH-$qK^6B9};n-@CaP+#Gn4mIUoK%t;2KE1SUWA zl($pToDdL4nn-~f){Odn(#al^iQ=D^XZXK(SS6Hg1wK{ND)tM8-j{K zYK_nm>qBs0h{1A4`9I-h%EtzXJ+6 z?kume-|Jz0O&uu?1_S21U7nwxM;}tK4^i?*y$Fh;Ad1z4>F{(q8*U(jRtbI@D&cEG zvk_C~1#4?7Jh3##D=)sl!Qc{GTldL}5{D*kq(m}hFzgXU5#z}Or4-FZJFtHU>F;G# zBXsmzLw_FfR)H^3pARSJhbHoYjTJU zgtT=Tp<)oK#2HKTMr2(iraUW zxw?Fv3;*(CcD8mo*grrENi#{vvXpKoVYb`CdGpZ3Ey!z2oVP^r^zfG|fF@F7YQbbO zV!uD2chCpYY2zIR(~(p_J!M(Bhu-tY-8he7U_aKN`f&-SA*{#KYIPV5d;It(Z*zZr zgFpUX{xh$?`Z8IwfuCtmmy&VbV6`?}xx2!Xt&la194{I}*0qv+sj&u zbv50_0>z|4X~z?%TfFt1H_7vyD4q@t3InwzizVHK2E*}){r+bty-CtNL$B9E#StcG z6PRgrN#lg=jcsNZQ)-{Gv9`y`y)Rh4ahbP&@B?04dX^WTdS?0g%`Ma?K(wKV2la(L0O{^4>9l%zy19`?rZbt^yv8K2UE`Q zx(0&*#u)zW&#v*cufN9kzxOScPM)L~9U!D4Y6!-|eG+1Xks&cM)>su|oF%t4qkP1* zVuX=`63N(m#vUr60>e{CBJUnr506gC9$v#=mL5n6QKa!cT)$?P&}cNczp=t@e}kt^ zzd)Xk=yuyo@&RjWE6mL;kTs$pr}YJSae&kYp-O)KuRr42wQICm9jbcF{p~%jUA)Sm z*XP^ccncBb7$8bB%G%)M^uQx9KdRcGR0zP!^Ac%boKLV5gHVcgoYF`Vs^OT;wfkKB zzu4HixP&3nQ;BqDuc`z5KeNKcJ?=Q(Te_L_;xb@lXcG%ds&)(i1Pd)h@ zCl{7*4(@LZ+3W2vfASP(pEyn0YK6sG*Weeh)>2Gzs-mFX?jp6q34r(h z`8DP`Z4#|+FTA5(IH{`}=pK$l)9ae7NA#2VM>kue484lQw;HAX?YC)C0vz$MFp4Xl~Pq}b{ z?X68j%GCBE0uB>WJ&ztR$Ip#Gv~-U>-w*$$TX%Qa?~S;7^Db|`{sP~B^BX+%^s}@( zb8PSKaerr%jlCT@=`5XQo6=e=2H((Bk-!c2nD2IIB?cv$L~2|J*sw zpFhv)>M9n?>C>mVvwWN1dGjrP@{^yCB`Nds^K7i&=YRN*|A}|r`2}@d^VE}P`0(RT zSXx}fDRF&d4KQqpWTnM@`a6YNSv$;pF7%(bpCI*ZQ zUiv}=$sx|-C68t99I<*3!Q)bhz!Miiuo~)CXlF5#!9HbwpTrs*ihOW@iW8DFVz%AF z8c#kLP-%lu5v_Jc?Z=GALr$K4g3iJ`nTi+>3d)@Us{Oi#?Q1+3pWneBv2K z{XS>TK1rQd6q6C9O2~AK^CApjvk+)IDhkS?q}w^itvkE?>ce;V`8(ISy)vNDT4JWt zVSm4md?fYy_+EEBIs3TO^7uV2j^x-p>`!Mo^2d8zdh&nk<9M)|F$S#<1H{1dV8Bsn z!RI$txU_tUmtQ!|AH4Z3<{KF|4=ynq8Olk;`osZu0!|&vW+dS=QIr zxp(g#7cN|2Wo3nzUV4d4q*VEUlM8csDJG){LP?yD`1F%2tlr;aFe-TA#d)e?On+~K-tHPo z)_mplml5@lwUzrkeX7OQ<~muVN#cys3dTjwR&PSwnkTPouHD%{$b`AYC0=^z6?B?_ z6jXJAv4ZZ*9A{3>qLrm63?7NGo;c0$b@>|;<{t;3KYGs8=E0uitqaz9gdv8-BVC4+ z32_{AZ*`l${Ocd`e6LUzOP*H|0#kjz_7L)Q*ppD!&*nj)oOXYDp$JAax# z`0u{Xj5;8)CBOgg|0nWyF0nSKNivB;QxruQ!fSPe4;{w`j(biAYdXGk41uo6bG&wlvlO+N~V0r%cfAk;tPk;1>y!663>e{lfc#1zcb()u7`zk;F z$Kh6h%eW2zHgFsVU3AAdZtXurSN|xO)Al&O6*^{{Ma)52_VB=yQ%U zlOK299$yp3*Ttcw$MJo>uIn!it|F~4WrcSRV;u&CkTD*`xHP=?(XZIu?@<&*u)c`| zrl^q4lj?}C|IY97;>;|IXHKK*lC5Dy5eKDWo?AZr_;co-eu|B8&id9Kv6Y;8;uKpO zs|>~i%3??q$260KS6_WO0HTKm-jBP0jb?hRSf3`3YeAAmc(3s?P^rDGX}25X!vmI< z7Wm`;{J-&gzyEz^n@zU1cKDYc|Ac?~uRr1T${MB)&3mia`TrPuvnRWb`_A)|nPLk|oP>yJe5t9=j*n?HNz^gvT9rbWHbypZZUjd6|cfiHV7r z@N~4@(-9*})@s?3D9R+bfgp$-C=_bn?{@agoQHF(P*td+#0Um23dO2>&&iYd`+a}k zh0RV>1~ml%I@4rDf$vpH7T&h>=Kvt=pyG4?+uxnY=6PP}mz0$UpmfS%t*aEVG1RJ6 z@+cuKBD8?m7Ui^gc#vAHiZ{?C%1t?uGzJVv6sZDL4+#{QtSt1EQYZ_zuHWE?Z~qkI zdrTfb!BZ#BvS9DBKD)rX@BAZIKfZ>amw=QbU22sI&6-c67SLz}RI3%XS{?FCljUj2 zuo0k5hQ*d_G40?g7a?8ZRI|CYMZ4W2FF=U$>jH~5-yN#9@x-*(!;dh z%=s{Iy0kHH=tdFBtKvH~u3vw^|N6iE@4WKzbBs?66X`Bi3f^5B`t zY^6EwzUj^OMt>NPaL{`^$U|o5&!XHA%Ycy@(bhV--eO?zDgN$z?{n|YJihNU|7eX` zEy8ij#7SdH4=be<6{kwYiwP?meCbQCFg`lW=Gr{2pJ571P^n=(Lt#^to8b}@=l4OZ zu)bAcU}%uAS|ig2FYt)-G8uMYcz|BC#gE^3lfU|}-=Q1DeDSldFgbOM$?>CQ%B+ZS zJQvrO2xUuomXJ^wOk%OA#dS(HR}hrX^4+_4xpnK-W0^w`>=dS+>!GCDd0yh;mjlEP zPM`y=^Bq5|(#uTs8}X9)(@U$o^X@FSZ!PlTi%;{bzw#!1Un?sSd^8BqGS~8KG1iHn_WfuV{l_{qg8qh)0eV4{dDje zwOWllPw8bHw27HtctESYTBcgM1zFxle;QbHY zra3r9Z6KuA-r~JC-(YZXnCVmJXpE1RfpAt(tyZzt((5IpY225vl#+y!oh|X4kV?fT zi(+PP-sAqQTg={jK+UTV7|B4bj?{uQNm<=kr!nkMAE+bc7;&5u$2~fo7RDARrKr_H zyuh%uvW6cvQO#y~h-pKfX5?u`k>xvb--E%>U!pNVV{Dm2=(;}2xD-Xk=6b@`M#{?S zcR71{n&+Rn$houA)aq5bQJ36ksWeczBq`K$AQx$aFyvmR1X$P6tmY1{;HHJe=XX-~L-}UjGQI zGb({YwdR+J$X1pX7f!hcXe_Bt$+HAM5Pg|v=@%-cixGk}%PF*_=6OVUPGJp!=izuR zosHg(?S9;|h#9hpE{ zNw(Dhr;f18j8FF%8*c&$SWTX3wv49mTslRMwNB3e`_cQXwR*Htg9vH}<)X73X$-F8 zlnKi_?^!<4m>Q!GH=OSe+z2L1T-u-H}QChM~N-Flj4QuH;Wp)iRcQtI=O_6M}(amUWEwi-R=HcQx z&z(Qbndu`On;fM&*yPcpdDhz-Eu9Mvf z%tb*E`iP|9&fWW5e>B5;-~BNQ_aC7eAw`ssXt6U8(#Dj{S|!-2yNg~-hKsKpGMiwE zHpTV(4AsVXUw4>USmNr$25a{%d0wU6ZX>pi*p^{vD`e{aAILSBv@;`AeT_-n& z4nFNDV}2`QzLT+;SI}{c#lc7y>H0|Nl%b|pBP?jWcR%0VcuHCNrtR$g2Y`9LiHTb4 z*r-j#p$wGGE!JvW9F*sje%)43*dE#hI8qS!g1itIT)o>)3IG5g07*naR0f(2q=rfk zmB=#gHc9iCB+Yp%iFxOvYfPWHz($%gIdy_yt3v4dxSk{zReEWHCv!s2r6>|o4OUgK zw!$~RJHyZ4zRHIm&(Vt=Tz?E>0^)9tFwPUhzbDd;u}_4??EY6;TiRzh0wvx4P{qL( zc8^5(FfjC!>X7Xe>2h!G|5^6^&-?dCdk$%88K{r*?u`}Z=HBF`3#XZzn?dCXn^}X6 zC?Qr7T@5M9v=F2y*@Xzd|I6gQzQjHO!W>*5?FaD8p6e7v5!bI@=l<+G!($VSADv`m zWQ3^KWo2cBm8AvVdh0Ek%_h^+)4cfNi>$4!F*i5I&wlnZPD~%=_~aO2sPUx7k?~=w z^#Q){=`)-;KEU03GyLQyKjF1kKTTL0MHe|oC&yWcEQ`H1=ZD)24i2J(;qKiBy!Fm? z=9W4PkDnw;ect%HzsK_&sf60Fr!DkUzF=>n~Dq!0wMO1ITUdLB{+w9|sY@zZ?qOTS7bXi)p! zH+lcPYiw+8Ff?!kw^^gp>y^DhR{Beq0inCo;)^G|Lig_>Pu5dnr=EKJJUzB}+Wma( zmVKK87}eYR=zc(Sd#&!q2ueGZa+p)rjvz6+JWeyD6A*e$vNUC5Ek^l6RH~3jfo2!J zW5we@IS#%b`=9k@txm7k!*wi2M(Uh7F+sBmMSGK>rc1MO64VliF10WqDFRGd)i6Yk9}u>SBS zv+FII)f&}CgCa`Eqljjs#@Vx{IdSSFgcahf%SyMypzCv{UT0Qo7F%6b=a%_!WuE6g zQ_wT8x!I!bSD2bS!u;$IrieLz<}}02CPya52&%zjJ?vpXqf&AQ*>yeVu{S`Lln;xR zRNOL+vbDL!>!1HLfAS}P%;}TI@qI z&nw&NwrV;>H?Yk^y9kqD9`L0Np!!D2-6Sa=)711Avt?s-6_ce9xR|1#z|t5T#QGKHuYbfwuSe2p6BmY! zxfM1a%n~oH(ra(x*#h6SG{cZE3<(3Ditpkm$dj0@v_~&D^pco7&-+qLft4lm!}VRH z@o9G>y4^NurYUkLw1en-Ng7MvgqV_YP3ehh3Jcooq?GNR3hiey9R@BQ%qZRaV5E71 zuo9D7q?P!UCQHj}eDhm>!|+gz%SXrA>ZW}3-~sqe@asgm#TY@g(IoF~>^cNE6g)U= zQ`e6DnGL*fg=?J7+kDS#A$}WFh15mCx*ZJtM6d2Jp25MTz>XB zLgnJQie4w;{@gs@{r=zb-5>FfQ(!2U+*h7FP|r?cE+{fAe0Ff-3czwsDwURmmV%zo=~k; zaXrb#<|^|Gvs5Y}gM))~y6dd2%`-YWN~_&N7lJs-SzK7*x#yl^bVQ(wk{z_Rv5L|# zHatYbtFpSVK(D>U*s&=_j!uBzL@ zbcv~B6DV8seVGNK5|V`>Yn_<;>s!pMc3Iuppq;cSyg?k_DQz7JLz?7ho%hYVJq-Dw ztgapT`X`((+xyb?Dj!jN=6r z3T?}zWLe6d(k$w)H3zTZl;=gBp>;Vi)_v<1tu1M8@WTpH+kRl7?kg!IaU4_e-26e}I&s&*uMd#A9y6=U{Ora(ZarFI$rVTyBC8(SmP`lXl=ZGL2D8no6x%ijjqapzRgRQPxIhco3xB$n}9H~)nj*@g+ARYW_9W4VMEp2e+!w>k$&#&aZ#c;k&X==35!{qif^ zy?2L^krCEbR(SAmmeHYMj!z$>S#OX;U4{n-X}4MgewCu{Qy2sRS)Nm?)iB1;?seIG zILo6ukGS^W9&&t$sbfbOX$&xM^awV|>2%W_W@p~_IrDsf=WI>8Z8BT>VxD+v8dGec zRE44D7)joxIylV9lOawNvAJn?nk*?L(p85lI`$7A4!ZWn7>c~0>ig8gDoIhWzBI>` z^;I6-zs=;)DPDa2b;d_0P|`ydiqQ2DMa-LT|BS0Y{wDNtqHd3YTAkKqJROr;sCWX;tq?YcnVoyY=K2=X%`vJ+s}$>9+Pw(35|Fr{(}Yu@ z&*I85MnINFG{ca|iSe=r18iZ4^8z7#l-K0;-Fd$CogeYjE1UG93{4F;Y?jy2mLXSC z=pBaSen983C$~9N;nm+EcfvbGKMZP{6k)cn^DkgM?XOAqzK3#uE(1%mT>&KJ9uxI4 z>h(I^PE37ZjD?jsZY?hGPk-;f!4^IK(>LEG5|-3hl&7${Mq5+*@%zpWAYR_r?awRs zle#_uklA}i?*AN8$}&hU3|U`a=ib8^f*|0;^l^?IJI3Vr1oQLrEH5wf?mO?(Xf!x^ z@+41Ryv*|QGS~0k%oG>2$)Vj9gF&pr1X*5q`1 zTMUm+@n~_8H0_Y~TCA+tRGd(22@kIKoK-BuOiK+ti!F4>*& zuru)0k1Z>Cb}pPzKfI@j#K6|?0~1X%&gJY>@4|hmB3?9 zV6!JAC^Z>Q#l@H$$E~oqy3XuUm9taFSnaIv#)tPGUt{1aI;@BRVBx#QC`xG`MN+NtuQLk12Lz1?UbTKC5cYf!$`EP&!_ZX-*`UE&d zuh+r%%l^0*M|hsY(Wx%}+uf9vWo1=9GwydiiA^YY_Vi(~@?Cdk_ zoH>u#tl|^N8D@v!YK$p^Pq){Lv7e|4-F?lrhkU!&=eAnpppYj3$Cj2IuIp1sffb4* zD_C4uWodSfaP%m;(Db4nJ}`M?oRg=IGj;M9jp0F7))KmTK_g8$Q60dfntyz7hj$*# zv$@hj#T|x^uW6*7+`66h1OPwOlJhXyJJ8vm9w)ENvTS|$OD?mgOlUfbD)(ThYD+AKK078T)uPx zz3p!x%5-U=MW6AMQsgEbd&NE!! z!@7!@)g|sOE-<^k%2ua?a9sSb0$IlD{TY(2O+=p3s0UQ5E(6UvLya1qC((IAp2lQZ zT7pRIemF~Jr;-XO9k7zER!+O!qtlMb3kx_1+#SzBi@=u#sU$cGVG<-cy~48CN=U5p z3%n-yL}~h-1uh;>pLRA_X$dP8e9y%ijV&@9M>91!#-~3062JFP{|Q5*<1BBqSlj4e zghLQi!9ZuLjpy#Z&)c3-^3Xzg|7QM+m}=59kh=^F*M_BM;~zWP8VY& zK_wv1vmG{GtF=Xu7Yq-LVhuP-Fg|Me`mbFg^mCMPO0PUOD}6PzB91l64akxlYZSHW z7>{N*`P-k|rQM0RbMGGWa|=|QfX-H%_kMPTNB3ulbk0^gp%-b=EMt0liu*TiapK5v zDsF(421k{$YGX>1>~bwT3bZcBbSbM1gDO%g*48$7I6KSA>MHGa zo0|`2m|b0_mE~-7V%lkju@dD~utpJR1E#>50!)r9qY4mc5INfMb{UP!C(;@ZnwoC2 zzqX}X+I0E+=U(Lau?aTU*LgJekh!@T98a*evX1BZ3=Itth7~-|B}pPy*H-BDx+oda z-YU~_v(#|m{4<1MgMon&T(?SNu+D3rdX?joN2z!o$EGIPY;Ex2^{WgI50aPyi=kAe zDB?IK%W}dn#P@yNphDD*_~4!Q`1#-en0p`JBJFhXq#}(|Y*Biov^pJHQIAfXVmy~5 zD_Gy!L^={b^x15;SlwJ9Ei!s(L@$X*@(e8$ttcjw0$hnrV&csf>zy7q7Zx$X-Dfed z_u0gL^7Cix-s!c`V6-TG1C7A-nz&w-PA6sd(Gv6XE2K$ISgA8mAEeibiCYof%<$Iz zN4$A=j)hiAraW@bDFaUoT9a*JO=joju&zU9 zElHH%I1U#soZ^)iU*_!Dvlvg&D^ij)#>)*O^#R;4nkdNFtI-eYWh zoMxlJ#N;Gf8(Y-s)zT-eFVR*?(dl%s*0Qv;#0OWevU2@n@`W{edCJs0@Aj`{y{$&iNYnIXD7G!Nk-Eu9Hzua|W6X7F9y6F~)_bhEPQfDMLQKdz(}% zq*I249tL>sXBBS$zTFl{#ux&}B`b2WEJYx2l)&nO?$!oN3$uLi(RGsc76bJvqr<~k zTVS#_6N5gNpE}0UX3A!iv)YPS*zB?1%P~%f;|EB`B`eCh5L?zyR%FGMf{>*b^al(wPk{u3%bAv7fr~` zdt3b1zxg@;-?!i4y$|N-WFbzaj#sIX6gg=cBa}u7Ob-P7?qMcVA4=9P+sS}MXj3g>tFjUfAJUp zmal&GD_pw#9A__HB1t;T&&^`8oWS$ID4>){n zH@uI{wf#B>eO`U-vz$ABf#K0Hgp%}nJ=WLPSXfxVQHsgQNhT*Jab1^ItHr&0_vrO{ zOixc!YmU(Aw77HoE|rSU0lxDR7 z!60jE9nv^LrZcMO3Gf#;&L0%IMN>$AAHh?NeNYK=H4 z`1tl67T33Ej!ba;)G1OG67=nPYV|r#ojc2sBco(lOdNN~jmP`%y+hJ%)2xRW4G(7K zSy|p9igO(GiwEY%9w@Ac`1ODCMgHx-`!~G!sh4nl z51|CPPO1AoFFgMO&pdM(Az@{8nO>)ZF{K}}>#H&(sOaBsRfb1Pxh+GshZ0drwXRd< zs_xJX*_mb0#MiAv%wUinM&Dt?e_R>HFvQ>nrhiSaDd6h4#S>JhUxq{N>dR zx~U=675@I`A93$dk5=ws93QPS@$KnKEo8T^f}kj3cmVifr|G^xy$+et4CK%d1qYLsS9}s|`oTMi?5XF@1cB(`Qa{ z`s4{DhJ~mD5;{>tvsNzw(StVH$38q|qM{H`6gjS|@cnXfk>@!{x5bMuJi}l7#lPe0 zU;i?J=U}m zt*;Z*>L6XD<5CH#xSmgz=Y7*#g)7R5PPfw{GX;f&cR#wuTh~5hBkJOM0n&94(jn<~ zX)P^NcO-!)7#yfFIx<477T|gkOOCY~i^bS}Pbw^xO35H~T@QhS(UK_2Xl+HTZAD}S zNXJE@$a77e75$I~w=|VD35ChXb%r3LS#?lBm6b@-&BPO4n+G+lhb{O$NoJBK0MQ_D zF-3-=z?B-`H(b1Mnt%QWzr%n3M}NrF=oqhj`cs@g{}c$r!onlA*4Ocrq*;5+Uf2Up z>?$%3V+bDv+8yMBVWdE5$;s(}vuElI4jf_jVV58L=sgNOfbUC+qMRK2zK=GVBu>CW zQ5d#1H<%dn_>HeU$N4iu=(vZY930QV*mCORssNpr%v@mw_4*jyZiOHG=o;&ZLy{Gw zS;5NUD)(;Q!}JQA3~Z#4&5(EA`G_dhy!@$G`Px^$#E*aUcPI_V#*dL^rSE4M6jk0X zt0j46D3XFgD|+n?S(ejHV;-(7@!GF^fvhNa=gJkrW{q}Lidm3`3GCud27Z@6> zvA(v#=H@!>_9n`O6I16nF@2JwlT&m$Z8kPG0KwYY8rQB}qvDtHM{D8Hqd6{|zr^(M zlT?B#&E^niPMxGyt+KGN$gR7#NsY#h|`4JDB>a`%5zc)aZwdQUDw*5n*a-yGb@xm!ioSXz(2Ff8+9}qQ9 zeCGX3xBY3Md;VTXJU>8CDm9ej&}=kOO403gX|-A`EzRQx9v9A^r%|o)(bcQ`_y<4a z+Pm+Qbv8-jEaW21uzVaT(LJS~W$gyr?kzQMnTw&mgKIS!tyaD||-Y1yb-jX>bK z9)%HPxhdb9fGABdR?w)|$kT+i%`W%mRw-nFF0un9qkD^Qb^yk`@?%JKPU!iFyrAOw z{YJqOpa^jh)*yY0D>Ev_V2T1no0l#%`Q2Z8p5+G-_m(@nb8C(_Z$04p@-mwOim*zq zeB8M7`cu~8N`WIw8N9U?l-dc<+CF!71LeCtWcN#9%l%DZblj|G>hBZj`XNvdYTZ21sa*3{$IyD5o^L z*IMJc4vtg$U#Drp-J5rK|LS#S9xdaC11PV?`dW)ekLHJXb#ai2Ezc)aparxqc66 zN_I_Z^$s9<7-+G_QGwn5RONN{Y>E(Ilq&ffN`Z1o3d2UL%e@=7c{o2$bFjhj6UV7H zYIM3C8Uq8=8%VM(dn_(4a^l1^ zaUApd>#s96H^*h^9^O?`^@y8$Y;K2jN$H#Gl zkT}b!gjL@7>CdP)2T8M(pc3G^K3SSl2}7imwA*d&-o4A>;v!eCUghU+{UgVMkkOz) z;d_LW6Ra++kQ>OAq|@mkb!iRaxGwZ9k{sXLd2MV`a_}t-P7IQ!UF22=iR4CSlXfR( zd=%m>L7pqF-MT?iD6G)vTtC5jdJ-^~2YNK`Fhq-TAmF&A54OM{vA9a&I|_~9!L94u z{rDQ4t#t%B71!XIh^^H*KDf2Oo!L1yx;ai|06(mQ5ael$C^8D6``l28G~i&%{a|bS^xkb07*naR2&&O&Qp`qbY_;&bE}B87QN*q z>b^tT-Q?|ee#Wt*r&w>nfBDuG{`#Bm^5&I?tZx`xe~_R$K$dF?o#S{8LRyk2BFmC; zK(>o;aUiimJh|`f`CeQ0LP9uY_-(#Pd+PzxBq&>k3>}syu)Ci*2plbcXPNT7tsvY6 zL$_t^wigllhGR!-{L#PoE&jVd_$?;JhDmxEd1g6%YMN&+o?~)ki1pk>r~iwlb^ zEiIAf1(TDLjE_&CwPtN?orQ%3YSoZa)6;BjwOCwO#t%XUhDWG1nj}R|Mdf%(&}(mU z>FIMk^Yl~rt|W`Q3^yA5^>=>4!O|mqiQT5PS%!9jkx%S}=iX6hQMxnD$R4*L_gzizXxT>GoVF&_+qoBxQ zbe`dPl1mp(^QZsjkNKV7`%Q+%260@UG|5Thh@pWxd0ddD8IzL}eD3p~<*BF6vAMC% z(&8en196(6lp+i(xP9`5<0zz5 z0V?3#9>UuSnoMN$dJ#$mRKf<@dTe$IW>>n*Z|3A$V1pry5-5@3H~|t5-JU02yMbe! zJ$2i*rP|})yE|-{xQckN=W$XHH}EHe=Gm zn0~$o7O7-Ev!lG%l}ZIHBvC{f#SD**a_Q0qE?>HgawID&OT& zuj&)=5hHBh;=nLGew35vFQHL5jzVEDMt$+rlh6X&} zrRZ*P@4cTRI%}jFjvYP1rArq%cJdg?cZrJ}jl~TDJS~}DSmgRg*LiUJHfdC1cyVFD ztx#lLbQ1IQ*;73C>_yIAIL*LdlV-EY=GrE6?M>=o4W%5CRu>g|wg2!0yHf66@Oo#V zKxuSd=!`5+X$~~_>aTo;fB*0QoEKiWgzl%M3LyzA4T>C$O$jO$43;b_z$&a2j0_F) z`sY7Kz3S6$ZL+kuh@%`TK|r1rUL?j+i0P20-wSdk|HBFIlVZd zu!eRV5vMs)DvVV)+orp{2pdOCjgAmjTxtU~@}ekHnN5zAUQ*T(*UrJaOyr6}{Y3@^WQgp(&56miIR zzw-f0YYEbC5Cn$2$oi?UW$_bkw;XNPnLA?e1}{svM45S zJ(MZPlNO#Q&@$xetz~|GWrj!V9jetj5|^|SQ&Rzx%~4crX*d;buP?CG>ap31Sz1|Q zdip3^E6Yp{k5i-?rPU6bj>2NJphz`YoRcMnTw7eJ$}kTlnBQ2#sfN7!{s$~CE}<11 z9~@!8^Ffz>b)Ms~+HLdUy*vFR-Cu6PdeG}_4=^Fh^|4=KpXXWMvob*E5k~j;+-G0m zPyXbO`K@pK24DW-=NPEfiKCd+)eZ7AM;n23B#!4(=!}9=rlAoS6xs-kmS`>T9QV+o z=gIeMpO}a$RVJ0c`22ZlRhKl5Fvj4xmeKJM&YgM=NBMZZkK_1^j!ZCp`~RL(|wi?qngU%(9a(rUC$kVfpJb~>_@hZs|UEIlzThwmS|J(>0bm%Al*0%J0sxqOZjCyroEh84D- z75o?w-R)hwr>H%|JM{6hrO2|plu)@IAc&F}iJ;MFAUr`7by!06XTz%(V zTB~bRl*{DA2-UEHa!Nm^(z{Y3goEe#tgLMk#|3e&%k)QWF?oh7EY-j#&U+{&OFNh% z$7oHO8wzbvj!O~8D6jO0%+i>xjZK8(v$WA;ZgmUabDpqV*$w_4#_ZoQt+xhOKpw?p zc}%Qxq${vmqbyhlk|M{G4xW@)m6O^HJke#q@pfhw@J0O_K<8fhU}-DtDA*=DnoFj6nW zz8qJ9EhTPo9MS1?OYh3zQ8ro~HoG}a&|qz&&0BB1&BCJv2I@_M(W4AZO`;kV+M63> zYwJuj204HEJQHV6pbF@j0viMb)hZ&@EIpj#`pp~Mn4LkaZ!ov9jyp6=b6}Kf?_9${ zQDE3gA_D0idXDcO80OE)ZjzA*z(*^)Gyuk&zKDUVNG#{pjxr!;qrTT)K3bPN&18N3%Tp?6cgu zb&Ho?dWlY_!$%)|#MIOjyn5wqON@<{0aoYFou}St@ZpCaa_rPu!rB17 z?{o6>S>C?#cHink({6XERRU^_2CJ*9+_-Ur+qZAi>-AV!S)tqO@zm55CN5Zsdo)f= z(QQR!aZZ{Ws%}WH-J-AtZ7o@zlbN#7(?(+i#BoYmD0BgXBf~_!E^Nd&vc~;1q0^2z zeWHqve6mb(?bZ#tiN#Rhd%+%Cn}Zs={W8b>fQJ!fy1NttV>DV9u-)idgD?(*RUf5$ z+`IoVGY{|JJBIGsGT;C9H+i_Uim{T~z(^U$krpV&A@CKREG?ION8wt5GJP;pNvwd( z=)Pb7URKv$GJ)Cw{dY4&w|la$U1~Bm(7;ooB$!x*77}4K72hSvi}JIG{(!H@!4!DH z;t4^cR>ulUFOKMSTZ|13apuGc8iRw(EzC1=<^pLaB46G_wj)NX6*}EbYU6dfHfG`G zeOA{}zWt*c{KJ(cR--x@bzCRJ^BsEK6xmN<&UB8}21hx#(g*97qRm49mGbGfpU481 z2(&dw;gBZNmatfF;69CbK0J;j&4`~@Z^CzzdmNSa&Hv}D;kuA<0w--5*1`3S39yxjt4q&|4;1{TK&zsAc3f%XYVC=^-@8W5L`+|PhI1FrF?MvE!djA| zAoME)%A<%fZh!nCcW>R}{>&rRIvqv^noJE0)9WP6x3&l?aO&tdFFtdT7oNY26S#De zxEzv7hxOGhwwBjfT3F`h)sLP8M7PXU*XKDlVoYe%>DcHqKHPljvrJG zq>LZdus$j8-ahag1Sy~U>`Od*`Dt|C_vi3klmopeWn+B0w?5FD-vrg-A>H<`W9=en{>M=MGlUvkXlf}!BI~6 zU?~t%;5q{309GMvLZeY(XndHF;X32P19Yx{dqRb3s?qe7_3WXw3(W0@|Car zK7aOSf6Sw2k5N9ex3MqU|Y5Rex+a@Zy>MSv0^+64qAB(MRY zjgTQ9${M?8vk-2tFlF}{3Ic^v6=zQ$rcn=vZHksC4p=<0z|q5xvA({+#`*@vIJDAi zZ?zeu15TVci7y<@nO~S=c5aexZ<{dG+`M^>$*D0Kx7PP>_+AmQo7P0#y~1oj$$1;_}9Z zcW^#H5d8q=;vrv7>_*f;DuLG0vxStyVK8|YsqN5lol|5z##%9-`}D{8)*t^7pLp>( ze(94RCyrw-T)V+mCxf)45eGC~Y?!3Fs?7IK(>*W2B#s@WZey~)D`y#y+=g*yD zad8$?4NyBBa-$ymKftTf9vuM;OjXuqwHQc&a-RcUE9M+xgqy1hQz?JmZ^ARVx?xsG%d zVfQ}gi;XJA_{FGloUmY4i%NFsGK6uHL9Y(1_j}WVqtcgk3aD-e*0U0!dfnP z_0lc6l_01kI8zZCNmIvcy8$wg1hIEFnW~_u%#a-`hkustp8aP(Z#dL}Ph#x5H0(B% zR#gSIVq$)l*~NpDra}w(0YUU(H3>h06L*QGzcXoDg4w}s-^(Y}qTHIXSzm`%kuRbgivTH(6f0!%%IHB^$1x#{A{tGZ?)^F+`oSaArOrQrL8E+5``rapm4}x z`Q;!C2pTc%ew$v}<&!Ucf{%Uj6Rd4*^1uGa|H#$Vg3JZDuuf?eS!pz#V{}~K|F+w3 zVl=ih(KmJ)+fIYVwvDE-HL)5uw$;XVW7{^L^Ly6%zn(XltTX%UeedgY-SMh+|*t=i@mm z`!yXSBcs6k2`=C!Wd{H-^tyc0pP=CZ>qE!gysp62;||z}*VQqwHi6au>Yf=W)#UKX zQBlG~Wg^VI67uXcGym20K6dR_5p+3W2ORA#Q~wD$kA(Q0k- z&DLdT2Ba)Ogw6J~?iOLm{}j$EY-g%v|I_an8fagzaxi;!H48aesLI=;xp;f!V_?wj z0BTkhsRfBcUuor(+$V9+bPY7ngRs<-`_-vMJ?By(P+G|V++LCgU z4<9|W^HC?s);jI{?&YIeBQT7a-q0l_4_ROiKv=hO1~qLj7YOhPnqaCX#&5bSziOz* z&6B3Rqe4N4cBfO3UvMlA7I|0>h#zo7k(w`7DbgyY5#(0CiTk^SB{xPkSMN2P5piV{ zQ3#hs3fL9McQ}|pzmRJ-kqB2Ebqmq%O3Y!y1 zYh-Vp;Swh_lGiV>{D!JkZ6F!-m=nCRelfe|_UA(B>p2bSLsvT*V*ZOzCkvwIRnes5 z_8dMzB}N~*kJHUQ%KZF19wD)bzkklsk~T!u*1@5^qeEUpgGk6ftG9lq<8GfB%<%Vg zm7;l}sTKHSkE)ZAmcqDwtrz7>@(w!_eUgcuh$@ojYwgWgEbNeLP|z%=e1a;3dUy!y zOe6wPY{p*}Yak7=4DevqG1pJkiEZ4N}T{OgVJSVb>~=W_pJoxS|R^pu`{*N>K|+Zm3}HdNxmxcMai_}IOVj6JkMklXt_ijzw5`8ojwR4-| zO+B_)Nu=L_*rs--EM4Js)na?gulDXR_-rJP0Hr()Y3Q>`rr<_PrlTTgS*`f?NM(@T zx84@aBev+zx^(JI5&>^^qInm*asKESoA)TJEmEXkM9D&g*o~1Ca|L=x{hn@Kw{QdE zD5H>E`7(KMpZapHwmYyQt(z^s>8O)A4LmgzBEQZ!;IWm$D&hz1H~Git@HwZ&`QLi& zqmI?huAAC*HY*isJgm09PTp-5IcxGXT$YX>wFVLK``AyC(`R25t-c_e{_p!Dl)m&o zzooT>wcZp#)RPy=WOXTEv8+gwA1qrxAEfNFB&mff&sICjT9p1fhOyMFUfb=l>E2wE zb4WNhJuDQVXRKqyV_nxK9ap>=`(nZC^@#3ttxlt(Se^HaG15~h?%UqoUf_%a-KRo(UGCiubM9jGaYsHX|1 zivWXIS`=vYF(#)0v-a0>4TJ0N^-ms`wODT=v_B;Wt|AJ@i9viBxF2n zq8KMZCvIind|vjTA=Rd4{#`clxaesDLJNV22=A}fYg|Xma8+uC34J`!WNhS(&%{x@GKkIVgk>CwX+c!%3h@e|dowS^w%l7>ZK|mD09GJ! z1t!s85dLP|8)^~kH!)6AJxTiOj@p?(B+!oFjSHpxcr+$AAsAVmS9dKjs<|0#79Bs) z?bvjS1i8O=JfWvA5s`(E@CjqX=#VAA2;xQPgcx-z=j>Xs}_H&T(mlw}yN zbqF2+f!-V@d#62^6>zdx7iWwL7hm8jdT(Tdg^@|Ek0_q|6()pS5`S@x2RwHh&tZ?jTy3J1el${3+k)xjj2`5O}){F?hYci-ZCfLhLPhl%gF zJw#zcNEqFxfGWPjqea2OWAf%Y{W$844ilUgCj}>(9}0iR&}{E`I0WQUZDS+jy5emE zr?pn*iD^{WLpt(BYIPl>lhyj<&Ch{VRWE2MvQNDZ8p&cfv441jRQ1E1Ja0p=#mHr4 z)PI$xD) zV%1x2B_@WM5ePyRPR30fef+|bd7C=Hd*J zCBDEqLthgEmPwKMYiP`urf1y>HwP29k>zK%_xG>>DJE;j{l0>}MgrZ;Oyn7oR(uvV zO^f(D%b3Qg1d2)a_xBjBcsB_MSTBV_{x5&(y2gpA`+_V2qDA?P&wa!O4^>60z zjK0m9+N^~s8YYu8ap=Zi{f+ND0^3RMIg6@U6fTjS*ejzs3%<psp%QS zQr|+R6I~{AEbNV<@ApwOH67yjvF|*yNN_Odk=-ZFN`r$(FhQ{1p2O%KUL_L|eqky; z3q>?*>-7zUOZ}Gdba4V*eSuF1GpmoP;ObD+r@$BZ*oT|8J^iPdbM^1vb|`0B$k{EW z<5GGI{3`$QMa4rI5h+^zw~GSI9}^Cj%-we=IX+iv90WT8FSlx0Jc5Jc+XyS?bOKE$F|^VV+oO!)+kdv3So_Bw^}}YVcWq+G zsPHNin0RED^fGUCzl>`>KiE7XYlouT_3%q#$Cj1tWJyAeXc)3jDy0yp4_Wi?k}|KE zHyTWzS*&(6j7h5>JYKQ4uuvrOdX-EH`F_y89)^8LPa@i4PEV@ZYCE-jhL<|Y;%^u# z$@PmJ1d?6MSjFkVWlU`PA(xbm&arYKuNXP4)FXZbqa==04)JX3n(?dBv=SxKgTd-f zh3ZIFRAa5}PywdWQ0USvTrs!;m-kknCAg4iJNWeS<}>x1a1F^nba3<+7^Bl!C{avx z-QU)KkR}C(0h7QR+UrR58()$OJdf)w71Chr%{spj<(WN23^`_3?FzvVeOR;&4;pmS<8fyG3a{=F#D;(+qiYYp;0g)Vfre_-}rivQUqpA)I1uASCWP1Ol zp1Hh+4mpq+A=d$GMoL@j3vdqX9)e;P>mdwSsv&dvFh-1`;@>D)if)P+jSeT^jfC5-{S#795M`3b28(J+|g)v)MhB{%=uFm`p#vN;yp za)P)kHz9oAFXWV!9)%P z3--nL7UU)>5OfdAuZq`6iiSSK&wRbc)7GB%wOu^2NHPi7p#JrAu@N7y)<;&9FFQ$i z&_=2|n|WdYkUU%Q@9@D}uhk!D;MS79i57#$OS{WIb9ABU5EW|(Zir8VF1$Bbhlqlu&n;}6?Z56Dl3FYd3gxOl z$tlyG5Gq;i_Ila)Xc3P7OkAy&*$J|6-n&KZi>i9wmPGsR-X->u(*BG;dqeqBW=4K? zNx9uF5sGk?!`g5`iSEt4{YV$AhYqaM$X?qCU#NO8z~jfu1h~}(w7&=OD9<@(Pfxhe zdp0^p$ln#|B~+57E5m!k%gUsGVrrR#bT1bvX`cqTyGBM0o+zYZ8D|Jx!NUoB;*sc9 z)H?JKE<8l~&oIJ{ zU-ad9n%e?|uAU@oy~(E@OMLZ%g4|{@8XBO~E%|UY>=2EPJNsM|{sCc)zWyJPTkUbo zmW>0sxeaqLd}PX~bOQ53n$#1TLq_kiJW*5Bn%2(5(@vqH_^xEi8p7YGIn>d%tf^W} z8^De|Y#=JHfaK$S*es%-3Juq%T68S)Kha@i)xu{?cp-g!Vt6o?)Zox(lpqBhbE(G} zT>m78fR{KPC+7$}=Xy%>|y>#5%s?S+-oq^?s(Fy@QE*(l1T1 zG~{fLT8X$`+7!b zGZxYGazPc*S_TCM%S%yD?)N|AYes6+khq}(Iv{)7GYEKSf88Se-=Wv)TA+a5HOP}f%>bO3Su22H8L~_FzBpSqGVDQIX;f!z4jjk2)zea z0M9}o3M+m_>OG5{=-j=~9h8!_3rYLt&$n4bMUv7AU7PhOeBC z@8EQ-M)HG4e$MpW(TK{{`NvgsiZykL%v&YlQWxKvaV4{=Pi#Uq@1OZjGEbr#2Jj2< z%~a~@yF!oLBeKbrQ%20wX3iucp^3d?!;^tjenpoUuGHfOl&8Y>2Zhi-du@;QX}B1* zPnn`p7&2!A6l72mrR5g>1Nrhs$4hHXhnv79Z{h+{^!DAr`Gd}|4X@hK!5GFF-jTW< zUXjlEzHf4X1FnrEtS^CTyiHy)8t@9nU0r;fb??7E-Si$UOx=A61yc{-tRn5oo;41` z0%*;FWhL-x+hosuBD&MbmeZVEl{~2myA#5@kGHmueqJ<)}s&ajQu61y6 zbqP3wu&Kfm>13I4mF2NJ2KGcmDpn8LTo@ElJx+a-L5J}dD~tjyE%!NA+V9n zCnH0|t{Ma1e2%(F^4()F*taowA)r+xp&VtquAqp-Y?uj70BWOhEc%?rW)di~1pNr; zs4hBQkX-S|vf&Nn$Pu7o{w8AMi_*^thDLI>D@^=?kRY;qd>?Rc$=hJRn#mB?5V%@Y z$*7E1td`QVaW=gIxy-VIm|EQ42+kV$UAegy+v@)=&Bo2xDzJELqC4dSu+r|+4~|hs zo-hSU;l=9R9)VOAQfs)92L-N8*~kS zs|=)bMh-0lzEPHc$r%z<1Cc(QTr^W@dAKxv8AS=vZkhn)Jb?-X()rm$CcG(85}lo& zHR?A^bM*$ zP)Z_!JcMjMLz#YCc*d&Q<@^=D>-it^ReSe~E)l zLr(L}!x(~`+-AeOf!gM%Ool|@V2>D-Q3Ao}xR#Uni z|FaLD!A^=O+>?J(R%esaPE5sXOU7ni_^Ag(yd8a~Jy3-F#QvAF+@2RROifMju5i$B z5*w-Eg~WQxd#!_{2e0)?PM5nF>R%-h1L+V~$!OVXwDI+Q?hZPxceJcLy!&LvDFez9 zrIBXNxa7i0p2kWHHvjZMeH?wfGVe;FOOkhr;1UbqSvd>k7=OI%2(5e{_*FO*)eenl zQPb4794X9OJaFQBFxfqx>wj~S#p55$2$ae|6O7Z;v)B6`t1%~7z%HaZ)O6OvPGBw= zLm*gYB1FJsvxqi+B2S)Xbx@+9cg&^nR2YOCPQ+2^d8E}(QDp0Jpt);ce}D!F3BJ|k z0M&)P9>{>pLE!yy2N@3fnDfKOe=k`JkCe0oSiyDm^mZ+(-=k}5RqVgF4ULzNs?THe zMhE z*A|O1NDzfAmWf9EG+_}*`VT2*>^ zVA~{+hcE^8F19GLSs~N&cv0}EWTT1s zE0T*@l9c2OOeYcp{hZ^P-4c6@JsMrn;)`fx79<&6UZ4V9x^B3P?_!}W?>+y?5%C5h zJE`L#$p)vD4emd`81h+WNl~m0I&?L243k5O%aF~q^BM@;8Km=BdX^%E<+hbovHbQA zil4MLo>F~JbT@u!%7G)J%UIM0JZn{bk^%{eIczmp@Cv2#K)s%mteouZ<4-qnwXU~# zCz&?DF%7{4Mds^OFEN#>FqV|`&#ml<_T$$s3zwwSmEbZ+d!#ylkR)p}>S-m0nvPFxUc*yAQkrf6X2_zT6WhQe7crK5R(YjPEE3 ziqtO|+uBCkHxCXB5TsV?ZQp0>Ld*hDp@ z3Gkb7m%`a85`Eu29WIFeXF{>}JMw>Z@kQm_cv!KkE#yHO0u8PV(Iy|rIzjUpR1q~A ziW=A)8Ju+uqkVmN%znp7zHfvE2Sus+;vmarkKYS~;b>$I?jI}O;BOf|Ei>!XWAT($ zhaT`*ez%O10x!r(vq`{|0~a^faFi<#8QwW1{p|yu-f8@obWCp?a43 zoqBalgXCD^y%dw*rH-nCyqoQB&sqG0N?y(n;McW(n{I|dXkcgmrhKK>HD-0K<8;P0 z3i*>ENSC4tAN~%vSLyM4#JEKYiFxz9N~<09A2}C`viHzQMYyQKZz|>M%7O(Xt6zB$=CkG(*9+ z(ozaGs-`E)f`N@Lp$kW4e|CPkdjoTs%e20j2 z${Y~k;CDlq#p?o9L^Pq9BSq5~_RRnBlW@nxkvU@N6nlfSkFaaGP!iPBYIn|et!>rUCD z9o{1{hiYP)tX_^9MmsF6VPk}lTnEVqx=^ctExE*KXb9yMxJ&<;)WB-9l5u0FMVe!> z{)Tb*{++u13K}*2h15|D>lunDU{P)E1cmBzwtF0pW?ETaD-<0)q>Lxv9Xa6LBA_R= z`_&6oUIBHK2nsIfU7!3%t~(Y?;6_E`JThERXVj&AH1)WwzULM!iO(rxP{UwyIqp=T zq|6>}=;~vH^``Dwq2{m4{BP+Ot!(FU1*eK^g~~92)Tq$^b@(J#Fyj+uo5iC_-~1O- zD45kFLlC1<=lZE?^0Z;UfHWYOa5QzOZZ4`_G*4Yv1F>$duKueqY~)d^)iGs~p7#3I z$5ZBl%ne=vMOGq=stIgY;i&LWV<+<*Wms_KVcX{g&4r@_?2(?l5ZaZ6ZEfYsK2Zy&WdcGfi*5iC(sr$U~90+WCw4j-p zvy#`>Yfjl)XgP~}Qr8$(>HhVB?S7XJ4MHnb4LBRwM5?}}tn9m$=;q^&+fv-e^6pn8 z!TVZVOO9h#pYOr({<4KwZ~n*3O?kMZHv(d^!+(Qri1^)uLxR}<7o&+Z2eD(Tj($x| zK@|(0Zy8zr!g^i#;C#57;1f&2{GJK_X&?`yw^a(Ypuxz*C$sbjT3%_Qrp-BXVginS zG|i49oI#2Vpd~bUU3c+Z;L+4}zg`RUrX}Xn;}!bpjH}djn7X+or(e<06w^F1e_TAY zT&+vQDvi51y9X}Hx@&SLp6hjnmeD`IaY^J*eAe2(UFHYb#N$Ej zDXC82>8bom7FNgZ!E30OpVOU7roq58Lp09AbBLaiC2(zWKRmm&oIj3^i{1GYLJ@h) zkw_zwPBANJ_21$tg6!R2_e&q%cwey1z|aU>aoe#~R|MoWh}VxySq_81P(T zuopo~YQ}QNE)74o%|})Rt#Y1m#XQy8>ej?w`Kv>~4Rn>BPH}GXTq2wimI@AU5B{;!5O8OobRsNccj5W%(j%Y&a z?Mu+sJ0>!51u5fk3peK3xmR;Y%V>z2tn>bK5^xEBd6U~cyi{*-)UX2FP=3B#2auD) zDGEYDLLx!mG!BLTfgy1M*B}7Dm6w-i;o}0q<$H7TUBij43ig%Zw(lgHy zN1C;FxQNvlfpc@9lt(1rD2bn*^NW*rO9Hq2)i1X zT5EV&8l7T)N{;8z%?ptjMU?pajdJ^BCj=u@4uH&Z(4x4AjeugW;rKZFP*j(zOH`Px?*=*4yn2{f z%=%wY^}j`?WfD+M`{%}sjG+%GlKrKq^{Mg>KwbX=S0qj!gUXTD&>}!dh+IP<+&qu~ z)anW9=Sqj1JPft-Q+;*?2EXoB`izKq`9{w4qulwpu=JSlWHk0XVpu+e`jorRN4HL= zQM0#E$?1RfEg{PX=l$W4`fUPbc6h4SpRxi2wfaAxXuG1Zhud3DCb2JAL|h|9uf(LP;QA^~P^x=@B*VeI;B2H`MdL^OI+t%;D>w3c;m@}c57qkm&k+!EBd4_N8wSp>jf+8 zMukgMrJTYN!74#f3@58?Yx~zR{EQ_0!_zy1AW?~W4AvQ09`{F>JMWl;D^{8k3vKOI z1#N;9hgHLpS=tCFf;+fOLc-U#fER~bz;%_Cx&63JB!xPG*^=ly)t}5eZXRVXv{zEy zDWk(T#p;|(zU{xYdU3Yyha0@izg-qxxWCfl(ZucfTuS>`Q0<$ZYT%z!3640Rn{|FcHPf6fOmDc{k& ztM7A_?{WRl-d(&~24Qt503rb2irRBeG&PxmypeYoHiX!pq&Ll1<7w;VKQSzig_sr_ z!;zczTq_j~5K`R;#vWJR5_#QM<4laqM7#PxIh{kWq^fa9Ux?dJU-)|G&%}>^oisGm z&0^=fuD;6zqQVUD95?a_hFhYmV|m5Z#}OTDyzY5CRT_L~WK{OiqW6CnQP(~U*2d(FPBMkMp*fGMZ>uMa%6GH-8g_5#( zoRBNA%WXV>uB^H3Pg)2KSaUWJN}?!k*ayGBvdW3VPeLCd{RKWhe?y>*7*+*s$D#Wb zo*a_~-_kG=e`03f@R#M^;W;I z+AAFEhJVi|`9prZB|r1!WkeMUQsPnhUiYg%FazGRh4#4p-?Z?p{?Xmc4H|~2!72OL zGjK-}YWCuG(K8JQ=ivB2#o*~!Rx8Wr}(@JlYrcqT=IDU-5iO9l~o|c$(JyUylXR=K=rw#U~wxwZR0wq zXv(S2oU)b0Q_Bgsyb|+QO!~dUQcTEr>KV<|l`{-?UsJnYL}uxg{h{b#W$@He zsEZqdjSgGg%~FS_X%Zu^uJ{a|dWANXx~{N+s2$TpRqqIwV`D(iYfFr7##NYTP@j>o zZnvx~U$guyB45X*O22Eu-6u+|B=%}psq0UAeMyV&6-BfCIu!!t&lWhI5#Yq&_mqGt zumJyA^>z?)>1=h#gaA>q^M4GTB>Y zB28Hp4Ok5g7QW@pp@blTn@6=mtK7za$(^dKkRC*qWN5Xs2wm%HPVYld5>b(jTJIb#-VOu3R3Nd^flYAgwv zY9TUN?1*))+Ah9=#fVc5hU$8wY5LLbZYB@z>tmVFkV#p?T|dyQ*StLHqg{o>u^1PHTiZjMmO7+dY_vU+$Fegs0EWk+h9N6Q<8KQ*CL3 zWaCp&iD|{_sOEkuBW-`ffK43P<=HVh4}>uhIU$&*=W1HPgLhvXw9S$X`z)c4{QZK} z2x1uACj+Yyf(Vt*lTWV(w?-T}U3nM6hg`j_K)Y%<_|_}?EX z?|gK%J(!V1m_*~Ly~{jp{r8!Jr)@3&uu0$N9Y&_Hz)EFN^xz2Q@H!|ujyDmsO6&=o zLa$svq;@%{7MElWG!b@&Izk zFyGEYJ0%-*SsGnB?4+2(Gtw$G!4hx^uK&VhyJTVFm#t;+0qeH|CgRX3NMj2)4D>i$6cNGZwnB(nYcYe9lf>Nhs%Xk{>& zWLu3fE=Op*eo|0TrC6`qJH(Ymm^|D#_a|LBX5Mc6*J?Ti2~BLvr@wDkL8(&B7Zg+v zdQKw0pT;-dIkVixCYdkaE&_7vOD1a?8^@1~RFAVgHq5N7BJ`_){U+uBp8stD>D6id zB+&JdmX(!1ZFw0)`uYPHhlBw8W}QkLfJ7$!cpS{)f53b5&!v+2pF>y3=S(9Q9jI}1 zvf0A{6wJb=_>^~WVW^}=zWKv5TfE1VCKc|gg6`fCU%u4O(Ma)LK3a*Ar;*@Wn3^XJ zJc1(T=ByF!Bt;9fOE_nKan2M@SIk<@sgNJ)h*#z~9xe({-o|c9T$045}T( zvM*OmTTfg+uizfy@+Q~v6g=qolMXO%#GqVQ@NJl7i|FVCD|1*QIFbD|53bvMIw0Aq ze!tfBy`JqB$CT==4kC>sB{d=5b>$}&sh8~ zwY3c-TeSY-8I&B){*|t9+uSrkFB) z%i90zmBMYJ>5-VHY$vdy`rLVLBpnn+O?aP+E1QHi35#ij%@gql?GBpQYoNJ7eSiW1 zAt=)S0j_vabPN4OmYsA6+-&S{xJTSc*Q31+rkG0fcZi9Iz}a|w9t8|s@2CJ^JX9~J z`uw?LKEVR9-0*SzXDPB(O2PqtUTkIH@5PA%FW!6f4KJEI}lh(Msm=b=QoAe!yfGk9IL33K>N~8~Sf+ z_4&?&oSWC&gNG@goTf}OJv&IEfZmM?>gatKdFHa zB^WC@CXStzQz1{en6$5=%FgBC?-#~WlZm@dz7%RY4eMPbY`(X6DJ7iJ2kb$`ETiK` zx-zj|DthV&KSbEnqa!Ct`rfoAiTZzL&Fg@-)c#8-Mu_icHQ9SEtrnjH)OKCM#nA1s zVXFZfYTI;HRVG6MI_gPkM6sVNH1f#j%oS4z><}aJT%)S3e4ajG7!hUBYOG< zX%{gCHr7uF?!-77H#i6Cdd>L$&ouRf}8zsgYqrpt?&`vrVzhkNtFO`ZO<^Mw?RTm-+yB8q2 zb>Wvpj-W%HVU*0^>VZgOv#UA|iRQLm}v5OeiK1eFoh0jmyOZPUMPpx9`&%O_5^`C=;!Lv1jQ+=axSAiduP-c4~o7Bj6Z`Q;KHsxTkvR2vfzkDz0J7tXZLrp{N7r zYgALBh~z0#$u*A3Bg!yheWsHnFbTylM<-{Ofb@Z>v@;A%>0&upf~kg73p0CNzY{SG zPEDcr8^>Dz?N#{l>JI-|-G;Ntqm4uNd&W4IfBYxR*;|%iu@qKIB6c*r0969$6#23> zmlTQvUiC7s0ZE(an1xGc9IMlv7dsZfva3#RizWxUj#UtwRh9y-daGIP9;~X zpvHZX-|)6r%My%}iRcBr;c%my`;PLy@bQ@HdtaYRV<9)QNUI@@-`jMJ}uS1};uU}Pv2c@u&Qbke>VZ|o*x_hvadtd95k>LIGP2Uy?VxWzcf7wn;i++w~`RKZR63;~V%ztbCaCJSC@7*gEwzs9~ zgH8f*EXc|-^2JwlLt}r2k&D9ySyA4|77uOfJLGlE(2gblJZq-}WT-tMzDP)$BLgVjAR&i>2^bzeejzQozVs(yp~5jrK{& zTI4k6t>xBOmHf^z=8fH_mZ7U9iZBz!yyFabOv>Ga-*~~veeJUeHj4A#G{K7>#U469 z>T?n$qFro?fQSx`)<=_pYKaLK+z_C0$!-%cC9Mly2L^>?OI3HLdraCoWBo0Q4`p73 zZ38rKmve0ev8S0O|;cDubEbJVLH5w&{I4mx_ z(W-&hhv*mU{_vym>hv0j{Q^B4i)(AtsiP(p>3`1S6DWg-=4fbr)bp(8h_0|{Hw#h{!vPUmQeUqYWEAqRPV=?%d1@}BB*x=fT&mR-OH4H3 z^~oq0!O7OE(*VN9NY%V>3ncF~V&E#XvD^aauz&sf{un1T8Id&Gr}AezN$QtssATBk z($da)Cp=MZI&nqVPo7xTsjy`*A}C03c6MjA!#f)oCS6|p?}U)=I(hVfrBDPNPI_Hv zO^`lPkdurp$KHF*A!72f)%lLmq@YoxP^KM1hX0C_V{qSe5$~%h&3lZlfk%2cwjM`U zDne*y(k^0CB0^9UEE9Ufw|fRNsJ@5;N+2_hJV^KSA~gCz3hGftmxQ}B&+YV%^39V^ z6fK_~xDp7?3;+2kSwzr4ocs_zaA3<6ks8JbYi4nU=CHZeHg3EVb)|A$4drICjp^Zn zlgU34I`0n$8u5=%byKTw4%OgDe0=(wkja2pAbGX{T zuo&e*LGgMM)CyvJYp7Lrfh_+s#`WVGn0h-$?)6J>aW`MCcHmSpItqljw^v1t3Kq(r z_rj?74GrOC=a~BLrztiS;?wYz6$f8+?XNr-$w02UTGpl~AK;OK%8xGn2y3z-^KtAsd#7q2GfsoSfY=Ty9(-WnyXi>EFEjL~zxlC8IbqPTF4| zyFWZ~Dk`rmZGyN-*Qn#9h#tYv#TFJoE{JGxpvWeuTA)LR0Rp`+(dWRYy>5>;9}ObT zPGCHe&pbMYRiaBpiRbJ;8G|EvGdU2H`|#+ucS}uPH^VlzRyJMeI_WkGRcx$+isdR6HZDo>GV-5Q34WWQ7#(CY%aTe~t$+D~77hmmHTZRE1U{-DR^!%*0v9bSu z0r~guWUu4XpC@ksnJ^AOo3vEL z-sA|ngnDfF;gZAD)0!_Wt@Tx3Y-ywF3o4;EVMt16{go`3tnK)fg^(db>f;T$w@<1d z#r!OSnRNRmLO~_yN}KmUZj};m)lG}|8(E8`F5cD;9zNGzU}6avsq_pzv)cUwMs2aa9V|PMv^4L8eMw+=$J28|Fd~^_w2? zrH@RbFx=jBsg#zB>x6lKdN{lDU%FVIMANTrO(W)#UW39`WmqV#MpxjMi2OXIVw)pQ5P&Sg^ z-@7latdPrK_pl7LlBAenit}MpGl}KeCHroq@0A|JDFgQ^fh

    v`*zhInv|W&f#- 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ℑ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

    |D?-<&; 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®&>_CCe)(IdSq7?M{c=S8wv0-~A1S{UgqtTjj}% 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

    ~>@^1MeU_%~kFtt$whPq2#l9hMQ8uM$ z@PWfwvt?ehVr=IUqQfsX-GpqsCRi(^o`OxOq!8DhxMyn2*|GwAq$-(Biip-nBr)P& z0j8<}i~?0L>4|A%2`LE&!le?za4Es$$eA^+3xhJ(@ekL_!8h_qj4?A%Ha-RH4PN7? z?Y*a>7<(pCd+y0kn{j~pT33Y3BWE`lXDcxkPdS)j>YzNEUcvJ%+J7>#?688+?JUSu74!Vv$9;j!vfOeyA4 zMzI#$Q9utaE+pW@DZ(JsfA#0|yH)+A*CBSycJTmtTeTC1=l4Z!QxE*a>F!ov)eDm zX}-|yx7gkQ_bHr>*aL-nF?I}HeXMeR37tyhSYBZ8O9gOyeCJ zZuJdYGdNv8329=6b$mlxgNT<$I%^!i3_~=M=fD4PmZ@$L{AVoLHYfpHNt@%|kXrlQ zysBc1-E-t$L!p*lB=^tL&C72e&EF=|wf`8yj^`OTo~^3SCIrX?!2P2UB9Xca?AoG~ zC1@@Z*Rr3zdUU_QB6PYtl<&D;=g#SHz~pDR9v@>3!zVXmM&yG-t(xp=)_-|ey>cs! z3~=>|?fzLSm!@~6F+G>6LfUQ zgD^5w;Us~-!^dSws;OaXom^GDTEt}deHRH-+{x=TcFU$hu055u0@OCH*>AIb5y~;tFHcr)R`t1r-~aJjGY)a;^|ymNAh`vTVL>f3NXLyz5IP z+zVl>Ze&{;IPhus3;k21vHp+VoKa<9!w9lMUP!H?j8z?GRh^XgYO5nACt~~WSx)}J z+Hy}{ej*bkb=3nf1%>u2Gti26RBiulW))mjv;Jtp-*s(CH~C$3}X zgQ)5D`gZx&F=b&Xdg!`j`z^5zzbz z{trO%pe!smgNM9$s-*T~ii(_dcy^9^XyM%juC)*QHy6!8$Rn z3rsM1bW+&77LdFAeqiuPF8IEKHVxZ)k*S8GJE zT1>g;cvh93Hx#(%!SnMi7tftAVIxQ%SkwkPZop|pTi6Z>`#XKx=>DnicVRKnjP+6q!2Fpw@&rd< z`s0g>$w74OP6w*`@7aEl$bsgS5LyBs&!oTfIw#)yNB~4(YP;(TOTgqxw^x*xeYdd1 z@=DbtNFZ1^CB1BfU0-=4h%K!Ogg4Da7*s^(D5W^r?w8vf6q-a&LWQ zUd?S>U6(R`33ONNH!BM4mfClRs56t)Ld(c1^CU`q*ZlkOmifMK8Q00V6Z1|{YQM)GGlPzqqT*dCOfKypbEk?s!gzTS?-V{ubOEW)yz-_YX7+0=}776aY} zuGPYJ&z#j+?$Au`>kH|7k9yJFVAPs z9<=l=ovrP%(cs{?EJmZUXeKS$ETj^ldFARC;UW*ZVgH^bOwIfY`xL6Vj2&b)mC(SZCd4mQCL7_T1j4XNPgsSoq{(Q; zHlyzz=WO$RarWf=rA+IrK*zv3;S5UIv}2Q2$65PR^#E&SfdG5q_#5oC@Ef7;JH(Rx z`tD|k3qzJ)u;e0^H|w%FSzlg7R>1@^2StRn?|*ca_227m@kfMqqTgbOn#u{>@i~e? zeJO@R=}4@s@)?tfLH+RQ;A+}33H;CA_={9`(HqsGhli_b>I&-aF=Kjx@oA zqYSsuC7Z-l#s-jR4PA<5Is!5JLfA5af0QxETPpr|4n7U2n_cWj)0DicSMSfG{;XUW zT58Rzh&zkXHqgv8u0X|y_XLW;^K&{gtLM(I_tvhPA>C+5(TrvuBlNker}WIsyY+>7 z9v9RhXFjce88?aCp{mX%<6+LROp)Hz7w?{@j}qQaC#-;!?fGV_ckJu_Vry?SwMWFJ zIEF?B@`Tt-8@a;}pGN;VKwF(8dpPA;!2b_S2%-~>S=oHJj5;<1Iflv)6{@I#BiNBP zG2(hBAsqzjpSeO7O@X+BmIDsU7HLS#EB|F8{Cf@%H`=i8K0<28AFzjfC8$k}HAsb; zN_V6WL24V+3f2%9@5hGx5GZNFhHKUcDqA2?hRyFfqlY!NHahQjtb|onCxQ^he_kiv zOZcuri;0C*@}P43?#DTyvNad=jw5jv|8?soX!>>S|FrcLpQ#BfMySjJ7F4cg)8Y&?L|hNnwu4O_e^qp1aoE98&)L ze8|n(Sx=X=WJl|e3`6%I#CQ!%oj|S5rGz0np?dlTmoGwF5|cJF;w+4XiOE%MqM=Bi z7o4hgp+Am*?tC4;vwyX)EC2qDemoiAjX3!w;1* zR(7POukn$?ut{eb&VA#oSvNdeHRGt!+ug1kza>?ii9~}mJB90JDxz~9tH9?Z`zSep zrmAqlmm)2X?r(=JHx4etF2=}o0w(x>DZ5^$hTktWr*Ffy+#^|KD(Rvkb6U0yA z$!h95-9{J<{4$@m-kBYJQtUsbmZ8Q;{4t7yd6c_zGdwkW=JHPm z$aMj5SKsV=KLlz5tNi|y8O-XZ@4TPF2%bx^B2{4q3RRpm(gtgWMmn;hze~i#YweZ# z1gH!kDk0{R_2EQQmj#Ps#cG9uvzQj~JzXVT3UIy=)T|+v*CcS_mi;FoeuAT;l7Gz+ zL-=tlsn_M6psD}Kb2Kd|jx1(cE=Wf4Fmx}D7Wxa9%P4seSK5qkO~Z;A@xfu3?k9$f zbyhVK+LSRn;&+@cZYx^>bW^wJb}i`>I54a5K6gIpq@J=GnwGfOGAnu1MX3TF38Cat zF=c|Hz3WAaTA(o!cwQhM+lg z!ESyG&l?=kHx_9G%n+o@*s?b{9J8LUv_1WOkS(L@z!j88xS1fC55BKD(wu62gosE5 zur9cFT+}6hqwWfndx^@00+Z#A0Qp2vKzD+!oJI;hx@h_)pK&jWDi;gP))w{>c z5GAVyS+m(TzILUzzwyN2__c{S*%ku(y^pE{_Yr8xg))hhxbn5-@U8qZgN#x?KRFsH z2~8dc3d;`hc_OJ@+aAo(_4_~W@-?RilaDpg`WF(VtR9Myo); zcksV%Fii73fzeVTPxRW*4Wro&CN9F~#O%YExs$oeVaV8MC1gg?Ot+7ZI7gXG$5ll+aMnaFyEQW{kn-fvw{X%*M5CKplU_N_QZcFcDE z3br-CEpbto6rhUYIn)3R7R<_}nUG381RG8JPex#XpHqBCG<^s`83zh}F5mtcyyxUN z+KlP=#mkPMS=A+wi+EgyCx{{Yw^*&zXay`Ot4KNDlBcbz9Y>~VP#>w=EHR!Nhc>r! z=s}2h?jr62ascL*xEj$6i?`Ah=<^>R=hEX2`XYdd z2Y!V0Zm&2-znAf@hs8B$VlEf!?Cx&<2D*NuHuoEnRED3sK&=V?%I(3kJJ5$O14pQZ zHN4C=j37HN7ggovKMFYzAY^s$L_-W??IO_CJ-YZo|7sObwiI!cD&)~BnmF*=G|I2- zcic2^CDR^hdVKcbtimx<$m1Lkz$T$ki5H00_Go@fR@W~lposQd%dvrgwkgS%wVp`e zxDK}bP2^`vNy+isv4}S%( zgs9u98_L=<7t?j~FTWm!BZB<~W}D*`_j1ylFWN(YnfAI(X5W+Nt`!LjntOaBb?7Bz zx7c#R;V3j{3{*3%=vnd4=c*Q9nu=&->vq5SD@tzDu+T}LEU1SBUOa6c#q@r{d|hY~ z-fS-VGBY!oPTWdw;j+-8TFR7kshU+BrxypnwLu-00*-%)Ix$ z)UO@BSmPwjYu@E>)XU_E+@r$bBsfgBW7kR}lsmhWMxNhy^C}rs^z+7{Bv_0L!_M_Z zSfQrbSsFx0GT1CPFO^q|)4%EB%ni>`PQei8zRlv(G_(x>xpS1j&vb-FqrsvOiwluj z?M9m&ZT=*SJvhKPWpys|B#@EKIJ6`{nYY>hK#_quCL)>1VVAVRLF75NT{kgbykgur zr(>a&YDCfIF|>C}1t{F|cCkVJ-5YiSug9db!nuucS>~VvAb5(f>j{(S1o2f0Bd^}} z>SFfHv-4_CkuLya@5s)3QPc*knws}JY^Jh3CsWOSb#C|A*PGv$C*G5DrLOR z?3LT-U6zz2*HOJ@wFaCCe<2^VXn_uacFHmH?pUG952j!rcRe-@a0T30FVi4~2FrTA zq^j($vBtQX>t&J9s9$Jo*6UrmdyAK_saKr91|m&N>9?%8F8k$gCowG(*A{VET(RVY zC&ZObx3FrjC&S-NW?9zMCBpPW+EvI@)TLa6#pub@gd*&wi%X*YUE8l4o#*El4J{pg zCl5(kT7ckv9R#<;^`-F?t>5f4@PB|OlE#yR!Ao0B7;to`}`MgK|jhz>2tTi>*O!D zHI$1;8n@(e4fRomR8wVC=?FBgz%&b@gmj@;&a2-;-EM;C&Wwq4$*d%#3Gn{u9(P$j zkNUmMJ?d(8o$Q9rm9TVgzX(y9wYKP=?_c?A);Epa;+Y+P{L3TlQrhlY;-CQ$`G$I} z=FOOkdWDHqLTgTk`UndpN7mK4#Vwhp`SLaOCV-gViFL1?YJq6m0qzhH2cuMU#$r`D(Fe=Fos-N|6iwe^B0Qn z+Tin@5pcaLU>_3j{uOB*cIPwV%Sj}w<}NTV>74i{1LbGXc=Tr9M`AjMuZOn8fii}D zTCu$o#NWd4^ep&m^Kej6;2^WMXQH*|-7J=&mdOzq(+)EO#QB>v+d5G=Y08{-w|;$z zC=i#5rFw8c7^^#Fox)B$*(h<`%n8g$m~yh4Amb4|NZc;7GMmAwW*IeuHdtz{ytXTfbJUUa<=S<$D57()KMf2 zS8Gy*6&(p?MkWHav#z=Gg8WEMJVcl_t^7xo&Db*MXut{;_PU5vTJ;f1l;LOhP;({c z^TXOzU1Rq+ZEaVd`!&T85LfHwd*tT+eotN1{Qi0M#qd93_y68T`r3SI_x<7-beAbY z`(0&X4W*8ucEhGGRDr3hJvH@UxA--k*>%6r>HU?=cs;Qq&ci?H;DyC|-!%8b3$IeH zxhUsSRpGI`Skm){Bgt7bfYc(ecfND|yZDKVXM@D;doTSc0Vpg9NT!_=+ZG(Ez;z_= ztePq5u6ftIfJHzylHhZ2b29=-Ql46HhJ4U@^cyh~PfifnPqZ6>k#p{m?>xuQ+44k) zo7fSKa*;l_H)%W1#EY@V^!!sd#xkvqfyekF&*ApHw=^QqkCNXtG=Z({JzGRLdCbQ`6G@ya<^v>F_!$TgoDb?3Mw;HJalOW>*I=l0uJ;clbB+>hVM zaSWF?)r;kyPHTizp9nLpc|!v=O*k-Ke+bJ}iDK9&ZalW+rn^625b*mix-Kc3h;9Kx z2a+yOqtT{#CtrrU7gOX0+!?d1DS+9cXyDo5Peo*4M-|nAfXfU?tqdP5TI)=SxG`!x z?$N+Hfp>fehnLWQmPyFNkkt7b3K1leP=wwx>gxDBO%tc5KYQLbu2|CL+%KA!05Aj< zuu;z8JUSf-#^fSCnroZ3ouHkz%t8^TR;D#GagK7^{9wPzeT%=i_&LSr8l4oEO&o!s zL#2?*H2roiVK`JpT^UzgjZijc|X;C#yC;9nH(*duWYdWa$TJQw^R2c~G=dp3-> z#aOuqi<9g%TU}AH@aow+cafrDsn0=v_ek2>`rGe=v_SJv*Jj)1@TqE?ofl1a$A%Op;ePz<2F%I*lJ^p8e8p~K?SOzQ@R6u!#xYWTa*krSsTAFn_cC1xT+=A`nTlRv(QCqK&l8X2T zpRfF5){(cdER0e`eQjKI!QOj)2}+7i)-okCX$9&gc9wN+Qvt0|kpHFhNDFzQ7GF;R zT(=Nnl9MJXyBLBCG|K#l7Al$wr};V>(chHgELGJfuATGZ3JL6CGgKv1GTz^H{My*} zvz?DT?y8a68at%z*hhDz<+4>z3}>AtB~+-IysMNa2R&94&It5 z&hY*Q!yz2xRn+z>;wW48Z&Y)MNd-tHa@vcgLBf_i3kXT{u+vcrl;kn0t5&qvYBApm zBbs1qe$mfVgO440&7oQhzGtkiuI`3l>2CuJ)_spDIL0ofqo@CkHwtbcK70ue5az6= z9uFBRTbD*CxVtxDFUl6G+94juO0naZXJ=%LW9c6wnt;y%us%GRRun?ij=#vmLD~3el zEF>6VeJIrR99%mNuxH>3Jof=R7TQaoDJae2J4>>Mri{+l}HFRG_n?@hRjAA&l+Y+J?y$)XR^VyO=P$0+JbT_g{i2Zl^tUU*8? zL^kmuW)GCm5=Z<5GL*MHAn5E*jPKQY7#*R&U$>qoB=NZGPB%%Ex$_^X`-k7!_crp5<*z(+DRX?wD~V@6h~--z#L0Wg$edL=TXT8Q>NoVU_cmBG%NJ=tu zk(~j=T%-T2hrqsPW6PY0q-P=nl>=bo+6{pNP}PaUgnn69UAHVQKUL8o06GQV!@Mf+ zYpJG?XDdKakB2U3u>OckS8!Xw!vx-j3OhDL&+^^7d1n%EmY&k774!>#uL{3J;`-%2 zFRP0ANm-jRH=ordu8-$BIN0y;n@Lga79kULp9zsjOlJv`}tbsY#WCRcY?M!^r zoH5ht(e8mPzRs!h=?x`zOeoz0)*<5iQI6k_YV_^p<<&!={u8iX|D_dQsvtPks2&qx zq6TVkw+w->sn=Ip!zCbJE{R^e_eyh*fZ}AhZOnalWAO6~I8w+xm~YM52UrPR_040O zpZ=w>_tK=gt}E9{5WuzQ`V)5EYV{oqY8v6L`lLGX3JXY!v#vg@<;oI-RZma zbWy&AxMRkR;!JeV0}kNUI~aQ-_+dLFcWxq=B~i*AmdeNb)LNgEsL+ZvWtdz%62{l% z7L>iPwqM9!;Vq|&yEb5ifbRjjI|O34B@bIsB%0ICL=Afx#_F)VP*OpVlQS0j!BWe#nyW4aw(I+X1IPv? zr@PS)j~qouk}lIfoqC*_BT_j*gq&rdgz~Mb+b`gul9QU#RU0KVgbE=7`)V{))s*DO zrax+jj}5JoS5(YHRd^){_Soo^m)@8GuJtkEeyaaB#x>^MJk#&^5$I?(G8SG`9j`*FG#_vP2G#^y+~=aY&5Cw! z!7$oUQ%-<9dd(vhQpw-ktaTJlLb!NoOIQdYau`ji`bZ&qn_twKr=>qDg%kM;?x;Kp zmC{VA5hlVprGp_sr7&jT1y{Gz{3rZ@xy#SJfC4&4_tgzVtJNaRtilPWu?Bct<;1#W zgKeMt@lBC=`p=4wuUMRN^C_v$L~Z? zOGJ7s#eOmboLw;rCY6nt29ZhFEqelOoeG*))MUwsw;TzdGBZUkeA&~J!yqzm7oji3 zAIk_9+#^#iT8^jHt%vuFuLu^d2ytgi& zce!8TM+VO^JhWG%VF+ND8Uzja1ZZbnd|DgKkR0?bZ@M>)(_Fn=v7J=Xd4LqH++_zAQAfdR-j ztZ2BChmisjjoZDRDDd!*0D7GH-43Suf%NWF)|#sNfra5yqu?~%j1EjN`klD*;n=$_ymob_F1x#M56xiI%h^C;6cSziDFVukSFZ`O$g>1j7;rD!cy{Yu>D<$ zbn+YM&uo2pUiX6MT%x+mNP;71vQtK&K%awAXjd}c?Gvr1lSReZ4X74FvkIyZw>+qj zafl(RWd9+o9cHPBj63iK0l+^A)F1pYNi9UK4RE^Xi-FQ19Y?Q*xS;Tm%BBkx0L4WJCwD<7x>JmvnTO)_p zMEE)qRMa=k_E`ZLWE@27#f@^0PuC)Wk;)Ym((E)cWy&BI{?^SeiZze$U2|w^haOX_ z_Tl{gD181Fk(?vGb-n(M429Oo#Yc+aSVA+q4*}WnC;$w42aIMvs*n3^zh$QK4icDN zly&c{9_V&`Ja)d{K5(w!A--%r^$e?w8Zf)l0w)(fPkM4*1>|Fn2xUQ0psWH|IQoV*2krrwjK}a7=Gl5_i0W^ zfHR=$2@Lh?D-1uI@G<tT5^L{1GH42qU~3S%23L%}LdLb~>gKi+ z|H{B1eP90fMl3cP)_xARNzS$6e|4$~tGNg`t!F1LTHPN9BEd@vl2gsoS z288Z^`PY0NP6Fv}Q#0CnrX9VC1?XxyF)?phU&p9m{RyJOObmZ9V!KALFRzppD5>nF zn@AF2_wZ3rb>rgwW7#&%_M7`)M(Eeo_VjAThsRA7&LgVQO;HovpkY%55jJ$3ICc$1fQf<`ev#GMikQ zln?Wa1~5?$?v)b$5B}))$@qz-p@Dhw;CcT_poZV?K9QuDvomVZ3oS1E<$whH{UNww z!Vxr|EIJJ1E@>)LMrSEMf97m&GZKPS>um2VcSs(znsADJfFV%nU>1`Ew!}6#oIo@U z3$jjVTGcbib#i$?$nh>1Ug~)i?`cakHkQT>2}&V__ERoOSY@gx7#hS@`j(Bd^xV|>IxblKLbC+(KU=wPQ%c#b~^)Cix-h(R4(#1w73Oz~=cck0#W2M9qw zf36tZ+v-N85cJ10tQo8tt%alY<#-RymT#FtUKjXG3OWA|RY9u0I>tZz{x`XB@e0>( z+~H6E>_79-$Di`sKllMBPaXx~sEZO~qQKv(tH5eAW|jl|jJq`mnRZ^r?I80KXQ8Srw)S}WXjr3~KZ8Pu@cl~>;&k^{*SUN5F7Lhn7C-#q4>^1G zENg3P+`M^{>2x~3?-R3tF`-l_O;h^41r9GSaQujFQZM^+yw^zH)(d3}M~)n!+kP3NBz09#){;EW$+C<%iFxU(Uk9z33KA$9@#B=)m~2|06UAsUrK&AbD{AZJZb%_LGJrtBn%@jdX5z}sJn_R94$*n~ zCQqDvz~SBso1@cQzLj%(({a8&L_Ru!6JU%->K(Gl7PWEIK4Uy}96R+qn;WZa-rS_z z-)6YIj?0I1Voj%$P>d?15jgLtoecuytjO!YF#O;e#eqGc_fS+7k@sj5qmu+zm)w7_ z!N%4m!|h#8pL(3f9y>wY3W+w~q|D+t4uz`nk?=p`-$E#;wT;j=b3@OB6xB4gm*up1 zUO}2BbFpQPizo`T1kp{6*C?zOr7h?U|P+KS}i>+N_WEWI2qu1>qeaxMQJFNe=w|VcqE?<5ADPDa3 zi!Ag*icg1(ZYVyq;C&Dx50<#hgz1C(mD+|OCZ$K224L~)8# z2Ja-^>yT>mp0dd1gSaTt2;r$@aEKLU2405!P=g5Uw%d*N;~Fzag|juo;gE%XD24pb zfBu(z{PD*Kp;%lzL^dp_D$8(hh_le^F45^Nz(!c#lrr=5(CnEob0>$jLmzm)9V}85 z^R<082y~6e=zRD+EAO$wKn;`qj5psr$MsJx^W4*C_`%=*9$){~H}JATnv|L`qwxft z3gWblNd!ezQ%&zu6;O<>k_{$UZ5X?nVsMpG$J9lRD2Isg4x)<4ij>J9M5J^muP)0_!s|d(j;zSh%FypGGMtRr+uP%v z_ul2d|MgEedGaJCPB?%50?$1296$Ww5BdN8twhsJ6Iy9XuivM;ut2NbB^H*cR1E4atD6&&wx+Hu zhYugak#Xek3DPtT4PZ&a^71mh-U3BYu)4a+3~;wS>r1I83({YhJv*g-Cm%wp|Mz4OC&+Mf^0k> z8*fqML3Bw>M7!Ig-RaWncFCtB{_016#=Z4*Mx%XpcXt>Lhs1G0x7))QLmb6uEkD!D z{`r>F@V(TS#2{?Vor@Rw_*ZXm@6sg(>+3AGQj#d4Wfc26n@q}@?#gkhV#?O)Erbso zKkGf+R!X7_(+Y0yPT0;Js&P7ie-vw%0#txsr$pePsK!jHAtu!%-4(WW;n(NxbK~YG z6fWk_k;iCt`?%UuRR!RQjiN?=MkJUqlx7Q_a07mIBj)Dd2zfa{7HcG`LPuRpx_|<3 zp;Sc?CjH)li4(MmNVUQH5?}9A4g!afCUA2C1rek~i13c6nWZ>_E7c)H za10w03a4f<_kO?6^71lAjvV33Uw)CLr6tZh`2=wsB6ZI^^9=odKTNN!rQh!}XJ4Q%2e(VUxP8?-v zX^E@X?r`JweFnoRw{PBJYjcMvisx)P?`Ni3fps3KRkHyScqF57#@)Lcd~*IO7eBp* zbx_tp*j-*;;D^8W+q4qH{$P(NZn3bq!h7$$&(*6psH=)H&+)#dt_oiL2jAt?;Ug3u zTt-hbyoSUpoEO9Or$;N#%^DFhpz+sFN$MyzeC>Xu%!fR*6}yR7VnOB zcz17`YmhAEI5xK)aP9gP zq9`GbBU-H#sla)Mbv4e_lx2><&*LO@UCo>F!lo|3&_guO;%(!WbaimUDgi>x#h}?l zZ?=ZaxQRv^gbEKZ9c$t^B90@{G{Rx&M=i7$tlhcCPk;Ivw{G8II-YX(&V6F*DN2Xb z5k@PD@rcc>EvA)YT3B}XYBVA8V3nuxKCp-_YcUvq17gJVyf;m8xm znUYf|OChV!tQvzeVA=+eYIG;U8jqNGWJeSAW7>zhES^~8(5WM=oI1kcGe}l_k#A^h`=62@zpi^5rKE@%$4D*m8_EEebDj zgpx0X`*+<$5v5`b^gw_gI2d1+SlBy16PbNx2d$5@CvcS5UcG_Vw z8Zj8`vcEr|+wCyT#*{^lx0c=AZMxlFQ)E}pW5G!h)9ZCvTwFqHO|Rca@F=z5n?s+= z3eLTKj`!a_$Lj5S7-?AQ_VJY^(J|TX9>r*gw*~D;l0*vOECRv)-hkIGUIpnfS|XJQ zj&7xJII^q^&*eB_cQE4W<(q76?a^-a==PRyUXnx+LTd0nV12Z~TZgR!t2b@6$@84i zXf)sS7Da*go>r@cF9f%*Kcp@s-j!G%q)Md1ONSDgysF5mlA^AunkHN&B}Qq+*@P_1 znC9XCsZ5A&7qw$NnKB$@WJQG&3Z0|~qbTdZ8AEs^j@TIT$&i!BmiYSDo};d^z{$0O z8~5&#EcA)G9Ug9NQ%ol8Z|<x)n6e_+gJo%i4dPM8e3b+qNKLLS>v4#5lsBt z_4|2-=xmQDgdiKl^UrPF3~3uzSa46KpV|D=phjlbT5uq1M3OT0aB=NEZ(X{;m9;hY zoySCJQyAx{>(HDX$H^nNRpD4z?6Wi2h}uxb02uUA@46{G7vXLEB45IpzX z^L+E0zr_nLyvXU(PjKwmaikj4?Q2Y2lNAHDcJ8sZev1bW@36gdpY^pZc6JABZSAn} zV3VDlJqCkd&e-1BnGmNfbYz(3IW))xVH8NocrZXUXKHC8Y*}*q#tr`DKm0rX z;!pn*Q3ZeR8?SQu3Nm1z@*>`kP>jeY z4{+7A!Nn~glQyF=W3YOghxcxGl{8$K2o8U~e!ai4&5v6`W-V(pGzZ zpU8JmE_Jt4(W(?6o?Kw{21+VkVhC zI;+pb#+e~OD#!j{OqDr|GEE#k?17}xl!c@$a$Mz5+90Ep3c<+3u(YghIb=$Z2o;^tMGbg6^vuHCr)tj z(oJgbSzle_%7tsFR?_)bUW8bsvvp9GJt!TKw0mUv09y+XZLH|BvtM)l&I9gl?XjCV zjxBd+FD%pU^r^j|s%whMl4Uu0mg9;k6CtVM<7BSQiBm^WLbK3cVKCgnS;@x62IKLB zqA1wh+~(&$|2gly_a2unU1G31owqyAHmq8QO+=PW!eVFLXWqSM-ty*Ljh7xlOd@N( z^Yv34KimbcLOE3ZC`$F4AhH$-wqYAshn5l(8>Dtrlx(ftV)MaWbfQrv;=+YX+`e-Q zT*1Z5pK$t#r+D?%SNQtZzs~XF$5>uoCQVbcHuSo^xuAP6N%D)0A?WGn&?{ zj&e4q786Uf3GdE1N?SFok8rs1rN=tZMv+7j);lIy1u~|ye3+XL_IUTxJDk6Ai^?mO z4<8|EcPQ(MtSm|5ntuUlBO}^@gAem9#1@Rl5ct@qkS5#GrZ4UL17$1Hvywe=g17_mU^;26u1H=CO^scN*syaj$+wB%6HW;JOQFG0E z!Ie)w<=tQWnqR%~E8hR`BU;@)X}imfYd7%O6t81+l!P|OD2VUqnC-!sy$os`B@U}3 z(wNY^Yr&Ncs}*Uoh$rHsk1q21FMrM6_JEb8LmWST0y!>dsf5UDR0**#XbVv-smBF_ zhhxgRrm!_mfz$?!#A}I1P-sJ?bEXWj+EELERE8vp!8*3KHoz?*$c)L~wHYMC+{Qd^BO67OtqUifgYM#FZIb~U4R7$(O!eFoD(uG^>?2K7lI7XZV z*D<(iME9>9kuU{SHFOQ0_M! z1+k>x!`td_mA*U@y*yDXnLCZ8gz;d9ZZ~kh;>0uv0!5MMDB*)^Hjc4nfz%pX2N#9( zjc`D~duWp)gh8Y&-oJ92_pYq6G4W)&#iXjqvI(xv==9q}Mk1V}x3~}veb)2o+wYMN z#`s#}a9AqPgs=YHYpp4S#3w2D_xJhbhwt)n3 z6D7FX;$3jWMaJOqp&i#*qR3!eN>Nqp4z}6Y+GJyW3vCSF_{LXw{)I2#s{*MaR#!K9 z_;8zrg(dE<-se}pdY!>whhxW%5h+F7ZlP4e?tnRWS*pf5;vdC04+?s-pH&Efk}8xd z#c|`bnx(6LgDa%r%wbZ{5rqvd>~<7GmQ#Ino@+n*1?SHFimmYu=`iEjJQSM#a!)UrkudwutL}JlWvu$g3yvL}7Y?7gb#ONS?XVVOvBaUK>GMKnIgkHVDPk-_= ze)Z;CY;El@9!=SNxJ{8e1Tn32frb7dR+dh1{Mh3>apoDGe(D8|ojA_fr@z4IGf#5z zvBx>_*eMPlJ;w2qkJ0Td@W$&OHqP3BWq9;@JsNU{*T)|aN&WnzHeg*zRcBaR;CzV} zB}zjahvCKyp)`vW&jy=SBRncu@`G1i;)&xcbhM-!Cya&zjvYCIX}4Hif5^u6fU+^? zOojudgKZL56B~tz0{c!y5#E7NIyn1u9PaBRq9}5b<%Qtd-ydR>!aG4#mKbd?kqOsV zXw5+x6Lu;-uq~rVp>P-_X}6QW`Y$r_qCg1|N>{o)WE6Af+I9Z;kN=pz_%A;q9_;b_ zlV9ZTfB$#LoZ_{&-sbkbI~-c+^VJu=$X8!{naOy_xli6_^}&6#iP_y8Qk9b23Pcjb z!dYpZ(F$j)P*7xRYAH~0gwQd=QOS+l_qlfSK7(JF`Rk?G!q z!TpDZ$;J&t7Z93gf5JqRreq%_IWM0xXM~Z2I zoTVCN5cR|Q7?K!iY#OI%ITw@zDk{95I*PI5F}v5UuyO7jyPuxNt!>cvaCD*1$l6+; zb@c!MAOJ~3K~zw5C`7<=G@Ja)mJ~kNZIlR7U=ZJOgjRff=K<%}hv;@U6t}n<2;UPv zybiXmiK*x$Ed+*9R#CZ#xYfmZ!_F}0+O2Iiw@XIT8oVM+TLE#_2z{Xl^wD|{L{W+N z4gN|wvT2Pg6|pg)D?qrpjkVM5Qf4DY!x7#oWZY)#468d+ZmjRHR|smYaY>6>s_;CM z8iPbsHAx&8;y8;u;9w6an6O?2mz`rFHN5)rOC0KTgO=hYQU^z2K){3{ZB^%JQ=_Ar zZg-EU9b-krU@s*fFO#TcjGiFn4vSHVt;Q77lCm;*ABFvTJ)yEwq9_bhA`=JBtX4!( zJa-tk+THo{ITUSG;knq9e%`ozo&V?m{`dTkpT5Rof0-{l{Vd&1pYd?Y-tK^GJfSQq ztaBVbe3WA+PGGI&!GnjyX^Lo`)1P-fI_KEl-ezl5{GIN{5bX~`eD6crCalqx%2_H~ zBP>M9AibcfYP5+-+FeG|oa;C4^5OZ5j7C%1Nt@+b_< zF757dRC<_}iimoTlO{cEo>7j*_{xI|k$5d4l!d9aLGYd%VVdNEZwe&^f6HX|S;L)0 zdIQSfsOU%V{ja>hV!K7@ELBxMdVTysK{R}sHW}xDH82nflN;0Jo&9&;WwdKO)%e?dUd%XGPulbw5`3cW{=_OjN zE|;%f;p~%Vu(o7xcat+`PVxtT__*efL&lP_0pJq>sTKeF5lXuayi4nh)!pLyd2W+EfYn7+q1K?!|mI5 zIDh_pcJ+reqpBSxhQt#dvmQI=O;KEts?9lVp2 zHfuKc;xi)T!AVb9m88ZHD}}cNQ7n#dT9CVno*7ZujQbl8DZS$C)6ekCGhgKN(`Pum z)aSqc_n#o8VrOTY_4N&sIAvjB5v2l<+4<_xMf@Ay3tw^j#tp7~_z`z6UuL*=pN^6o zTUsO%Af>?yL1_!Jd_sF^nfCHAhPzu#w$`bNlHqiM)SA?2MuUAuxn;BP>{&%wOb{|` z>`GgQ>9p2(9JQ^mwnFI$DLT}J##u!YN1!t%#RI0%X>@CmoxKqsoj=d&-Mggim_tVn z6QynH=_BXP=lM%Q2oe?Z#2FMoKW0eD9kt@Z6K9$R=a7 zF<2QPo91L^1G_Db6GRk+hW9KuxzbjfbY+RO*F_3JQJ2)NLhI;%($p3XZZiRGw#i7- zbROgKsHRCiY+}Ontq$U7r;C@&Bhs_j_GB{QlTSY3=Rf~BZ@%{tw{G3zvB%Hyt?zyx z=Ox>FyBs=pn5C5!BAXEzMUhV#Plw#TbC0yW#H4_C&V9nx<{DX^BZNX}O_H{nYojJB zvM?3$E=2WYVAhqDL+d0IOPPdemg9WQ)oYjd_P1W<$e|^Y$bb#)(tr6Ef5mv3qfNxZ zVxOZ&Rxr}@r5B#%3|Wm87hwuyk}_i%~PT>#GKNAbgmP%2}C&Y)ZV0V$W7w z8t(GW&I3N247nysmec~u8LU;5PLSiMg~dq=qC#YrNE=L~5mm<1rw-9e6uz=V(x8Q4 z^8a)8=0A33_j%{%Ebn&L+E`Uwy2&QlWG`&?BDdt0ElZXi!$v%Vc!F6IV37aB7+^3! zFf%}q83c9`C^Hi~j=aTfwWXFNS!(s(Y&N&%T4WWAWbNBs-}Rg`Kb%{|BAYE|<^mVR zA`8WP-+SJ(e8120c?RCL8%BB${w;+6EaD_)ZEcO4H*a9AVPJ>2ta}Jqqi1`Iml)r;k3v`uYZmgS>L2g@^73T6h4ug+XDsljhhFw@D)r7OWMN zR!}-Y>>`8>(JrADG^vIapZxrNKKSXobk}xx>D8AAq6B0_QCVaVAw&o&AT27g)=`$hmOgGjCTc3!2R)je3ojUpm9JD_1yq`ZPz59P!FiYe$?(NQ0olR5`}_ zrcoT#=?zlezqvx5msFKQ$N;57P#TA(C@NIYA8n9B%0eSt4M)J%MwhFf&tb(D^;&~= zt36s0M+E}}Rb|ME{LzrQeJpMv1c3>;eRG*Amk3wk%?}|$Dj&>c@S9s_F+yORqbw`3 zG$T(ltndxiyeR4Q2lR)TAE%?Pcu{%lGfLpFlw~op^E+&j64x74MTr)c7fv7J&_QpF zuO|({AR!+NG0x!-bk?`1Rg$*U$TX)NCfw_95(FBBMOZ^rO9-?a1!Q@Zi4eQRnlC0| z+o~jPHhjXV0As3=(#|J!E2XJQAKW0KkhIq$7^xqGlt_{I@E;Wbfls*)>fjVvW_bJD zXDoGc`ZB>pZB$Yx3IjyZXSlsar6JJ)LO^?>jj22W=)(IS6Iqa<0VTSd{w$~`%Jy`7)t>QSQF9heWU*+fLKjB_y2UTyPqXc7oXcEq= zYJKryWVdq;WBu!Jd5EDx20qEV)9n+*0nfkiEIT`EOtqSXVZyubeZ<1u`%F*IaOCho zo;`VtR;$jrbLS|_l8Lb~YW2p$La0W*RB|Ck z?DmHT{oVaF>=s-@&mRi{;wYq8-{RH}e#j@^{Y&n@|1quEF&6Utg5}1ORdp?CLi=E@|}flyg*Jg~R##Q3OE5)^?xyyUX0Xy+G&&C?&m}d$iAz(&K=NEThr# z?ux2>7-A`qgC-P!oi~-khS8+$-$+oQIGk(u85Kw_h!aoIKA)Drmvr{yJ+{uXFE%kI3fcn3962 zb{!jQx}svJHC700X$b&@WRMLRni5$LQI+*BDxpD0oXtV+DnvUp4oqVhsr+1tvli(b zN>5=0PERF!u%rZ>#JyCXx1abC_pQZC)h7`+3)o9 z4Y?9iNido~1_)^}w%BuV2vH&h*viuDXWU!vFn4c@7d(WcmA#7fe_B%{YtkK=tVPhjB&qAE4A#^|#D{9S%P$wQ`6o(_h zn%NsKNs{13_@P|~lh2+}+`D&=x88b-KmLFI1H)m;?93r%XAcp_HG1748ynm7dIQR| zPY{N*TVotNbPypW3wIaU*xKaTXP;$#ZEcVDy&Jf_dq(PXI;?D``-E`v3uv68815Bv zrS{reH*)VOr6BXTFD3mRta6ZzLObJHlWsrd*3Da7y?BvoFyz2kn^rv`3PQ9J>@cL~ z;72!C*-BF?E$CDQX?K;Lg{9?Nq`eh{-64t$R#lWXN9qzph83|_XbK-J=BzK?Dg;tG zUkraNB=XU(21V#IPpEuB^p%$wt0ffHP*vs&MbJHf)2Q1#5=eK_AH#l%$oQ=&DPMti4P!Tt8-sFupzQ)Ci7tvaA=FAyB z{P08O=H?itAy=<{&Z(0p&?r>9-uiusmjNr~|8qC8dIZ|PNjECoNar`@N_r(w=>(rI zDbC;AU~^c}7;iE@QK!`k2(YM8hjNfc}J>~M(7aZpmdI+%85oQuBGJ%T>tS;xO?Lo z8_Vo66gG30;|xXMj-n{3Y-Zj%Ni@&hL0~T za(i`1ZTcBbOm%T(PS#I}Rfv)inK6`sV2C9yB0jn? z5QQxZvcUjTdT zzxEoZk3B_^Wdw19#8$XG!xS0*ZZJg6+DN$}5W}wT!s!U1Y6#sR&^00}QH6p24rD_p zOJCH|0U}U{FhGPFS2=G96%yktdX!uU!Y?4M9C2#INTuL6AyPWZDkm%}l2BpG6r}`f z8(VzuZ+^^Q{q;}z?7{*^jy}uNPd&}ir>7C7%TtHOIQsNqA{9{!o7`J^K)-~|e#TC} zAP5_D*Ed+W{2BT3U1lc7dGKI^N+cjdsw_p=5*-CpLLn+f92PO!*pFCP7{GvZ7*|nL z6>-w!^3_{>eq$b@CNsxQ^X|JJ@cH#yXdNS+LJNtohHrlBSNX;_-k`hjfWgitgXIm{ zeM^-ZbXcR2Ycvw4D(YJL6i8{Xkwt|t9);Aaiu>(@+^i}-DstZ5+2)fxXI&)}g(4|K zD&Y$SR#=?yEGZ!s&MJ(H2xBaqUETlgR)N3B-(mZTu0vd)JWMKM7f6W8kq ztx2=O7hIHAvO8lCSjwtE1(J!TrrwIEM8%-!qe4wpR-FIfQ~vV1f5H9tuMk%PY5_qU zqSF%9sB`Sqm&sQ;43=*DdCv)IQGhfRS}BB#*y;{h9aLVGYk0`E8j-f8a9HQ{qsHbK zS71ejj3Ro4<=mC){PdllBXz=wlP4J)AEVRR0#^{lkPka>e@JCZL@1#a-~!&R@0V2o~m2)ZC{2#n1cW{P_MjVL_pPr!&PY)0#$0wN#*2R0sp4GA*C*<%5(JvW0UA)_D~S$;e!VfX1f zpw=05FzJ;CvZN-vl$`~(S8m`28`NZpQcqJAjzN)8DvL@2WEc?W80i8oUA#b`G*y;z z;@A|B$Wdy|2E)8dW;zfS)O8c# zB(_qXxnL#Mln4s6Hf#qq`qv-O8Dbo*GA0jxeb) zb9|b(8shRk?O1XA$PD#{W~aZ##DNyAu^LG|!3>6w72LZuPpm@ftu`V~D5SuY5{Cw% zeB*!-D_tmr@P$6CL+OAZ&_rQ4DscIfcS1>Na;kC&WscSYV;rRuIH9Rr2dzdM!b*S) zDOAAqjSYT$`4SIILbn1dB}px$*@y|FfKn)O8PeSu632A{6|uIlgOrL;1)P8P1M+U4 z%EdS&T1wPNA!V&sM;RFqstjwhQHWE_O1I?l+!{9@3|SvU98n!aX~33LHp6156ch+D z2U3(&W$t;OIwTCdlFgc&s!TD%#M^;Qi9;YofN~m20fnF+_<~|o34#h@8KJ_6PMNc~ zwax$i{`=h7*kI^DhrW2^i~(CAu#W^CT07#DI*_CAKaw1wOC}~;4EkLr##;RPH^0Sj zV0m!A!)mYM%Iyc-ez1y&BYJ~vo<1_kKl>-Y$IH(jr!O=&Zrg&-CIx{|XTMOY)7#c(k+r=|dbi zbc`3z{t_ooo#vTi$2ooaG^bCU;`oVUOpUdfIWW$lnJErTw6Rr6XM3GMTCgdXFF){y zHRn^4joHO5coBgTEpU3&XL6qFYBI8-PnvbeiVYk&LRLP^(OG}+78)tN{eRaPlEgKl zFs3YvJuY$*1x&@7-+JS9(telLff?fQ3DCYls-lGZcjg(aEYrrK`&|NSICktA!g>?q z3bJ93GTp`%1L6oopedy!6^e+|pLCr-RhBS{x&G-#eE9B!8a-zn6|2yC2)UlH+F86rroxkJSm8(2={8|3- z@BAJ~*yOFB{FI(_bX`H+>;`H|9unq9Pa#oOBdu4_N#Rw^Qili~Q&gG@^UGXY++@9z zqvHnkhR29Rfuq%k=o>>2gp^rEh$4_0r9;xH;{N(7EB6`%lPAgI1C+fDRJ=j|&_RZ( zMtl1XV^hzOt}U{D;{u!4FVdY~KouEbAaQ}kTJ4qgDgdQ?A#0R0u8o7LBoG2E{29hS z#l8lhpe!?9d+lXrXAdwO^oW80TaE1hk;Y+0>GS)z$xaZcfWj0gt>_JVbo*UutvaPO z%s;rxcCX81Yl0~8jL0<0z+%A$i1tu(eOyc#tSh)`lgL98Q$2#_*D$%IMb1J5TY0|3q>37U8f%I0Bnt6@gPkB0w66aGv>D;V3YpP!)}=EJ4sfNM8sq zj3v?$)=EBGT;|I1CTUerWVyFI8^CFV3_xfsl3YkC;hUMb5@8AyW>2x^f*dO?l?&P2 zF);oow5FL!dbf_`tDu_#l*+EQlhI>Ns?#4%~>m?@J z#~HJ)GhE-mWiyDhN!5dLC#CFV1U8@@PoN{e{uQReYK06n&RR4QWgNLOboxEAEF}yA z%CzA7Z~hJ6`GbGU?W=Q4v<`Ug^Xx2*c8k)KRAojs=(4rGig6VV%TrGuX7=DgmX{vz zVCg;wrVe=bNUuvAg$#NA)Mf&}r%V8)e zvkIX!LRsq4@Efna%Av_gtdeM{_bl(mIjr+h+`G?M`lu-_1)-2AF`9v$LpXzQ8tJ?c z#7T(}KKKf!5LVIF8ao(J^tY&XwqTGUtVT5_7z8!8HZ#8W{U7r$|J5Hb$V-l&JjKo1 zb4(wcWqfjin-@Q$7tgQ$ ztRJ^8Jt+j~@B4cX#(y+rbbr$GlYYnkue$)<{mQ=m1Ix*ZbkIYD4Q8eeP-QunK6#(8 z-sYKOuQGk$5NBQ#sJW0Ex32TyhaYoz_8?CmIm+btBm?7R!9qG}QHU#HV{MJQ^LLoL zc@uUzRMsa|*J=@YtwtQj#9@R{3OiCV>{QRVQ5xL3v^plTy|D%ss zUEN{4S!b--qSkCMHZjh|<_?FSI>PLcqcj^6eEjhRhFQk?W*;_oc=q^V%B;)cjZ18= zZ*l0r1YdjQCEohkM?UdY>xUMa(e+bGAq`KQXm_t;QIrHhL@lUMRyhyuFR`()!TtM7 zy!Y-0G-FLsIs^rQR8*zm!1M%X&OAq}UFT@)Mf&$wxbhc2M{IOBP>ZN+Ngg}ONHLj8 zD(91)>qNvNrXM)2$CkM$<;tBa?3jX%uxwN%sa6C!po$gB$`PY;lyYb-QRFw%KGofl z=MH0h5Zf+}z*?VDuaxxUXxKwvz(Wq*uC=NxABHY1EiLi(+i!FH_;H?n_E}yy^*mK+ z_P91hQH|6(KIu4)<3|+0yVj*Wpnf&nmog02R+PpOBoVb*4O#apq49Q`GAp=x@pIn) z$ETyUpHt>u^@z76+d(xad zQY7yF*rW5b;Kt3{{7?V$|H9jEzs*1UAO8uz^2@KIm7_OE$&C-d3YElaZ}szX4MSBJ zgis_p#$^sul(buIg$xTrEeRM7``Go2Fbqi=2dIoBHJYn8Z}ZWI=lJ~U zO$Pl8f#)27Luv6usQCV|E}eKJopJZGv(h(|(lmYKeLo)1VvM0GD(z%QX4WDrXXM#fDr+$C?a)^R7gxC#03$XrsVq8I*Z%uB%=L@Rr3Gq zW7k@pjnYl0r)NllgrM%(r<>bd#;2xeO-!Q0m^{y!IWSG46lt$d*4d^%98j;t^aedv z)|PRRByKbb>j}z9obgcSUDc!3A=X)6B#@F(^$3J74Cs-<4W+1xk|eGJ6*e8>tWSpy zq^7D$A`xJ-3K<3v#VoC_bK%Y%7CSo>0&0ziZiXVuQ6u$XqgLN5`sI1Pr>;Utiecdo zNY)~>_|iZcfHWPcowOPSu|S^X+`Ku*-MjZ#nVsb9*`qvjYzoWfAPD|@{`&-y!-Qi#U~&BZ+!6H&-thS^nc*&>o4Q7!DtUtp{+uO zA+F3p3xZYy)9)j7NF?KZhe5M%9BC43DSBO~C+KD!J4(1#Dj*JG;xJ(Q%1u6h`zPG} z(a$Ir?=jVAppzQcH`WNVStc@tv9MhB*(pm@5`rucqN1pBN?TG?CBjsc7=Jx+7`G1- z^H?y}DJY5|mB~iMXS)|3vp)%Zzl&pk zTK(?(+!bXw=g5nK!iB`OgqGGsIv^bkz&f@!Hkqk4sKq|4Cd)FaykKf}hKY#@vMl57 z{5(Zb&}cM}@-E{CW;pW9Ng88Qv?dNfDlmDDQX!(*q}bZxqfgH9;fL?B)7#YVHjorlg!LL>+T;KH=l`5P`=dYQ zKos+vZ+wLpf9*wjLUUnmkvIS3A_p1)hnoQ}|N1K&e(ER#B!BU<4_M#s(9Getzxgem zK5>j&8_TRMuhXw`L}@tCX!`N|3m*HqfKNK#M7l+1Bjdu(4OZ?h@yt`x96vhE@uLTs znV!T9mne!9lMM)i07(H>5(ATgWH`7-RZLTBHL#r;-Sr*DCM;9qhv+Sg^ZBPAQsgP= zphrIJqpWw~*-=4XAo&0L_(fqS;<0&We_HhJ*z!S(0aaO$XPzCcM=H5IFWK1K=B*!m zpBG+ufzu~XP_Nafs*MX(vlnM}503++J@{5-h{KC4$?seG}QL!%^>k*gU z-*fq`$&pSYMF39FPb+ROblC1(<@|+tzV`AdPM@rCV629+9R}GBpomnP*k~+{Fp~5; zTZBPLQCWhph72d^4kcIbEOGn(8aM83&`ljtJmDKJc{N(sfAQxJ?(ZEV`yab!m>>{1 zr}pN_-4N>C>#}>!kVA=+lHppP2TSuTFU%1fI!qCEF*JO^R>Y_G_A>T;(Fo{SECSYtwXA!Aj=ADS&>9BS1w)RyMOYhT>Jbgp$bSMKd7nwJGINB1=kqSyTjAgQ@pt+8v8Q>0j(<~d4TC$4L3cZ+U!hq6df zc*SHG`m z{>?}ng3>Xl2HOM6?Yk>npIc;*l>l5pqrObeJk8j6i-olzJy+wkU->q7?k=&my3Pmh zeZr@oT&6$hk!7QS9!6h~F7Kc3A3v1taSYuTpL>H9i*pi%W2_F}_}X*Cy6|vtuQB_= z;C{s3?d%hO{~lyI6y)U)YXo61Mm8L>xxRoYx`=W}RfQawo@Qod79llxS&*j#tWBAD z<{%nP5J-e6>1}VZaN`D-&wav!+jCUu5NRA?9MWjks0Sfgr$;NP;iM!j3!GFaQ&D9Z z%j+A|rlzR3nhdu#Si66hEHjklkSK{sk~)#_Npx$eWxnGf$&cS8`@i4+UZ3>u0)s^Q zq)=mh|59tLQly39vs*(xyg0|uRvbTZ1g$M;cbix$8bL(vhMc>rxxQK_Ed&~`V$xa? zYfV+97+YXWg;b6plmvlKPjha6$~aFP1N)1dUr1IPC9NVAS_-ty_~tL4<I6;yblii?tP1Sx^-P!j_{B zuIFHuX2g-SJ}ATBD5{Dmj7H2(AEJ|$IYnux)tfY%6ZCV--~RaT_{%rni!86WcKs$RE2}idXXtEgV6#5+*Ur;hyT^&A zW_j+}W29-1OV<}z@APmgrZN_VK{$(X0w)!LkdLPFJ~no=3@8h4SJ28Yver5_H#WIF zH_!EJ*G3qL2^@|*AM(PBr+MYIGgwz5qZ)_W<7~Zufp}?yS{z`NLutre0a-;NBN7=? z>Xx&86L)C--gK_84|z-#w~4nEdYDyS($xd(7Xx$5T%q<>29`>Gg+n?rjr9 zAzB5vyuua*CNHUq!sAOsL{|0b6q`6%5o$#oXeygyWyS2&G)T+Z`Z{^(IC|`P;$(u4 z&t2oKw|~Y@|Lz>uZ``5V86rhQY48PK=Ys{lY@@xm!E|7Q5?n-3mb`MZ!Hds~Q=~a* zmG5m3zO13>WPpcZ8Un4oJz5BCSx}~ZY_-gAdyQh4Q43qtmnO87=_0?y2=FkN7q|Ws0VeYRjv%S${_V80oOifd3)CjajtAJi_ zz|!(6J1ff!hXbBIc9iykahh!($e0a>l*5!}Bl2qrmNL&N%F-X)m4aFgM$MRgKBql9 zJkrlk&Qwr(oPboyuT_P|+^8TyM0IwC8JFkh`Fwem&B~F7F=Y_bjO&l!I)w1)@p+z; z=eg&`rYT91Fg-gCn$`ivJxR9l&;h7`oKS94RRC$AaEdk7*#Ah zE3uS&Kdg)dcrGsPoFx$Yp=e-fAin|*VOAV zYilc1RmSD>7g<|bVSQzV`8#)b?Uh&g?ce?#hQpk~z+jlOFu&lP30iaE;%D5seTzmM z(rPuSx7%o?==b|LTcP6+n`ad1fFKI@#0Nr-n1s6rxzRd9EI}!P#IucER(LgU5@U^F z;mz-J=}-TP`+xfmV{07_I*lwXnKKYaB#n@0sEu$(Uu-h$SBrjGBciG*TFn+|zt8f6C5D3mCr+H;SHJmdoH~7q zC`owv_+buCw5SJykb*`inQSH;XeSi?9X|MI9_J)t6dU5~F51Rp!Gtm(Dx51ZHuJ?$ zSNX6C<=qUAH+%Ny1w7n4nZ4^SmDqdzG71>0Yku!{f0N0HCJw>E!XlfitK7XcN3GRj za$tnzFdK$WCWKw>!XAu)elQce{gjj;ymqR17`WGpXaHKLVu{ zNiE^fkweTLIl`^$*O{H2W@=`dI1D&(@+8l_aE8ePGrauz*Esd`u@R6rL?www2gM1c zvD{gh=P&;7UvvHZ=fqa?>I-Li>BW}_n>Ehgyvkqx@GX`W2fT22ir@U|3%vg7EA$EY zlOOz)_douagR^7&_N#C3;@LB-4Y&ELAAg@)4<4|&)5DaK#D(Op`p+sHep$gFkaZuL zY9;+%%7c{+?k{bzzMZqVT{2#e0Y_D2m~u#w_b9UguE@!{9jWitPuRtSsLl?QT(JL$tF#2uFxfTT(pnwLN;ywO=S`?%zXL=L0%leeD$v9-6_J za*uhs+f;m#P+@m{jpCSIuSciT!BvJ@Eg?ygy~1g))1%iPu(`F#ARSOkYSbGI-`o-s zS?0unCQuS<3{nV^(9h4koi3Ry!5K&g^zSXQeEu9OpL|3%cavym6RW)|F$@Af-&pw& z7$tmY=m?7JU%&9-j6%u10;hMDfN|cAYjJ$GxWwhzts7FRYYtff8PCJYtXppU?Z7!T8mLBGTO<#{HjCooDgEHw)& zL(W~e$K|;V=9ju`^&K)CLj^T#CBRB*VU5z2UmDoJQ#q8u^q^?t>J*t3S~tcCpc><@|?q?-I3IuV5n5|boOlN3EKwBkkN>NG#OI%1q9}6CoH@hB<_1v|Ff}#B;^HEQ zjyyw=mwflTe~zN{=qU z{);_QcmTLOBr63bkcdQ6DaFdh4s&xG%-!x#xlJ~DhQ-w(=Pq66^0jMRy?UL__JDSM zilQ3sC4a#vdDA@X?g$~DsN8%wxOpO*asPloXtaRImf{;5UCG+ux`SFQ(|5qUdff6Vc z`V>YdNUO@LR>K&A2p3MX*-iQMvx{82ev4MK%~MZ3O`tScQLxkBYg1=CTKq<7%_|_Y*aQw&tsv-xe zkTUk5`ngsKfTG)@;a}-{!5&B z;S8=S(5_;3dXg&eEW-BK1XhxzLldFjMqUO#h+iLrz{ z>rt7M`Q-ukmexH>RVV`Cp&FI780V1%`!`wpue)a!jy7jfp#$w1!$_PP^@Ww<{?ZEF zPLF!M#xuu{@ylO-9i<#;HegJSL7ua6?gCss}X(Fq95LRUo*6uNPcA@Wa5FnhxlqE_Cf;jYGeI!yECdOmh z4aHcqK@!GT=`GN1#CVcQjy7Oo#OEtUd>Mx|6#_>T1~_XN4*JaBnP+kFE=p;pXQq8Y zRCqhB8su5LdBkwn{@}!sB!eg=Sep@Y|LGzM3GgFq*15cZ1@8k3S$MgcZLtU zs(a0;{RL6CSB-f%S2JonV6cTscIzkI;N}`_IiXu z(@YxZks>@GB$p}M=>}G0)S`$e4CoHJbcY?1C??AbiUOo=u(~zmufF$p{KcC;oy~PR+Z*5v?N*a0PH@&+n=30o282Umk;1b(m+midPf=X#3UEy?{RJM0Wxl)oCI4@SZ_~O zPEl6HzT(%T*T^#h{q>ImpVpZUE0*qWvb@w`eSOH}REsFCqjiAAVr|KA&>yA7hS;J{ zJhwr^D9YGTm@a`UPfaLRpxhkq@^N~4bKGq1qaJViyQk- zCZnH~hN_e(Y5ApBPB2jm=xleHn3^H2N~DOGn40p<6D_EWVRLJX`Gp0RR@bO`#5^ZX zpJIG^iZF?gLQtkdG?JzJ3)rfnUaJ!%F~WLVf0h>nBc++$I}!TV=yn^0&a-I+jDpfM zSmQZsVT5Y6NrxqO*H$?{cbmEOO*%+&p&&?TH>b!4{XK_9Fgn!kFBU7U&{9&b*NN*5 zbQn+$Gd_9eJxGfY*YC;2P=LyM#0^e(B*)0QEM$NblAb7$L5+T2a_>%u&9xy(lF(>t zD%pq9hc!4``QV9>DnU3OG|}HO1VWLh0FCn45o@s4tDckQBm*qB)|Ywz+BGiTTcBeM zE=n*$pxvXY@BKy3{bT0K9uh%Wl$U-})h@@~WDd z=>xP|E!NgI$xFl3%n`0$y~>9ld_+>KbLijr>i^b_xOSK!CG4T{fCMOS}iIq==OKe!k~hX!TAgP@DIMj=70Pi z>FovTWl0igtaMb)Aq=S85!FH(L&dzYd}Ib}SC(4TqL*fvtfZ8N867behd_x!vs7d( z7X^Y4rJn3edfer+f3LTjC19=f4O^hBayB+L`26bUT)A?Ut(|RD6fv+hNXC%$2}FI2 z+TLM@jhn14-D4~Y`1*^_@$#AHnLT=(2i=k%e{hj=pPpy79r3&0dV{Z=eVqp@ zOZ@c@-s0-@>rBlYBr6<)K}lIyjQV@-uP+hv?2V^UO-w0?3PP+<^wNsu^=;uS+AGGLgI;&Q+(w5o7)M0oM6M#=T;cxhIhN)hkoHqzH9)xv4FrKiD?Q@; zxjn|?{(0j`dyOX*H1-5T_yD6RgrXWoRq-h3$B(B8-QH%-{(f`ZYd&O9q z-e-QlH+<=&%AKYsbx)3*Jj|pdQd)_Y1SNPSTf4@>SlC(^SlbtS;S0g{h7H+!VZjk9~x>dXdT7)FiiJMEDUfQNa+(z8gPSo4`&F%iud);v%3~)t_qcP6aciRY}hzfy~C5y`& zTs*(b_3K@nYq4+t12kJ1-Qgyk))dCV%!pEduBTsKl_>2m~5t0rNy{A@AKo7r4WK7NkU33 zPAF9qJvD=o6;hOF1x6-}L`=&kSQiHbQ_a#;N+Lx-rn!+N?+@A8*+vi$bE zG*Ym!u^G%Rb#gY(bBdzaJ+sAeOj(xP+UVV3!W)aD<2__-2)tY9+{>)L`}2FhZc0az zHUkzlsI3}F6_^XdJE_5!Uv(rdibcwtF>$>*PYhW(Qh3=HT*D{NUIRm9EJRYau8+8r)lyui`NjslLA zm1SOf=_P*t=fA?mix+tKkq1Et&YnBRfrAIwzkfgH&tKrFr=I5K&3WGb;rpaXgB#ax zvAnd#%P+siwQD!%c6+?~%IhqxED>c963?Y`7g6nI=lAdT4IP8j@BW9}@dk8?wAn;u zDTN1}q%^ZOW#L%c=yBrAN9=pxA-rz#{U7|0_4QQ*j;YQJ#jpV7_Sky^_#VWbnCQJX zi`~eg6!+ag!bHi3R#XAA6PnMz@f2E&5K`epgv8!=q92+!hBs5ivLO z09mYYwo4ot6qb#hHHO1&dfjc}IAUsI3W?_2>GRyUzJRbJE}uWg!u9KHEUz%^c4_K_ ziFS)f$`Bb)0)(R)4jHU(GBq(73V(nSh?+gZHlhYJc$=a=(bXS*9GGSsOqtR;M z9oRBQ3CX4rT;3Q`AwPDQzx&YkNe-zoVBH~ho5iRjA%zJoo8EdFjY(EkhWz9wr`ha| zn0@d;nzJ)B6V1t6jth$pC1Q%v8aq4lC}&B$MkcPFAW%2=8N9z;eC4gb=i|FQiTC%N z@a#@dlqS*;`+}eS?5jL{a0XiyAO%t;;i8wO5XUGXcEvMmE!pHW-WaNKh_^-H^*K*j z<_t$UvMRyV9GA2~lEg$J@E)x(^twCXENL8t_D>TU^TfF5!3&J@NTJ9Y9jXeh-B{qA zAAi7K|LwQf=;u82@KFvu@Bp3GB$0$Hi8y@dAP48B7|Dc<^$na?tZnSDy1GFc$25|N z;b4a!zjuu3R>D-KcWotyacP)!@R_n;0}voCJoj_gE2%bFw(PL*%(z z5LHs|79m(`gLqP!z>Vj__uk|s-O%n8@$@5*)F8E!E@Dkv&VWi^G2&@MR9q=CqVh_mw!Ck0+YQJA{v z)dd!c)=&fb<4B_t6&xa7;QWYIQ*m%#hncC#5HnD>n`UndC!$`%!sW&ob4MIy9HCE= zgh+>I>bZ00xOwvi`}ZGUZf=&!RCUX|-hED!B-xF}8)F!aMs&A&wAxMP4usfNS>AJ74NPU|_qyPq)1JT;(6ifg%_dnp zrqymCWz4Y1A&O{srfE&gu)a0qyWe}4Z@%?5r_Noa+pj<+w31FJDJv^P4R{w))q;o% z5%y1rrD-8|1<}|TKK=YYo;x}d1oTAj#!2qyVwdR91TDtGO(|_<^?6QTpGT%`FdlEKaLAVu40v(xIP7hwS`6M}jKx|=k_K7YVK}tR-(2D9 zwHq{>vrJ9R1@>N5&}hVDS&Z`)8b@-oM`{#CI#iL<6bheYh~@;R%aR{$ukqd01x|On zbX|nh9fXOoxj-nh>&(9U(y><%-5svo@p^}{8qsb~kq`TP>bZw`;^70_y19t;imCmx z%+4I7*=kajIo_3kVS9U<&FyVGf(Q4{BD7-efkUVyI1S38WZ3VckzBoXosF$cwsv;V zQjw+^QL9Zg8c~dfL`izrSxD?Uw!Qb5Dzp>>_^L!`jc9bJoMdym#|PKuxxBi@N}fZj zgUXup`Z-0fASEJ>1zM>+#X-Rpu4HHiZ?sxuSp(-i-CmzTK4R1#^8OFr!RI9q-SfP$ zD~MWOv(ai{6tVl>^hk6pu%)jV=8EOj4KClfL9eQ4&df0tW#PT(10xPsqO1)(d|OfV z5;7GLdxb4Zd>NQ{QPRLG&COBCkI$asM`zEmn)k7BOyvaLIA4Frhr z-`(pBwd;g79vv&*`1EUh@k?K1RF3L4Z^5-|*O;1^A|DOOM+2UF_F4ArpJQ`li(W71 z)YCF7{=UXj!}hjgBz9HFElYcwc|lB-v)a^mDkjvqTtv+8nSB4a9*4AvJIZ7gH^ z8;HEiV11FZ7uI%}q2c9i>n81-q8w0}0cADBm;&o6oHuxH@C3GX+W67Sld|V(uIqZML`nB zYzcwYioS({fG9~*$?Rl;76l`(sqzuFs%SJ@pft9~!5Q+=h?)mlkgEH{bs*$IqN067bp+ zPxC9E{Q^gxeU$5~8+`xRIgXt;4fzhAf9V$7OyhgS;d)>IF5-Jf(>k0Rg3fEHfE*N9nH=66GiVU=GLe+ z?=3IC@)C1%Gj*Y-*cC)=T_m&DRei@^>kY+d1VYkowTP266wo;z%9x}iN&+LlvX*YQ z%f{vgJH0-6o-^HQ1kPfl@JixjV8?rJ@upz&{U5M>_8dFs&m-42X$VOp%Wz3Tp)`>f zc;~Q{3wS;$P&x|60$@)MWDqvTV(6F|>&0z{s1xYA81eYcMNThoW2D*@M0b-+dm|I# zlbyt_E|>E{U@$mQ;ADxhBMLi2o0w)}hA5g~d9BO&%ePoq*~Z5W+B1hyZiI6gAD)P$!Xu+7;9G13zCtO7@P@J+qLbu~Gts?X8=oBM2B8$fIrdF9 z`O4?sV0N;FK%wGv*9jS7^wDnlU?@4NK*d;{k)#cFmTxgyx{lr1K}IdosRKlPhpECh zDc~!^guyyTRg|PU;Qh*?U^o~Co~w79K694ue*b&?(I5U1n;TmQz*Uwk2`ReKsKEPx zozjsePLn$2nvo?bvSxVp`#naZQT==b%uBn|VP~hya5$uqrghp*>^eio+S2y+HuLM< zUBub$5Z>KJ$NYz)EXF@ajcJCJ!wE;bo#D)g&9w#g&rR@;e&J{M@BaJW=gl|Y;PJ;E z;Zx5)%a=a?S>Am8Rh%8L&p-T-PJ4=Ho_?0IXU{V=HO1uQB*%^&Jl z^SRfaK#Ngm?iLZEj=SD#^ORD4Oc1^M?@FQ+YfF@jNTX%|r;8z43M3Jp98(TiSzcsk zYm+R^I54*#ti%?M?WK8on_DO^0?W!++Knd7W-9>srP>ul%fW!r)($fhQ+O#TtVN|6 zvGDk^VrhK?pJn7_L2qjf@*&NnO}mwV_LQYXTSu%F>!slQ@(xz%PvoEdw9Pt+Ld)6i zfx2cWQWqG-eh{X1Hp0smR%V>La+Bld&a-3SP`k~wEyKn64a(t&YPd>SY!XM3rb;oQ zy31-kF14r!o$gLC`+gVe`&!>+;6X-8l1jr@zW6GK=ce$s3Q>9$qm(3)p(PeUaF61t zs*+eLr0_&KOhz2+f`_G&l*1w329}r<0!$Ezk|d?sZqwadCm#+d@|-Hq$&0FXtVV&O zWi4@(G0Gj+t}XJdx4zGJzyBjfWy#@(9%O3nAQKZ4^tXE`DLMM+5gs_W4~b)YXM@T| zT)ldYTZ^ltS&LqG!2a18Hdhz9a^W=1H0J4}57CMxlkJSbpv%_g2E9?22OoTZoubL< zbC;=z&??56GPsD4IH|((a*xB?_;ZocIA`nP3X9S~*ppJ>oTqY*I87N2Mra+gyt2ZH z<0lymN9>zB$bu<3aqL6V`85ug5kv`tX2vz+IFS$dx7!OG+g#)3FsJW8MNL$c1S`LB zWN~P0HLk)diB*C^c&rwbO5jGptrid|BDA^-kJgGr399;_1rB3IOio5T`rv-r%`}Md z5w}6+vaVLCZ%@t#!Prz4)`UoO62~a1u*OoAFFtEW@gDp z`EHbD9I4xjD9F-`_T&VOPMf?K;f$r&>GRHazQbSr>7TQ7WdZF3?KDH9h_$BOY2zco z&afAHI|ZR7yRx+724bSg?9oRcH>{ui5R#0I?ub!gNMntXo+OS*vy^jdgF8gfF)Cop z<(2nbt8cT9tPP@X62$>RjwDG_ycLY{oDV*DpM}*G3U6t4I$^pT#kIo=Z0RV}kf9vl zl%=RF-fQwoGBS?5QoQx|KjPnh<1J2|xyr`IkezOhF^(ussS1Owr>|0mrp8d(;p&0| z`H2T+Efkf^5h6H5-+XSC#}Bu#mBmVrsiVhx4-tFUp-6>>MwCEBacCG;GL$t{7Gx7+ zOCoJaQ?S*Lt@RB?JAHgv(#jer7Z^;&Ig|otON#9^(q@Fx878;%H~ZYWzRZm)x9D&6 zX(lc9P48o19Hz+Wt*_BvTR{{(#Bdu`40ve&6nSC8t)yOioeKwE?;+1~wz_?0rzV+b zw~E$KH)njfaZ}@JdsnS?%^YcVm$gm#=ZXH^65N;?@MV zE|rN;C~GPDeZ0KQdAt`Zw>KK1Y7Ts5Ejo^n4vzisCz$>SA)=2Bv-dvVO6%Go;Sf@w zq`>=7Y!K-fS4p&xC{=+NP?FQlOKz=<_~`s5ok-(EOrtYFlE&Z-)|8049K@F$MEzcq z#Kg@uF3MQ$54f_t%HMu?ob}O&LMn#FV2vk@5;7el$_gv)jcVF;@bJmV4U0p^5sw~u zl-5LxENjx~O!D3b$GNqz%Jj@M6P*q(zw{{{JNgJXhmK>mce?!Kz4v(cNAJ^WweZ4m zvK=E&gO z7j=24kb+SorjaB>tJ~cAo3}XmM}NZn-~Rxywni&fSg#otp|m86BT^kR^XOvY%Wh;_M^I+0sDoxPB5viD^B4^z?q==Ei-{COXi>uhXmhKfA z??^W(NNdJsQI_DLk+q0a%&<4)(#j4#ouDyufXRc8@W5lwGW*~WrVc%VY)WB(}iV;0mowj`Jl-QLkeTYYo;_yTcJFqg~Nqm+QZWIepvhYHvSgxtF0k;=#EI ze&#c;P>i}XTW#Vrqu=i_Inkk+1;^A*w@cc{FqNSyON4b{=-$qVvL=PlR7lFQK>C7- zOhVZsN?Ih5q!{I_tgKLuMzkk7$X1gm3j2`Biy+!K4{?N6Dl~;Ffy!c%BxT|9HU8rN z{WCuN;k(Q>C-}^(Z}QZmN4aqI1|OY0#lrGDqcW$_Z1cuTuknRfUgOZ@1V5Qy;IF>< zT~3`o#bf)L{MwgZ<8!aS#L{-jAAkD;-hKZ&JoeB-eC4xW;H76?U~y%QAH08@Tt?(V z5dRd0;@!^NyFZk+b^1|Yv6y=A*E%9e5{!+BvL=I~;_~%*me;pwwI^v#OfV{PE?m3C z%EB6Jiz{@uHz`Ivq_Q-U2qD8-?u4xGNcuJ=LyEeX<)?G0@8|LgpAYGhS6+RYnc1m; z0E2p{0=6t~kD;Bb3#i2I083yfikzyfP<2YPG!~_TOI+y`FM}&h2#BH>>m7ssfVGWv zcD8ninhmDrX3<(;h9mOzHC8TOhQCyG z%0SgAvf6<^7F`&(v)4l$@7NVYZ#zUiC+C+ry|i85Z})PY_v!=kb`hw!cT&*NX#s@@}L}1L*OIN+Qtr-uB>zIS|9u>gOTFH<5#(HYsgklP^knPE36a< z?eWgwTm{~sqzeU}!XvZ{1L05DKYp4Z8bx(cwlPdKW4`?6D@-&JjBz0K9mA!ut9~qq z8e|G-Gu0I-Tw|b24UT@&RUMA7Ze%i8DdS71%J$*BYTCAe1?2sluS&dWyVY zX=#Z+|BJumo8SBku-?n@o=<`P{%RWIHEWr$Y2P+uNb4D$+Ei z)ebnJX1hhN*QYE?W~Zka)ySSPwrso(4+aAkw+6d+lJQzGE>*Jin!oq_KK}LnK6iJD zcxzP9Y^KE8Gw7~@>GS-vPw-Fw$#3&t{PX{unYmf2Drea1;k;vNa)KjAkMP2C&+@s? zeVUE+fX?Y{Z{w^Xjv|sc31+msfcp%S?-oPvYZ#?FT zvAVj-lTSX$Xq0pP`gLA?^%X8(zD#9Go`3#%PM`mX!-o!`g+fhrrhfnKH`3m3XlW~~ zcQ}IL>wK8lk0;_v1yQP%BuJMt>a8%@7JT)qpXQ(av)|#3&wPow*+ZDh@WQ8_}=z8wr65m!^CTNd0_9U`|?Zgb^zX!(S}3H2&}nN5LKGW1-regg|5)h z6^!{pj=4(mV+-ZpMZ_B!ntSo|`#E`862$`J9Az1iDu|TEd&4Ln(B0W#Yh#0r)iu^u zR%u5HR~aw?1Rq5SovA6JB*9CGw}A_&B-l|-*&ncfb`BZo05X>XQ5N)fx-2ZOkWEd8 zgVC^u8}w+VZK60ZDxDX^LZGE&Bllcf?^4x_misNNdnfMqLK7HMZ_E<#HHS<%l!RDG zL}ige6Qvosvy|2mw>tC&o)f2UvUcS>o5pcc7mPlKGTy^?4R9-7Mf-wrPFD$wY|>D+A_mo z$#9r69948WvnBoNcZx}YS4U@LMug*Xs)f~e01&-P9{jD z@l}O)mdZMmPLX>`x$bo#w5CGVF^W6bk+q*D^yWku6E;%3VsmqgTQ`?@_q`8U8+F-O zTjh|C&_lz;;Wi)Hf*sBB456?i2;E1dTz z8G!-eZnwrN5uOLFBx$6P!egWasp^fP;PBxYjy$veZ_ZhXdN34xNb(S}V#buyn(aDjZOg zw2719;|?8vD2g!7abaUrFAQPr+`YK&nHt_JiZte| zHq!=Wo>P@2-htME8Cg}KxFc!A++1Gd)P?gbZ*S0@_r6|=1-!eq) zn94|m$k-kjt}m|ffB&1m;Mj?CEH8JdtPTha6@heA<#5-*?7gF?@?D@jN@1-*3H^!u zCM_hT9PLKt-*|SGBL`B7Q9$6%N<%14;0qA~_=tI!-8B_I@~ z6GY7pGy4y*xV6rYJ~~6;HQKA-c2(32QH9d-o&%L#QOw(#uUw(EBu*l%GZbZxb(U6V z8t(;LTU~C=FEJS8OixYG$WqqVH)#2YxoZWpd4rzTTyzCL9&Pj2i;H~k#sX)H0b6*S zj)-N1C>^F8VUk17Q%i9JSp%o}aH!r!gxXhXBi`?AmGn6SZX<=>c)HDuTmf_-t zM@SRmk+tA6j@*q)9P>P9R2GzZK^(_4COWj*Z6cvK{?5CU-2uKvBHU}B7FfBiURP>V zjt66cm{u7}NEbVtFYwBvqm(FVQ@MoR0IuI$VWVGBBJoiz+ zn)Do8T3O@WOP6{7(j|(hL0&n$)HJdtN@}XnkgCklO6(GF?}v<$h);BQsWiBQo_OjB zHa9o9wY1D&SaNG|ondY$%Mq=B(|YtzO4kpR!ApU==E7K24BhD!pXZ^a`(F4_LdIDalHHaD2gb(367QV zn&JeuszR}-Q24UT)pI9#@9lr!D!M>SU8fiu`${E>`s&ZJTFbz`(8 zW0SZ3{yTi@{SWAOw|M^OBYfuh7dZOh5!#cJtarCKef0vT&d=jUBc6U}AD?^eC5}G+ z1oInR{_clA;rOYO9Gq_R^I!ZjFFpG#HO#9Rbcs*Rp=6kGFDbsxqj^;QdT_i_`_H&>8>u&U0n{0$*dLr-m<`s za!A7SCuEJFs4*FMkE_eeKFQ&ATUfsj{!2K(@!IRJGCMoHXN?c<2~$>gaBDx7aKJDe z4CxOBL^=w?W~E4ylsHat_+9gY_a3Pgvfgiuvs_zTVs&eae3X+IN431d+Od!5o;*vu zxW@kGG*J|zlNg~DLO~=okyIp7?>fow9w9Y4(x^y-4?POfi#>v9aN<+%U!j!J-N6vm zwF~XU%_Yt(?_i|5OLN|9*x(L9^j>?ps?%+O9~@k)-hl85?NdAgoeHdSl(ryF6Jn(q z_WBf~g2~C0*5oXky&)@`8&uMfwliF$=;sAm%D~Z7VXznMa}udz;;4yr=ALJcPda$|HqQEh$rCDI8JwfjZgBX}9AEpzpXb2-Ir7nfjr9!%{Q*i!k~s7#IA?d$3*$TW z-e2E24B#F~S%Vfal>?+BaRr}!_9-5inZ_86y6pQ0#o zo_z92^1`#RzKN0%Z@u;R%->w%;fEh(;noV?OAZ{^&!tP3&|34v6OS`Lf0It9O&muo zFE8=f6Hg#DT)T3K2M#y*y5h+1a2SN0}bPMX|E7b{j z9||k-JQP+4K_gA^&Jhb&A9x~soS|DCbY}uBJ*F&3qc{{oSRVwQG(|^2?6kui&p!8Z;6x^ZD3Kg__%XDQOifNw<~jLr zKv|7gSh&ux7@=igjhw%9gJUPoAf;rg)8zG+pJ8UQNh`HN*#$+(gE$!1b|#$5tAPiauEo1qgR-y^A~;voOc*2rFPTEQsTbsx%}~Os74; zs3_?5M_fAd5rb}*C@)#x+TeqB1Bw^`03ZNKL_t*kD)05Txo#ZWjRupWP=sTXFf~g{ zN5i{8*mf_*TLRF!?=Z7N{O)*-b0ea42L7mojb?M z%4%TZwOYG>K91u(0))gm$F-Z+`Sx4irtA;d*PdW|VVQ|IW3Y=}@JL6^%nH*x>m8_= zaxf%LV|-<)`Z;+PapcA4QI%);qi0;|r*_ zySVAQ*4OYJugZ!j3N4W1=)I0^b2}?*&}l@0WR6x%Vq^I1iwAi8fhMl9cpVA`_OdbWUTc$@k>`ZOAStcInjiv2QG!iG zh{za0rkf-(#*{<6?-D0DRbDa}?6ADDjEGYjttraN6U&6HwM{OZJImt23Z@WDv}T!X zP7=w8ygy=nc@1rriJc)5o~dR=mW0BdqA(;`gJHiH#LFlGsVS|cEGt~yP}^x`2!exD zMky+3(4OAM^z1?6ti}B5Eq?If39L#C5##q&KXao zCy0`mLP>_gVL}oTw523OVk4RDo`1#%$-R-+PilV^LSS7hfhBuutrcDB}Vwqk2*lXhn!U~%FItrAAV5yDHdv_Wq$WPWjx&3=!WLq{0q z1?wB@96Yd}PP<7Y1;cKajpZepGjm~Itj|ifi_XUTx1cOWT)Q>T@iXVSvbaJnQ&eXf z*_=Q*i4+71hsb=V#c()83Q5vvfPi9{bL{OO zQ}u^9C+`^z9e=L0b?L#lSjieBfpM0m2}W+?gaer&TmxqVhfOL+l6rEcS>5h)ZQ&+s zTdU|uGBMd9O&d55{ei?wg%y&G-hh)=ukrq+OU(ECxb_6X#Wl78OjRQ5=2@wrFga2u zb-Bry8CyqTg$U=qpK^Y6IwVORd;Bq)oes_k{`61(f}gy1i~|QB#8L9vt1t8D!w({y z<%!21C(9Ck@b(XxzqNq(DMERU9(jaDBW8JNfjEgtlaz0K^5#=5B&qw#jG*Lgc8R%j&aI`vohdp*aKr35lf9kP)0FUYOK&~ z^@gl&Y|&^>^5V;{vG34fzW3dC7z_uLMTz&JNxrH^cnnend28&-8>b^e{57mgLa2Kd zmEJadj9sJdW9SX7HLXU2iCFNdXO1v8H%ZjUNSiH^BxY)Af}5AFq2h?i=_!PgT)TRW zhYml;V~-pm9}I~SjjbR`+kht1nnP1G|y!iJkRl1u2IR0K3rx7wHiZZ0oSPQ~> zw9uqcigW|ABq35Uqv4QFGv$k)eVu>&TVLase(}qE=^yI8LzQSci4gNDT?xm48UM1*ei&R2mEzGPGvqOh~CCDI4}jn(TJif zX|+4FI}1jbmlS65iQe1+cSD`d+XJZu$5k~Z^k zf|U|w9Z^{!^8!&-c;PY9lc*ReBvMI~j?j?~C0C+8V>xj<*-%qN!;dlcB{)Q-6uW}x zm?3&*Wrs@0I|R{xABN~1j!YqLpYDZ1IEiuz(xqshVzM=?bRbiN$nZwussT?wwvXTW zonPQz{8#^qU;M|v&8MD!f^NRft>qhR4Z3(DqO6H89kJ3Vq4CD!Eg)hXn#zPb$0s=e zf0|>|xv>5#;J|d7uYB$eCYlLVX+sHB6y0&}AL~BjR9dMWxe}yVLcVf~WU$SsH(-=? zNDm*u4%hI$3|%ZZtaVT$C5)9sln5z_gu*+I))C%$K0JP${&0x3o+Qce-jfeUNUh1z zlqimwoS3HFYSEdPpgj@NVR0N|%8JeP4c1my(OS`JwP?5795`^0IF8xa++<~Cl>-M3 z&~7#vjYhOut$IBUrH=qkL9xE$-iZ12?w&8zjSlX)#?fxvfh-$#=uRP0t z`!D|mzx$v5Hgg9KvfUrj%PZO{2%)YnMU*NE*b8s4RZbjho_Xp?zWDhs@aQ9tG8pEp zuWwKkMSb5=_jH5aKC`O35R-R5Zc8MSP>rpjAq-!7@p&FOcmOMIzhA^{)fMhoi)sPX zyHLhi8+M!tXGJp>QtK$aty!ew-+LsbEfLbALhmcXyo4+zo9uA*$_)Jy-1$tEG{fCGc$uuTm0o;{uMfkxpL(iMOiU3Ge@)4;lhPWyzs))EG{mvy1K$E zue^+qu(rO+!Gi}le*74XW|Je2AK}EY5Ba&D`B_xEnf<<~`DH=`+jNMgxzIF*B#FW# zMqiNE;uozs!J$*x!aO?FNS1zQAVJ0 zFoJ!PO+NqTVU*8-21b;D@8ZKjM$`^3De9<*vGZRla95zyO5j{cm6s?Xh$D+} zIZ|fe6s8(d3@TzVODoxjH5LoRNlGLosZuo42;mLJ45_Lirf>|3A>KQ>Tbo1<_RsF4 zuoeBXpgXE4x?Mz7kXI$s`}dK=5oUWEx4liyfJWRTOPh>rg>faqDU`}sU0Y$Tx^sek zuUN_52Z=iXxfG~+N*NBN5ne<%Bo0LpX@r(U3Q{V>V2!Cb=eK_8GyML)`p@{%um2{G zf9h4f_H#eO1BWKKa`hCOODnXZ26#!O!{!{Ur=Ya2LE;rcn!4ExkYabM9RFUZa1p$d z)#UD&v^f#51PVt(mi)pOUSq125XBLtS7bV2SmeY>f)F7dCUu1M5*4QmDDXbuz-4Z6 z!%--4hzwJWzk zMm+n{OQ>c<(ut`2h$9a_z|&7W!6S2%4EjAbyL|>;@ZRxLs3;@SF|Dk{&G{`ZpFTyo zxk$`_mtS~_hYru7%!sK(pyNq|6RfQ)Gwg2B?RA-&IY6nKT)45t=1#$->np^~8Jt%{ zTHx!2E=n_S_Kpbm-A*c5f6X|Ljv}J8L1i7Kg*a^lrvV5)6_VpR%*M zj+$#RuSc9+TSP@|G;La@#WwR~tpx8pqtfDZjEf??4h`0Y1>*xJ77p~341^66M9M_IPL#y2+?+v(m?i}ljw`jCe+6QN$kzlI;5cZYf2Y>T7 zeEaL)pnq+h$6kLE-)vJ}xPnefa-*4Uw`gW{ft&~qWiJ%5Oo@bKYtW}O71l$qD2b9L z4?X%g>&`NN@^Zir!UvbVcj0yBOjr|~#8nb6RDGyW2rt9oeEh?Uj|~Cu7H<+E zu{fkmNqvvcz0l#wL(|yOkz^j6+HFi77juM1B12@=1&6u-l=o=wk=~(|L~BKCT>$J0 zk8yQByVOXLfQiuBk_my_*}-ot5anwq+h<{UjrUGmU~|>eY0q)!z#-acg3Y`1H`}*JDQCQ;VTrOUA~c~WJ!a8ft{fvn|gr5 zPrS&1N1kMIVwOlnL{f0-+7(Wpx`2o>My3GaNCZ@+2c6UrQy;n?f)o%giM1;vXiFln zTCt$_Pe%UVQE$ z9((Qx!ziJjcIfGZp7EdsGt+G*n+dHX0wKs+6C{l`LS{6QgyGHx-JK0&q!CXmzP!%0#f0< zIsz*qyodu1z%%ZQ4oQOg#jKZ#SOTlZey~Mt`X|7$l#JMwP@Oj0R zGZ$%3$Nb9I{v#T3Mm{L<)^p>=JjPqvoq)Kh$`P-=`YPTl7MC_zUF-3Uzx_5l{hZl- zvkdxMJo?Zqzw(Pe!y}JB!XpO{QB;CI_=Eq0<>ghLJ@O3E^bEtulN1(4LoR*e8@%^F z{BNxM_#@=jkd{$Il@Cnr+I3=`Lzoe<2kCH=m;Qgs-aE+7>pb)Po$#f5Z{OP)jYcDq1OrHrAec!(OiEU;Wr=c-WI2p> zZ133C*m7ErXFRpLRhz1Ir{<5@P+MC&HQw17d&O~*WLplRL`tNXNiYFKYJ~1ahub%P z@tpnReD~r4Xh0saP-vh*;`Z(HopavzeV*r+tn%a2H*lfbrke|N7;r3aViH5aCAI1> zbNPxqy#hOYkCB4H8l+ZuzF(3Djk9GA6nV-b14SlMI%$U>^f5(-$xsuk82-(y>7S*R=Oo~5u5)u*uadGaJ@e%l;pmsZ$FKu>I= zTNsYMbCi|kRqFMSv9SOvGKwO@52`%#_b>3T{`LRKY;&EDKJo;6_uR%auf5IF&whu~ z7tb;oN}fD;3lHu-z>b-1w3Wwet1CSF&YQgX_M1dTa^&{IeD3kbn3`YU=39yT7Mn;8 zJ@62R?mbAad!D5eucFgF6|Y8`NHVVvA}=#Ug`+kL<$4IYK=`t(T}Jl>H9QBE6k7{* z1`Saoh$;~eJa8YA6BDjgC@v|y1J8*OvMhBXlfZY4{oDZj_^I6KYoU{ z);gHd$|@|SOG1?Sh2?)^wuTlB6~xj|=&yf}$L_2(FXA`)(?=21U_#)N^66S~$3lP!6D3Sd5lP z9Z*O`KhH2q5@$Itzwrv4POFUJaU6&G_&D3P%`!eY$>iiD6BFZ98xttcBM3qQKVY-D z$;p$aSXy2oH-@M>MpUgazp#_ST2?Nua{l}UthLO~&(mtR+`Y2w2@FW>NI|>P;rv<$ z7;PqwwnY`5jLKeVP9b8DIl{9bp|BR~`3@!)MdW#k6oy(QfFdUAcbKUb{1-p}GyLkW z{0ax|JVYTp`e_MMRT5)BYDJo+_)6nxRh|t#xp8@+{n!amZa;8<4?J`qyBB8YZLYGm zbc);rLk3A<3QXbn9D}BIo@Wl!E5$In4pBHK0|hDWnTb42Zd0_e+;`gnc5k1>7JY0X zDHVzc%Co6-kh*9p2R6e>_w%5ZlDhm@mI4_G!rkEqdz%oFV8Gt6KrRTBPmbi&$`U(n zyn*8<&(Mo|+;ZS{dTGky`DJdu<8Hq5%=dWydoO_$G&h=DxNw1kw;$xSS6?FvBlhjt z$KshYc)n%#?p-V{p27D6cJJED%P+sip+kpRSy|)UnbSOZk|Y%d6A-}pfOn|%Tlr|CO0Xc_~gg=*hin_jsyFtRwMe|m@F$O z3QJga|D|x*frFyh_ncDdzQ-Qt#@i0^jcrjiq!_=ISWMG>#?!1L0lO66oi#JGOyB4dPCaUXlBtM z7le{l?t2p7cqCci)N1iRe7bsBHrAk_Xdx>nFMgTV7{@(?5Y%clj4&wS2-`|o4&8T{ zpZ}Sk=F!KGIQgLV*<4=6^E`g+^PlJ5`yS$d{Wt#?U;m50CXF*}?$mHP@W^sglHvqG zSV5J5mr;fDRj+yE`#PA~T)9357yQBdb;)X@E}NEF%kX_2{6FJ3B{LbhHh9u=)2Ch+ z+0z(h86O|V#0hz3(SwZui>GmF49~;&3#_r_y2&Yor7~8hI##Drix{8YMxi~H*Ov(^ z6>huzcE%@X@uC`13ZmLLi*LL~tD7)8J5Ai{5>+J6KL0$@Smvi2jP0Igvy))bK3Nj8 z-cOmI8e^u>V10d^wN{tug}p4jb(HrP&oMDE!Q9*&omf(-I4DMvq!=<}`CjIEjuw}% zlPf_Zo_2~ma#Pydpi-%jBnkaqhtLmD$|98@(9Uuugll*gd5Q`ZU;5lreBnz^0R?~f z@Bbrz@+W`I+Ik0}a>j!R`n`<8SZYzl?OAb~EbHS35^Ghdavp8sUs9N4d2-c+ZBz-? z?RK%kN0g!4gU=UPffSaa1Ttk=HdMV{nQ?Zda(1hL^lK>ybr@i?lv8IHIq@gwnEJsB z+smN4N>pri!th8#(jB80O&4U}O{b(ItMGYowK?bJ2h zZkNal$gWmt^>bnO_Jqg1>{*y)EH;m#0)Bo zoN_)0u~ra9A=Wq`QIaI|GD(u>SV>t}xX^x2%Ps9-Lug-IxLBUDs1;Vw@406-iXsZ* zfCtJ~q_MMSPfj(+vV_-P`2qVM*vIX6-^bfe{}obeGMk~aqA?cHOJcMaks0^w3JYRl=-1$TK3?G=Z8%&LNs`cuHz~A0_!Z*9aIx7ZEMm4zO)$4} zp6bLlTD_E7%^$u;TBxvddyDE@R`qinv;vC_{KNBL6Y@_Cf9|Jw^n;JEe)Jg6{_)eCc;#g#*L&2wpp3}^ zTNsLRSmlZ=>F$-K3T0FoGdL&v{RF9%b2i9?v`A^CJ!GDP70ufKVW7oLBP3mdCE zapYk>`q&5A)0p7-<{IDr*57jO^cl8K&9G;Fftx@2DSV}wnwsL&#tO$@dzshXdI!Io zansBkhYsAqz5}@%`s`{O-H>)Z-tfIyS+7`t!ddv1^Emhu4{I~(^}4GivY2|UM&4;7rQkE4`B8rH7k`!;@3;li+@RBJ zQ>`?}(v;3dll?c}%Kz}+|93p`__z7r|BwHN*Is>}N;HA=YoujXyb{hOm}L%poVRgU=ZZ zwy+M+GV=ZzW3H*d{fAheZK+_B$~m*Fwe+(-Vd%g=?RJ}5Ey5I%xZh;o-W`1L3qQeA zpZQV7CdcVDn<(udrt52KjE#-)=#Tse4?OSyfAJT8!P8Ga&9`4ZO4YBRWI-=a(5Mnb z<8n1Soff_yB9SCXj+EM+yTXu`ca{Gf$j_iR5CkAph{=VsD+{Mqc5Y{dFd8cq%8N*i zWV4mfO)^wP5`_Wbq)#jhlu>TzFI^ObP{y@iO+l6?_$4D|w5L=Q1#ukH>2#<~%rZVc zPOaV`3`0E6!vV10r=g9X2*LSY2Ipj*}9oH|Tk+tgH+v@?q$}U~6k@6ovcz z;Li=-PpSL*eBc!{7dddS;{#mQhB@|6sNx##^*ARt1o6QxXz~|wI?&UXr zzom}+H=+;|j)Knf2lK+1e*Q6JoywbsKPl<>sxyxD5~ z4`F~})W5)G`^XPlZ==0|tFzW+xfhGeT8dxs$sN9c1zJadyn@An7HvHkwp#37DN8 z=iRs8;Nu^Al9yh3i3`i;`I(=3idL(I9yH8Gzj!I#r7z1;#wI4{cG_r@5e5pACp0gv zQ;Q-F?7xAZ{;8+9|NeWJoEoR!-K5!UA&~^-W!aDuRU&s;$Q-rK1-QF6U~_E)FO2x{ z&ppNCANd&n=HL8p`#fV<001BWNklfH^SvI$TFV_r;6!zyQCHh-veU^eV^QOh5o=!JNWuM&qGU%_I!k=Q6{74<|Ii% znq)XC%(X9+*P5PPvJ_~7AfPZg{WQh%RM|kwiIX0YPU-b}?Ag7GFZ}f9`0>yDC==7; z6umAI!}{_XjmZW&^fB!=JNE44zy5Fk1&0qG;(z*|{}-AYIdRe&@Ur zD5W@aeu+3Y*f?f&qlp()nD8sCU1;;Q|L;F=_`rU4&(E>F;ZqMad76;LZI+hK(wLk; z2v}>j@hVM%${4yb$>Q1u$IfpsUaPQk?+xtTyO*;|EoaLS2BieTl!vO2BtebJwARD9`;p zzy15a%aKPP zih?lo5Gp_zds(5E6@|<7E!7=^hUhR#W3UDp>w9Yfaio z9oWslX0u7V-6pKgl8b^~nmB+{6uCHn!O%r0glLX@EpBLFj3hTXxyjrRU<3v=usLp( z@q6XK#Z5Q^lvlwkFH%Yr$igXI3tO<5o#W?zMR?#*mkDa@K z$j1v5VYP-Y1!pgurD9Sll?t2f4tW`i&`)wIm2oPSh^g5b8spP!bYd=?T_md1n4Flw z8inV1_`ZM1&MGC+He`$C=Y-**L#OU=%@~QS=QnGvjQVo`R%Jp#;_H7{b$tP;>UoMRIafpxIo@ zxp3+XeSDHygLhX}@MT0Ue5~(L2u?SC}Rx5Sc<{kSzPWS84QC5 z_n&^hj~?XNpkqO75+$1rltsc0&cg?Qlcm(LH{WhLTKYif*2`2D7zb%KR{49d5xI zqAjd?S(Z8XRF+}00;{BR3KRt$6H}y?AkVo$MBG}NONc{eGXouU@vF zd*wa-k~pIndA(ORe0#kfaiH1UXwn&vXm)#4#wG~EkjdJ1r-m+WVtl+#-0zYX7C)-c zi~EEXg~~FbK(l-IF4meGZ1(#E^#(Q^L)EH`PfkP9=H27RuqJ1Ic81dz*9jD)X~yhW zfat8#UbKAg?PIJgZ!i_qc*=%+B({F#5&c-H1l5*3Y1@1X?JBRN)NTWKz`Q;|h zzV#w6zV-_FT8rDa@8R+LAEq|m;0Le2!ZR;D&#A=|Ow}jZxqX2AAH^ zL1%4=d+)iOU;3qg%#$B_lsxXRarOd%=b?0kb~mO`sgUO>-HjGO6!7F@N4Rm{e!lj# zuk*)$^rv(?8G&}ZhoUGzOYkFdQxK;K!s?Nj1Ud3LkZLW$CuX+TP6cea*-ylhzcFG=$lBR~$KMTXr@H~jU=hMFlx`4tW(b(y2lT)IDKDN&+q z-0CaVf)H08+1DMqb>oC;wMwVoBhPc{^%}xjdi@rS@fvYw6|DrH{oE({C%^oU*?Z$2 z`pr$6%j+nmNV7g;V`E4uUEO~1BGpEN&wTc?eDH%G5@-AFtkY{8W2xVQQPT9l^f`BNBs8*{?O-)f9 ztD}^n*Xxny#bpsi{lxvc)oQW1xk(TNEG#TIv6V4gym-+Gde+vMnVDhRwr#ZA?O~32 z82ZCJ)PY?-%d%la*WgSsW^`b3sTK?)jkPWo#YNXja_d}yQcCi)ORXAFt%hVtkJkDU zyLQg=r7wP-r=I!@o^-5+Byn)nFpS8GoFvIel0J<_gY)Ol5=9ZcUXQ$Rug&CzTl-p* zWf?gVFN#RAjHKIVX8SykJo*^-Jbak%Jo7#N^iThSH{N&`DMF-<$nyf<4~Vl%acxSu zyHdB?#`8QXl^VS~zSIyESNG8d_qoxY+2!tGd0kG+Xf)iF4N>Q?HV7?{Y5;z7RO-0f zV|8<#`;UBtzy6zV@%2Cd27CA4$k{WC^m=^`9yrM2>9f4`);m1$#1n*J$jZtJcieG+ z?|%0=PMtc*Bab}7+i$)JNN%{{CXOCG%KZEshwr(I_uhMlyAR*N_{12mzwshR-#N-% zhwnz!tBpTMk{Dx5nS1A?wTJ>KAH`mF@%DsR!2(ZR3qgyB&t@Co=-nc z@sMOiPEq9K{XYHXCiSYz7`0lF3rSTgdr!YHD(vP`_Oj*c{*@X?-6E(~eE zM|-`^W?XP)eUmlg{m_8st8-aL3K^x{lu$~1-xVFkWLT5odlJufc>K{v_}$<6Dj)ys zr-?jGnj~o7qZg+%>TbO#tr30zMFy3S{rh%t|3mk%w75jKy-BCtcG+E0lV$~Ik4jX- zXMMet=LESYg2`B0oTTuBn0*cx7lmxC2WHTYmq2 zq$&$*;S`Tf0a`&=iMF79A3TM~Qun&0b>Z!q%k31lKw{{pITtp17{7wAQpOwO%x;@S zdjaQ`R%o@lv^srGo?1jHO_n?0#Sfl;mbInx)O^XV?bGbvyPKNqlJ_>Khnlf^o#l-d zX(5@M-bSO*Ac$(bdh|VBdHXo$HagsO?*mND&N4GSjgo?PyT^;Ky@gdSV@a3-OokN- zBV569C53s^B5sT;42&t9szgbgDWCvb;AutD?-OW?Ckv$Q^7xT^`O2?+nP2=zpJ(U( zeMrDsMV?uNRqWb-6OSHwh&_83c>m~obUIDqewQHh9jQ=Atk5nbzob(S0>(iMDdIv% zvOFEC7f0!@gXg$XiO^n%$qR}iW_G5=?uBXBq}1BkCbo!`7#vkSSz21=?1i&tUkUWNRN~nZ*44w} zAV`~(r@w9r$5QR{QckN0}tLy znh5k*jlFjq;KLt!oL;}f^6~{*ttNrzVMXZHLXjc0B8(#XNsn&7OIWQyVTU5Z9*hgDQpcNQ#1foROvpqHyP?0=MUw624F>o0QhhI>lLo1RD*hIFvQO=#wj|a0%OPVy$C75 z<{c_Q%5AsK^2INFgkSs0&#>>V!+h|=AK~y_cVhFLb7xM|X|+*0pfHA>%_uOgsXAy_ zSO<;No^%T3EgEuH5>*Gvhbw8coy|4&-ME({AN(LMz48*BPKUYeb8MfR<-rH;quuSH zl%hV?;P1ZuZJv4VS&Wr*;)F1&^7#FCGBZ6zk>|{9-_Fv?MP7RO6@+wf!s*E=?!NnO zmY0_~y?B3NIXn5SEIdiiuW&W5N~FrQlPbDM{GD;nPfrxyx3f(T?rW10UnBT zdBRd+$O{iGi!Ga-!!;)5b%$1&$;&)u58wBOs!Sy$Q5aDV4N1I7=)osH@nQbO@Bc1O zeCSa$rK+=t8LQVheAgjvxp_amR*&W7B}|r~u!M~|);a~JF@~rXkrxHMexD!;oPB;| zfHe>-Tyiwo%SiL1%>bnw0CH}!#v}I~WZUc{aS{_$Dnwp@R)R_;V5~mI^tNr(8skK@ z8h%(Q?@65?02T*}lN~`Z^}* z)7e;IZl;P7mU>V@WZ^Y**w_4|D7>8JVrE3Yy=F~uVf-p7+i9%k3}ZM^r+yZp`H zeTUcHeGfm)xqbHyJaq5<+;;1&g!LNloH@Zazx($*^V0JKLh+#|KFpCvKEU?5IhL2t z^H+cUSG@J^JB&|E@S!{I=kZ5BK#!cKzx^%VJiEx53l|}VAQoiG{1A1VyiCb|nL1Pm zbX3FlG+ENemk@c9?&d{y@7%_hf9?zX^MCm}+;;mdK!F6J#stbJlEl@zNvA`lF^*rW z61UsLai1N#c5>$(w{hpe+cjS0X zo_h~7J~2j7q$BG}3?V2|sWQ^U4BaMamXYKs$_wy=3Vu*QN?ih!jmuRpVRlj|w-?*e ze#{`7Fe57pXL-%~?AU07>ASn0QYfn^OqunmbjcHtC45w4O9!4)^Ositk&dP3hnKRi zg@dfQJGw?Gi7fYGKwrKFvbC%thHo$j8K*^^2?0X>(%b%Ix+>b z^{Rs^1s+M7W2~Ss8Y@yq8C?|M&MYr-{PY>BW80aY+KX;o zpvasGSP2g$qyt4sizOq^-PtjStMG$>G|PD9jaP}27_?LEcRC$fo$e6E*y{A?bbDO5 zu!J#&TCK*OJ$pEC-~ijVZzoMtR##Wuz*TD|CnuSop9f%hc^N4s^Yioc`%X3QzG0K;Zcf za$K$W?7!(I9((+878d3?f9@RZ&IV!Nk;EOUwK1e{@sD|yqNFAaLZpzSNs9Cps!V~h z(&Agg1GnA64LjyACPhkr_)HEPnwNbnt`bCzIz>jIcGtYe3F|t&z%PkvUK4*%S#tH zaNDhTp3l4QyvJ>~-OAasr;*C?=}&)(nb}F+Kk**-J@6p!AAgtAr%rJ2;33pRWAYC? z&&T)Oz2^wS z3UhPYiJ}U=AGn9nI%=>Z2zzw9JvN&yd_TbV0;=@}02^!TJpaP?*jQa<_reZ->L)+T zk!9%7p!j$d125}6NI5tP;Q~>93_Sg8lpAd@X)=x2(`glkJMy%Qe8KL zbTmVBE6K0CqL?3CW(GgHO-FbygX&#C zxxLKNe-(}K8rgrBEV-^BWAc=RnL3|%;$dVFqf6qmCpA{!LX2@6`XK+%T1y!C1YrfC zeDd621bBXc3Ios{7>i9aOr9dKU=2lKzzeHooPr`wVx+XhnPIurqdGOmWFtap z52U2ukJ(t?*Is{vZdx$Ab1$>=yV>!2@Vt zQ6vH>e1r%vxkiUokUmNXZoBhN9)0L;ioD0!3#ZBQ6s^7T8Pj;WiZuy&o(&tIL%XAN zS#*P_i{T`!oQe&acSVt7QKU(NwJDPmAvf)tM_~v&---Q4?2)5`kusip%jafzA@}rU zjr`GK(ppQ;sbsMm3Dai-UW6~*D$%o$P6X@((+XdNv)$kYiq8C3S9<dRwQwsey5A2APR%B30R?8s}rXwtyYV|TF{DW zy-s^&g-)EJ!w3~sh-#Be%xovDjN|!Lpde0CDp8d@&B(Ki@$m_wFhWbsJ7-Vv-REDz zco7CDvJ^~FW=-i~ak^DJfwS%T#7T@2%GublU4-@$z>#J*|Ne7)LR8-Dv&1a@jp&EE74E=VC zci%cnr`04)5)|Nj0jsO)v|4SnmV};03fM6>OXz!yjg3*MR47b7geA<+&g1zCr639d zgcq^W%}K_l$ZF##3#m24X-<}=*uvmRiC3<{PPbH~v>03ONlg4Y* zE0&Lc^kKgG>tE*4k3WW%8M)q$Rz9=4cJbK553ze;p5@ggmRFasIwPo5@tlNWXcbjL zy7&kRtW}rYlSa?KE1fG_?I|YjF+IDD`uI5O8ygto)EI~FzKbUwKSC7MD6)*jvx~g- z&O2Vcz9bTKK_> zFY{M_^*2bRsa5Nw2t-4&Io;sB3m56MVtR$4ZUr~vb4PuOc9Qb!<`Q0|Mm2{dPgzcSEawL0)et7R zJ`_`m>waF907q*rCNI!hP>TXQEy(kPBEG-__aEY`U;R~n;pcyr>6saNn_Z;v@GA{$ zk(JFLkKMQ2!V^axp<3}cb@CXk)-s8a2nsx3;(H!NN!?YR!uJA9;ReC3spD!Zuw+?E zQRHr24S$%+ph|9CGBp0m7s4y81Oflj}V_5#KyCdjgk z=H>=xPnGR%+6Fl?Wvvhi0c5K_jk%u4V(CxROY{46^zRI6`;~Ttp?mV+M-pFSk zew4cp-Hlg`c<%L=`I~2-;q19{Ox4FZu=hspJ>VM6ah~wz@ppLk2jAn}_ugUe!Y)4j z@gL*iyAQLnzQVuzqyND3ufN8weK*nRWUQ}kqJ$#7f-=7~yln9Mmxfy<_p!|Sg|Vtf zo_4^*eCm@Q<`4ea@9>GA_zYnHMchM50iI9MPsj^{=Lh6@LEtO8?G`rA2%^w6+|z_G z2w2#$jVGRX1f?<-Pn}?+wOIl;LvkZ2GEmBnL<-9RYx0tNXp6X|%OFw8qLk$DJ$Era zUdNc6yhuwh3_~~4U~hG?RdT476UsS4mG)55b3}D(fDCJMM3LhUtj>9Xv93Ww86_f> zvj9tL5m}FgW)De9VRD4lXyG|QLJ4P5WhB`^4Jrq`2Pv*is@chdL(SwHQ=y`LkW~eB$Eqvc2?sqYHLKtY$xXsK|olkz^ zqx}Bw{Ra2ldkC!s&E|&7_LLsRxMpsW_OGyJUlIlgAt34Fd5Q<`zmE?bc?4q$&YoKw z)+|bTL}5VSd&77D-*?&jg)LB4ZFv_NIbmG(I+ksX8jn42n6c0=8=|hpMP^u$Irv=R zA*{srEkgFFHQEG$YtiHQl)H0AW^)0{qinog%f zyT#Rky>LM-}ec_Xn3b{@e}2HWED!d z=l8&E2RQQRL)7aL=P#V3-ML7XOM<||FXPGz~9+3h?0_MvSVDw{D1zHbw_^@#qiF^W4vVhz@)=Tvduddw5>R zi3{g>@6>5tKl&bHV-1cSf1j){+;-p&*4LV>uC25Grkgl-?mTO2>)dtMA=cI|lBNkW zGt-@#evZ*a%$cX06FA;O@F7X&CzvA(g6lpd98l~%jWn@5lG!Vg}g)9tZy*Dj(;l`KgK zqlj;Q{p(yfcaCH4zK5|nd-m+%uEU2p^2j4(agW6_r!cvj)CgN-#pWov1z5jqenOHMved`( zY6uDaeh*;_LO;OwG)X_E(`f^OAP7;$1*;c%hO&@smXvwVqmYuYUdJ;zHcMDZWkvmFw2AS|V+w8ECT}^hqmUVRW^Mm)t^PL?x^d+Gu$deBB ziqFSC_5{E6)vxgAks~fUrYP{j5SttFe&12AfgsRs%5Plmg$g2+?+V|f-$g6Q9S`2m zBlq7&nx>pQb%I{Ei&g?@3#9h8%+?t^h!}hQL(jS+L)(IV^V59n(Fd?;&xMZ*Md$}u zQD!}rS%kX05afA|HMwhmY9Bm}ABIi|ljoQurqkRY?siD~J&G)Wk^m`6fR8dcMeZ`X zlDLnSk~l9ozvdtVz1}8ar9!XQXZ7M5QBWk zs755c4q0AMtw{1TA?fvzVTJj9x3SjCIe&4JV<*ng>-V|&z(IEIxq*5~s-Kyj#u~%+ z9rKtZ;oHwXPrL7IFuqnU*HB0(bN8;yC%Vi+SK7qDH3hU1u2`jT@#gs^^|6pIe&H#8 z@ArO-2OqeH#>_Mr_kIg1BymAefIl$>sk7syX^NJL#{49Y+<%yTH|$|$Wr;JV7YTxp zTBT0X?W4TQ^Zo|5q^qM9FlA=W<(X-taTTs1uh@#h zGMtiYb=CedT1*#0Pz?gS^7SdtLkLB8qr=+LMJ5^z7sRb4o(h?`X)j}w<1~-HLnqm! zmwMz`M$+$*rU|BSDupaJbbEa~~&<@kC`C+U-w6i$V+E1?8B)Q+}(g;i(tVt8df@#vosLSTx7&=VAC8($TC z_=ykj+rRY{KJ?)y==M4&S*i|A;S@bKV`A41?!MzT4&Qqxs~6U2HZQV%aRuL#)W_;b zsVQ>fKt1OAiqNgkluN(XR$x7Yu^KP$^5p%y*f9}08<8$3GB+JAOmW%8d|1$I(PSGu zORiZju4@@~GGrS@I+yjZ?7JsT6!4sWei1bhDTw&G7wz zJS*sQIw()0eUHTCw3?gbQZqg~M`e7HpxU5P9Vf{Ragt$6Py`fsTGQ)v$qU2$`~rRu z^4|F~Jp01S#8#2!P95rN2i!yGGE46|@im^tD=D`{o*<oJ*dbB-(&6USr!*h)7so%YI=%1%}~l?&rLV;u@5~-r55te+i%h9Y~p)@ zdZX@~8vQ;>DvS}=bdX#tbNs5$snh|Ql;Z9~H}R1Ve*h&Uy>^RApqZN*!&(o};)g!tjT+OF6C`m=b*xGl2AIM) zJ9n1ST-(6doFMYio(36kexpm%3OZJxY(Zf%C<;vO@}cFR*=`I)o}-l_3`2r)7&x>x z3Naj{kM3ck=YSQGUe{%QMYXESdliB=UU-Gov**z&xGE3w%7*B*D7&uV!lx(- z@wB2aSxMMELy@m@=#Jfd^(()`FZ}$MnBBP#GD({G2!8@$B_hqCQeoe%w{YLx2k|P3 zEEERs+0=NQ3(G64t~ME~Pv8du zlM~}S_`v;4PS)8uJI}(xJg>j`1~0$z3VBiBc|NmKQ_M`w&}ub7c}z~v@}1|t&wIy? zF*7xd_B8k1cMm`Ekq@!Hwo0qhrn%YX`4?a0?YG`xeRYlVXV3EJhd#u?TW%%r3>#<9 zaO~UPAuw(bXRJV{C4Ig;+w=fBnj38HKr7aaxFoKyv&SkXo0;I`#wKgslsrw@D*|rw zt4xiBJioTV8*!8Q>Lfv7>4}t$ZjaTpz{(I|v#p&ygZru2n!bF=zU!?1zNe{19=-;O z1W#mCBh8op(NFMC|LL!B$AkA0w>nr0VXfxcGDe_k6>RS64YCZs8gb~sd${+`TM;5- zWp$liuL(tgRxT%3N{#Oa^g8`vF5VzYV03T4vN2>iWiqKORr4QA)y!0lXQn2LXKcsg*s>&Qp%xN?NDw4I5<41b0Ns7}d*9_O^TWB_ zXn>?@x~hvPTmZ#;`+d)Q&hveq&$B?Bq;z|I?%cUgR`}GFGbR0Y7p!1vdKPV<(;ski z;f~+AsDS=pNIC2>HC|_KYJ$n}2@sNQw@s>G!$h4-YvQQFhK<{J_u5VVumAEV+*@8@ z*RGvB^~4!YJpKem7hHJzJa4}F28*{Bsn*BXbMz?tPaNa$o?TpDy31dG>lOa$m9MhA zyv!4i9pfjSd5OdG+ejuSc|mUaxWD*a=RZIL*ZPB$pO1^E93FL!EB} z#ut}e%QlwlKq=JJg-~Y?obTS@#VDL zxC_f>5=jXn8n4t|CF9IiTm1b_a`75+@pXGFCpsH6xHq>nY|QHr%Iz0xVeQ(=EupP@ zLpgthU`?SE7$}v;v?XN+RdhGd3p4fR43kGKI_f)v+uO}qLkBryWOaHF*aIVsDGEt# z%N++^sJh5USicwMbjbR=g|IF5*t&omt4cUz^yVv6F=&sOi#^Z$7sV7o5c}q!qAjD% zjfj)Gtm2!{WMBocXOCUXBNyF13J*bUHy~q0huf8(8M8+QM-zmj z$lCZhQAGS-S>C1v&jP+yn+CugE-@({?ib53t4dA}K8rb$2);m8VxUgCl4)ib5vNd( zw~74ol`zjE&P|h3s$yFLVWOsr;vVzaaV@w*)H|VtKQfw1q(a?G@uDfq4MMD$rAGALiK!S0T>zIcE9yMqttmDe7Qy7l| z6Y%{Nw76Un;vH~Y?L;t6V-pqYROJ@zeRO!xZ?r&=k*Q)sOL$`NN0UZQh9!hj zWr2EFr!sPxRd-(+R*m}jjpG!{R3v~R2%gd&PA(i1oKS(d95qbj!CWWb*=nPkEQ&TV zp1PAp)wvT2(ToVOfM~^+3>hzS#>!hj~4o_)!f}^z4|9Jb9=4D5g%0jpErhuWn;h9trJb;lcB$G zxO|vJIu(+^^XTP#xzV?_MqkzO0S&B=m|j1S3V>X|=1Zd9;~Xa)7qletL$H;VPW(a9 zW{?!w@8iYKy#nt}50{$(7{ShMBd1l_`*@o#l(&woK-e{g)iev3U?Lk-yI^1dXpEb? z4U1hv$x)gm^A`U>ySkp!yY$V?M|gm|4-m=Ic^_Onc3G)cRV`7mU`uDv@q9J}XoH6J z#^qQJH&3WY7d+iJH)y}U>xzx|YBWeSt&$+*#n2zB8REl4Ie;boxScDlP%*5b45cLz zm|lCFhJGYli$jLfAawp+@ps1?j43epi)SDC3=6(Rt^N-b6+5+pYJ?YU8J$=$)CLPF z{FkC*@2-g722m5Jbdo-WBYR6ALHu3t{cmrczyavkwM<^}GO?y-oZ55aRql|(2cx@d zH>d|MOhRhY&`O_*O!%}AAwu-Pq*L{l@*Jy?7JJWg*E*KL{ebJWvbjZj}4!a1YD6wy*>kuTW7NL?{yJ_rc5r3%b89jt_ zak#Mq4!>A6T_R>g`K0jm$i2t$on-G{Us)nr1Q|v&-zvw|wW+**u=d{uI5}zyb4)%o zoAPTsI3hO(3}Z=r+B^`63>{<=Zf(5(0zxZ6a0g)#_SPu)Hr~(ncfROY`^aRp^@}I0 zm%M(in9^aX2?LMe)fC&}Qif75p3)Czn;{Sw|BC^4|-k+^%b$W+nwmsCkt#VKnnU?;fvr5Yr<_5;0Fx*Oy zA71J&HxEv$I_2~sy4y+(7UbE;@$f|BwUNg~uhLWVzK2^ga@wr_>~G@{sI&1m8Ja_Sg~ z#&Rao;FzopF5g)34$L~d;*uu$UPO-!7xR0`0)K>mp$c>X1@@G*tVIZ@F)7uY*7V6( zuSh(9h~8+;o*`iG1<$xATcL%3*cLU?yyFa$ghr+}+mH~jbkR@v@2Xp0bbd*X^N$97 zE5%Q6aogF`_r8?Y-TNkRi=3K)pTBIe9Y_wHI4hEy7hkYfD3%CK0p4h}GCIb{H{r@x zIBzjy!GVJm+^MK6B9J(HuSmfdV*@I*U+Ufxk+2H!d<(N4p9jC>MdU4WW?$)SW&Y;C z&Qi31e?f%Ra1Z51)ZVn<6FhGbL>vmcn@BD>-D3J( zF^B+1a8rDH?AMt*-XRHTeKtjIL1Tk(ri$D=45LsEetSK{#8wd~G;;=XjO}uYF}T0? z%z4z??*p2imuqfPIEuK!Acw!WR4BAsbP`V`_iapR^=KX+6|*017VO4c#7LN{z=|>Q z=Y{TVjKHn=pal&mfDj3%o(BQitMfDS*HWFwHy5l6mO6Vnp@AIfUbdaRRKxbGImxt% zSFPqNN;i%I9cz>lm<)0xGCg+hr|r#2FSUPDt&Bf&v?8mM306%(UN^)=(}{fuf|GB_ zZuQr3t=D0a^+9;>F3nwQlw%Gj_ConOhD_rUf1OlUtf9FLA3OPECS|5eesx&xEFgZN zO`?^=j(>bz({1k?eK(fMj9Z|Uz(ghgnG7^`HD>7?3h3-wMbw0;DI_r}L|=_in3y>@ z+#jAHGUcUQA32p!piju+kc43BA+(=_AaH^q6(xwtZ9QL|RBbl39TkA7N`AYgTVW_< z#s%2wXkv_hdkOUyl^+$Vg*xZg%RXDtw}$N1(LEbJX&79DJ)c>OOFQu9aqy!@ z#4^=DJ|&IQ=fA@OiwLF5!_;(6SUU7s;hR!i_fI!>0Cnu`NSd+6sSn>JIqj{f>H~B0 z<-#Sj_s{H*-1S-ARGs}TWwHjH=jUtH?MKpBee$nAHj$1uTZS3lZy;smgtbnO6oHQj zfkVwI?*Ik0EcZ7MBi}n451`}SM5Vtq{nFV!j}XvvH}E&j@=P8=!r%UIh^X>__WBl7Q=M7zMjEY16V1K?8_+$%6GqToc6(Zy+6=Zsny zW6n*zUiy&iadVx*oRF;P-73ZXM7N8(Ua_lPnh7d76*72cMttyUe%mo}p~!k;4WJ z9mD9yR{jV_i~L5L*`Nlg(U9J=TUP*~_^`}O9r_EfrEemS|J5l)qCu54b{=s zg*YrP`iO(|`xPvjv+yV1jAcKEcpmF|`t`lK)YzTU79spez3$cai3L_im1u+A{8Ye< znYHMu)!T~2NxkFALEi*(V*Nx`{dw`K&2LSzyl*5YGq?pU_rDJ&-tiEe!DQE`(E>|? z?0UD`21l*K?RL@2HMER;Zt-FiVt9w}^%&H~_Pu!}{!y_QkRxy20XqMX+G?y65=0teICCyslpAVFy<|i#PS6b zRTd^8gxs%LWR+*wwA(nki`jqeUfQULX;&>SW;K*m$;-*@WN6b>6C#CV&6axkn=oP9 zS(bKu|FB*>KNK6c*tbkcf-5Ov&i#!c8e<_^>$u4K`LX$q?0J(wbhy>?&Oea4FM*kp zc_>YX8c$v$zrX(s6Oi*SXmLg397t4W0xx|g#ij~Uwbj+#%JTf87(wOq3^l(m3E??y zuTFr|V*hc&@OIFRV`56#NZ9{Nzl3n@fLaWU!pq(D*ol~7Vrws5!;Nu?qpR1+|e?_+Y z+|UNrpl1i8*nX)l)w$paeC+x}BqdR-oMYA1)d6FJK>!ll@BM3w(-5m!0@HrXXVYgO zZduf4oNo7o#<&>>e;V7;?rcf%?el%i^FFES`ek|X&t|jV^YVn+?vu~w4r7b^KJHLVcFsTS-I)QGmfy$P zH#R8;Gb|xUgaz{_c5nUm4@7)&U5modsHj|$4WpH0A#N}IH2zFGqw{5KztZL`?%7?& z#oOEnK_bdOZ-6)GIkYflxG0?nql(RDesYA5SQd)HIow~TiVyP;e*O9tHwy;G*a!}_ z`VuGwWFj)h#TpX+4M2GFh??SLar&<_lp-o$!$zLVM6 zf+RS%HqpZi(m*)#jtO@KqrCwBMyBC`0_J0A=@>vsq;M9lLAv~&)et!&SW zl;>}sXPjK_Z_HEPwG@hm(c3vOcCjL`jdL*Cc?CB%KaC|U5Q)37l8L2IC4MK9B$DGf zOVH8;c*p2>4P6L_Jon#Dp+m*r+J5-j#YaNd1E*tI<#4!H`Z=U`QrCN)C zv{C3Jz=PtE=nIl)C!EtCa>nNRL4LlEl^Z)d^P-doE@;016EJlERx*tef2}D+o2ThD zkIWRugv)fQBMi?O^g76+mYO3SK;u~co!O@U4D|-W7<76`u}kl#6zE49Efo2kCL(eu zhJVu3=a|)VyU9CCmZ#C+g--X*8WGndx^$Wblc{C}gJ=`D`O5Cu@|~do&XZL6S@+Z=e!}teN3K8~gptx;(8P zz?Id9tAdTb!aCiZj*&wlB4DfN${IWkpL)yB-i_#bw!~lQim+*u)H&GrXNI456i=CD z*nZNBpfZ}Hi!uUPv6{i_7*6#c_?=;~a)WpZQBvzZ$NS?GbHq!gFb5oytS$O@<`sfv z>n4A`QDf>gkSU<{!sfAEpZxs?%ps?0VhsBt-ln_m-cU?-x`E*pb%x6L+9l6`3c_8D zl5hM>qu|@?`f5(@ez4fKJ7sxD z(-pAn&j0F~7(X-Nuvy`EfaHOsm`swHlD!#8(J^{`IM?cO4_I}-yOCZzUm9We?{yv?=OEFOFeRt%waq?Zr}|EDoJXWRk;9&j7=m#Y@Imh{F@NLbw+T z0J0af(P|d#VRW#!>6{9s&$-*@LBP$?A*q(Wbl!sP@6WWc$7V-MKLts)WFVZ)5-K=Q z{`)J2VCY{8wM?=Mvcz}|ja;1y)B)xN*l?v;TMl!l6(jZF#CUQ^3Cj)pZJc!?9q1-^ z#+1RGNaH`IAQA~$Od*ozo+jOVuSb3%NFtPkMV>thfp#aIzrNIWA>T`hVK7?hOBOB9 zR+~b6KC3ycrE+rBj<3$%d(Tvg zLUy-<1R51!D=_u<144orBxmB6QT%_+^xj`X6TxxN#9$XBXX<+o81Rl=cx2>bSP7}x zUrx%j+ME)?O8;BL1eo*0ua9TNt2WGb;aYefXHy?^-!{1A0W`+4qrAXC+z`?~+n0AY zrHW{L92gME(L@KMAF&v! zIsVy*HQA=lTN20cf$7_LM`4~LlO_F|MB6$%46Pk4;O)El5~aKUi~rT!S-=}+H3{ap z#cBc9h+2XcRmi-4B+QaVec={y#5|ngEmk_1hLRH>)S6;CnNgr2>GpZU&Rs#+@B)%l z5e$tL+@OejbKFpyf)W8m-d}wFfI8hsf8A;zr%#9q74~R!_}n1KKv6kG>?O`wwTWxc zOf1xISr!fLzU{2TFNTjN{vqm=Hqj{mU2@hr(i?ESF5kkrZ; z`|Fvuw-lho-tP7eCx5v%QtW-Ej1NeSm%!uoc{}w9e5qZd<8%1V3hp5X;{8EHp2??` zx%YC4+n`$0tj*7LpGn4#QAWk8;5%;FJZfS&QYmGH3bv#Aw!|QcXu6{rg*5PxqD|Y~ zf-8?`V)D|tSRoet0||=Mw5(ie1pVz`YQ6tw0siDv2uk(z1iS(_8LHGj5-rZ>1S@=mijN<1K3KxX} z<;MidQ#8wd0}hU-?tN3Q--=3gT2itSV6FzEtc z-g-oM;-|-;b1I4qa;w&+YLcw7a@Gu3FyIC1KF_K}}1T57J6ZcwiT*T1Co+E5aOVGN0yF+Hl z%lCzyuk_r#E3^y2AaHzeYqqT@EPj17)IgH=9^cC@x9AVOABGOeY_c^AGw1gJ?|^@@ zE4r-fq(mDt4(tU`tBIrn!0+7&EE%Mwr911ZRRMX1FOWq>*_P0ZBb~mn)sixG9_=7x zCQu0_FxTaSTRiK&WRdLSVe=W%=gOmN;=}8;RE2g;yY+B$>IuYYv$4~#I7MRoBiXn> z5{g8STHr@#Q}b|A+2yPi$8xLJw+hvSiF8iGsO|T$OUM0D%!|#osVKZfx5u5;jMoqK zmyYl6Ix$K66n~QvYhJLE$a|VeG+yt1VThR_`bA2_LyOuhHMro3#}FD1MV}+okvv|k z<6)M;*6Iht`?Cus`i4L$>U&D}4tKokAz}iTVj|gNZw!B{4i3W#iqHg9=gGW`AK37u zTcf?Q8=am|hos5BR6%xEC;{zT9dy5z8@=!}n{0N^;lC}_+M`QJ0*fnCon9Wx&GuPA zL7H#<@}A*Qc!$70Eh!$yc#YSq>SU)kAk{c;(XX|5g%GT|C}=$G3Vdvus|=PD7?v!j z%K8{F2j)^JL0iRmd2n2{=)SzZ9US`jP2e>tCqgNyubfj>bv$U>tTh9a75kxMJB)b!d;ik& z#840Zx8jabC|sEy-?Sz)98ORu)15&cN+^>^E98h-_#T1+I4+JaowSjHIMmO;pZ$_h znWp6PaK&;&yK|}N^y_UsI}>Hz8hNA{C?Fc_M6X^cUkoe~Oj?+KL4&wN%XN(+QUVq5 z7)!NNaUGgZai%f)H-t&`V&gi^eroEzV7nafkGq&Eq#w(r0Pe zdo^A>f6@sJk2e@hiYSjCS0XtrApOW;Fy6Pn1mv>?Yr=cI6pa>Y@)@ZaK1MTGt+Pq% zrqDmIAX#M_x?4o%izA~$g7qog9t26RS>BsJu)dswHDRe@Bd`r7i_D|oKw;-g6xasM zulS;cs_6&aezk(kg-DsJ;m-dHx26|2p&agWhs-}9@Y#C^y6shlN!Nq(Ylt_g6D99a zyy{r&9D!%#ADBC%?0n3;yq@H_+}7%jvTS;e5O|dywA@|lb$DH1@BJ}t78!>u?GMtw zJ(y^JyNQsQh_-)zcftOhMjpmUj;0@(740UpUAXyDV*TNJSJ<5wX;DQ-d|TlPA@W38HsGfrlpk zXgG`t8)Q@wNI@B52;Q3YDtIJ8b1B++S|N@45kd6~yTl+96Psw(;+Q(iAxe!29{RQB zz~2NiXDz|Bp?0dSS*kEAcd&+0j(#yM)P8VclRNW$RwdKi;syT1p>gWz-{i+x1(Ls@ z5t#o~oIuttXGAqpQ9&QN)}V`w*HM89u!~}^5C6%ug7SB|OLr{5_N%I<5jNAtAL3ZB z$IJCW+$dI(CR-PYeDjxmG)KJR8puRyBkVX#uH;DiONBdDT73z$0s5vD6fvunj+m1> zv6&h~1p=xl%ft?nxW<0y8RFcAnOqJIKRQ*hcFCYd5)A>pz^U={PdXro^euhPLzkx6?oz0!aLn^g3ZV_9CL3Rz8mZj^kj z+pofVR3jR@UQ{uX22lR0wvml+X7=-P_LlC)M~drPKP(Iy6G_q4t1PBu;H?C5rll1L zjHpyDq9of_QOFK{76xWfbj-m$ZZRZQ0Iool#XGSZbDqbec5o6UeFrUT5f#W(mIEIp z1+KM)eKh{9Sv^!mB9?#anv{Yz5{0aXWof$m~>xR1rnO19! z32WG!U~#JEGUK%>Ab+-^G%=CHaasB6fQWC;300l}bnEeM%v%XlyhAm7Ate+}HXB`2 zoSUFA9?lKZmbU)wJ}S5EQf2)0u1uSz0bQ@twzuP7I=S?k6scG9 zW0yCX(zZ7n^ARcqdv`tg8N4qDNiAGDe6P5hFDr{`8tP(0U>)VeHDIJ@YSvyS!q2Ba zcp`+!z@rciBm1hhm2v|qPS;KQw0bw+uMYu#?PIgnW6DOCSLsC2@L~Ab8X__ph4c>p zo<5&mx~pXQi==-onm&ap&u>LiUyDMa1|{K01(pSkJf>b;>85p)cILq_!y&ilphI=_ z*4~+&pW!{eY=6N?7NXKBg1S#OR+v_+@Q}1!Wke||%3-sIVu(zgov~0bS_aj_Fu)X* z^#ANbvJlIP`P(R>m2|r>W6M^oTv?XSmMFxhN6sW;$QkxGyVU$0b|H<-dnddx4%G^q zOXg*Q>;uCq&({DMsr2o`(%wbtTk{%_N0OC0CQjz`ekuE!Zy*|lfg-UVMJ|Q{(?ykn zv}sa_h#kRzsKkSYxlJ0tK@lct$3cwDO52#TI`%Yr50wGWnDB0{X%=J3UrG8EDuqjoC1+S5~x59gbGL;N4$JT5i{#^!#n zE;b~;1<6T%!LBgBXmtpROCZXj5BL+u)PxmK^PHt-?(9=#k%yAGs}pJ8z1Nk->VfNi zH%TjT^;J$L{*y!hecCJ|Z=J8ZVuAi$58`?WdSwC=*IoogIBV$0!QXSK`wy;uqEc(* z%sq159VVzhgMSia6a zj@Vx@L;G%3l!Q-pYOi!mF%}R!47J%6I$Q73%|&gVL#SvY*569xhKS zzq(|KJNj9t_$6JY4L=RPrmokAwM5}9w;JL_JYFhQ{B(O+{-&m5ZWx)z%q4419Et`A zx9AB8zgr3LgQ?+$L$XZUEr*b@+;y+0zy`qx#dHQR}e*T0OmHUpMkD(Vqa$7f> z!Rr}1Cz-+i=clK3i5MlnA6mFXFou{cbZT|>+<2VdNU-dZX z^Mc)G%|fwCZu%4%ClTtEh^HU#aI;&j@1a6dVmCBM^Vf2n$5;3!8x+W^<*5%t6BA(0 zWnVj*fTtJmOmo&RZk~3BjvwKYFPgX<_8@iNPnulc8*XLfY;zXR?cPr?qxroten$BV zgp*O<@;6A00}XkWu4lZ@z;D?;gpnk87&3BlUpAaq&Dhj5G`5p|bxxk0;fE0M4FA^_ z_CCWfG~5Lib*dc?3456g9xwQ)aqJ$>)Wh@k##33XmfPp^dwOHpWNE^|F(sxtYm<9& z#Id186#Mn2g*8hSP9;c=*wO*`Ok;-!SG_F}kMr5q%>Ls@h;Z;b0OZ{vzn+Awkff!V zp~;x*Wag!IJDJ0>sOe7iWl}^|zY!Rxc%c?|y#LzPIp7_2+xXI_(*VyCK>X#{(1oy{ z!K{fj-W7p_bV_}c<)$}9%q^ok09zI9>u@(wb>?@R`sCEqKVOcu5h-Cp%P9eLLzS?K zt%8QM=`(*v;cGK$x3-idHsl9WmP)ADTCOxhod(1qUa;s^i}WPXOg;#lUNkPDh{POY z+G3q54D##a<-W_uvhCGr_9ySXM$&%~VswDpaSROXM%j1O)Ma^42Ye~F9bYg$)=ro7 zM-ciQ7Z5PxN}>wo4M&q?lt}Y%P%_*EW70<=Sn_AHJv9Xg@G!;x=4Q}1r(Cv^z^8&_ z$s2y(`#vTWhz`=V6u}RX*iR3Fz~0)Pl9r*DN?{g{aFZm7@JRF(Yrftf-!|x(&Fs zO|a~nT<2K^2?$dp@3{rTllIn+et3OdV(LoOKY+SdE$eGIT{LIcv|6tXvi05vZcy)7 zv=XRFdjDX4jKuy3Hd_@Q$f8n7_QoX~{!)zSmslc^6G9L_d^3k0bK5fY&LZ%5Dea`z)?K}>n@sJ?YD1GLp9#}wm7 zzC1vxdPkZ~P*$@XskPc$LR=(eF4O9(rC+3+?u^^ubhoI0g_u%1d3*r^k`HGaV^sXt zuzasO6)yx$|8-uFKJEwL$o{&MU5ermsy9yz9za0rn{4f(Cs&JssP z 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 )* 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

    (WeizCYpHpfVkJi_C0(PAcHzP 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

      A1V@dvp=pev>cb@IoO%w5-W(!%?lB z_*ND!xU1jq<9QxMnQ{L7IeOj2Szu6}mrcW2kmoLhx-9Bhz?r)?Jlcf-aI(@r9^Oi|IYWF1c!%*^2(D0jyljfbQwYwX^=%BwHCWce@&$@3`-y)MJi zn7T6T+qajE3l}MdV^(^74qvqoJY1Vi_2*MCb$yPQ(S8(6oI>rA3RKirXyA_se00000NkvXXu0mjf D9Oeu2 literal 0 HcmV?d00001 diff --git a/js/src/dapps/signaturereg/parity.js b/js/src/dapps/signaturereg/parity.js new file mode 100644 index 00000000000..f6d59f44d57 --- /dev/null +++ b/js/src/dapps/signaturereg/parity.js @@ -0,0 +1,21 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const { api } = window.parity; + +export { + api +}; diff --git a/js/src/dapps/signaturereg/services.js b/js/src/dapps/signaturereg/services.js new file mode 100644 index 00000000000..9808dd6a7d1 --- /dev/null +++ b/js/src/dapps/signaturereg/services.js @@ -0,0 +1,175 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import * as abis from '../../json'; +import { api } from './parity'; + +const sortEvents = (a, b) => b.blockNumber.cmp(a.blockNumber) || b.logIndex.cmp(a.logIndex); + +const logToEvent = (log) => { + const key = api.util.sha3(JSON.stringify(log)); + const { blockNumber, logIndex, transactionHash, transactionIndex, params, type } = log; + + return { + type: log.event, + state: type, + blockNumber, + logIndex, + transactionHash, + transactionIndex, + params, + key + }; +}; + +export function attachInterface (callback) { + return api.ethcore + .registryAddress() + .then((registryAddress) => { + console.log(`the registry was found at ${registryAddress}`); + + const registry = api.newContract(abis.registry, registryAddress).instance; + + return Promise + .all([ + registry.getAddress.call({}, [api.util.sha3('signaturereg'), 'A']), + api.personal.listAccounts(), + api.personal.accountsInfo() + ]); + }) + .then(([address, addresses, infos]) => { + console.log(`signaturereg was found at ${address}`); + address = '0x2b7E4db4AD1B3D550Ac6111C122EE9cf65c14AcB'; + + const contract = api.newContract(abis.signaturereg, address); + + return { + address, + contract, + instance: contract.instance, + accounts: addresses.reduce((accounts, address) => { + const info = infos[address]; + + accounts[address] = { + address, + name: info.name || 'Unnamed', + uuid: info.uuid + }; + return accounts; + }, {}) + }; + }) + .catch((error) => { + console.error('attachInterface', error); + }); +} + +export function attachBlockNumber (instance, callback) { + return api.subscribe('eth_blockNumber', (error, blockNumber) => { + if (error) { + console.error('blockNumber', error); + return; + } + + instance.totalSignatures + .call() + .then((totalSignatures) => { + callback({ + blockNumber, + totalSignatures + }); + }) + .catch((error) => { + console.error('totalSignatures', error); + }); + }); +} + +export function attachEvents (contract, callback) { + const blocks = { '0': {} }; + let mined = []; + let pending = []; + let events = []; + + const options = { + fromBlock: 0, + toBlock: 'pending', + limit: 50 + }; + + return contract.subscribe('Registered', options, (error, _logs) => { + if (error) { + console.error('events', error); + return; + } + + if (_logs.length) { + const logs = _logs.map(logToEvent); + + mined = logs + .filter((log) => log.state === 'mined') + .map((log) => { + const blockNumber = log.blockNumber.toString(); + + if (!blocks[blockNumber]) { + blocks[blockNumber] = {}; + getBlock(blockNumber).then((block) => { + Object.assign(blocks[blockNumber], block); + }); + } + + return Object.assign(log, { block: blocks[blockNumber] }); + }) + .reverse() + .concat(mined) + .sort(sortEvents); + + pending = logs + .filter((log) => log.state === 'pending') + .reverse() + .concat(pending.filter((event) => { + return !logs.find((log) => { + const isMined = (log.state === 'mined') && (log.transactionHash === event.transactionHash); + const isPending = (log.state === 'pending') && (log.key === event.key); + + return isMined || isPending; + }); + })) + .sort(sortEvents); + + events = pending.concat(mined); + } + + callback({ events }); + }); +} + +export function getBlock (blockNumber) { + return api.eth.getBlockByNumber(blockNumber); +} + +export function callRegister (instance, id, options = {}) { + return instance.register.call(options, [id]); +} + +export function postRegister (instance, id, options = {}) { + return instance.register + .estimateGas(options, [id]) + .then((gas) => { + options.gas = gas.mul(1.2).toFixed(0); + instance.register.postTransaction(options, [id]); + }); +} From f0ed0c5d25a67edf1bf79af1294fbae9ca4f4d20 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 25 Sep 2016 02:09:18 +0200 Subject: [PATCH 0783/1062] styling updates --- .../signaturereg/Application/application.css | 5 +++++ .../signaturereg/Application/application.js | 2 +- js/src/dapps/signaturereg/Events/events.css | 9 +++++++++ js/src/dapps/signaturereg/Header/header.css | 20 ++++++++++++++----- js/src/dapps/signaturereg/Header/header.js | 3 +++ js/src/dapps/signaturereg/Import/import.js | 4 ++-- 6 files changed, 35 insertions(+), 8 deletions(-) diff --git a/js/src/dapps/signaturereg/Application/application.css b/js/src/dapps/signaturereg/Application/application.css index 4675b064e08..fd233afda73 100644 --- a/js/src/dapps/signaturereg/Application/application.css +++ b/js/src/dapps/signaturereg/Application/application.css @@ -27,3 +27,8 @@ top: 1.5em; right: 1.5em; } + +.buttoninversse { + color: #f80; + background: white; +} diff --git a/js/src/dapps/signaturereg/Application/application.js b/js/src/dapps/signaturereg/Application/application.js index ac292b6d881..f23290ec64c 100644 --- a/js/src/dapps/signaturereg/Application/application.js +++ b/js/src/dapps/signaturereg/Application/application.js @@ -97,7 +97,7 @@ export default class Application extends Component { return (
      - +
      ); } diff --git a/js/src/dapps/signaturereg/Events/events.css b/js/src/dapps/signaturereg/Events/events.css index 4a0d272aa29..d788f202730 100644 --- a/js/src/dapps/signaturereg/Events/events.css +++ b/js/src/dapps/signaturereg/Events/events.css @@ -19,6 +19,15 @@ padding: 3em; } +.header { + font-size: 1.3em; + line-height: 1.3em; + vertical-align: middle; + text-align: center; + padding-bottom: 24px; + color: #f80; +} + .events table { width: 100%; border: none; diff --git a/js/src/dapps/signaturereg/Header/header.css b/js/src/dapps/signaturereg/Header/header.css index add245dccde..3cc36a3cff7 100644 --- a/js/src/dapps/signaturereg/Header/header.css +++ b/js/src/dapps/signaturereg/Header/header.css @@ -18,11 +18,23 @@ .header { position: relative; height: 13.69em; - color: #eee; - border-bottom: 4px solid #f80; + color: white; + border-bottom: 4px solid white; overflow: hidden; } +.banner { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + font-size: 1.3em; + line-height: 1.3em; + padding: 24px; + background: #f80; +} + .header img, .content { position: absolute; @@ -33,14 +45,13 @@ } .header img { - opacity: 0.15; + opacity: 0.25; width: 100%; } .content { text-align: center; padding: 3em; - color: #f80; } .hero { @@ -53,5 +64,4 @@ font-size: 1.3em; line-height: 1.3em; vertical-align: middle; - opacity: 0.5; } diff --git a/js/src/dapps/signaturereg/Header/header.js b/js/src/dapps/signaturereg/Header/header.js index e70350e6914..7087e4237ff 100644 --- a/js/src/dapps/signaturereg/Header/header.js +++ b/js/src/dapps/signaturereg/Header/header.js @@ -30,6 +30,9 @@ export default class Header extends Component { return (
      +
      + contract signature registry +
      diff --git a/js/src/dapps/signaturereg/Import/import.js b/js/src/dapps/signaturereg/Import/import.js index a552283c0f5..d15c37c8af2 100644 --- a/js/src/dapps/signaturereg/Import/import.js +++ b/js/src/dapps/signaturereg/Import/import.js @@ -53,7 +53,7 @@ export default class Import extends Component {
      -
      ABI Import
      +
      abi import
      { abiError ? this.renderCapture() : this.renderRegister() } @@ -61,7 +61,7 @@ export default class Import extends Component {
      to register
      already registered
      constant, skip
      - +
      From 35969bbe6664888c4660a79f734c7fbb5d32c900 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 25 Sep 2016 11:37:08 +0200 Subject: [PATCH 0784/1062] visual updates --- js/src/dapps/signaturereg/Events/events.css | 20 ++++++- js/src/dapps/signaturereg/Events/events.js | 6 +- js/src/dapps/signaturereg/Header/header.css | 2 +- js/src/dapps/signaturereg/Import/import.css | 28 ++++----- js/src/dapps/signaturereg/Import/import.js | 65 ++++++++++++++------- js/src/dapps/signaturereg/format.js | 2 +- 6 files changed, 79 insertions(+), 44 deletions(-) diff --git a/js/src/dapps/signaturereg/Events/events.css b/js/src/dapps/signaturereg/Events/events.css index d788f202730..7a7976a8097 100644 --- a/js/src/dapps/signaturereg/Events/events.css +++ b/js/src/dapps/signaturereg/Events/events.css @@ -17,6 +17,7 @@ .events { padding: 3em; + text-align: center; } .header { @@ -29,12 +30,15 @@ } .events table { - width: 100%; border: none; + margin: 0 auto; + border-collapse: collapse; } .events td { - padding: 0.25em; + padding: 0 0.5em 0.618em 0.5em; + white-space: nowrap; + text-align: left; } .pending { @@ -48,6 +52,18 @@ color: #f80; } +.left { + text-align: left; +} + .right { text-align: right; } + +.center { + text-align: center; +} + +td.ellipsis { + text-overflow: ellipsis; +} diff --git a/js/src/dapps/signaturereg/Events/events.js b/js/src/dapps/signaturereg/Events/events.js index c97866ce813..dc44729ebeb 100644 --- a/js/src/dapps/signaturereg/Events/events.js +++ b/js/src/dapps/signaturereg/Events/events.js @@ -62,10 +62,10 @@ export default class Events extends Component { return events.map((event) => { return ( - { formatBlockNumber(event.blockNumber) } { formatBlockTimestamp(event.block) } - { event.params.owner } - { formatSignature(event.params.signature) } + { formatBlockNumber(event.blockNumber) } + { event.params.owner } + { formatSignature(event.params.signature) } { event.params.method } ); diff --git a/js/src/dapps/signaturereg/Header/header.css b/js/src/dapps/signaturereg/Header/header.css index 3cc36a3cff7..8d95b959c2a 100644 --- a/js/src/dapps/signaturereg/Header/header.css +++ b/js/src/dapps/signaturereg/Header/header.css @@ -45,7 +45,7 @@ } .header img { - opacity: 0.25; + opacity: 0.2; width: 100%; } diff --git a/js/src/dapps/signaturereg/Import/import.css b/js/src/dapps/signaturereg/Import/import.css index 4403083d811..ba0133f9365 100644 --- a/js/src/dapps/signaturereg/Import/import.css +++ b/js/src/dapps/signaturereg/Import/import.css @@ -30,15 +30,15 @@ bottom: 0; left: 0; background: rgba(55, 55, 55, 0.75); + text-align: center; } .dialog { - position: absolute; - top: 1.5em; - right: 1.5em; + margin-top: 1.5em; border-radius: 5px; - width: 650px; + width: 750px; background: rgba(0, 0, 0, 0.9); + display: inline-block; } .close { @@ -109,10 +109,6 @@ padding: 4px 0; } -.keys div { - font-size: 0.75em; -} - .fnconstant, .fnexists, .fnunknown, @@ -123,27 +119,25 @@ border-radius: 2px; color: white; line-height: 1em; -} - -.fnconstant, -.fnexists { - opacity: 0.5; + font-size: 0.8em; } .fnconstant { - background: #aaa; + color: #888; + background: #333; } .fnexists { - background: #964; + color: #f80; + background: #333; } .fnunknown { - background: #000; + color: #eee; } .fntodo { - background: #494; + background: #f80; } .hide { diff --git a/js/src/dapps/signaturereg/Import/import.js b/js/src/dapps/signaturereg/Import/import.js index d15c37c8af2..9db8c64fa65 100644 --- a/js/src/dapps/signaturereg/Import/import.js +++ b/js/src/dapps/signaturereg/Import/import.js @@ -34,7 +34,7 @@ export default class Import extends Component { abi: null, abiParsed: null, abiError: 'Please add a valid ABI definition', - abiMapped: null, + functions: null, fnstate: {} } @@ -50,18 +50,19 @@ export default class Import extends Component { return (
      -
      -
      -
      -
      abi import
      - -
      - { abiError ? this.renderCapture() : this.renderRegister() } -
      -
      -
      to register
      already registered
      constant, skip
      +
      +
      +
      +
      abi import
      + +
      + { abiError ? this.renderCapture() : this.renderRegister() } +
      +
      +
      to register
      already registered
      constant, skip
      +
      +
      -
      @@ -97,14 +98,21 @@ export default class Import extends Component { { this.renderFunctions() }
      +
      + { this.countFunctions() || 'no' } functions available for registration +
      ); } renderFunctions () { - const { abiMapped, fnstate } = this.state; + const { functions, fnstate } = this.state; - return abiMapped.functions.map((fn) => { + if (!functions) { + return null; + } + + return functions.map((fn) => { if (fn.constant) { fnstate[fn.signature] = 'fnconstant'; } else if (!fnstate[fn.signature]) { @@ -119,13 +127,28 @@ export default class Import extends Component { }); } + sortFunctions = (a, b) => { + return a.name.localeCompare(b.name); + } + + countFunctions () { + const { functions, fnstate } = this.state; + + if (!functions) { + return 0; + } + + return functions.reduce((count, fn) => { + return count + (fnstate[fn.signature] === 'fntodo' ? 1 : 0); + }, 0); + } + testFunction (fn) { const { instance } = this.props; const { fnstate } = this.state; callRegister(instance, fn.id) .then((result) => { - console.log(fn.id, result); fnstate[fn.signature] = result ? 'fntodo' : 'fnexists'; this.setState(fnstate); }) @@ -135,22 +158,24 @@ export default class Import extends Component { } onAbiEdit = (event) => { - let abiMapped = null; + let functions = null; let abiError = null; let abiParsed = null; let abi = null; try { abiParsed = JSON.parse(event.target.value); - abiMapped = api.newContract(abiParsed); + functions = api.newContract(abiParsed).functions.sort(this.sortFunctions); abi = JSON.stringify(abiParsed); } catch (error) { console.error('onAbiEdit', error); abiError = error.message; } + console.log(functions); + this.setState({ - abiMapped, + functions, abiError, abiParsed, abi @@ -159,12 +184,12 @@ export default class Import extends Component { onRegister = () => { const { accounts, instance, onClose } = this.props; - const { abiMapped, fnstate } = this.state; + const { functions, fnstate } = this.state; const address = Object.keys(accounts)[0]; Promise .all( - abiMapped.functions + functions .filter((fn) => !fn.constant) .filter((fn) => fnstate[fn.signature] === 'fntodo') .filter((fn, index) => index === 0) diff --git a/js/src/dapps/signaturereg/format.js b/js/src/dapps/signaturereg/format.js index 24ab3ed8f06..24b6428f48d 100644 --- a/js/src/dapps/signaturereg/format.js +++ b/js/src/dapps/signaturereg/format.js @@ -24,7 +24,7 @@ const ZERO = new BigNumber(0); export function formatBlockNumber (blockNumber) { return ZERO.eq(blockNumber || 0) ? 'Pending' - : `#${blockNumber.toFormat()}`; + : `${blockNumber.toFormat()}`; } export function formatSignature (signature) { From f06c2ef389805b15a9929878ffd4699ecebfbd3e Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 25 Sep 2016 11:45:48 +0200 Subject: [PATCH 0785/1062] fix merge issues --- js/src/abi/spec/function.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/js/src/abi/spec/function.js b/js/src/abi/spec/function.js index ed8eb322abe..a4cfdf2f1d0 100644 --- a/js/src/abi/spec/function.js +++ b/js/src/abi/spec/function.js @@ -40,13 +40,12 @@ export default class Func { return this._name; } -<<<<<<< HEAD get id () { return this._id; -======= + } + get payable () { return this._payable; ->>>>>>> js } get inputs () { From eaf81f7744016d68da41c9931f43234ef93c839a Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 25 Sep 2016 11:49:21 +0200 Subject: [PATCH 0786/1062] add missing gpl headers (non-related) --- .../dapps/gavcoin/IdentityIcon/identityIcon.css | 17 +++++++++++++++++ .../dapps/gavcoin/IdentityIcon/identityIcon.js | 16 ++++++++++++++++ js/src/dapps/gavcoin/IdentityIcon/index.js | 16 ++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/js/src/dapps/gavcoin/IdentityIcon/identityIcon.css b/js/src/dapps/gavcoin/IdentityIcon/identityIcon.css index b2795dff158..2b645d8239b 100644 --- a/js/src/dapps/gavcoin/IdentityIcon/identityIcon.css +++ b/js/src/dapps/gavcoin/IdentityIcon/identityIcon.css @@ -1,3 +1,20 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + .icon { width: 32px; height: 32px; diff --git a/js/src/dapps/gavcoin/IdentityIcon/identityIcon.js b/js/src/dapps/gavcoin/IdentityIcon/identityIcon.js index 81c7abcd737..51f48d46ab3 100644 --- a/js/src/dapps/gavcoin/IdentityIcon/identityIcon.js +++ b/js/src/dapps/gavcoin/IdentityIcon/identityIcon.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { api } from '../parity'; diff --git a/js/src/dapps/gavcoin/IdentityIcon/index.js b/js/src/dapps/gavcoin/IdentityIcon/index.js index 51b592d3146..76c107bfb75 100644 --- a/js/src/dapps/gavcoin/IdentityIcon/index.js +++ b/js/src/dapps/gavcoin/IdentityIcon/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './identityIcon'; From 98e782d4992654907594b9fb5e869ab11cbc2875 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 25 Sep 2016 12:29:10 +0200 Subject: [PATCH 0787/1062] adjust display, expand account names --- .../signaturereg/Application/application.js | 4 ++- js/src/dapps/signaturereg/Events/events.css | 21 +++++++---- js/src/dapps/signaturereg/Events/events.js | 20 ++++++++--- .../IdentityIcon/identityIcon.css | 23 ++++++++++++ .../signaturereg/IdentityIcon/identityIcon.js | 36 +++++++++++++++++++ .../dapps/signaturereg/IdentityIcon/index.js | 17 +++++++++ js/src/dapps/signaturereg/Import/import.css | 6 ++-- js/src/dapps/signaturereg/Import/import.js | 15 ++++---- js/src/dapps/signaturereg/services.js | 29 ++++++++------- js/src/json/signaturereg.json | 2 +- 10 files changed, 135 insertions(+), 38 deletions(-) create mode 100644 js/src/dapps/signaturereg/IdentityIcon/identityIcon.css create mode 100644 js/src/dapps/signaturereg/IdentityIcon/identityIcon.js create mode 100644 js/src/dapps/signaturereg/IdentityIcon/index.js diff --git a/js/src/dapps/signaturereg/Application/application.js b/js/src/dapps/signaturereg/Application/application.js index f23290ec64c..1cb643cb43e 100644 --- a/js/src/dapps/signaturereg/Application/application.js +++ b/js/src/dapps/signaturereg/Application/application.js @@ -30,6 +30,7 @@ export default class Application extends Component { state = { accounts: {}, address: null, + accountsInfo: {}, blockNumber: new BigNumber(0), contract: null, instance: null, @@ -103,10 +104,11 @@ export default class Application extends Component { } renderEvents () { - const { contract } = this.state; + const { accountsInfo, contract } = this.state; return ( ); } diff --git a/js/src/dapps/signaturereg/Events/events.css b/js/src/dapps/signaturereg/Events/events.css index 7a7976a8097..5e9960e0eed 100644 --- a/js/src/dapps/signaturereg/Events/events.css +++ b/js/src/dapps/signaturereg/Events/events.css @@ -36,9 +36,15 @@ } .events td { - padding: 0 0.5em 0.618em 0.5em; + padding: 0 0.5em 0.5em 0.5em; white-space: nowrap; text-align: left; + line-height: 24px; +} + +.events td * { + display: inline-block; + vertical-align: top; } .pending { @@ -48,22 +54,23 @@ .mined { } -.highlight { +td.methodName { color: #f80; } -.left { - text-align: left; +td.signature { + color: #888; + text-align: right; } -.right { +td.timestamp { text-align: right; } -.center { +td.blockNumber { text-align: center; } -td.ellipsis { +td.owner { text-overflow: ellipsis; } diff --git a/js/src/dapps/signaturereg/Events/events.js b/js/src/dapps/signaturereg/Events/events.js index dc44729ebeb..9f5565ce577 100644 --- a/js/src/dapps/signaturereg/Events/events.js +++ b/js/src/dapps/signaturereg/Events/events.js @@ -18,11 +18,13 @@ import React, { Component, PropTypes } from 'react'; import { formatBlockNumber, formatBlockTimestamp, formatSignature } from '../format'; import { attachEvents } from '../services'; +import IdentityIcon from '../IdentityIcon'; import styles from './events.css'; export default class Events extends Component { static propTypes = { + accountsInfo: PropTypes.object.isRequired, contract: PropTypes.object.isRequired } @@ -57,16 +59,24 @@ export default class Events extends Component { } renderEvents () { + const { accountsInfo } = this.props; const { events } = this.state; return events.map((event) => { + const name = accountsInfo[event.params.owner] + ? accountsInfo[event.params.owner].name + : event.params.owver; + return ( - { formatBlockTimestamp(event.block) } - { formatBlockNumber(event.blockNumber) } - { event.params.owner } - { formatSignature(event.params.signature) } - { event.params.method } + { formatBlockTimestamp(event.block) } + { formatBlockNumber(event.blockNumber) } + + +
      { name }
      + + { formatSignature(event.params.signature) } + { event.params.method } ); }); diff --git a/js/src/dapps/signaturereg/IdentityIcon/identityIcon.css b/js/src/dapps/signaturereg/IdentityIcon/identityIcon.css new file mode 100644 index 00000000000..3fa1df99e4d --- /dev/null +++ b/js/src/dapps/signaturereg/IdentityIcon/identityIcon.css @@ -0,0 +1,23 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.icon { + width: 24px; + height: 24px; + border-radius: 50%; + margin-right: 0.5em; +} diff --git a/js/src/dapps/signaturereg/IdentityIcon/identityIcon.js b/js/src/dapps/signaturereg/IdentityIcon/identityIcon.js new file mode 100644 index 00000000000..0bc86731d45 --- /dev/null +++ b/js/src/dapps/signaturereg/IdentityIcon/identityIcon.js @@ -0,0 +1,36 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import { api } from '../parity'; +import styles from './identityIcon.css'; + +export default class IdentityIcon extends Component { + static propTypes = { + address: PropTypes.string.isRequired + } + + render () { + const { address } = this.props; + + return ( + + ); + } +} diff --git a/js/src/dapps/signaturereg/IdentityIcon/index.js b/js/src/dapps/signaturereg/IdentityIcon/index.js new file mode 100644 index 00000000000..76c107bfb75 --- /dev/null +++ b/js/src/dapps/signaturereg/IdentityIcon/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './identityIcon'; diff --git a/js/src/dapps/signaturereg/Import/import.css b/js/src/dapps/signaturereg/Import/import.css index ba0133f9365..8e1ec1193ef 100644 --- a/js/src/dapps/signaturereg/Import/import.css +++ b/js/src/dapps/signaturereg/Import/import.css @@ -97,9 +97,9 @@ .buttonrow { position: relative; - padding: 16px 24px; - border-top: 4px solid #f80; - text-align: right; + padding: 24px 0; + margin: 0; + text-align: right !important; } .keys { diff --git a/js/src/dapps/signaturereg/Import/import.js b/js/src/dapps/signaturereg/Import/import.js index 9db8c64fa65..ccabcfd086f 100644 --- a/js/src/dapps/signaturereg/Import/import.js +++ b/js/src/dapps/signaturereg/Import/import.js @@ -46,8 +46,6 @@ export default class Import extends Component { return null; } - const count = Object.values(fnstate).filter((style) => style === 'fntodo').length; - return (
      @@ -57,12 +55,6 @@ export default class Import extends Component {
      { abiError ? this.renderCapture() : this.renderRegister() } -
      -
      -
      to register
      already registered
      constant, skip
      -
      - -
      @@ -88,6 +80,12 @@ export default class Import extends Component { } renderRegister () { + const { fnstate } = this.state; + + const buttons = Object.values(fnstate).filter((style) => style === 'fntodo').length + ?
      + : null; + return (
      @@ -101,6 +99,7 @@ export default class Import extends Component {
      { this.countFunctions() || 'no' } functions available for registration
      + { buttons }
      ); } diff --git a/js/src/dapps/signaturereg/services.js b/js/src/dapps/signaturereg/services.js index 9808dd6a7d1..4f0b30d5641 100644 --- a/js/src/dapps/signaturereg/services.js +++ b/js/src/dapps/signaturereg/services.js @@ -50,26 +50,29 @@ export function attachInterface (callback) { api.personal.accountsInfo() ]); }) - .then(([address, addresses, infos]) => { + .then(([address, addresses, accountsInfo]) => { console.log(`signaturereg was found at ${address}`); - address = '0x2b7E4db4AD1B3D550Ac6111C122EE9cf65c14AcB'; + address = '0xD1888764222dbE5BBa54F0cf9d493e43aba667Fb'; const contract = api.newContract(abis.signaturereg, address); + const accounts = addresses.reduce((obj, address) => { + const info = accountsInfo[address]; - return { - address, - contract, - instance: contract.instance, - accounts: addresses.reduce((accounts, address) => { - const info = infos[address]; - - accounts[address] = { + return Object.assign(obj, { + [address]: { address, name: info.name || 'Unnamed', uuid: info.uuid - }; - return accounts; - }, {}) + } + }); + }, {}); + + return { + accounts, + address, + accountsInfo, + contract, + instance: contract.instance }; }) .catch((error) => { diff --git a/js/src/json/signaturereg.json b/js/src/json/signaturereg.json index e97ca5ecda4..ce1bce10f9e 100644 --- a/js/src/json/signaturereg.json +++ b/js/src/json/signaturereg.json @@ -121,7 +121,7 @@ "type": "address" }, { - "indexed": false, + "indexed": true, "name": "signature", "type": "bytes4" }, From a09b07bd0fb7171eac6602982c743316f176323a Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 25 Sep 2016 12:55:40 +0200 Subject: [PATCH 0788/1062] remove debug log --- js/src/ui/Theme/theme.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/js/src/ui/Theme/theme.js b/js/src/ui/Theme/theme.js index cfb4f986524..92a57487ca1 100644 --- a/js/src/ui/Theme/theme.js +++ b/js/src/ui/Theme/theme.js @@ -38,8 +38,6 @@ muiTheme.textField.disabledTextColor = muiTheme.textField.textColor; muiTheme.toolbar = lightTheme.toolbar; muiTheme.toolbar.backgroundColor = 'transparent'; -console.log(muiTheme.textField); - const imageCache = {}; muiTheme.parity = { From 6b4b7a6664f32bd1f0ab7fad25d92916ad5f4866 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 25 Sep 2016 12:56:03 +0200 Subject: [PATCH 0789/1062] cleanup log filtering (pending vs. mined) --- js/src/dapps/signaturereg/services.js | 61 ++++++++++++--------------- 1 file changed, 28 insertions(+), 33 deletions(-) diff --git a/js/src/dapps/signaturereg/services.js b/js/src/dapps/signaturereg/services.js index 4f0b30d5641..a86c7809a5c 100644 --- a/js/src/dapps/signaturereg/services.js +++ b/js/src/dapps/signaturereg/services.js @@ -119,42 +119,37 @@ export function attachEvents (contract, callback) { return; } - if (_logs.length) { - const logs = _logs.map(logToEvent); - - mined = logs - .filter((log) => log.state === 'mined') - .map((log) => { - const blockNumber = log.blockNumber.toString(); - - if (!blocks[blockNumber]) { - blocks[blockNumber] = {}; - getBlock(blockNumber).then((block) => { - Object.assign(blocks[blockNumber], block); - }); - } + const logs = _logs.map(logToEvent); + + mined = logs + .filter((log) => log.state === 'mined') + .map((log) => { + const blockNumber = log.blockNumber.toString(); - return Object.assign(log, { block: blocks[blockNumber] }); - }) - .reverse() - .concat(mined) - .sort(sortEvents); - - pending = logs - .filter((log) => log.state === 'pending') - .reverse() - .concat(pending.filter((event) => { - return !logs.find((log) => { - const isMined = (log.state === 'mined') && (log.transactionHash === event.transactionHash); - const isPending = (log.state === 'pending') && (log.key === event.key); - - return isMined || isPending; + if (!blocks[blockNumber]) { + blocks[blockNumber] = {}; + getBlock(blockNumber).then((block) => { + Object.assign(blocks[blockNumber], block); }); - })) - .sort(sortEvents); + } - events = pending.concat(mined); - } + return Object.assign(log, { block: blocks[blockNumber] }); + }) + .reverse() + .concat(mined) + .sort(sortEvents); + + pending = logs + .filter((log) => log.state === 'pending') + .reverse() + .filter((event) => !pending.find((log) => log.key === event.key)) + .concat(pending) + .filter((event) => !mined.find((log) => log.transactionHash === event.transactionHash)) + .sort(sortEvents); + + console.log(pending.filter((event) => mined.find((log) => log.transactionHash === event.transactionHash))); + + events = pending.concat(mined); callback({ events }); }); From cefd5293b67f59ce9a3562c80b0019ed1194fc52 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 25 Sep 2016 13:05:33 +0200 Subject: [PATCH 0790/1062] debug info --- js/src/dapps/signaturereg/Import/import.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/js/src/dapps/signaturereg/Import/import.js b/js/src/dapps/signaturereg/Import/import.js index ccabcfd086f..dcd89542f3d 100644 --- a/js/src/dapps/signaturereg/Import/import.js +++ b/js/src/dapps/signaturereg/Import/import.js @@ -171,8 +171,6 @@ export default class Import extends Component { abiError = error.message; } - console.log(functions); - this.setState({ functions, abiError, From 7d7419d99f9a238b5839acc1a108d4466fdc550b Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 25 Sep 2016 13:05:56 +0200 Subject: [PATCH 0791/1062] fix event pending/mined filtering (check for actual method match) --- js/src/dapps/signaturereg/services.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/js/src/dapps/signaturereg/services.js b/js/src/dapps/signaturereg/services.js index a86c7809a5c..aa2a60f98c2 100644 --- a/js/src/dapps/signaturereg/services.js +++ b/js/src/dapps/signaturereg/services.js @@ -142,13 +142,11 @@ export function attachEvents (contract, callback) { pending = logs .filter((log) => log.state === 'pending') .reverse() - .filter((event) => !pending.find((log) => log.key === event.key)) + .filter((event) => !pending.find((log) => log.params.method === event.params.method)) .concat(pending) - .filter((event) => !mined.find((log) => log.transactionHash === event.transactionHash)) + .filter((event) => !mined.find((log) => log.params.method === event.params.method)) .sort(sortEvents); - console.log(pending.filter((event) => mined.find((log) => log.transactionHash === event.transactionHash))); - events = pending.concat(mined); callback({ events }); From 7aa7e077a996d77ee86cb7c5f2178dc238fd2a37 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 25 Sep 2016 13:32:58 +0200 Subject: [PATCH 0792/1062] inverse button styling --- .../signaturereg/Application/application.css | 5 ----- .../signaturereg/Application/application.js | 2 +- js/src/dapps/signaturereg/Button/button.css | 16 +++++++++++++--- js/src/dapps/signaturereg/Button/button.js | 5 +++-- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/js/src/dapps/signaturereg/Application/application.css b/js/src/dapps/signaturereg/Application/application.css index fd233afda73..4675b064e08 100644 --- a/js/src/dapps/signaturereg/Application/application.css +++ b/js/src/dapps/signaturereg/Application/application.css @@ -27,8 +27,3 @@ top: 1.5em; right: 1.5em; } - -.buttoninversse { - color: #f80; - background: white; -} diff --git a/js/src/dapps/signaturereg/Application/application.js b/js/src/dapps/signaturereg/Application/application.js index 1cb643cb43e..b2ceeb07fac 100644 --- a/js/src/dapps/signaturereg/Application/application.js +++ b/js/src/dapps/signaturereg/Application/application.js @@ -98,7 +98,7 @@ export default class Application extends Component { return (
      - +
      ); } diff --git a/js/src/dapps/signaturereg/Button/button.css b/js/src/dapps/signaturereg/Button/button.css index 8abb549a4d7..444359c79ea 100644 --- a/js/src/dapps/signaturereg/Button/button.css +++ b/js/src/dapps/signaturereg/Button/button.css @@ -20,14 +20,24 @@ color: white; border-radius: 5px; font-size: 1em; - line-height: 1em; + line-height: 24px; + height: 24px; padding: 0.75em 1.5em; cursor: pointer; display: inline-block; } .button.disabled { - background: #888; - color: #bbb; + opacity: 0.25; cursor: default; } + +.button.inverse { + color: #f80; + background: white; +} + +.button * { + display: inline-block; + vertical-align: top; +} diff --git a/js/src/dapps/signaturereg/Button/button.js b/js/src/dapps/signaturereg/Button/button.js index e1220b5ccb7..9cbbcf478ee 100644 --- a/js/src/dapps/signaturereg/Button/button.js +++ b/js/src/dapps/signaturereg/Button/button.js @@ -23,12 +23,13 @@ export default class Button extends Component { children: PropTypes.node.isRequired, className: PropTypes.string, disabled: PropTypes.bool, + invert: PropTypes.bool, onClick: PropTypes.func.isRequired } render () { - const { children, className, disabled } = this.props; - const classes = `${styles.button} ${disabled ? styles.disabled : ''} ${className}`; + const { children, className, disabled, invert } = this.props; + const classes = `${styles.button} ${disabled ? styles.disabled : ''} ${invert ? styles.inverse : ''} ${className}`; return (
      From f5a9b5b5962813518e1abbcd7f03a2282949dfd5 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 25 Sep 2016 13:33:15 +0200 Subject: [PATCH 0793/1062] show active address (needs selection) --- js/src/dapps/signaturereg/Import/import.css | 6 ++++ js/src/dapps/signaturereg/Import/import.js | 35 +++++++++++++++------ 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/js/src/dapps/signaturereg/Import/import.css b/js/src/dapps/signaturereg/Import/import.css index 8e1ec1193ef..8f9788c3410 100644 --- a/js/src/dapps/signaturereg/Import/import.css +++ b/js/src/dapps/signaturereg/Import/import.css @@ -102,6 +102,12 @@ text-align: right !important; } +.addressSelect { + position: absolute; + top: 24px; + left: 0; +} + .keys { position: absolute; left: 24px; diff --git a/js/src/dapps/signaturereg/Import/import.js b/js/src/dapps/signaturereg/Import/import.js index dcd89542f3d..cc379a6c923 100644 --- a/js/src/dapps/signaturereg/Import/import.js +++ b/js/src/dapps/signaturereg/Import/import.js @@ -19,6 +19,7 @@ import React, { Component, PropTypes } from 'react'; import { api } from '../parity'; import { callRegister, postRegister } from '../services'; import Button from '../Button'; +import IdentityIcon from '../IdentityIcon'; import styles from './import.css'; @@ -40,7 +41,7 @@ export default class Import extends Component { render () { const { visible, onClose } = this.props; - const { abiError, fnstate } = this.state; + const { abiError } = this.state; if (!visible) { return null; @@ -80,11 +81,27 @@ export default class Import extends Component { } renderRegister () { - const { fnstate } = this.state; - - const buttons = Object.values(fnstate).filter((style) => style === 'fntodo').length - ?
      - : null; + const { accounts } = this.props; + + const account = accounts[Object.keys(accounts)[0]]; + const count = this.countFunctions(); + let buttons = null; + + if (count) { + buttons = ( +
      +
      + +
      + +
      + ); + } return (
      @@ -97,7 +114,7 @@ export default class Import extends Component {
      - { this.countFunctions() || 'no' } functions available for registration + { count || 'no' } functions available for registration
      { buttons }
      @@ -137,9 +154,7 @@ export default class Import extends Component { return 0; } - return functions.reduce((count, fn) => { - return count + (fnstate[fn.signature] === 'fntodo' ? 1 : 0); - }, 0); + return functions.filter((fn) => fnstate[fn.signature] === 'fntodo').length; } testFunction (fn) { From 120ece07db8ca3ab03a3468cf8819d961e23ceae Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 25 Sep 2016 13:48:49 +0200 Subject: [PATCH 0794/1062] allow setting of from account address --- .../signaturereg/Application/application.js | 13 +++++-- js/src/dapps/signaturereg/Import/import.js | 35 ++++++++++++++----- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/js/src/dapps/signaturereg/Application/application.js b/js/src/dapps/signaturereg/Application/application.js index b2ceeb07fac..3878af4cfb1 100644 --- a/js/src/dapps/signaturereg/Application/application.js +++ b/js/src/dapps/signaturereg/Application/application.js @@ -30,6 +30,7 @@ export default class Application extends Component { state = { accounts: {}, address: null, + fromAddress: null, accountsInfo: {}, blockNumber: new BigNumber(0), contract: null, @@ -84,15 +85,17 @@ export default class Application extends Component { } renderImport () { - const { accounts, instance, showImport } = this.state; + const { accounts, fromAddress, instance, showImport } = this.state; if (showImport) { return ( + onClose={ this.toggleImport } + onSetFromAddress={ this.setFromAddress } /> ); } @@ -118,4 +121,10 @@ export default class Application extends Component { showImport: !this.state.showImport }); } + + setFromAddress = (fromAddress) => { + this.setState({ + fromAddress + }); + } } diff --git a/js/src/dapps/signaturereg/Import/import.js b/js/src/dapps/signaturereg/Import/import.js index cc379a6c923..dcf2b3f985c 100644 --- a/js/src/dapps/signaturereg/Import/import.js +++ b/js/src/dapps/signaturereg/Import/import.js @@ -26,9 +26,11 @@ import styles from './import.css'; export default class Import extends Component { static propTypes = { accounts: PropTypes.object.isRequired, + fromAddress: PropTypes.string.isRequired, instance: PropTypes.object.isRequired, visible: PropTypes.bool.isRequired, - onClose: PropTypes.func.isRequired + onClose: PropTypes.func.isRequired, + onSetFromAddress: PropTypes.func.isRequired } state = { @@ -81,9 +83,9 @@ export default class Import extends Component { } renderRegister () { - const { accounts } = this.props; + const { accounts, fromAddress } = this.props; - const account = accounts[Object.keys(accounts)[0]]; + const account = accounts[fromAddress]; const count = this.countFunctions(); let buttons = null; @@ -91,7 +93,7 @@ export default class Import extends Component { buttons = (
      - @@ -195,17 +197,15 @@ export default class Import extends Component { } onRegister = () => { - const { accounts, instance, onClose } = this.props; + const { instance, fromAddress, onClose } = this.props; const { functions, fnstate } = this.state; - const address = Object.keys(accounts)[0]; Promise .all( functions .filter((fn) => !fn.constant) .filter((fn) => fnstate[fn.signature] === 'fntodo') - .filter((fn, index) => index === 0) - .map((fn) => postRegister(instance, fn.id, { from: address })) + .map((fn) => postRegister(instance, fn.id, { from: fromAddress })) ) .then(() => { onClose(); @@ -214,4 +214,23 @@ export default class Import extends Component { console.error('onRegister', error); }); } + + onSelectFromAddress = () => { + const { accounts, fromAddress, onSetFromAddress } = this.props; + const addresses = Object.keys(accounts); + let index = 0; + + addresses.forEach((address, _index) => { + if (address === fromAddress) { + index = _index; + } + }); + + index++; + if (index >= addresses.length) { + index = 0; + } + + onSetFromAddress(addresses[index]); + } } From de929ebf75631827a6d899d4768769c1947b9a8c Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 25 Sep 2016 13:49:05 +0200 Subject: [PATCH 0795/1062] allow setting of fromAccount --- js/src/dapps/signaturereg/services.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/js/src/dapps/signaturereg/services.js b/js/src/dapps/signaturereg/services.js index aa2a60f98c2..87b613747d2 100644 --- a/js/src/dapps/signaturereg/services.js +++ b/js/src/dapps/signaturereg/services.js @@ -66,13 +66,15 @@ export function attachInterface (callback) { } }); }, {}); + const fromAddress = Object.keys(accounts)[0]; return { accounts, address, accountsInfo, contract, - instance: contract.instance + instance: contract.instance, + fromAddress }; }) .catch((error) => { From 1e4a7f2fe98a701400cdf1d58707b41481d74f5c Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 25 Sep 2016 16:20:10 +0200 Subject: [PATCH 0796/1062] functions to allow the decoding of method inputs --- js/src/abi/spec/function.js | 4 ++ js/src/api/util/decode.js | 84 +++++++++++++++++++++++++++ js/src/api/util/decode.spec.js | 101 +++++++++++++++++++++++++++++++++ js/src/api/util/index.js | 4 ++ 4 files changed, 193 insertions(+) create mode 100644 js/src/api/util/decode.js create mode 100644 js/src/api/util/decode.spec.js diff --git a/js/src/abi/spec/function.js b/js/src/abi/spec/function.js index 84448451692..a8f609ec287 100644 --- a/js/src/abi/spec/function.js +++ b/js/src/abi/spec/function.js @@ -65,6 +65,10 @@ export default class Func { return `${this._signature}${Encoder.encode(tokens)}`; } + decodeInput (data) { + return Decoder.decode(this.inputParamTypes(), data); + } + decodeOutput (data) { return Decoder.decode(this.outputParamTypes(), data); } diff --git a/js/src/api/util/decode.js b/js/src/api/util/decode.js new file mode 100644 index 00000000000..06689003ecf --- /dev/null +++ b/js/src/api/util/decode.js @@ -0,0 +1,84 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { isHex } from './types'; + +import Func from '../../abi/spec/function'; + +export function decodeInputData (data) { + if (!isHex(data)) { + throw new Error('Input to decodeInputData should be a hex value'); + } + + if (data.substr(0, 2) === '0x') { + return decodeInputData(data.slice(2)); + } else if (data.length < 8) { + throw new Error('Input to decodeInputData should be method signature + data'); + } + + const signature = data.substr(0, 8); + const paramdata = data.substr(8); + + if (paramdata.length % 64 !== 0) { + throw new Error('Parameter length in decodeInputData not a multiple of 64 characters'); + } + + return { + signature: `0x${signature}`, + paramdata: `0x${paramdata}` + }; +} + +export function decodeMethodInput (methodAbi, paramdata) { + if (!methodAbi) { + throw new Error('decodeMethodInput should receive valid method-specific ABI'); + } else if (!paramdata) { + throw new Error('decodeMethodInput should receive valid parameter input data'); + } else if (!isHex(paramdata)) { + throw new Error('Input to decodeMethodInput should be a hex value'); + } else if (paramdata.substr(0, 2) === '0x') { + return decodeMethodInput(methodAbi, paramdata.slice(2)); + } else if (paramdata.length % 64 !== 0) { + throw new Error('Parameter length in decodeMethodInput not a multiple of 64 characters'); + } + + return new Func(methodAbi).decodeInput(paramdata).map((decoded) => decoded.value); +} + +// takes a method in form name(..., types) and returns the interred abi definition +export function methodToAbi (method) { + const length = method.length; + const typesStart = method.indexOf('('); + const typesEnd = method.indexOf(')'); + + if (typesStart === -1) { + throw new Error(`Missing start ( in call to decodeMethod with ${method}`); + } else if (typesEnd === -1) { + throw new Error(`Missing end ) in call to decodeMethod with ${method}`); + } else if (typesEnd < typesStart) { + throw new Error(`End ) is before start ( in call to decodeMethod with ${method}`); + } else if (typesEnd !== length - 1) { + throw new Error(`Extra characters after end ) in call to decodeMethod with ${method}`); + } + + const name = method.substr(0, typesStart); + const types = method.substr(typesStart + 1, length - (typesStart + 1) - 1).split(','); + const inputs = types.map((type) => { + return { type }; + }); + + return { type: 'function', name, inputs }; +} diff --git a/js/src/api/util/decode.spec.js b/js/src/api/util/decode.spec.js new file mode 100644 index 00000000000..345c4a623c7 --- /dev/null +++ b/js/src/api/util/decode.spec.js @@ -0,0 +1,101 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; +import { decodeInputData, decodeMethodInput, methodToAbi } from './decode'; + +describe('api/util/decode', () => { + const METH = '0x70a08231'; + const ENCO = '0x70a082310000000000000000000000005A5eFF38DA95b0D58b6C616f2699168B480953C9'; + const DATA = '0x0000000000000000000000005A5eFF38DA95b0D58b6C616f2699168B480953C9'; + + describe('decodeInputData', () => { + it('throws on non-hex inputs', () => { + expect(() => decodeInputData('invalid')).to.throw(/should be a hex value/); + }); + + it('throws when invalid signature length', () => { + expect(() => decodeInputData(METH.slice(-6))).to.throw(/should be method signature/); + }); + + it('throws when invalid data length', () => { + expect(() => decodeInputData(`${ENCO.slice(-32)}`)).to.throw(/not a multiple of/); + }); + + it('splits valid inputs properly', () => { + expect(decodeInputData(ENCO)).to.deep.equal({ + signature: METH, + paramdata: DATA + }); + }); + }); + + describe('decodeMethodInput', () => { + it('expects a valid ABI', () => { + expect(() => decodeMethodInput(null, null)).to.throw(/should receive valid method/); + }); + + it('expects valid parameter data', () => { + expect(() => decodeMethodInput({}, null)).to.throw(/should receive valid parameter/); + }); + + it('expect valid hex parameter data', () => { + expect(() => decodeMethodInput({}, 'invalid')).to.throw(/should be a hex value/); + }); + + it('throws on invalid lengths', () => { + expect(() => decodeMethodInput({}, DATA.slice(-32))).to.throw(/not a multiple of/); + }); + + it('correctly decodes valid inputs', () => { + expect(decodeMethodInput({ + type: 'function', + inputs: [ + { type: 'uint' } + ] + }, DATA)).to.deep.equal([ new BigNumber('0x5a5eff38da95b0d58b6c616f2699168b480953c9') ]); + }); + }); + + describe('methodToAbi', () => { + it('throws when no start ( specified', () => { + expect(() => methodToAbi('invalid,uint,bool)')).to.throw(/Missing start \(/); + }); + + it('throws when no end ) specified', () => { + expect(() => methodToAbi('invalid(uint,bool')).to.throw(/Missing end \)/); + }); + + it('throws when end ) is not in the last position', () => { + expect(() => methodToAbi('invalid(uint,bool)2')).to.throw(/Extra characters after end \)/); + }); + + it('throws when start ( is after end )', () => { + expect(() => methodToAbi('invalid)uint,bool(')).to.throw(/End \) is before start \(/); + }); + + it('returns a valid methodabi for a valid method', () => { + expect(methodToAbi('valid(uint,bool)')).to.deep.equals({ + type: 'function', + name: 'valid', + inputs: [ + { type: 'uint' }, + { type: 'bool' } + ] + }); + }); + }); +}); diff --git a/js/src/api/util/index.js b/js/src/api/util/index.js index 725af5d9ae9..ea8967b3bbe 100644 --- a/js/src/api/util/index.js +++ b/js/src/api/util/index.js @@ -15,6 +15,7 @@ // along with Parity. If not, see . import { isAddress as isAddressValid, toChecksumAddress } from '../../abi/util/address'; +import { decodeInputData, decodeMethodInput, methodToAbi } from './decode'; import { bytesToHex } from './format'; import { fromWei, toWei } from './wei'; import { sha3 } from './sha3'; @@ -30,6 +31,9 @@ export default { isString, bytesToHex, createIdentityImg, + decodeInputData, + decodeMethodInput, + methodToAbi, fromWei, toChecksumAddress, toWei, From 7f509eff7b79ddbb969ecd91012bb5ba83138f75 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 25 Sep 2016 16:29:18 +0200 Subject: [PATCH 0797/1062] decodeInputDat to deocdeCallData --- js/src/api/util/decode.js | 10 +++++----- js/src/api/util/decode.spec.js | 12 ++++++------ js/src/api/util/index.js | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/js/src/api/util/decode.js b/js/src/api/util/decode.js index 06689003ecf..607be06f024 100644 --- a/js/src/api/util/decode.js +++ b/js/src/api/util/decode.js @@ -18,22 +18,22 @@ import { isHex } from './types'; import Func from '../../abi/spec/function'; -export function decodeInputData (data) { +export function decodeCallData (data) { if (!isHex(data)) { - throw new Error('Input to decodeInputData should be a hex value'); + throw new Error('Input to decodeCallData should be a hex value'); } if (data.substr(0, 2) === '0x') { - return decodeInputData(data.slice(2)); + return decodeCallData(data.slice(2)); } else if (data.length < 8) { - throw new Error('Input to decodeInputData should be method signature + data'); + throw new Error('Input to decodeCallData should be method signature + data'); } const signature = data.substr(0, 8); const paramdata = data.substr(8); if (paramdata.length % 64 !== 0) { - throw new Error('Parameter length in decodeInputData not a multiple of 64 characters'); + throw new Error('Parameter length in decodeCallData not a multiple of 64 characters'); } return { diff --git a/js/src/api/util/decode.spec.js b/js/src/api/util/decode.spec.js index 345c4a623c7..ed25225841e 100644 --- a/js/src/api/util/decode.spec.js +++ b/js/src/api/util/decode.spec.js @@ -15,28 +15,28 @@ // along with Parity. If not, see . import BigNumber from 'bignumber.js'; -import { decodeInputData, decodeMethodInput, methodToAbi } from './decode'; +import { decodeCallData, decodeMethodInput, methodToAbi } from './decode'; describe('api/util/decode', () => { const METH = '0x70a08231'; const ENCO = '0x70a082310000000000000000000000005A5eFF38DA95b0D58b6C616f2699168B480953C9'; const DATA = '0x0000000000000000000000005A5eFF38DA95b0D58b6C616f2699168B480953C9'; - describe('decodeInputData', () => { + describe('decodeCallData', () => { it('throws on non-hex inputs', () => { - expect(() => decodeInputData('invalid')).to.throw(/should be a hex value/); + expect(() => decodeCallData('invalid')).to.throw(/should be a hex value/); }); it('throws when invalid signature length', () => { - expect(() => decodeInputData(METH.slice(-6))).to.throw(/should be method signature/); + expect(() => decodeCallData(METH.slice(-6))).to.throw(/should be method signature/); }); it('throws when invalid data length', () => { - expect(() => decodeInputData(`${ENCO.slice(-32)}`)).to.throw(/not a multiple of/); + expect(() => decodeCallData(`${ENCO.slice(-32)}`)).to.throw(/not a multiple of/); }); it('splits valid inputs properly', () => { - expect(decodeInputData(ENCO)).to.deep.equal({ + expect(decodeCallData(ENCO)).to.deep.equal({ signature: METH, paramdata: DATA }); diff --git a/js/src/api/util/index.js b/js/src/api/util/index.js index ea8967b3bbe..fb0f79076b7 100644 --- a/js/src/api/util/index.js +++ b/js/src/api/util/index.js @@ -15,7 +15,7 @@ // along with Parity. If not, see . import { isAddress as isAddressValid, toChecksumAddress } from '../../abi/util/address'; -import { decodeInputData, decodeMethodInput, methodToAbi } from './decode'; +import { decodeCallData, decodeMethodInput, methodToAbi } from './decode'; import { bytesToHex } from './format'; import { fromWei, toWei } from './wei'; import { sha3 } from './sha3'; @@ -31,7 +31,7 @@ export default { isString, bytesToHex, createIdentityImg, - decodeInputData, + decodeCallData, decodeMethodInput, methodToAbi, fromWei, From 8fec76c13412b75551d5e963917cfcab1c11a17a Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 25 Sep 2016 18:35:32 +0200 Subject: [PATCH 0798/1062] helpers for contracts, single source --- js/src/contracts/contracts.js | 48 +++++++++++++++++++++ js/src/contracts/index.js | 17 ++++++++ js/src/contracts/registry.js | 71 ++++++++++++++++++++++++++++++++ js/src/contracts/signaturereg.js | 34 +++++++++++++++ js/src/contracts/tokenreg.js | 41 ++++++++++++++++++ 5 files changed, 211 insertions(+) create mode 100644 js/src/contracts/contracts.js create mode 100644 js/src/contracts/index.js create mode 100644 js/src/contracts/registry.js create mode 100644 js/src/contracts/signaturereg.js create mode 100644 js/src/contracts/tokenreg.js diff --git a/js/src/contracts/contracts.js b/js/src/contracts/contracts.js new file mode 100644 index 00000000000..122a21e81e7 --- /dev/null +++ b/js/src/contracts/contracts.js @@ -0,0 +1,48 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import Registry from './registry'; +import SignatureReg from './signaturereg'; +import TokenReg from './tokenreg'; + +let instance = null; + +export default class Contracts { + constructor (api) { + instance = this; + + this._api = api; + this._registry = new Registry(api); + this._signaturereg = new SignatureReg(api, this._registry); + this._tokenreg = new TokenReg(api, this._registry); + } + + get registry () { + return this._registry; + } + + get signatureReg () { + return this._signaturereg; + } + + get tokenReg () { + return this._tokenreg; + } + + static get () { + return instance; + } +} diff --git a/js/src/contracts/index.js b/js/src/contracts/index.js new file mode 100644 index 00000000000..075837ce651 --- /dev/null +++ b/js/src/contracts/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './contracts'; diff --git a/js/src/contracts/registry.js b/js/src/contracts/registry.js new file mode 100644 index 00000000000..52c2b6536c2 --- /dev/null +++ b/js/src/contracts/registry.js @@ -0,0 +1,71 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import * as abis from '../json'; + +export default class Registry { + constructor (api) { + this._api = api; + this._contracts = []; + this._instance = null; + + this.getInstance(); + } + + getInstance () { + return new Promise((resolve, reject) => { + if (this._instance) { + resolve(this._instance); + return; + } + + this._api.ethcore + .registryAddress() + .then((address) => { + this._instance = this._api.newContract(abis.registry, address).instance; + resolve(this.address); + }) + .catch(reject); + }); + } + + getContractInstance (_name) { + const name = _name.toLowerCase(); + + return new Promise((resolve, reject) => { + if (this._services[name]) { + resolve(this._services[name]); + return; + } + + this + .lookupAddress(name) + .then((address) => { + this._contracts[name] = this._api.newContract(abis[name], address).instance; + resolve(this._contracts[name]); + }) + .catch(reject); + }); + } + + lookupAddress (_name) { + const name = _name.toLowerCase(); + + return this.getInstance().then((instance) => { + return instance.getAddress.call({}, [this._api.util.sha3(name), 'A']); + }); + } +} diff --git a/js/src/contracts/signaturereg.js b/js/src/contracts/signaturereg.js new file mode 100644 index 00000000000..a37cf3d9e65 --- /dev/null +++ b/js/src/contracts/signaturereg.js @@ -0,0 +1,34 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default class SignatureReg { + constructor (api, registry) { + this._api = api; + this._registry = registry; + + this.getInstance(); + } + + getInstance () { + return this._registry.getContractInstance('signaturereg'); + } + + lookup (signature) { + return this.getInstance().then((instance) => { + return instance.get.call({}, [signature]); + }); + } +} diff --git a/js/src/contracts/tokenreg.js b/js/src/contracts/tokenreg.js new file mode 100644 index 00000000000..2dcf119a971 --- /dev/null +++ b/js/src/contracts/tokenreg.js @@ -0,0 +1,41 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default class TokenReg { + constructor (api, registry) { + this._api = api; + this._registry = registry; + this._instance = null; + + this.getInstance(); + } + + getInstance () { + return this._registry.getContractInstance('tokenreg'); + } + + tokenCount () { + return this.getInstance().then((instance) => { + return instance.tokenCount.call(); + }); + } + + token (index) { + return this.getInstance().then((instance) => { + return instance.token.call({}, [index]); + }); + } +} From 4a4766c04335658764787f25f51c9810a261bdfc Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 25 Sep 2016 20:36:59 +0200 Subject: [PATCH 0799/1062] return empty when null supplied --- js/src/abi/decoder/decoder.js | 6 ++++-- js/src/abi/decoder/decoder.spec.js | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/js/src/abi/decoder/decoder.js b/js/src/abi/decoder/decoder.js index 06ab5dc7a87..0d218312220 100644 --- a/js/src/abi/decoder/decoder.js +++ b/js/src/abi/decoder/decoder.js @@ -24,6 +24,8 @@ import { sliceData } from '../util/slice'; import { asAddress, asBool, asI32, asU32 } from '../util/sliceAs'; import { isArray, isInstanceOf } from '../util/types'; +const NULL = '0000000000000000000000000000000000000000000000000000000000000000'; + export default class Decoder { static decode (params, data) { if (!isArray(params)) { @@ -42,7 +44,7 @@ export default class Decoder { static peek (slices, position) { if (!slices || !slices[position]) { - throw new Error(`Invalid position ${position} in slices peek`); + return NULL; } return slices[position]; @@ -56,7 +58,7 @@ export default class Decoder { bytesStr = `${bytesStr}${Decoder.peek(slices, position + idx)}`; } - const bytes = bytesStr.substr(0, length * 2).match(/.{1,2}/g).map((code) => parseInt(code, 16)); + const bytes = (bytesStr.substr(0, length * 2).match(/.{1,2}/g) || []).map((code) => parseInt(code, 16)); return new BytesTaken(bytes, position + slicesLength); } diff --git a/js/src/abi/decoder/decoder.spec.js b/js/src/abi/decoder/decoder.spec.js index 35cdd9dd4bc..a16daa94d63 100644 --- a/js/src/abi/decoder/decoder.spec.js +++ b/js/src/abi/decoder/decoder.spec.js @@ -68,8 +68,8 @@ describe('abi/decoder/Decoder', () => { expect(() => Decoder.peek(slices, 4)).to.throw(/Invalid/); }); - it('throws an error on invalid slices', () => { - expect(() => Decoder.peek(null, 4)).to.throw(/Invalid/); + it('returns empty on invalid slices', () => { + expect(Decoder.peek(null, 4)).to.equal('0000000000000000000000000000000000000000000000000000000000000000'); }); }); From 275acbbe80fc4561ee6a7c59720beb1e0f63a299 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 25 Sep 2016 20:37:40 +0200 Subject: [PATCH 0800/1062] don't fail on contract creation encoding --- js/src/api/util/decode.js | 10 ++++++++-- js/src/api/util/decode.spec.js | 8 ++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/js/src/api/util/decode.js b/js/src/api/util/decode.js index 607be06f024..a9fb219bef2 100644 --- a/js/src/api/util/decode.js +++ b/js/src/api/util/decode.js @@ -18,7 +18,13 @@ import { isHex } from './types'; import Func from '../../abi/spec/function'; +const CREATE_METHOD = '60606040'; + export function decodeCallData (data) { + if (!data || !data.length) { + return {}; + } + if (!isHex(data)) { throw new Error('Input to decodeCallData should be a hex value'); } @@ -32,8 +38,8 @@ export function decodeCallData (data) { const signature = data.substr(0, 8); const paramdata = data.substr(8); - if (paramdata.length % 64 !== 0) { - throw new Error('Parameter length in decodeCallData not a multiple of 64 characters'); + if ((signature !== CREATE_METHOD) && length % 64 !== 0) { + throw new Error(`Parameter length in decodeCallData not a multiple of 64 characters, ${paramdata.length}`); } return { diff --git a/js/src/api/util/decode.spec.js b/js/src/api/util/decode.spec.js index ed25225841e..272ae753838 100644 --- a/js/src/api/util/decode.spec.js +++ b/js/src/api/util/decode.spec.js @@ -35,6 +35,14 @@ describe('api/util/decode', () => { expect(() => decodeCallData(`${ENCO.slice(-32)}`)).to.throw(/not a multiple of/); }); + it('returns an empty object for ""', () => { + expect(decodeCallData('')).to.deep.equal({}); + }); + + it('returns an empty object for "0x"', () => { + expect(decodeCallData('0x')).to.deep.equal({}); + }); + it('splits valid inputs properly', () => { expect(decodeCallData(ENCO)).to.deep.equal({ signature: METH, From a1cd82cb9b9d0f9a6c8b096db6c988d589c10c20 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 25 Sep 2016 21:22:10 +0200 Subject: [PATCH 0801/1062] add contracts context --- js/src/ui/ContextProvider/contextProvider.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/js/src/ui/ContextProvider/contextProvider.js b/js/src/ui/ContextProvider/contextProvider.js index 7af6d342e87..c2fd394382e 100644 --- a/js/src/ui/ContextProvider/contextProvider.js +++ b/js/src/ui/ContextProvider/contextProvider.js @@ -19,6 +19,7 @@ import { Component, PropTypes } from 'react'; export default class ContextProvider extends Component { static propTypes = { api: PropTypes.object.isRequired, + contracts: PropTypes.object.isRequired, muiTheme: PropTypes.object.isRequired, store: PropTypes.object.isRequired, children: PropTypes.node.isRequired @@ -26,6 +27,7 @@ export default class ContextProvider extends Component { static childContextTypes = { api: PropTypes.object, + contracts: PropTypes.object, muiTheme: PropTypes.object, store: PropTypes.object } @@ -37,10 +39,11 @@ export default class ContextProvider extends Component { } getChildContext () { - const { api, muiTheme, store } = this.props; + const { api, contracts, muiTheme, store } = this.props; return { api, + contracts, muiTheme, store }; From cf24bb26ef721c7147b7612c57b41b5df2907b69 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 25 Sep 2016 21:55:30 +0200 Subject: [PATCH 0802/1062] calls gets expanded in transaction list view --- js/src/contracts/contracts.js | 4 + js/src/contracts/registry.js | 9 +- js/src/index.js | 5 +- .../Account/Transactions/transactions.css | 15 +++ .../Account/Transactions/transactions.js | 99 ++++++++++++++++++- 5 files changed, 125 insertions(+), 7 deletions(-) diff --git a/js/src/contracts/contracts.js b/js/src/contracts/contracts.js index 122a21e81e7..e540a5fce91 100644 --- a/js/src/contracts/contracts.js +++ b/js/src/contracts/contracts.js @@ -42,6 +42,10 @@ export default class Contracts { return this._tokenreg; } + static create (api) { + return new Contracts(api); + } + static get () { return instance; } diff --git a/js/src/contracts/registry.js b/js/src/contracts/registry.js index 52c2b6536c2..a7f60f44195 100644 --- a/js/src/contracts/registry.js +++ b/js/src/contracts/registry.js @@ -36,7 +36,7 @@ export default class Registry { .registryAddress() .then((address) => { this._instance = this._api.newContract(abis.registry, address).instance; - resolve(this.address); + resolve(this._instance); }) .catch(reject); }); @@ -46,8 +46,8 @@ export default class Registry { const name = _name.toLowerCase(); return new Promise((resolve, reject) => { - if (this._services[name]) { - resolve(this._services[name]); + if (this._contracts[name]) { + resolve(this._contracts[name]); return; } @@ -65,6 +65,9 @@ export default class Registry { const name = _name.toLowerCase(); return this.getInstance().then((instance) => { + if (name === 'signaturereg') { + return '0xD1888764222dbE5BBa54F0cf9d493e43aba667Fb'; + } return instance.getAddress.call({}, [this._api.util.sha3(name), 'A']); }); } diff --git a/js/src/index.js b/js/src/index.js index 1a4d9643065..86cd8f9ab8b 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -29,6 +29,8 @@ import { Redirect, Router, Route, useRouterHistory } from 'react-router'; import Web3 from 'web3'; import Api from './api'; +import ContractInstances from './contracts'; + import { initStore } from './redux'; import { ContextProvider, muiTheme } from './ui'; import { Accounts, Account, Addresses, Address, Application, Contract, Contracts, Dapp, Dapps, Signer, Status } from './views'; @@ -49,6 +51,7 @@ const initToken = window.localStorage.getItem('sysuiToken'); const parityUrl = process.env.NODE_ENV === 'production' ? window.location.host : '127.0.0.1:8180'; const api = new Api(new Api.Transport.Ws(`ws://${parityUrl}`, initToken)); // new Api.Transport.Http('/rpc/')); +const contracts = ContractInstances.create(api); muiTheme.parity.setBackgroundSeed(api.util.sha3(initToken + Date.now())); @@ -71,7 +74,7 @@ ws.init(initToken); const routerHistory = useRouterHistory(createHashHistory)({}); ReactDOM.render( - + diff --git a/js/src/views/Account/Transactions/transactions.css b/js/src/views/Account/Transactions/transactions.css index 2da33a8007d..47012f5a93b 100644 --- a/js/src/views/Account/Transactions/transactions.css +++ b/js/src/views/Account/Transactions/transactions.css @@ -46,6 +46,10 @@ vertical-align: top; } +.transactions tr td div { + white-space: nowrap; +} + .transactions .link { vertical-align: top; } @@ -64,3 +68,14 @@ font-size: 0.75em; color: #aaa; } + +.executevalue, +.executekey { + font-size: 0.75em; + line-height: 1.5em; +} + +.executekey { + text-align: right; + color: #aaa; +} diff --git a/js/src/views/Account/Transactions/transactions.js b/js/src/views/Account/Transactions/transactions.js index 3101178cfc6..f27ee50cad4 100644 --- a/js/src/views/Account/Transactions/transactions.js +++ b/js/src/views/Account/Transactions/transactions.js @@ -54,6 +54,11 @@ function formatEther (value) { } class Transactions extends Component { + static contextTypes = { + api: PropTypes.object.isRequired, + contracts: PropTypes.object.isRequired + } + static propTypes = { address: PropTypes.string.isRequired, accounts: PropTypes.object, @@ -64,7 +69,8 @@ class Transactions extends Component { state = { transactions: [], - loading: true + loading: true, + callInfo: {} } componentDidMount () { @@ -103,9 +109,21 @@ class Transactions extends Component { ); } + renderValue (value) { + const { api } = this.context; + + if (api.util.isInstanceOf(value, BigNumber)) { + return value.toFormat(0); + } else if (api.util.isArray(value)) { + return api.util.bytesToHex(value); + } + + return value.toString(); + } + renderTransactions () { const { isTest } = this.props; - const { loading, transactions } = this.state; + const { loading, transactions, callInfo } = this.state; if (loading) { return ( @@ -120,19 +138,47 @@ class Transactions extends Component { } const prefix = `https://${isTest ? 'testnet.' : ''}etherscan.io/`; - const rows = (transactions || []).map((tx) => { + const rows = (transactions || []).map((tx, index) => { const hashLink = `${prefix}tx/${tx.hash}`; const value = formatEther(tx.value); const token = value ? 'ΞTH' : null; const tosection = (tx.to && tx.to.length) ? this.renderAddress(prefix, tx.to) : (); + const info = callInfo[tx.hash] || {}; + const executetypes = (info.abi ? info.abi.inputs : []).map((input, index) => { + return ( +
      + { input.type } +
      + ); + }); + const executevalues = (info.values ? info.values : []).map((value, index) => { + return ( +
      + { this.renderValue(value) } +
      + ); + }); + const executename = info.abi + ? `${info.abi.name} =>` + : ''; + + this.lookupTransaction(tx.hash); return ( { this.renderAddress(prefix, tx.from) } { tosection } + +
      { executename }
      + { executetypes } + + +
       
      + { executevalues } +
      { formatHash(tx.hash) } @@ -159,6 +205,7 @@ class Transactions extends Component {   from to + execute transaction block age @@ -176,6 +223,52 @@ class Transactions extends Component { ); } + lookupTransaction (txHash) { + const { api, contracts } = this.context; + const { callInfo } = this.state; + + if (callInfo[txHash]) { + return; + } + + api.eth + .getTransactionByHash(txHash) + .then((transaction) => { + const { signature, paramdata } = api.util.decodeCallData(transaction.input); + + if (!signature || signature === '0x60606040') { + this.setState(Object.assign(this.state.callInfo, { + [txHash]: { + transaction, + signature + } + })); + return; + } + + return contracts.signatureReg + .lookup(signature) + .then(([method, owner]) => { + let abi = null; + let values = null; + + if (method.length) { + abi = api.util.methodToAbi(method); + values = api.util.decodeMethodInput(abi, paramdata); + } + + this.setState(Object.assign(this.state.callInfo, { + [txHash]: { + transaction, + signature, + abi, + values + } + })); + }); + }); + } + getTransactions = () => { const { isTest, address } = this.props; From d580221b0d7de1989417b0e302071d87bba15612 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 25 Sep 2016 20:36:59 +0200 Subject: [PATCH 0803/1062] return empty when null supplied --- js/src/abi/decoder/decoder.js | 6 ++++-- js/src/abi/decoder/decoder.spec.js | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/js/src/abi/decoder/decoder.js b/js/src/abi/decoder/decoder.js index 06ab5dc7a87..0d218312220 100644 --- a/js/src/abi/decoder/decoder.js +++ b/js/src/abi/decoder/decoder.js @@ -24,6 +24,8 @@ import { sliceData } from '../util/slice'; import { asAddress, asBool, asI32, asU32 } from '../util/sliceAs'; import { isArray, isInstanceOf } from '../util/types'; +const NULL = '0000000000000000000000000000000000000000000000000000000000000000'; + export default class Decoder { static decode (params, data) { if (!isArray(params)) { @@ -42,7 +44,7 @@ export default class Decoder { static peek (slices, position) { if (!slices || !slices[position]) { - throw new Error(`Invalid position ${position} in slices peek`); + return NULL; } return slices[position]; @@ -56,7 +58,7 @@ export default class Decoder { bytesStr = `${bytesStr}${Decoder.peek(slices, position + idx)}`; } - const bytes = bytesStr.substr(0, length * 2).match(/.{1,2}/g).map((code) => parseInt(code, 16)); + const bytes = (bytesStr.substr(0, length * 2).match(/.{1,2}/g) || []).map((code) => parseInt(code, 16)); return new BytesTaken(bytes, position + slicesLength); } diff --git a/js/src/abi/decoder/decoder.spec.js b/js/src/abi/decoder/decoder.spec.js index 35cdd9dd4bc..a16daa94d63 100644 --- a/js/src/abi/decoder/decoder.spec.js +++ b/js/src/abi/decoder/decoder.spec.js @@ -68,8 +68,8 @@ describe('abi/decoder/Decoder', () => { expect(() => Decoder.peek(slices, 4)).to.throw(/Invalid/); }); - it('throws an error on invalid slices', () => { - expect(() => Decoder.peek(null, 4)).to.throw(/Invalid/); + it('returns empty on invalid slices', () => { + expect(Decoder.peek(null, 4)).to.equal('0000000000000000000000000000000000000000000000000000000000000000'); }); }); From e712ba724eab5e57d8ba70822aa2f286891dd7f2 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 25 Sep 2016 20:37:40 +0200 Subject: [PATCH 0804/1062] don't fail on contract creation encoding --- js/src/api/util/decode.js | 10 ++++++++-- js/src/api/util/decode.spec.js | 8 ++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/js/src/api/util/decode.js b/js/src/api/util/decode.js index 607be06f024..a9fb219bef2 100644 --- a/js/src/api/util/decode.js +++ b/js/src/api/util/decode.js @@ -18,7 +18,13 @@ import { isHex } from './types'; import Func from '../../abi/spec/function'; +const CREATE_METHOD = '60606040'; + export function decodeCallData (data) { + if (!data || !data.length) { + return {}; + } + if (!isHex(data)) { throw new Error('Input to decodeCallData should be a hex value'); } @@ -32,8 +38,8 @@ export function decodeCallData (data) { const signature = data.substr(0, 8); const paramdata = data.substr(8); - if (paramdata.length % 64 !== 0) { - throw new Error('Parameter length in decodeCallData not a multiple of 64 characters'); + if ((signature !== CREATE_METHOD) && length % 64 !== 0) { + throw new Error(`Parameter length in decodeCallData not a multiple of 64 characters, ${paramdata.length}`); } return { diff --git a/js/src/api/util/decode.spec.js b/js/src/api/util/decode.spec.js index ed25225841e..272ae753838 100644 --- a/js/src/api/util/decode.spec.js +++ b/js/src/api/util/decode.spec.js @@ -35,6 +35,14 @@ describe('api/util/decode', () => { expect(() => decodeCallData(`${ENCO.slice(-32)}`)).to.throw(/not a multiple of/); }); + it('returns an empty object for ""', () => { + expect(decodeCallData('')).to.deep.equal({}); + }); + + it('returns an empty object for "0x"', () => { + expect(decodeCallData('0x')).to.deep.equal({}); + }); + it('splits valid inputs properly', () => { expect(decodeCallData(ENCO)).to.deep.equal({ signature: METH, From 44e135dd5d071175a564052b88435d47b051cdc0 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 25 Sep 2016 22:03:19 +0200 Subject: [PATCH 0805/1062] updated invalid & failing tests --- js/src/abi/decoder/decoder.spec.js | 8 -------- js/src/api/util/decode.js | 2 +- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/js/src/abi/decoder/decoder.spec.js b/js/src/abi/decoder/decoder.spec.js index a16daa94d63..eeaf716c894 100644 --- a/js/src/abi/decoder/decoder.spec.js +++ b/js/src/abi/decoder/decoder.spec.js @@ -60,14 +60,6 @@ describe('abi/decoder/Decoder', () => { expect(Decoder.peek(slices, 1)).to.equal(slices[1]); }); - it('throws an error if the position is < 0', () => { - expect(() => Decoder.peek(slices, -1)).to.throw(/Invalid/); - }); - - it('throws an error if the position is >= length', () => { - expect(() => Decoder.peek(slices, 4)).to.throw(/Invalid/); - }); - it('returns empty on invalid slices', () => { expect(Decoder.peek(null, 4)).to.equal('0000000000000000000000000000000000000000000000000000000000000000'); }); diff --git a/js/src/api/util/decode.js b/js/src/api/util/decode.js index a9fb219bef2..236292a9293 100644 --- a/js/src/api/util/decode.js +++ b/js/src/api/util/decode.js @@ -38,7 +38,7 @@ export function decodeCallData (data) { const signature = data.substr(0, 8); const paramdata = data.substr(8); - if ((signature !== CREATE_METHOD) && length % 64 !== 0) { + if ((signature !== CREATE_METHOD) && paramdata.length % 64 !== 0) { throw new Error(`Parameter length in decodeCallData not a multiple of 64 characters, ${paramdata.length}`); } From 76e1591f3c800e261ca05010bf1614d7cd3c8ddc Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 26 Sep 2016 10:29:14 +0200 Subject: [PATCH 0806/1062] add component for displaying decoded method inputs --- js/src/ui/MethodDecoding/index.js | 17 +++ js/src/ui/MethodDecoding/methodDecoding.css | 30 ++++ js/src/ui/MethodDecoding/methodDecoding.js | 145 ++++++++++++++++++++ js/src/ui/index.js | 2 + 4 files changed, 194 insertions(+) create mode 100644 js/src/ui/MethodDecoding/index.js create mode 100644 js/src/ui/MethodDecoding/methodDecoding.css create mode 100644 js/src/ui/MethodDecoding/methodDecoding.js diff --git a/js/src/ui/MethodDecoding/index.js b/js/src/ui/MethodDecoding/index.js new file mode 100644 index 00000000000..1606857edab --- /dev/null +++ b/js/src/ui/MethodDecoding/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './methodDecoding'; diff --git a/js/src/ui/MethodDecoding/methodDecoding.css b/js/src/ui/MethodDecoding/methodDecoding.css new file mode 100644 index 00000000000..54d14e2ef9a --- /dev/null +++ b/js/src/ui/MethodDecoding/methodDecoding.css @@ -0,0 +1,30 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.method { +} + +.name { +} + +.inputs { + padding-left: 1.5em; +} + +.input { + margin-top: -14px; +} diff --git a/js/src/ui/MethodDecoding/methodDecoding.js b/js/src/ui/MethodDecoding/methodDecoding.js new file mode 100644 index 00000000000..7f2a76a517d --- /dev/null +++ b/js/src/ui/MethodDecoding/methodDecoding.js @@ -0,0 +1,145 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; +import React, { Component, PropTypes } from 'react'; + +import Input from '../Form/Input'; + +import styles from './methodDecoding.css'; + +const CONTRACT_CREATE = '0x60606040'; + +export default class Method extends Component { + static contextTypes = { + api: PropTypes.object.isRequired, + contracts: PropTypes.object.isRequired + } + + static propTypes = { + input: PropTypes.string + } + + state = { + signature: null, + paramdata: null, + name: null, + inputs: null + } + + componentDidMount () { + const { input } = this.props; + + this.lookup(input); + } + + componentWillReceiveProps (newProps) { + const { input } = this.props; + + if (newProps.input === input) { + return; + } + + this.lookup(input); + } + + render () { + const { name } = this.state; + + if (!name) { + return null; + } + + return ( +
      +
      + { name } +
      +
      + { this.renderInputs() } +
      +
      + ); + } + + renderInputs () { + const { inputs } = this.state; + + return inputs.map((input, index) => { + return ( + + ); + }); + } + + renderValue (value) { + const { api } = this.context; + + if (api.util.isInstanceOf(value, BigNumber)) { + return value.toFormat(0); + } else if (api.util.isArray(value)) { + return api.util.bytesToHex(value); + } + + return value.toString(); + } + + lookup (input) { + const { api, contracts } = this.context; + + if (!input) { + return; + } + + const { signature, paramdata } = api.util.decodeCallData(input); + + if (!signature || signature === CONTRACT_CREATE) { + return; + } + + this.setState({ signature, paramdata }); + + contracts.signatureReg + .lookup(signature) + .then(([method, owner]) => { + let inputs = null; + let name = null; + + if (method && method.length) { + const abi = api.util.methodToAbi(method); + + name = abi.name; + inputs = api.util + .decodeMethodInput(abi, paramdata) + .map((value, index) => { + const type = abi.inputs[index].type; + + return { type, value }; + }); + } + + this.setState({ method, name, inputs }); + }) + .catch((error) => { + console.error('lookup', error); + }); + } +} diff --git a/js/src/ui/index.js b/js/src/ui/index.js index 8691a07f8e9..1938555f3c1 100644 --- a/js/src/ui/index.js +++ b/js/src/ui/index.js @@ -24,6 +24,7 @@ import ContextProvider from './ContextProvider'; import Errors from './Errors'; import Form, { AddressSelect, FormWrap, Input, InputAddress, InputAddressSelect, InputInline, Select } from './Form'; import IdentityIcon from './IdentityIcon'; +import MethodDecoding from './MethodDecoding'; import Modal from './Modal'; import muiTheme from './Theme'; import Page from './Page'; @@ -50,6 +51,7 @@ export { InputInline, Select, IdentityIcon, + MethodDecoding, Modal, muiTheme, Page, From aa5e21680e48c0834e4380f99bb799ceccb7fb51 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 26 Sep 2016 10:29:33 +0200 Subject: [PATCH 0807/1062] split transaction row into own component --- .../Account/Transactions/Transaction/index.js | 17 ++ .../Transactions/Transaction/transaction.js | 176 +++++++++++++++ .../Account/Transactions/transactions.css | 16 +- .../Account/Transactions/transactions.js | 206 ++---------------- 4 files changed, 216 insertions(+), 199 deletions(-) create mode 100644 js/src/views/Account/Transactions/Transaction/index.js create mode 100644 js/src/views/Account/Transactions/Transaction/transaction.js diff --git a/js/src/views/Account/Transactions/Transaction/index.js b/js/src/views/Account/Transactions/Transaction/index.js new file mode 100644 index 00000000000..28a39ad4680 --- /dev/null +++ b/js/src/views/Account/Transactions/Transaction/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './transaction'; diff --git a/js/src/views/Account/Transactions/Transaction/transaction.js b/js/src/views/Account/Transactions/Transaction/transaction.js new file mode 100644 index 00000000000..8a4446cc0a0 --- /dev/null +++ b/js/src/views/Account/Transactions/Transaction/transaction.js @@ -0,0 +1,176 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; +import React, { Component, PropTypes } from 'react'; +import moment from 'moment'; + +import { IdentityIcon, MethodDecoding } from '../../../../ui'; + +import styles from '../transactions.css'; + +export default class Transaction extends Component { + static contextTypes = { + api: PropTypes.object.isRequired + } + + static propTypes = { + transaction: PropTypes.object.isRequired, + accounts: PropTypes.object, + contacts: PropTypes.object, + tokens: PropTypes.object, + isTest: PropTypes.bool.isRequired + } + + state = { + info: null + } + + componentDidMount () { + const { transaction } = this.props; + + this.lookup(transaction); + } + + render () { + const { transaction, isTest } = this.props; + const { block } = this.state; + + const prefix = `https://${isTest ? 'testnet.' : ''}etherscan.io/`; + const hashLink = `${prefix}tx/${transaction.hash}`; + const value = this.formatEther(transaction.value); + const token = value ? 'ΞTH' : null; + + return ( + + + { this.formatBlockTimestamp(block) } + + + { this.formatNumber(transaction.blockNumber) } + + { this.renderAddress(prefix, transaction.from) } + { this.renderAddress(prefix, transaction.to) } + +
      + { this.formatHash(transaction.hash) } + + + + { this.formatEther(transaction.value) } { token } + + + { this.renderMethod() } + + + ); + } + + renderMethod () { + const { info } = this.state; + + if (!info) { + return null; + } + + return ( + + ); + } + + renderAddress (prefix, address) { + const { accounts, contacts, tokens } = this.props; + + if (!address && !address.length) { + return ( + + ); + } + + const account = (accounts || {})[address] || (contacts || {})[address] || (tokens || {})[address]; + const link = `${prefix}address/${address}`; + const name = account + ? account.name.toUpperCase() + : this.formatHash(address); + + return ( + + + + { name } + + + ); + } + + formatHash (hash) { + if (!hash || hash.length <= 16) { + return hash; + } + + return `${hash.substr(2, 6)}...${hash.slice(-6)}`; + } + + formatNumber (number) { + return new BigNumber(number).toFormat(); + } + + formatBlockTimestamp (block) { + if (!block) { + return null; + } + + return moment(block.timestamp).fromNow(); + } + + formatEther (value) { + const { api } = this.context; + const ether = api.util.fromWei(value); + + if (ether.gt(0)) { + return `${ether.toFormat(5)}`; + } + + return null; + } + + lookup (transaction) { + const { api } = this.context; + const { info } = this.state; + + if (info) { + return; + } + + Promise + .all([ + api.eth.getBlockByNumber(transaction.blockNumber), + api.eth.getTransactionByHash(transaction.hash) + ]) + .then(([block, info]) => { + this.setState({ block, info }); + }) + .catch((error) => { + console.error('lookup', error); + }); + } +} diff --git a/js/src/views/Account/Transactions/transactions.css b/js/src/views/Account/Transactions/transactions.css index 47012f5a93b..9dae4ab28ae 100644 --- a/js/src/views/Account/Transactions/transactions.css +++ b/js/src/views/Account/Transactions/transactions.css @@ -44,10 +44,7 @@ .transactions tr td { vertical-align: top; -} - -.transactions tr td div { - white-space: nowrap; + padding: 0.75em 0.5em; } .transactions .link { @@ -69,13 +66,6 @@ color: #aaa; } -.executevalue, -.executekey { - font-size: 0.75em; - line-height: 1.5em; -} - -.executekey { - text-align: right; - color: #aaa; +.method { + opacity: 0.75; } diff --git a/js/src/views/Account/Transactions/transactions.js b/js/src/views/Account/Transactions/transactions.js index f27ee50cad4..e55ae6f0de3 100644 --- a/js/src/views/Account/Transactions/transactions.js +++ b/js/src/views/Account/Transactions/transactions.js @@ -14,49 +14,21 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; -import moment from 'moment'; import LinearProgress from 'material-ui/LinearProgress'; -import util from '../../../api/util'; import etherscan from '../../../3rdparty/etherscan'; -import { Container, IdentityIcon } from '../../../ui'; +import { Container } from '../../../ui'; -import styles from './transactions.css'; - -function formatHash (hash) { - if (!hash || hash.length <= 21) { - return hash; - } - - return `${hash.substr(2, 9)}...${hash.slice(-9)}`; -} - -function formatNumber (number) { - return new BigNumber(number).toFormat(); -} - -function formatTime (time) { - return moment(parseInt(time, 10) * 1000).fromNow(true); -} - -function formatEther (value) { - const ether = util.fromWei(value); - - if (ether.gt(0)) { - return `${ether.toFormat(5)}`; - } +import Transaction from './Transaction'; - return null; -} +import styles from './transactions.css'; class Transactions extends Component { static contextTypes = { - api: PropTypes.object.isRequired, - contracts: PropTypes.object.isRequired + api: PropTypes.object.isRequired } static propTypes = { @@ -85,45 +57,8 @@ class Transactions extends Component { ); } - renderAddress (prefix, address) { - const { accounts, contacts, tokens } = this.props; - const account = (accounts || {})[address] || (contacts || {})[address] || (tokens || {})[address]; - const link = `${prefix}address/${address}`; - const name = account - ? account.name.toUpperCase() - : formatHash(address); - - return ( - - - - { name } - - - ); - } - - renderValue (value) { - const { api } = this.context; - - if (api.util.isInstanceOf(value, BigNumber)) { - return value.toFormat(0); - } else if (api.util.isArray(value)) { - return api.util.bytesToHex(value); - } - - return value.toString(); - } - renderTransactions () { - const { isTest } = this.props; - const { loading, transactions, callInfo } = this.state; + const { loading, transactions } = this.state; if (loading) { return ( @@ -137,83 +72,11 @@ class Transactions extends Component { ); } - const prefix = `https://${isTest ? 'testnet.' : ''}etherscan.io/`; - const rows = (transactions || []).map((tx, index) => { - const hashLink = `${prefix}tx/${tx.hash}`; - const value = formatEther(tx.value); - const token = value ? 'ΞTH' : null; - const tosection = (tx.to && tx.to.length) - ? this.renderAddress(prefix, tx.to) - : (); - const info = callInfo[tx.hash] || {}; - const executetypes = (info.abi ? info.abi.inputs : []).map((input, index) => { - return ( -
      - { input.type } -
      - ); - }); - const executevalues = (info.values ? info.values : []).map((value, index) => { - return ( -
      - { this.renderValue(value) } -
      - ); - }); - const executename = info.abi - ? `${info.abi.name} =>` - : ''; - - this.lookupTransaction(tx.hash); - - return ( - - - { this.renderAddress(prefix, tx.from) } - { tosection } - -
      { executename }
      - { executetypes } - - -
       
      - { executevalues } - - - - { formatHash(tx.hash) } - - - - { formatNumber(tx.blockNumber) } - - - { formatTime(tx.timeStamp) } - - - { formatEther(tx.value) } { token } - - - ); - }); - return (
      - - - - - - - - - - - - - { rows } + { this.renderRows() }
       fromtoexecutetransactionblockagevalue
      @@ -223,50 +86,21 @@ class Transactions extends Component { ); } - lookupTransaction (txHash) { - const { api, contracts } = this.context; - const { callInfo } = this.state; + renderRows () { + const { accounts, contacts, tokens, isTest } = this.props; + const { transactions } = this.state; - if (callInfo[txHash]) { - return; - } - - api.eth - .getTransactionByHash(txHash) - .then((transaction) => { - const { signature, paramdata } = api.util.decodeCallData(transaction.input); - - if (!signature || signature === '0x60606040') { - this.setState(Object.assign(this.state.callInfo, { - [txHash]: { - transaction, - signature - } - })); - return; - } - - return contracts.signatureReg - .lookup(signature) - .then(([method, owner]) => { - let abi = null; - let values = null; - - if (method.length) { - abi = api.util.methodToAbi(method); - values = api.util.decodeMethodInput(abi, paramdata); - } - - this.setState(Object.assign(this.state.callInfo, { - [txHash]: { - transaction, - signature, - abi, - values - } - })); - }); - }); + return (transactions || []).map((transaction, index) => { + return ( + + ); + }); } getTransactions = () => { From 496869b226f678ccbed8abd9b0cc0a1877ad7905 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 26 Sep 2016 10:55:37 +0200 Subject: [PATCH 0808/1062] transaction display is closer to what we have in Signer --- .../Transactions/Transaction/transaction.js | 65 +++++++++++-------- .../Account/Transactions/transactions.css | 13 +++- 2 files changed, 51 insertions(+), 27 deletions(-) diff --git a/js/src/views/Account/Transactions/Transaction/transaction.js b/js/src/views/Account/Transactions/Transaction/transaction.js index 8a4446cc0a0..2c4a4e38d45 100644 --- a/js/src/views/Account/Transactions/Transaction/transaction.js +++ b/js/src/views/Account/Transactions/Transaction/transaction.js @@ -50,9 +50,6 @@ export default class Transaction extends Component { const { block } = this.state; const prefix = `https://${isTest ? 'testnet.' : ''}etherscan.io/`; - const hashLink = `${prefix}tx/${transaction.hash}`; - const value = this.formatEther(transaction.value); - const token = value ? 'ΞTH' : null; return ( @@ -63,15 +60,10 @@ export default class Transaction extends Component { { this.formatNumber(transaction.blockNumber) } { this.renderAddress(prefix, transaction.from) } - { this.renderAddress(prefix, transaction.to) } - - { this.formatHash(transaction.hash) } - - - - { this.formatEther(transaction.value) } { token } + { this.renderTransaction() } + { this.renderAddress(prefix, transaction.to) } { this.renderMethod() } @@ -91,6 +83,27 @@ export default class Transaction extends Component { ); } + renderTransaction () { + const { transaction, isTest } = this.props; + + const prefix = `https://${isTest ? 'testnet.' : ''}etherscan.io/`; + const hashLink = `${prefix}tx/${transaction.hash}`; + + return ( + +
      + { this.formatEther(transaction.value) }ΞTH +
      +
      ⇒
      + + + ); + } + renderAddress (prefix, address) { const { accounts, contacts, tokens } = this.props; @@ -107,17 +120,21 @@ export default class Transaction extends Component { : this.formatHash(address); return ( - - - - { name } - + +
      + +
      + ); } @@ -146,11 +163,7 @@ export default class Transaction extends Component { const { api } = this.context; const ether = api.util.fromWei(value); - if (ether.gt(0)) { - return `${ether.toFormat(5)}`; - } - - return null; + return `${ether.toFormat(5)}`; } lookup (transaction) { diff --git a/js/src/views/Account/Transactions/transactions.css b/js/src/views/Account/Transactions/transactions.css index 9dae4ab28ae..c902baa38bc 100644 --- a/js/src/views/Account/Transactions/transactions.css +++ b/js/src/views/Account/Transactions/transactions.css @@ -52,7 +52,6 @@ } .value { - text-align: right; } .infonone { @@ -66,6 +65,18 @@ color: #aaa; } +.address { + text-align: center; +} + +.transaction { + text-align: center; +} + +.transaction div { + line-height: 1em; +} + .method { opacity: 0.75; } From 679cf0917e4eab98b8f9f46846e494bbe7bc62dc Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 26 Sep 2016 11:17:45 +0200 Subject: [PATCH 0809/1062] small transaction list styling updates (align with Signer, non-shared currently) --- .../Transactions/Transaction/transaction.js | 15 +++++------- .../Account/Transactions/transactions.css | 24 ++++++++++++++----- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/js/src/views/Account/Transactions/Transaction/transaction.js b/js/src/views/Account/Transactions/Transaction/transaction.js index 2c4a4e38d45..162ad982c43 100644 --- a/js/src/views/Account/Transactions/Transaction/transaction.js +++ b/js/src/views/Account/Transactions/Transaction/transaction.js @@ -53,16 +53,12 @@ export default class Transaction extends Component { return ( - - { this.formatBlockTimestamp(block) } - - - { this.formatNumber(transaction.blockNumber) } + +
      { this.formatBlockTimestamp(block) }
      +
      { this.formatNumber(transaction.blockNumber) }
      { this.renderAddress(prefix, transaction.from) } - - { this.renderTransaction() } - + { this.renderTransaction() } { this.renderAddress(prefix, transaction.to) } { this.renderMethod() } @@ -123,7 +119,8 @@ export default class Transaction extends Component {
      diff --git a/js/src/views/Account/Transactions/transactions.css b/js/src/views/Account/Transactions/transactions.css index c902baa38bc..7f1ab4783ff 100644 --- a/js/src/views/Account/Transactions/transactions.css +++ b/js/src/views/Account/Transactions/transactions.css @@ -40,20 +40,18 @@ .transactions th { color: #aaa; + text-align: center; } -.transactions tr td { +.transactions td { vertical-align: top; - padding: 0.75em 0.5em; + padding: 0.75em 0.75em; } .transactions .link { vertical-align: top; } -.value { -} - .infonone { opacity: 0.25; } @@ -73,10 +71,24 @@ text-align: center; } +.transactions td.transaction { + padding-top: 1.5em; +} + .transaction div { - line-height: 1em; + line-height: 1.25em; +} + +.icon { + margin: 0; } .method { opacity: 0.75; } + +.transactions td.timestamp { + padding-top: 1.5em; + text-align: right; + line-height: 1.5em; +} From 8a82ff551b5bcdb5f4ebfa370f5de10726627dca Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 25 Sep 2016 11:49:21 +0200 Subject: [PATCH 0810/1062] add missing gpl headers (non-related) --- .../dapps/gavcoin/IdentityIcon/identityIcon.css | 17 +++++++++++++++++ .../dapps/gavcoin/IdentityIcon/identityIcon.js | 16 ++++++++++++++++ js/src/dapps/gavcoin/IdentityIcon/index.js | 16 ++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/js/src/dapps/gavcoin/IdentityIcon/identityIcon.css b/js/src/dapps/gavcoin/IdentityIcon/identityIcon.css index b2795dff158..2b645d8239b 100644 --- a/js/src/dapps/gavcoin/IdentityIcon/identityIcon.css +++ b/js/src/dapps/gavcoin/IdentityIcon/identityIcon.css @@ -1,3 +1,20 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + .icon { width: 32px; height: 32px; diff --git a/js/src/dapps/gavcoin/IdentityIcon/identityIcon.js b/js/src/dapps/gavcoin/IdentityIcon/identityIcon.js index 81c7abcd737..51f48d46ab3 100644 --- a/js/src/dapps/gavcoin/IdentityIcon/identityIcon.js +++ b/js/src/dapps/gavcoin/IdentityIcon/identityIcon.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + import React, { Component, PropTypes } from 'react'; import { api } from '../parity'; diff --git a/js/src/dapps/gavcoin/IdentityIcon/index.js b/js/src/dapps/gavcoin/IdentityIcon/index.js index 51b592d3146..76c107bfb75 100644 --- a/js/src/dapps/gavcoin/IdentityIcon/index.js +++ b/js/src/dapps/gavcoin/IdentityIcon/index.js @@ -1 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + export default from './identityIcon'; From dd3b6c2e9cd257e0f4dab11f30595574b391dd2f Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 26 Sep 2016 13:03:39 +0200 Subject: [PATCH 0811/1062] remove shortcut for non-valid input to decodeCallData --- js/src/api/util/decode.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/js/src/api/util/decode.js b/js/src/api/util/decode.js index 236292a9293..27d4a6d5c91 100644 --- a/js/src/api/util/decode.js +++ b/js/src/api/util/decode.js @@ -21,10 +21,6 @@ import Func from '../../abi/spec/function'; const CREATE_METHOD = '60606040'; export function decodeCallData (data) { - if (!data || !data.length) { - return {}; - } - if (!isHex(data)) { throw new Error('Input to decodeCallData should be a hex value'); } From d3e1bd34970189ac1f5e4d5e8147d4cf0fbf44cf Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 26 Sep 2016 13:16:46 +0200 Subject: [PATCH 0812/1062] add type checking for methodToAbi --- js/src/api/util/decode.js | 7 +++++-- js/src/api/util/decode.spec.js | 14 +++++--------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/js/src/api/util/decode.js b/js/src/api/util/decode.js index 27d4a6d5c91..0c5861262fb 100644 --- a/js/src/api/util/decode.js +++ b/js/src/api/util/decode.js @@ -17,6 +17,7 @@ import { isHex } from './types'; import Func from '../../abi/spec/function'; +import { fromParamType, toParamType } from '../../abi/spec/paramType/format'; const CREATE_METHOD = '60606040'; @@ -60,7 +61,7 @@ export function decodeMethodInput (methodAbi, paramdata) { return new Func(methodAbi).decodeInput(paramdata).map((decoded) => decoded.value); } -// takes a method in form name(..., types) and returns the interred abi definition +// takes a method in form name(...,types) and returns the inferred abi definition export function methodToAbi (method) { const length = method.length; const typesStart = method.indexOf('('); @@ -78,7 +79,9 @@ export function methodToAbi (method) { const name = method.substr(0, typesStart); const types = method.substr(typesStart + 1, length - (typesStart + 1) - 1).split(','); - const inputs = types.map((type) => { + const inputs = types.map((_type) => { + const type = fromParamType(toParamType(_type)); + return { type }; }); diff --git a/js/src/api/util/decode.spec.js b/js/src/api/util/decode.spec.js index 272ae753838..f31bfe0310c 100644 --- a/js/src/api/util/decode.spec.js +++ b/js/src/api/util/decode.spec.js @@ -35,14 +35,6 @@ describe('api/util/decode', () => { expect(() => decodeCallData(`${ENCO.slice(-32)}`)).to.throw(/not a multiple of/); }); - it('returns an empty object for ""', () => { - expect(decodeCallData('')).to.deep.equal({}); - }); - - it('returns an empty object for "0x"', () => { - expect(decodeCallData('0x')).to.deep.equal({}); - }); - it('splits valid inputs properly', () => { expect(decodeCallData(ENCO)).to.deep.equal({ signature: METH, @@ -95,12 +87,16 @@ describe('api/util/decode', () => { expect(() => methodToAbi('invalid)uint,bool(')).to.throw(/End \) is before start \(/); }); + it('throws when invalid types are present', () => { + expect(() => methodToAbi('method(invalidType,bool,uint)')).to.throw(/Cannot convert invalidType/); + }); + it('returns a valid methodabi for a valid method', () => { expect(methodToAbi('valid(uint,bool)')).to.deep.equals({ type: 'function', name: 'valid', inputs: [ - { type: 'uint' }, + { type: 'uint256' }, { type: 'bool' } ] }); From abda7027776ce19cc2d5da2fe140cf9e37ff5cb7 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 26 Sep 2016 14:09:54 +0200 Subject: [PATCH 0813/1062] small format display updates --- .../Account/Transactions/Transaction/transaction.js | 10 +++++++++- js/src/views/Account/Transactions/transactions.css | 5 +++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/js/src/views/Account/Transactions/Transaction/transaction.js b/js/src/views/Account/Transactions/Transaction/transaction.js index 162ad982c43..c7d623534a7 100644 --- a/js/src/views/Account/Transactions/Transaction/transaction.js +++ b/js/src/views/Account/Transactions/Transaction/transaction.js @@ -85,10 +85,18 @@ export default class Transaction extends Component { const prefix = `https://${isTest ? 'testnet.' : ''}etherscan.io/`; const hashLink = `${prefix}tx/${transaction.hash}`; + let token = ' '; + let value = ' '; + + if (transaction.value && transaction.value.gt(0)) { + token = ΞTH; + value = this.formatEther(transaction.value); + } + return (
      - { this.formatEther(transaction.value) }ΞTH + { value }{ token }
      ⇒
      diff --git a/js/src/views/Account/Transactions/transactions.css b/js/src/views/Account/Transactions/transactions.css index 7f1ab4783ff..81621aad099 100644 --- a/js/src/views/Account/Transactions/transactions.css +++ b/js/src/views/Account/Transactions/transactions.css @@ -31,6 +31,7 @@ .transactions table { width: 100%; + border-collapse: collapse; } .transactions tr { @@ -38,6 +39,10 @@ vertical-align: top; } +.transactions tr:nth-child(even) { + background: rgba(255, 255, 255, 0.05); +} + .transactions th { color: #aaa; text-align: center; From ed7cd7a9f0f7894a77c70698f2732bd10f69be4e Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Mon, 26 Sep 2016 13:17:50 +0100 Subject: [PATCH 0814/1062] Removing PropTypes on build // Simple express server to test builds (#2157) --- js/.babelrc | 14 ++++++++++++-- js/build-server.js | 18 ++++++++++++++++++ js/package.json | 1 + 3 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 js/build-server.js diff --git a/js/.babelrc b/js/.babelrc index b0b0d0ffa58..27c69788555 100644 --- a/js/.babelrc +++ b/js/.babelrc @@ -1,5 +1,15 @@ { "presets": ["es2017", "es2016", "es2015", "stage-0", "react"], - "plugins": ["transform-runtime", "transform-decorators-legacy", "transform-class-properties", "lodash"], - "retainLines": true + "plugins": [ + "transform-runtime", + "transform-decorators-legacy", + "transform-class-properties", + "lodash" + ], + "retainLines": true, + "env": { + "production": { + "plugins": ["transform-react-remove-prop-types"] + } + } } diff --git a/js/build-server.js b/js/build-server.js new file mode 100644 index 00000000000..0afc2e5ae52 --- /dev/null +++ b/js/build-server.js @@ -0,0 +1,18 @@ +var express = require('express'); +var proxy = require('http-proxy-middleware'); + +var app = express(); + +app.use(express.static('build')); + +app.use('/api/*', proxy({ + target: 'http://127.0.0.1:8080', + changeOrigin: true +})); + +app.use('/rpc/*', proxy({ + target: 'http://localhost:8080', + changeOrigin: true +})); + +app.listen(3000); diff --git a/js/package.json b/js/package.json index 40ae0dab74c..cc0b75af315 100644 --- a/js/package.json +++ b/js/package.json @@ -44,6 +44,7 @@ "babel-plugin-lodash": "^3.2.2", "babel-plugin-transform-class-properties": "^6.11.5", "babel-plugin-transform-decorators-legacy": "^1.3.4", + "babel-plugin-transform-react-remove-prop-types": "^0.2.9", "babel-plugin-transform-runtime": "^6.9.0", "babel-polyfill": "^6.13.0", "babel-preset-es2015": "^6.9.0", From 3cbf64692310453f33ca9bbea08d12d4c4b98e7e Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 26 Sep 2016 14:22:21 +0200 Subject: [PATCH 0815/1062] value & token formatting --- .../Transactions/Transaction/transaction.js | 18 +++++++++--------- .../Account/Transactions/transactions.css | 1 + 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/js/src/views/Account/Transactions/Transaction/transaction.js b/js/src/views/Account/Transactions/Transaction/transaction.js index c7d623534a7..7a32a8217c1 100644 --- a/js/src/views/Account/Transactions/Transaction/transaction.js +++ b/js/src/views/Account/Transactions/Transaction/transaction.js @@ -84,14 +84,7 @@ export default class Transaction extends Component { const prefix = `https://${isTest ? 'testnet.' : ''}etherscan.io/`; const hashLink = `${prefix}tx/${transaction.hash}`; - - let token = ' '; - let value = ' '; - - if (transaction.value && transaction.value.gt(0)) { - token = ΞTH; - value = this.formatEther(transaction.value); - } + const { value, token } = this.formatEther(transaction.value); return ( @@ -168,7 +161,14 @@ export default class Transaction extends Component { const { api } = this.context; const ether = api.util.fromWei(value); - return `${ether.toFormat(5)}`; + if (ether.eq(0)) { + return { value: null, token: null }; + } + + return { + value: `${ether.toFormat(5)}`, + token: ΞTH + }; } lookup (transaction) { diff --git a/js/src/views/Account/Transactions/transactions.css b/js/src/views/Account/Transactions/transactions.css index 81621aad099..a67a3255e9e 100644 --- a/js/src/views/Account/Transactions/transactions.css +++ b/js/src/views/Account/Transactions/transactions.css @@ -82,6 +82,7 @@ .transaction div { line-height: 1.25em; + min-height: 1.25em; } .icon { From ff6a1fc1d0831f5877281cecc1c609422a784e4d Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 26 Sep 2016 14:36:48 +0200 Subject: [PATCH 0816/1062] methods with monospace --- js/src/ui/MethodDecoding/methodDecoding.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/js/src/ui/MethodDecoding/methodDecoding.css b/js/src/ui/MethodDecoding/methodDecoding.css index 54d14e2ef9a..c84e8c1c723 100644 --- a/js/src/ui/MethodDecoding/methodDecoding.css +++ b/js/src/ui/MethodDecoding/methodDecoding.css @@ -16,6 +16,7 @@ */ .method { + font-family: 'Roboto Mono' !important; } .name { @@ -27,4 +28,5 @@ .input { margin-top: -14px; + font-family: inherit !important; } From a1ac6cfc3680479b706df223cdb62ab04c8a96f1 Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Mon, 26 Sep 2016 13:37:38 +0100 Subject: [PATCH 0817/1062] Working Proxy server // Vendors build fixed (#2157) --- js/build-server.js | 8 +++++++- js/src/index.js | 7 ++++++- js/webpack.config.js | 1 + js/webpack.vendor.js | 6 ++++++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/js/build-server.js b/js/build-server.js index 0afc2e5ae52..71017ee6e1c 100644 --- a/js/build-server.js +++ b/js/build-server.js @@ -1,3 +1,9 @@ +/** + * Run `PARITY_URL="127.0.0.1:8180" NODE_ENV="production" npm run build` + * to build the project ; use this server to test that the minifed + * version is working (this is a simple proxy server) + */ + var express = require('express'); var proxy = require('http-proxy-middleware'); @@ -11,7 +17,7 @@ app.use('/api/*', proxy({ })); app.use('/rpc/*', proxy({ - target: 'http://localhost:8080', + target: 'http://127.0.0.1:8080', changeOrigin: true })); diff --git a/js/src/index.js b/js/src/index.js index 1a4d9643065..9cc0d16dc9e 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -46,7 +46,12 @@ import './index.html'; injectTapEventPlugin(); const initToken = window.localStorage.getItem('sysuiToken'); -const parityUrl = process.env.NODE_ENV === 'production' ? window.location.host : '127.0.0.1:8180'; +const parityUrl = process.env.PARITY_URL || + ( + process.env.NODE_ENV === 'production' + ? window.location.host + : '127.0.0.1:8180' + ); const api = new Api(new Api.Transport.Ws(`ws://${parityUrl}`, initToken)); // new Api.Transport.Http('/rpc/')); diff --git a/js/webpack.config.js b/js/webpack.config.js index cd63c0d134a..1261a02bb29 100644 --- a/js/webpack.config.js +++ b/js/webpack.config.js @@ -139,6 +139,7 @@ module.exports = { 'process.env': { NODE_ENV: JSON.stringify(ENV), RPC_ADDRESS: JSON.stringify(process.env.RPC_ADDRESS), + PARITY_URL: JSON.stringify(process.env.PARITY_URL), LOGGING: JSON.stringify(!isProd) } }) diff --git a/js/webpack.vendor.js b/js/webpack.vendor.js index 749f93e8a84..a62fecb99e0 100644 --- a/js/webpack.vendor.js +++ b/js/webpack.vendor.js @@ -56,6 +56,12 @@ module.exports = { new webpack.DllPlugin({ name: '[name]_lib', path: 'build/[name]-manifest.json' + }), + + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: JSON.stringify(ENV) + } }) ]; From 4f5c509ce164b124a4ae292e21658dbfea5f8254 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Mon, 26 Sep 2016 14:44:30 +0200 Subject: [PATCH 0818/1062] registry: reducer returned invalid state `state.hasAccount` was missing. --- js/src/dapps/registry/records/reducer.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/js/src/dapps/registry/records/reducer.js b/js/src/dapps/registry/records/reducer.js index 173cec31666..a9a3ae37158 100644 --- a/js/src/dapps/registry/records/reducer.js +++ b/js/src/dapps/registry/records/reducer.js @@ -11,6 +11,7 @@ export default (state = initialState, action) => { if (action.type === 'records update start') { return { + ...state, pending: true, name: action.name, type: action.entry, value: action.value }; @@ -18,6 +19,7 @@ export default (state = initialState, action) => { if (action.type === 'records update error' && action.type === 'records update success') { return { + ...state, pending: false, name: initialState.name, type: initialState.type, value: initialState.value }; From 46b88a2b0d14a83bc192a57dc6de9648820b97a5 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Mon, 26 Sep 2016 15:10:03 +0200 Subject: [PATCH 0819/1062] registry: rename "register" to "names" --- .../dapps/registry/Application/application.js | 8 ++++---- js/src/dapps/registry/Container.js | 2 +- js/src/dapps/registry/actions.js | 4 ++-- .../registry/{register => names}/actions.js | 10 +++++----- .../registry/{register => names}/index.js | 2 +- .../{register/register.css => names/names.css} | 2 +- .../{register/register.js => names/names.js} | 18 +++++++++--------- .../registry/{register => names}/reducers.js | 6 +++--- js/src/dapps/registry/reducers.js | 6 +++--- 9 files changed, 29 insertions(+), 29 deletions(-) rename js/src/dapps/registry/{register => names}/actions.js (82%) rename js/src/dapps/registry/{register => names}/index.js (94%) rename js/src/dapps/registry/{register/register.css => names/names.css} (98%) rename js/src/dapps/registry/{register/register.js => names/names.js} (83%) rename js/src/dapps/registry/{register => names}/reducers.js (90%) diff --git a/js/src/dapps/registry/Application/application.js b/js/src/dapps/registry/Application/application.js index 7fc65b7051b..1ebb7594aea 100644 --- a/js/src/dapps/registry/Application/application.js +++ b/js/src/dapps/registry/Application/application.js @@ -24,7 +24,7 @@ import CircularProgress from 'material-ui/CircularProgress'; import styles from './application.css'; import Accounts from '../accounts'; import Lookup from '../Lookup'; -import Register from '../register'; +import Names from '../names'; import Events from '../events'; const nullable = (type) => React.PropTypes.oneOfType([ React.PropTypes.oneOf([ null ]), type ]); @@ -46,7 +46,7 @@ export default class Application extends Component { fee: nullable(PropTypes.object.isRequired), lookup: PropTypes.object.isRequired, events: PropTypes.object.isRequired, - register: PropTypes.object.isRequired + names: PropTypes.object.isRequired }; render () { @@ -56,7 +56,7 @@ export default class Application extends Component { contract, fee, lookup, events, - register + names } = this.props; return ( @@ -68,7 +68,7 @@ export default class Application extends Component { { contract && fee ? (
      - +

      The Registry is provided by the contract at { contract.address }. diff --git a/js/src/dapps/registry/Container.js b/js/src/dapps/registry/Container.js index 4bf738bf8ba..abdec418b89 100644 --- a/js/src/dapps/registry/Container.js +++ b/js/src/dapps/registry/Container.js @@ -55,7 +55,7 @@ export default connect( bound.accounts = bindActionCreators(actions.accounts, dispatch); bound.lookup = bindActionCreators(actions.lookup, dispatch); bound.events = bindActionCreators(actions.events, dispatch); - bound.register = bindActionCreators(actions.register, dispatch); + bound.names = bindActionCreators(actions.names, dispatch); return { actions: bound }; } )(Container); diff --git a/js/src/dapps/registry/actions.js b/js/src/dapps/registry/actions.js index 27b13c0a601..d3b4f5858fc 100644 --- a/js/src/dapps/registry/actions.js +++ b/js/src/dapps/registry/actions.js @@ -21,9 +21,9 @@ import * as addresses from './addresses/actions.js'; import * as accounts from './accounts/actions.js'; import * as lookup from './Lookup/actions.js'; import * as events from './events/actions.js'; -import * as register from './register/actions.js'; +import * as names from './names/actions.js'; -export { addresses, accounts, lookup, events, register }; +export { addresses, accounts, lookup, events, names }; export const setContract = (contract) => ({ type: 'set contract', contract }); diff --git a/js/src/dapps/registry/register/actions.js b/js/src/dapps/registry/names/actions.js similarity index 82% rename from js/src/dapps/registry/register/actions.js rename to js/src/dapps/registry/names/actions.js index bb6fc37b28d..842baf51b8b 100644 --- a/js/src/dapps/registry/register/actions.js +++ b/js/src/dapps/registry/names/actions.js @@ -16,18 +16,18 @@ import { sha3, toWei } from '../parity.js'; -export const start = (name) => ({ type: 'register start', name }); +export const start = (name) => ({ type: 'reserve start', name }); -export const success = (name) => ({ type: 'register success', name }); +export const success = (name) => ({ type: 'reserve success', name }); -export const fail = (name) => ({ type: 'register fail', name }); +export const fail = (name) => ({ type: 'reserve fail', name }); -export const register = (name) => (dispatch, getState) => { +export const reserve = (name) => (dispatch, getState) => { const state = getState(); const account = state.accounts.selected; const contract = state.contract; if (!contract || !account) return; - if (state.register.posted.includes(name)) return; + if (state.names.posted.includes(name)) return; const reserve = contract.functions.find((f) => f.name === 'reserve'); name = name.toLowerCase(); diff --git a/js/src/dapps/registry/register/index.js b/js/src/dapps/registry/names/index.js similarity index 94% rename from js/src/dapps/registry/register/index.js rename to js/src/dapps/registry/names/index.js index 51a9e1eb4b0..26195de8848 100644 --- a/js/src/dapps/registry/register/index.js +++ b/js/src/dapps/registry/names/index.js @@ -14,4 +14,4 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -export default from './register.js'; +export default from './names.js'; diff --git a/js/src/dapps/registry/register/register.css b/js/src/dapps/registry/names/names.css similarity index 98% rename from js/src/dapps/registry/register/register.css rename to js/src/dapps/registry/names/names.css index 9f7b7efbd9e..a058d41ac0e 100644 --- a/js/src/dapps/registry/register/register.css +++ b/js/src/dapps/registry/names/names.css @@ -15,7 +15,7 @@ /* along with Parity. If not, see . */ -.register { +.names { margin: 1em; } diff --git a/js/src/dapps/registry/register/register.js b/js/src/dapps/registry/names/names.js similarity index 83% rename from js/src/dapps/registry/register/register.js rename to js/src/dapps/registry/names/names.js index ba7bfebacf8..0478bc8845b 100644 --- a/js/src/dapps/registry/register/register.js +++ b/js/src/dapps/registry/names/names.js @@ -22,9 +22,9 @@ import CheckIcon from 'material-ui/svg-icons/navigation/check'; import { fromWei } from '../parity.js'; -import styles from './register.css'; +import styles from './names.css'; -export default class Register extends Component { +export default class Names extends Component { static propTypes = { actions: PropTypes.object.isRequired, @@ -41,12 +41,12 @@ export default class Register extends Component { const { fee, hasAccount, pending, posted } = this.props; return ( - - + + { !hasAccount ? (

      Please select an account first.

      ) - : (

      The registration fee is { fromWei(fee).toFixed(3) }ΞTH.

      ) + : (

      The fee to reserve a name is { fromWei(fee).toFixed(3) }ΞTH.

      ) } } - onClick={ this.onRegisterClick } + onClick={ this.onReserveClick } /> { posted.map((name) => (

      @@ -74,7 +74,7 @@ export default class Register extends Component { onNameChange = (e) => { this.setState({ name: e.target.value }); }; - onRegisterClick = () => { - this.props.actions.register(this.state.name); + onReserveClick = () => { + this.props.actions.reserve(this.state.name); }; } diff --git a/js/src/dapps/registry/register/reducers.js b/js/src/dapps/registry/names/reducers.js similarity index 90% rename from js/src/dapps/registry/register/reducers.js rename to js/src/dapps/registry/names/reducers.js index 4f2b15c0488..b62b8e0c282 100644 --- a/js/src/dapps/registry/register/reducers.js +++ b/js/src/dapps/registry/names/reducers.js @@ -25,16 +25,16 @@ export default (state = initialState, action) => { return { ...state, hasAccount: !!action.address }; } - if (action.type === 'register start') { + if (action.type === 'reserve start') { return { ...state, pending: true }; } - if (action.type === 'register success') { + if (action.type === 'reserve success') { return { ...state, pending: false, posted: state.posted.concat(action.name) }; } - if (action.type === 'register fail') { + if (action.type === 'reserve fail') { return { ...state, pending: false }; } diff --git a/js/src/dapps/registry/reducers.js b/js/src/dapps/registry/reducers.js index d89c407f385..0183d53eecd 100644 --- a/js/src/dapps/registry/reducers.js +++ b/js/src/dapps/registry/reducers.js @@ -18,7 +18,7 @@ import accountsReducer from './addresses/accounts-reducer.js'; import contactsReducer from './addresses/contacts-reducer.js'; import lookupReducer from './Lookup/reducers.js'; import eventsReducer from './events/reducers.js'; -import registerReducer from './register/reducers.js'; +import namesReducer from './names/reducers.js'; const contractReducer = (state = null, action) => action.type === 'set contract' ? action.contract : state; @@ -37,7 +37,7 @@ const initialState = { owner: ownerReducer(undefined, { type: '' }), lookup: lookupReducer(undefined, { type: '' }), events: eventsReducer(undefined, { type: '' }), - register: registerReducer(undefined, { type: '' }) + names: namesReducer(undefined, { type: '' }) }; export default (state = initialState, action) => ({ @@ -48,5 +48,5 @@ export default (state = initialState, action) => ({ owner: ownerReducer(state.owner, action), lookup: lookupReducer(state.lookup, action), events: eventsReducer(state.events, action), - register: registerReducer(state.register, action) + names: namesReducer(state.names, action) }); From a3a608a720bb8738208fb0ec751a47b68ea4e631 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Mon, 26 Sep 2016 15:21:54 +0200 Subject: [PATCH 0820/1062] registry: prepare for new actions --- js/src/dapps/registry/names/actions.js | 14 +++++++------- js/src/dapps/registry/names/names.js | 10 +++++----- js/src/dapps/registry/names/reducers.js | 10 +++++----- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/js/src/dapps/registry/names/actions.js b/js/src/dapps/registry/names/actions.js index 842baf51b8b..bd0aa022f3c 100644 --- a/js/src/dapps/registry/names/actions.js +++ b/js/src/dapps/registry/names/actions.js @@ -16,18 +16,18 @@ import { sha3, toWei } from '../parity.js'; -export const start = (name) => ({ type: 'reserve start', name }); +export const reserveStart = (name) => ({ type: 'names reserve start', name }); -export const success = (name) => ({ type: 'reserve success', name }); +export const reserveSuccess = (name) => ({ type: 'names reserve success', name }); -export const fail = (name) => ({ type: 'reserve fail', name }); +export const reserveFail = (name) => ({ type: 'names reserve fail', name }); export const reserve = (name) => (dispatch, getState) => { const state = getState(); const account = state.accounts.selected; const contract = state.contract; if (!contract || !account) return; - if (state.names.posted.includes(name)) return; + if (state.names.reserved.includes(name)) return; const reserve = contract.functions.find((f) => f.name === 'reserve'); name = name.toLowerCase(); @@ -37,17 +37,17 @@ export const reserve = (name) => (dispatch, getState) => { }; const values = [ sha3(name) ]; - dispatch(start(name)); + dispatch(reserveStart(name)); reserve.estimateGas(options, values) .then((gas) => { options.gas = gas.mul(1.2).toFixed(0); return reserve.postTransaction(options, values); }) .then((data) => { - dispatch(success(name)); + dispatch(reserveSuccess(name)); }).catch((err) => { console.error(`could not reserve ${name}`); if (err) console.error(err.stack); - dispatch(fail(name)); + dispatch(reserveFail(name)); }); }; diff --git a/js/src/dapps/registry/names/names.js b/js/src/dapps/registry/names/names.js index 0478bc8845b..1f199c264fe 100644 --- a/js/src/dapps/registry/names/names.js +++ b/js/src/dapps/registry/names/names.js @@ -31,14 +31,14 @@ export default class Names extends Component { fee: PropTypes.object.isRequired, hasAccount: PropTypes.bool.isRequired, pending: PropTypes.bool.isRequired, - posted: PropTypes.array.isRequired + reserved: PropTypes.array.isRequired } state = { name: '' }; render () { const { name } = this.state; - const { fee, hasAccount, pending, posted } = this.props; + const { fee, hasAccount, pending, reserved } = this.props; return ( @@ -59,9 +59,9 @@ export default class Names extends Component { label='Reserve' primary icon={ } - onClick={ this.onReserveClick } + onClick={ this.onSubmitClick } /> - { posted.map((name) => ( + { reserved.map((name) => (

      Please use the Signer to authenticate the registration of { name }.

      @@ -74,7 +74,7 @@ export default class Names extends Component { onNameChange = (e) => { this.setState({ name: e.target.value }); }; - onReserveClick = () => { + onSubmitClick = () => { this.props.actions.reserve(this.state.name); }; } diff --git a/js/src/dapps/registry/names/reducers.js b/js/src/dapps/registry/names/reducers.js index b62b8e0c282..0e8dac74e3f 100644 --- a/js/src/dapps/registry/names/reducers.js +++ b/js/src/dapps/registry/names/reducers.js @@ -17,7 +17,7 @@ const initialState = { hasAccount: false, pending: false, - posted: [] + reserved: [] }; export default (state = initialState, action) => { @@ -25,16 +25,16 @@ export default (state = initialState, action) => { return { ...state, hasAccount: !!action.address }; } - if (action.type === 'reserve start') { + if (action.type === 'names reserve start') { return { ...state, pending: true }; } - if (action.type === 'reserve success') { + if (action.type === 'names reserve success') { return { ...state, pending: false, - posted: state.posted.concat(action.name) + reserved: state.reserved.concat(action.name) }; } - if (action.type === 'reserve fail') { + if (action.type === 'names reserve fail') { return { ...state, pending: false }; } From 38621d45cd03c48dc6b20f7b1ab6c3ff0776fd5b Mon Sep 17 00:00:00 2001 From: Jannis R Date: Mon, 26 Sep 2016 15:39:30 +0200 Subject: [PATCH 0821/1062] registry: actions & reducers for dropping names --- js/src/dapps/registry/names/actions.js | 33 +++++++++++++++++++++++++ js/src/dapps/registry/names/reducers.js | 16 +++++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/js/src/dapps/registry/names/actions.js b/js/src/dapps/registry/names/actions.js index bd0aa022f3c..33b1ee6b470 100644 --- a/js/src/dapps/registry/names/actions.js +++ b/js/src/dapps/registry/names/actions.js @@ -51,3 +51,36 @@ export const reserve = (name) => (dispatch, getState) => { dispatch(reserveFail(name)); }); }; + +export const dropStart = (name) => ({ type: 'names drop start', name }); + +export const dropSuccess = (name) => ({ type: 'names drop success', name }); + +export const dropFail = (name) => ({ type: 'names drop fail', name }); + +export const drop = (name) => (dispatch, getState) => { + const state = getState(); + const account = state.accounts.selected; + const contract = state.contract; + if (!contract || !account) return; + if (state.names.dropped.includes(name)) return; + const drop = contract.functions.find((f) => f.name === 'drop'); + + name = name.toLowerCase(); + const options = { from: account.address }; + const values = [ sha3(name) ]; + + dispatch(dropStart(name)); + drop.estimateGas(options, values) + .then((gas) => { + options.gas = gas.mul(1.2).toFixed(0); + return drop.postTransaction(options, values); + }) + .then((data) => { + dispatch(dropSuccess(name)); + }).catch((err) => { + console.error(`could not drop ${name}`); + if (err) console.error(err.stack); + dispatch(reserveFail(name)); + }); +}; diff --git a/js/src/dapps/registry/names/reducers.js b/js/src/dapps/registry/names/reducers.js index 0e8dac74e3f..d8d87c648c1 100644 --- a/js/src/dapps/registry/names/reducers.js +++ b/js/src/dapps/registry/names/reducers.js @@ -17,7 +17,8 @@ const initialState = { hasAccount: false, pending: false, - reserved: [] + reserved: [], + dropped: [] }; export default (state = initialState, action) => { @@ -38,5 +39,18 @@ export default (state = initialState, action) => { return { ...state, pending: false }; } + if (action.type === 'names drop start') { + return { ...state, pending: true }; + } + if (action.type === 'names drop success') { + return { + ...state, pending: false, + dropped: state.dropped.concat(action.name) + }; + } + if (action.type === 'names drop fail') { + return { ...state, pending: false }; + } + return state; }; From c423f8395fb14ea9b2cca5f3ce1fef105cfdc874 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Mon, 26 Sep 2016 15:39:46 +0200 Subject: [PATCH 0822/1062] registry: component for dropping names --- js/src/dapps/registry/names/names.js | 44 +++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/js/src/dapps/registry/names/names.js b/js/src/dapps/registry/names/names.js index 1f199c264fe..43c182b539a 100644 --- a/js/src/dapps/registry/names/names.js +++ b/js/src/dapps/registry/names/names.js @@ -17,6 +17,8 @@ import React, { Component, PropTypes } from 'react'; import { Card, CardHeader, CardText } from 'material-ui/Card'; import TextField from 'material-ui/TextField'; +import DropDownMenu from 'material-ui/DropDownMenu'; +import MenuItem from 'material-ui/MenuItem'; import RaisedButton from 'material-ui/RaisedButton'; import CheckIcon from 'material-ui/svg-icons/navigation/check'; @@ -31,14 +33,18 @@ export default class Names extends Component { fee: PropTypes.object.isRequired, hasAccount: PropTypes.bool.isRequired, pending: PropTypes.bool.isRequired, - reserved: PropTypes.array.isRequired + reserved: PropTypes.array.isRequired, + dropped: PropTypes.array.isRequired } - state = { name: '' }; + state = { + action: 'reserve', + name: '' + }; render () { - const { name } = this.state; - const { fee, hasAccount, pending, reserved } = this.props; + const { action, name } = this.state; + const { fee, hasAccount, pending, reserved, dropped } = this.props; return ( @@ -46,13 +52,24 @@ export default class Names extends Component { { !hasAccount ? (

      Please select an account first.

      ) - : (

      The fee to reserve a name is { fromWei(fee).toFixed(3) }ΞTH.

      ) + : (

      + The fee to reserve a name is { fromWei(fee).toFixed(3) }ΞTH. + To drop a name, you have to be the owner. +

      ) } + + + + { reserved.map((name) => (

      - Please use the Signer to authenticate the registration of { name }. + Please use the Signer to authenticate reserving { name }. +

      + )) } + { dropped.map((name) => ( +

      + Please use the Signer to authenticate dropping { name }.

      )) }
      @@ -74,7 +96,15 @@ export default class Names extends Component { onNameChange = (e) => { this.setState({ name: e.target.value }); }; + onActionChange = (e, i, action) => { + this.setState({ action }); + }; onSubmitClick = () => { - this.props.actions.reserve(this.state.name); + const { action, name } = this.state; + if (action === 'reserve') { + this.props.actions.reserve(name); + } else if (action === 'drop') { + this.props.actions.drop(name); + } }; } From 7881edce3dfff944d75528168110dfa46edec5c2 Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Mon, 26 Sep 2016 15:03:55 +0100 Subject: [PATCH 0823/1062] Added date field to Signer requests // Display it in request details (#2283) --- .../RequestFinishedWeb3.js | 4 +- .../RequestPendingWeb3/RequestPendingWeb3.js | 4 +- .../TransactionFinished.js | 15 +- .../TransactionPending/TransactionPending.css | 68 ------- .../TransactionPending/TransactionPending.js | 103 ++--------- .../TransactionPendingWeb3.js | 4 +- .../TransactionSecondaryDetails.css | 70 +++++++ .../TransactionSecondaryDetails.js | 173 ++++++++++++++++++ .../TransactionSecondaryDetails/index.js | 1 + .../Signer/containers/Embedded/embedded.js | 2 +- .../containers/RequestsPage/RequestsPage.js | 6 +- js/src/views/Signer/reducers/requests.js | 7 +- 12 files changed, 291 insertions(+), 166 deletions(-) create mode 100644 js/src/views/Signer/components/TransactionSecondaryDetails/TransactionSecondaryDetails.css create mode 100644 js/src/views/Signer/components/TransactionSecondaryDetails/TransactionSecondaryDetails.js create mode 100644 js/src/views/Signer/components/TransactionSecondaryDetails/index.js diff --git a/js/src/views/Signer/components/RequestFinishedWeb3/RequestFinishedWeb3.js b/js/src/views/Signer/components/RequestFinishedWeb3/RequestFinishedWeb3.js index 9f42175c741..9f939aed5fe 100644 --- a/js/src/views/Signer/components/RequestFinishedWeb3/RequestFinishedWeb3.js +++ b/js/src/views/Signer/components/RequestFinishedWeb3/RequestFinishedWeb3.js @@ -29,6 +29,7 @@ class RequestFinishedWeb3 extends Component { static propTypes = { id: PropTypes.string.isRequired, result: PropTypes.any.isRequired, + date: PropTypes.instanceOf(Date).isRequired, payload: PropTypes.oneOfType([ PropTypes.shape({ transaction: PropTypes.object.isRequired }), PropTypes.shape({ sign: PropTypes.object.isRequired }) @@ -40,7 +41,7 @@ class RequestFinishedWeb3 extends Component { } render () { - const { payload, id, result, msg, status, error, className } = this.props; + const { payload, id, result, msg, status, error, date, className } = this.props; if (payload.sign) { const { sign } = payload; @@ -72,6 +73,7 @@ class RequestFinishedWeb3 extends Component { to={ transaction.to } value={ transaction.value } msg={ msg } + date={ date } status={ status } error={ error } /> diff --git a/js/src/views/Signer/components/RequestPendingWeb3/RequestPendingWeb3.js b/js/src/views/Signer/components/RequestPendingWeb3/RequestPendingWeb3.js index e2052031992..3e6b8d36e0c 100644 --- a/js/src/views/Signer/components/RequestPendingWeb3/RequestPendingWeb3.js +++ b/js/src/views/Signer/components/RequestPendingWeb3/RequestPendingWeb3.js @@ -30,6 +30,7 @@ class RequestPendingWeb3 extends Component { onConfirm: PropTypes.func.isRequired, onReject: PropTypes.func.isRequired, isSending: PropTypes.bool.isRequired, + date: PropTypes.instanceOf(Date).isRequired, payload: PropTypes.oneOfType([ PropTypes.shape({ transaction: PropTypes.object.isRequired }), PropTypes.shape({ sign: PropTypes.object.isRequired }) @@ -38,7 +39,7 @@ class RequestPendingWeb3 extends Component { }; render () { - const { payload, id, className, isSending, onConfirm, onReject } = this.props; + const { payload, id, className, isSending, date, onConfirm, onReject } = this.props; if (payload.sign) { const { sign } = payload; @@ -71,6 +72,7 @@ class RequestPendingWeb3 extends Component { from={ transaction.from } to={ transaction.to } value={ transaction.value } + date={ date } /> ); } diff --git a/js/src/views/Signer/components/TransactionFinished/TransactionFinished.js b/js/src/views/Signer/components/TransactionFinished/TransactionFinished.js index 7e9249b1b14..bba9856f06d 100644 --- a/js/src/views/Signer/components/TransactionFinished/TransactionFinished.js +++ b/js/src/views/Signer/components/TransactionFinished/TransactionFinished.js @@ -15,9 +15,14 @@ // along with Parity. If not, see . import React, { Component, PropTypes } from 'react'; +import ReactTooltip from 'react-tooltip'; +import TimeIcon from 'material-ui/svg-icons/device/access-time'; +import moment from 'moment'; import TransactionMainDetails from '../TransactionMainDetails'; import TxHashLink from '../TxHashLink'; +import TransactionSecondaryDetails from '../TransactionSecondaryDetails'; + import styles from './TransactionFinished.css'; import * as tUtil from '../util/transaction'; @@ -34,6 +39,7 @@ export default class TransactionFinished extends Component { gasPrice: PropTypes.string.isRequired, // wei hex gas: PropTypes.string.isRequired, // hex status: PropTypes.string.isRequired, // rejected, confirmed + date: PropTypes.instanceOf(Date).isRequired, to: PropTypes.string, // undefined if it's a contract toBalance: PropTypes.object, // eth BigNumber - undefined if it's a contract or until it's fetched txHash: PropTypes.string, // undefined if transacation is rejected @@ -53,7 +59,7 @@ export default class TransactionFinished extends Component { } render () { - const { className } = this.props; + const { className, date, id } = this.props; const { totalValue } = this.state; return ( @@ -63,7 +69,12 @@ export default class TransactionFinished extends Component { { ...this.props } totalValue={ totalValue } className={ styles.transactionDetails } - /> + > + +
      { this.renderStatus() }
      diff --git a/js/src/views/Signer/components/TransactionPending/TransactionPending.css b/js/src/views/Signer/components/TransactionPending/TransactionPending.css index fd8bc51295e..16fd7c7b87e 100644 --- a/js/src/views/Signer/components/TransactionPending/TransactionPending.css +++ b/js/src/views/Signer/components/TransactionPending/TransactionPending.css @@ -35,23 +35,6 @@ min-height: 120px; } -.iconsContainer { - display: block; - text-align: center; - font-size: .8em; - opacity: 0.5; - padding: 1em 0 0 0; -} - -.iconsContainer > * { - margin-right: 3px; - display: inline-block; -} - -.iconsContainer:after { - clear: both; -} - .inputs { margin-right: 30px; margin-left: 30px; @@ -59,54 +42,3 @@ position: relative; top: -15px; /* due to material ui weird styling */ } - -.hasInfoIcon svg, -.miningTime svg, -.gasPrice svg, -.data svg { - width: 16px !important; - height: 16px !important; - position: relative; - bottom: -3px; -} - -/* TODO [ToDr] composes was handling weird errors when linking from other app */ -.miningTime { - /* composes: hasInfoIcon; */ -} - -.gasPrice { - /* composes: hasInfoIcon; */ -} - -.data { - /* composes: hasInfoIcon; */ - cursor: pointer; -} - -.data.noData { - cursor: text; -} - - -.dataTooltip { - word-wrap: break-word; - max-width: 400px; -} - -.expandedData { - display: block; - padding: 15px; - background: gray; - word-wrap: break-word; - color: #fff; -} - -.expandedContainer { - padding: 10px; - border-radius: 4px; -} - -.expandedContainer:empty { - padding: 0; -} diff --git a/js/src/views/Signer/components/TransactionPending/TransactionPending.js b/js/src/views/Signer/components/TransactionPending/TransactionPending.js index 3b1897350fd..a0832460c10 100644 --- a/js/src/views/Signer/components/TransactionPending/TransactionPending.js +++ b/js/src/views/Signer/components/TransactionPending/TransactionPending.js @@ -16,11 +16,10 @@ import React, { Component, PropTypes } from 'react'; -import ReactTooltip from 'react-tooltip'; -import DescriptionIcon from 'material-ui/svg-icons/action/description'; -import GasIcon from 'material-ui/svg-icons/maps/local-gas-station'; import TransactionMainDetails from '../TransactionMainDetails'; import TransactionPendingForm from '../TransactionPendingForm'; +import TransactionSecondaryDetails from '../TransactionSecondaryDetails'; + import styles from './TransactionPending.css'; import * as tUtil from '../util/transaction'; @@ -35,6 +34,7 @@ export default class TransactionPending extends Component { value: PropTypes.string.isRequired, // wei hex gasPrice: PropTypes.string.isRequired, // wei hex gas: PropTypes.string.isRequired, // hex + date: PropTypes.instanceOf(Date).isRequired, to: PropTypes.string, // undefined if it's a contract toBalance: PropTypes.object, // eth BigNumber - undefined if it's a contract or until it's fetched data: PropTypes.string, // hex @@ -65,6 +65,10 @@ export default class TransactionPending extends Component { render () { const { totalValue } = this.state; const className = this.props.className || ''; + + const { gasPriceEthmDisplay, gasToDisplay } = this.state; + const { id, date, data } = this.props; + return (
      @@ -72,13 +76,13 @@ export default class TransactionPending extends Component { { ...this.props } className={ styles.transactionDetails } totalValue={ totalValue }> -
      - { this.renderGasPrice() } - { this.renderData() } -
      -
      - { this.renderDataExpanded() } -
      + - - - { gasPriceEthmDisplay } ETH/MGAS - - { /* dynamic id required in case there are multple transactions in page */ } - - Cost of 1,000,000 units of gas. This transaction will use up to { gasToDisplay } MGAS. - -
      - ); - } - - renderData () { - const { data, id } = this.props; - let dataToDisplay = this.noData() ? 'no data' : tUtil.getShortData(data); - const noDataClass = this.noData() ? styles.noData : ''; - return ( -
      - - { dataToDisplay } - { /* dynamic id required in case there are multple transactions in page */ } - - Extra data for the transaction: -
      - { dataToDisplay }. -
      - { this.noData() ? '' : Click to expand. } -
      -
      - ); - } - - renderDataExpanded () { - const { isDataExpanded } = this.state; - const { data } = this.props; - - if (!isDataExpanded) { - return; - } - - return ( -
      -

      Transaction's Data

      - { data } -
      - ); - } - - noData () { - return this.props.data === '0x'; - } - - toggleDataExpanded = () => { - if (this.noData()) { - return; - } - this.setState({ - isDataExpanded: !this.state.isDataExpanded - }); - } - onConfirm = password => { const { id, gasPrice } = this.props; this.props.onConfirm({ id, password, gasPrice }); diff --git a/js/src/views/Signer/components/TransactionPendingWeb3/TransactionPendingWeb3.js b/js/src/views/Signer/components/TransactionPendingWeb3/TransactionPendingWeb3.js index 6b51892d9dc..2e95d7e38a8 100644 --- a/js/src/views/Signer/components/TransactionPendingWeb3/TransactionPendingWeb3.js +++ b/js/src/views/Signer/components/TransactionPendingWeb3/TransactionPendingWeb3.js @@ -34,6 +34,7 @@ class TransactionPendingWeb3 extends Component { onConfirm: PropTypes.func.isRequired, onReject: PropTypes.func.isRequired, isSending: PropTypes.bool.isRequired, + date: PropTypes.instanceOf(Date).isRequired, to: PropTypes.string, // undefined if it's a contract data: PropTypes.string, // hex nonce: PropTypes.number, @@ -49,7 +50,7 @@ class TransactionPendingWeb3 extends Component { render () { const { web3 } = this.context; const { fromBalance, toBalance, chain } = this.state; - let { from, to } = this.props; + let { from, to, date } = this.props; from = web3.toChecksumAddress(from); to = to ? web3.toChecksumAddress(to) : to; @@ -62,6 +63,7 @@ class TransactionPendingWeb3 extends Component { fromBalance={ fromBalance } toBalance={ toBalance } chain={ chain } + date={ date } /> ); } diff --git a/js/src/views/Signer/components/TransactionSecondaryDetails/TransactionSecondaryDetails.css b/js/src/views/Signer/components/TransactionSecondaryDetails/TransactionSecondaryDetails.css new file mode 100644 index 00000000000..3504c70289c --- /dev/null +++ b/js/src/views/Signer/components/TransactionSecondaryDetails/TransactionSecondaryDetails.css @@ -0,0 +1,70 @@ +.iconsContainer { + display: block; + text-align: center; + font-size: .8em; + opacity: 0.5; + padding: 1em 0 0 0; +} + +.iconsContainer > * { + margin-right: 3px; + display: inline-block; +} + +.iconsContainer:after { + clear: both; +} + +.hasInfoIcon svg, +.miningTime svg, +.gasPrice svg, +.data svg, +.date svg { + width: 16px !important; + height: 16px !important; + position: relative; + bottom: -3px; + margin: 0 0.25rem 0 0.75rem; +} + +/* TODO [ToDr] composes was handling weird errors when linking from other app */ +.miningTime { + /* composes: hasInfoIcon; */ +} + +.gasPrice { + /* composes: hasInfoIcon; */ +} + +.data { + /* composes: hasInfoIcon; */ + cursor: pointer; +} + +.data.noData { + cursor: text; +} + + +.dataTooltip { + word-wrap: break-word; + max-width: 400px; +} + +.expandedData { + display: block; + padding: 15px; + background: gray; + word-wrap: break-word; + color: #fff; +} + +.expandedContainer { + padding: 10px; + border-radius: 4px; +} + +.expandedContainer:empty { + padding: 0; +} + diff --git a/js/src/views/Signer/components/TransactionSecondaryDetails/TransactionSecondaryDetails.js b/js/src/views/Signer/components/TransactionSecondaryDetails/TransactionSecondaryDetails.js new file mode 100644 index 00000000000..577ee074a6a --- /dev/null +++ b/js/src/views/Signer/components/TransactionSecondaryDetails/TransactionSecondaryDetails.js @@ -0,0 +1,173 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import ReactTooltip from 'react-tooltip'; +import DescriptionIcon from 'material-ui/svg-icons/action/description'; +import GasIcon from 'material-ui/svg-icons/maps/local-gas-station'; +import TimeIcon from 'material-ui/svg-icons/device/access-time'; +import moment from 'moment'; + +import styles from './TransactionSecondaryDetails.css'; + +import * as tUtil from '../util/transaction'; + +export default class TransactionSecondaryDetails extends Component { + + static propTypes = { + id: PropTypes.string.isRequired, + date: PropTypes.instanceOf(Date), + data: PropTypes.string, // hex + gasPriceEthmDisplay: PropTypes.string, + gasToDisplay: PropTypes.string, + className: PropTypes.string + }; + + state = { + isDataExpanded: false + }; + + render () { + const className = this.props.className || ''; + + return ( +
      +
      + { this.renderGasPrice() } + { this.renderData() } + { this.renderDate() } +
      +
      + { this.renderDataExpanded() } +
      +
      + ); + } + + renderGasPrice () { + if (!this.props.gasPriceEthmDisplay && !this.props.gasToDisplay) return null; + + const { id } = this.props; + const { gasPriceEthmDisplay, gasToDisplay } = this.props; + return ( +
      + + + { gasPriceEthmDisplay } ETH/MGAS + + { /* dynamic id required in case there are multple transactions in page */ } + + Cost of 1,000,000 units of gas. This transaction will use up to { gasToDisplay } MGAS. + +
      + ); + } + + renderData () { + if (!this.props.data) return null; + + const { data, id } = this.props; + let dataToDisplay = this.noData() ? 'no data' : tUtil.getShortData(data); + const noDataClass = this.noData() ? styles.noData : ''; + return ( +
      + + { dataToDisplay } + { /* dynamic id required in case there are multple transactions in page */ } + + Extra data for the transaction: +
      + { dataToDisplay }. +
      + { this.noData() ? '' : Click to expand. } +
      +
      + ); + } + + renderDate () { + const { date, id } = this.props; + + const dateToDisplay = moment(date).fromNow(); + const fullDate = moment(date).format('LL LTS'); + + return ( +
      + + { dateToDisplay } + { /* dynamic id required in case there are multple transactions in page */ } + + Date of the request: +
      + { fullDate } +
      +
      + ); + } + + renderDataExpanded () { + if (!this.props.data) return null; + + const { isDataExpanded } = this.state; + const { data } = this.props; + + if (!isDataExpanded) { + return; + } + + return ( +
      +

      Transaction's Data

      + { data } +
      + ); + } + + noData () { + return this.props.data === '0x'; + } + + toggleDataExpanded = () => { + if (this.noData()) { + return; + } + this.setState({ + isDataExpanded: !this.state.isDataExpanded + }); + } + +} diff --git a/js/src/views/Signer/components/TransactionSecondaryDetails/index.js b/js/src/views/Signer/components/TransactionSecondaryDetails/index.js new file mode 100644 index 00000000000..4b352c41a2a --- /dev/null +++ b/js/src/views/Signer/components/TransactionSecondaryDetails/index.js @@ -0,0 +1 @@ +export default from './TransactionSecondaryDetails'; diff --git a/js/src/views/Signer/containers/Embedded/embedded.js b/js/src/views/Signer/containers/Embedded/embedded.js index a55739ddab4..33118837fb3 100644 --- a/js/src/views/Signer/containers/Embedded/embedded.js +++ b/js/src/views/Signer/containers/Embedded/embedded.js @@ -23,7 +23,7 @@ import { Container } from '../../../../ui'; import { RequestPendingWeb3 } from '../../components'; import * as RequestsActions from '../../actions/requests'; -import styles from './embedded.js'; +import styles from './embedded.css'; class Embedded extends Component { static propTypes = { diff --git a/js/src/views/Signer/containers/RequestsPage/RequestsPage.js b/js/src/views/Signer/containers/RequestsPage/RequestsPage.js index dcbb443708c..f3af974a78f 100644 --- a/js/src/views/Signer/containers/RequestsPage/RequestsPage.js +++ b/js/src/views/Signer/containers/RequestsPage/RequestsPage.js @@ -97,7 +97,7 @@ class RequestsPage extends Component { renderPending = (data) => { const { actions } = this.props; - const { payload, id, isSending } = data; + const { payload, id, isSending, date } = data; return ( ); } renderFinished = (data) => { - const { payload, id, result, msg, status, error } = data; + const { payload, id, result, msg, status, error, date } = data; return ( ); } diff --git a/js/src/views/Signer/reducers/requests.js b/js/src/views/Signer/reducers/requests.js index 2c46d6d2bf7..89b5fe434ae 100644 --- a/js/src/views/Signer/reducers/requests.js +++ b/js/src/views/Signer/reducers/requests.js @@ -35,7 +35,7 @@ export default handleActions({ 'update pendingRequests' (state, action) { return { ...state, - pending: action.payload + pending: action.payload.map(r => addTimestamp(r)) }; }, @@ -108,3 +108,8 @@ function setIsSending (pending, id, isSending) { return p; }).slice(); } + +function addTimestamp (request) { + request.date = new Date(); + return request; +} From 6ead4caf27ce931c627214e738a474dc869d9f77 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 26 Sep 2016 16:09:47 +0200 Subject: [PATCH 0824/1062] method decoding returns Natspec-like description of what is going on --- js/src/ui/MethodDecoding/methodDecoding.css | 16 +++++- js/src/ui/MethodDecoding/methodDecoding.js | 52 ++++++++++++++++--- .../Transactions/Transaction/transaction.js | 15 +++++- .../Account/Transactions/transactions.css | 1 + 4 files changed, 72 insertions(+), 12 deletions(-) diff --git a/js/src/ui/MethodDecoding/methodDecoding.css b/js/src/ui/MethodDecoding/methodDecoding.css index c84e8c1c723..663869234b2 100644 --- a/js/src/ui/MethodDecoding/methodDecoding.css +++ b/js/src/ui/MethodDecoding/methodDecoding.css @@ -15,11 +15,23 @@ /* along with Parity. If not, see . */ -.method { - font-family: 'Roboto Mono' !important; +.details { +} + +.description { + line-height: 1.5em; + padding-bottom: 0.5em; +} + +.name, +.inputs { + font-family: 'Roboto Mono'; } .name { + background: rgba(0, 0, 0, 0.4); + border-radius: 4px; + padding: 0 0.25em; } .inputs { diff --git a/js/src/ui/MethodDecoding/methodDecoding.js b/js/src/ui/MethodDecoding/methodDecoding.js index 7f2a76a517d..003f81590be 100644 --- a/js/src/ui/MethodDecoding/methodDecoding.js +++ b/js/src/ui/MethodDecoding/methodDecoding.js @@ -30,7 +30,9 @@ export default class Method extends Component { } static propTypes = { - input: PropTypes.string + transaction: PropTypes.object, + historic: PropTypes.bool, + isContract: PropTypes.bool } state = { @@ -41,30 +43,48 @@ export default class Method extends Component { } componentDidMount () { - const { input } = this.props; + const { transaction } = this.props; - this.lookup(input); + this.lookup(transaction.input); } componentWillReceiveProps (newProps) { - const { input } = this.props; + const { transaction } = this.props; - if (newProps.input === input) { + if (newProps.transaction === transaction) { return; } - this.lookup(input); + this.lookup(transaction.input); } render () { const { name } = this.state; if (!name) { - return null; + return this.renderValueTransfer(); } + return this.renderUnknown(); + } + + renderValueTransfer () { + const { historic } = this.props; + + return null; + + return ( +
      + This transaction { historic ? 'transferred' : 'will transfer' } +
      + ); + } + + renderSimple () { + const { name } = this.state; + return ( -
      +
      { name }
      @@ -75,6 +95,22 @@ export default class Method extends Component { ); } + renderUnknown () { + const { historic } = this.props; + const { name } = this.state; + + return ( +
      +
      + This transaction { historic ? 'executed' : 'will execute' } the { name } function on the contract, passing the following values as part of the transaction: +
      +
      + { this.renderInputs() } +
      +
      + ); + } + renderInputs () { const { inputs } = this.state; diff --git a/js/src/views/Account/Transactions/Transaction/transaction.js b/js/src/views/Account/Transactions/Transaction/transaction.js index 7a32a8217c1..513774b5f5d 100644 --- a/js/src/views/Account/Transactions/Transaction/transaction.js +++ b/js/src/views/Account/Transactions/Transaction/transaction.js @@ -75,7 +75,9 @@ export default class Transaction extends Component { } return ( - + ); } @@ -185,7 +187,16 @@ export default class Transaction extends Component { api.eth.getTransactionByHash(transaction.hash) ]) .then(([block, info]) => { - this.setState({ block, info }); + if (!transaction.to) { + this.setState({ block, info }); + return; + } + + return api.eth + .getCode(transaction.to) + .then((code) => { + this.setState({ block, info, isContract: !!code }); + }); }) .catch((error) => { console.error('lookup', error); diff --git a/js/src/views/Account/Transactions/transactions.css b/js/src/views/Account/Transactions/transactions.css index a67a3255e9e..e491f4ce37e 100644 --- a/js/src/views/Account/Transactions/transactions.css +++ b/js/src/views/Account/Transactions/transactions.css @@ -91,6 +91,7 @@ .method { opacity: 0.75; + width: 40%; } .transactions td.timestamp { From de808773b52fbb9ff16db335035518b2d9517d2d Mon Sep 17 00:00:00 2001 From: Jannis R Date: Mon, 26 Sep 2016 16:19:51 +0200 Subject: [PATCH 0825/1062] registry: show queued transactions nicely --- js/src/dapps/registry/names/actions.js | 7 ++- js/src/dapps/registry/names/names.js | 68 ++++++++++++++++++------- js/src/dapps/registry/names/reducers.js | 7 ++- 3 files changed, 59 insertions(+), 23 deletions(-) diff --git a/js/src/dapps/registry/names/actions.js b/js/src/dapps/registry/names/actions.js index 33b1ee6b470..255a63e12fd 100644 --- a/js/src/dapps/registry/names/actions.js +++ b/js/src/dapps/registry/names/actions.js @@ -16,6 +16,9 @@ import { sha3, toWei } from '../parity.js'; +const alreadyQueued = (queue, action, name) => + !!queue.find((entry) => entry.action === action && entry.name === name) + export const reserveStart = (name) => ({ type: 'names reserve start', name }); export const reserveSuccess = (name) => ({ type: 'names reserve success', name }); @@ -27,7 +30,7 @@ export const reserve = (name) => (dispatch, getState) => { const account = state.accounts.selected; const contract = state.contract; if (!contract || !account) return; - if (state.names.reserved.includes(name)) return; + if (alreadyQueued(state.names.queue, 'reserve', name)) return; const reserve = contract.functions.find((f) => f.name === 'reserve'); name = name.toLowerCase(); @@ -63,7 +66,7 @@ export const drop = (name) => (dispatch, getState) => { const account = state.accounts.selected; const contract = state.contract; if (!contract || !account) return; - if (state.names.dropped.includes(name)) return; + if (alreadyQueued(state.names.queue, 'drop', name)) return; const drop = contract.functions.find((f) => f.name === 'drop'); name = name.toLowerCase(); diff --git a/js/src/dapps/registry/names/names.js b/js/src/dapps/registry/names/names.js index 43c182b539a..ece9a7631dc 100644 --- a/js/src/dapps/registry/names/names.js +++ b/js/src/dapps/registry/names/names.js @@ -26,6 +26,45 @@ import { fromWei } from '../parity.js'; import styles from './names.css'; +const useSignerText = (

      Use the Signer to authenticate the following changes.

      ) + +const renderNames = (names) => { + const out = [] + for (let name of names) { + out.push(({ name }), ', ') + } + out.pop() + return out +} + +const renderQueue = (queue) => { + if (queue.length === 0) { + return null; + } + + const grouped = queue.reduce((grouped, change) => { + const last = grouped[grouped.length - 1] + if (last && last.action === change.action) { + last.names.push(change.name) + } else { + grouped.push({action: change.action, names: [change.name]}) + } + return grouped + }, []); + + return ( +
        + { grouped.map(({action, names}) => ( +
      • + { renderNames(names) } + { ' will be ' } + { action === 'reserve' ? 'reserved' : 'dropped' } +
      • + )) } +
      + ); +} + export default class Names extends Component { static propTypes = { @@ -33,8 +72,7 @@ export default class Names extends Component { fee: PropTypes.object.isRequired, hasAccount: PropTypes.bool.isRequired, pending: PropTypes.bool.isRequired, - reserved: PropTypes.array.isRequired, - dropped: PropTypes.array.isRequired + queue: PropTypes.array.isRequired } state = { @@ -44,7 +82,7 @@ export default class Names extends Component { render () { const { action, name } = this.state; - const { fee, hasAccount, pending, reserved, dropped } = this.props; + const { fee, hasAccount, pending, queue } = this.props; return ( @@ -52,10 +90,12 @@ export default class Names extends Component { { !hasAccount ? (

      Please select an account first.

      ) - : (

      - The fee to reserve a name is { fromWei(fee).toFixed(3) }ΞTH. - To drop a name, you have to be the owner. -

      ) + : (action === 'reserve' + ? (

      + The fee to reserve a name is { fromWei(fee).toFixed(3) }ΞTH. +

      ) + : (

      To drop a name, you have to be the owner.

      ) + ) } } onClick={ this.onSubmitClick } /> - { reserved.map((name) => ( -

      - Please use the Signer to authenticate reserving { name }. -

      - )) } - { dropped.map((name) => ( -

      - Please use the Signer to authenticate dropping { name }. -

      - )) } + { queue.length > 0 + ? (
      { useSignerText }{ renderQueue(queue) }
      ) + : null + }
      ); diff --git a/js/src/dapps/registry/names/reducers.js b/js/src/dapps/registry/names/reducers.js index d8d87c648c1..eb5e7c69043 100644 --- a/js/src/dapps/registry/names/reducers.js +++ b/js/src/dapps/registry/names/reducers.js @@ -17,8 +17,7 @@ const initialState = { hasAccount: false, pending: false, - reserved: [], - dropped: [] + queue: [] }; export default (state = initialState, action) => { @@ -32,7 +31,7 @@ export default (state = initialState, action) => { if (action.type === 'names reserve success') { return { ...state, pending: false, - reserved: state.reserved.concat(action.name) + queue: state.queue.concat({action: 'reserve', name: action.name}) }; } if (action.type === 'names reserve fail') { @@ -45,7 +44,7 @@ export default (state = initialState, action) => { if (action.type === 'names drop success') { return { ...state, pending: false, - dropped: state.dropped.concat(action.name) + queue: state.queue.concat({action: 'drop', name: action.name}) }; } if (action.type === 'names drop fail') { From a2b48239711fab092ded719e6346c767b3125216 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 26 Sep 2016 16:26:23 +0200 Subject: [PATCH 0826/1062] show general value transfers as well (to contract or address) --- js/src/ui/MethodDecoding/methodDecoding.css | 3 +++ js/src/ui/MethodDecoding/methodDecoding.js | 17 +++++++++++++---- .../Transactions/Transaction/transaction.js | 8 +++++--- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/js/src/ui/MethodDecoding/methodDecoding.css b/js/src/ui/MethodDecoding/methodDecoding.css index 663869234b2..aabd7af1463 100644 --- a/js/src/ui/MethodDecoding/methodDecoding.css +++ b/js/src/ui/MethodDecoding/methodDecoding.css @@ -42,3 +42,6 @@ margin-top: -14px; font-family: inherit !important; } + +.ether { +} diff --git a/js/src/ui/MethodDecoding/methodDecoding.js b/js/src/ui/MethodDecoding/methodDecoding.js index 003f81590be..84863e9806c 100644 --- a/js/src/ui/MethodDecoding/methodDecoding.js +++ b/js/src/ui/MethodDecoding/methodDecoding.js @@ -69,13 +69,11 @@ export default class Method extends Component { } renderValueTransfer () { - const { historic } = this.props; - - return null; + const { historic, transaction, isContract } = this.props; return (
      - This transaction { historic ? 'transferred' : 'will transfer' } + This transaction { historic ? 'transferred' : 'will transfer' } { this.renderEther(transaction.value) } { isContract ? 'to the contract.' : 'to the recipient address.' }
      ); } @@ -138,6 +136,17 @@ export default class Method extends Component { return value.toString(); } + renderEther (value) { + const { api } = this.context; + const ether = api.util.fromWei(value); + + return ( + + { ether.toFormat(5) }ΞTH + + ); + } + lookup (input) { const { api, contracts } = this.context; diff --git a/js/src/views/Account/Transactions/Transaction/transaction.js b/js/src/views/Account/Transactions/Transaction/transaction.js index 513774b5f5d..250a4e02d04 100644 --- a/js/src/views/Account/Transactions/Transaction/transaction.js +++ b/js/src/views/Account/Transactions/Transaction/transaction.js @@ -36,7 +36,8 @@ export default class Transaction extends Component { } state = { - info: null + info: null, + isContract: false } componentDidMount () { @@ -68,7 +69,7 @@ export default class Transaction extends Component { } renderMethod () { - const { info } = this.state; + const { info, isContract } = this.state; if (!info) { return null; @@ -77,6 +78,7 @@ export default class Transaction extends Component { return ( ); } @@ -195,7 +197,7 @@ export default class Transaction extends Component { return api.eth .getCode(transaction.to) .then((code) => { - this.setState({ block, info, isContract: !!code }); + this.setState({ block, info, isContract: code !== '0x' }); }); }) .catch((error) => { From 6fd63c7f9a6092b1ba3731a45b206e28255cd593 Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Mon, 26 Sep 2016 15:35:41 +0100 Subject: [PATCH 0827/1062] Added GPL --- js/build-server.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/js/build-server.js b/js/build-server.js index 71017ee6e1c..797e89183ce 100644 --- a/js/build-server.js +++ b/js/build-server.js @@ -1,3 +1,19 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + /** * Run `PARITY_URL="127.0.0.1:8180" NODE_ENV="production" npm run build` * to build the project ; use this server to test that the minifed From a5d23dd51e8f1175f2aebe3c3af9d0c6075f85e6 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 26 Sep 2016 16:44:03 +0200 Subject: [PATCH 0828/1062] split between received/sent --- js/src/ui/MethodDecoding/methodDecoding.js | 20 ++++++++++++++++--- .../Transactions/Transaction/transaction.js | 10 +++++++--- .../Account/Transactions/transactions.js | 3 ++- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/js/src/ui/MethodDecoding/methodDecoding.js b/js/src/ui/MethodDecoding/methodDecoding.js index 84863e9806c..6d98b9d98e1 100644 --- a/js/src/ui/MethodDecoding/methodDecoding.js +++ b/js/src/ui/MethodDecoding/methodDecoding.js @@ -32,7 +32,8 @@ export default class Method extends Component { static propTypes = { transaction: PropTypes.object, historic: PropTypes.bool, - isContract: PropTypes.bool + isContract: PropTypes.bool, + isReceived: PropTypes.bool } state = { @@ -59,21 +60,34 @@ export default class Method extends Component { } render () { + const { isReceived } = this.props; const { name } = this.state; if (!name) { - return this.renderValueTransfer(); + return isReceived + ? this.renderValueReceipt() + : this.renderValueTransfer(); } return this.renderUnknown(); } + renderValueReceipt () { + const { historic, transaction, isContract } = this.props; + + return ( +
      + This account { historic ? 'received' : 'will receive' } { this.renderEther(transaction.value) } { isContract ? 'from the contract.' : 'from the sending address.' } +
      + ); + } + renderValueTransfer () { const { historic, transaction, isContract } = this.props; return (
      - This transaction { historic ? 'transferred' : 'will transfer' } { this.renderEther(transaction.value) } { isContract ? 'to the contract.' : 'to the recipient address.' } + This transaction { historic ? 'transferred' : 'will transfer' } a value of { this.renderEther(transaction.value) } { isContract ? 'to the contract.' : 'to the recipient address.' }
      ); } diff --git a/js/src/views/Account/Transactions/Transaction/transaction.js b/js/src/views/Account/Transactions/Transaction/transaction.js index 250a4e02d04..ac5fd12e897 100644 --- a/js/src/views/Account/Transactions/Transaction/transaction.js +++ b/js/src/views/Account/Transactions/Transaction/transaction.js @@ -29,6 +29,7 @@ export default class Transaction extends Component { static propTypes = { transaction: PropTypes.object.isRequired, + address: PropTypes.string.isRequired, accounts: PropTypes.object, contacts: PropTypes.object, tokens: PropTypes.object, @@ -37,7 +38,8 @@ export default class Transaction extends Component { state = { info: null, - isContract: false + isContract: false, + isReceived: this.props.address === this.props.transaction.to } componentDidMount () { @@ -69,7 +71,7 @@ export default class Transaction extends Component { } renderMethod () { - const { info, isContract } = this.state; + const { info, isContract, isReceived } = this.state; if (!info) { return null; @@ -79,6 +81,7 @@ export default class Transaction extends Component { ); } @@ -189,8 +192,9 @@ export default class Transaction extends Component { api.eth.getTransactionByHash(transaction.hash) ]) .then(([block, info]) => { + this.setState({ block, info }); + if (!transaction.to) { - this.setState({ block, info }); return; } diff --git a/js/src/views/Account/Transactions/transactions.js b/js/src/views/Account/Transactions/transactions.js index e55ae6f0de3..907d29cdc74 100644 --- a/js/src/views/Account/Transactions/transactions.js +++ b/js/src/views/Account/Transactions/transactions.js @@ -87,7 +87,7 @@ class Transactions extends Component { } renderRows () { - const { accounts, contacts, tokens, isTest } = this.props; + const { address, accounts, contacts, tokens, isTest } = this.props; const { transactions } = this.state; return (transactions || []).map((transaction, index) => { @@ -95,6 +95,7 @@ class Transactions extends Component { Date: Mon, 26 Sep 2016 16:50:53 +0200 Subject: [PATCH 0829/1062] registry: fix captions --- js/src/dapps/registry/names/names.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/dapps/registry/names/names.js b/js/src/dapps/registry/names/names.js index ece9a7631dc..ffcc951cb30 100644 --- a/js/src/dapps/registry/names/names.js +++ b/js/src/dapps/registry/names/names.js @@ -86,7 +86,7 @@ export default class Names extends Component { return ( - + { !hasAccount ? (

      Please select an account first.

      ) @@ -113,7 +113,7 @@ export default class Names extends Component { } onClick={ this.onSubmitClick } From c76e22652705d6879f26897f2ec00f8f9f125df4 Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Mon, 26 Sep 2016 17:45:23 +0100 Subject: [PATCH 0830/1062] Added values of contract constants (#2257) --- js/src/api/api.js | 4 +-- js/src/views/Application/TabBar/tabBar.js | 2 +- js/src/views/Contract/Queries/queries.js | 31 +++++++++++++++-------- js/src/views/Contract/contract.css | 2 ++ js/src/views/Contract/contract.js | 30 +++++++++++++++++++--- 5 files changed, 52 insertions(+), 17 deletions(-) diff --git a/js/src/api/api.js b/js/src/api/api.js index 059afe51e0c..e120a15cf2c 100644 --- a/js/src/api/api.js +++ b/js/src/api/api.js @@ -90,8 +90,8 @@ export default class Api { return this._subscriptions.subscribe(subscriptionName, callback); } - unsubscribe (subscriptionId) { - return this._subscriptions.unsubscribe(subscriptionId); + unsubscribe (subscriptionName, subscriptionId) { + return this._subscriptions.unsubscribe(subscriptionName, subscriptionId); } static Transport = { diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index bf78f2180fc..0be7a3398f0 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -204,7 +204,7 @@ export default class TabBar extends Component { const { router } = this.context; router.push(activeRoute); - this.setState(activeRoute); + this.setState({ activeRoute }); } toggleMenu = (event, menu) => { diff --git a/js/src/views/Contract/Queries/queries.js b/js/src/views/Contract/Queries/queries.js index 72eef32625e..515df35afa3 100644 --- a/js/src/views/Contract/Queries/queries.js +++ b/js/src/views/Contract/Queries/queries.js @@ -15,6 +15,7 @@ // along with Parity. If not, see . import React, { Component, PropTypes } from 'react'; +import Chip from 'material-ui/Chip'; import { Container, ContainerTitle } from '../../../ui'; @@ -22,7 +23,8 @@ import styles from '../contract.css'; export default class Queries extends Component { static propTypes = { - contract: PropTypes.object + contract: PropTypes.object, + values: PropTypes.object } render () { @@ -35,15 +37,7 @@ export default class Queries extends Component { const queries = contract.functions .filter((fn) => fn.constant) .sort(this._sortEntries) - .map((fn) => { - return ( -
      - { fn.name } -
      - ); - }); + .map((fn) => this.renderQuery(fn)); return ( @@ -55,6 +49,23 @@ export default class Queries extends Component { ); } + renderQuery (fn) { + const { values } = this.props; + + const value = values[fn.name] + ? ({ values[fn.name].toString() }) + : null; + + return ( +
      +

      { fn.name }

      + { value } +
      + ); + } + _sortEntries (a, b) { return a.name.localeCompare(b.name); } diff --git a/js/src/views/Contract/contract.css b/js/src/views/Contract/contract.css index 028d4cdb6f0..902fd9fc267 100644 --- a/js/src/views/Contract/contract.css +++ b/js/src/views/Contract/contract.css @@ -27,6 +27,8 @@ width: 20%; position: relative; margin-top: 0.5em; + display: flex; + flex-direction: column; } .events { diff --git a/js/src/views/Contract/contract.js b/js/src/views/Contract/contract.js index 9c3e759e18b..7a1889c1994 100644 --- a/js/src/views/Contract/contract.js +++ b/js/src/views/Contract/contract.js @@ -53,9 +53,11 @@ class Contract extends Component { showEditDialog: false, showExecuteDialog: false, subscriptionId: -1, + blockSubscriptionId: -1, allEvents: [], minedEvents: [], - pendingEvents: [] + pendingEvents: [], + queryValues: {} } componentDidMount () { @@ -64,7 +66,9 @@ class Contract extends Component { this.attachContract(this.props); this.setBaseAccount(this.props); - api.subscribe('eth_blockNumber', this.queryContract); + api + .subscribe('eth_blockNumber', this.queryContract) + .then(blockSubscriptionId => this.setState({ blockSubscriptionId })); } componentWillReceiveProps (newProps) { @@ -79,9 +83,17 @@ class Contract extends Component { } } + componentWillUnmount () { + const { api } = this.context; + const { subscriptionId, blockSubscriptionId, contract } = this.state; + + api.unsubscribe('eth_blockNumber', blockSubscriptionId); + contract.unsubscribe(subscriptionId); + } + render () { const { balances, contracts, params, isTest } = this.props; - const { allEvents, contract } = this.state; + const { allEvents, contract, queryValues } = this.state; const account = contracts[params.address]; const balance = balances[params.address]; @@ -101,7 +113,8 @@ class Contract extends Component { account={ account } balance={ balance } /> + contract={ contract } + values={ queryValues } /> @@ -194,6 +207,15 @@ class Contract extends Component { Promise .all(queries.map((query) => query.call())) + .then(results => { + const values = queries.reduce((object, fn, idx) => { + const key = fn.name; + object[key] = results[idx]; + return object; + }, {}); + + this.setState({ queryValues: values }); + }) .catch((error) => { console.error('queryContract', error); }); From 2b2e649ed49e361e390589c2b8564cf2f498523c Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Mon, 26 Sep 2016 17:55:27 +0100 Subject: [PATCH 0831/1062] Formatting contant values (#2257) --- js/src/views/Contract/Queries/queries.js | 26 +++++++++++++++++++----- js/src/views/Contract/contract.css | 1 + 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/js/src/views/Contract/Queries/queries.js b/js/src/views/Contract/Queries/queries.js index 515df35afa3..a9cdf61f8f4 100644 --- a/js/src/views/Contract/Queries/queries.js +++ b/js/src/views/Contract/Queries/queries.js @@ -14,6 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . +import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; import Chip from 'material-ui/Chip'; @@ -22,6 +23,10 @@ import { Container, ContainerTitle } from '../../../ui'; import styles from '../contract.css'; export default class Queries extends Component { + static contextTypes = { + api: PropTypes.object + } + static propTypes = { contract: PropTypes.object, values: PropTypes.object @@ -52,20 +57,31 @@ export default class Queries extends Component { renderQuery (fn) { const { values } = this.props; - const value = values[fn.name] - ? ({ values[fn.name].toString() }) - : null; - return (

      { fn.name }

      - { value } + { this.renderValue(values[fn.name]) }
      ); } + renderValue (value) { + if (!value) return null; + + const { api } = this.context; + let valueToDisplay = value.toString(); + + if (api.util.isInstanceOf(value, BigNumber)) { + valueToDisplay = value.toFormat(0); + } else if (api.util.isArray(value)) { + valueToDisplay = api.util.bytesToHex(value); + } + + return ({ valueToDisplay }); + } + _sortEntries (a, b) { return a.name.localeCompare(b.name); } diff --git a/js/src/views/Contract/contract.css b/js/src/views/Contract/contract.css index 902fd9fc267..ceb21da4e7d 100644 --- a/js/src/views/Contract/contract.css +++ b/js/src/views/Contract/contract.css @@ -29,6 +29,7 @@ margin-top: 0.5em; display: flex; flex-direction: column; + align-items: center; } .events { From 33c6ca5fbfe155fc7e869c1b5402df4acee9bef0 Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Mon, 26 Sep 2016 18:39:25 +0100 Subject: [PATCH 0832/1062] inputs for constants with inputs and query (#2257) --- js/src/views/Contract/Queries/queries.js | 89 +++++++++++++++++++++++- js/src/views/Contract/contract.css | 1 + 2 files changed, 88 insertions(+), 2 deletions(-) diff --git a/js/src/views/Contract/Queries/queries.js b/js/src/views/Contract/Queries/queries.js index a9cdf61f8f4..558792f3916 100644 --- a/js/src/views/Contract/Queries/queries.js +++ b/js/src/views/Contract/Queries/queries.js @@ -17,6 +17,8 @@ import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; import Chip from 'material-ui/Chip'; +import TextField from 'material-ui/TextField'; +import RaisedButton from 'material-ui/RaisedButton'; import { Container, ContainerTitle } from '../../../ui'; @@ -32,6 +34,10 @@ export default class Queries extends Component { values: PropTypes.object } + state = { + forms: {} + } + render () { const { contract } = this.props; @@ -41,19 +47,98 @@ export default class Queries extends Component { const queries = contract.functions .filter((fn) => fn.constant) - .sort(this._sortEntries) + .sort(this._sortEntries); + + const noInputQueries = queries + .slice() + .filter((fn) => fn.inputs.length === 0) .map((fn) => this.renderQuery(fn)); + const withInputQueries = queries + .slice() + .filter((fn) => fn.inputs.length > 0) + .map((fn) => this.renderInputQuery(fn)); + return (
      - { queries } + { noInputQueries } + { withInputQueries }
      ); } + renderInputQuery (fn) { + const { inputs } = fn; + + const inputsFields = inputs + .map(input => this.renderInput(fn.name, input)); + + const onClick = () => { + const form = this.state.forms[fn.name]; + const inputsValue = inputs.map(input => { + if (!form) return null; + return form[input.name]; + }); + + this.props + .contract.instance[fn.name] + .call({}, inputsValue) + .then(results => { + console.log(results); + }) + .catch(e => { + console.error(`sending ${fn.name} with params`, inputsValue, e); + }); + }; + + return ( +
      + { fn.name } + { inputsFields } + +
      + ); + } + + renderInput (fnName, input) { + const { name, kind } = input; + const onChange = (event) => { + const value = event.target.value; + const { forms } = this.state; + + this.setState({ + forms: { + ...forms, + [fnName]: { + ...forms[fnName], + [ name ]: value + } + } + }); + }; + + return ( +
      + +
      + ); + } + renderQuery (fn) { const { values } = this.props; diff --git a/js/src/views/Contract/contract.css b/js/src/views/Contract/contract.css index ceb21da4e7d..f76bd8303f3 100644 --- a/js/src/views/Contract/contract.css +++ b/js/src/views/Contract/contract.css @@ -20,6 +20,7 @@ .methods { display: flex; flex-wrap: wrap; + justify-content: space-around; } .method { From a000c14bbdb00d79ece4d3231ed03fd9b4ba9a30 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 26 Sep 2016 21:48:10 +0200 Subject: [PATCH 0833/1062] formatting updates --- js/src/ui/Form/InputAddress/inputAddress.js | 9 ++- js/src/ui/MethodDecoding/methodDecoding.css | 19 ++++-- js/src/ui/MethodDecoding/methodDecoding.js | 46 +++++++++---- .../Transactions/Transaction/transaction.js | 67 +++++++++++-------- 4 files changed, 91 insertions(+), 50 deletions(-) diff --git a/js/src/ui/Form/InputAddress/inputAddress.js b/js/src/ui/Form/InputAddress/inputAddress.js index 0021cdc7b1d..e791725557f 100644 --- a/js/src/ui/Form/InputAddress/inputAddress.js +++ b/js/src/ui/Form/InputAddress/inputAddress.js @@ -23,27 +23,30 @@ import styles from './inputAddress.css'; export default class InputAddress extends Component { static propTypes = { + className: PropTypes.string, disabled: PropTypes.bool, error: PropTypes.string, label: PropTypes.string, hint: PropTypes.string, value: PropTypes.string, + nameValue: PropTypes.string, onChange: PropTypes.func, onSubmit: PropTypes.func }; render () { - const { disabled, error, label, hint, value, onChange, onSubmit } = this.props; + const { className, disabled, error, label, hint, value, nameValue, onChange, onSubmit } = this.props; + const classes = `${styles.input} ${className}`; return (
      { this.renderIcon() } diff --git a/js/src/ui/MethodDecoding/methodDecoding.css b/js/src/ui/MethodDecoding/methodDecoding.css index aabd7af1463..269ad08325e 100644 --- a/js/src/ui/MethodDecoding/methodDecoding.css +++ b/js/src/ui/MethodDecoding/methodDecoding.css @@ -24,24 +24,31 @@ } .name, -.inputs { - font-family: 'Roboto Mono'; -} - -.name { +.highlight { background: rgba(0, 0, 0, 0.4); border-radius: 4px; padding: 0 0.25em; } +.name, +.inputs, +.highlight { + font-family: 'Roboto Mono'; +} + .inputs { padding-left: 1.5em; } .input { - margin-top: -14px; + margin-top: -16px; font-family: inherit !important; } +.inputs img { + position: absolute; + top: -16px; +} + .ether { } diff --git a/js/src/ui/MethodDecoding/methodDecoding.js b/js/src/ui/MethodDecoding/methodDecoding.js index 6d98b9d98e1..14083444c81 100644 --- a/js/src/ui/MethodDecoding/methodDecoding.js +++ b/js/src/ui/MethodDecoding/methodDecoding.js @@ -17,7 +17,7 @@ import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; -import Input from '../Form/Input'; +import { Input, InputAddress } from '../Form'; import styles from './methodDecoding.css'; @@ -30,6 +30,9 @@ export default class Method extends Component { } static propTypes = { + accounts: PropTypes.object, + contacts: PropTypes.object, + tokens: PropTypes.object, transaction: PropTypes.object, historic: PropTypes.bool, isContract: PropTypes.bool, @@ -77,7 +80,7 @@ export default class Method extends Component { return (
      - This account { historic ? 'received' : 'will receive' } { this.renderEther(transaction.value) } { isContract ? 'from the contract.' : 'from the sending address.' } + { historic ? 'Received' : 'Will receive' } { this.renderEther(transaction.value) } { isContract ? 'from the contract.' : 'from the sender.' }
      ); } @@ -87,7 +90,7 @@ export default class Method extends Component { return (
      - This transaction { historic ? 'transferred' : 'will transfer' } a value of { this.renderEther(transaction.value) } { isContract ? 'to the contract.' : 'to the recipient address.' } + { historic ? 'Transferred' : 'Will transfer' } a value of { this.renderEther(transaction.value) } { isContract ? 'to the contract.' : 'to the recipient.' }
      ); } @@ -114,7 +117,7 @@ export default class Method extends Component { return (
      - This transaction { historic ? 'executed' : 'will execute' } the { name } function on the contract, passing the following values as part of the transaction: + { historic ? 'Executed' : 'Will execute' } the { name } function on the contract, passing the following values as part of the transaction:
      { this.renderInputs() } @@ -124,17 +127,36 @@ export default class Method extends Component { } renderInputs () { + const { accounts, contacts, tokens } = this.props; const { inputs } = this.state; return inputs.map((input, index) => { - return ( - - ); + switch (input.type) { + case 'address': + const address = input.value; + const account = (accounts || {})[address] || (contacts || {})[address] || (tokens || {})[address]; + const name = account ? account.name.toUpperCase() : null; + + return ( + + ); + + default: + return ( + + ); + } }); } diff --git a/js/src/views/Account/Transactions/Transaction/transaction.js b/js/src/views/Account/Transactions/Transaction/transaction.js index ac5fd12e897..bb06191e477 100644 --- a/js/src/views/Account/Transactions/Transaction/transaction.js +++ b/js/src/views/Account/Transactions/Transaction/transaction.js @@ -39,13 +39,13 @@ export default class Transaction extends Component { state = { info: null, isContract: false, - isReceived: this.props.address === this.props.transaction.to + isReceived: false } componentDidMount () { - const { transaction } = this.props; + const { address, transaction } = this.props; - this.lookup(transaction); + this.lookup(address, transaction); } render () { @@ -71,6 +71,7 @@ export default class Transaction extends Component { } renderMethod () { + const { accounts, contacts, tokens } = this.props; const { info, isContract, isReceived } = this.state; if (!info) { @@ -80,6 +81,9 @@ export default class Transaction extends Component { return ( @@ -91,13 +95,10 @@ export default class Transaction extends Component { const prefix = `https://${isTest ? 'testnet.' : ''}etherscan.io/`; const hashLink = `${prefix}tx/${transaction.hash}`; - const { value, token } = this.formatEther(transaction.value); return ( -
      - { value }{ token } -
      + { this.renderEtherValue() }
      ⇒
      @@ -117,8 +118,8 @@ export default class Transaction extends Component { ); } - const account = (accounts || {})[address] || (contacts || {})[address] || (tokens || {})[address]; const link = `${prefix}address/${address}`; + const account = (accounts || {})[address] || (contacts || {})[address] || (tokens || {})[address]; const name = account ? account.name.toUpperCase() : this.formatHash(address); @@ -144,6 +145,27 @@ export default class Transaction extends Component { ); } + renderEtherValue () { + const { api } = this.context; + const { info } = this.state; + + if (!info) { + return null; + } + + const value = api.util.fromWei(info.value); + + if (value.eq(0)) { + return
      { ' ' }
      ; + } + + return ( +
      + { value.toFormat(5) }ΞTH +
      + ); + } + formatHash (hash) { if (!hash || hash.length <= 16) { return hash; @@ -164,21 +186,7 @@ export default class Transaction extends Component { return moment(block.timestamp).fromNow(); } - formatEther (value) { - const { api } = this.context; - const ether = api.util.fromWei(value); - - if (ether.eq(0)) { - return { value: null, token: null }; - } - - return { - value: `${ether.toFormat(5)}`, - token: ΞTH - }; - } - - lookup (transaction) { + lookup (address, transaction) { const { api } = this.context; const { info } = this.state; @@ -186,6 +194,8 @@ export default class Transaction extends Component { return; } + this.setState({ isReceived: address === transaction.to }); + Promise .all([ api.eth.getBlockByNumber(transaction.blockNumber), @@ -195,14 +205,13 @@ export default class Transaction extends Component { this.setState({ block, info }); if (!transaction.to) { - return; + return null; } - return api.eth - .getCode(transaction.to) - .then((code) => { - this.setState({ block, info, isContract: code !== '0x' }); - }); + return api.eth.getCode(transaction.to); + }) + .then((code) => { + this.setState({ isContract: code && code !== '0x' }); }) .catch((error) => { console.error('lookup', error); From 1385efca36b7432e82b121ae42298b65884041a4 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 26 Sep 2016 22:01:09 +0200 Subject: [PATCH 0834/1062] updated signaturereg to new play contract --- js/src/contracts/registry.js | 2 +- js/src/contracts/signaturereg.js | 2 +- js/src/dapps/signaturereg/services.js | 2 +- js/src/json/signaturereg.json | 30 ++------------------------- 4 files changed, 5 insertions(+), 31 deletions(-) diff --git a/js/src/contracts/registry.js b/js/src/contracts/registry.js index a7f60f44195..62cecea7fa8 100644 --- a/js/src/contracts/registry.js +++ b/js/src/contracts/registry.js @@ -66,7 +66,7 @@ export default class Registry { return this.getInstance().then((instance) => { if (name === 'signaturereg') { - return '0xD1888764222dbE5BBa54F0cf9d493e43aba667Fb'; + return '0x15fF40Ceb6092b8EBeD4046E2d4c54e5e4cae458'; } return instance.getAddress.call({}, [this._api.util.sha3(name), 'A']); }); diff --git a/js/src/contracts/signaturereg.js b/js/src/contracts/signaturereg.js index a37cf3d9e65..459f165b1d2 100644 --- a/js/src/contracts/signaturereg.js +++ b/js/src/contracts/signaturereg.js @@ -28,7 +28,7 @@ export default class SignatureReg { lookup (signature) { return this.getInstance().then((instance) => { - return instance.get.call({}, [signature]); + return instance.entries.call({}, [signature]); }); } } diff --git a/js/src/dapps/signaturereg/services.js b/js/src/dapps/signaturereg/services.js index 87b613747d2..9af6bafc031 100644 --- a/js/src/dapps/signaturereg/services.js +++ b/js/src/dapps/signaturereg/services.js @@ -52,7 +52,7 @@ export function attachInterface (callback) { }) .then(([address, addresses, accountsInfo]) => { console.log(`signaturereg was found at ${address}`); - address = '0xD1888764222dbE5BBa54F0cf9d493e43aba667Fb'; + address = '0x15fF40Ceb6092b8EBeD4046E2d4c54e5e4cae458'; const contract = api.newContract(abis.signaturereg, address); const accounts = addresses.reduce((obj, address) => { diff --git a/js/src/json/signaturereg.json b/js/src/json/signaturereg.json index ce1bce10f9e..a9b109ecd46 100644 --- a/js/src/json/signaturereg.json +++ b/js/src/json/signaturereg.json @@ -25,28 +25,6 @@ "payable": false, "type": "function" }, - { - "constant": true, - "inputs": [ - { - "name": "_signature", - "type": "bytes4" - } - ], - "name": "get", - "outputs": [ - { - "name": "method", - "type": "string" - }, - { - "name": "owner", - "type": "address" - } - ], - "payable": false, - "type": "function" - }, { "constant": true, "inputs": [], @@ -79,12 +57,8 @@ "name": "entries", "outputs": [ { - "name": "method", + "name": "", "type": "string" - }, - { - "name": "owner", - "type": "address" } ], "payable": false, @@ -117,7 +91,7 @@ "inputs": [ { "indexed": true, - "name": "owner", + "name": "creator", "type": "address" }, { From d199282654d9676391e5fb14bf2c5eb20f852b91 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 26 Sep 2016 23:50:36 +0200 Subject: [PATCH 0835/1062] expand decoding of human-readable transactions --- js/src/api/format/output.js | 1 + js/src/index.js | 4 +- js/src/ui/ContextProvider/contextProvider.js | 5 +- js/src/ui/MethodDecoding/methodDecoding.css | 5 +- js/src/ui/MethodDecoding/methodDecoding.js | 189 +++++++++++++----- .../Transactions/Transaction/transaction.js | 22 +- .../Account/Transactions/transactions.js | 7 +- 7 files changed, 161 insertions(+), 72 deletions(-) diff --git a/js/src/api/format/output.js b/js/src/api/format/output.js index cb310c8a048..96c41dc3297 100644 --- a/js/src/api/format/output.js +++ b/js/src/api/format/output.js @@ -134,6 +134,7 @@ export function outTransaction (tx) { tx[key] = outNumber(tx[key]); break; + case 'creates': case 'from': case 'to': tx[key] = outAddress(tx[key]); diff --git a/js/src/index.js b/js/src/index.js index 86cd8f9ab8b..15dc63a3985 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -51,7 +51,7 @@ const initToken = window.localStorage.getItem('sysuiToken'); const parityUrl = process.env.NODE_ENV === 'production' ? window.location.host : '127.0.0.1:8180'; const api = new Api(new Api.Transport.Ws(`ws://${parityUrl}`, initToken)); // new Api.Transport.Http('/rpc/')); -const contracts = ContractInstances.create(api); +ContractInstances.create(api); muiTheme.parity.setBackgroundSeed(api.util.sha3(initToken + Date.now())); @@ -74,7 +74,7 @@ ws.init(initToken); const routerHistory = useRouterHistory(createHashHistory)({}); ReactDOM.render( - + diff --git a/js/src/ui/ContextProvider/contextProvider.js b/js/src/ui/ContextProvider/contextProvider.js index c2fd394382e..7af6d342e87 100644 --- a/js/src/ui/ContextProvider/contextProvider.js +++ b/js/src/ui/ContextProvider/contextProvider.js @@ -19,7 +19,6 @@ import { Component, PropTypes } from 'react'; export default class ContextProvider extends Component { static propTypes = { api: PropTypes.object.isRequired, - contracts: PropTypes.object.isRequired, muiTheme: PropTypes.object.isRequired, store: PropTypes.object.isRequired, children: PropTypes.node.isRequired @@ -27,7 +26,6 @@ export default class ContextProvider extends Component { static childContextTypes = { api: PropTypes.object, - contracts: PropTypes.object, muiTheme: PropTypes.object, store: PropTypes.object } @@ -39,11 +37,10 @@ export default class ContextProvider extends Component { } getChildContext () { - const { api, contracts, muiTheme, store } = this.props; + const { api, muiTheme, store } = this.props; return { api, - contracts, muiTheme, store }; diff --git a/js/src/ui/MethodDecoding/methodDecoding.css b/js/src/ui/MethodDecoding/methodDecoding.css index 269ad08325e..af0b74bbc70 100644 --- a/js/src/ui/MethodDecoding/methodDecoding.css +++ b/js/src/ui/MethodDecoding/methodDecoding.css @@ -25,7 +25,7 @@ .name, .highlight { - background: rgba(0, 0, 0, 0.4); + background: rgba(255, 255, 255, 0.25); border-radius: 4px; padding: 0 0.25em; } @@ -50,5 +50,6 @@ top: -16px; } -.ether { +.etherValue, +.tokenValue { } diff --git a/js/src/ui/MethodDecoding/methodDecoding.js b/js/src/ui/MethodDecoding/methodDecoding.js index 14083444c81..c06e8ec36e9 100644 --- a/js/src/ui/MethodDecoding/methodDecoding.js +++ b/js/src/ui/MethodDecoding/methodDecoding.js @@ -17,39 +17,47 @@ import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; +import Contracts from '../../contracts'; import { Input, InputAddress } from '../Form'; import styles from './methodDecoding.css'; const CONTRACT_CREATE = '0x60606040'; +const TOKEN_METHODS = { + '0xa9059cbb': 'transfer(to,value)' +}; export default class Method extends Component { static contextTypes = { - api: PropTypes.object.isRequired, - contracts: PropTypes.object.isRequired + api: PropTypes.object.isRequired } static propTypes = { + address: PropTypes.string.isRequired, accounts: PropTypes.object, contacts: PropTypes.object, + contracts: PropTypes.object, tokens: PropTypes.object, transaction: PropTypes.object, - historic: PropTypes.bool, - isContract: PropTypes.bool, - isReceived: PropTypes.bool + historic: PropTypes.bool } state = { - signature: null, - paramdata: null, - name: null, - inputs: null + method: null, + methodName: null, + methodInputs: null, + methodParams: null, + methodSignature: null, + token: null, + isContract: false, + isDeploy: false, + isReceived: false } componentDidMount () { const { transaction } = this.props; - this.lookup(transaction.input); + this.lookup(transaction); } componentWillReceiveProps (newProps) { @@ -59,49 +67,97 @@ export default class Method extends Component { return; } - this.lookup(transaction.input); + this.lookup(transaction); } render () { - const { isReceived } = this.props; - const { name } = this.state; + const { methodName, methodInputs, methodSignature, token, isDeploy, isReceived } = this.state; - if (!name) { - return isReceived - ? this.renderValueReceipt() - : this.renderValueTransfer(); + if (isDeploy) { + return this.renderDeploy(); } - return this.renderUnknown(); + if (methodSignature) { + if (token && TOKEN_METHODS[methodSignature] && methodInputs) { + return this.renderTokenAction(); + } + + return methodName + ? this.renderSignatureMethod() + : this.renderUnknownMethod(); + } + + return isReceived + ? this.renderValueReceipt() + : this.renderValueTransfer(); + } + + renderTokenAction () { + const { historic } = this.props; + const { methodSignature, methodInputs } = this.state; + const [to, value] = methodInputs; + const address = to.value; + const account = this.getAccount(address); + const name = account ? account.name.toUpperCase() : null; + + switch (TOKEN_METHODS[methodSignature]) { + case 'transfer(to,value)': + default: + return ( +
      + { historic ? 'Transferred' : 'Will transfer' } { this.renderTokenValue(value.value) } to { name || address }. +
      + ); + } + } + + renderDeploy () { + const { historic, transaction } = this.props; + + if (!historic) { + return ( +
      + Will deploy a contract. +
      + ); + } + + return ( +
      + Deployed a contract at address { transaction.creates }. +
      + ); } renderValueReceipt () { - const { historic, transaction, isContract } = this.props; + const { historic, transaction } = this.props; + const { isContract } = this.state; return (
      - { historic ? 'Received' : 'Will receive' } { this.renderEther(transaction.value) } { isContract ? 'from the contract.' : 'from the sender.' } + { historic ? 'Received' : 'Will receive' } { this.renderEtherValue(transaction.value) } { isContract ? 'from the contract.' : 'from the sender.' }
      ); } renderValueTransfer () { - const { historic, transaction, isContract } = this.props; + const { historic, transaction } = this.props; + const { isContract } = this.state; return (
      - { historic ? 'Transferred' : 'Will transfer' } a value of { this.renderEther(transaction.value) } { isContract ? 'to the contract.' : 'to the recipient.' } + { historic ? 'Transferred' : 'Will transfer' } a value of { this.renderEtherValue(transaction.value) } { isContract ? 'to the contract.' : 'to the recipient.' }
      ); } renderSimple () { - const { name } = this.state; + const { methodName } = this.state; return (
      - { name } + { methodName }
      { this.renderInputs() } @@ -110,14 +166,14 @@ export default class Method extends Component { ); } - renderUnknown () { - const { historic } = this.props; - const { name } = this.state; + renderSignatureMethod () { + const { historic, transaction } = this.props; + const { methodName } = this.state; return (
      - { historic ? 'Executed' : 'Will execute' } the { name } function on the contract, passing the following values as part of the transaction: + { historic ? 'Executed' : 'Will execute' } the { methodName } function on the contract, transferring { this.renderEtherValue(transaction.value) } and passing the following values as part of the transaction:
      { this.renderInputs() } @@ -126,15 +182,24 @@ export default class Method extends Component { ); } + renderUnknownMethod () { + const { historic, transaction } = this.props; + + return ( +
      + { historic ? 'Executed' : 'Will execute' } an unknown/unregistered method on the contract, transferring { this.renderEtherValue(transaction.value) }. +
      + ); + } + renderInputs () { - const { accounts, contacts, tokens } = this.props; - const { inputs } = this.state; + const { methodInputs } = this.state; - return inputs.map((input, index) => { + return methodInputs.map((input, index) => { switch (input.type) { case 'address': const address = input.value; - const account = (accounts || {})[address] || (contacts || {})[address] || (tokens || {})[address]; + const account = this.getAccount(address); const name = account ? account.name.toUpperCase() : null; return ( @@ -172,43 +237,73 @@ export default class Method extends Component { return value.toString(); } - renderEther (value) { + renderTokenValue (value) { + const { token } = this.state; + + return ( + + { value.div(token.format).toFormat(5) }{ token.tag } + + ); + } + + renderEtherValue (value) { const { api } = this.context; const ether = api.util.fromWei(value); return ( - + { ether.toFormat(5) }ΞTH ); } - lookup (input) { - const { api, contracts } = this.context; + getAccount (address) { + const { accounts, contacts, contracts, tokens } = this.props; + + return (accounts || {})[address] || + (contacts || {})[address] || + (tokens || {})[address] || + (contracts || {})[address]; + } - if (!input) { + lookup (transaction) { + const { api } = this.context; + const { address, tokens } = this.props; + + if (!transaction || !transaction.input) { return; } - const { signature, paramdata } = api.util.decodeCallData(input); + const isReceived = transaction.to === address; + const token = (tokens || {})[isReceived ? transaction.from : transaction.to]; + this.setState({ token, isReceived }); + + const { signature, paramdata } = api.util.decodeCallData(transaction.input); + this.setState({ methodSignature: signature, methodParams: paramdata }); if (!signature || signature === CONTRACT_CREATE) { + this.setState({ isDeploy: true }); return; } - this.setState({ signature, paramdata }); + api.eth + .getCode(isReceived ? transaction.from : transaction.to) + .then((code) => { + if (code && code !== '0x') { + this.setState({ isContract: true }); + } - contracts.signatureReg - .lookup(signature) - .then(([method, owner]) => { - let inputs = null; - let name = null; + return Contracts.get().signatureReg.lookup(signature); + }).then((method) => { + let methodInputs = null; + let methodName = null; if (method && method.length) { const abi = api.util.methodToAbi(method); - name = abi.name; - inputs = api.util + methodName = abi.name; + methodInputs = api.util .decodeMethodInput(abi, paramdata) .map((value, index) => { const type = abi.inputs[index].type; @@ -217,7 +312,7 @@ export default class Method extends Component { }); } - this.setState({ method, name, inputs }); + this.setState({ method, methodName, methodInputs }); }) .catch((error) => { console.error('lookup', error); diff --git a/js/src/views/Account/Transactions/Transaction/transaction.js b/js/src/views/Account/Transactions/Transaction/transaction.js index bb06191e477..e5b465a628a 100644 --- a/js/src/views/Account/Transactions/Transaction/transaction.js +++ b/js/src/views/Account/Transactions/Transaction/transaction.js @@ -32,6 +32,7 @@ export default class Transaction extends Component { address: PropTypes.string.isRequired, accounts: PropTypes.object, contacts: PropTypes.object, + contracts: PropTypes.object, tokens: PropTypes.object, isTest: PropTypes.bool.isRequired } @@ -71,8 +72,8 @@ export default class Transaction extends Component { } renderMethod () { - const { accounts, contacts, tokens } = this.props; - const { info, isContract, isReceived } = this.state; + const { address, accounts, contacts, contracts, tokens } = this.props; + const { info } = this.state; if (!info) { return null; @@ -81,11 +82,11 @@ export default class Transaction extends Component { return ( ); } @@ -110,7 +111,7 @@ export default class Transaction extends Component { } renderAddress (prefix, address) { - const { accounts, contacts, tokens } = this.props; + const { accounts, contacts, contracts, tokens } = this.props; if (!address && !address.length) { return ( @@ -119,7 +120,7 @@ export default class Transaction extends Component { } const link = `${prefix}address/${address}`; - const account = (accounts || {})[address] || (contacts || {})[address] || (tokens || {})[address]; + const account = (accounts || {})[address] || (contacts || {})[address] || (tokens || {})[address] || (contracts || {})[address]; const name = account ? account.name.toUpperCase() : this.formatHash(address); @@ -203,15 +204,6 @@ export default class Transaction extends Component { ]) .then(([block, info]) => { this.setState({ block, info }); - - if (!transaction.to) { - return null; - } - - return api.eth.getCode(transaction.to); - }) - .then((code) => { - this.setState({ isContract: code && code !== '0x' }); }) .catch((error) => { console.error('lookup', error); diff --git a/js/src/views/Account/Transactions/transactions.js b/js/src/views/Account/Transactions/transactions.js index 907d29cdc74..31457e0f770 100644 --- a/js/src/views/Account/Transactions/transactions.js +++ b/js/src/views/Account/Transactions/transactions.js @@ -35,6 +35,7 @@ class Transactions extends Component { address: PropTypes.string.isRequired, accounts: PropTypes.object, contacts: PropTypes.object, + contracts: PropTypes.object, tokens: PropTypes.object, isTest: PropTypes.bool } @@ -87,7 +88,7 @@ class Transactions extends Component { } renderRows () { - const { address, accounts, contacts, tokens, isTest } = this.props; + const { address, accounts, contacts, contracts, tokens, isTest } = this.props; const { transactions } = this.state; return (transactions || []).map((transaction, index) => { @@ -98,6 +99,7 @@ class Transactions extends Component { address={ address } accounts={ accounts } contacts={ contacts } + contracts={ contracts } tokens={ tokens } isTest={ isTest } /> ); @@ -123,13 +125,14 @@ class Transactions extends Component { function mapStateToProps (state) { const { isTest } = state.nodeStatus; - const { accounts, contacts } = state.personal; + const { accounts, contacts, contracts } = state.personal; const { tokens } = state.balances; return { isTest, accounts, contacts, + contracts, tokens }; } From 64ccce35a5518a24b8a2ef887fdb1ef32546f881 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 27 Sep 2016 01:13:25 +0200 Subject: [PATCH 0836/1062] use IdentityIcon where addresses are displayed --- js/src/ui/IdentityIcon/identityIcon.css | 5 +++-- js/src/ui/IdentityIcon/identityIcon.js | 14 ++++++++++---- js/src/ui/MethodDecoding/methodDecoding.css | 11 +++++++++++ js/src/ui/MethodDecoding/methodDecoding.js | 19 +++++++++++++++---- 4 files changed, 39 insertions(+), 10 deletions(-) diff --git a/js/src/ui/IdentityIcon/identityIcon.css b/js/src/ui/IdentityIcon/identityIcon.css index 810a98bc157..34da4ebebd8 100644 --- a/js/src/ui/IdentityIcon/identityIcon.css +++ b/js/src/ui/IdentityIcon/identityIcon.css @@ -38,8 +38,9 @@ margin: 1em 0 0 0; } -.inline { - display: inline; +.inline, +.tiny { + display: inline-block; margin-right: 0.75em; } diff --git a/js/src/ui/IdentityIcon/identityIcon.js b/js/src/ui/IdentityIcon/identityIcon.js index 014654e0ba7..a92acce843c 100644 --- a/js/src/ui/IdentityIcon/identityIcon.js +++ b/js/src/ui/IdentityIcon/identityIcon.js @@ -30,6 +30,7 @@ export default class IdentityIcon extends Component { center: PropTypes.bool, padded: PropTypes.bool, inline: PropTypes.bool, + tiny: PropTypes.bool, tokens: PropTypes.object } @@ -55,7 +56,7 @@ export default class IdentityIcon extends Component { updateIcon (_address) { const { api } = this.context; - const { button, tokens, inline } = this.props; + const { button, tokens, inline, tiny } = this.props; const token = (tokens || {})[_address]; if (token && token.image) { @@ -67,7 +68,9 @@ export default class IdentityIcon extends Component { } let scale = 7; - if (button) { + if (tiny) { + scale = 2; + } else if (button) { scale = 3; } else if (inline) { scale = 4; @@ -79,10 +82,11 @@ export default class IdentityIcon extends Component { } render () { - const { button, className, center, inline, padded } = this.props; + const { button, className, center, inline, padded, tiny } = this.props; const { iconsrc } = this.state; const classes = [ styles.icon, + tiny ? styles.tiny : '', button ? styles.button : '', center ? styles.center : styles.left, inline ? styles.inline : '', @@ -91,7 +95,9 @@ export default class IdentityIcon extends Component { ].join(' '); let size = '56px'; - if (button) { + if (tiny) { + size = '16px'; + } else if (button) { size = '24px'; } else if (inline) { size = '32px'; diff --git a/js/src/ui/MethodDecoding/methodDecoding.css b/js/src/ui/MethodDecoding/methodDecoding.css index af0b74bbc70..e65df0589a7 100644 --- a/js/src/ui/MethodDecoding/methodDecoding.css +++ b/js/src/ui/MethodDecoding/methodDecoding.css @@ -28,6 +28,7 @@ background: rgba(255, 255, 255, 0.25); border-radius: 4px; padding: 0 0.25em; + margin: 0 0.25em; } .name, @@ -53,3 +54,13 @@ .etherValue, .tokenValue { } + +.address { + display: inline-block; + position: relative; +} + +.identityicon { + margin-bottom: -8px; + margin-right: 0.5em; +} diff --git a/js/src/ui/MethodDecoding/methodDecoding.js b/js/src/ui/MethodDecoding/methodDecoding.js index c06e8ec36e9..a0804679b7e 100644 --- a/js/src/ui/MethodDecoding/methodDecoding.js +++ b/js/src/ui/MethodDecoding/methodDecoding.js @@ -18,6 +18,7 @@ import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; import Contracts from '../../contracts'; +import IdentityIcon from '../IdentityIcon'; import { Input, InputAddress } from '../Form'; import styles from './methodDecoding.css'; @@ -97,15 +98,13 @@ export default class Method extends Component { const { methodSignature, methodInputs } = this.state; const [to, value] = methodInputs; const address = to.value; - const account = this.getAccount(address); - const name = account ? account.name.toUpperCase() : null; switch (TOKEN_METHODS[methodSignature]) { case 'transfer(to,value)': default: return (
      - { historic ? 'Transferred' : 'Will transfer' } { this.renderTokenValue(value.value) } to { name || address }. + { historic ? 'Transferred' : 'Will transfer' } { this.renderTokenValue(value.value) } to { this.renderAddressName(address) }.
      ); } @@ -124,7 +123,7 @@ export default class Method extends Component { return (
      - Deployed a contract at address { transaction.creates }. + Deployed a contract at address { this.renderAddressName(transaction.creates, false) }.
      ); } @@ -258,6 +257,18 @@ export default class Method extends Component { ); } + renderAddressName (address, withName = true) { + const account = this.getAccount(address); + const name = account ? account.name.toUpperCase() : null; + + return ( + + + { withName ? (name || address) : address } + + ); + } + getAccount (address) { const { accounts, contacts, contracts, tokens } = this.props; From 63560e4c2a3376848ed85d5b6d4aba708dfe6af3 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 27 Sep 2016 01:30:01 +0200 Subject: [PATCH 0837/1062] padding & spacing, IdentityIcon allows token transaltion everywhere --- js/src/ui/Form/AddressSelect/addressSelect.js | 4 ++++ js/src/ui/Form/InputAddress/inputAddress.js | 4 +++- .../ui/Form/InputAddressSelect/inputAddressSelect.js | 7 +++++-- js/src/ui/MethodDecoding/methodDecoding.css | 8 ++++---- js/src/ui/MethodDecoding/methodDecoding.js | 11 ++++++----- 5 files changed, 22 insertions(+), 12 deletions(-) diff --git a/js/src/ui/Form/AddressSelect/addressSelect.js b/js/src/ui/Form/AddressSelect/addressSelect.js index 84c88ab172f..6cd0996ff75 100644 --- a/js/src/ui/Form/AddressSelect/addressSelect.js +++ b/js/src/ui/Form/AddressSelect/addressSelect.js @@ -31,6 +31,7 @@ export default class AddressSelect extends Component { hint: PropTypes.string, error: PropTypes.string, value: PropTypes.string, + tokens: PropTypes.object, onChange: PropTypes.func.isRequired } @@ -62,11 +63,14 @@ export default class AddressSelect extends Component { } renderSelectEntry = (entry) => { + const { tokens } = this.props; + const item = (
      diff --git a/js/src/ui/Form/InputAddress/inputAddress.js b/js/src/ui/Form/InputAddress/inputAddress.js index e791725557f..dde7c3a7cc0 100644 --- a/js/src/ui/Form/InputAddress/inputAddress.js +++ b/js/src/ui/Form/InputAddress/inputAddress.js @@ -30,6 +30,7 @@ export default class InputAddress extends Component { hint: PropTypes.string, value: PropTypes.string, nameValue: PropTypes.string, + tokens: PropTypes.object, onChange: PropTypes.func, onSubmit: PropTypes.func }; @@ -55,7 +56,7 @@ export default class InputAddress extends Component { } renderIcon () { - const { value } = this.props; + const { value, tokens } = this.props; if (!value || !value.length) { return null; @@ -65,6 +66,7 @@ export default class InputAddress extends Component {
      ); diff --git a/js/src/ui/Form/InputAddressSelect/inputAddressSelect.js b/js/src/ui/Form/InputAddressSelect/inputAddressSelect.js index 46332fcc807..e2c5e8a1dd1 100644 --- a/js/src/ui/Form/InputAddressSelect/inputAddressSelect.js +++ b/js/src/ui/Form/InputAddressSelect/inputAddressSelect.js @@ -34,6 +34,7 @@ class InputAddressSelect extends Component { label: PropTypes.string, hint: PropTypes.string, value: PropTypes.string, + tokens: PropTypes.object, onChange: PropTypes.func }; @@ -59,7 +60,7 @@ class InputAddressSelect extends Component { } renderInput () { - const { disabled, error, hint, label, value } = this.props; + const { disabled, error, hint, label, value, tokens } = this.props; return ( ); } renderSelect () { - const { accounts, contacts, disabled, error, hint, label, value } = this.props; + const { accounts, contacts, disabled, error, hint, label, value, tokens } = this.props; return ( ); } diff --git a/js/src/ui/MethodDecoding/methodDecoding.css b/js/src/ui/MethodDecoding/methodDecoding.css index e65df0589a7..08d08183845 100644 --- a/js/src/ui/MethodDecoding/methodDecoding.css +++ b/js/src/ui/MethodDecoding/methodDecoding.css @@ -19,7 +19,7 @@ } .description { - line-height: 1.5em; + line-height: 2em; padding-bottom: 0.5em; } @@ -27,7 +27,7 @@ .highlight { background: rgba(255, 255, 255, 0.25); border-radius: 4px; - padding: 0 0.25em; + padding: 0.25em 0.5em; margin: 0 0.25em; } @@ -38,7 +38,7 @@ } .inputs { - padding-left: 1.5em; + padding-left: 2em; } .input { @@ -61,6 +61,6 @@ } .identityicon { - margin-bottom: -8px; + margin-bottom: -9px; margin-right: 0.5em; } diff --git a/js/src/ui/MethodDecoding/methodDecoding.js b/js/src/ui/MethodDecoding/methodDecoding.js index a0804679b7e..cdb05e11dd1 100644 --- a/js/src/ui/MethodDecoding/methodDecoding.js +++ b/js/src/ui/MethodDecoding/methodDecoding.js @@ -134,7 +134,7 @@ export default class Method extends Component { return (
      - { historic ? 'Received' : 'Will receive' } { this.renderEtherValue(transaction.value) } { isContract ? 'from the contract.' : 'from the sender.' } + { historic ? 'Received' : 'Will receive' } { this.renderEtherValue(transaction.value) } { isContract ? 'from the contract' : 'from the sender' } { this.renderAddressName(transaction.from) }
      ); } @@ -145,7 +145,7 @@ export default class Method extends Component { return (
      - { historic ? 'Transferred' : 'Will transfer' } a value of { this.renderEtherValue(transaction.value) } { isContract ? 'to the contract.' : 'to the recipient.' } + { historic ? 'Transferred' : 'Will transfer' } a value of { this.renderEtherValue(transaction.value) } { isContract ? 'to the contract' : 'to the recipient' } { this.renderAddressName(transaction.to) }
      ); } @@ -172,7 +172,7 @@ export default class Method extends Component { return (
      - { historic ? 'Executed' : 'Will execute' } the { methodName } function on the contract, transferring { this.renderEtherValue(transaction.value) } and passing the following values as part of the transaction: + { historic ? 'Executed' : 'Will execute' } the { methodName } function on the contract { this.renderAddressName(transaction.to) }, transferring { this.renderEtherValue(transaction.value) } and passing the following values as part of the transaction:
      { this.renderInputs() } @@ -186,7 +186,7 @@ export default class Method extends Component { return (
      - { historic ? 'Executed' : 'Will execute' } an unknown/unregistered method on the contract, transferring { this.renderEtherValue(transaction.value) }. + { historic ? 'Executed' : 'Will execute' } an unknown/unregistered method on the contract { this.renderAddressName(transaction.to) }, transferring { this.renderEtherValue(transaction.value) }.
      ); } @@ -258,12 +258,13 @@ export default class Method extends Component { } renderAddressName (address, withName = true) { + const { tokens } = this.props; const account = this.getAccount(address); const name = account ? account.name.toUpperCase() : null; return ( - + { withName ? (name || address) : address } ); From 901006a8fda6290d87fb1331e3d25bda62ab99fe Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 27 Sep 2016 01:31:05 +0200 Subject: [PATCH 0838/1062] slightly more subtle highlights --- js/src/ui/MethodDecoding/methodDecoding.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/ui/MethodDecoding/methodDecoding.css b/js/src/ui/MethodDecoding/methodDecoding.css index 08d08183845..4b9436d34f5 100644 --- a/js/src/ui/MethodDecoding/methodDecoding.css +++ b/js/src/ui/MethodDecoding/methodDecoding.css @@ -25,7 +25,7 @@ .name, .highlight { - background: rgba(255, 255, 255, 0.25); + background: rgba(255, 255, 255, 0.1); border-radius: 4px; padding: 0.25em 0.5em; margin: 0 0.25em; From 16e4062be769af9410888e0a2d83442f4b11e265 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 27 Sep 2016 07:46:21 +0200 Subject: [PATCH 0839/1062] remove unused renderSimple --- js/src/ui/MethodDecoding/methodDecoding.js | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/js/src/ui/MethodDecoding/methodDecoding.js b/js/src/ui/MethodDecoding/methodDecoding.js index cdb05e11dd1..576d6178e1a 100644 --- a/js/src/ui/MethodDecoding/methodDecoding.js +++ b/js/src/ui/MethodDecoding/methodDecoding.js @@ -150,21 +150,6 @@ export default class Method extends Component { ); } - renderSimple () { - const { methodName } = this.state; - - return ( -
      -
      - { methodName } -
      -
      - { this.renderInputs() } -
      -
      - ); - } - renderSignatureMethod () { const { historic, transaction } = this.props; const { methodName } = this.state; From 5167462eee8901f233d89bb124cfb8b14e396d96 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 27 Sep 2016 08:19:19 +0200 Subject: [PATCH 0840/1062] small styling alignments --- js/src/ui/MethodDecoding/methodDecoding.css | 8 +++++--- js/src/views/Account/Transactions/transactions.css | 3 +-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/js/src/ui/MethodDecoding/methodDecoding.css b/js/src/ui/MethodDecoding/methodDecoding.css index 4b9436d34f5..991b2ff33f9 100644 --- a/js/src/ui/MethodDecoding/methodDecoding.css +++ b/js/src/ui/MethodDecoding/methodDecoding.css @@ -16,6 +16,7 @@ */ .details { + color: #aaa; } .description { @@ -26,15 +27,16 @@ .name, .highlight { background: rgba(255, 255, 255, 0.1); + color: white; border-radius: 4px; - padding: 0.25em 0.5em; - margin: 0 0.25em; + padding: 0.25em 0.4em; + /*margin: 0 0.25em;*/ } .name, .inputs, .highlight { - font-family: 'Roboto Mono'; + /*font-family: 'Roboto Mono';*/ } .inputs { diff --git a/js/src/views/Account/Transactions/transactions.css b/js/src/views/Account/Transactions/transactions.css index e491f4ce37e..a4feb47c9f7 100644 --- a/js/src/views/Account/Transactions/transactions.css +++ b/js/src/views/Account/Transactions/transactions.css @@ -40,7 +40,7 @@ } .transactions tr:nth-child(even) { - background: rgba(255, 255, 255, 0.05); + background: rgba(255, 255, 255, 0.04); } .transactions th { @@ -90,7 +90,6 @@ } .method { - opacity: 0.75; width: 40%; } From 26e5ca9be33da2c02dd7e832d3a68dd8633cb6c9 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 27 Sep 2016 08:30:51 +0200 Subject: [PATCH 0841/1062] s/owner/creator/ (matching new contract interface) --- js/src/dapps/signaturereg/Events/events.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/js/src/dapps/signaturereg/Events/events.js b/js/src/dapps/signaturereg/Events/events.js index 9f5565ce577..302b5125041 100644 --- a/js/src/dapps/signaturereg/Events/events.js +++ b/js/src/dapps/signaturereg/Events/events.js @@ -63,16 +63,16 @@ export default class Events extends Component { const { events } = this.state; return events.map((event) => { - const name = accountsInfo[event.params.owner] - ? accountsInfo[event.params.owner].name - : event.params.owver; + const name = accountsInfo[event.params.creator] + ? accountsInfo[event.params.creator].name + : event.params.creator; return ( { formatBlockTimestamp(event.block) } { formatBlockNumber(event.blockNumber) } - +
      { name }
      { formatSignature(event.params.signature) } From 92b7cfbee642f83f320ddade868f6112105c74d3 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 27 Sep 2016 08:35:01 +0200 Subject: [PATCH 0842/1062] TabBar invariant error --- js/src/views/Application/TabBar/tabBar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index bf78f2180fc..0be7a3398f0 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -204,7 +204,7 @@ export default class TabBar extends Component { const { router } = this.context; router.push(activeRoute); - this.setState(activeRoute); + this.setState({ activeRoute }); } toggleMenu = (event, menu) => { From 6c915dba29a9e1fbf1a2779710a9d58d2e94633f Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 27 Sep 2016 08:36:18 +0200 Subject: [PATCH 0843/1062] pending requests padding (unrelated, inconsequential) --- js/src/views/Signer/containers/RequestsPage/RequestsPage.css | 1 - 1 file changed, 1 deletion(-) diff --git a/js/src/views/Signer/containers/RequestsPage/RequestsPage.css b/js/src/views/Signer/containers/RequestsPage/RequestsPage.css index 78df744fbd8..3dbf1cf4811 100644 --- a/js/src/views/Signer/containers/RequestsPage/RequestsPage.css +++ b/js/src/views/Signer/containers/RequestsPage/RequestsPage.css @@ -18,7 +18,6 @@ } .noRequestsMsg { - padding: 25px 0; color: #aaa; } From 8f3e25395b40106e05463d93f1adaf01406022a5 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 27 Sep 2016 11:24:45 +0200 Subject: [PATCH 0844/1062] updated styling & gas display --- js/src/ui/MethodDecoding/methodDecoding.css | 17 ++++++--- js/src/ui/MethodDecoding/methodDecoding.js | 39 ++++++++++++++++++--- 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/js/src/ui/MethodDecoding/methodDecoding.css b/js/src/ui/MethodDecoding/methodDecoding.css index 991b2ff33f9..6c6fd0ec849 100644 --- a/js/src/ui/MethodDecoding/methodDecoding.css +++ b/js/src/ui/MethodDecoding/methodDecoding.css @@ -15,10 +15,21 @@ /* along with Parity. If not, see . */ -.details { +.container { +} + +.details, +.gasDetails { color: #aaa; } +.gasDetails { + padding-top: 1em; + font-size: 0.75em; + line-height: 2em; + opacity: 0.75; +} + .description { line-height: 2em; padding-bottom: 0.5em; @@ -30,13 +41,11 @@ color: white; border-radius: 4px; padding: 0.25em 0.4em; - /*margin: 0 0.25em;*/ } .name, .inputs, .highlight { - /*font-family: 'Roboto Mono';*/ } .inputs { @@ -63,6 +72,6 @@ } .identityicon { - margin-bottom: -9px; + margin-bottom: -10px; margin-right: 0.5em; } diff --git a/js/src/ui/MethodDecoding/methodDecoding.js b/js/src/ui/MethodDecoding/methodDecoding.js index 576d6178e1a..0bb49fb2e05 100644 --- a/js/src/ui/MethodDecoding/methodDecoding.js +++ b/js/src/ui/MethodDecoding/methodDecoding.js @@ -72,6 +72,33 @@ export default class Method extends Component { } render () { + const { transaction } = this.props; + + if (!transaction) { + return null; + } + + return ( +
      + { this.renderAction() } + { this.renderGas() } +
      + ); + } + + renderGas () { + const { historic, transaction } = this.props; + const { gas, gasPrice } = transaction; + const gasValue = gas.mul(gasPrice); + + return ( +
      + { historic ? 'Used' : 'Will use' } { gas.toFormat(0) } gas ({ gasPrice.div(1000000).toFormat(0) }M/ΞTH) for a total transaction cost of { this.renderEtherValue(gasValue) } +
      + ); + } + + renderAction () { const { methodName, methodInputs, methodSignature, token, isDeploy, isReceived } = this.state; if (isDeploy) { @@ -134,7 +161,7 @@ export default class Method extends Component { return (
      - { historic ? 'Received' : 'Will receive' } { this.renderEtherValue(transaction.value) } { isContract ? 'from the contract' : 'from the sender' } { this.renderAddressName(transaction.from) } + { historic ? 'Received' : 'Will receive' } { this.renderEtherValue(transaction.value) } from { isContract ? 'the contract' : '' } { this.renderAddressName(transaction.from) }
      ); } @@ -145,7 +172,7 @@ export default class Method extends Component { return (
      - { historic ? 'Transferred' : 'Will transfer' } a value of { this.renderEtherValue(transaction.value) } { isContract ? 'to the contract' : 'to the recipient' } { this.renderAddressName(transaction.to) } + { historic ? 'Transferred' : 'Will transfer' } { this.renderEtherValue(transaction.value) } to { isContract ? 'the contract' : '' } { this.renderAddressName(transaction.to) }
      ); } @@ -157,7 +184,7 @@ export default class Method extends Component { return (
      - { historic ? 'Executed' : 'Will execute' } the { methodName } function on the contract { this.renderAddressName(transaction.to) }, transferring { this.renderEtherValue(transaction.value) } and passing the following values as part of the transaction: + { historic ? 'Executed' : 'Will execute' } the { methodName } function on the contract { this.renderAddressName(transaction.to) }, transferring { this.renderEtherValue(transaction.value) }, passing the following parameters:
      { this.renderInputs() } @@ -268,7 +295,7 @@ export default class Method extends Component { const { api } = this.context; const { address, tokens } = this.props; - if (!transaction || !transaction.input) { + if (!transaction) { return; } @@ -276,6 +303,10 @@ export default class Method extends Component { const token = (tokens || {})[isReceived ? transaction.from : transaction.to]; this.setState({ token, isReceived }); + if (!transaction.input) { + return; + } + const { signature, paramdata } = api.util.decodeCallData(transaction.input); this.setState({ methodSignature: signature, methodParams: paramdata }); From 7a00bb409ef441aafbb4640afe903186cfa48164 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 27 Sep 2016 11:51:12 +0200 Subject: [PATCH 0845/1062] initial structure --- js/src/views/Settings/index.js | 17 ++++++++++++++++ js/src/views/Settings/settings.js | 33 +++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 js/src/views/Settings/index.js create mode 100644 js/src/views/Settings/settings.js diff --git a/js/src/views/Settings/index.js b/js/src/views/Settings/index.js new file mode 100644 index 00000000000..df89b073d2d --- /dev/null +++ b/js/src/views/Settings/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './settings'; diff --git a/js/src/views/Settings/settings.js b/js/src/views/Settings/settings.js new file mode 100644 index 00000000000..f0c5a8ccb4b --- /dev/null +++ b/js/src/views/Settings/settings.js @@ -0,0 +1,33 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import styles from './settings.css'; + +export default class Settings extends Component { + static propTypes = { + } + + state = { + } + + render () { + return ( +
      hello
      + ); + } +} From 881a4bf7d3d1c0ed00b41bd4656b547d98750b8c Mon Sep 17 00:00:00 2001 From: Jannis R Date: Tue, 27 Sep 2016 12:45:12 +0200 Subject: [PATCH 0846/1062] registry: fix setting A records --- js/src/dapps/registry/records/actions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/dapps/registry/records/actions.js b/js/src/dapps/registry/records/actions.js index 9e8b160637c..2bf9224f91e 100644 --- a/js/src/dapps/registry/records/actions.js +++ b/js/src/dapps/registry/records/actions.js @@ -15,7 +15,7 @@ export const update = (name, key, value) => (dispatch, getState) => { name = name.toLowerCase(); const options = { from: account.address }; - const values = [ sha3(name), key, name === 'a' ? value : sha3(value) ]; + const values = [ sha3(name), key, key.toLowerCase() === 'a' ? value : sha3(value) ]; dispatch(start(name, key, value)); fn.estimateGas(options, values) From 32766a2607cb486430b06de38c6ecb6b72e63537 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Tue, 27 Sep 2016 14:07:08 +0200 Subject: [PATCH 0847/1062] registry: show reserved events by default --- js/src/dapps/registry/Container.js | 8 ++++++-- js/src/dapps/registry/addresses/actions.js | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/js/src/dapps/registry/Container.js b/js/src/dapps/registry/Container.js index 4bf738bf8ba..d8f85ceadca 100644 --- a/js/src/dapps/registry/Container.js +++ b/js/src/dapps/registry/Container.js @@ -36,8 +36,12 @@ class Container extends Component { }; componentDidMount () { - this.props.actions.addresses.fetch(); - this.props.actions.fetchContract(); + Promise.all([ + this.props.actions.addresses.fetch(), + this.props.actions.fetchContract() + ]).then(() => { + this.props.actions.events.subscribe('Reserved'); + }); } render () { diff --git a/js/src/dapps/registry/addresses/actions.js b/js/src/dapps/registry/addresses/actions.js index 48ef3773a2b..6a9ae826afe 100644 --- a/js/src/dapps/registry/addresses/actions.js +++ b/js/src/dapps/registry/addresses/actions.js @@ -19,7 +19,7 @@ import { personal } from '../parity.js'; export const set = (addresses) => ({ type: 'addresses set', addresses }); export const fetch = () => (dispatch) => { - Promise.all([ personal.listAccounts(), personal.accountsInfo() ]) + return Promise.all([ personal.listAccounts(), personal.accountsInfo() ]) .then(([ accounts, data ]) => { const addresses = Object.keys(data) .filter((address) => data[address] && !data[address].meta.deleted) From 5be18a0b179ba7902805e4e3350cd0787d5d7785 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Tue, 27 Sep 2016 14:07:21 +0200 Subject: [PATCH 0848/1062] registry: code style :sparkles:, bugfix :bug: --- js/src/dapps/registry/Lookup/lookup.js | 4 ++-- js/src/dapps/registry/events/events.js | 5 +++-- js/src/dapps/registry/ui/image.js | 5 +++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/js/src/dapps/registry/Lookup/lookup.js b/js/src/dapps/registry/Lookup/lookup.js index a15774c1682..4238f116010 100644 --- a/js/src/dapps/registry/Lookup/lookup.js +++ b/js/src/dapps/registry/Lookup/lookup.js @@ -49,9 +49,9 @@ export default class Lookup extends Component { if (result) { if (type === 'A') { output = ({ renderAddress(result, accounts, contacts, false) }); - } else if (type === 'IMG') { + } else if (type === 'IMG') { output = renderImage(result); - } else if (type === 'CONTENT') { + } else if (type === 'CONTENT') { output = (
      { result }

      This is most likely just the hash of the content you are looking for

      diff --git a/js/src/dapps/registry/events/events.js b/js/src/dapps/registry/events/events.js index 16180e65b9c..28d32f59a71 100644 --- a/js/src/dapps/registry/events/events.js +++ b/js/src/dapps/registry/events/events.js @@ -40,7 +40,7 @@ const renderStatus = (timestamp, isPending) => { { timestamp.fromNow() } ); -} +}; const renderEvent = (classNames, verb) => (e, accounts, contacts) => { const classes = e.state === 'pending' @@ -57,12 +57,13 @@ const renderEvent = (classNames, verb) => (e, accounts, contacts) => { }; const renderDataChanged = (e, accounts, contacts) => { + let classNames = styles.dataChanged; if (e.state === 'pending') { classNames += ' ' + styles.pending; } return ( -
      +
      { renderAddress(e.parameters.owner, accounts, contacts) } { ' ' }updated key { new Buffer(e.parameters.plainKey).toString('utf8') } diff --git a/js/src/dapps/registry/ui/image.js b/js/src/dapps/registry/ui/image.js index dfa3f69b761..601db4a077c 100644 --- a/js/src/dapps/registry/ui/image.js +++ b/js/src/dapps/registry/ui/image.js @@ -19,11 +19,12 @@ import React from 'react'; const styles = { padding: '.5em', border: '1px solid #777' -} +}; export default (address) => ( { + style={ styles } + /> ); From 9600584c08b8b9e6efcb022c04877a2f31579e13 Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Tue, 27 Sep 2016 13:31:10 +0100 Subject: [PATCH 0849/1062] Displaying query results (#2257) --- .../views/Contract/Queries/input-queries.js | 149 ++++++++++++++++++ js/src/views/Contract/Queries/queries.js | 75 ++------- 2 files changed, 161 insertions(+), 63 deletions(-) create mode 100644 js/src/views/Contract/Queries/input-queries.js diff --git a/js/src/views/Contract/Queries/input-queries.js b/js/src/views/Contract/Queries/input-queries.js new file mode 100644 index 00000000000..ee0bfac74ec --- /dev/null +++ b/js/src/views/Contract/Queries/input-queries.js @@ -0,0 +1,149 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; +import React, { Component, PropTypes } from 'react'; +import Chip from 'material-ui/Chip'; +import TextField from 'material-ui/TextField'; +import LinearProgress from 'material-ui/LinearProgress'; +import RaisedButton from 'material-ui/RaisedButton'; + +import styles from '../contract.css'; + +export default class InputQueries extends Component { + static contextTypes = { + api: PropTypes.object + } + + static propTypes = { + contract: PropTypes.object.isRequired, + inputs: PropTypes.array.isRequired, + outputs: PropTypes.array.isRequired, + name: PropTypes.string.isRequired + } + + state = { + isValid: true, + results: [], + values: {} + } + + render () { + const { inputs, name } = this.props; + const { isValid } = this.state; + + const inputsFields = inputs + .map(input => this.renderInput(input)); + + return (
      + { name } + { this.renderResults() } + { inputsFields } + +
      ); + } + + renderResults () { + const { results, isLoading } = this.state; +console.log(this.props.outputs); + if (isLoading) { + return (); + } + + if (!results || results.length < 1) return null; + + return results.map((result, index) => ( + + { this.renderValue(result) } + + )); + } + + renderInput (input) { + const { name, kind } = input; + + const onChange = (event) => { + const value = event.target.value; + const { values } = this.state; + + this.setState({ + values: { + ...values, + [ name ]: value + } + }); + }; + + return ( +
      + +
      + ); + } + + renderValue (value) { + if (!value) return null; + + const { api } = this.context; + let valueToDisplay = value.toString(); + + if (api.util.isInstanceOf(value, BigNumber)) { + valueToDisplay = value.toFormat(0); + } else if (api.util.isArray(value)) { + valueToDisplay = api.util.bytesToHex(value); + } + + return ({ valueToDisplay }); + } + + onClick = () => { + const { values } = this.state; + const { inputs, contract, name } = this.props; + + this.setState({ + isLoading: true, + results: [] + }); + + const inputValues = inputs.map(input => values[input.name]); + + contract + .instance[name] + .call({}, inputValues) + .then(results => { + this.setState({ + isLoading: false, + results: [].concat(results) + }); + }) + .catch(e => { + console.error(`sending ${name} with params`, inputValues, e); + }); + }; +} diff --git a/js/src/views/Contract/Queries/queries.js b/js/src/views/Contract/Queries/queries.js index 558792f3916..c2961037f3c 100644 --- a/js/src/views/Contract/Queries/queries.js +++ b/js/src/views/Contract/Queries/queries.js @@ -17,9 +17,8 @@ import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; import Chip from 'material-ui/Chip'; -import TextField from 'material-ui/TextField'; -import RaisedButton from 'material-ui/RaisedButton'; +import InputQueries from './input-queries'; import { Container, ContainerTitle } from '../../../ui'; import styles from '../contract.css'; @@ -64,6 +63,9 @@ export default class Queries extends Component {
      { noInputQueries } +
      +
      +
      { withInputQueries }
      @@ -71,69 +73,16 @@ export default class Queries extends Component { } renderInputQuery (fn) { - const { inputs } = fn; - - const inputsFields = inputs - .map(input => this.renderInput(fn.name, input)); - - const onClick = () => { - const form = this.state.forms[fn.name]; - const inputsValue = inputs.map(input => { - if (!form) return null; - return form[input.name]; - }); - - this.props - .contract.instance[fn.name] - .call({}, inputsValue) - .then(results => { - console.log(results); - }) - .catch(e => { - console.error(`sending ${fn.name} with params`, inputsValue, e); - }); - }; - - return ( -
      - { fn.name } - { inputsFields } - -
      - ); - } - - renderInput (fnName, input) { - const { name, kind } = input; - const onChange = (event) => { - const value = event.target.value; - const { forms } = this.state; - - this.setState({ - forms: { - ...forms, - [fnName]: { - ...forms[fnName], - [ name ]: value - } - } - }); - }; + const { inputs, outputs } = fn; + const { contract } = this.props; return ( -
      - +
      ); From ee23518fd20e2d3521905afc6989ee0cbc67e139 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 27 Sep 2016 14:41:07 +0200 Subject: [PATCH 0850/1062] settings tab operational --- js/src/index.js | 7 ++- js/src/views/Application/TabBar/tabBar.css | 33 +++-------- js/src/views/Application/TabBar/tabBar.js | 44 +++++---------- .../views/Settings/Background/background.js | 31 ++++++++++ js/src/views/Settings/Background/index.js | 17 ++++++ js/src/views/Settings/Views/index.js | 17 ++++++ js/src/views/Settings/Views/views.js | 33 +++++++++++ js/src/views/Settings/index.js | 8 +++ js/src/views/Settings/settings.css | 56 +++++++++++++++++++ js/src/views/Settings/settings.js | 44 ++++++++++++++- js/src/views/index.js | 4 ++ 11 files changed, 234 insertions(+), 60 deletions(-) create mode 100644 js/src/views/Settings/Background/background.js create mode 100644 js/src/views/Settings/Background/index.js create mode 100644 js/src/views/Settings/Views/index.js create mode 100644 js/src/views/Settings/Views/views.js create mode 100644 js/src/views/Settings/settings.css diff --git a/js/src/index.js b/js/src/index.js index 9cc0d16dc9e..85b25ef93ab 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -31,7 +31,7 @@ import Web3 from 'web3'; import Api from './api'; import { initStore } from './redux'; import { ContextProvider, muiTheme } from './ui'; -import { Accounts, Account, Addresses, Address, Application, Contract, Contracts, Dapp, Dapps, Signer, Status } from './views'; +import { Accounts, Account, Addresses, Address, Application, Contract, Contracts, Dapp, Dapps, Settings, SettingsBackground, SettingsViews, Signer, Status } from './views'; // TODO: This is VERY messy, just dumped here to get the Signer going import { Web3Provider as SignerWeb3Provider, web3Extension as statusWeb3Extension } from './views/Signer/components'; @@ -80,6 +80,7 @@ ReactDOM.render( + @@ -89,6 +90,10 @@ ReactDOM.render( + + + + diff --git a/js/src/views/Application/TabBar/tabBar.css b/js/src/views/Application/TabBar/tabBar.css index 2060b6e684d..00e5ee60182 100644 --- a/js/src/views/Application/TabBar/tabBar.css +++ b/js/src/views/Application/TabBar/tabBar.css @@ -27,7 +27,8 @@ .tabs button, .settings, -.logo { +.logo, +.last { background: rgba(0, 0, 0, 0.5) !important; /* rgba(0, 0, 0, 0.25) !important; */ } @@ -76,32 +77,14 @@ button.tabactive:hover { letter-spacing: 0.2em; } +.last { + margin: 0 -24px 0 0; + padding: 22px 12px 0 12px; + white-space: nowrap; +} + .signerIcon { width: 24px; height: 24px; margin-bottom: 5px; } - -.settings { - margin: 0 -24px 0 0; - padding: 12px 24px; -} - -.settings svg { - fill: rgba(255, 255, 255, 0.5) !important; -} - -svg.optionSelected { - fill: rgb(250, 250, 250) !important; -} - -svg.optionUnselected { - opacity: 0.1; -} - -.menuEnabled { -} - -.menuDisabled svg.optionSelected { - fill: rgba(255, 255, 255, 0.3) !important; -} diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index bf78f2180fc..bc1187bbd67 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -15,7 +15,6 @@ // along with Parity. If not, see . import React, { Component, PropTypes } from 'react'; -import { IconButton, IconMenu, MenuItem } from 'material-ui'; import { Toolbar, ToolbarGroup } from 'material-ui/Toolbar'; import { Tabs, Tab } from 'material-ui/Tabs'; import ActionAccountBalanceWallet from 'material-ui/svg-icons/action/account-balance-wallet'; @@ -24,7 +23,6 @@ import ActionSettings from 'material-ui/svg-icons/action/settings'; import CommunicationContacts from 'material-ui/svg-icons/communication/contacts'; import ImageGridOn from 'material-ui/svg-icons/image/grid-on'; import NavigationApps from 'material-ui/svg-icons/navigation/apps'; -import RemoveRedEye from 'material-ui/svg-icons/image/remove-red-eye'; import { Badge, ParityBackground, SignerIcon, Tooltip } from '../../../ui'; @@ -70,7 +68,7 @@ export default class TabBar extends Component { className={ styles.toolbar }> { this.renderLogo() } { this.renderTabs() } - { this.renderSettingsMenu() } + { this.renderLast() } ); @@ -87,36 +85,12 @@ export default class TabBar extends Component { ); } - renderSettingsMenu () { - const items = Object.keys(this.tabs).map((id) => { - const tab = this.tabs[id]; - const isActive = this.state[this.visibleId(id)]; - const icon = ( - - ); - - return ( - - ); - }); - + renderLast () { return ( - } - anchorOrigin={ { horizontal: 'right', vertical: 'bottom' } } - targetOrigin={ { horizontal: 'right', vertical: 'bottom' } } - touchTapCloseDelay={ 0 } - onItemTouchTap={ this.toggleMenu }> - { items } - +
      +
      +
      ); } @@ -312,6 +286,14 @@ export default class TabBar extends Component { renderLabel: this.renderSignerLabel, route: '/signer', value: 'signer' + }, + settings: { + active: true, + fixed: true, + icon: , + label: 'Settings', + route: '/settings', + value: 'settings' } } } diff --git a/js/src/views/Settings/Background/background.js b/js/src/views/Settings/Background/background.js new file mode 100644 index 00000000000..9065b30f048 --- /dev/null +++ b/js/src/views/Settings/Background/background.js @@ -0,0 +1,31 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +export default class Background extends Component { + static propTypes = { + } + + state = { + } + + render () { + return ( +
      background
      + ); + } +} diff --git a/js/src/views/Settings/Background/index.js b/js/src/views/Settings/Background/index.js new file mode 100644 index 00000000000..ffd3111f745 --- /dev/null +++ b/js/src/views/Settings/Background/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './background'; diff --git a/js/src/views/Settings/Views/index.js b/js/src/views/Settings/Views/index.js new file mode 100644 index 00000000000..0940e78a698 --- /dev/null +++ b/js/src/views/Settings/Views/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './views'; diff --git a/js/src/views/Settings/Views/views.js b/js/src/views/Settings/Views/views.js new file mode 100644 index 00000000000..c3f54ec7e02 --- /dev/null +++ b/js/src/views/Settings/Views/views.js @@ -0,0 +1,33 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import { Container } from '../../../ui'; + +export default class Views extends Component { + static propTypes = { + } + + state = { + } + + render () { + return ( + views + ); + } +} diff --git a/js/src/views/Settings/index.js b/js/src/views/Settings/index.js index df89b073d2d..29cdcb347af 100644 --- a/js/src/views/Settings/index.js +++ b/js/src/views/Settings/index.js @@ -14,4 +14,12 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . +import SettingsBackground from './Background'; +import SettingsViews from './Views'; + export default from './settings'; + +export { + SettingsBackground, + SettingsViews +}; diff --git a/js/src/views/Settings/settings.css b/js/src/views/Settings/settings.css new file mode 100644 index 00000000000..4496c1940cd --- /dev/null +++ b/js/src/views/Settings/settings.css @@ -0,0 +1,56 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.layout { +} + +.menu { + display: inline-block; +} + +.bar { + justify-content: flex-start !important; +} + +.tabs { + margin-left: 3em; +} + +.tab, +.tabActive { + padding: 16px 2em !important; + line-height: 24px !important; +} + +.tab.active { + +} + +.tab>div>div { + flex-direction: row !important; + height: auto !important; + align-items: none !important; +} + +.tab svg { + margin-right: 0.5em; +} + +.tab .menu { + vertical-align: top; + margin-bottom: 5px; +} diff --git a/js/src/views/Settings/settings.js b/js/src/views/Settings/settings.js index f0c5a8ccb4b..45d797c3a60 100644 --- a/js/src/views/Settings/settings.js +++ b/js/src/views/Settings/settings.js @@ -14,20 +14,58 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . +// 0xecf69634885f27a8f78161e530f15a8d3b57d39e755c222c92cf297b6e25aaaa + import React, { Component, PropTypes } from 'react'; +import { Tab, Tabs } from 'material-ui'; +import RemoveRedEye from 'material-ui/svg-icons/image/remove-red-eye'; + +import { Actionbar, Page } from '../../ui'; import styles from './settings.css'; export default class Settings extends Component { static propTypes = { + children: PropTypes.object.isRequired } - state = { + render () { + const { children } = this.props; + + return ( +
      + + + { this.renderTabs() } + + { children } + +
      + ); } - render () { + renderTabs () { return ( -
      hello
      + + } + label={
      views
      } /> + } + label={
      views
      } /> +
      ); } + + menuClick = (section) => { + const { router } = this.context; + + return (event) => router.push(`/settings/${section}`); + } } diff --git a/js/src/views/index.js b/js/src/views/index.js index afbcffda47d..0818c889965 100644 --- a/js/src/views/index.js +++ b/js/src/views/index.js @@ -24,6 +24,7 @@ import Contracts from './Contracts'; import Dapp from './Dapp'; import Dapps from './Dapps'; import ParityBar from './ParityBar'; +import Settings, { SettingsBackground, SettingsViews } from './Settings'; import Signer from './Signer'; import Status from './Status'; @@ -38,6 +39,9 @@ export { Dapp, Dapps, ParityBar, + Settings, + SettingsBackground, + SettingsViews, Signer, Status }; From 9fbf92aa66d459e36509f041f6e0de288213a10b Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Tue, 27 Sep 2016 15:06:45 +0100 Subject: [PATCH 0851/1062] Readable results and usable queries (#2257) --- .../views/Contract/Queries/input-queries.js | 76 ++++++++++++------- js/src/views/Contract/Queries/queries.js | 18 +++-- js/src/views/Contract/contract.css | 1 - 3 files changed, 58 insertions(+), 37 deletions(-) diff --git a/js/src/views/Contract/Queries/input-queries.js b/js/src/views/Contract/Queries/input-queries.js index ee0bfac74ec..f66e16e5e9d 100644 --- a/js/src/views/Contract/Queries/input-queries.js +++ b/js/src/views/Contract/Queries/input-queries.js @@ -19,9 +19,8 @@ import React, { Component, PropTypes } from 'react'; import Chip from 'material-ui/Chip'; import TextField from 'material-ui/TextField'; import LinearProgress from 'material-ui/LinearProgress'; -import RaisedButton from 'material-ui/RaisedButton'; - -import styles from '../contract.css'; +import FlatButton from 'material-ui/FlatButton'; +import { Card, CardActions, CardTitle, CardText } from 'material-ui/Card'; export default class InputQueries extends Component { static contextTypes = { @@ -48,35 +47,51 @@ export default class InputQueries extends Component { const inputsFields = inputs .map(input => this.renderInput(input)); - return (
      - { name } - { this.renderResults() } - { inputsFields } - -
      ); + return ( + + + + { this.renderResults() } + { inputsFields } + + + + + + ); } renderResults () { const { results, isLoading } = this.state; -console.log(this.props.outputs); + const { outputs } = this.props; + if (isLoading) { return (); } if (!results || results.length < 1) return null; - return results.map((result, index) => ( - - { this.renderValue(result) } - - )); + return outputs + .map((out, index) => ({ + name: out.name, + value: results[index] + })) + .map((out, index) => (
      +
      { out.name }
      + + { this.renderValue(out.value) } + +
      +
      )); } renderInput (input) { @@ -108,23 +123,22 @@ console.log(this.props.outputs); } renderValue (value) { - if (!value) return null; + if (!value) return 'no data'; const { api } = this.context; - let valueToDisplay = value.toString(); if (api.util.isInstanceOf(value, BigNumber)) { - valueToDisplay = value.toFormat(0); + return value.toFormat(0); } else if (api.util.isArray(value)) { - valueToDisplay = api.util.bytesToHex(value); + return api.util.bytesToHex(value); } - return ({ valueToDisplay }); + return value.toString(); } onClick = () => { const { values } = this.state; - const { inputs, contract, name } = this.props; + const { inputs, contract, name, outputs } = this.props; this.setState({ isLoading: true, @@ -137,9 +151,13 @@ console.log(this.props.outputs); .instance[name] .call({}, inputValues) .then(results => { + if (outputs.length === 1) { + results = [ results ]; + } + this.setState({ isLoading: false, - results: [].concat(results) + results }); }) .catch(e => { diff --git a/js/src/views/Contract/Queries/queries.js b/js/src/views/Contract/Queries/queries.js index c2961037f3c..bc72cecfb05 100644 --- a/js/src/views/Contract/Queries/queries.js +++ b/js/src/views/Contract/Queries/queries.js @@ -17,6 +17,7 @@ import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; import Chip from 'material-ui/Chip'; +import { Card, CardTitle, CardText } from 'material-ui/Card'; import InputQueries from './input-queries'; import { Container, ContainerTitle } from '../../../ui'; @@ -63,9 +64,6 @@ export default class Queries extends Component {
      { noInputQueries } -
      -
      -
      { withInputQueries }
      @@ -93,10 +91,16 @@ export default class Queries extends Component { return (
      -

      { fn.name }

      - { this.renderValue(values[fn.name]) } + key={ fn.signature }> + + + + { this.renderValue(values[fn.name]) } + +
      ); } diff --git a/js/src/views/Contract/contract.css b/js/src/views/Contract/contract.css index f76bd8303f3..ceb21da4e7d 100644 --- a/js/src/views/Contract/contract.css +++ b/js/src/views/Contract/contract.css @@ -20,7 +20,6 @@ .methods { display: flex; flex-wrap: wrap; - justify-content: space-around; } .method { From b0fb1fb4a3b9749f9f897f05eb0a0c7b30eba17c Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 27 Sep 2016 17:01:08 +0200 Subject: [PATCH 0852/1062] split view load/save into own section --- js/src/views/Application/TabBar/tabBar.css | 6 - js/src/views/Application/TabBar/tabBar.js | 121 +++-------------- js/src/views/Settings/Views/defaults.js | 143 +++++++++++++++++++++ js/src/views/Settings/Views/index.js | 6 + js/src/views/Settings/Views/views.css | 22 ++++ js/src/views/Settings/index.js | 5 +- 6 files changed, 195 insertions(+), 108 deletions(-) create mode 100644 js/src/views/Settings/Views/defaults.js create mode 100644 js/src/views/Settings/Views/views.css diff --git a/js/src/views/Application/TabBar/tabBar.css b/js/src/views/Application/TabBar/tabBar.css index 00e5ee60182..d5c8c78438d 100644 --- a/js/src/views/Application/TabBar/tabBar.css +++ b/js/src/views/Application/TabBar/tabBar.css @@ -82,9 +82,3 @@ button.tabactive:hover { padding: 22px 12px 0 12px; white-space: nowrap; } - -.signerIcon { - width: 24px; - height: 24px; - margin-bottom: 5px; -} diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index bc1187bbd67..d0c6eae55b3 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -17,14 +17,9 @@ import React, { Component, PropTypes } from 'react'; import { Toolbar, ToolbarGroup } from 'material-ui/Toolbar'; import { Tabs, Tab } from 'material-ui/Tabs'; -import ActionAccountBalanceWallet from 'material-ui/svg-icons/action/account-balance-wallet'; -import ActionTrackChanges from 'material-ui/svg-icons/action/track-changes'; -import ActionSettings from 'material-ui/svg-icons/action/settings'; -import CommunicationContacts from 'material-ui/svg-icons/communication/contacts'; -import ImageGridOn from 'material-ui/svg-icons/image/grid-on'; -import NavigationApps from 'material-ui/svg-icons/navigation/apps'; -import { Badge, ParityBackground, SignerIcon, Tooltip } from '../../../ui'; +import { defaultViews } from '../../Settings'; +import { Badge, ParityBackground, Tooltip } from '../../../ui'; import styles from './tabBar.css'; import imagesEthcoreBlock from '../../../images/ethcore-block.png'; @@ -35,7 +30,6 @@ const TABMAP = { apps: 'app', contracts: 'contract' }; -const LS_VIEWS = 'views'; export default class TabBar extends Component { static contextTypes = { @@ -57,6 +51,14 @@ export default class TabBar extends Component { activeRoute: '/accounts' } + constructor () { + super(); + + defaultViews.accounts.body = ; + defaultViews.signer.renderLabel = this.renderSignerLabel; + defaultViews.status.renderLabel = this.renderStatusLabel; + } + componentDidMount () { this.loadViews(); } @@ -99,16 +101,16 @@ export default class TabBar extends Component { const windowHash = (window.location.hash || '').split('?')[0].split('/')[1]; const hash = TABMAP[windowHash] || windowHash; - const items = Object.keys(this.tabs) + const items = Object.keys(defaultViews) .filter((id) => { - const tab = this.tabs[id]; + const tab = defaultViews[id]; const isFixed = tab.fixed; const isVisible = this.state[this.visibleId(id)]; return isFixed || isVisible; }) .map((id) => { - const tab = this.tabs[id]; + const tab = defaultViews[id]; const onActivate = () => this.onActivate(tab.route); return ( @@ -186,7 +188,7 @@ export default class TabBar extends Component { const toggle = this.visibleId(id); const isActive = this.state[toggle]; - if (this.tabs[id].fixed) { + if (defaultViews[id].fixed) { return; } @@ -195,105 +197,24 @@ export default class TabBar extends Component { }, this.saveViews); } - getDefaultViews () { - const views = {}; - - Object.keys(this.tabs).forEach((id) => { - const tab = this.tabs[id]; - - views[id] = { - active: tab.active || false - }; - }); - - return views; - } - loadViews () { - const defaults = this.getDefaultViews(); const state = {}; - let lsdata; - - try { - const json = window.localStorage.getItem(LS_VIEWS) || {}; - - lsdata = Object.assign(defaults, JSON.parse(json)); - } catch (e) { - lsdata = defaults; - } + const data = defaultViews.load(); - Object.keys(lsdata).forEach((id) => { - state[this.visibleId(id)] = lsdata[id].active; + Object.keys(data).forEach((id) => { + state[this.visibleId(id)] = data[id].active; }); this.setState(state, this.saveViews); } saveViews = () => { - const lsdata = this.getDefaultViews(); + const data = {}; - Object.keys(lsdata).forEach((id) => { - lsdata[id].active = this.state[this.visibleId(id)]; + Object.keys(data).forEach((id) => { + data[id] = { active: this.state[this.visibleId(id)] }; }); - window.localStorage.setItem(LS_VIEWS, JSON.stringify(lsdata)); - } - - tabs = { - accounts: { - active: true, - fixed: true, - icon: , - label: 'Accounts', - route: '/accounts', - value: 'account', - body: - }, - addresses: { - active: true, - icon: , - label: 'Addressbook', - route: '/addresses', - value: 'address' - }, - apps: { - active: true, - icon: , - label: 'Applications', - route: '/apps', - value: 'app' - }, - contracts: { - active: false, - icon: , - label: 'Contracts', - route: '/contracts', - value: 'contract' - }, - status: { - active: true, - icon: , - label: 'Status', - renderLabel: this.renderStatusLabel, - route: '/status', - value: 'status' - }, - signer: { - active: true, - fixed: true, - icon: , - label: 'Signer', - renderLabel: this.renderSignerLabel, - route: '/signer', - value: 'signer' - }, - settings: { - active: true, - fixed: true, - icon: , - label: 'Settings', - route: '/settings', - value: 'settings' - } + defaultViews.save(data); } } diff --git a/js/src/views/Settings/Views/defaults.js b/js/src/views/Settings/Views/defaults.js new file mode 100644 index 00000000000..e538e350c1f --- /dev/null +++ b/js/src/views/Settings/Views/defaults.js @@ -0,0 +1,143 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React from 'react'; +import ActionAccountBalanceWallet from 'material-ui/svg-icons/action/account-balance-wallet'; +import ActionTrackChanges from 'material-ui/svg-icons/action/track-changes'; +import ActionSettings from 'material-ui/svg-icons/action/settings'; +import CommunicationContacts from 'material-ui/svg-icons/communication/contacts'; +import ImageGridOn from 'material-ui/svg-icons/image/grid-on'; +import NavigationApps from 'material-ui/svg-icons/navigation/apps'; + +import { isFunction } from '../../../api/util'; +import { SignerIcon } from '../../../ui'; + +import styles from './views.css'; + +const LS_VIEWS = 'views'; + +const defaultViews = { + accounts: { + active: true, + fixed: true, + icon: , + label: 'Accounts', + route: '/accounts', + value: 'account', + description: 'A list of all the accounts associated to and imported into this Parity instance. Send transactions, receive incoming values, manage your balances and fund your accounts.' + }, + + addresses: { + active: true, + icon: , + label: 'Addressbook', + route: '/addresses', + value: 'address', + description: 'A list of all contacts and address book entries that is managed by this Parity instance. Watch accounts and have the details available at the click of a button when transacting.' + }, + + apps: { + active: true, + icon: , + label: 'Applications', + route: '/apps', + value: 'app', + description: 'Distributed applications that interact with the underlying network. Add applications, manage you application portfolio and interact with application from around the newtork.' + }, + + contracts: { + active: false, + icon: , + label: 'Contracts', + route: '/contracts', + value: 'contract', + description: 'Watch and interact with specific contracts that have been deployed on the network. This is a more technically-focussed environment, specifically for advanced users that understand the inner working of certain contracts.' + }, + + status: { + active: false, + icon: , + label: 'Status', + route: '/status', + value: 'status', + description: 'See how the Parity node is performing in terms of connections to the network, logs from the actual running instance and details of mining (if enabled and configured).' + }, + + signer: { + active: true, + fixed: true, + icon: , + label: 'Signer', + route: '/signer', + value: 'signer', + description: 'The security focussed area of the application where you can approve any outgoing transactions made from the application as well as those placed into the queue by distributed applications.' + }, + + settings: { + active: true, + fixed: true, + icon: , + label: 'Settings', + route: '/settings', + value: 'settings', + description: 'This view. Allows you to customize the application in term of options, operation and look and feel.' + }, + + getDefaultViews: () => { + const views = {}; + + Object.keys(this).forEach((id) => { + const view = this[id]; + + if (isFunction(view)) { + return; + } + + views[id] = { + active: view.active || false + }; + }); + + return views; + }, + + load: () => { + const defaults = this.getDefaults(); + let data; + + try { + const json = window.localStorage.getItem(LS_VIEWS) || {}; + + data = Object.assign(defaults, JSON.parse(json)); + } catch (e) { + data = defaults; + } + + return data; + }, + + save: (_data) => { + Object.keys(_data).forEach((id) => { + this.id.active = _data[id].active; + }); + + const data = defaultViews.getDefaults(); + + window.localStorage.setItem(LS_VIEWS, JSON.stringify(data)); + } +}; + +export default defaultViews; diff --git a/js/src/views/Settings/Views/index.js b/js/src/views/Settings/Views/index.js index 0940e78a698..cc189d4cac5 100644 --- a/js/src/views/Settings/Views/index.js +++ b/js/src/views/Settings/Views/index.js @@ -14,4 +14,10 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . +import defaultViews from './defaults'; + export default from './views'; + +export { + defaultViews +}; diff --git a/js/src/views/Settings/Views/views.css b/js/src/views/Settings/Views/views.css new file mode 100644 index 00000000000..6f28e7e3ff4 --- /dev/null +++ b/js/src/views/Settings/Views/views.css @@ -0,0 +1,22 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.signerIcon { + width: 24px; + height: 24px; + margin-bottom: 5px; +} diff --git a/js/src/views/Settings/index.js b/js/src/views/Settings/index.js index 29cdcb347af..66856d1613e 100644 --- a/js/src/views/Settings/index.js +++ b/js/src/views/Settings/index.js @@ -15,11 +15,12 @@ // along with Parity. If not, see . import SettingsBackground from './Background'; -import SettingsViews from './Views'; +import SettingsViews, { defaultViews } from './Views'; export default from './settings'; export { SettingsBackground, - SettingsViews + SettingsViews, + defaultViews }; From 869a754c5efef57280bf24e38a7372c9aeea99a5 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 27 Sep 2016 17:33:38 +0200 Subject: [PATCH 0853/1062] 2 column layouts for setting panes --- js/src/views/Settings/Views/defaults.js | 70 +++++++++++++------------ js/src/views/Settings/Views/views.js | 16 +++++- js/src/views/Settings/layout.css | 47 +++++++++++++++++ 3 files changed, 99 insertions(+), 34 deletions(-) create mode 100644 js/src/views/Settings/layout.css diff --git a/js/src/views/Settings/Views/defaults.js b/js/src/views/Settings/Views/defaults.js index e538e350c1f..17a1be56935 100644 --- a/js/src/views/Settings/Views/defaults.js +++ b/js/src/views/Settings/Views/defaults.js @@ -22,7 +22,6 @@ import CommunicationContacts from 'material-ui/svg-icons/communication/contacts' import ImageGridOn from 'material-ui/svg-icons/image/grid-on'; import NavigationApps from 'material-ui/svg-icons/navigation/apps'; -import { isFunction } from '../../../api/util'; import { SignerIcon } from '../../../ui'; import styles from './views.css'; @@ -94,50 +93,55 @@ const defaultViews = { route: '/settings', value: 'settings', description: 'This view. Allows you to customize the application in term of options, operation and look and feel.' - }, + } +}; - getDefaultViews: () => { - const views = {}; +const getFixed = () => { + const views = {}; - Object.keys(this).forEach((id) => { - const view = this[id]; + Object.keys(defaultViews).forEach((id) => { + if (defaultViews[id].fixed) { + views[id] = { active: true }; + } + }); - if (isFunction(view)) { - return; - } + return views; +}; - views[id] = { - active: view.active || false - }; - }); +const getDefaults = () => { + const views = {}; - return views; - }, + Object.keys(defaultViews).forEach((id) => { + views[id] = { + active: defaultViews[id].active || false + }; + }); - load: () => { - const defaults = this.getDefaults(); - let data; + return views; +}; - try { - const json = window.localStorage.getItem(LS_VIEWS) || {}; +defaultViews.load = () => { + const fixed = getFixed(); + const defaults = getDefaults(); + let data; - data = Object.assign(defaults, JSON.parse(json)); - } catch (e) { - data = defaults; - } + try { + const json = window.localStorage.getItem(LS_VIEWS) || {}; - return data; - }, + data = Object.assign(defaults, JSON.parse(json), fixed); + } catch (e) { + data = defaults; + } - save: (_data) => { - Object.keys(_data).forEach((id) => { - this.id.active = _data[id].active; - }); + return data; +}; - const data = defaultViews.getDefaults(); +defaultViews.save = (_data) => { + Object.keys(_data).forEach((id) => { + defaultViews.id.active = _data[id].active; + }); - window.localStorage.setItem(LS_VIEWS, JSON.stringify(data)); - } + window.localStorage.setItem(LS_VIEWS, JSON.stringify(getDefaults())); }; export default defaultViews; diff --git a/js/src/views/Settings/Views/views.js b/js/src/views/Settings/Views/views.js index c3f54ec7e02..7d6248532f4 100644 --- a/js/src/views/Settings/Views/views.js +++ b/js/src/views/Settings/Views/views.js @@ -18,6 +18,8 @@ import React, { Component, PropTypes } from 'react'; import { Container } from '../../../ui'; +import layout from '../layout.css'; + export default class Views extends Component { static propTypes = { } @@ -27,7 +29,19 @@ export default class Views extends Component { render () { return ( - views + +
      +
      +

      Manage the available application views, using only the parts of the application that is applicable to you.

      +

      Are you an end-user? The defaults are setups for both beginner and advanced users alike.

      +

      Are you a developer? Add some features to manage contracts are interact with application develoyments.

      +

      Are you a miner or run a large-scale node? Add the features to give you all the information needed to watch the node operation.

      +
      +
      + details goes here +
      +
      +
      ); } } diff --git a/js/src/views/Settings/layout.css b/js/src/views/Settings/layout.css new file mode 100644 index 00000000000..2460cf7355f --- /dev/null +++ b/js/src/views/Settings/layout.css @@ -0,0 +1,47 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.layout { + margin: 0 -1.5em; +} + +.layout::after { + display: table; + clear: both; + content: ''; +} + +.overview, .details { + float: left; + padding: 0 1.5em; + box-sizing: border-box; +} + +.overview { + opacity: 0.5; + width: 33.33333%; + width: -webkit-calc(100% / 12 * 4); + width: -moz-calc(100% / 12 * 4); + width: calc(100% / 12 * 4); +} + +.details { + width: 66.66665%; + width: -webkit-calc(100% / 12 * 8); + width: -moz-calc(100% / 12 * 8); + width: calc(100% / 12 * 8); +} From 8a9d831f70de58ecfdcd30bdd1553cac3cb9da77 Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Tue, 27 Sep 2016 16:36:02 +0100 Subject: [PATCH 0854/1062] Fixed txs reqs ordering in Embedded Signer // Fixed date being overwritten on new request --- .../Signer/containers/Embedded/embedded.js | 8 +++++++- js/src/views/Signer/reducers/requests.js | 19 +++++++++++++------ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/js/src/views/Signer/containers/Embedded/embedded.js b/js/src/views/Signer/containers/Embedded/embedded.js index 33118837fb3..b06e8d0cac6 100644 --- a/js/src/views/Signer/containers/Embedded/embedded.js +++ b/js/src/views/Signer/containers/Embedded/embedded.js @@ -14,6 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . +import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; @@ -70,7 +71,7 @@ class Embedded extends Component { renderPending = (data) => { const { actions } = this.props; - const { payload, id, isSending } = data; + const { payload, id, isSending, date } = data; return ( ); } + + _sortRequests = (a, b) => { + return new BigNumber(b.id).cmp(a.id); + } } function mapStateToProps (state) { diff --git a/js/src/views/Signer/reducers/requests.js b/js/src/views/Signer/reducers/requests.js index 89b5fe434ae..8f91f8b4266 100644 --- a/js/src/views/Signer/reducers/requests.js +++ b/js/src/views/Signer/reducers/requests.js @@ -33,9 +33,21 @@ export default handleActions({ }, 'update pendingRequests' (state, action) { + // Keep the date from the state + const pending = action.payload.map(request => { + const { id } = request; + const oldRequest = state.pending.find(r => r.id === id); + + request.date = (oldRequest && oldRequest.date) + ? oldRequest.date + : new Date(); + + return request; + }); + return { ...state, - pending: action.payload.map(r => addTimestamp(r)) + pending }; }, @@ -108,8 +120,3 @@ function setIsSending (pending, id, isSending) { return p; }).slice(); } - -function addTimestamp (request) { - request.date = new Date(); - return request; -} From c5bad287ae7d64bc510f3219904ea86090c9f715 Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Tue, 27 Sep 2016 16:38:15 +0100 Subject: [PATCH 0855/1062] auto scroll bar on embedded signer (ie .not always) --- js/src/views/ParityBar/parityBar.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/views/ParityBar/parityBar.css b/js/src/views/ParityBar/parityBar.css index 7d0c6254b9a..96daf7a4beb 100644 --- a/js/src/views/ParityBar/parityBar.css +++ b/js/src/views/ParityBar/parityBar.css @@ -35,7 +35,7 @@ width: 964px; height: 296px; border-radius: 4px 4px 0 0; - overflow-y: scroll; + overflow-y: auto; } .expanded .content { From a431d7c699709bc00544db3c489276a2e6cd1141 Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Tue, 27 Sep 2016 16:55:43 +0100 Subject: [PATCH 0856/1062] auto open/close the signer window (#2338) --- js/src/views/ParityBar/parityBar.js | 14 ++++++++++++++ .../TransactionPendingFormReject.js | 11 ++++------- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/js/src/views/ParityBar/parityBar.js b/js/src/views/ParityBar/parityBar.js index 21493605647..4ccd296ebfc 100644 --- a/js/src/views/ParityBar/parityBar.js +++ b/js/src/views/ParityBar/parityBar.js @@ -35,6 +35,20 @@ class ParityBar extends Component { opened: false } + componentWillReceiveProps (nextProps) { + const count = this.props.pending.length; + const newCount = nextProps.pending.length; + + // Open when a request is added + if (count < newCount) { + this.setState({ opened: true }); + + // Close when no more requests pending + } else if (newCount === 0 && count === 1) { + this.setState({ opened: false }); + } + } + render () { const { opened } = this.state; diff --git a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormReject/TransactionPendingFormReject.js b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormReject/TransactionPendingFormReject.js index f5ab082fa93..23d4ed7943f 100644 --- a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormReject/TransactionPendingFormReject.js +++ b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormReject/TransactionPendingFormReject.js @@ -60,9 +60,8 @@ export default class TransactionPendingFormReject extends Component { className={ styles.rejectButton } disabled={ rejectCounter > 0 } fullWidth - > - Reject Transaction { this.renderCounter() } - + label={ `Reject Transaction ${this.renderCounter()}` } + />
      ); } @@ -70,11 +69,9 @@ export default class TransactionPendingFormReject extends Component { renderCounter () { const { rejectCounter } = this.state; if (!rejectCounter) { - return; + return ''; } - return ( - { `(${rejectCounter})` } - ); + return `(${rejectCounter})`; } onInitCounter () { From 8f466a0465c30bbc6ec84361f9b360217ab4ee89 Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Tue, 27 Sep 2016 17:01:17 +0100 Subject: [PATCH 0857/1062] ui fixes on parity bar: always show header --- js/src/views/ParityBar/parityBar.css | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/js/src/views/ParityBar/parityBar.css b/js/src/views/ParityBar/parityBar.css index 96daf7a4beb..a2b6b2b41eb 100644 --- a/js/src/views/ParityBar/parityBar.css +++ b/js/src/views/ParityBar/parityBar.css @@ -33,12 +33,16 @@ .expanded { right: 16px; width: 964px; - height: 296px; + height: 300px; border-radius: 4px 4px 0 0; overflow-y: auto; + display: flex; + flex-direction: column; } .expanded .content { + flex: 1; + overflow: auto; } .corner { From d1bec1beb350aedf442dbb9b82f484d965dc9cc3 Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Tue, 27 Sep 2016 18:46:37 +0100 Subject: [PATCH 0858/1062] UI Fixes for queries in Contracts (#2360) --- .../views/Contract/Queries/input-queries.js | 37 +++++++----- js/src/views/Contract/Queries/queries.js | 53 ++++++++++------- js/src/views/Contract/contract.css | 57 +++++++++++++++++-- 3 files changed, 105 insertions(+), 42 deletions(-) diff --git a/js/src/views/Contract/Queries/input-queries.js b/js/src/views/Contract/Queries/input-queries.js index f66e16e5e9d..0fd4c10bb23 100644 --- a/js/src/views/Contract/Queries/input-queries.js +++ b/js/src/views/Contract/Queries/input-queries.js @@ -22,6 +22,8 @@ import LinearProgress from 'material-ui/LinearProgress'; import FlatButton from 'material-ui/FlatButton'; import { Card, CardActions, CardTitle, CardText } from 'material-ui/Card'; +import styles from '../contract.css'; + export default class InputQueries extends Component { static contextTypes = { api: PropTypes.object @@ -31,7 +33,8 @@ export default class InputQueries extends Component { contract: PropTypes.object.isRequired, inputs: PropTypes.array.isRequired, outputs: PropTypes.array.isRequired, - name: PropTypes.string.isRequired + name: PropTypes.string.isRequired, + className: PropTypes.string } state = { @@ -41,20 +44,24 @@ export default class InputQueries extends Component { } render () { - const { inputs, name } = this.props; + const { inputs, name, className } = this.props; const { isValid } = this.state; const inputsFields = inputs .map(input => this.renderInput(input)); return ( - - - - { this.renderResults() } + + + +
      + { this.renderResults() } +
      { inputsFields }
      @@ -81,14 +88,14 @@ export default class InputQueries extends Component { return outputs .map((out, index) => ({ name: out.name, - value: results[index] + value: results[index], + display: this.renderValue(results[index]) })) + .sort((outA, outB) => outA.display.length - outB.display.length) .map((out, index) => (
      -
      { out.name }
      - - { this.renderValue(out.value) } +
      { out.name }
      + + { out.display }
      )); diff --git a/js/src/views/Contract/Queries/queries.js b/js/src/views/Contract/Queries/queries.js index bc72cecfb05..2a258c2a244 100644 --- a/js/src/views/Contract/Queries/queries.js +++ b/js/src/views/Contract/Queries/queries.js @@ -63,8 +63,12 @@ export default class Queries extends Component {
      - { noInputQueries } - { withInputQueries } +
      + { noInputQueries } +
      +
      + { withInputQueries } +
      ); @@ -75,14 +79,14 @@ export default class Queries extends Component { const { contract } = this.props; return ( -
      - -
      + ); } @@ -90,18 +94,19 @@ export default class Queries extends Component { const { values } = this.props; return ( -
      - - - - { this.renderValue(values[fn.name]) } - - -
      + + + { this.renderValue(values[fn.name]) } + +
      ); } @@ -117,7 +122,11 @@ export default class Queries extends Component { valueToDisplay = api.util.bytesToHex(value); } - return ({ valueToDisplay }); + return ( + + { valueToDisplay } + + ); } _sortEntries (a, b) { diff --git a/js/src/views/Contract/contract.css b/js/src/views/Contract/contract.css index ceb21da4e7d..e9f4fe52e18 100644 --- a/js/src/views/Contract/contract.css +++ b/js/src/views/Contract/contract.css @@ -17,19 +17,66 @@ .contract { } -.methods { +.vMethods, .hMethods, .methods { display: flex; flex-wrap: wrap; } +.vMethods { + flex-direction: column; +} + +.hMethods { + flex: 1; + flex-direction: row; + justify-content: space-around; +} + .method { - flex: 0 1 20%; - width: 20%; - position: relative; - margin-top: 0.5em; + background-color: rgba(48, 48, 48, 0.5) !important; + margin: 1rem; + align-items: flex-start; +} + +.methodTitle { + padding-bottom: 8px !important; + padding-top: 8px !important; +} + +.methodContent { + padding-top: 0 !important; + padding-bottom: 8px !important; +} + +.methodResults { + display: flex; + flex-wrap: wrap; + max-width: 24rem; + justify-content: space-around; +} + +.methodResults > div { + margin: 0.5rem; display: flex; flex-direction: column; align-items: center; + max-width: 100%; +} + +.queryValue, .queryValue * { + user-select: text !important; + max-width: 100%; + box-sizing: border-box; + white-space: normal !important; + overflow-wrap: break-word !important; +} + +.queryValue:hover { + cursor: text !important; +} + +.queryResultName { + margin-bottom: 0.25rem; } .events { From 01797ab6745ea2fa557697e4182a4443786f895a Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Tue, 27 Sep 2016 19:32:34 +0100 Subject: [PATCH 0859/1062] refactor contract queries --- .../views/Contract/Queries/input-queries.js | 54 +++++++++++-------- js/src/views/Contract/Queries/queries.js | 8 +-- 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/js/src/views/Contract/Queries/input-queries.js b/js/src/views/Contract/Queries/input-queries.js index 0fd4c10bb23..1ebc3fc1871 100644 --- a/js/src/views/Contract/Queries/input-queries.js +++ b/js/src/views/Contract/Queries/input-queries.js @@ -44,37 +44,48 @@ export default class InputQueries extends Component { } render () { - const { inputs, name, className } = this.props; - const { isValid } = this.state; - - const inputsFields = inputs - .map(input => this.renderInput(input)); + const { name, className } = this.props; return ( - + - -
      - { this.renderResults() } -
      - { inputsFields } -
      - - - + { this.renderContent() }
      ); } + renderContent () { + const { inputs } = this.props; + + const { isValid } = this.state; + + const inputsFields = inputs + .map(input => this.renderInput(input)); + + return (
      + +
      + { this.renderResults() } +
      + { inputsFields } +
      + + + +
      ); + } + renderResults () { const { results, isLoading } = this.state; const { outputs } = this.props; @@ -122,6 +133,7 @@ export default class InputQueries extends Component { hintText={ kind.type } floatingLabelText={ name } floatingLabelFixed + fullWidth required onChange={ onChange } /> diff --git a/js/src/views/Contract/Queries/queries.js b/js/src/views/Contract/Queries/queries.js index 2a258c2a244..e191df754e7 100644 --- a/js/src/views/Contract/Queries/queries.js +++ b/js/src/views/Contract/Queries/queries.js @@ -34,10 +34,6 @@ export default class Queries extends Component { values: PropTypes.object } - state = { - forms: {} - } - render () { const { contract } = this.props; @@ -75,7 +71,7 @@ export default class Queries extends Component { } renderInputQuery (fn) { - const { inputs, outputs } = fn; + const { inputs, outputs, name } = fn; const { contract } = this.props; return ( @@ -84,7 +80,7 @@ export default class Queries extends Component { className={ styles.method } inputs={ inputs } outputs={ outputs } - name={ fn.name } + name={ name } contract={ contract } /> ); From 20df8174fa66f4ac9128599bebe7df448ff5a6d1 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 28 Sep 2016 11:25:33 +0200 Subject: [PATCH 0860/1062] settings toggle as expected --- js/src/redux/actions.js | 4 +- js/src/redux/reducers.js | 2 + js/src/views/Application/TabBar/tabBar.js | 110 ++++++++-------------- js/src/views/Settings/Views/actions.js | 23 +++++ js/src/views/Settings/Views/defaults.js | 4 +- js/src/views/Settings/Views/index.js | 6 +- js/src/views/Settings/Views/reducers.js | 29 ++++++ js/src/views/Settings/Views/views.css | 27 ++++++ js/src/views/Settings/Views/views.js | 69 ++++++++++++-- js/src/views/Settings/index.js | 6 +- js/src/views/Settings/layout.css | 4 + 11 files changed, 198 insertions(+), 86 deletions(-) create mode 100644 js/src/views/Settings/Views/actions.js create mode 100644 js/src/views/Settings/Views/reducers.js diff --git a/js/src/redux/actions.js b/js/src/redux/actions.js index 29c05dd1e47..9b456e129c9 100644 --- a/js/src/redux/actions.js +++ b/js/src/redux/actions.js @@ -16,9 +16,11 @@ import { newError } from '../ui/Errors/actions'; import { clearStatusLogs, toggleStatusLogs } from './providers/statusActions'; +import { toggleView } from '../views/Settings'; export { newError, clearStatusLogs, - toggleStatusLogs + toggleStatusLogs, + toggleView }; diff --git a/js/src/redux/reducers.js b/js/src/redux/reducers.js index ec41f7c234a..5ac71171a79 100644 --- a/js/src/redux/reducers.js +++ b/js/src/redux/reducers.js @@ -20,6 +20,7 @@ import { routerReducer } from 'react-router-redux'; import { balancesReducer, personalReducer, statusReducer as nodeStatusReducer } from './providers'; import { errorReducer } from '../ui/Errors'; +import { viewsReducer } from '../views/Settings'; import { tooltipReducer } from '../ui/Tooltips'; import { @@ -32,6 +33,7 @@ export default function () { errors: errorReducer, tooltip: tooltipReducer, routing: routerReducer, + views: viewsReducer, balances: balancesReducer, nodeStatus: nodeStatusReducer, diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index 38dd4193e25..c30910c422b 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -15,10 +15,11 @@ // along with Parity. If not, see . import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; import { Toolbar, ToolbarGroup } from 'material-ui/Toolbar'; import { Tabs, Tab } from 'material-ui/Tabs'; -import { defaultViews } from '../../Settings'; import { Badge, ParityBackground, Tooltip } from '../../../ui'; import styles from './tabBar.css'; @@ -31,7 +32,7 @@ const TABMAP = { contracts: 'contract' }; -export default class TabBar extends Component { +class TabBar extends Component { static contextTypes = { router: PropTypes.object.isRequired } @@ -39,30 +40,14 @@ export default class TabBar extends Component { static propTypes = { pending: PropTypes.array, isTest: PropTypes.bool, - netChain: PropTypes.string + netChain: PropTypes.string, + views: PropTypes.object.isRequired } state = { - accountsVisible: true, - addressesVisible: true, - appsVisible: true, - statusVisible: true, - signerVisible: true, activeRoute: '/accounts' } - constructor () { - super(); - - defaultViews.accounts.body = ; - defaultViews.signer.renderLabel = this.renderSignerLabel; - defaultViews.status.renderLabel = this.renderStatusLabel; - } - - componentDidMount () { - this.loadViews(); - } - render () { return ( @@ -98,30 +83,37 @@ export default class TabBar extends Component { } renderTabs () { + const { views } = this.props; const windowHash = (window.location.hash || '').split('?')[0].split('/')[1]; const hash = TABMAP[windowHash] || windowHash; - const items = Object.keys(defaultViews) - .filter((id) => { - const tab = defaultViews[id]; - const isFixed = tab.fixed; - const isVisible = this.state[this.visibleId(id)]; - - return isFixed || isVisible; - }) + const items = Object.keys(views) + .filter((id) => views[id].fixed || views[id].active) .map((id) => { - const tab = defaultViews[id]; - const onActivate = () => this.onActivate(tab.route); + const view = views[id]; + const onActivate = () => this.onActivate(view.route); + let label = this.renderLabel(view.label); + let body = null; + + if (id === 'accounts') { + body = ( + + ); + } else if (id === 'signer') { + label = this.renderSignerLabel(label); + } else if (id === 'status') { + label = this.renderStatusLabel(label); + } return ( - { tab.body } + { body } ); }); @@ -172,49 +164,25 @@ export default class TabBar extends Component { return this.renderLabel(label, bubble); } - visibleId (id) { - return `${id}Visible`; - } - onActivate = (activeRoute) => { const { router } = this.context; router.push(activeRoute); this.setState({ activeRoute }); } +} - toggleMenu = (event, menu) => { - const id = menu.props['data-id']; - const toggle = this.visibleId(id); - const isActive = this.state[toggle]; - - if (defaultViews[id].fixed) { - return; - } - - this.setState({ - [toggle]: !isActive - }, this.saveViews); - } - - loadViews () { - const state = {}; - const data = defaultViews.load(); - - Object.keys(data).forEach((id) => { - state[this.visibleId(id)] = data[id].active; - }); - - this.setState(state, this.saveViews); - } - - saveViews = () => { - const data = {}; +function mapStateToProps (state) { + const { views } = state; - Object.keys(data).forEach((id) => { - data[id] = { active: this.state[this.visibleId(id)] }; - }); + return { views }; +} - defaultViews.save(data); - } +function mapDispatchToProps (dispatch) { + return bindActionCreators({}, dispatch); } + +export default connect( + mapStateToProps, + mapDispatchToProps +)(TabBar); diff --git a/js/src/views/Settings/Views/actions.js b/js/src/views/Settings/Views/actions.js new file mode 100644 index 00000000000..234929de916 --- /dev/null +++ b/js/src/views/Settings/Views/actions.js @@ -0,0 +1,23 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export function toggleView (viewId) { + console.log('toggleView', viewId); + return { + type: 'toggleView', + viewId + }; +} diff --git a/js/src/views/Settings/Views/defaults.js b/js/src/views/Settings/Views/defaults.js index 17a1be56935..83719f26be3 100644 --- a/js/src/views/Settings/Views/defaults.js +++ b/js/src/views/Settings/Views/defaults.js @@ -120,7 +120,7 @@ const getDefaults = () => { return views; }; -defaultViews.load = () => { +const load = () => { const fixed = getFixed(); const defaults = getDefaults(); let data; @@ -136,7 +136,7 @@ defaultViews.load = () => { return data; }; -defaultViews.save = (_data) => { +const save = (_data) => { Object.keys(_data).forEach((id) => { defaultViews.id.active = _data[id].active; }); diff --git a/js/src/views/Settings/Views/index.js b/js/src/views/Settings/Views/index.js index cc189d4cac5..bb9a9d49237 100644 --- a/js/src/views/Settings/Views/index.js +++ b/js/src/views/Settings/Views/index.js @@ -15,9 +15,13 @@ // along with Parity. If not, see . import defaultViews from './defaults'; +import viewsReducer from './reducers'; +import { toggleView } from './actions'; export default from './views'; export { - defaultViews + defaultViews, + viewsReducer, + toggleView }; diff --git a/js/src/views/Settings/Views/reducers.js b/js/src/views/Settings/Views/reducers.js new file mode 100644 index 00000000000..34d7e7f9192 --- /dev/null +++ b/js/src/views/Settings/Views/reducers.js @@ -0,0 +1,29 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { handleActions } from 'redux-actions'; + +import defaultViews from './defaults'; + +export default handleActions({ + toggleView (state, action) { + const { viewId } = action; + + state[viewId].active = !state[viewId].active; + + return Object.assign({}, state); + } +}, defaultViews); diff --git a/js/src/views/Settings/Views/views.css b/js/src/views/Settings/Views/views.css index 6f28e7e3ff4..b907c1ab22b 100644 --- a/js/src/views/Settings/Views/views.css +++ b/js/src/views/Settings/Views/views.css @@ -20,3 +20,30 @@ height: 24px; margin-bottom: 5px; } + +.view { +} + +.view+.view { + padding-top: 1.5em; +} + +.header { +} + +.labelicon { + display: inline-block; + margin-right: 0.75em; +} + +.label { + display: inline-block; + vertical-align: top; + line-height: 24px; + color: white !important; +} + +.info { + color: #aaa; + padding-left: 4.75em; +} diff --git a/js/src/views/Settings/Views/views.js b/js/src/views/Settings/Views/views.js index 7d6248532f4..f334b28f27e 100644 --- a/js/src/views/Settings/Views/views.js +++ b/js/src/views/Settings/Views/views.js @@ -15,16 +15,20 @@ // along with Parity. If not, see . import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; +import { Checkbox } from 'material-ui'; import { Container } from '../../../ui'; +import { toggleView } from './actions'; + import layout from '../layout.css'; +import styles from './views.css'; -export default class Views extends Component { +class Views extends Component { static propTypes = { - } - - state = { + views: PropTypes.object.isRequired } render () { @@ -32,16 +36,63 @@ export default class Views extends Component {
      -

      Manage the available application views, using only the parts of the application that is applicable to you.

      -

      Are you an end-user? The defaults are setups for both beginner and advanced users alike.

      -

      Are you a developer? Add some features to manage contracts are interact with application develoyments.

      -

      Are you a miner or run a large-scale node? Add the features to give you all the information needed to watch the node operation.

      +
      Manage the available application views, using only the parts of the application that is applicable to you.
      +
      Are you an end-user? The defaults are setups for both beginner and advanced users alike.
      +
      Are you a developer? Add some features to manage contracts are interact with application develoyments.
      +
      Are you a miner or run a large-scale node? Add the features to give you all the information needed to watch the node operation.
      - details goes here + { this.renderViews() }
      ); } + + renderViews () { + const { views, toggleView } = this.props; + + return Object.keys(views).map((id) => { + const toggle = () => toggleView(id); + const view = views[id]; + const label = ( +
      +
      + { view.icon } +
      +
      + { view.label } +
      +
      + ); + + return ( +
      + +
      + { view.description } +
      +
      + ); + }); + } } + +function mapStateToProps (state) { + const { views } = state; + + return { views }; +} + +function mapDispatchToProps (dispatch) { + return bindActionCreators({ toggleView }, dispatch); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(Views); diff --git a/js/src/views/Settings/index.js b/js/src/views/Settings/index.js index 66856d1613e..aeda5f4bd23 100644 --- a/js/src/views/Settings/index.js +++ b/js/src/views/Settings/index.js @@ -15,12 +15,14 @@ // along with Parity. If not, see . import SettingsBackground from './Background'; -import SettingsViews, { defaultViews } from './Views'; +import SettingsViews, { defaultViews, viewsReducer, toggleView } from './Views'; export default from './settings'; export { SettingsBackground, SettingsViews, - defaultViews + defaultViews, + viewsReducer, + toggleView }; diff --git a/js/src/views/Settings/layout.css b/js/src/views/Settings/layout.css index 2460cf7355f..da070d0a019 100644 --- a/js/src/views/Settings/layout.css +++ b/js/src/views/Settings/layout.css @@ -39,6 +39,10 @@ width: calc(100% / 12 * 4); } +.overview>div+div { + padding-top: 1.25em; +} + .details { width: 66.66665%; width: -webkit-calc(100% / 12 * 8); From ccf1e3ece4f6aea68cdc58dfd611525f46021982 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 28 Sep 2016 12:11:57 +0200 Subject: [PATCH 0861/1062] tabs for settings work --- js/src/views/Application/TabBar/tabBar.js | 9 +++---- js/src/views/Settings/Views/views.js | 8 ++++--- js/src/views/Settings/layout.css | 4 ++-- js/src/views/Settings/settings.css | 24 ++++++++++++------- js/src/views/Settings/settings.js | 29 ++++++++++++++++------- 5 files changed, 47 insertions(+), 27 deletions(-) diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index c30910c422b..cffe6def89c 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -91,7 +91,6 @@ class TabBar extends Component { .filter((id) => views[id].fixed || views[id].active) .map((id) => { const view = views[id]; - const onActivate = () => this.onActivate(view.route); let label = this.renderLabel(view.label); let body = null; @@ -112,7 +111,7 @@ class TabBar extends Component { icon={ view.icon } key={ id } label={ label } - onActive={ onActivate }> + onActive={ this.onActivate(view.route) }> { body } ); @@ -167,8 +166,10 @@ class TabBar extends Component { onActivate = (activeRoute) => { const { router } = this.context; - router.push(activeRoute); - this.setState({ activeRoute }); + return (event) => { + router.push(activeRoute); + this.setState({ activeRoute }); + }; } } diff --git a/js/src/views/Settings/Views/views.js b/js/src/views/Settings/Views/views.js index f334b28f27e..2bdddee3d3d 100644 --- a/js/src/views/Settings/Views/views.js +++ b/js/src/views/Settings/Views/views.js @@ -19,7 +19,7 @@ import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import { Checkbox } from 'material-ui'; -import { Container } from '../../../ui'; +import { Container, ContainerTitle } from '../../../ui'; import { toggleView } from './actions'; @@ -28,12 +28,14 @@ import styles from './views.css'; class Views extends Component { static propTypes = { - views: PropTypes.object.isRequired + views: PropTypes.object.isRequired, + toggleView: PropTypes.func.isRequired } render () { return ( +
      Manage the available application views, using only the parts of the application that is applicable to you.
      @@ -67,7 +69,7 @@ class Views extends Component { ); return ( -
      +
      div, +.tabactive>div { + height: 24px !important; } -.tab>div>div { - flex-direction: row !important; - height: auto !important; - align-items: none !important; +.tab>div>div, +.tabactive>div>div { + display: inline-block !important; } -.tab svg { +.tab svg, +.tabactive svg { margin-right: 0.5em; + margin-bottom: 0 !important; } -.tab .menu { +.tab .menu, +.tabactive .menu { vertical-align: top; - margin-bottom: 5px; + display: inline-block; } diff --git a/js/src/views/Settings/settings.js b/js/src/views/Settings/settings.js index 45d797c3a60..43ecd7a73a5 100644 --- a/js/src/views/Settings/settings.js +++ b/js/src/views/Settings/settings.js @@ -18,13 +18,18 @@ import React, { Component, PropTypes } from 'react'; import { Tab, Tabs } from 'material-ui'; -import RemoveRedEye from 'material-ui/svg-icons/image/remove-red-eye'; +import ImageBlurOn from 'material-ui/svg-icons/image/blur-on'; +import ImageRemoveRedEye from 'material-ui/svg-icons/image/remove-red-eye'; import { Actionbar, Page } from '../../ui'; import styles from './settings.css'; export default class Settings extends Component { + static contextTypes = { + router: PropTypes.object.isRequired + } + static propTypes = { children: PropTypes.object.isRequired } @@ -45,27 +50,33 @@ export default class Settings extends Component { } renderTabs () { + const hash = (window.location.hash || '').split('?')[0].split('/')[2]; + return ( } - label={
      views
      } /> + icon={ } + label={
      views
      } + onActive={ this.onActivate('views') } /> } - label={
      views
      } /> + icon={ } + label={
      background
      } + onActive={ this.onActivate('background') } />
      ); } - menuClick = (section) => { + onActivate = (section) => { const { router } = this.context; - return (event) => router.push(`/settings/${section}`); + return (event) => { + router.push(`/settings/${section}`); + }; } } From 65ab35da3129d10525976ae868ab4aa94eeb4a90 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 28 Sep 2016 13:18:55 +0200 Subject: [PATCH 0862/1062] display different backgrounds --- js/src/index.js | 5 +- .../ui/ParityBackground/parityBackground.js | 7 +- .../views/Settings/Background/background.css | 36 +++++++++ .../views/Settings/Background/background.js | 78 ++++++++++++++++++- js/src/views/Settings/layout.css | 5 +- 5 files changed, 123 insertions(+), 8 deletions(-) create mode 100644 js/src/views/Settings/Background/background.css diff --git a/js/src/index.js b/js/src/index.js index 9df16ab73c5..787700974ac 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -47,7 +47,7 @@ import './index.html'; injectTapEventPlugin(); -const initToken = window.localStorage.getItem('sysuiToken'); +const initToken = window.localStorage.getItem('sysuiToken') || 'initial'; const parityUrl = process.env.PARITY_URL || ( process.env.NODE_ENV === 'production' @@ -58,7 +58,8 @@ const parityUrl = process.env.PARITY_URL || const api = new Api(new Api.Transport.Ws(`ws://${parityUrl}`, initToken)); // new Api.Transport.Http('/rpc/')); ContractInstances.create(api); -muiTheme.parity.setBackgroundSeed(api.util.sha3(initToken + Date.now())); +const backgroundSeed = window.localStorage.getItem('backgroundSeed') || api.util.sha3(`${initToken}_${Date.now()}`); +muiTheme.parity.setBackgroundSeed(backgroundSeed); // signer function tokenSetter (token, cb) { diff --git a/js/src/ui/ParityBackground/parityBackground.js b/js/src/ui/ParityBackground/parityBackground.js index 3fdd7d73a4e..0dbb0164213 100644 --- a/js/src/ui/ParityBackground/parityBackground.js +++ b/js/src/ui/ParityBackground/parityBackground.js @@ -24,15 +24,16 @@ export default class ParityBackground extends Component { static propTypes = { children: PropTypes.node, className: PropTypes.string, - gradient: PropTypes.string + gradient: PropTypes.string, + seed: PropTypes.string } render () { - const { children, className, gradient } = this.props; + const { children, className, gradient, seed } = this.props; const { muiTheme } = this.context; return ( -
      +
      { children }
      ); diff --git a/js/src/views/Settings/Background/background.css b/js/src/views/Settings/Background/background.css new file mode 100644 index 00000000000..2e9fa772628 --- /dev/null +++ b/js/src/views/Settings/Background/background.css @@ -0,0 +1,36 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.bgcontainer { + display: flex; + flex-direction: row; + flex-wrap: wrap; +} + +.bg { + flex-basis: 25%; + box-sizing: border-box; + display: inline-block; + padding: 0 0.5em 1em 0.5em; +} + +.seed { + width: 100%; + height: 10em; + border-radius: 4px; + cursor: pointer; +} diff --git a/js/src/views/Settings/Background/background.js b/js/src/views/Settings/Background/background.js index 9065b30f048..77f803220b7 100644 --- a/js/src/views/Settings/Background/background.js +++ b/js/src/views/Settings/Background/background.js @@ -16,16 +16,90 @@ import React, { Component, PropTypes } from 'react'; +import { Container, ContainerTitle, ParityBackground } from '../../../ui'; + +import layout from '../layout.css'; +import styles from './background.css'; + +let counter = 0; + export default class Background extends Component { - static propTypes = { + static contextTypes = { + api: PropTypes.object.isRequired, + muiTheme: PropTypes.object.isRequired } state = { + seeds: [] + } + + componentDidMount () { + const { muiTheme } = this.context; + + this.setState({ + seeds: [muiTheme.backgroundSeed] + }, () => this.addSeeds(15)); } render () { return ( -
      background
      + + +
      +
      +
      Manage your unique, fingerprinted application background.
      +
      The bckground is derived from the secure token shared between the fron-end and Parity, and it unique accross connections. Apart from allowing you to customize the look of your UI, it also allow you to uniquely identify that you are indeed connected to a know endpoint.
      +
      +
      +
      + { this.renderBackgrounds() } +
      +
      +
      +
      ); } + + renderBackgrounds () { + const { seeds } = this.state; + + return seeds.map((seed) => { + return ( +
      + +
      + ); + }); + } + + onSelect = (seed) => { + const { muiTheme } = this.context; + + return (event) => { + muiTheme.setBackgroundSeed(seed); + }; + } + + addSeeds (count) { + const { seeds } = this.state; + const newSeeds = []; + + for (let index = 0; index < count; index++) { + newSeeds.push(this.generateSeed()); + } + + this.setState({ + seeds: seeds.concat(newSeeds) + }); + } + + generateSeed () { + const { api, muiTheme } = this.context; + + return api.util.sha3(`${muiTheme.backgroundSeed}${Math.random()}${counter++}`); + } } diff --git a/js/src/views/Settings/layout.css b/js/src/views/Settings/layout.css index e034a8c2f7f..d8d953f90b5 100644 --- a/js/src/views/Settings/layout.css +++ b/js/src/views/Settings/layout.css @@ -31,13 +31,16 @@ } .overview { - opacity: 0.5; width: 33.33333%; width: -webkit-calc(100% / 12 * 4); width: -moz-calc(100% / 12 * 4); width: calc(100% / 12 * 4); } +.overview { + opacity: 0.5; +} + .overview>div+div { padding-top: 1.25em; } From fabc3ad32a346b97685767cf78abfa01164ef87f Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 28 Sep 2016 14:35:55 +0200 Subject: [PATCH 0863/1062] background selection inplace --- js/src/index.js | 3 - js/src/redux/middleware.js | 5 +- js/src/redux/reducers.js | 4 +- js/src/ui/Modal/modal.js | 27 ++++++-- .../ui/ParityBackground/parityBackground.js | 31 +++++++-- js/src/views/Application/TabBar/tabBar.js | 14 ++--- .../views/Settings/Background/background.css | 16 ++++- .../views/Settings/Background/background.js | 63 +++++++++++++++---- js/src/views/Settings/Views/index.js | 6 +- js/src/views/Settings/Views/views.js | 14 ++--- js/src/views/Settings/{Views => }/actions.js | 8 ++- js/src/views/Settings/index.js | 9 ++- .../{Views/reducers.js => middleware.js} | 22 +++---- js/src/views/Settings/reducers.js | 43 +++++++++++++ 14 files changed, 200 insertions(+), 65 deletions(-) rename js/src/views/Settings/{Views => }/actions.js (86%) rename js/src/views/Settings/{Views/reducers.js => middleware.js} (71%) create mode 100644 js/src/views/Settings/reducers.js diff --git a/js/src/index.js b/js/src/index.js index 787700974ac..214bbdb90da 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -58,9 +58,6 @@ const parityUrl = process.env.PARITY_URL || const api = new Api(new Api.Transport.Ws(`ws://${parityUrl}`, initToken)); // new Api.Transport.Http('/rpc/')); ContractInstances.create(api); -const backgroundSeed = window.localStorage.getItem('backgroundSeed') || api.util.sha3(`${initToken}_${Date.now()}`); -muiTheme.parity.setBackgroundSeed(backgroundSeed); - // signer function tokenSetter (token, cb) { window.localStorage.setItem('sysuiToken', token); diff --git a/js/src/redux/middleware.js b/js/src/redux/middleware.js index e2c3a827be0..ee25098354d 100644 --- a/js/src/redux/middleware.js +++ b/js/src/redux/middleware.js @@ -15,18 +15,21 @@ // along with Parity. If not, see . import ErrorsMiddleware from '../ui/Errors/middleware'; +import SettingsMiddleware from '../views/Settings/middleware'; import signerMiddleware from '../views/Signer/middleware'; import statusMiddleware from '../views/Status/middleware'; export default function (signerWs, signerTokenSetter, statusWeb3) { const errors = new ErrorsMiddleware(); + const settings = new SettingsMiddleware(); const signer = signerMiddleware(signerWs, signerTokenSetter); const status = statusMiddleware(statusWeb3); const middleware = [ - errors.toMiddleware() + errors.toMiddleware(), + settings.toMiddleware() ]; return middleware.concat(signer).concat(status); diff --git a/js/src/redux/reducers.js b/js/src/redux/reducers.js index 5ac71171a79..42cbc6ef4f9 100644 --- a/js/src/redux/reducers.js +++ b/js/src/redux/reducers.js @@ -20,7 +20,7 @@ import { routerReducer } from 'react-router-redux'; import { balancesReducer, personalReducer, statusReducer as nodeStatusReducer } from './providers'; import { errorReducer } from '../ui/Errors'; -import { viewsReducer } from '../views/Settings'; +import { settingsReducer } from '../views/Settings'; import { tooltipReducer } from '../ui/Tooltips'; import { @@ -33,7 +33,7 @@ export default function () { errors: errorReducer, tooltip: tooltipReducer, routing: routerReducer, - views: viewsReducer, + settings: settingsReducer, balances: balancesReducer, nodeStatus: nodeStatusReducer, diff --git a/js/src/ui/Modal/modal.js b/js/src/ui/Modal/modal.js index dc041e6e3bf..cfbf793d92e 100644 --- a/js/src/ui/Modal/modal.js +++ b/js/src/ui/Modal/modal.js @@ -15,6 +15,8 @@ // along with Parity. If not, see . import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; import { Dialog } from 'material-ui'; import Container from '../Container'; @@ -26,7 +28,7 @@ const DIALOG_STYLE = { paddingTop: '1px' }; import styles from './modal.css'; -export default class Modal extends Component { +class Modal extends Component { static contextTypes = { muiTheme: PropTypes.object.isRequired } @@ -42,12 +44,14 @@ export default class Modal extends Component { title: React.PropTypes.oneOfType([ PropTypes.node, PropTypes.string ]), - visible: PropTypes.bool.isRequired + visible: PropTypes.bool.isRequired, + settings: PropTypes.object.isRequired } render () { const { muiTheme } = this.context; - const { actions, className, current, children, scroll, steps, waiting, title, visible } = this.props; + const { actions, className, current, children, scroll, steps, waiting, title, visible, settings } = this.props; + const contentStyle = muiTheme.parity.getBackgroundStyle(null, settings.backgroundSeed); const header = ( . import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; -export default class ParityBackground extends Component { +class ParityBackground extends Component { static contextTypes = { muiTheme: PropTypes.object.isRequired } @@ -25,17 +27,38 @@ export default class ParityBackground extends Component { children: PropTypes.node, className: PropTypes.string, gradient: PropTypes.string, - seed: PropTypes.string + seed: PropTypes.any, + settings: PropTypes.object.isRequired, + onClick: PropTypes.func } render () { - const { children, className, gradient, seed } = this.props; const { muiTheme } = this.context; + const { children, className, gradient, seed, settings, onClick } = this.props; + const style = muiTheme.parity.getBackgroundStyle(gradient, seed || settings.backgroundSeed); return ( - <div className={ className } style={ muiTheme.parity.getBackgroundStyle(gradient, seed) }> + <div + className={ className } + style={ style } + onTouchTap={ onClick }> { children } </div> ); } } + +function mapStateToProps (state) { + const { settings } = state; + + return { settings }; +} + +function mapDispatchToProps (dispatch) { + return bindActionCreators({}, dispatch); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(ParityBackground); diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index cffe6def89c..7a4c7450c20 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -41,7 +41,7 @@ class TabBar extends Component { pending: PropTypes.array, isTest: PropTypes.bool, netChain: PropTypes.string, - views: PropTypes.object.isRequired + settings: PropTypes.object.isRequired } state = { @@ -83,14 +83,14 @@ class TabBar extends Component { } renderTabs () { - const { views } = this.props; + const { settings } = this.props; const windowHash = (window.location.hash || '').split('?')[0].split('/')[1]; const hash = TABMAP[windowHash] || windowHash; - const items = Object.keys(views) - .filter((id) => views[id].fixed || views[id].active) + const items = Object.keys(settings.views) + .filter((id) => settings.views[id].fixed || settings.views[id].active) .map((id) => { - const view = views[id]; + const view = settings.views[id]; let label = this.renderLabel(view.label); let body = null; @@ -174,9 +174,9 @@ class TabBar extends Component { } function mapStateToProps (state) { - const { views } = state; + const { settings } = state; - return { views }; + return { settings }; } function mapDispatchToProps (dispatch) { diff --git a/js/src/views/Settings/Background/background.css b/js/src/views/Settings/Background/background.css index 2e9fa772628..825b9fe26c8 100644 --- a/js/src/views/Settings/Background/background.css +++ b/js/src/views/Settings/Background/background.css @@ -21,16 +21,26 @@ flex-wrap: wrap; } -.bg { +.bgflex { flex-basis: 25%; box-sizing: border-box; display: inline-block; padding: 0 0.5em 1em 0.5em; } -.seed { - width: 100%; +.bgseed { + background: black; + border-radius: 4px; +} + +.seed, +.seedactive { height: 10em; border-radius: 4px; cursor: pointer; + border: 2px solid rgba(255, 255, 255, 1); +} + +.seed { + opacity: 0.5; } diff --git a/js/src/views/Settings/Background/background.js b/js/src/views/Settings/Background/background.js index 77f803220b7..7ac7b93f92f 100644 --- a/js/src/views/Settings/Background/background.js +++ b/js/src/views/Settings/Background/background.js @@ -15,30 +15,40 @@ // along with Parity. If not, see <http://www.gnu.org/licenses/>. import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; +import NavigationRefresh from 'material-ui/svg-icons/navigation/refresh'; -import { Container, ContainerTitle, ParityBackground } from '../../../ui'; +import { Button, Container, ContainerTitle, ParityBackground } from '../../../ui'; + +import { updateBackground } from '../actions'; import layout from '../layout.css'; import styles from './background.css'; let counter = 0; -export default class Background extends Component { +class Background extends Component { static contextTypes = { api: PropTypes.object.isRequired, muiTheme: PropTypes.object.isRequired } + static propTypes = { + settings: PropTypes.object.isRequired, + updateBackground: PropTypes.func.isRequired + } + state = { seeds: [] } componentDidMount () { - const { muiTheme } = this.context; + const { settings } = this.props; this.setState({ - seeds: [muiTheme.backgroundSeed] - }, () => this.addSeeds(15)); + seeds: [settings.backgroundSeed] + }, () => this.addSeeds(19)); } render () { @@ -48,12 +58,16 @@ export default class Background extends Component { <div className={ layout.layout }> <div className={ layout.overview }> <div>Manage your unique, fingerprinted application background.</div> - <div>The bckground is derived from the secure token shared between the fron-end and Parity, and it unique accross connections. Apart from allowing you to customize the look of your UI, it also allow you to uniquely identify that you are indeed connected to a know endpoint.</div> + <div>The background is derived from the secure token shared between the front-end and Parity, and it unique across connections. Apart from allowing you to customize the look of your UI, it also allow you to uniquely identify that you are indeed connected to a know endpoint.</div> </div> <div className={ layout.details }> <div className={ styles.bgcontainer }> { this.renderBackgrounds() } </div> + <Button + icon={ <NavigationRefresh /> } + label='generate more' + onClick={ this.generateMore } /> </div> </div> </Container> @@ -61,16 +75,18 @@ export default class Background extends Component { } renderBackgrounds () { + const { settings } = this.props; const { seeds } = this.state; return seeds.map((seed) => { return ( - <div className={ styles.bg }> - <ParityBackground - className={ styles.seed } - key={ seed } - seed={ seed } - onTouchTap={ this.onSelect(seed) } /> + <div className={ styles.bgflex } key={ seed }> + <div className={ styles.bgseed }> + <ParityBackground + className={ settings.backgroundSeed === seed ? styles.seedactive : styles.seed } + seed={ seed } + onClick={ this.onSelect(seed) } /> + </div> </div> ); }); @@ -78,12 +94,18 @@ export default class Background extends Component { onSelect = (seed) => { const { muiTheme } = this.context; + const { updateBackground } = this.props; return (event) => { - muiTheme.setBackgroundSeed(seed); + muiTheme.parity.setBackgroundSeed(seed); + updateBackground(seed); }; } + generateMore = () => { + this.addSeeds(20); + } + addSeeds (count) { const { seeds } = this.state; const newSeeds = []; @@ -103,3 +125,18 @@ export default class Background extends Component { return api.util.sha3(`${muiTheme.backgroundSeed}${Math.random()}${counter++}`); } } + +function mapStateToProps (state) { + const { settings } = state; + + return { settings }; +} + +function mapDispatchToProps (dispatch) { + return bindActionCreators({ updateBackground }, dispatch); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(Background); diff --git a/js/src/views/Settings/Views/index.js b/js/src/views/Settings/Views/index.js index bb9a9d49237..cc189d4cac5 100644 --- a/js/src/views/Settings/Views/index.js +++ b/js/src/views/Settings/Views/index.js @@ -15,13 +15,9 @@ // along with Parity. If not, see <http://www.gnu.org/licenses/>. import defaultViews from './defaults'; -import viewsReducer from './reducers'; -import { toggleView } from './actions'; export default from './views'; export { - defaultViews, - viewsReducer, - toggleView + defaultViews }; diff --git a/js/src/views/Settings/Views/views.js b/js/src/views/Settings/Views/views.js index 2bdddee3d3d..d5cccb466fb 100644 --- a/js/src/views/Settings/Views/views.js +++ b/js/src/views/Settings/Views/views.js @@ -21,14 +21,14 @@ import { Checkbox } from 'material-ui'; import { Container, ContainerTitle } from '../../../ui'; -import { toggleView } from './actions'; +import { toggleView } from '../actions'; import layout from '../layout.css'; import styles from './views.css'; class Views extends Component { static propTypes = { - views: PropTypes.object.isRequired, + settings: PropTypes.object.isRequired, toggleView: PropTypes.func.isRequired } @@ -52,11 +52,11 @@ class Views extends Component { } renderViews () { - const { views, toggleView } = this.props; + const { settings, toggleView } = this.props; - return Object.keys(views).map((id) => { + return Object.keys(settings.views).map((id) => { const toggle = () => toggleView(id); - const view = views[id]; + const view = settings.views[id]; const label = ( <div className={ styles.header }> <div className={ styles.labelicon }> @@ -85,9 +85,9 @@ class Views extends Component { } function mapStateToProps (state) { - const { views } = state; + const { settings } = state; - return { views }; + return { settings }; } function mapDispatchToProps (dispatch) { diff --git a/js/src/views/Settings/Views/actions.js b/js/src/views/Settings/actions.js similarity index 86% rename from js/src/views/Settings/Views/actions.js rename to js/src/views/Settings/actions.js index 234929de916..d01ddb24f81 100644 --- a/js/src/views/Settings/Views/actions.js +++ b/js/src/views/Settings/actions.js @@ -15,9 +15,15 @@ // along with Parity. If not, see <http://www.gnu.org/licenses/>. export function toggleView (viewId) { - console.log('toggleView', viewId); return { type: 'toggleView', viewId }; } + +export function updateBackground (backgroundSeed) { + return { + type: 'updateBackground', + backgroundSeed + }; +} diff --git a/js/src/views/Settings/index.js b/js/src/views/Settings/index.js index aeda5f4bd23..d61c877ee54 100644 --- a/js/src/views/Settings/index.js +++ b/js/src/views/Settings/index.js @@ -14,8 +14,10 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see <http://www.gnu.org/licenses/>. +import settingsReducer from './reducers'; +import { toggleView, updateBackground } from './actions'; import SettingsBackground from './Background'; -import SettingsViews, { defaultViews, viewsReducer, toggleView } from './Views'; +import SettingsViews, { defaultViews } from './Views'; export default from './settings'; @@ -23,6 +25,7 @@ export { SettingsBackground, SettingsViews, defaultViews, - viewsReducer, - toggleView + settingsReducer, + toggleView, + updateBackground }; diff --git a/js/src/views/Settings/Views/reducers.js b/js/src/views/Settings/middleware.js similarity index 71% rename from js/src/views/Settings/Views/reducers.js rename to js/src/views/Settings/middleware.js index 34d7e7f9192..3c34cbc2b9f 100644 --- a/js/src/views/Settings/Views/reducers.js +++ b/js/src/views/Settings/middleware.js @@ -14,16 +14,14 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see <http://www.gnu.org/licenses/>. -import { handleActions } from 'redux-actions'; - -import defaultViews from './defaults'; - -export default handleActions({ - toggleView (state, action) { - const { viewId } = action; - - state[viewId].active = !state[viewId].active; - - return Object.assign({}, state); +export default class SettingsMiddleware { + toMiddleware () { + return (store) => (next) => (action) => { + if (action.type === 'updateBackground') { + window.localStorage.setItem('backgroundSeed', action.backgroundSeed); + } + + next(action); + }; } -}, defaultViews); +} diff --git a/js/src/views/Settings/reducers.js b/js/src/views/Settings/reducers.js new file mode 100644 index 00000000000..e9116f3dfbb --- /dev/null +++ b/js/src/views/Settings/reducers.js @@ -0,0 +1,43 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see <http://www.gnu.org/licenses/>. + +import { handleActions } from 'redux-actions'; + +import views from './Views/defaults'; + +const backgroundSeed = window.localStorage.getItem('backgroundSeed') || `${Date.now()}`; +window.localStorage.setItem('backgroundSeed', backgroundSeed); + +const initialState = { + views, + backgroundSeed +}; + +export default handleActions({ + toggleView (state, action) { + const { viewId } = action; + + state.views[viewId].active = !state.views[viewId].active; + + return Object.assign({}, state); + }, + + updateBackground (state, action) { + const { backgroundSeed } = action; + + return Object.assign({}, state, { backgroundSeed }); + } +}, initialState); From bedcf7ea5d8c0de3a34a15f5d4ba652b391cdadc Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 28 Sep 2016 15:50:53 +0200 Subject: [PATCH 0864/1062] store views properly via middleware --- js/src/index.js | 1 + js/src/views/Settings/Views/defaults.js | 50 ------------ js/src/views/Settings/Views/views.js | 3 +- js/src/views/Settings/middleware.js | 102 +++++++++++++++++++++++- js/src/views/Settings/reducers.js | 13 ++- js/src/views/Settings/settings.js | 2 +- 6 files changed, 109 insertions(+), 62 deletions(-) diff --git a/js/src/index.js b/js/src/index.js index 214bbdb90da..ae7b904307c 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -68,6 +68,7 @@ const web3ws = new Web3(new WebSocketsProvider(ws)); statusWeb3Extension(web3ws).map((extension) => web3ws._extend(extension)); const store = initStore(api, ws, tokenSetter); +store.dispatch({ type: 'initAll', api }); // signer new WsDataProvider(store, ws); // eslint-disable-line no-new diff --git a/js/src/views/Settings/Views/defaults.js b/js/src/views/Settings/Views/defaults.js index 83719f26be3..930f3e32c2b 100644 --- a/js/src/views/Settings/Views/defaults.js +++ b/js/src/views/Settings/Views/defaults.js @@ -26,8 +26,6 @@ import { SignerIcon } from '../../../ui'; import styles from './views.css'; -const LS_VIEWS = 'views'; - const defaultViews = { accounts: { active: true, @@ -96,52 +94,4 @@ const defaultViews = { } }; -const getFixed = () => { - const views = {}; - - Object.keys(defaultViews).forEach((id) => { - if (defaultViews[id].fixed) { - views[id] = { active: true }; - } - }); - - return views; -}; - -const getDefaults = () => { - const views = {}; - - Object.keys(defaultViews).forEach((id) => { - views[id] = { - active: defaultViews[id].active || false - }; - }); - - return views; -}; - -const load = () => { - const fixed = getFixed(); - const defaults = getDefaults(); - let data; - - try { - const json = window.localStorage.getItem(LS_VIEWS) || {}; - - data = Object.assign(defaults, JSON.parse(json), fixed); - } catch (e) { - data = defaults; - } - - return data; -}; - -const save = (_data) => { - Object.keys(_data).forEach((id) => { - defaultViews.id.active = _data[id].active; - }); - - window.localStorage.setItem(LS_VIEWS, JSON.stringify(getDefaults())); -}; - export default defaultViews; diff --git a/js/src/views/Settings/Views/views.js b/js/src/views/Settings/Views/views.js index d5cccb466fb..27dcc7ee4a3 100644 --- a/js/src/views/Settings/Views/views.js +++ b/js/src/views/Settings/Views/views.js @@ -74,7 +74,8 @@ class Views extends Component { disabled={ view.fixed } label={ label } onCheck={ toggle } - checked={ view.active || view.fixed } /> + checked={ view.active } + value={ view.active } /> <div className={ styles.info }> { view.description } </div> diff --git a/js/src/views/Settings/middleware.js b/js/src/views/Settings/middleware.js index 3c34cbc2b9f..ddadad92b84 100644 --- a/js/src/views/Settings/middleware.js +++ b/js/src/views/Settings/middleware.js @@ -14,11 +14,109 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see <http://www.gnu.org/licenses/>. +import defaultViews from './Views/defaults'; + +function initBackground (store, api) { + const backgroundSeed = loadBackground() || api.util.sha3(`${Date.now()}`); + + store.dispatch({ + type: 'updateBackground', + backgroundSeed + }); +} + +function loadBackground () { + return window.localStorage.getItem('backgroundSeed'); +} + +function saveBackground (backgroundSeed) { + window.localStorage.setItem('backgroundSeed', backgroundSeed); +} + +function initViews (store) { + const { settings } = store.getState(); + const data = loadViews(); + const viewIds = Object.keys(data).filter((viewId) => { + return settings.views[viewId] && data[viewId].active !== settings.views[viewId].active; + }); + + if (viewIds.length) { + store.dispatch({ type: 'toggleViews', viewIds }); + } +} + +function getFixedViews () { + const views = {}; + + Object.keys(defaultViews).forEach((id) => { + if (defaultViews[id].fixed) { + views[id] = { active: true }; + } + }); + + return views; +} + +function getDefaultViews () { + const views = {}; + + Object.keys(defaultViews).forEach((id) => { + views[id] = { + active: defaultViews[id].active || false + }; + }); + + return views; +} + +function loadViews () { + const fixed = getFixedViews(); + const defaults = getDefaultViews(); + let data; + + try { + const json = window.localStorage.getItem('views') || '{}'; + + data = Object.assign(defaults, JSON.parse(json), fixed); + } catch (e) { + data = defaults; + } + + return data; +} + +function saveViews (store) { + window.localStorage.setItem('views', JSON.stringify(getDefaultViews())); +} + +function toggleViews (store, viewIds) { + viewIds.forEach((id) => { + defaultViews[id].active = !defaultViews[id].active; + }); + + saveViews(store); +} + export default class SettingsMiddleware { toMiddleware () { return (store) => (next) => (action) => { - if (action.type === 'updateBackground') { - window.localStorage.setItem('backgroundSeed', action.backgroundSeed); + switch (action.type) { + case 'initAll': + initBackground(store, action.api); + initViews(store); + break; + + case 'toggleView': + toggleViews(store, [action.viewId]); + break; + + case 'toggleViews': + toggleViews(store, action.viewIds); + break; + + case 'updateBackground': + saveBackground(action.backgroundSeed); + break; } next(action); diff --git a/js/src/views/Settings/reducers.js b/js/src/views/Settings/reducers.js index e9116f3dfbb..af261219983 100644 --- a/js/src/views/Settings/reducers.js +++ b/js/src/views/Settings/reducers.js @@ -18,21 +18,18 @@ import { handleActions } from 'redux-actions'; import views from './Views/defaults'; -const backgroundSeed = window.localStorage.getItem('backgroundSeed') || `${Date.now()}`; -window.localStorage.setItem('backgroundSeed', backgroundSeed); - const initialState = { views, - backgroundSeed + backgroundSeed: `${Date.now()}` }; export default handleActions({ toggleView (state, action) { - const { viewId } = action; - - state.views[viewId].active = !state.views[viewId].active; + return Object.assign({}, state, { views }); + }, - return Object.assign({}, state); + toggleViews (state, action) { + return Object.assign({}, state, { views }); }, updateBackground (state, action) { diff --git a/js/src/views/Settings/settings.js b/js/src/views/Settings/settings.js index 43ecd7a73a5..c587f0d29b5 100644 --- a/js/src/views/Settings/settings.js +++ b/js/src/views/Settings/settings.js @@ -53,7 +53,7 @@ export default class Settings extends Component { const hash = (window.location.hash || '').split('?')[0].split('/')[2]; return ( - <Tabs className={ styles.tabs }> + <Tabs className={ styles.tabs } value={ hash }> <Tab className={ hash === 'views' ? styles.tabactive : styles.tab } value='views' From 027016101398ebb88ab170a9ac0d23a8e3d81788 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 28 Sep 2016 16:07:43 +0200 Subject: [PATCH 0865/1062] Gavcoin utilises the popup box --- .../dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js | 8 ++++++-- .../dapps/gavcoin/Actions/ActionRefund/actionRefund.js | 10 ++++++++-- .../gavcoin/Actions/ActionTransfer/actionTransfer.js | 10 ++++++++-- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js b/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js index 076c537d4ec..dcf73733657 100644 --- a/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js +++ b/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js @@ -21,7 +21,6 @@ import { Dialog, FlatButton, TextField } from 'material-ui'; import { api } from '../../parity'; import AccountSelector from '../../AccountSelector'; -import StepComplete from '../StepComplete'; import { ERRORS, validateAccount, validatePositiveNumber } from '../validation'; import styles from '../actions.css'; @@ -53,13 +52,17 @@ export default class ActionBuyIn extends Component { render () { const { complete } = this.state; + if (complete) { + return null; + } + return ( <Dialog title='buy coins for a specific account' modal open className={ styles.dialog } actions={ this.renderActions() }> - { complete ? <StepComplete /> : this.renderFields() } + { this.renderFields() } </Dialog> ); } @@ -187,6 +190,7 @@ export default class ActionBuyIn extends Component { return instance.buyin.postTransaction(options, values); }) .then(() => { + this.props.onClose(); this.setState({ sending: false, complete: true diff --git a/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js b/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js index 27e9a68f314..82a7fdd8745 100644 --- a/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js +++ b/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js @@ -21,7 +21,6 @@ import { Dialog, FlatButton, TextField } from 'material-ui'; import { api } from '../../parity'; import AccountSelector from '../../AccountSelector'; -import StepComplete from '../StepComplete'; import { ERRORS, validateAccount, validatePositiveNumber } from '../validation'; import styles from '../actions.css'; @@ -52,13 +51,19 @@ export default class ActionRefund extends Component { } render () { + const { complete } = this.state; + + if (complete) { + return null; + } + return ( <Dialog title='return coins for a refund' modal open className={ styles.dialog } actions={ this.renderActions() }> - { this.state.complete ? <StepComplete /> : this.renderFields() } + { this.renderFields() } </Dialog> ); } @@ -170,6 +175,7 @@ export default class ActionRefund extends Component { return instance.refund.postTransaction(options, values); }) .then(() => { + this.props.onClose(); this.setState({ sending: false, complete: true diff --git a/js/src/dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js b/js/src/dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js index b05f70a9716..13ecc55e8e8 100644 --- a/js/src/dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js +++ b/js/src/dapps/gavcoin/Actions/ActionTransfer/actionTransfer.js @@ -21,7 +21,6 @@ import { Dialog, FlatButton, TextField, Toggle } from 'material-ui'; import AccountSelector from '../../AccountSelector'; import AccountSelectorText from '../../AccountSelectorText'; -import StepComplete from '../StepComplete'; import { ERRORS, validateAccount, validatePositiveNumber } from '../validation'; import styles from '../actions.css'; @@ -53,13 +52,19 @@ export default class ActionTransfer extends Component { } render () { + const { complete } = this.state; + + if (complete) { + return null; + } + return ( <Dialog title='send coins to another account' modal open className={ styles.dialog } actions={ this.renderActions() }> - { this.state.complete ? <StepComplete /> : this.renderFields() } + { this.renderFields() } </Dialog> ); } @@ -199,6 +204,7 @@ export default class ActionTransfer extends Component { return instance.transfer.postTransaction(options, values); }) .then(() => { + this.props.onClose(); this.setState({ sending: false, complete: true From 16abd7b8a2187feff525ffa81435603aa837a946 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 28 Sep 2016 17:00:52 +0200 Subject: [PATCH 0866/1062] allow ParityBar to pop-up signer auth --- .../DeployContract/BusyStep/busyStep.js | 18 +--- .../modals/DeployContract/deployContract.js | 10 +- .../CompletedStep/completedStep.js | 29 ------ .../ExecuteContract/CompletedStep/index.js | 17 ---- .../modals/ExecuteContract/executeContract.js | 94 +++++++------------ js/src/modals/Transfer/transfer.js | 3 +- js/src/ui/Modal/Title/title.js | 5 +- js/src/ui/Modal/modal.js | 4 +- .../DappContainer/dappContainer.js | 2 +- js/src/views/Application/application.js | 3 + js/src/views/ParityBar/parityBar.js | 25 ++++- 11 files changed, 72 insertions(+), 138 deletions(-) delete mode 100644 js/src/modals/ExecuteContract/CompletedStep/completedStep.js delete mode 100644 js/src/modals/ExecuteContract/CompletedStep/index.js diff --git a/js/src/modals/DeployContract/BusyStep/busyStep.js b/js/src/modals/DeployContract/BusyStep/busyStep.js index d0c2d60dac9..062c1863060 100644 --- a/js/src/modals/DeployContract/BusyStep/busyStep.js +++ b/js/src/modals/DeployContract/BusyStep/busyStep.js @@ -20,8 +20,7 @@ import styles from '../deployContract.css'; export default class BusyStep extends Component { static propTypes = { - deployState: PropTypes.string, - showSigner: PropTypes.bool + deployState: PropTypes.string } render () { @@ -32,21 +31,6 @@ export default class BusyStep extends Component { <div> The deployment is currently in progress, { deployState } </div> - { this.renderSigner() } - </div> - ); - } - - renderSigner () { - const { showSigner } = this.props; - - if (!showSigner) { - return null; - } - - return ( - <div> - Visit the Signer to <a href='/#/signer' target='_blank'>authenticate the transaction</a>. </div> ); } diff --git a/js/src/modals/DeployContract/deployContract.js b/js/src/modals/DeployContract/deployContract.js index ea31a22d65d..e6505a463ea 100644 --- a/js/src/modals/DeployContract/deployContract.js +++ b/js/src/modals/DeployContract/deployContract.js @@ -222,24 +222,24 @@ export default class DeployContract extends Component { switch (data.state) { case 'estimateGas': case 'postTransaction': - this.setState({ deployState: 'Preparing transaction for network transmission', showSigner: false }); + this.setState({ deployState: 'Preparing transaction for network transmission' }); return; case 'checkRequest': - this.setState({ deployState: 'Waiting for confirmation of the transaction in the Signer', showSigner: true }); + this.setState({ deployState: 'Waiting for confirmation of the transaction in the Parity Secure Signer' }); return; case 'getTransactionReceipt': - this.setState({ deployState: 'Waiting for the contract to be deployed/mined', showSigner: false }); + this.setState({ deployState: 'Waiting for the contract to be mined' }); return; case 'hasReceipt': case 'getCode': - this.setState({ deployState: 'Validating the contract deployment', showSigner: false }); + this.setState({ deployState: 'Validating the contract deployment' }); return; case 'completed': - this.setState({ deployState: 'Contract deployment has been completed', showSigner: false }); + this.setState({ deployState: 'Contract deployment has been completed' }); return; default: diff --git a/js/src/modals/ExecuteContract/CompletedStep/completedStep.js b/js/src/modals/ExecuteContract/CompletedStep/completedStep.js deleted file mode 100644 index c039bca2c74..00000000000 --- a/js/src/modals/ExecuteContract/CompletedStep/completedStep.js +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -import React, { Component } from 'react'; - -import styles from '../executeContract.css'; - -export default class CompletedStep extends Component { - render () { - return ( - <div className={ styles.modalcenter }> - Your contract execution call has been submitted. Please visit the <a href='/#/signer'>Parity Signer</a> for authentication. Once executed, any events created by the transaction will be visible in the logs. - </div> - ); - } -} diff --git a/js/src/modals/ExecuteContract/CompletedStep/index.js b/js/src/modals/ExecuteContract/CompletedStep/index.js deleted file mode 100644 index 64e1d619939..00000000000 --- a/js/src/modals/ExecuteContract/CompletedStep/index.js +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -export default from './completedStep'; diff --git a/js/src/modals/ExecuteContract/executeContract.js b/js/src/modals/ExecuteContract/executeContract.js index 3cd8e42a6b1..8b4cd1059b8 100644 --- a/js/src/modals/ExecuteContract/executeContract.js +++ b/js/src/modals/ExecuteContract/executeContract.js @@ -16,16 +16,12 @@ import React, { Component, PropTypes } from 'react'; -import ActionDoneAll from 'material-ui/svg-icons/action/done-all'; import ContentClear from 'material-ui/svg-icons/content/clear'; import { Button, IdentityIcon, Modal } from '../../ui'; -import CompletedStep from './CompletedStep'; import DetailsStep from './DetailsStep'; -const steps = ['function execute', 'completed']; - export default class ExecuteContract extends Component { static contextTypes = { api: PropTypes.object.isRequired, @@ -61,14 +57,13 @@ export default class ExecuteContract extends Component { } render () { - const { step } = this.state; + const { sending } = this.state; return ( <Modal actions={ this.renderDialogActions() } - current={ step } - steps={ steps } - waiting={ [1] } + title='execute function' + busy={ sending } visible> { this.renderStep() } </Modal> @@ -77,60 +72,38 @@ export default class ExecuteContract extends Component { renderDialogActions () { const { onClose, fromAddress } = this.props; - const { step, sending } = this.state; - - switch (step) { - case 0: - return [ - <Button - key='cancel' - label='Cancel' - icon={ <ContentClear /> } - onClick={ onClose } />, - <Button - key='postTransaction' - label='post transaction' - disabled={ sending } - icon={ <IdentityIcon address={ fromAddress } button /> } - onClick={ this.postTransaction } /> - ]; - - case 1: - return [ - <Button - key='close' - label='close' - icon={ <ActionDoneAll /> } - onClick={ onClose } /> - ]; - } + const { sending } = this.state; + + return [ + <Button + key='cancel' + label='Cancel' + icon={ <ContentClear /> } + onClick={ onClose } />, + <Button + key='postTransaction' + label='post transaction' + disabled={ sending } + icon={ <IdentityIcon address={ fromAddress } button /> } + onClick={ this.postTransaction } /> + ]; } renderStep () { const { onFromAddressChange } = this.props; - const { step } = this.state; - - switch (step) { - case 0: - return ( - <DetailsStep - { ...this.props } - { ...this.state } - onFromAddressChange={ onFromAddressChange } - onFuncChange={ this.onFuncChange } - onValueChange={ this.onValueChange } /> - ); - case 1: - return ( - <CompletedStep /> - ); - } + + return ( + <DetailsStep + { ...this.props } + { ...this.state } + onFromAddressChange={ onFromAddressChange } + onFuncChange={ this.onFuncChange } + onValueChange={ this.onValueChange } /> + ); } onAmountChange = (event, amount) => { - this.setState({ - amount - }); + this.setState({ amount }); } onFuncChange = (event, func) => { @@ -180,17 +153,14 @@ export default class ExecuteContract extends Component { postTransaction = () => { const { api, store } = this.context; - const { fromAddress } = this.props; + const { fromAddress, onClose } = this.props; const { amount, func, values } = this.state; const options = { from: fromAddress, value: api.util.toWei(amount || 0) }; - this.setState({ - sending: true, - step: 1 - }); + this.setState({ sending: true }); func .estimateGas(options, values) @@ -198,6 +168,10 @@ export default class ExecuteContract extends Component { options.gas = gas.mul(1.2).toFixed(0); return func.postTransaction(options, values); }) + .then(() => { + this.setState({ sending: false }); + onClose(); + }) .catch((error) => { console.error('postTransaction', error); store.dispatch({ type: 'newError', error }); diff --git a/js/src/modals/Transfer/transfer.js b/js/src/modals/Transfer/transfer.js index 0768617aa43..fbc36517bf6 100644 --- a/js/src/modals/Transfer/transfer.js +++ b/js/src/modals/Transfer/transfer.js @@ -402,13 +402,14 @@ export default class Transfer extends Component { } onSend = () => { - this.onNext(); + const { onClose } = this.props; this.setState({ sending: true }, () => { (this.state.isEth ? this._sendEth() : this._sendToken() ).then((txhash) => { + onClose(); this.setState({ sending: false, txhash diff --git a/js/src/ui/Modal/Title/title.js b/js/src/ui/Modal/Title/title.js index 7e4ae58d766..58db8487a35 100644 --- a/js/src/ui/Modal/Title/title.js +++ b/js/src/ui/Modal/Title/title.js @@ -22,6 +22,7 @@ import styles from '../modal.css'; export default class Title extends Component { static propTypes = { + busy: PropTypes.bool, current: PropTypes.number, steps: PropTypes.array, waiting: PropTypes.array, @@ -75,8 +76,8 @@ export default class Title extends Component { } renderWaiting () { - const { current, waiting } = this.props; - const isWaiting = (waiting || []).includes(current); + const { current, busy, waiting } = this.props; + const isWaiting = busy || (waiting || []).includes(current); if (!isWaiting) { return null; diff --git a/js/src/ui/Modal/modal.js b/js/src/ui/Modal/modal.js index cfbf793d92e..d044dc7ae7b 100644 --- a/js/src/ui/Modal/modal.js +++ b/js/src/ui/Modal/modal.js @@ -35,6 +35,7 @@ class Modal extends Component { static propTypes = { actions: PropTypes.node, + busy: PropTypes.bool, children: PropTypes.node, className: PropTypes.string, current: PropTypes.number, @@ -50,11 +51,12 @@ class Modal extends Component { render () { const { muiTheme } = this.context; - const { actions, className, current, children, scroll, steps, waiting, title, visible, settings } = this.props; + const { actions, busy, className, current, children, scroll, steps, waiting, title, visible, settings } = this.props; const contentStyle = muiTheme.parity.getBackgroundStyle(null, settings.backgroundSeed); const header = ( <Title current={ current } + busy={ busy } waiting={ waiting } steps={ steps } title={ title } /> diff --git a/js/src/views/Application/DappContainer/dappContainer.js b/js/src/views/Application/DappContainer/dappContainer.js index e3e3d2cb0cc..2d14a6e585a 100644 --- a/js/src/views/Application/DappContainer/dappContainer.js +++ b/js/src/views/Application/DappContainer/dappContainer.js @@ -31,7 +31,7 @@ export default class DappContainer extends Component { return ( <div className={ styles.container }> { children } - <ParityBar /> + <ParityBar dapp /> </div> ); } diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index fdea0a264db..2b5762d4c96 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -18,6 +18,8 @@ import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; +import ParityBar from '../ParityBar'; + import Container from './Container'; import DappContainer from './DappContainer'; import FrameError from './FrameError'; @@ -74,6 +76,7 @@ class Application extends Component { pending={ pending } /> { children } <Status /> + <ParityBar /> </Container> ); } diff --git a/js/src/views/ParityBar/parityBar.js b/js/src/views/ParityBar/parityBar.js index 4ccd296ebfc..386cf14b73a 100644 --- a/js/src/views/ParityBar/parityBar.js +++ b/js/src/views/ParityBar/parityBar.js @@ -28,24 +28,33 @@ import styles from './parityBar.css'; class ParityBar extends Component { static propTypes = { - pending: PropTypes.array + pending: PropTypes.array, + dapp: PropTypes.bool.isRequired } state = { - opened: false + opened: false, + lastCount: -1 } componentWillReceiveProps (nextProps) { + const { lastCount } = this.state; + const count = this.props.pending.length; const newCount = nextProps.pending.length; + if (count === newCount) { + return; + } + // Open when a request is added if (count < newCount) { - this.setState({ opened: true }); - + this.setState({ opened: lastCount !== -1, lastCount: newCount }); // Close when no more requests pending } else if (newCount === 0 && count === 1) { - this.setState({ opened: false }); + this.setState({ opened: false, lastCount: newCount }); + } else { + this.setState({ lastCount: newCount }); } } @@ -58,6 +67,12 @@ class ParityBar extends Component { } renderBar () { + const { dapp } = this.props; + + if (!dapp) { + return null; + } + const parityIcon = ( <img src={ imagesEthcoreBlock } From 0fe962a65e8304afcb53e372590915e427318cdb Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 28 Sep 2016 17:49:47 +0200 Subject: [PATCH 0867/1062] ParityBar popup, shared Modal steps --- .../modals/DeployContract/deployContract.css | 9 +++++++ .../modals/DeployContract/deployContract.js | 21 ++++++++++----- js/src/ui/Modal/Busy/busy.css | 27 +++++++++++++++++++ .../Modal/Busy/busy.js} | 14 ++++++---- .../BusyStep => ui/Modal/Busy}/index.js | 2 +- js/src/ui/Modal/Completed/completed.css | 24 +++++++++++++++++ .../Modal/Completed/completed.js} | 14 +++++----- .../Modal/Completed}/index.js | 2 +- js/src/ui/Modal/index.js | 8 ++++++ js/src/ui/index.js | 4 ++- js/src/views/ParityBar/parityBar.js | 6 ++--- 11 files changed, 105 insertions(+), 26 deletions(-) create mode 100644 js/src/ui/Modal/Busy/busy.css rename js/src/{modals/DeployContract/CompletedStep/completedStep.js => ui/Modal/Busy/busy.js} (71%) rename js/src/{modals/DeployContract/BusyStep => ui/Modal/Busy}/index.js (95%) create mode 100644 js/src/ui/Modal/Completed/completed.css rename js/src/{modals/DeployContract/BusyStep/busyStep.js => ui/Modal/Completed/completed.js} (73%) rename js/src/{modals/DeployContract/CompletedStep => ui/Modal/Completed}/index.js (94%) diff --git a/js/src/modals/DeployContract/deployContract.css b/js/src/modals/DeployContract/deployContract.css index cfe528b643e..a42b351fab6 100644 --- a/js/src/modals/DeployContract/deployContract.css +++ b/js/src/modals/DeployContract/deployContract.css @@ -18,3 +18,12 @@ .center { text-align: center; } + +.address { + vertical-align: top; + display: inline-block; +} + +.identityicon { + margin: -8px 0.5em; +} diff --git a/js/src/modals/DeployContract/deployContract.js b/js/src/modals/DeployContract/deployContract.js index e6505a463ea..bef9efe047c 100644 --- a/js/src/modals/DeployContract/deployContract.js +++ b/js/src/modals/DeployContract/deployContract.js @@ -18,14 +18,14 @@ import React, { Component, PropTypes } from 'react'; import ActionDoneAll from 'material-ui/svg-icons/action/done-all'; import ContentClear from 'material-ui/svg-icons/content/clear'; -import { Button, IdentityIcon, Modal } from '../../ui'; +import { BusyStep, CompletedStep, Button, IdentityIcon, Modal } from '../../ui'; import { ERRORS, validateAbi, validateCode, validateName } from '../../util/validation'; -import BusyStep from './BusyStep'; -import CompletedStep from './CompletedStep'; import DetailsStep from './DetailsStep'; import ErrorStep from './ErrorStep'; +import styles from './deployContract.css'; + const steps = ['contract details', 'deployment', 'completed']; export default class DeployContract extends Component { @@ -114,7 +114,7 @@ export default class DeployContract extends Component { renderStep () { const { accounts } = this.props; - const { deployError, step } = this.state; + const { address, deployError, step, deployState } = this.state; if (deployError) { return ( @@ -137,12 +137,21 @@ export default class DeployContract extends Component { case 1: return ( - <BusyStep { ...this.state } /> + <BusyStep + title='The deployment is currently in progress' + state={ deployState } /> ); case 2: return ( - <CompletedStep { ...this.state } /> + <CompletedStep> + <div>Your contract has been deployed to</div> + <div> + <IdentityIcon address={ address } inline center className={ styles.identityicon } /> + <div className={ styles.address }>{ address }</div> + </div> + <div>and has been added to your list of available contracts</div> + </CompletedStep> ); } } diff --git a/js/src/ui/Modal/Busy/busy.css b/js/src/ui/Modal/Busy/busy.css new file mode 100644 index 00000000000..ea2cb948580 --- /dev/null +++ b/js/src/ui/Modal/Busy/busy.css @@ -0,0 +1,27 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see <http://www.gnu.org/licenses/>. +*/ + +.center { + text-align: center; +} + +.title { +} + +.state { + margin-top: 1em; +} diff --git a/js/src/modals/DeployContract/CompletedStep/completedStep.js b/js/src/ui/Modal/Busy/busy.js similarity index 71% rename from js/src/modals/DeployContract/CompletedStep/completedStep.js rename to js/src/ui/Modal/Busy/busy.js index 2c9c5b0ce23..6898d3e1fad 100644 --- a/js/src/modals/DeployContract/CompletedStep/completedStep.js +++ b/js/src/ui/Modal/Busy/busy.js @@ -16,19 +16,23 @@ import React, { Component, PropTypes } from 'react'; -import styles from '../deployContract.css'; +import styles from './busy.css'; -export default class CompletedStep extends Component { +export default class Busy extends Component { static propTypes = { - address: PropTypes.string + title: PropTypes.string, + state: PropTypes.string, + children: PropTypes.node } render () { - const { address } = this.props; + const { children, title, state } = this.props; return ( <div className={ styles.center }> - The contract has been deployed to { address } and added to your list of available contracts + <div className={ styles.title }>{ title }</div> + <div className={ styles.state }>{ state }</div> + { children } </div> ); } diff --git a/js/src/modals/DeployContract/BusyStep/index.js b/js/src/ui/Modal/Busy/index.js similarity index 95% rename from js/src/modals/DeployContract/BusyStep/index.js rename to js/src/ui/Modal/Busy/index.js index 17bf2b13114..27c097eeae7 100644 --- a/js/src/modals/DeployContract/BusyStep/index.js +++ b/js/src/ui/Modal/Busy/index.js @@ -14,4 +14,4 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see <http://www.gnu.org/licenses/>. -export default from './busyStep'; +export default from './busy'; diff --git a/js/src/ui/Modal/Completed/completed.css b/js/src/ui/Modal/Completed/completed.css new file mode 100644 index 00000000000..e843e7c6643 --- /dev/null +++ b/js/src/ui/Modal/Completed/completed.css @@ -0,0 +1,24 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see <http://www.gnu.org/licenses/>. +*/ + +.body { + text-align: center; +} + +.body>div+div { + margin-top: 1em; +} diff --git a/js/src/modals/DeployContract/BusyStep/busyStep.js b/js/src/ui/Modal/Completed/completed.js similarity index 73% rename from js/src/modals/DeployContract/BusyStep/busyStep.js rename to js/src/ui/Modal/Completed/completed.js index 062c1863060..de619562136 100644 --- a/js/src/modals/DeployContract/BusyStep/busyStep.js +++ b/js/src/ui/Modal/Completed/completed.js @@ -16,21 +16,19 @@ import React, { Component, PropTypes } from 'react'; -import styles from '../deployContract.css'; +import styles from './completed.css'; -export default class BusyStep extends Component { +export default class Completed extends Component { static propTypes = { - deployState: PropTypes.string + children: PropTypes.node } render () { - const { deployState } = this.props; + const { children } = this.props; return ( - <div className={ styles.center }> - <div> - The deployment is currently in progress, { deployState } - </div> + <div className={ styles.body }> + { children } </div> ); } diff --git a/js/src/modals/DeployContract/CompletedStep/index.js b/js/src/ui/Modal/Completed/index.js similarity index 94% rename from js/src/modals/DeployContract/CompletedStep/index.js rename to js/src/ui/Modal/Completed/index.js index 64e1d619939..3e79033d81c 100644 --- a/js/src/modals/DeployContract/CompletedStep/index.js +++ b/js/src/ui/Modal/Completed/index.js @@ -14,4 +14,4 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see <http://www.gnu.org/licenses/>. -export default from './completedStep'; +export default from './completed'; diff --git a/js/src/ui/Modal/index.js b/js/src/ui/Modal/index.js index 1e75d9fd896..232d94eb224 100644 --- a/js/src/ui/Modal/index.js +++ b/js/src/ui/Modal/index.js @@ -14,4 +14,12 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see <http://www.gnu.org/licenses/>. +import Busy from './Busy'; +import Completed from './Completed'; + export default from './modal'; + +export { + Busy, + Completed +}; diff --git a/js/src/ui/index.js b/js/src/ui/index.js index 1938555f3c1..b23778f94f6 100644 --- a/js/src/ui/index.js +++ b/js/src/ui/index.js @@ -25,7 +25,7 @@ import Errors from './Errors'; import Form, { AddressSelect, FormWrap, Input, InputAddress, InputAddressSelect, InputInline, Select } from './Form'; import IdentityIcon from './IdentityIcon'; import MethodDecoding from './MethodDecoding'; -import Modal from './Modal'; +import Modal, { Busy as BusyStep, Completed as CompletedStep } from './Modal'; import muiTheme from './Theme'; import Page from './Page'; import ParityBackground from './ParityBackground'; @@ -53,6 +53,8 @@ export { IdentityIcon, MethodDecoding, Modal, + BusyStep, + CompletedStep, muiTheme, Page, ParityBackground, diff --git a/js/src/views/ParityBar/parityBar.js b/js/src/views/ParityBar/parityBar.js index 386cf14b73a..9457b6480c8 100644 --- a/js/src/views/ParityBar/parityBar.js +++ b/js/src/views/ParityBar/parityBar.js @@ -29,7 +29,7 @@ import styles from './parityBar.css'; class ParityBar extends Component { static propTypes = { pending: PropTypes.array, - dapp: PropTypes.bool.isRequired + dapp: PropTypes.bool } state = { @@ -47,10 +47,8 @@ class ParityBar extends Component { return; } - // Open when a request is added if (count < newCount) { - this.setState({ opened: lastCount !== -1, lastCount: newCount }); - // Close when no more requests pending + this.setState({ opened: !count || lastCount !== -1, lastCount: newCount }); } else if (newCount === 0 && count === 1) { this.setState({ opened: false, lastCount: newCount }); } else { From 96d162af0c5138300efbd07f010aa27fc579e641 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 28 Sep 2016 18:31:02 +0200 Subject: [PATCH 0868/1062] execute now shows the txhash --- js/src/api/api.js | 23 +++++ js/src/api/contract/contract.js | 25 +---- .../ExecuteContract/executeContract.css | 4 + .../modals/ExecuteContract/executeContract.js | 93 ++++++++++++++----- js/src/modals/Transfer/Complete/complete.js | 51 ---------- js/src/modals/Transfer/Complete/index.js | 17 ---- js/src/modals/Transfer/transfer.js | 18 ++-- 7 files changed, 110 insertions(+), 121 deletions(-) delete mode 100644 js/src/modals/Transfer/Complete/complete.js delete mode 100644 js/src/modals/Transfer/Complete/index.js diff --git a/js/src/api/api.js b/js/src/api/api.js index e120a15cf2c..853978c3bcf 100644 --- a/js/src/api/api.js +++ b/js/src/api/api.js @@ -94,6 +94,29 @@ export default class Api { return this._subscriptions.unsubscribe(subscriptionName, subscriptionId); } + pollMethod (_group, method, input, validate) { + const group = `_${_group}`; + + return new Promise((resolve, reject) => { + const timeout = () => { + this[group][method](input) + .then((result) => { + if ((validate && validate(result)) || result) { + resolve(result); + } else { + setTimeout(timeout, 500); + } + }) + .catch((error) => { + console.error('pollMethod', error); + reject(error); + }); + }; + + timeout(); + }); + } + static Transport = { Http: Http, Ws: Ws diff --git a/js/src/api/contract/contract.js b/js/src/api/contract/contract.js index 6bbd814740d..76df0a66006 100644 --- a/js/src/api/contract/contract.js +++ b/js/src/api/contract/contract.js @@ -163,33 +163,12 @@ export default class Contract { return receipt; } - _pollEthMethod (method, input, validate) { - return new Promise((resolve, reject) => { - const timeout = () => { - this._api.eth[method](input) - .then((result) => { - if (validate(result)) { - resolve(result); - } else { - setTimeout(timeout, 500); - } - }) - .catch((error) => { - console.error('_pollEthEndpoint', error); - reject(error); - }); - }; - - timeout(); - }); - } - _pollCheckRequest = (requestId) => { - return this._pollEthMethod('checkRequest', requestId, (txhash) => txhash); + return this._api.pollEthMethod('eth', 'checkRequest', requestId); } _pollTransactionReceipt = (txhash, gas) => { - return this._pollEthMethod('getTransactionReceipt', txhash, (receipt) => { + return this.api.pollEthMethod('eth', 'getTransactionReceipt', txhash, (receipt) => { if (!receipt || receipt.blockNumber.eq(0)) { return false; } diff --git a/js/src/modals/ExecuteContract/executeContract.css b/js/src/modals/ExecuteContract/executeContract.css index b55453f92ca..cdebfef3266 100644 --- a/js/src/modals/ExecuteContract/executeContract.css +++ b/js/src/modals/ExecuteContract/executeContract.css @@ -29,3 +29,7 @@ .paramname { color: #aaa; } + +.txhash { + word-break: break-all; +} diff --git a/js/src/modals/ExecuteContract/executeContract.js b/js/src/modals/ExecuteContract/executeContract.js index 8b4cd1059b8..a45e8f2489f 100644 --- a/js/src/modals/ExecuteContract/executeContract.js +++ b/js/src/modals/ExecuteContract/executeContract.js @@ -15,13 +15,15 @@ // along with Parity. If not, see <http://www.gnu.org/licenses/>. import React, { Component, PropTypes } from 'react'; - +import ActionDoneAll from 'material-ui/svg-icons/action/done-all'; import ContentClear from 'material-ui/svg-icons/content/clear'; -import { Button, IdentityIcon, Modal } from '../../ui'; +import { BusyStep, CompletedStep, Button, IdentityIcon, Modal } from '../../ui'; import DetailsStep from './DetailsStep'; +import styles from './executeContract.css'; + export default class ExecuteContract extends Component { static contextTypes = { api: PropTypes.object.isRequired, @@ -29,6 +31,7 @@ export default class ExecuteContract extends Component { } static propTypes = { + isTest: PropTypes.bool, fromAddress: PropTypes.string, accounts: PropTypes.object, contract: PropTypes.object, @@ -44,7 +47,9 @@ export default class ExecuteContract extends Component { values: [], valuesError: [], step: 0, - sending: false + sending: false, + busyState: null, + txhash: null } componentDidMount () { @@ -72,33 +77,70 @@ export default class ExecuteContract extends Component { renderDialogActions () { const { onClose, fromAddress } = this.props; - const { sending } = this.state; - - return [ + const { sending, step } = this.state; + const cancelBtn = ( <Button key='cancel' label='Cancel' icon={ <ContentClear /> } - onClick={ onClose } />, + onClick={ onClose } /> + ); + + if (step === 0) { + return [ + cancelBtn, + <Button + key='postTransaction' + label='post transaction' + disabled={ sending } + icon={ <IdentityIcon address={ fromAddress } button /> } + onClick={ this.postTransaction } /> + ]; + } else if (step === 1) { + return [ + cancelBtn + ]; + } + + return [ <Button - key='postTransaction' - label='post transaction' - disabled={ sending } - icon={ <IdentityIcon address={ fromAddress } button /> } - onClick={ this.postTransaction } /> + key='close' + label='Done' + icon={ <ActionDoneAll /> } + onClick={ onClose } /> ]; } renderStep () { - const { onFromAddressChange } = this.props; + const { onFromAddressChange, isTest } = this.props; + const { step, busyState, txhash } = this.state; + + if (step === 0) { + return ( + <DetailsStep + { ...this.props } + { ...this.state } + onFromAddressChange={ onFromAddressChange } + onFuncChange={ this.onFuncChange } + onValueChange={ this.onValueChange } /> + ); + } else if (step === 1) { + return ( + <BusyStep + title='The function execution is in progress' + state={ busyState } /> + ); + } + + const link = `https://${isTest ? 'testnet.' : ''}etherscan.io/tx/${txhash}`; return ( - <DetailsStep - { ...this.props } - { ...this.state } - onFromAddressChange={ onFromAddressChange } - onFuncChange={ this.onFuncChange } - onValueChange={ this.onValueChange } /> + <CompletedStep> + <div>Your transaction has been posted to the network with a transaction hash of</div> + <div className={ styles.txhash }> + <a href={ link } target='_blank'>{ txhash }</a> + </div> + </CompletedStep> ); } @@ -153,14 +195,14 @@ export default class ExecuteContract extends Component { postTransaction = () => { const { api, store } = this.context; - const { fromAddress, onClose } = this.props; + const { fromAddress } = this.props; const { amount, func, values } = this.state; const options = { from: fromAddress, value: api.util.toWei(amount || 0) }; - this.setState({ sending: true }); + this.setState({ sending: true, step: 1 }); func .estimateGas(options, values) @@ -168,9 +210,12 @@ export default class ExecuteContract extends Component { options.gas = gas.mul(1.2).toFixed(0); return func.postTransaction(options, values); }) - .then(() => { - this.setState({ sending: false }); - onClose(); + .then((requestId) => { + this.setState({ busyState: 'Waiting for authorization in the Parity Signer' }); + return api.pollMethod('eth', 'checkRequest', requestId); + }) + .then((txhash) => { + this.setState({ sending: false, step: 2, txhash, busyState: 'Your transaction has been posted to the network' }); }) .catch((error) => { console.error('postTransaction', error); diff --git a/js/src/modals/Transfer/Complete/complete.js b/js/src/modals/Transfer/Complete/complete.js deleted file mode 100644 index 5051fb26032..00000000000 --- a/js/src/modals/Transfer/Complete/complete.js +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -import React, { Component, PropTypes } from 'react'; - -import LinearProgress from 'material-ui/LinearProgress'; - -import styles from '../transfer.css'; - -export default class Complete extends Component { - static propTypes = { - txhash: PropTypes.string, - sending: PropTypes.bool - } - - render () { - const { sending } = this.props; - - if (sending) { - return ( - <div> - <div className={ styles.info }> - The transaction is sending, please wait until the transaction hash is received - </div> - <LinearProgress mode='indeterminate' /> - </div> - ); - } - - return ( - <div> - <div className={ styles.info }> - The transaction was sent and awaits verification in the signer. <a href='/#/signer'>Enter the signer</a> and authenticate the correct transactions with your account password. - </div> - </div> - ); - } -} diff --git a/js/src/modals/Transfer/Complete/index.js b/js/src/modals/Transfer/Complete/index.js deleted file mode 100644 index 60cfe000f64..00000000000 --- a/js/src/modals/Transfer/Complete/index.js +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -export default from './complete'; diff --git a/js/src/modals/Transfer/transfer.js b/js/src/modals/Transfer/transfer.js index fbc36517bf6..e4e1915883b 100644 --- a/js/src/modals/Transfer/transfer.js +++ b/js/src/modals/Transfer/transfer.js @@ -21,9 +21,8 @@ import ContentClear from 'material-ui/svg-icons/content/clear'; import NavigationArrowBack from 'material-ui/svg-icons/navigation/arrow-back'; import NavigationArrowForward from 'material-ui/svg-icons/navigation/arrow-forward'; -import { Button, IdentityIcon, Modal } from '../../ui'; +import { BusyStep, CompletedStep, Button, IdentityIcon, Modal } from '../../ui'; -import Complete from './Complete'; import Details from './Details'; import Extras from './Extras'; import ERRORS from './errors'; @@ -33,11 +32,12 @@ const DEFAULT_GAS = '21000'; const DEFAULT_GASPRICE = '20000000000'; const TITLES = { transfer: 'transfer details', + budy: 'sending', complete: 'complete', extras: 'extra information' }; -const STAGES_BASIC = [TITLES.transfer, TITLES.complete]; -const STAGES_EXTRA = [TITLES.transfer, TITLES.extras, TITLES.complete]; +const STAGES_BASIC = [TITLES.transfer, TITLES.sending, TITLES.complete]; +const STAGES_EXTRA = [TITLES.transfer, TITLES.extras, TITLES.sending, TITLES.complete]; export default class Transfer extends Component { static contextTypes = { @@ -81,7 +81,6 @@ export default class Transfer extends Component { render () { const { stage, extras } = this.state; - // title={ this.renderAccount() } return ( <Modal actions={ this.renderDialogActions() } @@ -131,8 +130,15 @@ export default class Transfer extends Component { renderCompletePage () { const { sending, txhash } = this.state; + if (sending) { + return ( + <BusyStep + title='Your transaction has been sent' /> + ); + } + return ( - <Complete + <CompletedStep sending={ sending } txhash={ txhash } /> ); From 496ad189ceadd9a1903f12beb6b71ee71fabc528 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 28 Sep 2016 21:44:23 +0200 Subject: [PATCH 0869/1062] pass in actual method to poll for --- js/src/api/api.js | 6 ++---- js/src/api/contract/contract.js | 4 ++-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/js/src/api/api.js b/js/src/api/api.js index 853978c3bcf..a40c1495497 100644 --- a/js/src/api/api.js +++ b/js/src/api/api.js @@ -94,12 +94,10 @@ export default class Api { return this._subscriptions.unsubscribe(subscriptionName, subscriptionId); } - pollMethod (_group, method, input, validate) { - const group = `_${_group}`; - + pollMethod (method, input, validate) { return new Promise((resolve, reject) => { const timeout = () => { - this[group][method](input) + method(input) .then((result) => { if ((validate && validate(result)) || result) { resolve(result); diff --git a/js/src/api/contract/contract.js b/js/src/api/contract/contract.js index 76df0a66006..3c3213610c4 100644 --- a/js/src/api/contract/contract.js +++ b/js/src/api/contract/contract.js @@ -164,11 +164,11 @@ export default class Contract { } _pollCheckRequest = (requestId) => { - return this._api.pollEthMethod('eth', 'checkRequest', requestId); + return this._api.pollEthMethod(this._api.eth.checkRequest, requestId); } _pollTransactionReceipt = (txhash, gas) => { - return this.api.pollEthMethod('eth', 'getTransactionReceipt', txhash, (receipt) => { + return this.api.pollEthMethod(this._api.eth.getTransactionReceipt, txhash, (receipt) => { if (!receipt || receipt.blockNumber.eq(0)) { return false; } From 2871f109a177b1fef3d1111a16602ff329a233fa Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 28 Sep 2016 22:59:21 +0200 Subject: [PATCH 0870/1062] execute contract shows confirmations --- js/src/api/api.js | 5 +- js/src/api/contract/contract.js | 4 +- .../modals/ExecuteContract/executeContract.js | 14 +- js/src/ui/TxHash/index.js | 17 +++ js/src/ui/TxHash/txHash.css | 37 +++++ js/src/ui/TxHash/txHash.js | 133 ++++++++++++++++++ js/src/ui/index.js | 4 +- 7 files changed, 200 insertions(+), 14 deletions(-) create mode 100644 js/src/ui/TxHash/index.js create mode 100644 js/src/ui/TxHash/txHash.css create mode 100644 js/src/ui/TxHash/txHash.js diff --git a/js/src/api/api.js b/js/src/api/api.js index a40c1495497..0e97333b020 100644 --- a/js/src/api/api.js +++ b/js/src/api/api.js @@ -95,9 +95,12 @@ export default class Api { } pollMethod (method, input, validate) { + const [_group, endpoint] = method.split('_'); + const group = `_${_group}`; + return new Promise((resolve, reject) => { const timeout = () => { - method(input) + this[group][endpoint](input) .then((result) => { if ((validate && validate(result)) || result) { resolve(result); diff --git a/js/src/api/contract/contract.js b/js/src/api/contract/contract.js index 3c3213610c4..789dc0745a9 100644 --- a/js/src/api/contract/contract.js +++ b/js/src/api/contract/contract.js @@ -164,11 +164,11 @@ export default class Contract { } _pollCheckRequest = (requestId) => { - return this._api.pollEthMethod(this._api.eth.checkRequest, requestId); + return this._api.pollEthMethod('eth_checkRequest', requestId); } _pollTransactionReceipt = (txhash, gas) => { - return this.api.pollEthMethod(this._api.eth.getTransactionReceipt, txhash, (receipt) => { + return this.api.pollEthMethod('eth_getTransactionReceipt', txhash, (receipt) => { if (!receipt || receipt.blockNumber.eq(0)) { return false; } diff --git a/js/src/modals/ExecuteContract/executeContract.js b/js/src/modals/ExecuteContract/executeContract.js index a45e8f2489f..fc369d500bd 100644 --- a/js/src/modals/ExecuteContract/executeContract.js +++ b/js/src/modals/ExecuteContract/executeContract.js @@ -18,12 +18,10 @@ import React, { Component, PropTypes } from 'react'; import ActionDoneAll from 'material-ui/svg-icons/action/done-all'; import ContentClear from 'material-ui/svg-icons/content/clear'; -import { BusyStep, CompletedStep, Button, IdentityIcon, Modal } from '../../ui'; +import { BusyStep, CompletedStep, Button, IdentityIcon, Modal, TxHash } from '../../ui'; import DetailsStep from './DetailsStep'; -import styles from './executeContract.css'; - export default class ExecuteContract extends Component { static contextTypes = { api: PropTypes.object.isRequired, @@ -112,7 +110,7 @@ export default class ExecuteContract extends Component { } renderStep () { - const { onFromAddressChange, isTest } = this.props; + const { onFromAddressChange } = this.props; const { step, busyState, txhash } = this.state; if (step === 0) { @@ -132,14 +130,10 @@ export default class ExecuteContract extends Component { ); } - const link = `https://${isTest ? 'testnet.' : ''}etherscan.io/tx/${txhash}`; - return ( <CompletedStep> <div>Your transaction has been posted to the network with a transaction hash of</div> - <div className={ styles.txhash }> - <a href={ link } target='_blank'>{ txhash }</a> - </div> + <TxHash hash={ txhash } /> </CompletedStep> ); } @@ -212,7 +206,7 @@ export default class ExecuteContract extends Component { }) .then((requestId) => { this.setState({ busyState: 'Waiting for authorization in the Parity Signer' }); - return api.pollMethod('eth', 'checkRequest', requestId); + return api.pollMethod('eth_checkRequest', requestId); }) .then((txhash) => { this.setState({ sending: false, step: 2, txhash, busyState: 'Your transaction has been posted to the network' }); diff --git a/js/src/ui/TxHash/index.js b/js/src/ui/TxHash/index.js new file mode 100644 index 00000000000..eddcbfcbf9b --- /dev/null +++ b/js/src/ui/TxHash/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see <http://www.gnu.org/licenses/>. + +export default from './txHash'; diff --git a/js/src/ui/TxHash/txHash.css b/js/src/ui/TxHash/txHash.css new file mode 100644 index 00000000000..0a65f4a77d0 --- /dev/null +++ b/js/src/ui/TxHash/txHash.css @@ -0,0 +1,37 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see <http://www.gnu.org/licenses/>. +*/ + +.details { +} + +.hash { +} + +.confirm { + padding-top: 1em; + opacity: 0.5; +} + +.progressbar { + margin: 0.5em !important; + width: 30% !important; + display: inline-block !important; + height: 0.75em !important; +} + +.progressinfo { +} diff --git a/js/src/ui/TxHash/txHash.js b/js/src/ui/TxHash/txHash.js new file mode 100644 index 00000000000..96f246746c9 --- /dev/null +++ b/js/src/ui/TxHash/txHash.js @@ -0,0 +1,133 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see <http://www.gnu.org/licenses/>. + +import BigNumber from 'bignumber.js'; +import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; +import { LinearProgress } from 'material-ui'; + +import styles from './txHash.css'; + +class TxHash extends Component { + static contextTypes = { + api: PropTypes.object.isRequired + } + + static propTypes = { + hash: PropTypes.string.isRequired, + isTest: PropTypes.bool + } + + state = { + blockNumber: new BigNumber(0), + transaction: null, + subscriptionId: null + } + + componentDidMount () { + const { api } = this.context; + + api.subscribe('eth_blockNumber', this.onBlockNumber).then((subscriptionId) => { + this.setState({ subscriptionId }); + }); + } + + componentWillUnmount () { + const { api } = this.context; + const { subscriptionId } = this.state; + + api.unsubscribe('eth_blockNumber', subscriptionId); + } + + render () { + const { hash, isTest } = this.props; + const link = `https://${isTest ? 'testnet.' : ''}etherscan.io/tx/${hash}`; + + return ( + <div className={ styles.details }> + <div className={ styles.hash }> + <a href={ link } target='_blank'>{ hash }</a> + </div> + { this.renderConfirmations() } + </div> + ); + } + + renderConfirmations () { + const { blockNumber, transaction } = this.state; + + if (!transaction) { + return null; + } + + let txBlock = 'Pending'; + let confirmations = 'No'; + let value = 0; + + if (transaction.blockNumber && transaction.blockNumber.gt(0)) { + const num = blockNumber.minus(transaction.blockNumber).plus(1); + txBlock = `#${transaction.blockNumber.toFormat(0)}`; + confirmations = num.toFormat(0); + value = num.gt(10) ? 10 : num.toNumber(); + } + + return ( + <div className={ styles.confirm }> + <LinearProgress + className={ styles.progressbar } + min={ 0 } max={ 10 } value={ value } + color='white' + mode='determinate' /> + <div className={ styles.progressinfo }> + { txBlock } / { confirmations } confirmations + </div> + </div> + ); + } + + onBlockNumber = (error, blockNumber) => { + const { api } = this.context; + const { hash } = this.props; + + if (error) { + return; + } + + this.setState({ blockNumber }); + + api.eth + .getTransactionReceipt(hash) + .then((transaction) => { + this.setState({ transaction }); + }); + } +} + +function mapStateToProps (state) { + const { isTest } = state.nodeStatus; + + return { isTest }; +} + +function mapDispatchToProps (dispatch) { + return bindActionCreators({}, dispatch); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(TxHash); diff --git a/js/src/ui/index.js b/js/src/ui/index.js index b23778f94f6..47ac1150e74 100644 --- a/js/src/ui/index.js +++ b/js/src/ui/index.js @@ -31,6 +31,7 @@ import Page from './Page'; import ParityBackground from './ParityBackground'; import SignerIcon from './SignerIcon'; import Tooltips, { Tooltip } from './Tooltips'; +import TxHash from './TxHash'; export { Actionbar, @@ -60,5 +61,6 @@ export { ParityBackground, SignerIcon, Tooltip, - Tooltips + Tooltips, + TxHash }; From 58323cb6ea9b78e4f3344844d0e1cff20e1799ad Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 28 Sep 2016 23:24:11 +0200 Subject: [PATCH 0871/1062] transfer uses new confirmation step --- js/src/modals/Transfer/transfer.js | 34 +++++++++++++++++++----------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/js/src/modals/Transfer/transfer.js b/js/src/modals/Transfer/transfer.js index e4e1915883b..f15dc18451c 100644 --- a/js/src/modals/Transfer/transfer.js +++ b/js/src/modals/Transfer/transfer.js @@ -21,7 +21,7 @@ import ContentClear from 'material-ui/svg-icons/content/clear'; import NavigationArrowBack from 'material-ui/svg-icons/navigation/arrow-back'; import NavigationArrowForward from 'material-ui/svg-icons/navigation/arrow-forward'; -import { BusyStep, CompletedStep, Button, IdentityIcon, Modal } from '../../ui'; +import { BusyStep, CompletedStep, Button, IdentityIcon, Modal, TxHash } from '../../ui'; import Details from './Details'; import Extras from './Extras'; @@ -32,7 +32,7 @@ const DEFAULT_GAS = '21000'; const DEFAULT_GASPRICE = '20000000000'; const TITLES = { transfer: 'transfer details', - budy: 'sending', + sending: 'sending', complete: 'complete', extras: 'extra information' }; @@ -71,7 +71,8 @@ export default class Transfer extends Component { value: '0.0', valueAll: false, valueError: null, - isEth: true + isEth: true, + busyState: null } componentDidMount () { @@ -128,19 +129,21 @@ export default class Transfer extends Component { } renderCompletePage () { - const { sending, txhash } = this.state; + const { sending, txhash, busyState } = this.state; if (sending) { return ( <BusyStep - title='Your transaction has been sent' /> + title='The transaction is in progress' + state={ busyState } /> ); } return ( - <CompletedStep - sending={ sending } - txhash={ txhash } /> + <CompletedStep> + <div>Your transaction has been posted to the network with a transaction hash of</div> + <TxHash hash={ txhash } /> + </CompletedStep> ); } @@ -408,17 +411,24 @@ export default class Transfer extends Component { } onSend = () => { - const { onClose } = this.props; + const { api } = this.context; + + this.onNext(); this.setState({ sending: true }, () => { (this.state.isEth ? this._sendEth() : this._sendToken() - ).then((txhash) => { - onClose(); + ).then((requestId) => { + this.setState({ busyState: 'Waiting for authorization in the Parity Signer' }); + return api.pollMethod('eth_checkRequest', requestId); + }) + .then((txhash) => { + this.onNext(); this.setState({ sending: false, - txhash + txhash, + busyState: 'Your transaction has been posted to the network' }); }) .catch((error) => { From d3e928e7a2615fb1950a746eaed9870bd214fe36 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 29 Sep 2016 00:16:29 +0200 Subject: [PATCH 0872/1062] deployment works as expected --- js/src/api/api.js | 2 +- js/src/api/contract/contract.js | 10 ++++----- js/src/api/util/decode.js | 6 ------ js/src/api/util/decode.spec.js | 4 ---- .../DeployContract/ErrorStep/errorStep.js | 4 ++-- .../modals/DeployContract/deployContract.js | 21 ++++++++++++------- .../modals/ExecuteContract/executeContract.js | 1 - js/src/modals/Transfer/transfer.js | 1 - js/src/ui/MethodDecoding/methodDecoding.js | 2 +- js/src/ui/TxHash/txHash.css | 4 ++++ js/src/ui/TxHash/txHash.js | 3 +++ 11 files changed, 29 insertions(+), 29 deletions(-) diff --git a/js/src/api/api.js b/js/src/api/api.js index 0e97333b020..c821297727f 100644 --- a/js/src/api/api.js +++ b/js/src/api/api.js @@ -102,7 +102,7 @@ export default class Api { const timeout = () => { this[group][endpoint](input) .then((result) => { - if ((validate && validate(result)) || result) { + if (validate ? validate(result) : result) { resolve(result); } else { setTimeout(timeout, 500); diff --git a/js/src/api/contract/contract.js b/js/src/api/contract/contract.js index 789dc0745a9..739af2aaceb 100644 --- a/js/src/api/contract/contract.js +++ b/js/src/api/contract/contract.js @@ -118,11 +118,11 @@ export default class Contract { setState({ state: 'hasReceipt', receipt }); this._address = receipt.contractAddress; - return receipt.contractAddress; + return this._address; }) .then((address) => { setState({ state: 'getCode' }); - return this._api.eth.getCode(address); + return this._api.eth.getCode(this._address); }) .then((code) => { if (code === '0x') { @@ -164,12 +164,12 @@ export default class Contract { } _pollCheckRequest = (requestId) => { - return this._api.pollEthMethod('eth_checkRequest', requestId); + return this._api.pollMethod('eth_checkRequest', requestId); } _pollTransactionReceipt = (txhash, gas) => { - return this.api.pollEthMethod('eth_getTransactionReceipt', txhash, (receipt) => { - if (!receipt || receipt.blockNumber.eq(0)) { + return this.api.pollMethod('eth_getTransactionReceipt', txhash, (receipt) => { + if (!receipt || !receipt.blockNumber || receipt.blockNumber.eq(0)) { return false; } diff --git a/js/src/api/util/decode.js b/js/src/api/util/decode.js index 0c5861262fb..065d516e9e8 100644 --- a/js/src/api/util/decode.js +++ b/js/src/api/util/decode.js @@ -19,8 +19,6 @@ import { isHex } from './types'; import Func from '../../abi/spec/function'; import { fromParamType, toParamType } from '../../abi/spec/paramType/format'; -const CREATE_METHOD = '60606040'; - export function decodeCallData (data) { if (!isHex(data)) { throw new Error('Input to decodeCallData should be a hex value'); @@ -35,10 +33,6 @@ export function decodeCallData (data) { const signature = data.substr(0, 8); const paramdata = data.substr(8); - if ((signature !== CREATE_METHOD) && paramdata.length % 64 !== 0) { - throw new Error(`Parameter length in decodeCallData not a multiple of 64 characters, ${paramdata.length}`); - } - return { signature: `0x${signature}`, paramdata: `0x${paramdata}` diff --git a/js/src/api/util/decode.spec.js b/js/src/api/util/decode.spec.js index f31bfe0310c..665af6d0369 100644 --- a/js/src/api/util/decode.spec.js +++ b/js/src/api/util/decode.spec.js @@ -31,10 +31,6 @@ describe('api/util/decode', () => { expect(() => decodeCallData(METH.slice(-6))).to.throw(/should be method signature/); }); - it('throws when invalid data length', () => { - expect(() => decodeCallData(`${ENCO.slice(-32)}`)).to.throw(/not a multiple of/); - }); - it('splits valid inputs properly', () => { expect(decodeCallData(ENCO)).to.deep.equal({ signature: METH, diff --git a/js/src/modals/DeployContract/ErrorStep/errorStep.js b/js/src/modals/DeployContract/ErrorStep/errorStep.js index d5f502501de..3d97ab598dc 100644 --- a/js/src/modals/DeployContract/ErrorStep/errorStep.js +++ b/js/src/modals/DeployContract/ErrorStep/errorStep.js @@ -20,7 +20,7 @@ import styles from '../deployContract.css'; export default class ErrorStep extends Component { static propTypes = { - error: PropTypes.string + error: PropTypes.object } render () { @@ -28,7 +28,7 @@ export default class ErrorStep extends Component { return ( <div className={ styles.center }> - The contract deployment failed: { error } + The contract deployment failed: { error.message } </div> ); } diff --git a/js/src/modals/DeployContract/deployContract.js b/js/src/modals/DeployContract/deployContract.js index bef9efe047c..6eb4c2f4dbd 100644 --- a/js/src/modals/DeployContract/deployContract.js +++ b/js/src/modals/DeployContract/deployContract.js @@ -18,7 +18,7 @@ import React, { Component, PropTypes } from 'react'; import ActionDoneAll from 'material-ui/svg-icons/action/done-all'; import ContentClear from 'material-ui/svg-icons/content/clear'; -import { BusyStep, CompletedStep, Button, IdentityIcon, Modal } from '../../ui'; +import { BusyStep, CompletedStep, Button, IdentityIcon, Modal, TxHash } from '../../ui'; import { ERRORS, validateAbi, validateCode, validateName } from '../../util/validation'; import DetailsStep from './DetailsStep'; @@ -114,7 +114,7 @@ export default class DeployContract extends Component { renderStep () { const { accounts } = this.props; - const { address, deployError, step, deployState } = this.state; + const { address, deployError, step, deployState, txhash } = this.state; if (deployError) { return ( @@ -136,21 +136,26 @@ export default class DeployContract extends Component { ); case 1: + const body = txhash + ? <TxHash hash={ txhash } /> + : null; return ( <BusyStep title='The deployment is currently in progress' - state={ deployState } /> + state={ deployState }> + { body } + </BusyStep> ); case 2: return ( <CompletedStep> - <div>Your contract has been deployed to</div> + <div>Your contract has been deployed at</div> <div> <IdentityIcon address={ address } inline center className={ styles.identityicon } /> <div className={ styles.address }>{ address }</div> </div> - <div>and has been added to your list of available contracts</div> + <TxHash hash={ txhash } /> </CompletedStep> ); } @@ -239,16 +244,16 @@ export default class DeployContract extends Component { return; case 'getTransactionReceipt': - this.setState({ deployState: 'Waiting for the contract to be mined' }); + this.setState({ deployState: 'Waiting for the contract deployment transaction receipt', txhash: data.txhash }); return; case 'hasReceipt': case 'getCode': - this.setState({ deployState: 'Validating the contract deployment' }); + this.setState({ deployState: 'Validating the deployed contract code' }); return; case 'completed': - this.setState({ deployState: 'Contract deployment has been completed' }); + this.setState({ deployState: 'The contract deployment has been completed' }); return; default: diff --git a/js/src/modals/ExecuteContract/executeContract.js b/js/src/modals/ExecuteContract/executeContract.js index fc369d500bd..080e841ba01 100644 --- a/js/src/modals/ExecuteContract/executeContract.js +++ b/js/src/modals/ExecuteContract/executeContract.js @@ -132,7 +132,6 @@ export default class ExecuteContract extends Component { return ( <CompletedStep> - <div>Your transaction has been posted to the network with a transaction hash of</div> <TxHash hash={ txhash } /> </CompletedStep> ); diff --git a/js/src/modals/Transfer/transfer.js b/js/src/modals/Transfer/transfer.js index f15dc18451c..01e77d93762 100644 --- a/js/src/modals/Transfer/transfer.js +++ b/js/src/modals/Transfer/transfer.js @@ -141,7 +141,6 @@ export default class Transfer extends Component { return ( <CompletedStep> - <div>Your transaction has been posted to the network with a transaction hash of</div> <TxHash hash={ txhash } /> </CompletedStep> ); diff --git a/js/src/ui/MethodDecoding/methodDecoding.js b/js/src/ui/MethodDecoding/methodDecoding.js index 0bb49fb2e05..58aeb68f857 100644 --- a/js/src/ui/MethodDecoding/methodDecoding.js +++ b/js/src/ui/MethodDecoding/methodDecoding.js @@ -310,7 +310,7 @@ export default class Method extends Component { const { signature, paramdata } = api.util.decodeCallData(transaction.input); this.setState({ methodSignature: signature, methodParams: paramdata }); - if (!signature || signature === CONTRACT_CREATE) { + if (!signature || signature === CONTRACT_CREATE || transaction.creates) { this.setState({ isDeploy: true }); return; } diff --git a/js/src/ui/TxHash/txHash.css b/js/src/ui/TxHash/txHash.css index 0a65f4a77d0..c57aef3d4f8 100644 --- a/js/src/ui/TxHash/txHash.css +++ b/js/src/ui/TxHash/txHash.css @@ -18,7 +18,11 @@ .details { } +.header { +} + .hash { + padding-top: 1em; } .confirm { diff --git a/js/src/ui/TxHash/txHash.js b/js/src/ui/TxHash/txHash.js index 96f246746c9..199e7c05a2e 100644 --- a/js/src/ui/TxHash/txHash.js +++ b/js/src/ui/TxHash/txHash.js @@ -59,6 +59,9 @@ class TxHash extends Component { return ( <div className={ styles.details }> + <div className={ styles.header }> + The transaction has been posted to the network with a transaction hash of + </div> <div className={ styles.hash }> <a href={ link } target='_blank'>{ hash }</a> </div> From d47dbf192e4f07ba143417847967889192aaab11 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 29 Sep 2016 09:18:11 +0200 Subject: [PATCH 0873/1062] styling updates, cleanups --- js/src/ui/Actionbar/actionbar.css | 2 +- js/src/ui/Container/container.css | 5 ++-- js/src/ui/Modal/modal.css | 8 ++++-- js/src/ui/Modal/modal.js | 1 + js/src/views/Accounts/List/list.css | 8 ------ js/src/views/Accounts/Summary/summary.css | 1 - js/src/views/Dapps/dapps.css | 8 ------ js/src/views/ParityBar/parityBar.css | 12 ++++++++- js/src/views/ParityBar/parityBar.js | 30 ++++++++++++----------- 9 files changed, 38 insertions(+), 37 deletions(-) delete mode 100644 js/src/views/Accounts/Summary/summary.css diff --git a/js/src/ui/Actionbar/actionbar.css b/js/src/ui/Actionbar/actionbar.css index ea5c9c66a52..73c5687f434 100644 --- a/js/src/ui/Actionbar/actionbar.css +++ b/js/src/ui/Actionbar/actionbar.css @@ -16,7 +16,7 @@ */ .actionbar { padding: 0 24px !important; - margin-bottom: 0.25em; + margin-bottom: 0; height: auto !important; background: rgba(0, 0, 0, 0.25) !important; } diff --git a/js/src/ui/Container/container.css b/js/src/ui/Container/container.css index c1a149e1257..890f9d93427 100644 --- a/js/src/ui/Container/container.css +++ b/js/src/ui/Container/container.css @@ -15,12 +15,13 @@ /* along with Parity. If not, see <http://www.gnu.org/licenses/>. */ .container { - padding: 0em 0.25em 0.25em 0.25em; + padding: 0em } .padded { padding: 1.5em; - background: rgba(0, 0, 0, 0.7) !important; + background: rgba(0, 0, 0, 0.8) !important; + border-radius: 0 !important; } .light .padded { diff --git a/js/src/ui/Modal/modal.css b/js/src/ui/Modal/modal.css index 59196661413..f1219d72f1b 100644 --- a/js/src/ui/Modal/modal.css +++ b/js/src/ui/Modal/modal.css @@ -38,12 +38,12 @@ } .content>div { - background: rgba(0, 0, 0, 0.5) !important; /* rgba(0, 0, 0, 0.7) !important; */ + background: rgba(0, 0, 0, 0.5) !important; } .title { padding: 1em; - margin-bottom: 0.25em; + margin-bottom: 0; background: rgba(0, 0, 0, 0.25) !important; } @@ -59,3 +59,7 @@ .waiting { margin: 1em -1em -1em -1em; } + +.overlay { + background: rgba(255, 255, 255, 0.5) !important; +} diff --git a/js/src/ui/Modal/modal.js b/js/src/ui/Modal/modal.js index d044dc7ae7b..56181dc43f5 100644 --- a/js/src/ui/Modal/modal.js +++ b/js/src/ui/Modal/modal.js @@ -76,6 +76,7 @@ class Modal extends Component { contentStyle={ contentStyle } modal open={ visible } + overlayClassName={ styles.overlay } repositionOnUpdate={ false } style={ DIALOG_STYLE } title={ header } diff --git a/js/src/views/Accounts/List/list.css b/js/src/views/Accounts/List/list.css index bde57bdbd3d..92f5f93d7b0 100644 --- a/js/src/views/Accounts/List/list.css +++ b/js/src/views/Accounts/List/list.css @@ -26,14 +26,6 @@ margin: 0; } -.item:nth-child(odd)>div { - padding-right: 0.125em; -} - -.item:nth-child(even)>div { - padding-left: 0.125em; -} - .empty { width: 100%; display: block; diff --git a/js/src/views/Accounts/Summary/summary.css b/js/src/views/Accounts/Summary/summary.css deleted file mode 100644 index 8b137891791..00000000000 --- a/js/src/views/Accounts/Summary/summary.css +++ /dev/null @@ -1 +0,0 @@ - diff --git a/js/src/views/Dapps/dapps.css b/js/src/views/Dapps/dapps.css index 88a6b1d23b9..ba90d1e0609 100644 --- a/js/src/views/Dapps/dapps.css +++ b/js/src/views/Dapps/dapps.css @@ -24,11 +24,3 @@ width: 50%; position: relative; } - -.contract:nth-child(odd)>div { - padding-right: 0.125em !important; -} - -.contract:nth-child(even)>div { - padding-left: 0.125em !important; -} diff --git a/js/src/views/ParityBar/parityBar.css b/js/src/views/ParityBar/parityBar.css index a2b6b2b41eb..47e9f248cc1 100644 --- a/js/src/views/ParityBar/parityBar.css +++ b/js/src/views/ParityBar/parityBar.css @@ -20,6 +20,16 @@ right: 0; font-size: 16px; font-family: 'Roboto', sans-serif; + z-index: 10001; +} + +.overlay { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: rgba(255, 255, 255, 0.5); z-index: 10000; } @@ -100,7 +110,7 @@ height: 36px; padding: 0.5em 1em; background: rgba(0, 0, 0, 0.25); - margin-bottom: 0.25em; + margin-bottom: 0; } .header:after { diff --git a/js/src/views/ParityBar/parityBar.js b/js/src/views/ParityBar/parityBar.js index 9457b6480c8..987f2ca2348 100644 --- a/js/src/views/ParityBar/parityBar.js +++ b/js/src/views/ParityBar/parityBar.js @@ -100,22 +100,24 @@ class ParityBar extends Component { renderExpanded () { return ( - <ParityBackground className={ styles.expanded }> - <div className={ styles.header }> - <div className={ styles.title }> - <ContainerTitle title='Parity Signer: Pending' /> + <div className={ styles.overlay }> + <ParityBackground className={ styles.expanded }> + <div className={ styles.header }> + <div className={ styles.title }> + <ContainerTitle title='Parity Signer: Pending' /> + </div> + <div className={ styles.actions }> + <Button + icon={ <ContentClear /> } + label='Close' + onClick={ this.toggleDisplay } /> + </div> </div> - <div className={ styles.actions }> - <Button - icon={ <ContentClear /> } - label='Close' - onClick={ this.toggleDisplay } /> + <div className={ styles.content }> + <Signer /> </div> - </div> - <div className={ styles.content }> - <Signer /> - </div> - </ParityBackground> + </ParityBackground> + </div> ); } From 4e25e32a526553f0d1155468bef74a512769c341 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 29 Sep 2016 09:22:34 +0200 Subject: [PATCH 0874/1062] alignment of styles --- js/src/views/Account/Transactions/transactions.js | 3 ++- js/src/views/Contract/contract.css | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/js/src/views/Account/Transactions/transactions.js b/js/src/views/Account/Transactions/transactions.js index 31457e0f770..1c918766044 100644 --- a/js/src/views/Account/Transactions/transactions.js +++ b/js/src/views/Account/Transactions/transactions.js @@ -20,7 +20,7 @@ import { bindActionCreators } from 'redux'; import LinearProgress from 'material-ui/LinearProgress'; import etherscan from '../../../3rdparty/etherscan'; -import { Container } from '../../../ui'; +import { Container, ContainerTitle } from '../../../ui'; import Transaction from './Transaction'; @@ -53,6 +53,7 @@ class Transactions extends Component { render () { return ( <Container> + <ContainerTitle title='transactions' /> { this.renderTransactions() } </Container> ); diff --git a/js/src/views/Contract/contract.css b/js/src/views/Contract/contract.css index e9f4fe52e18..f6aeb1461d3 100644 --- a/js/src/views/Contract/contract.css +++ b/js/src/views/Contract/contract.css @@ -33,7 +33,7 @@ } .method { - background-color: rgba(48, 48, 48, 0.5) !important; + background-color: rgba(255, 255, 255, 0.05) !important; margin: 1rem; align-items: flex-start; } From 2be63cd2fb0ac3fc2c76f0b9a2b8bec8e1616dad Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 29 Sep 2016 09:44:36 +0200 Subject: [PATCH 0875/1062] status padding --- js/src/views/Application/Status/status.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/views/Application/Status/status.css b/js/src/views/Application/Status/status.css index c46b340226e..22d119eb5f8 100644 --- a/js/src/views/Application/Status/status.css +++ b/js/src/views/Application/Status/status.css @@ -16,7 +16,7 @@ */ .status { clear: both; - padding: 0.25em 0.5em 1.5em 0.5em; + padding: 1.5em; text-align: right; color: #ddd; } From fc9bdb02743ac303b5300a3323f788bac2412230 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 29 Sep 2016 10:48:31 +0200 Subject: [PATCH 0876/1062] ParityBar has only a single instance --- .../DappContainer/dappContainer.js | 3 -- js/src/views/Application/application.css | 5 +-- js/src/views/Application/application.js | 34 ++++++++++++++----- js/src/views/ParityBar/parityBar.js | 11 ++---- 4 files changed, 31 insertions(+), 22 deletions(-) diff --git a/js/src/views/Application/DappContainer/dappContainer.js b/js/src/views/Application/DappContainer/dappContainer.js index 2d14a6e585a..c18422b1791 100644 --- a/js/src/views/Application/DappContainer/dappContainer.js +++ b/js/src/views/Application/DappContainer/dappContainer.js @@ -16,8 +16,6 @@ import React, { Component, PropTypes } from 'react'; -import ParityBar from '../../ParityBar'; - import styles from '../application.css'; export default class DappContainer extends Component { @@ -31,7 +29,6 @@ export default class DappContainer extends Component { return ( <div className={ styles.container }> { children } - <ParityBar dapp /> </div> ); } diff --git a/js/src/views/Application/application.css b/js/src/views/Application/application.css index a9f6d4f7ed5..0ce187f65ca 100644 --- a/js/src/views/Application/application.css +++ b/js/src/views/Application/application.css @@ -14,7 +14,8 @@ /* You should have received a copy of the GNU General Public License /* along with Parity. If not, see <http://www.gnu.org/licenses/>. */ + +.outer, .container { - min-height: 100%; - width: 100%; + min-height: 100vh; } diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index 2b5762d4c96..4f5473b7d86 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -26,6 +26,8 @@ import FrameError from './FrameError'; import Status from './Status'; import TabBar from './TabBar'; +import styles from './application.css'; + const inFrame = window.parent !== window && window.parent.frames.length !== 0; class Application extends Component { @@ -50,22 +52,27 @@ class Application extends Component { } render () { - const { children, pending, netChain, isTest } = this.props; - const { showFirstRun } = this.state; const [root] = (window.location.hash || '').replace('#/', '').split('/'); + const isDapp = root === 'app'; if (inFrame) { return ( <FrameError /> ); - } else if (root === 'app') { - return ( - <DappContainer> - { children } - </DappContainer> - ); } + return ( + <div className={ styles.outer }> + { isDapp ? this.renderDapp() : this.renderApp() } + <ParityBar dapp={ isDapp } /> + </div> + ); + } + + renderApp () { + const { children, pending, netChain, isTest } = this.props; + const { showFirstRun } = this.state; + return ( <Container showFirstRun={ showFirstRun } @@ -76,11 +83,20 @@ class Application extends Component { pending={ pending } /> { children } <Status /> - <ParityBar /> </Container> ); } + renderDapp () { + const { children } = this.props; + + return ( + <DappContainer> + { children } + </DappContainer> + ); + } + checkAccounts () { const { api } = this.context; diff --git a/js/src/views/ParityBar/parityBar.js b/js/src/views/ParityBar/parityBar.js index 987f2ca2348..de48b76e813 100644 --- a/js/src/views/ParityBar/parityBar.js +++ b/js/src/views/ParityBar/parityBar.js @@ -33,13 +33,10 @@ class ParityBar extends Component { } state = { - opened: false, - lastCount: -1 + opened: false } componentWillReceiveProps (nextProps) { - const { lastCount } = this.state; - const count = this.props.pending.length; const newCount = nextProps.pending.length; @@ -48,11 +45,9 @@ class ParityBar extends Component { } if (count < newCount) { - this.setState({ opened: !count || lastCount !== -1, lastCount: newCount }); + this.setState({ opened: true }); } else if (newCount === 0 && count === 1) { - this.setState({ opened: false, lastCount: newCount }); - } else { - this.setState({ lastCount: newCount }); + this.setState({ opened: false }); } } From 4bc2a61bd1f8205d2f72642ba4df8f596b38a266 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 29 Sep 2016 11:18:48 +0200 Subject: [PATCH 0877/1062] render abi types, not internal types --- js/src/abi/spec/function.js | 5 ++ .../DetailsStep/detailsStep.js | 10 ++-- js/src/views/Contract/Functions/functions.js | 56 ------------------- js/src/views/Contract/Functions/index.js | 17 ------ .../{input-queries.js => inputQueries.js} | 20 +++---- js/src/views/Contract/Queries/queries.js | 8 +-- 6 files changed, 23 insertions(+), 93 deletions(-) delete mode 100644 js/src/views/Contract/Functions/functions.js delete mode 100644 js/src/views/Contract/Functions/index.js rename js/src/views/Contract/Queries/{input-queries.js => inputQueries.js} (92%) diff --git a/js/src/abi/spec/function.js b/js/src/abi/spec/function.js index 6769d1e33a2..0c91a9b6f98 100644 --- a/js/src/abi/spec/function.js +++ b/js/src/abi/spec/function.js @@ -21,6 +21,7 @@ import { methodSignature } from '../util/signature'; export default class Func { constructor (abi) { + this._abi = abi; this._name = abi.name; this._constant = !!abi.constant; this._payable = abi.payable; @@ -32,6 +33,10 @@ export default class Func { this._signature = signature; } + get abi () { + return this._abi; + } + get constant () { return this._constant; } diff --git a/js/src/modals/ExecuteContract/DetailsStep/detailsStep.js b/js/src/modals/ExecuteContract/DetailsStep/detailsStep.js index cc2c37a59ef..b3082f5d814 100644 --- a/js/src/modals/ExecuteContract/DetailsStep/detailsStep.js +++ b/js/src/modals/ExecuteContract/DetailsStep/detailsStep.js @@ -73,13 +73,13 @@ export default class DetailsStep extends Component { .filter((func) => !func.constant) .sort((a, b) => a.name.localeCompare(b.name)) .map((func) => { - const params = func.inputs + const params = func.abi.inputs .map((input, index) => { return ( <span key={ input.name }> <span>{ index ? ', ' : '' }</span> <span className={ styles.paramname }>{ input.name }: </span> - <span>{ input.kind.type }</span> + <span>{ input.type }</span> </span> ); }); @@ -121,13 +121,13 @@ export default class DetailsStep extends Component { return null; } - return func.inputs.map((input, index) => { + return func.abi.inputs.map((input, index) => { const onChange = (event, value) => onValueChange(event, index, value); const onSubmit = (value) => onValueChange(null, index, value); - const label = `${input.name}: ${input.kind.type}`; + const label = `${input.name}: ${input.type}`; let inputbox; - switch (input.kind.type) { + switch (input.type) { case 'address': inputbox = ( <InputAddressSelect diff --git a/js/src/views/Contract/Functions/functions.js b/js/src/views/Contract/Functions/functions.js deleted file mode 100644 index 6ab3868578d..00000000000 --- a/js/src/views/Contract/Functions/functions.js +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -import React, { Component, PropTypes } from 'react'; - -import { Container, ContainerTitle } from '../../../ui'; - -import styles from '../contract.css'; - -export default class Functions extends Component { - static propTypes = { - contract: PropTypes.object - } - - render () { - const { contract } = this.props; - - if (!contract) { - return null; - } - - const functions = contract.functions - .filter((fn) => !fn.constant) - .sort(this._sortEntries).map((fn) => { - return ( - <div - key={ fn.signature } - className={ styles.method }> - { fn.name } - </div> - ); - }); - - return ( - <Container> - <ContainerTitle title='functions' /> - <div className={ styles.methods }> - { functions } - </div> - </Container> - ); - } -} diff --git a/js/src/views/Contract/Functions/index.js b/js/src/views/Contract/Functions/index.js deleted file mode 100644 index 5d5321399a9..00000000000 --- a/js/src/views/Contract/Functions/index.js +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -export default from './functions'; diff --git a/js/src/views/Contract/Queries/input-queries.js b/js/src/views/Contract/Queries/inputQueries.js similarity index 92% rename from js/src/views/Contract/Queries/input-queries.js rename to js/src/views/Contract/Queries/inputQueries.js index 1ebc3fc1871..a6269333327 100644 --- a/js/src/views/Contract/Queries/input-queries.js +++ b/js/src/views/Contract/Queries/inputQueries.js @@ -17,11 +17,11 @@ import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; import Chip from 'material-ui/Chip'; -import TextField from 'material-ui/TextField'; import LinearProgress from 'material-ui/LinearProgress'; -import FlatButton from 'material-ui/FlatButton'; import { Card, CardActions, CardTitle, CardText } from 'material-ui/Card'; +import { Button, Input } from '../../../ui'; + import styles from '../contract.css'; export default class InputQueries extends Component { @@ -77,11 +77,10 @@ export default class InputQueries extends Component { { inputsFields } </CardText> <CardActions> - <FlatButton + <Button label='Execute' disabled={ !isValid } - primary - onTouchTap={ this.onClick } /> + onClick={ this.onClick } /> </CardActions> </div>); } @@ -113,7 +112,8 @@ export default class InputQueries extends Component { } renderInput (input) { - const { name, kind } = input; + const { name, type } = input; + const label = `${name}: ${type}`; const onChange = (event) => { const value = event.target.value; @@ -129,11 +129,9 @@ export default class InputQueries extends Component { return ( <div key={ name }> - <TextField - hintText={ kind.type } - floatingLabelText={ name } - floatingLabelFixed - fullWidth + <Input + hint={ type } + label={ label } required onChange={ onChange } /> diff --git a/js/src/views/Contract/Queries/queries.js b/js/src/views/Contract/Queries/queries.js index e191df754e7..7f7e06ada90 100644 --- a/js/src/views/Contract/Queries/queries.js +++ b/js/src/views/Contract/Queries/queries.js @@ -19,7 +19,7 @@ import React, { Component, PropTypes } from 'react'; import Chip from 'material-ui/Chip'; import { Card, CardTitle, CardText } from 'material-ui/Card'; -import InputQueries from './input-queries'; +import InputQueries from './inputQueries'; import { Container, ContainerTitle } from '../../../ui'; import styles from '../contract.css'; @@ -71,15 +71,15 @@ export default class Queries extends Component { } renderInputQuery (fn) { - const { inputs, outputs, name } = fn; + const { abi, name } = fn; const { contract } = this.props; return ( <InputQueries key={ fn.signature } className={ styles.method } - inputs={ inputs } - outputs={ outputs } + inputs={ abi.inputs } + outputs={ abi.outputs } name={ name } contract={ contract } /> From 6ca471e2bf8d5ab0e884d52a0470724d67ad410e Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 29 Sep 2016 11:44:45 +0200 Subject: [PATCH 0878/1062] amount now populated --- js/src/modals/ExecuteContract/executeContract.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/js/src/modals/ExecuteContract/executeContract.js b/js/src/modals/ExecuteContract/executeContract.js index 080e841ba01..9954edc30d8 100644 --- a/js/src/modals/ExecuteContract/executeContract.js +++ b/js/src/modals/ExecuteContract/executeContract.js @@ -67,6 +67,7 @@ export default class ExecuteContract extends Component { actions={ this.renderDialogActions() } title='execute function' busy={ sending } + waiting={ [1] } visible> { this.renderStep() } </Modal> @@ -118,6 +119,7 @@ export default class ExecuteContract extends Component { <DetailsStep { ...this.props } { ...this.state } + onAmountChange={ this.onAmountChange } onFromAddressChange={ onFromAddressChange } onFuncChange={ this.onFuncChange } onValueChange={ this.onValueChange } /> @@ -137,7 +139,7 @@ export default class ExecuteContract extends Component { ); } - onAmountChange = (event, amount) => { + onAmountChange = (amount) => { this.setState({ amount }); } From ad820af8db20692e605083fd9be497afa50d4cfb Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 29 Sep 2016 11:44:56 +0200 Subject: [PATCH 0879/1062] amount now populated --- js/src/modals/ExecuteContract/DetailsStep/detailsStep.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/js/src/modals/ExecuteContract/DetailsStep/detailsStep.js b/js/src/modals/ExecuteContract/DetailsStep/detailsStep.js index b3082f5d814..226ff3a93de 100644 --- a/js/src/modals/ExecuteContract/DetailsStep/detailsStep.js +++ b/js/src/modals/ExecuteContract/DetailsStep/detailsStep.js @@ -27,9 +27,10 @@ export default class DetailsStep extends Component { contract: PropTypes.object.isRequired, amount: PropTypes.string, amountError: PropTypes.string, + onAmountChange: PropTypes.func.isRequired, fromAddress: PropTypes.string, fromAddressError: PropTypes.string, - onFromAddressChange: PropTypes.func, + onFromAddressChange: PropTypes.func.isRequired, func: PropTypes.object, funcError: PropTypes.string, onFuncChange: PropTypes.func, @@ -39,7 +40,7 @@ export default class DetailsStep extends Component { } render () { - const { accounts, amount, amountError, fromAddress, fromAddressError, onFromAddressChange } = this.props; + const { accounts, amount, amountError, fromAddress, fromAddressError, onFromAddressChange, onAmountChange } = this.props; return ( <Form> @@ -57,7 +58,7 @@ export default class DetailsStep extends Component { hint='the amount to send to with the transaction' value={ amount } error={ amountError } - onSubmit={ this.onChangeAmount } /> + onSubmit={ onAmountChange } /> </Form> ); } From 5c5b608b2f418042a991bccaed7323ec48c123a9 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 29 Sep 2016 13:10:27 +0200 Subject: [PATCH 0880/1062] render contract deployment address --- js/src/ui/IdentityIcon/identityIcon.js | 11 +++++++++- js/src/ui/MethodDecoding/methodDecoding.css | 6 ++--- .../Transactions/Transaction/transaction.js | 22 ++++++++----------- .../Account/Transactions/transactions.css | 1 + 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/js/src/ui/IdentityIcon/identityIcon.js b/js/src/ui/IdentityIcon/identityIcon.js index a92acce843c..292e99b9a8d 100644 --- a/js/src/ui/IdentityIcon/identityIcon.js +++ b/js/src/ui/IdentityIcon/identityIcon.js @@ -15,6 +15,7 @@ // along with Parity. If not, see <http://www.gnu.org/licenses/>. import React, { Component, PropTypes } from 'react'; +import ContractIcon from 'material-ui/svg-icons/action/code'; import styles from './identityIcon.css'; @@ -82,7 +83,7 @@ export default class IdentityIcon extends Component { } render () { - const { button, className, center, inline, padded, tiny } = this.props; + const { address, button, className, center, inline, padded, tiny } = this.props; const { iconsrc } = this.state; const classes = [ styles.icon, @@ -103,6 +104,14 @@ export default class IdentityIcon extends Component { size = '32px'; } + if (!address) { + return ( + <ContractIcon + className={ classes } + style={ { width: size, height: size, background: '#eee' } } /> + ); + } + return ( <img className={ classes } diff --git a/js/src/ui/MethodDecoding/methodDecoding.css b/js/src/ui/MethodDecoding/methodDecoding.css index 6c6fd0ec849..175ed965e02 100644 --- a/js/src/ui/MethodDecoding/methodDecoding.css +++ b/js/src/ui/MethodDecoding/methodDecoding.css @@ -27,7 +27,7 @@ padding-top: 1em; font-size: 0.75em; line-height: 2em; - opacity: 0.75; + opacity: 0.5; } .description { @@ -37,10 +37,8 @@ .name, .highlight { - background: rgba(255, 255, 255, 0.1); color: white; - border-radius: 4px; - padding: 0.25em 0.4em; + padding: 0.25em; } .name, diff --git a/js/src/views/Account/Transactions/Transaction/transaction.js b/js/src/views/Account/Transactions/Transaction/transaction.js index e5b465a628a..9fcd5744ebb 100644 --- a/js/src/views/Account/Transactions/Transaction/transaction.js +++ b/js/src/views/Account/Transactions/Transaction/transaction.js @@ -113,17 +113,18 @@ export default class Transaction extends Component { renderAddress (prefix, address) { const { accounts, contacts, contracts, tokens } = this.props; - if (!address && !address.length) { - return ( - <td className={ styles.left } /> - ); - } - - const link = `${prefix}address/${address}`; const account = (accounts || {})[address] || (contacts || {})[address] || (tokens || {})[address] || (contracts || {})[address]; const name = account ? account.name.toUpperCase() : this.formatHash(address); + const eslink = address ? ( + <a + href={ `${prefix}address/${address}` } + target='_blank' + className={ styles.link }> + { name } + </a> + ) : 'DEPLOY'; return ( <td className={ styles.address }> @@ -135,12 +136,7 @@ export default class Transaction extends Component { address={ address } /> </div> <div className={ styles.center }> - <a - href={ link } - target='_blank' - className={ styles.link }> - { name } - </a> + { eslink } </div> </td> ); diff --git a/js/src/views/Account/Transactions/transactions.css b/js/src/views/Account/Transactions/transactions.css index a4feb47c9f7..62411d8f2cf 100644 --- a/js/src/views/Account/Transactions/transactions.css +++ b/js/src/views/Account/Transactions/transactions.css @@ -97,4 +97,5 @@ padding-top: 1.5em; text-align: right; line-height: 1.5em; + opacity: 0.5; } From b5e14cb35d915aea6345283d5632c9452ce20010 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 29 Sep 2016 13:41:16 +0200 Subject: [PATCH 0881/1062] manage firstRun better --- js/src/views/Application/application.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index 4f5473b7d86..9f637c058cb 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -29,6 +29,7 @@ import TabBar from './TabBar'; import styles from './application.css'; const inFrame = window.parent !== window && window.parent.frames.length !== 0; +const showFirstRun = window.localStorage.getItem('showFirstRun') === '1'; class Application extends Component { static contextTypes = { @@ -104,7 +105,7 @@ class Application extends Component { .listAccounts() .then((accounts) => { this.setState({ - showFirst: accounts.length === 0 + showFirstRun: showFirstRun || accounts.length === 0 }); }) .catch((error) => { @@ -113,6 +114,7 @@ class Application extends Component { } onCloseFirstRun = () => { + window.localStorage.setItem('showFirstRun', '0'); this.setState({ showFirstRun: false }); From ce4a2343ff3710a7e165d3fd70ee22e69eddc4ca Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Thu, 29 Sep 2016 14:20:39 +0200 Subject: [PATCH 0882/1062] small styling updates... --- js/src/ui/Page/page.css | 4 ++++ js/src/views/Accounts/List/list.css | 11 ++++++++++- js/src/views/Dapps/dapps.css | 14 ++++++++++++-- js/src/views/Dapps/dapps.js | 4 ++-- js/src/views/ParityBar/parityBar.css | 2 +- 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/js/src/ui/Page/page.css b/js/src/ui/Page/page.css index 366add13ba3..e4fac198a18 100644 --- a/js/src/ui/Page/page.css +++ b/js/src/ui/Page/page.css @@ -17,3 +17,7 @@ .layout { padding: 0; } + +.layout>div { + padding-bottom: 0.25em; +} diff --git a/js/src/views/Accounts/List/list.css b/js/src/views/Accounts/List/list.css index 92f5f93d7b0..6c23d32e1b3 100644 --- a/js/src/views/Accounts/List/list.css +++ b/js/src/views/Accounts/List/list.css @@ -23,7 +23,16 @@ flex: 0 1 50%; width: 50%; position: relative; - margin: 0; + padding-bottom: 0.25em; + box-sizing: border-box; +} + +.item:nth-child(odd) { + padding-right: 0.125em; +} + +.item:nth-child(even) { + padding-left: 0.125em; } .empty { diff --git a/js/src/views/Dapps/dapps.css b/js/src/views/Dapps/dapps.css index ba90d1e0609..769d9ac4a0e 100644 --- a/js/src/views/Dapps/dapps.css +++ b/js/src/views/Dapps/dapps.css @@ -14,13 +14,23 @@ /* You should have received a copy of the GNU General Public License /* along with Parity. If not, see <http://www.gnu.org/licenses/>. */ -.contracts { +.list { display: flex; flex-wrap: wrap; } -.contract { +.item { flex: 0 1 50%; width: 50%; position: relative; + box-sizing: border-box; + padding-bottom: 0.25em; +} + +.item:nth-child(odd) { + padding-right: 0.125em; +} + +.item:nth-child(even) { + padding-left: 0.125em; } diff --git a/js/src/views/Dapps/dapps.js b/js/src/views/Dapps/dapps.js index 47460f3c791..64a3a4f7fab 100644 --- a/js/src/views/Dapps/dapps.js +++ b/js/src/views/Dapps/dapps.js @@ -68,7 +68,7 @@ class Dapps extends Component { <Actionbar title='Decentralized Applications' /> <Page> - <div className={ styles.contracts }> + <div className={ styles.list }> { this.renderApps() } </div> </Page> @@ -83,7 +83,7 @@ class Dapps extends Component { return apps.map((app, idx) => { return ( <div - className={ styles.contract } + className={ styles.item } key={ app.address }> <Summary app={ app } diff --git a/js/src/views/ParityBar/parityBar.css b/js/src/views/ParityBar/parityBar.css index 47e9f248cc1..0c6de9f5d1a 100644 --- a/js/src/views/ParityBar/parityBar.css +++ b/js/src/views/ParityBar/parityBar.css @@ -43,7 +43,7 @@ .expanded { right: 16px; width: 964px; - height: 300px; + height: 288px; border-radius: 4px 4px 0 0; overflow-y: auto; display: flex; From 5f138209cf0cca94dac0ff2aecce2e7f2dc010f1 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Fri, 30 Sep 2016 12:18:05 +0200 Subject: [PATCH 0883/1062] move abis from js/json to contracts/abi --- js/src/{json => contracts/abi}/eip20.json | 0 js/src/{json => contracts/abi}/gavcoin.json | 0 js/src/{json => contracts/abi}/githubhint.json | 0 js/src/{json => contracts/abi}/index.js | 0 js/src/{json => contracts/abi}/owned.json | 0 js/src/{json => contracts/abi}/registry.json | 0 js/src/{json => contracts/abi}/signaturereg.json | 0 js/src/{json => contracts/abi}/tokenreg.json | 0 js/src/contracts/registry.js | 2 +- js/src/contracts/tokenreg.js | 1 - js/src/dapps/gavcoin/Application/application.js | 2 +- js/src/dapps/registry/actions.js | 2 +- js/src/dapps/signaturereg/services.js | 2 +- js/src/dapps/tokenreg/Status/actions.js | 2 +- js/src/redux/providers/balances.js | 2 +- 15 files changed, 6 insertions(+), 7 deletions(-) rename js/src/{json => contracts/abi}/eip20.json (100%) rename js/src/{json => contracts/abi}/gavcoin.json (100%) rename js/src/{json => contracts/abi}/githubhint.json (100%) rename js/src/{json => contracts/abi}/index.js (100%) rename js/src/{json => contracts/abi}/owned.json (100%) rename js/src/{json => contracts/abi}/registry.json (100%) rename js/src/{json => contracts/abi}/signaturereg.json (100%) rename js/src/{json => contracts/abi}/tokenreg.json (100%) diff --git a/js/src/json/eip20.json b/js/src/contracts/abi/eip20.json similarity index 100% rename from js/src/json/eip20.json rename to js/src/contracts/abi/eip20.json diff --git a/js/src/json/gavcoin.json b/js/src/contracts/abi/gavcoin.json similarity index 100% rename from js/src/json/gavcoin.json rename to js/src/contracts/abi/gavcoin.json diff --git a/js/src/json/githubhint.json b/js/src/contracts/abi/githubhint.json similarity index 100% rename from js/src/json/githubhint.json rename to js/src/contracts/abi/githubhint.json diff --git a/js/src/json/index.js b/js/src/contracts/abi/index.js similarity index 100% rename from js/src/json/index.js rename to js/src/contracts/abi/index.js diff --git a/js/src/json/owned.json b/js/src/contracts/abi/owned.json similarity index 100% rename from js/src/json/owned.json rename to js/src/contracts/abi/owned.json diff --git a/js/src/json/registry.json b/js/src/contracts/abi/registry.json similarity index 100% rename from js/src/json/registry.json rename to js/src/contracts/abi/registry.json diff --git a/js/src/json/signaturereg.json b/js/src/contracts/abi/signaturereg.json similarity index 100% rename from js/src/json/signaturereg.json rename to js/src/contracts/abi/signaturereg.json diff --git a/js/src/json/tokenreg.json b/js/src/contracts/abi/tokenreg.json similarity index 100% rename from js/src/json/tokenreg.json rename to js/src/contracts/abi/tokenreg.json diff --git a/js/src/contracts/registry.js b/js/src/contracts/registry.js index 62cecea7fa8..c6fb20d553b 100644 --- a/js/src/contracts/registry.js +++ b/js/src/contracts/registry.js @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see <http://www.gnu.org/licenses/>. -import * as abis from '../json'; +import * as abis from './abi'; export default class Registry { constructor (api) { diff --git a/js/src/contracts/tokenreg.js b/js/src/contracts/tokenreg.js index 2dcf119a971..78bd5e4d913 100644 --- a/js/src/contracts/tokenreg.js +++ b/js/src/contracts/tokenreg.js @@ -18,7 +18,6 @@ export default class TokenReg { constructor (api, registry) { this._api = api; this._registry = registry; - this._instance = null; this.getInstance(); } diff --git a/js/src/dapps/gavcoin/Application/application.js b/js/src/dapps/gavcoin/Application/application.js index 0f254255e85..7b774f34e8f 100644 --- a/js/src/dapps/gavcoin/Application/application.js +++ b/js/src/dapps/gavcoin/Application/application.js @@ -24,7 +24,7 @@ const muiTheme = getMuiTheme(lightBaseTheme); import { api } from '../parity'; -import * as abis from '../../../json'; +import * as abis from '../../../contracts/abi'; import Accounts from '../Accounts'; import Actions, { ActionBuyIn, ActionRefund, ActionTransfer } from '../Actions'; diff --git a/js/src/dapps/registry/actions.js b/js/src/dapps/registry/actions.js index d3b4f5858fc..90b261045bb 100644 --- a/js/src/dapps/registry/actions.js +++ b/js/src/dapps/registry/actions.js @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see <http://www.gnu.org/licenses/>. -import { registry as registryAbi } from '../../json'; +import { registry as registryAbi } from '../../contracts/abi'; import { newContract, ethcore } from './parity.js'; import * as addresses from './addresses/actions.js'; diff --git a/js/src/dapps/signaturereg/services.js b/js/src/dapps/signaturereg/services.js index 9af6bafc031..e46ac15ad3e 100644 --- a/js/src/dapps/signaturereg/services.js +++ b/js/src/dapps/signaturereg/services.js @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see <http://www.gnu.org/licenses/>. -import * as abis from '../../json'; +import * as abis from '../../contracts/api'; import { api } from './parity'; const sortEvents = (a, b) => b.blockNumber.cmp(a.blockNumber) || b.logIndex.cmp(a.logIndex); diff --git a/js/src/dapps/tokenreg/Status/actions.js b/js/src/dapps/tokenreg/Status/actions.js index 302da8120a0..a479179b223 100644 --- a/js/src/dapps/tokenreg/Status/actions.js +++ b/js/src/dapps/tokenreg/Status/actions.js @@ -18,7 +18,7 @@ import { registry as registryAbi, tokenreg as tokenregAbi, githubhint as githubhintAbi -} from '../../../json'; +} from '../../../contracts/abi'; import { loadToken, setTokenPending, deleteToken, setTokenData } from '../Tokens/actions'; diff --git a/js/src/redux/providers/balances.js b/js/src/redux/providers/balances.js index a3a16c7a9e3..d262a3f19c7 100644 --- a/js/src/redux/providers/balances.js +++ b/js/src/redux/providers/balances.js @@ -16,7 +16,7 @@ import { getBalances, getTokens } from './balancesActions'; -import * as abis from '../../json'; +import * as abis from '../../contracts/abi'; import imagesEthereum from '../../images/contracts/ethereum-56.png'; import imagesGavcoin from '../../images/contracts/gavcoin-56.png'; From aa99eea01a32b269a16e8760abe8079c58f9cd31 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Fri, 30 Sep 2016 12:28:53 +0200 Subject: [PATCH 0884/1062] typo --- js/src/dapps/signaturereg/services.js | 2 +- js/src/dapps/tokenreg/utils.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/dapps/signaturereg/services.js b/js/src/dapps/signaturereg/services.js index e46ac15ad3e..7cadc290002 100644 --- a/js/src/dapps/signaturereg/services.js +++ b/js/src/dapps/signaturereg/services.js @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see <http://www.gnu.org/licenses/>. -import * as abis from '../../contracts/api'; +import * as abis from '../../contracts/abi'; import { api } from './parity'; const sortEvents = (a, b) => b.blockNumber.cmp(a.blockNumber) || b.logIndex.cmp(a.logIndex); diff --git a/js/src/dapps/tokenreg/utils.js b/js/src/dapps/tokenreg/utils.js index 1e3fca5739d..0f4e192f085 100644 --- a/js/src/dapps/tokenreg/utils.js +++ b/js/src/dapps/tokenreg/utils.js @@ -16,7 +16,7 @@ import { api } from './parity'; -import { eip20 as eip20Abi } from '../../json/'; +import { eip20 as eip20Abi } from '../../contracts/abi'; export const getTokenTotalSupply = (tokenAddress) => { return api From a3b6cc666b2b03dba119d37ed911267e988536ab Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Fri, 30 Sep 2016 15:16:36 +0200 Subject: [PATCH 0885/1062] basic token deployment structure in-place --- js/src/dapps/tokendeploy.html | 18 ++ js/src/dapps/tokendeploy.js | 49 +++++ .../tokendeploy/Application/application.js | 54 ++++++ js/src/dapps/tokendeploy/Application/index.js | 17 ++ js/src/dapps/tokendeploy/Deploy/deploy.js | 29 +++ js/src/dapps/tokendeploy/Deploy/index.js | 17 ++ js/src/dapps/tokendeploy/Events/events.js | 29 +++ js/src/dapps/tokendeploy/Events/index.js | 17 ++ js/src/dapps/tokendeploy/Header/header.css | 76 ++++++++ js/src/dapps/tokendeploy/Header/header.js | 85 +++++++++ js/src/dapps/tokendeploy/Header/index.js | 17 ++ js/src/dapps/tokendeploy/Loading/index.js | 17 ++ js/src/dapps/tokendeploy/Loading/loading.js | 29 +++ js/src/dapps/tokendeploy/Overview/index.js | 17 ++ js/src/dapps/tokendeploy/Overview/overview.js | 29 +++ js/src/dapps/tokendeploy/Send/index.js | 17 ++ js/src/dapps/tokendeploy/Send/send.js | 29 +++ js/src/dapps/tokendeploy/Status/index.js | 17 ++ js/src/dapps/tokendeploy/Status/status.js | 29 +++ js/src/dapps/tokendeploy/parity.js | 21 +++ js/src/dapps/tokendeploy/services.js | 173 ++++++++++++++++++ js/src/dapps/tokendeploy/style.css | 39 ++++ js/src/views/Dapps/dapps.js | 11 +- js/webpack.config.js | 1 + 24 files changed, 832 insertions(+), 5 deletions(-) create mode 100644 js/src/dapps/tokendeploy.html create mode 100644 js/src/dapps/tokendeploy.js create mode 100644 js/src/dapps/tokendeploy/Application/application.js create mode 100644 js/src/dapps/tokendeploy/Application/index.js create mode 100644 js/src/dapps/tokendeploy/Deploy/deploy.js create mode 100644 js/src/dapps/tokendeploy/Deploy/index.js create mode 100644 js/src/dapps/tokendeploy/Events/events.js create mode 100644 js/src/dapps/tokendeploy/Events/index.js create mode 100644 js/src/dapps/tokendeploy/Header/header.css create mode 100644 js/src/dapps/tokendeploy/Header/header.js create mode 100644 js/src/dapps/tokendeploy/Header/index.js create mode 100644 js/src/dapps/tokendeploy/Loading/index.js create mode 100644 js/src/dapps/tokendeploy/Loading/loading.js create mode 100644 js/src/dapps/tokendeploy/Overview/index.js create mode 100644 js/src/dapps/tokendeploy/Overview/overview.js create mode 100644 js/src/dapps/tokendeploy/Send/index.js create mode 100644 js/src/dapps/tokendeploy/Send/send.js create mode 100644 js/src/dapps/tokendeploy/Status/index.js create mode 100644 js/src/dapps/tokendeploy/Status/status.js create mode 100644 js/src/dapps/tokendeploy/parity.js create mode 100644 js/src/dapps/tokendeploy/services.js create mode 100644 js/src/dapps/tokendeploy/style.css diff --git a/js/src/dapps/tokendeploy.html b/js/src/dapps/tokendeploy.html new file mode 100644 index 00000000000..d8103375d0b --- /dev/null +++ b/js/src/dapps/tokendeploy.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>Basic Token Deployment + + + + +
      + + + + + + diff --git a/js/src/dapps/tokendeploy.js b/js/src/dapps/tokendeploy.js new file mode 100644 index 00000000000..1dfe60e3427 --- /dev/null +++ b/js/src/dapps/tokendeploy.js @@ -0,0 +1,49 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import ReactDOM from 'react-dom'; +import React from 'react'; +import { createHashHistory } from 'history'; +import { Redirect, Router, Route, useRouterHistory } from 'react-router'; + +import injectTapEventPlugin from 'react-tap-event-plugin'; +injectTapEventPlugin(); + +import Deploy from './tokendeploy/Deploy'; +import Events from './tokendeploy/Events'; +import Application from './tokendeploy/Application'; +import Overview from './tokendeploy/Overview'; +import Send from './tokendeploy/Send'; +import Status from './tokendeploy/Status'; + +const routerHistory = useRouterHistory(createHashHistory)({}); + +import './style.css'; +import './tokendeploy.html'; + +ReactDOM.render( + + + + + + + + + + , + document.querySelector('#container') +); diff --git a/js/src/dapps/tokendeploy/Application/application.js b/js/src/dapps/tokendeploy/Application/application.js new file mode 100644 index 00000000000..81d3c9b7b22 --- /dev/null +++ b/js/src/dapps/tokendeploy/Application/application.js @@ -0,0 +1,54 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import Header from '../Header'; +import Loading from '../Loading'; + +import styles from '../style.css'; + +export default class Application extends Component { + static propTypes = { + children: PropTypes.node.isRequired + } + + state = { + loading: true + } + + componentDidMount () { + this.setState({ loading: false }); + } + + render () { + const { children } = this.props; + const { loading } = this.state; + + if (loading) { + return ( + + ); + } + + return ( +
      +
      + { children } +
      + ); + } +} diff --git a/js/src/dapps/tokendeploy/Application/index.js b/js/src/dapps/tokendeploy/Application/index.js new file mode 100644 index 00000000000..236578226a8 --- /dev/null +++ b/js/src/dapps/tokendeploy/Application/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './application'; diff --git a/js/src/dapps/tokendeploy/Deploy/deploy.js b/js/src/dapps/tokendeploy/Deploy/deploy.js new file mode 100644 index 00000000000..7f6a3ef7bed --- /dev/null +++ b/js/src/dapps/tokendeploy/Deploy/deploy.js @@ -0,0 +1,29 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component } from 'react'; + +import styles from '../style.css'; + +export default class Deploy extends Component { + render () { + return ( +
      +
      Deploy
      +
      + ); + } +} diff --git a/js/src/dapps/tokendeploy/Deploy/index.js b/js/src/dapps/tokendeploy/Deploy/index.js new file mode 100644 index 00000000000..53b4dbcfe55 --- /dev/null +++ b/js/src/dapps/tokendeploy/Deploy/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './deploy'; diff --git a/js/src/dapps/tokendeploy/Events/events.js b/js/src/dapps/tokendeploy/Events/events.js new file mode 100644 index 00000000000..176a8ab693d --- /dev/null +++ b/js/src/dapps/tokendeploy/Events/events.js @@ -0,0 +1,29 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component } from 'react'; + +import styles from '../style.css'; + +export default class Events extends Component { + render () { + return ( +
      +
      Events
      +
      + ); + } +} diff --git a/js/src/dapps/tokendeploy/Events/index.js b/js/src/dapps/tokendeploy/Events/index.js new file mode 100644 index 00000000000..88ad6d407c9 --- /dev/null +++ b/js/src/dapps/tokendeploy/Events/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './events'; diff --git a/js/src/dapps/tokendeploy/Header/header.css b/js/src/dapps/tokendeploy/Header/header.css new file mode 100644 index 00000000000..30dedd2be3f --- /dev/null +++ b/js/src/dapps/tokendeploy/Header/header.css @@ -0,0 +1,76 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.header { + table-layout: fixed; + width: 100%; + border-spacing: 0.15em; + border-collapse: separate; + border-color: white; +} + +tr { + height: 10em; +} + +.title { + font-size: 1.25em; + margin-bottom: 0.25em; +} + +.byline { + font-size: 1em; + opacity: 0.7; +} + +.nav { + cursor: pointer; + color: white; + padding: 2em; + vertical-align: middle; +} + +.nav:hover { + opacity: 0.85; +} + +.navCurrent { + font-size: 2em; +} + +.navNext { +} + +.overview { + background: green; +} + +.send { + background: red; +} + +.events { + background: blue; +} + +.deploy { + background: purple; +} + +.status { + background: orange; +} diff --git a/js/src/dapps/tokendeploy/Header/header.js b/js/src/dapps/tokendeploy/Header/header.js new file mode 100644 index 00000000000..18959a4f908 --- /dev/null +++ b/js/src/dapps/tokendeploy/Header/header.js @@ -0,0 +1,85 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import layout from '../style.css'; +import styles from './header.css'; + +const HEADERS = [ + { path: 'overview', className: styles.overview, title: 'Overview', byline: 'Displays all the current information relating to your own deployed tokens' }, + { path: 'send', className: styles.send, title: 'Send', byline: 'Send token associated with your accounts to other addresses' }, + { path: 'events', className: styles.events, title: 'Events', byline: 'Track the events for your tokens, showing actions as they hapenned' }, + { path: 'deploy', className: styles.deploy, title: 'Deploy', byline: 'Deploy a new token to the network' }, + { path: 'status', className: styles.status, title: 'Status', byline: 'Show the status of all network tokens deployed with this application' } +]; + +export default class Header extends Component { + static contextTypes = { + router: PropTypes.object.isRequired + } + + render () { + const path = (window.location.hash || '').split('?')[0].split('/')[1]; + const offset = HEADERS.findIndex((header) => header.path === path); + + return ( + + + + { this.renderHeader(0, offset) } + { this.renderHeader(1, offset) } + { this.renderHeader(2, offset) } + + + { this.renderHeader(3, offset) } + { this.renderHeader(4, offset) } + + +
      + ); + } + + renderHeader (index, offset) { + const isFirst = index === 0; + const position = index + offset; + const header = HEADERS[position < HEADERS.length ? position : position - HEADERS.length]; + const classes = `${styles.nav} ${isFirst ? styles.navCurrent : styles.navNext} ${header.className}`; + + return ( + +
      + { header.title } +
      +
      + { header.byline } +
      + + ); + } + + onNavigate = (route) => { + const { router } = this.context; + + return (event) => { + router.push(`/${route}`); + }; + } +} diff --git a/js/src/dapps/tokendeploy/Header/index.js b/js/src/dapps/tokendeploy/Header/index.js new file mode 100644 index 00000000000..4a51219067e --- /dev/null +++ b/js/src/dapps/tokendeploy/Header/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './header'; diff --git a/js/src/dapps/tokendeploy/Loading/index.js b/js/src/dapps/tokendeploy/Loading/index.js new file mode 100644 index 00000000000..0468cab37df --- /dev/null +++ b/js/src/dapps/tokendeploy/Loading/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './loading'; diff --git a/js/src/dapps/tokendeploy/Loading/loading.js b/js/src/dapps/tokendeploy/Loading/loading.js new file mode 100644 index 00000000000..560972e8571 --- /dev/null +++ b/js/src/dapps/tokendeploy/Loading/loading.js @@ -0,0 +1,29 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component } from 'react'; + +import styles from '../style.css'; + +export default class Loading extends Component { + render () { + return ( +
      + Attaching to contract ... +
      + ); + } +} diff --git a/js/src/dapps/tokendeploy/Overview/index.js b/js/src/dapps/tokendeploy/Overview/index.js new file mode 100644 index 00000000000..d61fb3fb440 --- /dev/null +++ b/js/src/dapps/tokendeploy/Overview/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './overview'; diff --git a/js/src/dapps/tokendeploy/Overview/overview.js b/js/src/dapps/tokendeploy/Overview/overview.js new file mode 100644 index 00000000000..2fa863c6dae --- /dev/null +++ b/js/src/dapps/tokendeploy/Overview/overview.js @@ -0,0 +1,29 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component } from 'react'; + +import styles from '../style.css'; + +export default class Overview extends Component { + render () { + return ( +
      +
      Overview
      +
      + ); + } +} diff --git a/js/src/dapps/tokendeploy/Send/index.js b/js/src/dapps/tokendeploy/Send/index.js new file mode 100644 index 00000000000..ad3107789e7 --- /dev/null +++ b/js/src/dapps/tokendeploy/Send/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './send'; diff --git a/js/src/dapps/tokendeploy/Send/send.js b/js/src/dapps/tokendeploy/Send/send.js new file mode 100644 index 00000000000..d913fbe0a91 --- /dev/null +++ b/js/src/dapps/tokendeploy/Send/send.js @@ -0,0 +1,29 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component } from 'react'; + +import styles from '../style.css'; + +export default class Send extends Component { + render () { + return ( +
      +
      Send
      +
      + ); + } +} diff --git a/js/src/dapps/tokendeploy/Status/index.js b/js/src/dapps/tokendeploy/Status/index.js new file mode 100644 index 00000000000..44079b22485 --- /dev/null +++ b/js/src/dapps/tokendeploy/Status/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './status'; diff --git a/js/src/dapps/tokendeploy/Status/status.js b/js/src/dapps/tokendeploy/Status/status.js new file mode 100644 index 00000000000..9c7121c72c2 --- /dev/null +++ b/js/src/dapps/tokendeploy/Status/status.js @@ -0,0 +1,29 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component } from 'react'; + +import styles from '../style.css'; + +export default class Deploy extends Component { + render () { + return ( +
      +
      Status
      +
      + ); + } +} diff --git a/js/src/dapps/tokendeploy/parity.js b/js/src/dapps/tokendeploy/parity.js new file mode 100644 index 00000000000..f6d59f44d57 --- /dev/null +++ b/js/src/dapps/tokendeploy/parity.js @@ -0,0 +1,21 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const { api } = window.parity; + +export { + api +}; diff --git a/js/src/dapps/tokendeploy/services.js b/js/src/dapps/tokendeploy/services.js new file mode 100644 index 00000000000..2ad03264c3b --- /dev/null +++ b/js/src/dapps/tokendeploy/services.js @@ -0,0 +1,173 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import * as abis from '../../contracts/abi'; +import { api } from './parity'; + +const sortEvents = (a, b) => b.blockNumber.cmp(a.blockNumber) || b.logIndex.cmp(a.logIndex); + +const logToEvent = (log) => { + const key = api.util.sha3(JSON.stringify(log)); + const { blockNumber, logIndex, transactionHash, transactionIndex, params, type } = log; + + return { + type: log.event, + state: type, + blockNumber, + logIndex, + transactionHash, + transactionIndex, + params, + key + }; +}; + +export function attachInterface (callback) { + return api.ethcore + .registryAddress() + .then((registryAddress) => { + console.log(`the registry was found at ${registryAddress}`); + + const registry = api.newContract(abis.registry, registryAddress).instance; + + return Promise + .all([ + registry.getAddress.call({}, [api.util.sha3('tokendeploy'), 'A']), + api.personal.listAccounts(), + api.personal.accountsInfo() + ]); + }) + .then(([address, addresses, accountsInfo]) => { + console.log(`tokendeploy was found at ${address}`); + address = '0x15fF40Ceb6092b8EBeD4046E2d4c54e5e4cae458'; + + const contract = api.newContract(abis.signaturereg, address); + const accounts = addresses.reduce((obj, address) => { + const info = accountsInfo[address]; + + return Object.assign(obj, { + [address]: { + address, + name: info.name || 'Unnamed', + uuid: info.uuid + } + }); + }, {}); + const fromAddress = Object.keys(accounts)[0]; + + return { + accounts, + address, + accountsInfo, + contract, + instance: contract.instance, + fromAddress + }; + }) + .catch((error) => { + console.error('attachInterface', error); + }); +} + +export function attachBlockNumber (instance, callback) { + return api.subscribe('eth_blockNumber', (error, blockNumber) => { + if (error) { + console.error('blockNumber', error); + return; + } + + instance.totalSignatures + .call() + .then((totalSignatures) => { + callback({ + blockNumber, + totalSignatures + }); + }) + .catch((error) => { + console.error('totalSignatures', error); + }); + }); +} + +export function attachEvents (contract, callback) { + const blocks = { '0': {} }; + let mined = []; + let pending = []; + let events = []; + + const options = { + fromBlock: 0, + toBlock: 'pending', + limit: 50 + }; + + return contract.subscribe('Registered', options, (error, _logs) => { + if (error) { + console.error('events', error); + return; + } + + const logs = _logs.map(logToEvent); + + mined = logs + .filter((log) => log.state === 'mined') + .map((log) => { + const blockNumber = log.blockNumber.toString(); + + if (!blocks[blockNumber]) { + blocks[blockNumber] = {}; + getBlock(blockNumber).then((block) => { + Object.assign(blocks[blockNumber], block); + }); + } + + return Object.assign(log, { block: blocks[blockNumber] }); + }) + .reverse() + .concat(mined) + .sort(sortEvents); + + pending = logs + .filter((log) => log.state === 'pending') + .reverse() + .filter((event) => !pending.find((log) => log.params.method === event.params.method)) + .concat(pending) + .filter((event) => !mined.find((log) => log.params.method === event.params.method)) + .sort(sortEvents); + + events = pending.concat(mined); + + callback({ events }); + }); +} + +export function getBlock (blockNumber) { + return api.eth.getBlockByNumber(blockNumber); +} + +export function callRegister (instance, id, options = {}) { + return instance.register.call(options, [id]); +} + +export function postRegister (instance, id, options = {}) { + return instance.register + .estimateGas(options, [id]) + .then((gas) => { + options.gas = gas.mul(1.2).toFixed(0); + instance.register.postTransaction(options, [id]); + }); +} diff --git a/js/src/dapps/tokendeploy/style.css b/js/src/dapps/tokendeploy/style.css new file mode 100644 index 00000000000..c80e3ad8560 --- /dev/null +++ b/js/src/dapps/tokendeploy/style.css @@ -0,0 +1,39 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.body { + padding: 2em; +} + +.container { + color: #333; + font-family: 'Roboto'; + vertical-align: middle; +} + +.loading { + width: 100%; + text-align: center; + padding-top: 5em; + font-size: 2em; + color: #999; +} + +.title { + font-size: 1.25em; + margin-bottom: 0.25em; +} diff --git a/js/src/views/Dapps/dapps.js b/js/src/views/Dapps/dapps.js index 64a3a4f7fab..2cd4fa4e7d8 100644 --- a/js/src/views/Dapps/dapps.js +++ b/js/src/views/Dapps/dapps.js @@ -35,27 +35,28 @@ class Dapps extends Component { state = { apps: [ + { + name: 'Token Deployment', + description: 'Deploy new basic tokens that you are able to send around', + url: 'tokendeploy' + }, { name: 'GAVcoin', - address: '0x6C5b287A875298f773225e72ce3fA8B2782e0347', description: 'Manage your GAVcoins, the hottest new property in crypto', url: 'gavcoin' }, { name: 'Registry', - address: '0x8E4e9B13D4b45Cb0befC93c3061b1408f67316B2', description: 'A global registry of addresses on the network', url: 'registry' }, { name: 'Token Registry', - address: '0x1AE76cf6Ee3955F773C429801a203f08c84B7cc5', description: 'A registry of transactable tokens on the network', url: 'tokenreg' }, { name: 'Method Registry', - address: '0x2b7E4db4AD1B3D550Ac6111C122EE9cf65c14AcB', description: 'A registry of method signatures for lookups on transactions', url: 'signaturereg' } @@ -84,7 +85,7 @@ class Dapps extends Component { return (
      + key={ app.url }> diff --git a/js/webpack.config.js b/js/webpack.config.js index 4ce234b4855..103ca5c5039 100644 --- a/js/webpack.config.js +++ b/js/webpack.config.js @@ -34,6 +34,7 @@ module.exports = { 'gavcoin': ['./dapps/gavcoin.js'], 'registry': ['./dapps/registry.js'], 'signaturereg': ['./dapps/signaturereg.js'], + 'tokendeploy': ['./dapps/tokendeploy.js'], 'tokenreg': ['./dapps/tokenreg.js'], // library 'parity': ['./parity.js'], From 1773da7c245acccdaac3c977204a90db228d1beb Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 30 Sep 2016 17:44:27 +0200 Subject: [PATCH 0886/1062] movement --- .../{tokendeploy.html => basiccoin.html} | 2 +- js/src/dapps/{tokendeploy.js => basiccoin.js} | 14 +-- .../Application}/Header/header.css | 37 +++----- .../basiccoin/Application/Header/header.js | 80 +++++++++++++++++ .../Application}/Header/index.js | 0 .../Application}/Loading/index.js | 0 .../basiccoin/Application/Loading/loading.css | 24 ++++++ .../Application}/Loading/loading.js | 4 +- .../basiccoin/Application/application.css | 30 +++++++ .../Application/application.js | 16 ++-- .../Application/index.js | 0 js/src/dapps/basiccoin/Application/pages.js | 50 +++++++++++ .../Deploy/deploy.js | 0 .../Deploy/index.js | 0 .../Events/events.js | 0 .../Events/index.js | 0 .../Overview/index.js | 0 .../Overview/overview.js | 0 .../{tokendeploy => basiccoin}/Send/index.js | 0 .../{tokendeploy => basiccoin}/Send/send.js | 0 .../Status/index.js | 0 .../Status/status.js | 0 .../{tokendeploy => basiccoin}/parity.js | 0 .../{tokendeploy => basiccoin}/services.js | 0 .../{tokendeploy => basiccoin}/style.css | 18 ---- js/src/dapps/tokendeploy/Header/header.js | 85 ------------------- js/src/views/Dapps/dapps.js | 2 +- js/webpack.config.js | 2 +- 28 files changed, 220 insertions(+), 144 deletions(-) rename js/src/dapps/{tokendeploy.html => basiccoin.html} (92%) rename js/src/dapps/{tokendeploy.js => basiccoin.js} (83%) rename js/src/dapps/{tokendeploy => basiccoin/Application}/Header/header.css (83%) create mode 100644 js/src/dapps/basiccoin/Application/Header/header.js rename js/src/dapps/{tokendeploy => basiccoin/Application}/Header/index.js (100%) rename js/src/dapps/{tokendeploy => basiccoin/Application}/Loading/index.js (100%) create mode 100644 js/src/dapps/basiccoin/Application/Loading/loading.css rename js/src/dapps/{tokendeploy => basiccoin/Application}/Loading/loading.js (92%) create mode 100644 js/src/dapps/basiccoin/Application/application.css rename js/src/dapps/{tokendeploy => basiccoin}/Application/application.js (73%) rename js/src/dapps/{tokendeploy => basiccoin}/Application/index.js (100%) create mode 100644 js/src/dapps/basiccoin/Application/pages.js rename js/src/dapps/{tokendeploy => basiccoin}/Deploy/deploy.js (100%) rename js/src/dapps/{tokendeploy => basiccoin}/Deploy/index.js (100%) rename js/src/dapps/{tokendeploy => basiccoin}/Events/events.js (100%) rename js/src/dapps/{tokendeploy => basiccoin}/Events/index.js (100%) rename js/src/dapps/{tokendeploy => basiccoin}/Overview/index.js (100%) rename js/src/dapps/{tokendeploy => basiccoin}/Overview/overview.js (100%) rename js/src/dapps/{tokendeploy => basiccoin}/Send/index.js (100%) rename js/src/dapps/{tokendeploy => basiccoin}/Send/send.js (100%) rename js/src/dapps/{tokendeploy => basiccoin}/Status/index.js (100%) rename js/src/dapps/{tokendeploy => basiccoin}/Status/status.js (100%) rename js/src/dapps/{tokendeploy => basiccoin}/parity.js (100%) rename js/src/dapps/{tokendeploy => basiccoin}/services.js (100%) rename js/src/dapps/{tokendeploy => basiccoin}/style.css (78%) delete mode 100644 js/src/dapps/tokendeploy/Header/header.js diff --git a/js/src/dapps/tokendeploy.html b/js/src/dapps/basiccoin.html similarity index 92% rename from js/src/dapps/tokendeploy.html rename to js/src/dapps/basiccoin.html index d8103375d0b..e451b5125c3 100644 --- a/js/src/dapps/tokendeploy.html +++ b/js/src/dapps/basiccoin.html @@ -13,6 +13,6 @@ - + diff --git a/js/src/dapps/tokendeploy.js b/js/src/dapps/basiccoin.js similarity index 83% rename from js/src/dapps/tokendeploy.js rename to js/src/dapps/basiccoin.js index 1dfe60e3427..ca9ea4d17f7 100644 --- a/js/src/dapps/tokendeploy.js +++ b/js/src/dapps/basiccoin.js @@ -22,17 +22,17 @@ import { Redirect, Router, Route, useRouterHistory } from 'react-router'; import injectTapEventPlugin from 'react-tap-event-plugin'; injectTapEventPlugin(); -import Deploy from './tokendeploy/Deploy'; -import Events from './tokendeploy/Events'; -import Application from './tokendeploy/Application'; -import Overview from './tokendeploy/Overview'; -import Send from './tokendeploy/Send'; -import Status from './tokendeploy/Status'; +import Deploy from './basiccoin/Deploy'; +import Events from './basiccoin/Events'; +import Application from './basiccoin/Application'; +import Overview from './basiccoin/Overview'; +import Send from './basiccoin/Send'; +import Status from './basiccoin/Status'; const routerHistory = useRouterHistory(createHashHistory)({}); import './style.css'; -import './tokendeploy.html'; +import './basiccoin.html'; ReactDOM.render( diff --git a/js/src/dapps/tokendeploy/Header/header.css b/js/src/dapps/basiccoin/Application/Header/header.css similarity index 83% rename from js/src/dapps/tokendeploy/Header/header.css rename to js/src/dapps/basiccoin/Application/Header/header.css index 30dedd2be3f..0df4e426d0a 100644 --- a/js/src/dapps/tokendeploy/Header/header.css +++ b/js/src/dapps/basiccoin/Application/Header/header.css @@ -16,14 +16,23 @@ */ .header { +} + +.titlebar { + padding: 0.5em 1em; + margin: 0; + color: white; +} + +.navigation { table-layout: fixed; width: 100%; - border-spacing: 0.15em; + border-spacing: 0; border-collapse: separate; border-color: white; } -tr { +.navigation tr { height: 10em; } @@ -34,7 +43,7 @@ tr { .byline { font-size: 1em; - opacity: 0.7; + opacity: 0.75; } .nav { @@ -45,7 +54,7 @@ tr { } .nav:hover { - opacity: 0.85; + opacity: 0.8; } .navCurrent { @@ -54,23 +63,3 @@ tr { .navNext { } - -.overview { - background: green; -} - -.send { - background: red; -} - -.events { - background: blue; -} - -.deploy { - background: purple; -} - -.status { - background: orange; -} diff --git a/js/src/dapps/basiccoin/Application/Header/header.js b/js/src/dapps/basiccoin/Application/Header/header.js new file mode 100644 index 00000000000..629619a604c --- /dev/null +++ b/js/src/dapps/basiccoin/Application/Header/header.js @@ -0,0 +1,80 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import PAGES from '../pages'; + +import layout from '../../style.css'; +import styles from './header.css'; + +export default class Header extends Component { + static contextTypes = { + router: PropTypes.object.isRequired + } + + render () { + const path = (window.location.hash || '').split('?')[0].split('/')[1]; + const offset = PAGES.findIndex((header) => header.path === path); + + return ( +
      + + + + { this.renderHeader(0, offset) } + { this.renderHeader(1, offset) } + { this.renderHeader(2, offset) } + + + { this.renderHeader(3, offset) } + { this.renderHeader(4, offset) } + + +
      +
      + ); + } + + renderHeader (index, offset) { + const page = PAGES[(index + offset) % PAGES.length]; + const classes = `${styles.nav} ${index ? styles.navNext : styles.navCurrent}`; + + return ( + +
      + { page.title } +
      +
      + { page.byline } +
      + + ); + } + + onNavigate = (route) => { + const { router } = this.context; + + return (event) => { + router.push(`/${route}`); + }; + } +} diff --git a/js/src/dapps/tokendeploy/Header/index.js b/js/src/dapps/basiccoin/Application/Header/index.js similarity index 100% rename from js/src/dapps/tokendeploy/Header/index.js rename to js/src/dapps/basiccoin/Application/Header/index.js diff --git a/js/src/dapps/tokendeploy/Loading/index.js b/js/src/dapps/basiccoin/Application/Loading/index.js similarity index 100% rename from js/src/dapps/tokendeploy/Loading/index.js rename to js/src/dapps/basiccoin/Application/Loading/index.js diff --git a/js/src/dapps/basiccoin/Application/Loading/loading.css b/js/src/dapps/basiccoin/Application/Loading/loading.css new file mode 100644 index 00000000000..915cc77dc21 --- /dev/null +++ b/js/src/dapps/basiccoin/Application/Loading/loading.css @@ -0,0 +1,24 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.body { + width: 100%; + text-align: center; + padding-top: 5em; + font-size: 2em; + color: #999; +} diff --git a/js/src/dapps/tokendeploy/Loading/loading.js b/js/src/dapps/basiccoin/Application/Loading/loading.js similarity index 92% rename from js/src/dapps/tokendeploy/Loading/loading.js rename to js/src/dapps/basiccoin/Application/Loading/loading.js index 560972e8571..e698a0e80b3 100644 --- a/js/src/dapps/tokendeploy/Loading/loading.js +++ b/js/src/dapps/basiccoin/Application/Loading/loading.js @@ -16,12 +16,12 @@ import React, { Component } from 'react'; -import styles from '../style.css'; +import styles from './loading.css'; export default class Loading extends Component { render () { return ( -
      +
      Attaching to contract ...
      ); diff --git a/js/src/dapps/basiccoin/Application/application.css b/js/src/dapps/basiccoin/Application/application.css new file mode 100644 index 00000000000..3015a6c8393 --- /dev/null +++ b/js/src/dapps/basiccoin/Application/application.css @@ -0,0 +1,30 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.container { + color: #333; + font-family: 'Roboto'; + vertical-align: middle; + min-height: 100vh; + position: relative; +} + +.page { + padding: 2em; + background: rgba(255, 255, 255, 0.85); + min-height: 100vh; +} diff --git a/js/src/dapps/tokendeploy/Application/application.js b/js/src/dapps/basiccoin/Application/application.js similarity index 73% rename from js/src/dapps/tokendeploy/Application/application.js rename to js/src/dapps/basiccoin/Application/application.js index 81d3c9b7b22..ff9e678d297 100644 --- a/js/src/dapps/tokendeploy/Application/application.js +++ b/js/src/dapps/basiccoin/Application/application.js @@ -16,10 +16,11 @@ import React, { Component, PropTypes } from 'react'; -import Header from '../Header'; -import Loading from '../Loading'; +import Header from './Header'; +import Loading from './Loading'; +import PAGES from './pages'; -import styles from '../style.css'; +import styles from './application.css'; export default class Application extends Component { static propTypes = { @@ -44,10 +45,15 @@ export default class Application extends Component { ); } + const path = (window.location.hash || '').split('?')[0].split('/')[1]; + const page = PAGES.find((page) => page.path === path); + return ( -
      +
      - { children } +
      + { children } +
      ); } diff --git a/js/src/dapps/tokendeploy/Application/index.js b/js/src/dapps/basiccoin/Application/index.js similarity index 100% rename from js/src/dapps/tokendeploy/Application/index.js rename to js/src/dapps/basiccoin/Application/index.js diff --git a/js/src/dapps/basiccoin/Application/pages.js b/js/src/dapps/basiccoin/Application/pages.js new file mode 100644 index 00000000000..4f1d32e04aa --- /dev/null +++ b/js/src/dapps/basiccoin/Application/pages.js @@ -0,0 +1,50 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const PAGES = [ + { + path: 'overview', + color: 'green', + title: 'Overview', + byline: 'Display all the current information relating to your own deployed tokens' + }, + { + path: 'send', + color: 'red', + title: 'Send', + byline: 'Send tokens associated with your accounts to other addresses' + }, + { + path: 'events', + color: 'blue', + title: 'Events', + byline: 'Track the events for your tokens, showing actions as they hapenned' + }, + { + path: 'deploy', + color: 'purple', + title: 'Deploy', + byline: 'Deploy a new token to the network' + }, + { + path: 'status', + color: 'orange', + title: 'Status', + byline: 'Show the status of all network tokens deployed with this application' + } +]; + +export default PAGES; diff --git a/js/src/dapps/tokendeploy/Deploy/deploy.js b/js/src/dapps/basiccoin/Deploy/deploy.js similarity index 100% rename from js/src/dapps/tokendeploy/Deploy/deploy.js rename to js/src/dapps/basiccoin/Deploy/deploy.js diff --git a/js/src/dapps/tokendeploy/Deploy/index.js b/js/src/dapps/basiccoin/Deploy/index.js similarity index 100% rename from js/src/dapps/tokendeploy/Deploy/index.js rename to js/src/dapps/basiccoin/Deploy/index.js diff --git a/js/src/dapps/tokendeploy/Events/events.js b/js/src/dapps/basiccoin/Events/events.js similarity index 100% rename from js/src/dapps/tokendeploy/Events/events.js rename to js/src/dapps/basiccoin/Events/events.js diff --git a/js/src/dapps/tokendeploy/Events/index.js b/js/src/dapps/basiccoin/Events/index.js similarity index 100% rename from js/src/dapps/tokendeploy/Events/index.js rename to js/src/dapps/basiccoin/Events/index.js diff --git a/js/src/dapps/tokendeploy/Overview/index.js b/js/src/dapps/basiccoin/Overview/index.js similarity index 100% rename from js/src/dapps/tokendeploy/Overview/index.js rename to js/src/dapps/basiccoin/Overview/index.js diff --git a/js/src/dapps/tokendeploy/Overview/overview.js b/js/src/dapps/basiccoin/Overview/overview.js similarity index 100% rename from js/src/dapps/tokendeploy/Overview/overview.js rename to js/src/dapps/basiccoin/Overview/overview.js diff --git a/js/src/dapps/tokendeploy/Send/index.js b/js/src/dapps/basiccoin/Send/index.js similarity index 100% rename from js/src/dapps/tokendeploy/Send/index.js rename to js/src/dapps/basiccoin/Send/index.js diff --git a/js/src/dapps/tokendeploy/Send/send.js b/js/src/dapps/basiccoin/Send/send.js similarity index 100% rename from js/src/dapps/tokendeploy/Send/send.js rename to js/src/dapps/basiccoin/Send/send.js diff --git a/js/src/dapps/tokendeploy/Status/index.js b/js/src/dapps/basiccoin/Status/index.js similarity index 100% rename from js/src/dapps/tokendeploy/Status/index.js rename to js/src/dapps/basiccoin/Status/index.js diff --git a/js/src/dapps/tokendeploy/Status/status.js b/js/src/dapps/basiccoin/Status/status.js similarity index 100% rename from js/src/dapps/tokendeploy/Status/status.js rename to js/src/dapps/basiccoin/Status/status.js diff --git a/js/src/dapps/tokendeploy/parity.js b/js/src/dapps/basiccoin/parity.js similarity index 100% rename from js/src/dapps/tokendeploy/parity.js rename to js/src/dapps/basiccoin/parity.js diff --git a/js/src/dapps/tokendeploy/services.js b/js/src/dapps/basiccoin/services.js similarity index 100% rename from js/src/dapps/tokendeploy/services.js rename to js/src/dapps/basiccoin/services.js diff --git a/js/src/dapps/tokendeploy/style.css b/js/src/dapps/basiccoin/style.css similarity index 78% rename from js/src/dapps/tokendeploy/style.css rename to js/src/dapps/basiccoin/style.css index c80e3ad8560..3272bf43b25 100644 --- a/js/src/dapps/tokendeploy/style.css +++ b/js/src/dapps/basiccoin/style.css @@ -15,24 +15,6 @@ /* along with Parity. If not, see . */ -.body { - padding: 2em; -} - -.container { - color: #333; - font-family: 'Roboto'; - vertical-align: middle; -} - -.loading { - width: 100%; - text-align: center; - padding-top: 5em; - font-size: 2em; - color: #999; -} - .title { font-size: 1.25em; margin-bottom: 0.25em; diff --git a/js/src/dapps/tokendeploy/Header/header.js b/js/src/dapps/tokendeploy/Header/header.js deleted file mode 100644 index 18959a4f908..00000000000 --- a/js/src/dapps/tokendeploy/Header/header.js +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -import React, { Component, PropTypes } from 'react'; - -import layout from '../style.css'; -import styles from './header.css'; - -const HEADERS = [ - { path: 'overview', className: styles.overview, title: 'Overview', byline: 'Displays all the current information relating to your own deployed tokens' }, - { path: 'send', className: styles.send, title: 'Send', byline: 'Send token associated with your accounts to other addresses' }, - { path: 'events', className: styles.events, title: 'Events', byline: 'Track the events for your tokens, showing actions as they hapenned' }, - { path: 'deploy', className: styles.deploy, title: 'Deploy', byline: 'Deploy a new token to the network' }, - { path: 'status', className: styles.status, title: 'Status', byline: 'Show the status of all network tokens deployed with this application' } -]; - -export default class Header extends Component { - static contextTypes = { - router: PropTypes.object.isRequired - } - - render () { - const path = (window.location.hash || '').split('?')[0].split('/')[1]; - const offset = HEADERS.findIndex((header) => header.path === path); - - return ( - - - - { this.renderHeader(0, offset) } - { this.renderHeader(1, offset) } - { this.renderHeader(2, offset) } - - - { this.renderHeader(3, offset) } - { this.renderHeader(4, offset) } - - -
      - ); - } - - renderHeader (index, offset) { - const isFirst = index === 0; - const position = index + offset; - const header = HEADERS[position < HEADERS.length ? position : position - HEADERS.length]; - const classes = `${styles.nav} ${isFirst ? styles.navCurrent : styles.navNext} ${header.className}`; - - return ( - -
      - { header.title } -
      -
      - { header.byline } -
      - - ); - } - - onNavigate = (route) => { - const { router } = this.context; - - return (event) => { - router.push(`/${route}`); - }; - } -} diff --git a/js/src/views/Dapps/dapps.js b/js/src/views/Dapps/dapps.js index 2cd4fa4e7d8..f341b3fa42c 100644 --- a/js/src/views/Dapps/dapps.js +++ b/js/src/views/Dapps/dapps.js @@ -38,7 +38,7 @@ class Dapps extends Component { { name: 'Token Deployment', description: 'Deploy new basic tokens that you are able to send around', - url: 'tokendeploy' + url: 'basiccoin' }, { name: 'GAVcoin', diff --git a/js/webpack.config.js b/js/webpack.config.js index 103ca5c5039..1547abb4e8c 100644 --- a/js/webpack.config.js +++ b/js/webpack.config.js @@ -31,10 +31,10 @@ module.exports = { context: path.join(__dirname, './src'), entry: { // dapps + 'basiccoin': ['./dapps/basiccoin.js'], 'gavcoin': ['./dapps/gavcoin.js'], 'registry': ['./dapps/registry.js'], 'signaturereg': ['./dapps/signaturereg.js'], - 'tokendeploy': ['./dapps/tokendeploy.js'], 'tokenreg': ['./dapps/tokenreg.js'], // library 'parity': ['./parity.js'], From 1a4e98ea08f6bf429dba443a082b03a9fbfa1401 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 30 Sep 2016 18:03:34 +0200 Subject: [PATCH 0887/1062] add missing bytes & core-js (reported by bjorn) --- js/package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/js/package.json b/js/package.json index cc0b75af315..6a98e9cad2e 100644 --- a/js/package.json +++ b/js/package.json @@ -58,6 +58,7 @@ "chai": "^3.5.0", "chai-enzyme": "0.4.2", "cheerio": "0.20.0", + "core-js": "^2.4.1", "coveralls": "^2.11.11", "css-loader": "^0.23.1", "enzyme": "2.3.0", @@ -112,6 +113,7 @@ "bignumber.js": "^2.3.0", "blockies": "0.0.2", "browser-request": "^0.3.3", + "bytes": "^2.4.0", "classnames": "^2.2.3", "es6-promise": "^3.2.1", "format-json": "^1.0.3", From e3bc29b4fe068a59b5afe28337a9f4a09a21387e Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 1 Oct 2016 10:12:37 +0200 Subject: [PATCH 0888/1062] inputs for deploy --- js/src/dapps/basiccoin/Deploy/deploy.js | 81 +++++++++++++++++++++++-- js/src/dapps/basiccoin/style.css | 44 ++++++++++++++ 2 files changed, 121 insertions(+), 4 deletions(-) diff --git a/js/src/dapps/basiccoin/Deploy/deploy.js b/js/src/dapps/basiccoin/Deploy/deploy.js index 7f6a3ef7bed..20f8a20a8e9 100644 --- a/js/src/dapps/basiccoin/Deploy/deploy.js +++ b/js/src/dapps/basiccoin/Deploy/deploy.js @@ -14,16 +14,89 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -import React, { Component } from 'react'; +import React, { Component, PropTypes } from 'react'; -import styles from '../style.css'; +import layout from '../style.css'; export default class Deploy extends Component { + static contextTypes = { + router: PropTypes.object.isRequired + } + + state = { + deploying: false, + name: '', + nameError: null, + tla: '', + tlaError: null, + totalSupply: '1000000', + totalSupplyError: null + } + render () { return ( -
      -
      Deploy
      +
      +
      Deploy
      + { this.renderForm() } +
      + ); + } + + renderForm () { + const { deploying, name, nameError, tla, tlaError, totalSupply, totalSupplyError } = this.state; + + if (deploying) { + return null; + } + + const error = `${layout.input} ${layout.error}`; + + return ( +
      +
      + + +
      + A name for the token to identify it +
      +
      +
      + + +
      + A unique network acronym for this token (3 characters) +
      +
      +
      + + +
      + The total number of tokens in circulation +
      +
      ); } + + onChangeName = (event, name) => { + this.setState({ name }); + } + + onChangeTla = (event, tla) => { + this.setState({ tla }); + } + + onChangeSupply = (event, totalSupply) => { + this.setState({ totalSupply }); + } } diff --git a/js/src/dapps/basiccoin/style.css b/js/src/dapps/basiccoin/style.css index 3272bf43b25..ad7db89d74e 100644 --- a/js/src/dapps/basiccoin/style.css +++ b/js/src/dapps/basiccoin/style.css @@ -15,6 +15,50 @@ /* along with Parity. If not, see . */ +.body { +} + +.form { +} + +.form .input { + margin-bottom: 1em; +} + +.form .input>* { + display: inline-block; + margin-right: 1em; + padding: 0.5em; + font-size: 1em; +} + +.form label { + opacity: 0.8; + width: 20em; + text-align: right; + padding: 0.5em 0; +} + +.form input { + width: 20em; + background: rgba(255, 255, 255, 0.25); + border-radius: 4px; + border-width: 1px; +} + +.form .input.error input { + background: rgba(255, 0, 0, 0.5); +} + +.form input.small { + width: 10em; + margin-right: 11em; +} + +.form .hint { + opacity: 0.4; +} + .title { font-size: 1.25em; margin-bottom: 0.25em; From a963e4b7b5dc3299e8eaabfe425ce575f9c8d473 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 1 Oct 2016 11:54:03 +0200 Subject: [PATCH 0889/1062] rework sharable layouts --- .../basiccoin/Application/Header/header.css | 7 ++ .../basiccoin/Application/Header/header.js | 3 + .../basiccoin/Application/application.css | 5 +- .../basiccoin/Application/application.js | 5 +- js/src/dapps/basiccoin/Application/pages.js | 3 +- js/src/dapps/basiccoin/Container/container.js | 35 ++++++ js/src/dapps/basiccoin/Container/index.js | 17 +++ js/src/dapps/basiccoin/Container/style.css | 23 ++++ js/src/dapps/basiccoin/Deploy/deploy.js | 116 ++++++++++-------- js/src/dapps/basiccoin/Events/events.js | 6 +- js/src/dapps/basiccoin/Overview/overview.js | 6 +- js/src/dapps/basiccoin/Send/send.js | 6 +- js/src/dapps/basiccoin/Status/status.js | 6 +- js/src/dapps/basiccoin/style.css | 19 +-- 14 files changed, 178 insertions(+), 79 deletions(-) create mode 100644 js/src/dapps/basiccoin/Container/container.js create mode 100644 js/src/dapps/basiccoin/Container/index.js create mode 100644 js/src/dapps/basiccoin/Container/style.css diff --git a/js/src/dapps/basiccoin/Application/Header/header.css b/js/src/dapps/basiccoin/Application/Header/header.css index 0df4e426d0a..8eaf0e8c281 100644 --- a/js/src/dapps/basiccoin/Application/Header/header.css +++ b/js/src/dapps/basiccoin/Application/Header/header.css @@ -44,6 +44,13 @@ .byline { font-size: 1em; opacity: 0.75; + margin-bottom: 0.25em; +} + +.description { + font-size: 0.5em; + opacity: 0.5; + line-height: 1.5em; } .nav { diff --git a/js/src/dapps/basiccoin/Application/Header/header.js b/js/src/dapps/basiccoin/Application/Header/header.js index 629619a604c..e747e928d09 100644 --- a/js/src/dapps/basiccoin/Application/Header/header.js +++ b/js/src/dapps/basiccoin/Application/Header/header.js @@ -66,6 +66,9 @@ export default class Header extends Component {
      { page.byline }
      +
      + { index ? null : page.description } +
      ); } diff --git a/js/src/dapps/basiccoin/Application/application.css b/js/src/dapps/basiccoin/Application/application.css index 3015a6c8393..5f9cd941a4f 100644 --- a/js/src/dapps/basiccoin/Application/application.css +++ b/js/src/dapps/basiccoin/Application/application.css @@ -23,8 +23,7 @@ position: relative; } -.page { - padding: 2em; - background: rgba(255, 255, 255, 0.85); +.body { + padding: 5em; min-height: 100vh; } diff --git a/js/src/dapps/basiccoin/Application/application.js b/js/src/dapps/basiccoin/Application/application.js index ff9e678d297..c46650e5b9a 100644 --- a/js/src/dapps/basiccoin/Application/application.js +++ b/js/src/dapps/basiccoin/Application/application.js @@ -47,11 +47,12 @@ export default class Application extends Component { const path = (window.location.hash || '').split('?')[0].split('/')[1]; const page = PAGES.find((page) => page.path === path); + const style = { background: page.color }; return ( -
      +
      -
      +
      { children }
      diff --git a/js/src/dapps/basiccoin/Application/pages.js b/js/src/dapps/basiccoin/Application/pages.js index 4f1d32e04aa..b43afec0409 100644 --- a/js/src/dapps/basiccoin/Application/pages.js +++ b/js/src/dapps/basiccoin/Application/pages.js @@ -37,7 +37,8 @@ const PAGES = [ path: 'deploy', color: 'purple', title: 'Deploy', - byline: 'Deploy a new token to the network' + byline: 'Deploy a new token to the network', + description: 'Token registration has never been this easy. Select the name for your token, the TLA and the number of tokens in circulation. Start sending the tokens to contacts right from this interface. Optionally you can register the token with the Token Registry which would allow you to transaction in tokens from anywhere these transactions are allowed.' }, { path: 'status', diff --git a/js/src/dapps/basiccoin/Container/container.js b/js/src/dapps/basiccoin/Container/container.js new file mode 100644 index 00000000000..2a5fbdc9190 --- /dev/null +++ b/js/src/dapps/basiccoin/Container/container.js @@ -0,0 +1,35 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import styles from './style.css'; + +export default class Container extends Component { + static propTypes = { + children: PropTypes.node.isRequired + } + + render () { + const { children } = this.props; + + return ( +
      + { children } +
      + ); + } +} diff --git a/js/src/dapps/basiccoin/Container/index.js b/js/src/dapps/basiccoin/Container/index.js new file mode 100644 index 00000000000..87fbc567ef2 --- /dev/null +++ b/js/src/dapps/basiccoin/Container/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './container'; diff --git a/js/src/dapps/basiccoin/Container/style.css b/js/src/dapps/basiccoin/Container/style.css new file mode 100644 index 00000000000..b1e1535a471 --- /dev/null +++ b/js/src/dapps/basiccoin/Container/style.css @@ -0,0 +1,23 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.content { + background: whitesmoke; + border-radius: 5px; + padding: 5em 2em; + margin-bottom: 2em; +} diff --git a/js/src/dapps/basiccoin/Deploy/deploy.js b/js/src/dapps/basiccoin/Deploy/deploy.js index 20f8a20a8e9..deafe1e2050 100644 --- a/js/src/dapps/basiccoin/Deploy/deploy.js +++ b/js/src/dapps/basiccoin/Deploy/deploy.js @@ -16,8 +16,14 @@ import React, { Component, PropTypes } from 'react'; +import Container from '../Container'; import layout from '../style.css'; +const ERRORS = { + name: 'specify a valid name >3 & <32 characters', + tla: 'specify a valid TLA, 3 characters in length' +}; + export default class Deploy extends Component { static contextTypes = { router: PropTypes.object.isRequired @@ -26,77 +32,91 @@ export default class Deploy extends Component { state = { deploying: false, name: '', - nameError: null, + nameError: ERRORS.name, tla: '', - tlaError: null, + tlaError: ERRORS.tla, totalSupply: '1000000', totalSupplyError: null } render () { - return ( -
      -
      Deploy
      - { this.renderForm() } -
      - ); + const { deploying } = this.state; + + return deploying + ? null + : this.renderForm(); } renderForm () { - const { deploying, name, nameError, tla, tlaError, totalSupply, totalSupplyError } = this.state; - - if (deploying) { - return null; - } - + const { name, nameError, tla, tlaError, totalSupply, totalSupplyError } = this.state; const error = `${layout.input} ${layout.error}`; return ( -
      -
      - - -
      - A name for the token to identify it + +
      +
      + + +
      + { nameError || 'an identifying name for the token' } +
      -
      -
      - - -
      - A unique network acronym for this token (3 characters) +
      + + +
      + { tlaError || 'unique network acronym for this token' } +
      -
      -
      - - -
      - The total number of tokens in circulation +
      + + +
      + { totalSupplyError || 'The total number of tokens in circulation' } +
      -
      + ); } - onChangeName = (event, name) => { - this.setState({ name }); + onChangeName = (event) => { + const name = event.target.value; + const nameError = name && (name.length > 3) && (name.length < 32) + ? null + : ERRORS.name; + + this.setState({ name, nameError }); } - onChangeTla = (event, tla) => { - this.setState({ tla }); + onChangeTla = (event) => { + const _tla = event.target.value; + const tla = _tla && (_tla.length > 3) + ? _tla.substr(0, 3) + : _tla; + const tlaError = tla && (tla.length === 3) + ? null + : ERRORS.tla; + + this.setState({ tla, tlaError }); } - onChangeSupply = (event, totalSupply) => { + onChangeSupply = (event) => { + const totalSupply = event.target.value; + this.setState({ totalSupply }); } } diff --git a/js/src/dapps/basiccoin/Events/events.js b/js/src/dapps/basiccoin/Events/events.js index 176a8ab693d..4748da24a08 100644 --- a/js/src/dapps/basiccoin/Events/events.js +++ b/js/src/dapps/basiccoin/Events/events.js @@ -16,14 +16,12 @@ import React, { Component } from 'react'; -import styles from '../style.css'; +import Container from '../Container'; export default class Events extends Component { render () { return ( -
      -
      Events
      -
      + ); } } diff --git a/js/src/dapps/basiccoin/Overview/overview.js b/js/src/dapps/basiccoin/Overview/overview.js index 2fa863c6dae..e7e92a1ebbb 100644 --- a/js/src/dapps/basiccoin/Overview/overview.js +++ b/js/src/dapps/basiccoin/Overview/overview.js @@ -16,14 +16,12 @@ import React, { Component } from 'react'; -import styles from '../style.css'; +import Container from '../Container'; export default class Overview extends Component { render () { return ( -
      -
      Overview
      -
      + ); } } diff --git a/js/src/dapps/basiccoin/Send/send.js b/js/src/dapps/basiccoin/Send/send.js index d913fbe0a91..ca6273eab08 100644 --- a/js/src/dapps/basiccoin/Send/send.js +++ b/js/src/dapps/basiccoin/Send/send.js @@ -16,14 +16,12 @@ import React, { Component } from 'react'; -import styles from '../style.css'; +import Container from '../Container'; export default class Send extends Component { render () { return ( -
      -
      Send
      -
      + ); } } diff --git a/js/src/dapps/basiccoin/Status/status.js b/js/src/dapps/basiccoin/Status/status.js index 9c7121c72c2..4ccb8bb6e17 100644 --- a/js/src/dapps/basiccoin/Status/status.js +++ b/js/src/dapps/basiccoin/Status/status.js @@ -16,14 +16,12 @@ import React, { Component } from 'react'; -import styles from '../style.css'; +import Container from '../Container'; export default class Deploy extends Component { render () { return ( -
      -
      Status
      -
      + ); } } diff --git a/js/src/dapps/basiccoin/style.css b/js/src/dapps/basiccoin/style.css index ad7db89d74e..41a70c7611b 100644 --- a/js/src/dapps/basiccoin/style.css +++ b/js/src/dapps/basiccoin/style.css @@ -15,9 +15,6 @@ /* along with Parity. If not, see . */ -.body { -} - .form { } @@ -43,11 +40,7 @@ width: 20em; background: rgba(255, 255, 255, 0.25); border-radius: 4px; - border-width: 1px; -} - -.form .input.error input { - background: rgba(255, 0, 0, 0.5); + border: 1px solid rgba(0, 0, 0, 0.25); } .form input.small { @@ -56,7 +49,15 @@ } .form .hint { - opacity: 0.4; + opacity: 0.5; +} + +.form .error input { + border: 1px solid rgba(255, 0, 0, 0.5); +} + +.form .error .hint { + color: red; } .title { From 77cd39f7066eb73dc41cd83060167ae5f262f8cc Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 1 Oct 2016 12:06:18 +0200 Subject: [PATCH 0890/1062] remove unused style sections --- js/src/dapps/basiccoin/Application/Header/header.css | 2 +- js/src/dapps/basiccoin/Application/Header/header.js | 4 +--- js/src/dapps/basiccoin/Application/application.css | 4 +--- js/src/dapps/basiccoin/Container/style.css | 4 ++-- js/src/dapps/basiccoin/style.css | 9 ++------- 5 files changed, 7 insertions(+), 16 deletions(-) diff --git a/js/src/dapps/basiccoin/Application/Header/header.css b/js/src/dapps/basiccoin/Application/Header/header.css index 8eaf0e8c281..c84d068849e 100644 --- a/js/src/dapps/basiccoin/Application/Header/header.css +++ b/js/src/dapps/basiccoin/Application/Header/header.css @@ -56,7 +56,7 @@ .nav { cursor: pointer; color: white; - padding: 2em; + padding: 1em 2em; vertical-align: middle; } diff --git a/js/src/dapps/basiccoin/Application/Header/header.js b/js/src/dapps/basiccoin/Application/Header/header.js index e747e928d09..f11e825ee0b 100644 --- a/js/src/dapps/basiccoin/Application/Header/header.js +++ b/js/src/dapps/basiccoin/Application/Header/header.js @@ -17,8 +17,6 @@ import React, { Component, PropTypes } from 'react'; import PAGES from '../pages'; - -import layout from '../../style.css'; import styles from './header.css'; export default class Header extends Component { @@ -60,7 +58,7 @@ export default class Header extends Component { colSpan={ index ? 1 : 2 } rowSpan={ index ? 1 : 2 } onClick={ this.onNavigate(page.path) }> -
      +
      { page.title }
      diff --git a/js/src/dapps/basiccoin/Application/application.css b/js/src/dapps/basiccoin/Application/application.css index 5f9cd941a4f..1ec0f9a0ac4 100644 --- a/js/src/dapps/basiccoin/Application/application.css +++ b/js/src/dapps/basiccoin/Application/application.css @@ -20,10 +20,8 @@ font-family: 'Roboto'; vertical-align: middle; min-height: 100vh; - position: relative; } .body { - padding: 5em; - min-height: 100vh; + padding: 4em; } diff --git a/js/src/dapps/basiccoin/Container/style.css b/js/src/dapps/basiccoin/Container/style.css index b1e1535a471..7c4260771c5 100644 --- a/js/src/dapps/basiccoin/Container/style.css +++ b/js/src/dapps/basiccoin/Container/style.css @@ -17,7 +17,7 @@ .content { background: whitesmoke; - border-radius: 5px; - padding: 5em 2em; + border-radius: 1px; + padding: 4em 2em; margin-bottom: 2em; } diff --git a/js/src/dapps/basiccoin/style.css b/js/src/dapps/basiccoin/style.css index 41a70c7611b..52f9af07957 100644 --- a/js/src/dapps/basiccoin/style.css +++ b/js/src/dapps/basiccoin/style.css @@ -19,7 +19,7 @@ } .form .input { - margin-bottom: 1em; + margin-bottom: 2em; } .form .input>* { @@ -39,7 +39,7 @@ .form input { width: 20em; background: rgba(255, 255, 255, 0.25); - border-radius: 4px; + border-radius: 1px; border: 1px solid rgba(0, 0, 0, 0.25); } @@ -59,8 +59,3 @@ .form .error .hint { color: red; } - -.title { - font-size: 1.25em; - margin-bottom: 0.25em; -} From a5b864639c25326f6fcf51606bb3143e0b607d7e Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 1 Oct 2016 12:17:47 +0200 Subject: [PATCH 0891/1062] rename styles, add buttons --- .../Container/{style.css => container.css} | 0 js/src/dapps/basiccoin/Container/container.js | 2 +- js/src/dapps/basiccoin/Deploy/deploy.css | 33 +++++++++++++++++++ js/src/dapps/basiccoin/Deploy/deploy.js | 6 ++++ 4 files changed, 40 insertions(+), 1 deletion(-) rename js/src/dapps/basiccoin/Container/{style.css => container.css} (100%) create mode 100644 js/src/dapps/basiccoin/Deploy/deploy.css diff --git a/js/src/dapps/basiccoin/Container/style.css b/js/src/dapps/basiccoin/Container/container.css similarity index 100% rename from js/src/dapps/basiccoin/Container/style.css rename to js/src/dapps/basiccoin/Container/container.css diff --git a/js/src/dapps/basiccoin/Container/container.js b/js/src/dapps/basiccoin/Container/container.js index 2a5fbdc9190..840a7c198c0 100644 --- a/js/src/dapps/basiccoin/Container/container.js +++ b/js/src/dapps/basiccoin/Container/container.js @@ -16,7 +16,7 @@ import React, { Component, PropTypes } from 'react'; -import styles from './style.css'; +import styles from './container.css'; export default class Container extends Component { static propTypes = { diff --git a/js/src/dapps/basiccoin/Deploy/deploy.css b/js/src/dapps/basiccoin/Deploy/deploy.css new file mode 100644 index 00000000000..8946aa04ce7 --- /dev/null +++ b/js/src/dapps/basiccoin/Deploy/deploy.css @@ -0,0 +1,33 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.buttonRow { + width: 40em; + text-align: right; + padding: 0 3em; +} + +.button { + background: purple; + color: white; + border: none; + border-radius: 1px; + padding: 1em 2em; + display: inline-block; + margin-left: 1em; + cursor: pointer; +} diff --git a/js/src/dapps/basiccoin/Deploy/deploy.js b/js/src/dapps/basiccoin/Deploy/deploy.js index deafe1e2050..138ec7f88b4 100644 --- a/js/src/dapps/basiccoin/Deploy/deploy.js +++ b/js/src/dapps/basiccoin/Deploy/deploy.js @@ -17,6 +17,7 @@ import React, { Component, PropTypes } from 'react'; import Container from '../Container'; +import styles from './deploy.css'; import layout from '../style.css'; const ERRORS = { @@ -89,6 +90,11 @@ export default class Deploy extends Component {
      +
      +
      + Register +
      +
      ); } From 2f3705307989ad467d73e2c01748b4b3dd1d3391 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 1 Oct 2016 12:30:22 +0200 Subject: [PATCH 0892/1062] phantom deploy state --- js/src/dapps/basiccoin/Container/container.js | 6 ++-- js/src/dapps/basiccoin/Deploy/deploy.css | 5 ++++ js/src/dapps/basiccoin/Deploy/deploy.js | 28 +++++++++++++++++-- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/js/src/dapps/basiccoin/Container/container.js b/js/src/dapps/basiccoin/Container/container.js index 840a7c198c0..82805e71b57 100644 --- a/js/src/dapps/basiccoin/Container/container.js +++ b/js/src/dapps/basiccoin/Container/container.js @@ -20,14 +20,16 @@ import styles from './container.css'; export default class Container extends Component { static propTypes = { + className: PropTypes.string, children: PropTypes.node.isRequired } render () { - const { children } = this.props; + const { className, children } = this.props; + const classes = `${styles.content} ${className}`; return ( -
      +
      { children }
      ); diff --git a/js/src/dapps/basiccoin/Deploy/deploy.css b/js/src/dapps/basiccoin/Deploy/deploy.css index 8946aa04ce7..175a1596f7d 100644 --- a/js/src/dapps/basiccoin/Deploy/deploy.css +++ b/js/src/dapps/basiccoin/Deploy/deploy.css @@ -31,3 +31,8 @@ margin-left: 1em; cursor: pointer; } + +.button[disabled] { + opacity: 0.5; + cursor: default; +} diff --git a/js/src/dapps/basiccoin/Deploy/deploy.js b/js/src/dapps/basiccoin/Deploy/deploy.js index 138ec7f88b4..392416ae70d 100644 --- a/js/src/dapps/basiccoin/Deploy/deploy.js +++ b/js/src/dapps/basiccoin/Deploy/deploy.js @@ -44,12 +44,20 @@ export default class Deploy extends Component { const { deploying } = this.state; return deploying - ? null + ? this.renderDeploying() : this.renderForm(); } + renderDeploying () { + return ( + + + ); + } + renderForm () { const { name, nameError, tla, tlaError, totalSupply, totalSupplyError } = this.state; + const hasError = !!(nameError || tlaError || totalSupplyError); const error = `${layout.input} ${layout.error}`; return ( @@ -91,8 +99,11 @@ export default class Deploy extends Component {
      -
      - Register +
      + Deploy Token
      @@ -125,4 +136,15 @@ export default class Deploy extends Component { this.setState({ totalSupply }); } + + onDeploy = (event) => { + const { deploying, name, nameError, tla, tlaError, totalSupply, totalSupplyError } = this.state; + const hasError = !!(nameError || tlaError || totalSupplyError); + + if (hasError || deploying) { + return; + } + + this.setState({ deploying: true }); + } } From 07c0b6ae48a2e41908bf4cbca351a11cc0b096d8 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 1 Oct 2016 13:46:42 +0200 Subject: [PATCH 0893/1062] deployment abis --- js/src/contracts/abi/basiccoinmanager.json | 1 + js/src/contracts/abi/index.js | 2 + .../basiccoin/Application/application.js | 57 ++++++++++++++++++- .../dapps/basiccoin/Container/container.css | 4 ++ js/src/dapps/basiccoin/Container/container.js | 5 +- js/src/dapps/basiccoin/Deploy/deploy.js | 3 +- 6 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 js/src/contracts/abi/basiccoinmanager.json diff --git a/js/src/contracts/abi/basiccoinmanager.json b/js/src/contracts/abi/basiccoinmanager.json new file mode 100644 index 00000000000..430fe627739 --- /dev/null +++ b/js/src/contracts/abi/basiccoinmanager.json @@ -0,0 +1 @@ +[{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"countByOwner","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"count","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_new","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_registryAddress","type":"address"}],"name":"updateRegistry","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_totalSupply","type":"uint256"},{"name":"_tla","type":"string"},{"name":"_name","type":"string"},{"name":"_withTokenreg","type":"bool"}],"name":"deploy","outputs":[{"name":"","type":"bool"}],"payable":true,"type":"function"},{"constant":true,"inputs":[],"name":"base","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"get","outputs":[{"name":"coin","type":"address"},{"name":"owner","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"drain","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"getByOwner","outputs":[{"name":"coin","type":"address"},{"name":"owner","type":"address"}],"payable":false,"type":"function"},{"inputs":[{"name":"_registryAddress","type":"address"}],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"tokenreg","type":"address"},{"indexed":false,"name":"coin","type":"address"},{"indexed":false,"name":"tla","type":"string"},{"indexed":false,"name":"name","type":"string"}],"name":"Created","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"old","type":"address"},{"indexed":true,"name":"current","type":"address"}],"name":"NewOwner","type":"event"}] diff --git a/js/src/contracts/abi/index.js b/js/src/contracts/abi/index.js index 4032bf4545f..09c5347823b 100644 --- a/js/src/contracts/abi/index.js +++ b/js/src/contracts/abi/index.js @@ -14,6 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . +import basiccoinmanager from './basiccoinmanager.json'; import eip20 from './eip20.json'; import gavcoin from './gavcoin.json'; import githubhint from './githubhint.json'; @@ -23,6 +24,7 @@ import signaturereg from './signaturereg.json'; import tokenreg from './tokenreg.json'; export { + basiccoinmanager, eip20, gavcoin, githubhint, diff --git a/js/src/dapps/basiccoin/Application/application.js b/js/src/dapps/basiccoin/Application/application.js index c46650e5b9a..9c692a42ae2 100644 --- a/js/src/dapps/basiccoin/Application/application.js +++ b/js/src/dapps/basiccoin/Application/application.js @@ -16,6 +16,9 @@ import React, { Component, PropTypes } from 'react'; +import * as abis from '../../../contracts/abi'; +import { api } from '../parity'; + import Header from './Header'; import Loading from './Loading'; import PAGES from './pages'; @@ -23,16 +26,25 @@ import PAGES from './pages'; import styles from './application.css'; export default class Application extends Component { + static childContextTypes = { + managerInstance: PropTypes.object, + registryInstance: PropTypes.object, + tokenregInstance: PropTypes.object + } + static propTypes = { children: PropTypes.node.isRequired } state = { - loading: true + loading: true, + managerInstance: null, + registryInstance: null, + tokenregInstance: null } componentDidMount () { - this.setState({ loading: false }); + this.attachInstance(); } render () { @@ -58,4 +70,45 @@ export default class Application extends Component {
      ); } + + getChildContext () { + const { managerInstance, registryInstance, tokenregInstance } = this.state; + + return { + managerInstance, + registryInstance, + tokenregInstance + }; + } + + attachInstance () { + api.ethcore + .registryAddress() + .then((registryAddress) => { + console.log(`contract was found at registry=${registryAddress}`); + + const registry = api.newContract(abis.registry, registryAddress).instance; + + return Promise + .all([ + registry.getAddress.call({}, [api.util.sha3('basiccoinmanager'), 'A']), + registry.getAddress.call({}, [api.util.sha3('basiccoinregistry'), 'A']), + registry.getAddress.call({}, [api.util.sha3('tokenreg'), 'A']) + ]); + }) + .then(([managerAddress, registryAddress, tokenregAddress]) => { + console.log(`contracts were found at manager=${managerAddress}, registry=${registryAddress}, tokenreg=${registryAddress}`); + + const managerInstance = api.newContract(abis.basiccoinmanager, managerAddress).instance; + const registryInstance = api.newContract(abis.tokenreg, registryAddress).instance; + const tokenregInstance = api.newContract(abis.tokenreg, tokenregAddress).instance; + + this.setState({ + loading: false, + managerInstance, + registryInstance, + tokenregInstance + }); + }); + } } diff --git a/js/src/dapps/basiccoin/Container/container.css b/js/src/dapps/basiccoin/Container/container.css index 7c4260771c5..097dd08fc73 100644 --- a/js/src/dapps/basiccoin/Container/container.css +++ b/js/src/dapps/basiccoin/Container/container.css @@ -21,3 +21,7 @@ padding: 4em 2em; margin-bottom: 2em; } + +.center { + text-align: center; +} diff --git a/js/src/dapps/basiccoin/Container/container.js b/js/src/dapps/basiccoin/Container/container.js index 82805e71b57..f0e4dc443f4 100644 --- a/js/src/dapps/basiccoin/Container/container.js +++ b/js/src/dapps/basiccoin/Container/container.js @@ -20,13 +20,14 @@ import styles from './container.css'; export default class Container extends Component { static propTypes = { + center: PropTypes.bool, className: PropTypes.string, children: PropTypes.node.isRequired } render () { - const { className, children } = this.props; - const classes = `${styles.content} ${className}`; + const { center, className, children } = this.props; + const classes = `${styles.content} ${center ? styles.center : null} ${className}`; return (
      diff --git a/js/src/dapps/basiccoin/Deploy/deploy.js b/js/src/dapps/basiccoin/Deploy/deploy.js index 392416ae70d..9b718f26e41 100644 --- a/js/src/dapps/basiccoin/Deploy/deploy.js +++ b/js/src/dapps/basiccoin/Deploy/deploy.js @@ -50,7 +50,8 @@ export default class Deploy extends Component { renderDeploying () { return ( - + + Your token is currently being deployed to the network ); } From fc2b69d5ce0750a6483f0af897384adb56fd60bd Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 1 Oct 2016 17:24:28 +0200 Subject: [PATCH 0894/1062] basiccoint manager abi --- js/src/contracts/abi/basiccoinmanager.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/contracts/abi/basiccoinmanager.json b/js/src/contracts/abi/basiccoinmanager.json index 430fe627739..b72d3b00c64 100644 --- a/js/src/contracts/abi/basiccoinmanager.json +++ b/js/src/contracts/abi/basiccoinmanager.json @@ -1 +1 @@ -[{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"countByOwner","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"count","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_new","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_registryAddress","type":"address"}],"name":"updateRegistry","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_totalSupply","type":"uint256"},{"name":"_tla","type":"string"},{"name":"_name","type":"string"},{"name":"_withTokenreg","type":"bool"}],"name":"deploy","outputs":[{"name":"","type":"bool"}],"payable":true,"type":"function"},{"constant":true,"inputs":[],"name":"base","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"get","outputs":[{"name":"coin","type":"address"},{"name":"owner","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"drain","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"getByOwner","outputs":[{"name":"coin","type":"address"},{"name":"owner","type":"address"}],"payable":false,"type":"function"},{"inputs":[{"name":"_registryAddress","type":"address"}],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"tokenreg","type":"address"},{"indexed":false,"name":"coin","type":"address"},{"indexed":false,"name":"tla","type":"string"},{"indexed":false,"name":"name","type":"string"}],"name":"Created","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"old","type":"address"},{"indexed":true,"name":"current","type":"address"}],"name":"NewOwner","type":"event"}] +[{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"countByOwner","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"count","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_new","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"base","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"get","outputs":[{"name":"coin","type":"address"},{"name":"owner","type":"address"},{"name":"tokenreg","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"drain","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_totalSupply","type":"uint256"},{"name":"_tla","type":"string"},{"name":"_name","type":"string"},{"name":"_tokenreg","type":"address"}],"name":"deploy","outputs":[{"name":"","type":"bool"}],"payable":true,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"getByOwner","outputs":[{"name":"coin","type":"address"},{"name":"owner","type":"address"},{"name":"tokenreg","type":"address"}],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"tokenreg","type":"address"},{"indexed":false,"name":"coin","type":"address"},{"indexed":false,"name":"tla","type":"string"},{"indexed":false,"name":"name","type":"string"}],"name":"Created","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"old","type":"address"},{"indexed":true,"name":"current","type":"address"}],"name":"NewOwner","type":"event"}] From fc8e6ad2afa25c75828f43015a4b8e8fd3e103d8 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 1 Oct 2016 18:07:18 +0200 Subject: [PATCH 0895/1062] setup instances & accounts --- .../basiccoin/Application/application.js | 16 ++++--- js/src/dapps/basiccoin/Deploy/deploy.js | 44 +++++++++++++++++-- 2 files changed, 52 insertions(+), 8 deletions(-) diff --git a/js/src/dapps/basiccoin/Application/application.js b/js/src/dapps/basiccoin/Application/application.js index 9c692a42ae2..f1cc8398511 100644 --- a/js/src/dapps/basiccoin/Application/application.js +++ b/js/src/dapps/basiccoin/Application/application.js @@ -27,6 +27,7 @@ import styles from './application.css'; export default class Application extends Component { static childContextTypes = { + accounts: PropTypes.object, managerInstance: PropTypes.object, registryInstance: PropTypes.object, tokenregInstance: PropTypes.object @@ -37,6 +38,7 @@ export default class Application extends Component { } state = { + accounts: null, loading: true, managerInstance: null, registryInstance: null, @@ -72,9 +74,10 @@ export default class Application extends Component { } getChildContext () { - const { managerInstance, registryInstance, tokenregInstance } = this.state; + const { accounts, managerInstance, registryInstance, tokenregInstance } = this.state; return { + accounts, managerInstance, registryInstance, tokenregInstance @@ -93,10 +96,11 @@ export default class Application extends Component { .all([ registry.getAddress.call({}, [api.util.sha3('basiccoinmanager'), 'A']), registry.getAddress.call({}, [api.util.sha3('basiccoinregistry'), 'A']), - registry.getAddress.call({}, [api.util.sha3('tokenreg'), 'A']) + registry.getAddress.call({}, [api.util.sha3('tokenreg'), 'A']), + api.personal.accountsInfo() ]); }) - .then(([managerAddress, registryAddress, tokenregAddress]) => { + .then(([managerAddress, registryAddress, tokenregAddress, accountsInfo]) => { console.log(`contracts were found at manager=${managerAddress}, registry=${registryAddress}, tokenreg=${registryAddress}`); const managerInstance = api.newContract(abis.basiccoinmanager, managerAddress).instance; @@ -104,10 +108,12 @@ export default class Application extends Component { const tokenregInstance = api.newContract(abis.tokenreg, tokenregAddress).instance; this.setState({ - loading: false, managerInstance, registryInstance, - tokenregInstance + tokenregInstance, + accounts: Object.keys(accountsInfo) + .filter((address) => accountsInfo[address].uuid) + .map((address) => Object.assign(accountsInfo[address], { address })) }); }); } diff --git a/js/src/dapps/basiccoin/Deploy/deploy.js b/js/src/dapps/basiccoin/Deploy/deploy.js index 9b718f26e41..6935b67d637 100644 --- a/js/src/dapps/basiccoin/Deploy/deploy.js +++ b/js/src/dapps/basiccoin/Deploy/deploy.js @@ -16,6 +16,8 @@ import React, { Component, PropTypes } from 'react'; +import { api } from '../parity'; + import Container from '../Container'; import styles from './deploy.css'; import layout from '../style.css'; @@ -27,17 +29,23 @@ const ERRORS = { export default class Deploy extends Component { static contextTypes = { - router: PropTypes.object.isRequired + router: PropTypes.object.isRequired, + managerInstance: PropTypes.object.isRequired, + registryInstance: PropTypes.object.isRequired, + tokenregInstance: PropTypes.object.isRequired } state = { deploying: false, + local: true, + fromAddress: null, name: '', nameError: ERRORS.name, tla: '', tlaError: ERRORS.tla, totalSupply: '1000000', - totalSupplyError: null + totalSupplyError: null, + signerRequestId: 0 } render () { @@ -139,13 +147,43 @@ export default class Deploy extends Component { } onDeploy = (event) => { - const { deploying, name, nameError, tla, tlaError, totalSupply, totalSupplyError } = this.state; + const { managerInstance, registryInstance, tokenregInstance } = this.context; + const { deploying, fromAddress, local, fee, name, nameError, tla, tlaError, totalSupply, totalSupplyError } = this.state; const hasError = !!(nameError || tlaError || totalSupplyError); + const tokenreg = local ? registryInstance : tokenregInstance; if (hasError || deploying) { return; } this.setState({ deploying: true }); + + managerInstance + .base.call() + .then((base) => { + console.log(`base value of ${base.toFormat(0)}`); + + const options = { + from: fromAddress, + value: fee + }; + + return managerInstance + .deploy.estimateGas(options, [base.mul(totalSupply), tla, name, tokenreg.address]) + .then((gas) => { + console.log(`gas estimated at ${gas.toFormat(0)}`); + + options.gas = gas.mul(1.2).toFixed(0); + + return managerInstance + .deploy.postTransaction(options, [base.mul(totalSupply), tla, name, tokenreg.address]); + }); + }) + .then((signerRequestId) => { + this.setState({ signerRequestId }); + }) + .catch((error) => { + console.error('onDeploy', error); + }); } } From 21c9723872697c37fdd140b7e1d7a2d936859cf0 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 1 Oct 2016 18:16:45 +0200 Subject: [PATCH 0896/1062] update loading --- js/src/dapps/basiccoin/Application/application.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/js/src/dapps/basiccoin/Application/application.js b/js/src/dapps/basiccoin/Application/application.js index f1cc8398511..423fbfb7245 100644 --- a/js/src/dapps/basiccoin/Application/application.js +++ b/js/src/dapps/basiccoin/Application/application.js @@ -27,7 +27,7 @@ import styles from './application.css'; export default class Application extends Component { static childContextTypes = { - accounts: PropTypes.object, + accounts: PropTypes.array, managerInstance: PropTypes.object, registryInstance: PropTypes.object, tokenregInstance: PropTypes.object @@ -108,6 +108,7 @@ export default class Application extends Component { const tokenregInstance = api.newContract(abis.tokenreg, tokenregAddress).instance; this.setState({ + loading: false, managerInstance, registryInstance, tokenregInstance, From 7d2df3fb842fc71f0e80a94f09834ec2f1ed7b73 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 1 Oct 2016 20:39:19 +0200 Subject: [PATCH 0897/1062] update ABIs to latest deployed versions --- js/src/contracts/abi/eip20.json | 143 +-------- js/src/contracts/abi/gavcoin.json | 281 +--------------- js/src/contracts/abi/owned.json | 46 +-- js/src/contracts/abi/registry.json | 500 +---------------------------- js/src/contracts/abi/tokenreg.json | 349 +------------------- 5 files changed, 5 insertions(+), 1314 deletions(-) diff --git a/js/src/contracts/abi/eip20.json b/js/src/contracts/abi/eip20.json index 8482e2f5a66..23dcd747882 100644 --- a/js/src/contracts/abi/eip20.json +++ b/js/src/contracts/abi/eip20.json @@ -1,142 +1 @@ -[ - { - "constant": false, - "inputs": [ - { - "name": "_spender", - "type": "address" - }, - { - "name": "_value", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "name": "success", - "type": "bool" - } - ], - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_from", - "type": "address" - }, - { - "name": "_to", - "type": "address" - }, - { - "name": "_value", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "name": "success", - "type": "bool" - } - ], - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "_who", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_to", - "type": "address" - }, - { - "name": "_value", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "name": "success", - "type": "bool" - } - ], - "type": "function" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "from", - "type": "address" - }, - { - "indexed": true, - "name": "to", - "type": "address" - }, - { - "indexed": false, - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - } -] +[{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"total","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_spender","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Approval","type":"event"}] diff --git a/js/src/contracts/abi/gavcoin.json b/js/src/contracts/abi/gavcoin.json index f56d8597f41..5170326f5a4 100644 --- a/js/src/contracts/abi/gavcoin.json +++ b/js/src/contracts/abi/gavcoin.json @@ -1,280 +1 @@ -[ - { - "constant": false, - "inputs": [ - { - "name": "_spender", - "type": "address" - }, - { - "name": "_value", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "name": "success", - "type": "bool" - } - ], - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_from", - "type": "address" - }, - { - "name": "_to", - "type": "address" - }, - { - "name": "_value", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "name": "success", - "type": "bool" - } - ], - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_who", - "type": "address" - }, - { - "name": "_maxPrice", - "type": "uint256" - } - ], - "name": "buyin", - "outputs": [], - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "remaining", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_price", - "type": "uint256" - }, - { - "name": "_units", - "type": "uint256" - } - ], - "name": "refund", - "outputs": [ - { - "name": "", - "type": "bool" - } - ], - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "_who", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "price", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_to", - "type": "address" - }, - { - "name": "_value", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "name": "success", - "type": "bool" - } - ], - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "_owner", - "type": "address" - }, - { - "name": "_spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "name": "remaining", - "type": "uint256" - } - ], - "type": "function" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "from", - "type": "address" - }, - { - "indexed": true, - "name": "to", - "type": "address" - }, - { - "indexed": false, - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "buyer", - "type": "address" - }, - { - "indexed": true, - "name": "price", - "type": "uint256" - }, - { - "indexed": true, - "name": "amount", - "type": "uint256" - } - ], - "name": "Buyin", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "buyer", - "type": "address" - }, - { - "indexed": true, - "name": "price", - "type": "uint256" - }, - { - "indexed": true, - "name": "amount", - "type": "uint256" - } - ], - "name": "Refund", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "price", - "type": "uint256" - } - ], - "name": "NewTranch", - "type": "event" - } -] +[{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"_who","type":"address"},{"name":"_maxPrice","type":"uint256"}],"name":"buyin","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"remaining","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_price","type":"uint256"},{"name":"_units","type":"uint256"}],"name":"refund","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"_who","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"price","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"buyer","type":"address"},{"indexed":true,"name":"price","type":"uint256"},{"indexed":true,"name":"amount","type":"uint256"}],"name":"Buyin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"buyer","type":"address"},{"indexed":true,"name":"price","type":"uint256"},{"indexed":true,"name":"amount","type":"uint256"}],"name":"Refund","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"price","type":"uint256"}],"name":"NewTranch","type":"event"}] diff --git a/js/src/contracts/abi/owned.json b/js/src/contracts/abi/owned.json index 79376660dba..ccfeed85d06 100644 --- a/js/src/contracts/abi/owned.json +++ b/js/src/contracts/abi/owned.json @@ -1,45 +1 @@ -[ - { - "constant": false, - "inputs": [ - { - "name": "_new", - "type": "address" - } - ], - "name": "setOwner", - "outputs": [], - "payable": false, - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "owner", - "outputs": [ - { - "name": "", - "type": "address" - } - ], - "payable": false, - "type": "function" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "old", - "type": "address" - }, - { - "indexed": true, - "name": "current", - "type": "address" - } - ], - "name": "NewOwner", - "type": "event" - } -] +[{"constant":false,"inputs":[{"name":"_new","type":"address"}],"name":"setOwner","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"old","type":"address"},{"indexed":true,"name":"current","type":"address"}],"name":"NewOwner","type":"event"}] diff --git a/js/src/contracts/abi/registry.json b/js/src/contracts/abi/registry.json index 11883230d5f..f97dc20c72a 100644 --- a/js/src/contracts/abi/registry.json +++ b/js/src/contracts/abi/registry.json @@ -1,499 +1 @@ -[ - { - "constant": false, - "inputs": [ - { - "name": "_new", - "type": "address" - } - ], - "name": "setOwner", - "outputs": [], - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_name", - "type": "string" - } - ], - "name": "confirmReverse", - "outputs": [ - { - "name": "success", - "type": "bool" - } - ], - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_name", - "type": "bytes32" - } - ], - "name": "reserve", - "outputs": [ - { - "name": "success", - "type": "bool" - } - ], - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_name", - "type": "bytes32" - }, - { - "name": "_key", - "type": "string" - }, - { - "name": "_value", - "type": "bytes32" - } - ], - "name": "set", - "outputs": [ - { - "name": "success", - "type": "bool" - } - ], - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_name", - "type": "bytes32" - } - ], - "name": "drop", - "outputs": [ - { - "name": "success", - "type": "bool" - } - ], - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "_name", - "type": "bytes32" - }, - { - "name": "_key", - "type": "string" - } - ], - "name": "getAddress", - "outputs": [ - { - "name": "", - "type": "address" - } - ], - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_amount", - "type": "uint256" - } - ], - "name": "setFee", - "outputs": [], - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_name", - "type": "bytes32" - }, - { - "name": "_to", - "type": "address" - } - ], - "name": "transfer", - "outputs": [ - { - "name": "success", - "type": "bool" - } - ], - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "owner", - "outputs": [ - { - "name": "", - "type": "address" - } - ], - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "_name", - "type": "bytes32" - } - ], - "name": "reserved", - "outputs": [ - { - "name": "reserved", - "type": "bool" - } - ], - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "drain", - "outputs": [], - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_name", - "type": "string" - }, - { - "name": "_who", - "type": "address" - } - ], - "name": "proposeReverse", - "outputs": [ - { - "name": "success", - "type": "bool" - } - ], - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "_name", - "type": "bytes32" - }, - { - "name": "_key", - "type": "string" - } - ], - "name": "getUint", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "_name", - "type": "bytes32" - }, - { - "name": "_key", - "type": "string" - } - ], - "name": "get", - "outputs": [ - { - "name": "", - "type": "bytes32" - } - ], - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "fee", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "", - "type": "address" - } - ], - "name": "reverse", - "outputs": [ - { - "name": "", - "type": "string" - } - ], - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_name", - "type": "bytes32" - }, - { - "name": "_key", - "type": "string" - }, - { - "name": "_value", - "type": "uint256" - } - ], - "name": "setUint", - "outputs": [ - { - "name": "success", - "type": "bool" - } - ], - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "removeReverse", - "outputs": [], - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "_name", - "type": "bytes32" - }, - { - "name": "_key", - "type": "string" - }, - { - "name": "_value", - "type": "address" - } - ], - "name": "setAddress", - "outputs": [ - { - "name": "success", - "type": "bool" - } - ], - "type": "function" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "name": "amount", - "type": "uint256" - } - ], - "name": "Drained", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "name": "amount", - "type": "uint256" - } - ], - "name": "FeeChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "name", - "type": "bytes32" - }, - { - "indexed": true, - "name": "owner", - "type": "address" - } - ], - "name": "Reserved", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "name", - "type": "bytes32" - }, - { - "indexed": true, - "name": "oldOwner", - "type": "address" - }, - { - "indexed": true, - "name": "newOwner", - "type": "address" - } - ], - "name": "Transferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "name", - "type": "bytes32" - }, - { - "indexed": true, - "name": "owner", - "type": "address" - } - ], - "name": "Dropped", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "name", - "type": "bytes32" - }, - { - "indexed": true, - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "name": "key", - "type": "string" - } - ], - "name": "DataChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "name", - "type": "string" - }, - { - "indexed": true, - "name": "reverse", - "type": "address" - } - ], - "name": "ReverseProposed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "name", - "type": "string" - }, - { - "indexed": true, - "name": "reverse", - "type": "address" - } - ], - "name": "ReverseConfirmed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "name", - "type": "string" - }, - { - "indexed": true, - "name": "reverse", - "type": "address" - } - ], - "name": "ReverseRemoved", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "old", - "type": "address" - }, - { - "indexed": true, - "name": "current", - "type": "address" - } - ], - "name": "NewOwner", - "type": "event" - } -] +[{"constant":false,"inputs":[{"name":"_new","type":"address"}],"name":"setOwner","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"}],"name":"confirmReverse","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"}],"name":"reserve","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_key","type":"string"},{"name":"_value","type":"bytes32"}],"name":"set","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"}],"name":"drop","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_key","type":"string"}],"name":"getAddress","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"setFee","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_to","type":"address"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"reserved","outputs":[{"name":"reserved","type":"bool"}],"type":"function"},{"constant":false,"inputs":[],"name":"drain","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_who","type":"address"}],"name":"proposeReverse","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_key","type":"string"}],"name":"getUint","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_key","type":"string"}],"name":"get","outputs":[{"name":"","type":"bytes32"}],"type":"function"},{"constant":true,"inputs":[],"name":"fee","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"reverse","outputs":[{"name":"","type":"string"}],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_key","type":"string"},{"name":"_value","type":"uint256"}],"name":"setUint","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":false,"inputs":[],"name":"removeReverse","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_key","type":"string"},{"name":"_value","type":"address"}],"name":"setAddress","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"Drained","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"FeeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"bytes32"},{"indexed":true,"name":"owner","type":"address"}],"name":"Reserved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"bytes32"},{"indexed":true,"name":"oldOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"Transferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"bytes32"},{"indexed":true,"name":"owner","type":"address"}],"name":"Dropped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"bytes32"},{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"key","type":"string"},{"indexed":false,"name":"plainKey","type":"string"}],"name":"DataChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"string"},{"indexed":true,"name":"reverse","type":"address"}],"name":"ReverseProposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"string"},{"indexed":true,"name":"reverse","type":"address"}],"name":"ReverseConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"string"},{"indexed":true,"name":"reverse","type":"address"}],"name":"ReverseRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"old","type":"address"},{"indexed":true,"name":"current","type":"address"}],"name":"NewOwner","type":"event"}] diff --git a/js/src/contracts/abi/tokenreg.json b/js/src/contracts/abi/tokenreg.json index 0b258e9caba..e56a13eec48 100644 --- a/js/src/contracts/abi/tokenreg.json +++ b/js/src/contracts/abi/tokenreg.json @@ -1,348 +1 @@ -[ - { - "constant":true, - "inputs":[ - { - "name":"_id", - "type":"uint256" - } - ], - "name":"token", - "outputs":[ - { - "name":"addr", - "type":"address" - }, - { - "name":"tla", - "type":"string" - }, - { - "name":"base", - "type":"uint256" - }, - { - "name":"name", - "type":"string" - }, - { - "name":"owner", - "type":"address" - } - ], - "type":"function" - }, - { - "constant":false, - "inputs":[ - { - "name":"_new", - "type":"address" - } - ], - "name":"setOwner", - "outputs":[ - - ], - "type":"function" - }, - { - "constant":false, - "inputs":[ - { - "name":"_addr", - "type":"address" - }, - { - "name":"_tla", - "type":"string" - }, - { - "name":"_base", - "type":"uint256" - }, - { - "name":"_name", - "type":"string" - } - ], - "name":"register", - "outputs":[ - - ], - "type":"function" - }, - { - "constant":false, - "inputs":[ - { - "name":"_fee", - "type":"uint256" - } - ], - "name":"setFee", - "outputs":[ - - ], - "type":"function" - }, - { - "constant":true, - "inputs":[ - { - "name":"_id", - "type":"uint256" - }, - { - "name":"_key", - "type":"bytes32" - } - ], - "name":"meta", - "outputs":[ - { - "name":"", - "type":"bytes32" - } - ], - "type":"function" - }, - { - "constant":true, - "inputs":[ - { - "name":"_tla", - "type":"string" - } - ], - "name":"fromTLA", - "outputs":[ - { - "name":"id", - "type":"uint256" - }, - { - "name":"addr", - "type":"address" - }, - { - "name":"base", - "type":"uint256" - }, - { - "name":"name", - "type":"string" - }, - { - "name":"owner", - "type":"address" - } - ], - "type":"function" - }, - { - "constant":true, - "inputs":[ - - ], - "name":"owner", - "outputs":[ - { - "name":"", - "type":"address" - } - ], - "type":"function" - }, - { - "constant":false, - "inputs":[ - - ], - "name":"drain", - "outputs":[ - - ], - "type":"function" - }, - { - "constant":true, - "inputs":[ - - ], - "name":"tokenCount", - "outputs":[ - { - "name":"", - "type":"uint256" - } - ], - "type":"function" - }, - { - "constant":false, - "inputs":[ - { - "name":"_id", - "type":"uint256" - } - ], - "name":"unregister", - "outputs":[ - - ], - "type":"function" - }, - { - "constant":true, - "inputs":[ - { - "name":"_addr", - "type":"address" - } - ], - "name":"fromAddress", - "outputs":[ - { - "name":"id", - "type":"uint256" - }, - { - "name":"tla", - "type":"string" - }, - { - "name":"base", - "type":"uint256" - }, - { - "name":"name", - "type":"string" - }, - { - "name":"owner", - "type":"address" - } - ], - "type":"function" - }, - { - "constant":false, - "inputs":[ - { - "name":"_id", - "type":"uint256" - }, - { - "name":"_key", - "type":"bytes32" - }, - { - "name":"_value", - "type":"bytes32" - } - ], - "name":"setMeta", - "outputs":[ - - ], - "type":"function" - }, - { - "constant":true, - "inputs":[ - - ], - "name":"fee", - "outputs":[ - { - "name":"", - "type":"uint256" - } - ], - "type":"function" - }, - { - "anonymous":false, - "inputs":[ - { - "indexed":true, - "name":"tla", - "type":"string" - }, - { - "indexed":true, - "name":"id", - "type":"uint256" - }, - { - "indexed":false, - "name":"addr", - "type":"address" - }, - { - "indexed":false, - "name":"name", - "type":"string" - } - ], - "name":"Registered", - "type":"event" - }, - { - "anonymous":false, - "inputs":[ - { - "indexed":true, - "name":"tla", - "type":"string" - }, - { - "indexed":true, - "name":"id", - "type":"uint256" - } - ], - "name":"Unregistered", - "type":"event" - }, - { - "anonymous":false, - "inputs":[ - { - "indexed":true, - "name":"id", - "type":"uint256" - }, - { - "indexed":true, - "name":"key", - "type":"bytes32" - }, - { - "indexed":false, - "name":"value", - "type":"bytes32" - } - ], - "name":"MetaChanged", - "type":"event" - }, - { - "anonymous":false, - "inputs":[ - { - "indexed":true, - "name":"old", - "type":"address" - }, - { - "indexed":true, - "name":"current", - "type":"address" - } - ], - "name":"NewOwner", - "type":"event" - } -] +[{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"token","outputs":[{"name":"addr","type":"address"},{"name":"tla","type":"string"},{"name":"base","type":"uint256"},{"name":"name","type":"string"},{"name":"owner","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"_new","type":"address"}],"name":"setOwner","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_tla","type":"string"},{"name":"_base","type":"uint256"},{"name":"_name","type":"string"}],"name":"register","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"_fee","type":"uint256"}],"name":"setFee","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"},{"name":"_key","type":"bytes32"}],"name":"meta","outputs":[{"name":"","type":"bytes32"}],"type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_tla","type":"string"},{"name":"_base","type":"uint256"},{"name":"_name","type":"string"},{"name":"_owner","type":"address"}],"name":"registerAs","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"_tla","type":"string"}],"name":"fromTLA","outputs":[{"name":"id","type":"uint256"},{"name":"addr","type":"address"},{"name":"base","type":"uint256"},{"name":"name","type":"string"},{"name":"owner","type":"address"}],"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":false,"inputs":[],"name":"drain","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"tokenCount","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"}],"name":"unregister","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"fromAddress","outputs":[{"name":"id","type":"uint256"},{"name":"tla","type":"string"},{"name":"base","type":"uint256"},{"name":"name","type":"string"},{"name":"owner","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"},{"name":"_key","type":"bytes32"},{"name":"_value","type":"bytes32"}],"name":"setMeta","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"fee","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tla","type":"string"},{"indexed":true,"name":"id","type":"uint256"},{"indexed":false,"name":"addr","type":"address"},{"indexed":false,"name":"name","type":"string"}],"name":"Registered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tla","type":"string"},{"indexed":true,"name":"id","type":"uint256"}],"name":"Unregistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"uint256"},{"indexed":true,"name":"key","type":"bytes32"},{"indexed":false,"name":"value","type":"bytes32"}],"name":"MetaChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"old","type":"address"},{"indexed":true,"name":"current","type":"address"}],"name":"NewOwner","type":"event"}] From bd42517322609ef7f564273a89eb8effbecdeae3 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 1 Oct 2016 22:23:26 +0200 Subject: [PATCH 0898/1062] fixes for non-null returns --- js/src/dapps/tokenreg/Actions/actions.js | 19 +++++++++-------- js/src/dapps/tokenreg/Inputs/validation.js | 24 ++++++++++++++-------- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/js/src/dapps/tokenreg/Actions/actions.js b/js/src/dapps/tokenreg/Actions/actions.js index 9462a02258a..0f3390ea4f5 100644 --- a/js/src/dapps/tokenreg/Actions/actions.js +++ b/js/src/dapps/tokenreg/Actions/actions.js @@ -61,21 +61,24 @@ export const registerToken = (tokenData) => (dispatch, getState) => { .then(() => { return contractInstance .fromTLA.call({}, [ tla ]) - .then((result) => { - throw new Error(`A Token has already been registered with the TLA ${tla}`); - }, () => {}); + .then(([id, address, base, name, owner]) => { + if (owner !== '0x0000000000000000000000000000000000000000') { + throw new Error(`A Token has already been registered with the TLA ${tla}`); + } + }); }) .then(() => { return contractInstance .fromAddress.call({}, [ address ]) - .then((result) => { - throw new Error(`A Token has already been registered with the Address ${address}`); - }, () => {}); + .then(([id, tla, base, name, owner]) => { + if (owner !== '0x0000000000000000000000000000000000000000') { + throw new Error(`A Token has already been registered with the Address ${address}`); + } + }); }) .then(() => { return contractInstance - .register - .estimateGas(options, values); + .register.estimateGas(options, values); }) .then((gasEstimate) => { options.gas = gasEstimate.mul(1.2).toFixed(0); diff --git a/js/src/dapps/tokenreg/Inputs/validation.js b/js/src/dapps/tokenreg/Inputs/validation.js index 4dab7f930ee..b2e0688a89f 100644 --- a/js/src/dapps/tokenreg/Inputs/validation.js +++ b/js/src/dapps/tokenreg/Inputs/validation.js @@ -84,10 +84,14 @@ const validateTokenAddress = (address, contract, simple) => { return contract.instance .fromAddress.call({}, [ address ]) - .then(() => ({ - error: ERRORS.addressAlreadyTaken, - valid: false - }), () => {}); + .then(([id, tla, base, name, owner]) => { + if (owner !== '0x0000000000000000000000000000000000000000') { + return { + error: ERRORS.addressAlreadyTaken, + valid: false + }; + } + }); }) .then((result) => { if (result) return result; @@ -115,10 +119,14 @@ const validateTLA = (tla, contract, simple) => { return contract.instance .fromTLA.call({}, [ fTLA ]) - .then(() => ({ - error: ERRORS.tlaAlreadyTaken, - valid: false - }), () => {}) + .then(([id, address, base, name, owner]) => { + if (owner !== '0x0000000000000000000000000000000000000000') { + return { + error: ERRORS.tlaAlreadyTaken, + valid: false + }; + } + }) .then((result) => { if (result) return result; return { From 32acb02926b1890a341379666613442dd2b83eb9 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 1 Oct 2016 22:34:53 +0200 Subject: [PATCH 0899/1062] adjust registry names --- js/src/dapps/basiccoin/Application/application.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/js/src/dapps/basiccoin/Application/application.js b/js/src/dapps/basiccoin/Application/application.js index 423fbfb7245..665696b237e 100644 --- a/js/src/dapps/basiccoin/Application/application.js +++ b/js/src/dapps/basiccoin/Application/application.js @@ -94,14 +94,14 @@ export default class Application extends Component { return Promise .all([ - registry.getAddress.call({}, [api.util.sha3('basiccoinmanager'), 'A']), - registry.getAddress.call({}, [api.util.sha3('basiccoinregistry'), 'A']), + registry.getAddress.call({}, [api.util.sha3('basiccoinmgr'), 'A']), + registry.getAddress.call({}, [api.util.sha3('basiccoinreg'), 'A']), registry.getAddress.call({}, [api.util.sha3('tokenreg'), 'A']), api.personal.accountsInfo() ]); }) .then(([managerAddress, registryAddress, tokenregAddress, accountsInfo]) => { - console.log(`contracts were found at manager=${managerAddress}, registry=${registryAddress}, tokenreg=${registryAddress}`); + console.log(`contracts were found at basiccoinmgr=${managerAddress}, basiccoinreg=${registryAddress}, tokenreg=${registryAddress}`); const managerInstance = api.newContract(abis.basiccoinmanager, managerAddress).instance; const registryInstance = api.newContract(abis.tokenreg, registryAddress).instance; From 7774b7f47ea9ee5a99b6c41127ecb23299ca7e1a Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 1 Oct 2016 22:36:36 +0200 Subject: [PATCH 0900/1062] signaturereg registered, remove hardcoding --- js/src/contracts/registry.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/js/src/contracts/registry.js b/js/src/contracts/registry.js index c6fb20d553b..09a741683ca 100644 --- a/js/src/contracts/registry.js +++ b/js/src/contracts/registry.js @@ -65,9 +65,6 @@ export default class Registry { const name = _name.toLowerCase(); return this.getInstance().then((instance) => { - if (name === 'signaturereg') { - return '0x15fF40Ceb6092b8EBeD4046E2d4c54e5e4cae458'; - } return instance.getAddress.call({}, [this._api.util.sha3(name), 'A']); }); } From 1461c9c1149ff506f6f5eab0fb1c24a37917fc9d Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 1 Oct 2016 23:41:11 +0200 Subject: [PATCH 0901/1062] expose address on instance --- js/src/api/contract/contract.js | 1 + 1 file changed, 1 insertion(+) diff --git a/js/src/api/contract/contract.js b/js/src/api/contract/contract.js index 739af2aaceb..4402898f03d 100644 --- a/js/src/api/contract/contract.js +++ b/js/src/api/contract/contract.js @@ -65,6 +65,7 @@ export default class Contract { } get instance () { + this._instance.address = this._address; return this._instance; } From f0dafaec42a52e765db3b7aa103a2e54baa9dcf6 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 2 Oct 2016 09:59:28 +0200 Subject: [PATCH 0902/1062] add postcss variables --- js/package.json | 2 ++ js/src/dapps/basiccoin/_vars.css | 21 +++++++++++++++++++++ js/webpack.config.js | 15 ++++++++++++--- 3 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 js/src/dapps/basiccoin/_vars.css diff --git a/js/package.json b/js/package.json index 6a98e9cad2e..4db0b67afa5 100644 --- a/js/package.json +++ b/js/package.json @@ -85,7 +85,9 @@ "mock-local-storage": "1.0.2", "mock-socket": "^3.0.1", "nock": "^8.0.0", + "postcss-import": "^8.1.2", "postcss-loader": "^0.8.1", + "postcss-simple-vars": "^3.0.0", "react-addons-test-utils": "^15.3.0", "react-copy-to-clipboard": "^4.2.3", "react-hot-loader": "^1.3.0", diff --git a/js/src/dapps/basiccoin/_vars.css b/js/src/dapps/basiccoin/_vars.css new file mode 100644 index 00000000000..58db17bf850 --- /dev/null +++ b/js/src/dapps/basiccoin/_vars.css @@ -0,0 +1,21 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +$bgEvents: #808; +$bgDeploy: #088; +$bgOverview: #080; +$bgStatus: $f80; diff --git a/js/webpack.config.js b/js/webpack.config.js index 1547abb4e8c..d369ae3a338 100644 --- a/js/webpack.config.js +++ b/js/webpack.config.js @@ -14,11 +14,12 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . +const HappyPack = require('happypack'); +const path = require('path'); +const postcssImport = require('postcss-import'); +const postcssVars = require('postcss-simple-vars'); const rucksack = require('rucksack-css'); const webpack = require('webpack'); -const path = require('path'); -const HappyPack = require('happypack'); - const WebpackErrorNotificationPlugin = require('webpack-error-notification'); const ENV = process.env.NODE_ENV || 'development'; @@ -108,6 +109,14 @@ module.exports = { fallback: path.join(__dirname, 'node_modules') }, postcss: [ + postcssImport({ + addDependencyTo: webpack + }), + postcssVars({ + unknown: function (node, name, result) { + node.warn(result, `Unknown variable ${name}`); + } + }), rucksack({ autoprefixer: true }) From 7bffe3a88c510b906057d55a2b2710738c5a297b Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 2 Oct 2016 09:59:55 +0200 Subject: [PATCH 0903/1062] deployment estimation in-place --- js/src/dapps/basiccoin/Application/pages.js | 10 ++-- js/src/dapps/basiccoin/Deploy/deploy.css | 6 ++- js/src/dapps/basiccoin/Deploy/deploy.js | 60 +++++++++++++++------ js/src/dapps/basiccoin/style.css | 8 ++- 4 files changed, 59 insertions(+), 25 deletions(-) diff --git a/js/src/dapps/basiccoin/Application/pages.js b/js/src/dapps/basiccoin/Application/pages.js index b43afec0409..2bdb63030a4 100644 --- a/js/src/dapps/basiccoin/Application/pages.js +++ b/js/src/dapps/basiccoin/Application/pages.js @@ -17,32 +17,32 @@ const PAGES = [ { path: 'overview', - color: 'green', + color: '#080', title: 'Overview', byline: 'Display all the current information relating to your own deployed tokens' }, { path: 'send', - color: 'red', + color: '#80f', title: 'Send', byline: 'Send tokens associated with your accounts to other addresses' }, { path: 'events', - color: 'blue', + color: '#808', title: 'Events', byline: 'Track the events for your tokens, showing actions as they hapenned' }, { path: 'deploy', - color: 'purple', + color: '#088', title: 'Deploy', byline: 'Deploy a new token to the network', description: 'Token registration has never been this easy. Select the name for your token, the TLA and the number of tokens in circulation. Start sending the tokens to contacts right from this interface. Optionally you can register the token with the Token Registry which would allow you to transaction in tokens from anywhere these transactions are allowed.' }, { path: 'status', - color: 'orange', + color: '#f80', title: 'Status', byline: 'Show the status of all network tokens deployed with this application' } diff --git a/js/src/dapps/basiccoin/Deploy/deploy.css b/js/src/dapps/basiccoin/Deploy/deploy.css index 175a1596f7d..dfeea5c7253 100644 --- a/js/src/dapps/basiccoin/Deploy/deploy.css +++ b/js/src/dapps/basiccoin/Deploy/deploy.css @@ -15,14 +15,16 @@ /* along with Parity. If not, see . */ +@import '../_vars.css'; + .buttonRow { width: 40em; text-align: right; - padding: 0 3em; + padding: 0 2em; } .button { - background: purple; + background: $bgDeploy; color: white; border: none; border-radius: 1px; diff --git a/js/src/dapps/basiccoin/Deploy/deploy.js b/js/src/dapps/basiccoin/Deploy/deploy.js index 6935b67d637..9c273d6875d 100644 --- a/js/src/dapps/basiccoin/Deploy/deploy.js +++ b/js/src/dapps/basiccoin/Deploy/deploy.js @@ -23,7 +23,7 @@ import styles from './deploy.css'; import layout from '../style.css'; const ERRORS = { - name: 'specify a valid name >3 & <32 characters', + name: 'specify a valid name >2 & <32 characters', tla: 'specify a valid TLA, 3 characters in length' }; @@ -37,8 +37,10 @@ export default class Deploy extends Component { state = { deploying: false, - local: true, - fromAddress: null, + globalReg: false, + globalFee: 0, + globalFeeText: '1.000', + fromAddress: '0x63Cf90D3f0410092FC0fca41846f596223979195', name: '', nameError: ERRORS.name, tla: '', @@ -48,6 +50,16 @@ export default class Deploy extends Component { signerRequestId: 0 } + componentDidMount () { + const { tokenregInstance } = this.context; + + tokenregInstance.fee + .call() + .then((globalFee) => { + this.setState({ globalFee, globalFeeText: api.util.fromWei(globalFee).toFormat(3) }); + }); + } + render () { const { deploying } = this.state; @@ -65,7 +77,7 @@ export default class Deploy extends Component { } renderForm () { - const { name, nameError, tla, tlaError, totalSupply, totalSupplyError } = this.state; + const { globalFeeText, name, nameError, tla, tlaError, totalSupply, totalSupplyError } = this.state; const hasError = !!(nameError || tlaError || totalSupplyError); const error = `${layout.input} ${layout.error}`; @@ -106,6 +118,16 @@ export default class Deploy extends Component { { totalSupplyError || 'The total number of tokens in circulation' }
      +
      + + +
      + register as a network token (fee: { globalFeeText }ETH) +
      +
      { const name = event.target.value; - const nameError = name && (name.length > 3) && (name.length < 32) + const nameError = name && (name.length > 2) && (name.length < 32) ? null : ERRORS.name; this.setState({ name, nameError }); } + onChangeRegistrar = (event) => { + this.setState({ globalReg: event.target.value === 'yes' }); + } + + onChangeSupply = (event) => { + const totalSupply = event.target.value; + + this.setState({ totalSupply }); + } + onChangeTla = (event) => { const _tla = event.target.value; const tla = _tla && (_tla.length > 3) @@ -140,17 +172,11 @@ export default class Deploy extends Component { this.setState({ tla, tlaError }); } - onChangeSupply = (event) => { - const totalSupply = event.target.value; - - this.setState({ totalSupply }); - } - onDeploy = (event) => { const { managerInstance, registryInstance, tokenregInstance } = this.context; - const { deploying, fromAddress, local, fee, name, nameError, tla, tlaError, totalSupply, totalSupplyError } = this.state; + const { deploying, fromAddress, globalReg, globalFee, name, nameError, tla, tlaError, totalSupply, totalSupplyError } = this.state; const hasError = !!(nameError || tlaError || totalSupplyError); - const tokenreg = local ? registryInstance : tokenregInstance; + const tokenreg = globalReg ? tokenregInstance : registryInstance; if (hasError || deploying) { return; @@ -163,20 +189,20 @@ export default class Deploy extends Component { .then((base) => { console.log(`base value of ${base.toFormat(0)}`); + const values = [base.mul(totalSupply), tla, name, tokenreg.address]; const options = { from: fromAddress, - value: fee + value: globalReg ? globalFee : 0 }; return managerInstance - .deploy.estimateGas(options, [base.mul(totalSupply), tla, name, tokenreg.address]) + .deploy.estimateGas(options, values) .then((gas) => { console.log(`gas estimated at ${gas.toFormat(0)}`); options.gas = gas.mul(1.2).toFixed(0); - return managerInstance - .deploy.postTransaction(options, [base.mul(totalSupply), tla, name, tokenreg.address]); + // return managerInstance.deploy.postTransaction(options, values); }); }) .then((signerRequestId) => { diff --git a/js/src/dapps/basiccoin/style.css b/js/src/dapps/basiccoin/style.css index 52f9af07957..4a1adc12942 100644 --- a/js/src/dapps/basiccoin/style.css +++ b/js/src/dapps/basiccoin/style.css @@ -36,11 +36,17 @@ padding: 0.5em 0; } -.form input { +.form input, +.form select { width: 20em; background: rgba(255, 255, 255, 0.25); border-radius: 1px; border: 1px solid rgba(0, 0, 0, 0.25); + box-sizing: border-box; +} + +.form select { + height: 36px; } .form input.small { From 1203695c231527a0d36e5ea155584cf23e35153b Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 2 Oct 2016 10:24:00 +0200 Subject: [PATCH 0904/1062] cleanups, still testing... --- .../basiccoin/Application/application.js | 2 +- js/src/dapps/basiccoin/Deploy/deploy.js | 64 ++++++++++--------- 2 files changed, 35 insertions(+), 31 deletions(-) diff --git a/js/src/dapps/basiccoin/Application/application.js b/js/src/dapps/basiccoin/Application/application.js index 665696b237e..358af32e48f 100644 --- a/js/src/dapps/basiccoin/Application/application.js +++ b/js/src/dapps/basiccoin/Application/application.js @@ -94,7 +94,7 @@ export default class Application extends Component { return Promise .all([ - registry.getAddress.call({}, [api.util.sha3('basiccoinmgr'), 'A']), + registry.getAddress.call({}, [api.util.sha3('playbasiccoinmgr'), 'A']), registry.getAddress.call({}, [api.util.sha3('basiccoinreg'), 'A']), registry.getAddress.call({}, [api.util.sha3('tokenreg'), 'A']), api.personal.accountsInfo() diff --git a/js/src/dapps/basiccoin/Deploy/deploy.js b/js/src/dapps/basiccoin/Deploy/deploy.js index 9c273d6875d..221e16f6d13 100644 --- a/js/src/dapps/basiccoin/Deploy/deploy.js +++ b/js/src/dapps/basiccoin/Deploy/deploy.js @@ -36,6 +36,7 @@ export default class Deploy extends Component { } state = { + base: null, deploying: false, globalReg: false, globalFee: 0, @@ -45,18 +46,27 @@ export default class Deploy extends Component { nameError: ERRORS.name, tla: '', tlaError: ERRORS.tla, - totalSupply: '1000000', + totalSupply: '5000000', totalSupplyError: null, - signerRequestId: 0 + signerRequestId: null, + txHash: null } componentDidMount () { - const { tokenregInstance } = this.context; - - tokenregInstance.fee - .call() - .then((globalFee) => { - this.setState({ globalFee, globalFeeText: api.util.fromWei(globalFee).toFormat(3) }); + const { managerInstance, tokenregInstance } = this.context; + + Promise + .all([ + managerInstance.base.call(), + tokenregInstance.fee.call() + ]) + .then(([base, globalFee]) => { + this.setState({ + base, + baseText: base.toFormat(0), + globalFee, + globalFeeText: api.util.fromWei(globalFee).toFormat(3) + }); }); } @@ -77,7 +87,7 @@ export default class Deploy extends Component { } renderForm () { - const { globalFeeText, name, nameError, tla, tlaError, totalSupply, totalSupplyError } = this.state; + const { baseText, globalFeeText, name, nameError, tla, tlaError, totalSupply, totalSupplyError } = this.state; const hasError = !!(nameError || tlaError || totalSupplyError); const error = `${layout.input} ${layout.error}`; @@ -115,7 +125,7 @@ export default class Deploy extends Component { value={ totalSupply } onChange={ this.onChangeSupply } />
      - { totalSupplyError || 'The total number of tokens in circulation' } + { totalSupplyError || `number of tokens in circulation (base: ${baseText})` }
      @@ -172,11 +182,10 @@ export default class Deploy extends Component { this.setState({ tla, tlaError }); } - onDeploy = (event) => { + onDeploy = () => { const { managerInstance, registryInstance, tokenregInstance } = this.context; - const { deploying, fromAddress, globalReg, globalFee, name, nameError, tla, tlaError, totalSupply, totalSupplyError } = this.state; + const { base, deploying, fromAddress, globalReg, globalFee, name, nameError, tla, tlaError, totalSupply, totalSupplyError } = this.state; const hasError = !!(nameError || tlaError || totalSupplyError); - const tokenreg = globalReg ? tokenregInstance : registryInstance; if (hasError || deploying) { return; @@ -184,26 +193,21 @@ export default class Deploy extends Component { this.setState({ deploying: true }); - managerInstance - .base.call() - .then((base) => { - console.log(`base value of ${base.toFormat(0)}`); - - const values = [base.mul(totalSupply), tla, name, tokenreg.address]; - const options = { - from: fromAddress, - value: globalReg ? globalFee : 0 - }; + const tokenreg = (globalReg ? tokenregInstance : registryInstance).address; + const values = [base.mul(totalSupply), tla, name, tokenreg]; + const options = { + from: fromAddress, + value: globalReg ? globalFee : 0 + }; - return managerInstance - .deploy.estimateGas(options, values) - .then((gas) => { - console.log(`gas estimated at ${gas.toFormat(0)}`); + managerInstance + .deploy.estimateGas(options, values) + .then((gas) => { + console.log(`gas estimated at ${gas.toFormat(0)}`); - options.gas = gas.mul(1.2).toFixed(0); + options.gas = gas.mul(1.2).toFixed(0); - // return managerInstance.deploy.postTransaction(options, values); - }); + // return managerInstance.deploy.postTransaction(options, values); }) .then((signerRequestId) => { this.setState({ signerRequestId }); From 92d21e04ef5e5d55255b815f69a3f19f6baa989f Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 2 Oct 2016 12:07:18 +0200 Subject: [PATCH 0905/1062] update with new event definition --- js/src/contracts/abi/basiccoinmanager.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/contracts/abi/basiccoinmanager.json b/js/src/contracts/abi/basiccoinmanager.json index b72d3b00c64..cafe09735c6 100644 --- a/js/src/contracts/abi/basiccoinmanager.json +++ b/js/src/contracts/abi/basiccoinmanager.json @@ -1 +1 @@ -[{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"countByOwner","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"count","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_new","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"base","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"get","outputs":[{"name":"coin","type":"address"},{"name":"owner","type":"address"},{"name":"tokenreg","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"drain","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_totalSupply","type":"uint256"},{"name":"_tla","type":"string"},{"name":"_name","type":"string"},{"name":"_tokenreg","type":"address"}],"name":"deploy","outputs":[{"name":"","type":"bool"}],"payable":true,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"getByOwner","outputs":[{"name":"coin","type":"address"},{"name":"owner","type":"address"},{"name":"tokenreg","type":"address"}],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"tokenreg","type":"address"},{"indexed":false,"name":"coin","type":"address"},{"indexed":false,"name":"tla","type":"string"},{"indexed":false,"name":"name","type":"string"}],"name":"Created","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"old","type":"address"},{"indexed":true,"name":"current","type":"address"}],"name":"NewOwner","type":"event"}] +[{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"countByOwner","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"count","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_new","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"base","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"get","outputs":[{"name":"coin","type":"address"},{"name":"owner","type":"address"},{"name":"tokenreg","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"drain","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_totalSupply","type":"uint256"},{"name":"_tla","type":"string"},{"name":"_name","type":"string"},{"name":"_tokenreg","type":"address"}],"name":"deploy","outputs":[{"name":"","type":"bool"}],"payable":true,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"getByOwner","outputs":[{"name":"coin","type":"address"},{"name":"owner","type":"address"},{"name":"tokenreg","type":"address"}],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"tokenreg","type":"address"},{"indexed":true,"name":"coin","type":"address"}],"name":"Created","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"old","type":"address"},{"indexed":true,"name":"current","type":"address"}],"name":"NewOwner","type":"event"}] From 08364ad0ec555b9b3c9a47ddc8b2d4dc0c15b207 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 2 Oct 2016 18:57:53 +0200 Subject: [PATCH 0906/1062] deployment in place --- js/src/dapps/basiccoin/Deploy/deploy.css | 24 +++++++ js/src/dapps/basiccoin/Deploy/deploy.js | 80 ++++++++++++++++++++---- js/src/dapps/basiccoin/_vars.css | 2 +- 3 files changed, 93 insertions(+), 13 deletions(-) diff --git a/js/src/dapps/basiccoin/Deploy/deploy.css b/js/src/dapps/basiccoin/Deploy/deploy.css index dfeea5c7253..d4d6d78eeb6 100644 --- a/js/src/dapps/basiccoin/Deploy/deploy.css +++ b/js/src/dapps/basiccoin/Deploy/deploy.css @@ -17,6 +17,11 @@ @import '../_vars.css'; +a.link, a.link:hover, a.link:visited { + color: $bgDeploy; + cursor: pointer; +} + .buttonRow { width: 40em; text-align: right; @@ -38,3 +43,22 @@ opacity: 0.5; cursor: default; } + +.statusHeader { + font-size: 1.25em; + margin-bottom: 0.25em; +} + +.statusInfo { + margin-bottom: 0.25em; +} + +.statusState { + opacity: 0.75; + margin-top: 1em; +} + +.statusError { + color: red; + margin-top: 1em; +} diff --git a/js/src/dapps/basiccoin/Deploy/deploy.js b/js/src/dapps/basiccoin/Deploy/deploy.js index 221e16f6d13..49d06ff3231 100644 --- a/js/src/dapps/basiccoin/Deploy/deploy.js +++ b/js/src/dapps/basiccoin/Deploy/deploy.js @@ -37,7 +37,10 @@ export default class Deploy extends Component { state = { base: null, - deploying: false, + deployBusy: false, + deployDone: false, + deployError: null, + deployState: null, globalReg: false, globalFee: 0, globalFeeText: '1.000', @@ -71,17 +74,50 @@ export default class Deploy extends Component { } render () { - const { deploying } = this.state; + const { deployBusy } = this.state; - return deploying + return deployBusy ? this.renderDeploying() : this.renderForm(); } renderDeploying () { + const { deployDone, deployError, deployState } = this.state; + + if (deployDone) { + return ( + +
      + Your token has been deployed +
      +
      + Start sending tokens or view information relating to this and any of your other tokens. +
      +
      + { deployState } +
      +
      + ); + } + + let error = null; + if (deployError) { + error = ( +
      + { deployError } +
      + ); + } + return ( - Your token is currently being deployed to the network +
      + Your token is currently being deployed to the network +
      +
      + { deployState } +
      + { error }
      ); } @@ -184,36 +220,56 @@ export default class Deploy extends Component { onDeploy = () => { const { managerInstance, registryInstance, tokenregInstance } = this.context; - const { base, deploying, fromAddress, globalReg, globalFee, name, nameError, tla, tlaError, totalSupply, totalSupplyError } = this.state; + const { base, deployBusy, fromAddress, globalReg, globalFee, name, nameError, tla, tlaError, totalSupply, totalSupplyError } = this.state; const hasError = !!(nameError || tlaError || totalSupplyError); - if (hasError || deploying) { + if (hasError || deployBusy) { return; } - this.setState({ deploying: true }); - const tokenreg = (globalReg ? tokenregInstance : registryInstance).address; const values = [base.mul(totalSupply), tla, name, tokenreg]; + let gasPassed = 0; const options = { from: fromAddress, value: globalReg ? globalFee : 0 }; + this.setState({ deployBusy: true, deployState: 'Estimating gas for the transaction' }); + managerInstance .deploy.estimateGas(options, values) .then((gas) => { - console.log(`gas estimated at ${gas.toFormat(0)}`); + this.setState({ deployState: 'Gas estimated, Posting transaction to the network' }); - options.gas = gas.mul(1.2).toFixed(0); + gasPassed = gas.mul(1.2); + options.gas = gasPassed.toFixed(0); + console.log(`gas estimated at ${gas.toFormat(0)}, passing ${gasPassed.toFormat(0)}`); - // return managerInstance.deploy.postTransaction(options, values); + return managerInstance.deploy.postTransaction(options, values); }) .then((signerRequestId) => { - this.setState({ signerRequestId }); + this.setState({ signerRequestId, deployState: 'Transaction posted, Waiting for transaction authorization' }); + + return api.pollMethod('eth_checkRequest', signerRequestId); + }) + .then((txHash) => { + this.setState({ txHash, deployState: 'Transaction authorized, Waiting for network confirmations' }); + + return api.pollMethod('eth_getTransactionReceipt', txHash, (receipt) => { + if (!receipt || !receipt.blockNumber || receipt.blockNumber.eq(0)) { + return false; + } + + return true; + }); + }) + .then((txReceipt) => { + this.setState({ txReceipt, deployDone: true, deployState: 'Network confirmed, Received transaction receipt' }); }) .catch((error) => { console.error('onDeploy', error); + this.setState({ deployError: error.message }); }); } } diff --git a/js/src/dapps/basiccoin/_vars.css b/js/src/dapps/basiccoin/_vars.css index 58db17bf850..0ea565afdb8 100644 --- a/js/src/dapps/basiccoin/_vars.css +++ b/js/src/dapps/basiccoin/_vars.css @@ -18,4 +18,4 @@ $bgEvents: #808; $bgDeploy: #088; $bgOverview: #080; -$bgStatus: $f80; +$bgStatus: #f80; From 62e038364612a3a99c7294a495a7c141c5920e81 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 2 Oct 2016 20:47:35 +0200 Subject: [PATCH 0907/1062] basic event display (Created) --- js/src/dapps/basiccoin/Events/Event/event.css | 45 +++++++ js/src/dapps/basiccoin/Events/Event/event.js | 97 ++++++++++++++ js/src/dapps/basiccoin/Events/Event/index.js | 17 +++ js/src/dapps/basiccoin/Events/events.css | 32 +++++ js/src/dapps/basiccoin/Events/events.js | 120 +++++++++++++++++- 5 files changed, 309 insertions(+), 2 deletions(-) create mode 100644 js/src/dapps/basiccoin/Events/Event/event.css create mode 100644 js/src/dapps/basiccoin/Events/Event/event.js create mode 100644 js/src/dapps/basiccoin/Events/Event/index.js create mode 100644 js/src/dapps/basiccoin/Events/events.css diff --git a/js/src/dapps/basiccoin/Events/Event/event.css b/js/src/dapps/basiccoin/Events/Event/event.css new file mode 100644 index 00000000000..823dc2b079f --- /dev/null +++ b/js/src/dapps/basiccoin/Events/Event/event.css @@ -0,0 +1,45 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.mined { +} + +.pending { + opacity: 0.5; +} + +.mined td, +.pending td { + padding: 0.5em 1em; +} + +.mined td>div+div, +.pending td>div+div { + margin-top: 0.25em; +} + +.blocknumber { + text-align: right; +} + +.frominfo { + text-align: left; +} + +.description { + text-align: left; +} diff --git a/js/src/dapps/basiccoin/Events/Event/event.js b/js/src/dapps/basiccoin/Events/Event/event.js new file mode 100644 index 00000000000..757c2c998e4 --- /dev/null +++ b/js/src/dapps/basiccoin/Events/Event/event.js @@ -0,0 +1,97 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import moment from 'moment'; +import React, { Component, PropTypes } from 'react'; + +import { api } from '../../parity'; + +import styles from './event.css'; + +export default class Event extends Component { + static contextTypes = { + registryInstance: PropTypes.object.isRequired, + tokenregInstance: PropTypes.object.isRequired + } + + static propTypes = { + event: PropTypes.object.isRequired + } + + state = { + block: null, + coin: {} + } + + componentDidMount () { + const { event } = this.props; + const { registryInstance, tokenregInstance } = this.context; + + if (event.type === 'pending') { + return; + } + + const registry = event.params.tokenreg === tokenregInstance.address + ? tokenregInstance + : registryInstance; + + Promise + .all([ + api.eth.getBlockByNumber(event.blockNumber), + registry.fromAddress.call({}, [event.params.coin]) + ]) + .then(([block, coin]) => { + const [id, tla, base, name, owner] = coin; + + this.setState({ + block, + coin: { id, tla, base, name, owner } + }); + }); + } + + render () { + const { event } = this.props; + const { block, coin } = this.state; + const isPending = event.type === 'pending'; + + return ( + + +
      { (isPending || !block) ? '' : moment(block.timestamp).fromNow() }
      +
      { isPending ? 'Pending' : event.blockNumber.toFormat() }
      + + { event.event } + +
      { this.renderAddress(event.params.owner) }
      +
      { this.renderHash(event.transactionHash) }
      + + +
      { isPending ? '' : coin.tla }
      +
      { isPending ? '' : coin.name }
      + + + ); + } + + renderAddress (address) { + return address; + } + + renderHash (hash) { + return `${hash.substr(0, 10)}...${hash.slice(-10)}`; + } +} diff --git a/js/src/dapps/basiccoin/Events/Event/index.js b/js/src/dapps/basiccoin/Events/Event/index.js new file mode 100644 index 00000000000..0925882d3e3 --- /dev/null +++ b/js/src/dapps/basiccoin/Events/Event/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './event'; diff --git a/js/src/dapps/basiccoin/Events/events.css b/js/src/dapps/basiccoin/Events/events.css new file mode 100644 index 00000000000..0b7bde7b7d6 --- /dev/null +++ b/js/src/dapps/basiccoin/Events/events.css @@ -0,0 +1,32 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +@import '../_vars.css'; + +a.link, a.link:hover, a.link:visited { + color: $bgEvents; + cursor: pointer; +} + +.statusHeader { + font-size: 1.25em; +} + +.eventList { + border: none; + margin: 0 auto; +} diff --git a/js/src/dapps/basiccoin/Events/events.js b/js/src/dapps/basiccoin/Events/events.js index 4748da24a08..fff264644c6 100644 --- a/js/src/dapps/basiccoin/Events/events.js +++ b/js/src/dapps/basiccoin/Events/events.js @@ -14,14 +14,130 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -import React, { Component } from 'react'; +import React, { Component, PropTypes } from 'react'; +import { api } from '../parity'; import Container from '../Container'; +import Event from './Event'; + +import styles from './events.css'; export default class Events extends Component { + static contextTypes = { + managerInstance: PropTypes.object.isRequired + } + + state = { + blocks: {}, + loading: true, + events: [], + minedEvents: [], + pendingEvents: [] + } + + componentDidMount () { + const { managerInstance } = this.context; + const options = { + fromBlock: 0, + toBlock: 'pending', + limit: 50 + }; + + managerInstance.Created + .subscribe(options, this.receiveCreatedEvents) + .then((subscriptionIdCreated) => { + this.setState({ subscriptionIdCreated }); + }); + } + + componentWillUnmount () { + const { managerInstance } = this.context; + const { subscriptionIdCreated } = this.state; + + managerInstance.Created.unsubscribe(subscriptionIdCreated); + } + render () { + const { loading } = this.state; + + return ( + + { loading ? this.renderLoading() : this.renderEvents() } + + ); + } + + renderEvents () { + const { events } = this.state; + + return events.length + ? this.renderEventsList() + : this.renderEventsNone(); + } + + renderEventsNone () { + return ( +
      + There are currently no events available +
      + ); + } + + renderEventsList () { + const { events } = this.state; + const rows = events.map((event) => { + return ( + + ); + }); + + return ( + + + { rows } + +
      + ); + } + + renderLoading () { return ( - +
      + Loading events +
      ); } + + logToEvent = (log) => { + log.key = api.util.sha3(JSON.stringify(log)); + + return log; + } + + receiveCreatedEvents = (error, logs) => { + if (error) { + console.error('receiveLogs', error); + return; + } + + const { minedEvents, pendingEvents } = this.state; + + const minedNew = logs + .filter((log) => log.type === 'mined') + .map(this.logToEvent) + .filter((log) => !minedEvents.find((event) => event.transactionHash === log.transactionHash)) + .reverse() + .concat(minedEvents); + const pendingNew = logs + .filter((log) => log.type === 'pending') + .map(this.logToEvent) + .filter((log) => !pendingEvents.find((event) => event.transactionHash === log.transactionHash)) + .reverse() + .concat(pendingEvents) + .filter((log) => !minedNew.find((event) => event.transactionHash === log.transactionHash)); + const events = [].concat(pendingNew).concat(minedNew); + + console.log(logs); + this.setState({ loading: false, events, minedEvents: minedNew, pendingEvents: pendingNew }); + } } From fe9c2058fe683adcc10309bc8d3bf069e955a0e9 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 2 Oct 2016 21:03:37 +0200 Subject: [PATCH 0908/1062] deployment events are working --- js/src/dapps/basiccoin.js | 4 +- js/src/dapps/basiccoin/Application/pages.js | 7 +- js/src/dapps/basiccoin/Deploy/deploy.js | 2 +- .../{Events => Deployments}/Event/event.css | 0 .../{Events => Deployments}/Event/event.js | 6 +- .../{Events => Deployments}/Event/index.js | 0 .../deployments.css} | 2 +- .../basiccoin/Deployments/deployments.js | 143 ++++++++++++++++++ .../{Status => Deployments}/index.js | 2 +- js/src/dapps/basiccoin/Events/events.js | 122 +-------------- js/src/dapps/basiccoin/Status/status.js | 27 ---- js/src/dapps/basiccoin/_vars.css | 2 +- 12 files changed, 160 insertions(+), 157 deletions(-) rename js/src/dapps/basiccoin/{Events => Deployments}/Event/event.css (100%) rename js/src/dapps/basiccoin/{Events => Deployments}/Event/event.js (92%) rename js/src/dapps/basiccoin/{Events => Deployments}/Event/index.js (100%) rename js/src/dapps/basiccoin/{Events/events.css => Deployments/deployments.css} (97%) create mode 100644 js/src/dapps/basiccoin/Deployments/deployments.js rename js/src/dapps/basiccoin/{Status => Deployments}/index.js (94%) delete mode 100644 js/src/dapps/basiccoin/Status/status.js diff --git a/js/src/dapps/basiccoin.js b/js/src/dapps/basiccoin.js index ca9ea4d17f7..e167a880317 100644 --- a/js/src/dapps/basiccoin.js +++ b/js/src/dapps/basiccoin.js @@ -23,11 +23,11 @@ import injectTapEventPlugin from 'react-tap-event-plugin'; injectTapEventPlugin(); import Deploy from './basiccoin/Deploy'; +import Deployments from './basiccoin/Deployments'; import Events from './basiccoin/Events'; import Application from './basiccoin/Application'; import Overview from './basiccoin/Overview'; import Send from './basiccoin/Send'; -import Status from './basiccoin/Status'; const routerHistory = useRouterHistory(createHashHistory)({}); @@ -39,10 +39,10 @@ ReactDOM.render( + - , document.querySelector('#container') diff --git a/js/src/dapps/basiccoin/Application/pages.js b/js/src/dapps/basiccoin/Application/pages.js index 2bdb63030a4..b9c6e446d61 100644 --- a/js/src/dapps/basiccoin/Application/pages.js +++ b/js/src/dapps/basiccoin/Application/pages.js @@ -41,10 +41,11 @@ const PAGES = [ description: 'Token registration has never been this easy. Select the name for your token, the TLA and the number of tokens in circulation. Start sending the tokens to contacts right from this interface. Optionally you can register the token with the Token Registry which would allow you to transaction in tokens from anywhere these transactions are allowed.' }, { - path: 'status', + path: 'deployments', color: '#f80', - title: 'Status', - byline: 'Show the status of all network tokens deployed with this application' + title: 'Deployments', + byline: 'Show the status of all network tokens deployed with this application', + description: 'Showing all the token creation events, both for your tokens and tokens created by others on the network. This includes when, by whom, name & TLA as well as the global and local network status.' } ]; diff --git a/js/src/dapps/basiccoin/Deploy/deploy.js b/js/src/dapps/basiccoin/Deploy/deploy.js index 49d06ff3231..22a3156cde9 100644 --- a/js/src/dapps/basiccoin/Deploy/deploy.js +++ b/js/src/dapps/basiccoin/Deploy/deploy.js @@ -91,7 +91,7 @@ export default class Deploy extends Component { Your token has been deployed
      - Start sending tokens or view information relating to this and any of your other tokens. + Start sending tokens or view information relating to this and any of your other tokens. In addition, you can view the deployment along with others.
      { deployState } diff --git a/js/src/dapps/basiccoin/Events/Event/event.css b/js/src/dapps/basiccoin/Deployments/Event/event.css similarity index 100% rename from js/src/dapps/basiccoin/Events/Event/event.css rename to js/src/dapps/basiccoin/Deployments/Event/event.css diff --git a/js/src/dapps/basiccoin/Events/Event/event.js b/js/src/dapps/basiccoin/Deployments/Event/event.js similarity index 92% rename from js/src/dapps/basiccoin/Events/Event/event.js rename to js/src/dapps/basiccoin/Deployments/Event/event.js index 757c2c998e4..9a0982cf7ea 100644 --- a/js/src/dapps/basiccoin/Events/Event/event.js +++ b/js/src/dapps/basiccoin/Deployments/Event/event.js @@ -44,7 +44,8 @@ export default class Event extends Component { return; } - const registry = event.params.tokenreg === tokenregInstance.address + const isGlobal = event.params.tokenreg === tokenregInstance.address; + const registry = isGlobal ? tokenregInstance : registryInstance; @@ -58,7 +59,7 @@ export default class Event extends Component { this.setState({ block, - coin: { id, tla, base, name, owner } + coin: { id, tla, base, name, owner, isGlobal } }); }); } @@ -83,6 +84,7 @@ export default class Event extends Component {
      { isPending ? '' : coin.tla }
      { isPending ? '' : coin.name }
      + { isPending || !coin.isGlobal ? '' : 'global' } ); } diff --git a/js/src/dapps/basiccoin/Events/Event/index.js b/js/src/dapps/basiccoin/Deployments/Event/index.js similarity index 100% rename from js/src/dapps/basiccoin/Events/Event/index.js rename to js/src/dapps/basiccoin/Deployments/Event/index.js diff --git a/js/src/dapps/basiccoin/Events/events.css b/js/src/dapps/basiccoin/Deployments/deployments.css similarity index 97% rename from js/src/dapps/basiccoin/Events/events.css rename to js/src/dapps/basiccoin/Deployments/deployments.css index 0b7bde7b7d6..c23352732a2 100644 --- a/js/src/dapps/basiccoin/Events/events.css +++ b/js/src/dapps/basiccoin/Deployments/deployments.css @@ -18,7 +18,7 @@ @import '../_vars.css'; a.link, a.link:hover, a.link:visited { - color: $bgEvents; + color: $bgDeployments; cursor: pointer; } diff --git a/js/src/dapps/basiccoin/Deployments/deployments.js b/js/src/dapps/basiccoin/Deployments/deployments.js new file mode 100644 index 00000000000..7ebe5a03f42 --- /dev/null +++ b/js/src/dapps/basiccoin/Deployments/deployments.js @@ -0,0 +1,143 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import { api } from '../parity'; +import Container from '../Container'; +import Event from './Event'; + +import styles from './deployments.css'; + +export default class Deployments extends Component { + static contextTypes = { + managerInstance: PropTypes.object.isRequired + } + + state = { + blocks: {}, + loading: true, + events: [], + minedEvents: [], + pendingEvents: [] + } + + componentDidMount () { + const { managerInstance } = this.context; + const options = { + fromBlock: 0, + toBlock: 'pending', + limit: 50 + }; + + managerInstance.Created + .subscribe(options, this.receiveCreatedEvents) + .then((subscriptionIdCreated) => { + this.setState({ subscriptionIdCreated }); + }); + } + + componentWillUnmount () { + const { managerInstance } = this.context; + const { subscriptionIdCreated } = this.state; + + managerInstance.Created.unsubscribe(subscriptionIdCreated); + } + + render () { + const { loading } = this.state; + + return ( + + { loading ? this.renderLoading() : this.renderEvents() } + + ); + } + + renderEvents () { + const { events } = this.state; + + return events.length + ? this.renderEventsList() + : this.renderEventsNone(); + } + + renderEventsNone () { + return ( +
      + There are currently no events available +
      + ); + } + + renderEventsList () { + const { events } = this.state; + const rows = events.map((event) => { + return ( + + ); + }); + + return ( + + + { rows } + +
      + ); + } + + renderLoading () { + return ( +
      + Loading events +
      + ); + } + + logToEvent = (log) => { + log.key = api.util.sha3(JSON.stringify(log)); + + return log; + } + + receiveCreatedEvents = (error, logs) => { + if (error) { + console.error('receiveLogs', error); + return; + } + + const { minedEvents, pendingEvents } = this.state; + + const minedNew = logs + .filter((log) => log.type === 'mined') + .map(this.logToEvent) + .filter((log) => !minedEvents.find((event) => event.transactionHash === log.transactionHash)) + .reverse() + .concat(minedEvents); + const pendingNew = logs + .filter((log) => log.type === 'pending') + .map(this.logToEvent) + .filter((log) => !pendingEvents.find((event) => event.transactionHash === log.transactionHash)) + .reverse() + .concat(pendingEvents) + .filter((log) => !minedNew.find((event) => event.transactionHash === log.transactionHash)); + const events = [].concat(pendingNew).concat(minedNew); + + console.log(logs); + this.setState({ loading: false, events, minedEvents: minedNew, pendingEvents: pendingNew }); + } +} diff --git a/js/src/dapps/basiccoin/Status/index.js b/js/src/dapps/basiccoin/Deployments/index.js similarity index 94% rename from js/src/dapps/basiccoin/Status/index.js rename to js/src/dapps/basiccoin/Deployments/index.js index 44079b22485..089378dd7ed 100644 --- a/js/src/dapps/basiccoin/Status/index.js +++ b/js/src/dapps/basiccoin/Deployments/index.js @@ -14,4 +14,4 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -export default from './status'; +export default from './deployments'; diff --git a/js/src/dapps/basiccoin/Events/events.js b/js/src/dapps/basiccoin/Events/events.js index fff264644c6..4ccb8bb6e17 100644 --- a/js/src/dapps/basiccoin/Events/events.js +++ b/js/src/dapps/basiccoin/Events/events.js @@ -14,130 +14,14 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -import React, { Component, PropTypes } from 'react'; +import React, { Component } from 'react'; -import { api } from '../parity'; import Container from '../Container'; -import Event from './Event'; - -import styles from './events.css'; - -export default class Events extends Component { - static contextTypes = { - managerInstance: PropTypes.object.isRequired - } - - state = { - blocks: {}, - loading: true, - events: [], - minedEvents: [], - pendingEvents: [] - } - - componentDidMount () { - const { managerInstance } = this.context; - const options = { - fromBlock: 0, - toBlock: 'pending', - limit: 50 - }; - - managerInstance.Created - .subscribe(options, this.receiveCreatedEvents) - .then((subscriptionIdCreated) => { - this.setState({ subscriptionIdCreated }); - }); - } - - componentWillUnmount () { - const { managerInstance } = this.context; - const { subscriptionIdCreated } = this.state; - - managerInstance.Created.unsubscribe(subscriptionIdCreated); - } +export default class Deploy extends Component { render () { - const { loading } = this.state; - - return ( - - { loading ? this.renderLoading() : this.renderEvents() } - - ); - } - - renderEvents () { - const { events } = this.state; - - return events.length - ? this.renderEventsList() - : this.renderEventsNone(); - } - - renderEventsNone () { - return ( -
      - There are currently no events available -
      - ); - } - - renderEventsList () { - const { events } = this.state; - const rows = events.map((event) => { - return ( - - ); - }); - - return ( - - - { rows } - -
      - ); - } - - renderLoading () { return ( -
      - Loading events -
      + ); } - - logToEvent = (log) => { - log.key = api.util.sha3(JSON.stringify(log)); - - return log; - } - - receiveCreatedEvents = (error, logs) => { - if (error) { - console.error('receiveLogs', error); - return; - } - - const { minedEvents, pendingEvents } = this.state; - - const minedNew = logs - .filter((log) => log.type === 'mined') - .map(this.logToEvent) - .filter((log) => !minedEvents.find((event) => event.transactionHash === log.transactionHash)) - .reverse() - .concat(minedEvents); - const pendingNew = logs - .filter((log) => log.type === 'pending') - .map(this.logToEvent) - .filter((log) => !pendingEvents.find((event) => event.transactionHash === log.transactionHash)) - .reverse() - .concat(pendingEvents) - .filter((log) => !minedNew.find((event) => event.transactionHash === log.transactionHash)); - const events = [].concat(pendingNew).concat(minedNew); - - console.log(logs); - this.setState({ loading: false, events, minedEvents: minedNew, pendingEvents: pendingNew }); - } } diff --git a/js/src/dapps/basiccoin/Status/status.js b/js/src/dapps/basiccoin/Status/status.js deleted file mode 100644 index 4ccb8bb6e17..00000000000 --- a/js/src/dapps/basiccoin/Status/status.js +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -import React, { Component } from 'react'; - -import Container from '../Container'; - -export default class Deploy extends Component { - render () { - return ( - - ); - } -} diff --git a/js/src/dapps/basiccoin/_vars.css b/js/src/dapps/basiccoin/_vars.css index 0ea565afdb8..ebfc9076b32 100644 --- a/js/src/dapps/basiccoin/_vars.css +++ b/js/src/dapps/basiccoin/_vars.css @@ -18,4 +18,4 @@ $bgEvents: #808; $bgDeploy: #088; $bgOverview: #080; -$bgStatus: #f80; +$bgDeployments: #f80; From 2b1fcd51bc9481356a77d6b1fc647444c4c8e1c3 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 2 Oct 2016 21:13:05 +0200 Subject: [PATCH 0909/1062] unused file --- js/src/dapps/basiccoin/services.js | 173 ----------------------------- 1 file changed, 173 deletions(-) delete mode 100644 js/src/dapps/basiccoin/services.js diff --git a/js/src/dapps/basiccoin/services.js b/js/src/dapps/basiccoin/services.js deleted file mode 100644 index 2ad03264c3b..00000000000 --- a/js/src/dapps/basiccoin/services.js +++ /dev/null @@ -1,173 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -import * as abis from '../../contracts/abi'; -import { api } from './parity'; - -const sortEvents = (a, b) => b.blockNumber.cmp(a.blockNumber) || b.logIndex.cmp(a.logIndex); - -const logToEvent = (log) => { - const key = api.util.sha3(JSON.stringify(log)); - const { blockNumber, logIndex, transactionHash, transactionIndex, params, type } = log; - - return { - type: log.event, - state: type, - blockNumber, - logIndex, - transactionHash, - transactionIndex, - params, - key - }; -}; - -export function attachInterface (callback) { - return api.ethcore - .registryAddress() - .then((registryAddress) => { - console.log(`the registry was found at ${registryAddress}`); - - const registry = api.newContract(abis.registry, registryAddress).instance; - - return Promise - .all([ - registry.getAddress.call({}, [api.util.sha3('tokendeploy'), 'A']), - api.personal.listAccounts(), - api.personal.accountsInfo() - ]); - }) - .then(([address, addresses, accountsInfo]) => { - console.log(`tokendeploy was found at ${address}`); - address = '0x15fF40Ceb6092b8EBeD4046E2d4c54e5e4cae458'; - - const contract = api.newContract(abis.signaturereg, address); - const accounts = addresses.reduce((obj, address) => { - const info = accountsInfo[address]; - - return Object.assign(obj, { - [address]: { - address, - name: info.name || 'Unnamed', - uuid: info.uuid - } - }); - }, {}); - const fromAddress = Object.keys(accounts)[0]; - - return { - accounts, - address, - accountsInfo, - contract, - instance: contract.instance, - fromAddress - }; - }) - .catch((error) => { - console.error('attachInterface', error); - }); -} - -export function attachBlockNumber (instance, callback) { - return api.subscribe('eth_blockNumber', (error, blockNumber) => { - if (error) { - console.error('blockNumber', error); - return; - } - - instance.totalSignatures - .call() - .then((totalSignatures) => { - callback({ - blockNumber, - totalSignatures - }); - }) - .catch((error) => { - console.error('totalSignatures', error); - }); - }); -} - -export function attachEvents (contract, callback) { - const blocks = { '0': {} }; - let mined = []; - let pending = []; - let events = []; - - const options = { - fromBlock: 0, - toBlock: 'pending', - limit: 50 - }; - - return contract.subscribe('Registered', options, (error, _logs) => { - if (error) { - console.error('events', error); - return; - } - - const logs = _logs.map(logToEvent); - - mined = logs - .filter((log) => log.state === 'mined') - .map((log) => { - const blockNumber = log.blockNumber.toString(); - - if (!blocks[blockNumber]) { - blocks[blockNumber] = {}; - getBlock(blockNumber).then((block) => { - Object.assign(blocks[blockNumber], block); - }); - } - - return Object.assign(log, { block: blocks[blockNumber] }); - }) - .reverse() - .concat(mined) - .sort(sortEvents); - - pending = logs - .filter((log) => log.state === 'pending') - .reverse() - .filter((event) => !pending.find((log) => log.params.method === event.params.method)) - .concat(pending) - .filter((event) => !mined.find((log) => log.params.method === event.params.method)) - .sort(sortEvents); - - events = pending.concat(mined); - - callback({ events }); - }); -} - -export function getBlock (blockNumber) { - return api.eth.getBlockByNumber(blockNumber); -} - -export function callRegister (instance, id, options = {}) { - return instance.register.call(options, [id]); -} - -export function postRegister (instance, id, options = {}) { - return instance.register - .estimateGas(options, [id]) - .then((gas) => { - options.gas = gas.mul(1.2).toFixed(0); - instance.register.postTransaction(options, [id]); - }); -} From bdac126ffc6cc069d99db2f8e2498c8b229f1166 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 2 Oct 2016 21:13:16 +0200 Subject: [PATCH 0910/1062] small form styling updates --- js/src/dapps/basiccoin/style.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/dapps/basiccoin/style.css b/js/src/dapps/basiccoin/style.css index 4a1adc12942..748cb1d93d1 100644 --- a/js/src/dapps/basiccoin/style.css +++ b/js/src/dapps/basiccoin/style.css @@ -19,7 +19,7 @@ } .form .input { - margin-bottom: 2em; + margin-bottom: 1.5em; } .form .input>* { @@ -40,7 +40,7 @@ .form select { width: 20em; background: rgba(255, 255, 255, 0.25); - border-radius: 1px; + border-radius: 5px; border: 1px solid rgba(0, 0, 0, 0.25); box-sizing: border-box; } From dbee9f9fc960c2e8e193f51f128c4c90d2757892 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 2 Oct 2016 21:38:38 +0200 Subject: [PATCH 0911/1062] update navigation styling --- js/src/dapps/basiccoin/Application/Header/header.css | 11 +++++------ js/src/dapps/basiccoin/Application/Header/header.js | 3 +-- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/js/src/dapps/basiccoin/Application/Header/header.css b/js/src/dapps/basiccoin/Application/Header/header.css index c84d068849e..aa896389bc7 100644 --- a/js/src/dapps/basiccoin/Application/Header/header.css +++ b/js/src/dapps/basiccoin/Application/Header/header.css @@ -30,6 +30,7 @@ border-spacing: 0; border-collapse: separate; border-color: white; + background: white; } .navigation tr { @@ -53,20 +54,18 @@ line-height: 1.5em; } -.nav { - cursor: pointer; +.navNext, +.navCurrent { color: white; padding: 1em 2em; vertical-align: middle; } -.nav:hover { +.navNext:hover { + cursor: pointer; opacity: 0.8; } .navCurrent { font-size: 2em; } - -.navNext { -} diff --git a/js/src/dapps/basiccoin/Application/Header/header.js b/js/src/dapps/basiccoin/Application/Header/header.js index f11e825ee0b..353e3dee01a 100644 --- a/js/src/dapps/basiccoin/Application/Header/header.js +++ b/js/src/dapps/basiccoin/Application/Header/header.js @@ -49,11 +49,10 @@ export default class Header extends Component { renderHeader (index, offset) { const page = PAGES[(index + offset) % PAGES.length]; - const classes = `${styles.nav} ${index ? styles.navNext : styles.navCurrent}`; return ( Date: Sun, 2 Oct 2016 22:09:21 +0200 Subject: [PATCH 0912/1062] overview, start loading own tokens --- js/src/dapps/basiccoin/Application/pages.js | 3 +- js/src/dapps/basiccoin/Overview/overview.js | 49 ++++++++++++++++++++- 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/js/src/dapps/basiccoin/Application/pages.js b/js/src/dapps/basiccoin/Application/pages.js index b9c6e446d61..faf597c2fa7 100644 --- a/js/src/dapps/basiccoin/Application/pages.js +++ b/js/src/dapps/basiccoin/Application/pages.js @@ -19,7 +19,8 @@ const PAGES = [ path: 'overview', color: '#080', title: 'Overview', - byline: 'Display all the current information relating to your own deployed tokens' + byline: 'Display all the current information relating to your own deployed tokens', + description: 'View the total number of tokens in circulation, the number of different tokens associated with your accounts as well as the types of tokens created by you.' }, { path: 'send', diff --git a/js/src/dapps/basiccoin/Overview/overview.js b/js/src/dapps/basiccoin/Overview/overview.js index e7e92a1ebbb..6eaad130110 100644 --- a/js/src/dapps/basiccoin/Overview/overview.js +++ b/js/src/dapps/basiccoin/Overview/overview.js @@ -14,14 +14,59 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -import React, { Component } from 'react'; +import BigNumber from 'bignumber.js'; +import React, { Component, PropTypes } from 'react'; import Container from '../Container'; export default class Overview extends Component { + static contextTypes = { + accounts: PropTypes.array.isRequired, + managerInstance: PropTypes.object.isRequired + } + + state = { + total: new BigNumber(0), + tokens: {} + } + + componentDidMount () { + const { accounts, managerInstance } = this.context; + let total = 0; + + Promise + .all(accounts.map((account) => managerInstance.countByOwner.call({}, [account.address]))) + .then((counts) => { + return Promise + .all(accounts.map((account, index) => { + const promises = []; + + total = counts[index].add(total); + for (let i = 0; i < counts[index]; i++) { + promises.push(managerInstance.getByOwner.call({}, [account.address, i])); + } + + return Promise.all(promises); + })); + }) + .then((_tokens) => { + this.setState({ + total, + tokens: accounts.reduce((tokens, account, index) => { + tokens[account.address] = _tokens[index]; + return tokens; + }, {}) + }); + }); + } + render () { + const { total } = this.state; + return ( - + + You have { total.toFormat(0) } tokens created by your accounts + ); } } From f324b1fc3ecdba08fa92a62485bc1b14cfdd01e1 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 3 Oct 2016 10:33:51 +0200 Subject: [PATCH 0913/1062] overview list of tokens by owner --- .../basiccoin/Deployments/deployments.js | 2 - .../dapps/basiccoin/Overview/Owner/index.js | 17 ++++ .../dapps/basiccoin/Overview/Owner/owner.css | 22 +++++ .../dapps/basiccoin/Overview/Owner/owner.js | 89 +++++++++++++++++++ .../dapps/basiccoin/Overview/Token/index.js | 17 ++++ .../dapps/basiccoin/Overview/Token/token.css | 35 ++++++++ .../dapps/basiccoin/Overview/Token/token.js | 75 ++++++++++++++++ js/src/dapps/basiccoin/Overview/overview.js | 60 +++++++------ 8 files changed, 287 insertions(+), 30 deletions(-) create mode 100644 js/src/dapps/basiccoin/Overview/Owner/index.js create mode 100644 js/src/dapps/basiccoin/Overview/Owner/owner.css create mode 100644 js/src/dapps/basiccoin/Overview/Owner/owner.js create mode 100644 js/src/dapps/basiccoin/Overview/Token/index.js create mode 100644 js/src/dapps/basiccoin/Overview/Token/token.css create mode 100644 js/src/dapps/basiccoin/Overview/Token/token.js diff --git a/js/src/dapps/basiccoin/Deployments/deployments.js b/js/src/dapps/basiccoin/Deployments/deployments.js index 7ebe5a03f42..e317ff52dbe 100644 --- a/js/src/dapps/basiccoin/Deployments/deployments.js +++ b/js/src/dapps/basiccoin/Deployments/deployments.js @@ -121,7 +121,6 @@ export default class Deployments extends Component { } const { minedEvents, pendingEvents } = this.state; - const minedNew = logs .filter((log) => log.type === 'mined') .map(this.logToEvent) @@ -137,7 +136,6 @@ export default class Deployments extends Component { .filter((log) => !minedNew.find((event) => event.transactionHash === log.transactionHash)); const events = [].concat(pendingNew).concat(minedNew); - console.log(logs); this.setState({ loading: false, events, minedEvents: minedNew, pendingEvents: pendingNew }); } } diff --git a/js/src/dapps/basiccoin/Overview/Owner/index.js b/js/src/dapps/basiccoin/Overview/Owner/index.js new file mode 100644 index 00000000000..4f38b38b9cc --- /dev/null +++ b/js/src/dapps/basiccoin/Overview/Owner/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './owner'; diff --git a/js/src/dapps/basiccoin/Overview/Owner/owner.css b/js/src/dapps/basiccoin/Overview/Owner/owner.css new file mode 100644 index 00000000000..8a29d72b2eb --- /dev/null +++ b/js/src/dapps/basiccoin/Overview/Owner/owner.css @@ -0,0 +1,22 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.info { +} + +.owner { +} diff --git a/js/src/dapps/basiccoin/Overview/Owner/owner.js b/js/src/dapps/basiccoin/Overview/Owner/owner.js new file mode 100644 index 00000000000..288189bf426 --- /dev/null +++ b/js/src/dapps/basiccoin/Overview/Owner/owner.js @@ -0,0 +1,89 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import Token from '../Token'; +import styles from './owner.css'; + +export default class Owner extends Component { + static contextTypes = { + managerInstance: PropTypes.object.isRequired + } + + static propTypes = { + address: PropTypes.string.isRequired + } + + state = { + tokens: [] + } + + componentDidMount () { + this.loadTokens(); + } + + render () { + const { address } = this.props; + const { tokens } = this.state; + + if (!tokens.length) { + return null; + } + + return ( +
      +
      { address }
      + { this.renderTokens() } +
      + ); + } + + renderTokens () { + const { tokens } = this.state; + + return tokens.map((token) => ( + + )); + } + + loadTokens () { + const { managerInstance } = this.context; + const { address } = this.props; + + managerInstance + .countByOwner.call({}, [address]) + .then((count) => { + const promises = []; + + for (let index = 0; count.gt(index); index++) { + promises.push(managerInstance.getByOwner.call({}, [address, index])); + } + + return Promise.all(promises); + }) + .then((tokens) => { + this.setState({ + tokens: tokens.map(([address, _owner, tokenreg]) => { + return { address, tokenreg }; + }) + }); + }); + } +} diff --git a/js/src/dapps/basiccoin/Overview/Token/index.js b/js/src/dapps/basiccoin/Overview/Token/index.js new file mode 100644 index 00000000000..4b822b4bdf7 --- /dev/null +++ b/js/src/dapps/basiccoin/Overview/Token/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './token'; diff --git a/js/src/dapps/basiccoin/Overview/Token/token.css b/js/src/dapps/basiccoin/Overview/Token/token.css new file mode 100644 index 00000000000..e97e5227727 --- /dev/null +++ b/js/src/dapps/basiccoin/Overview/Token/token.css @@ -0,0 +1,35 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.info { +} + +.info>div { + display: inline-block; +} + +.address { +} + +.tla { +} + +.name { +} + +.global { +} diff --git a/js/src/dapps/basiccoin/Overview/Token/token.js b/js/src/dapps/basiccoin/Overview/Token/token.js new file mode 100644 index 00000000000..90accb4c975 --- /dev/null +++ b/js/src/dapps/basiccoin/Overview/Token/token.js @@ -0,0 +1,75 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import styles from './token.css'; + +export default class Token extends Component { + static contextTypes = { + registryInstance: PropTypes.object.isRequired, + tokenregInstance: PropTypes.object.isRequired + } + + static propTypes = { + address: PropTypes.string.isRequired, + tokenreg: PropTypes.string.isRequired + } + + state = { + id: null, + tla: null, + base: null, + name: null, + owner: null, + isGlobal: false + } + + componentDidMount () { + this.lookupToken(); + } + + render () { + const { address } = this.props; + const { tla, name, isGlobal, base } = this.state; + + if (!base) { + return null; + } + + return ( +
      +
      { address }
      +
      { tla }
      +
      { name }
      +
      { isGlobal ? 'global' : 'local' }
      +
      + ); + } + + lookupToken () { + const { registryInstance, tokenregInstance } = this.context; + const { address, tokenreg } = this.props; + const isGlobal = tokenreg === tokenregInstance.address; + const registry = isGlobal ? tokenregInstance : registryInstance; + + registry.fromAddress + .call({}, [address]) + .then(([id, tla, base, name, owner]) => { + this.setState({ id, tla, base, name, owner, isGlobal }); + }); + } +} diff --git a/js/src/dapps/basiccoin/Overview/overview.js b/js/src/dapps/basiccoin/Overview/overview.js index 6eaad130110..8f32b083ae9 100644 --- a/js/src/dapps/basiccoin/Overview/overview.js +++ b/js/src/dapps/basiccoin/Overview/overview.js @@ -18,6 +18,7 @@ import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; import Container from '../Container'; +import Owner from './Owner'; export default class Overview extends Component { static contextTypes = { @@ -27,37 +28,11 @@ export default class Overview extends Component { state = { total: new BigNumber(0), - tokens: {} + tokenOwners: [] } componentDidMount () { - const { accounts, managerInstance } = this.context; - let total = 0; - - Promise - .all(accounts.map((account) => managerInstance.countByOwner.call({}, [account.address]))) - .then((counts) => { - return Promise - .all(accounts.map((account, index) => { - const promises = []; - - total = counts[index].add(total); - for (let i = 0; i < counts[index]; i++) { - promises.push(managerInstance.getByOwner.call({}, [account.address, i])); - } - - return Promise.all(promises); - })); - }) - .then((_tokens) => { - this.setState({ - total, - tokens: accounts.reduce((tokens, account, index) => { - tokens[account.address] = _tokens[index]; - return tokens; - }, {}) - }); - }); + this.loadOwners(); } render () { @@ -66,7 +41,36 @@ export default class Overview extends Component { return ( You have { total.toFormat(0) } tokens created by your accounts + { this.renderOwners() } ); } + + renderOwners () { + const { tokenOwners } = this.state; + + return tokenOwners.map((account) => ( + + )); + } + + loadOwners () { + const { accounts, managerInstance } = this.context; + + Promise + .all(accounts.map((account) => managerInstance.countByOwner.call({}, [account.address]))) + .then((counts) => { + let total = 0; + const tokenOwners = accounts.filter((account, index) => { + if (counts[index].gt(0)) { + total = counts[index].add(total); + return true; + } + }); + + this.setState({ tokenOwners, total }); + }); + } } From 99a80857148cbaf1a54a38524e864a7eae927079 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 3 Oct 2016 15:10:18 +0200 Subject: [PATCH 0914/1062] simplify services --- .../basiccoin/Deployments/Event/event.js | 48 +++++++++---------- .../dapps/basiccoin/Overview/Token/token.css | 4 ++ .../dapps/basiccoin/Overview/Token/token.js | 28 ++++++----- js/src/dapps/basiccoin/services.js | 33 +++++++++++++ 4 files changed, 75 insertions(+), 38 deletions(-) create mode 100644 js/src/dapps/basiccoin/services.js diff --git a/js/src/dapps/basiccoin/Deployments/Event/event.js b/js/src/dapps/basiccoin/Deployments/Event/event.js index 9a0982cf7ea..16528807be1 100644 --- a/js/src/dapps/basiccoin/Deployments/Event/event.js +++ b/js/src/dapps/basiccoin/Deployments/Event/event.js @@ -18,6 +18,7 @@ import moment from 'moment'; import React, { Component, PropTypes } from 'react'; import { api } from '../../parity'; +import { getCoin } from '../../services'; import styles from './event.css'; @@ -37,31 +38,7 @@ export default class Event extends Component { } componentDidMount () { - const { event } = this.props; - const { registryInstance, tokenregInstance } = this.context; - - if (event.type === 'pending') { - return; - } - - const isGlobal = event.params.tokenreg === tokenregInstance.address; - const registry = isGlobal - ? tokenregInstance - : registryInstance; - - Promise - .all([ - api.eth.getBlockByNumber(event.blockNumber), - registry.fromAddress.call({}, [event.params.coin]) - ]) - .then(([block, coin]) => { - const [id, tla, base, name, owner] = coin; - - this.setState({ - block, - coin: { id, tla, base, name, owner, isGlobal } - }); - }); + this.lookup(); } render () { @@ -96,4 +73,25 @@ export default class Event extends Component { renderHash (hash) { return `${hash.substr(0, 10)}...${hash.slice(-10)}`; } + + lookup () { + const { event } = this.props; + const { registryInstance, tokenregInstance } = this.context; + + if (event.type === 'pending') { + return; + } + + const isGlobal = event.params.tokenreg === tokenregInstance.address; + const registry = isGlobal ? tokenregInstance : registryInstance; + + Promise + .all([ + api.eth.getBlockByNumber(event.blockNumber), + getCoin(registry, event.params.coin) + ]) + .then(([block, coin]) => { + this.setState({ block, coin }); + }); + } } diff --git a/js/src/dapps/basiccoin/Overview/Token/token.css b/js/src/dapps/basiccoin/Overview/Token/token.css index e97e5227727..ae5d79f662a 100644 --- a/js/src/dapps/basiccoin/Overview/Token/token.css +++ b/js/src/dapps/basiccoin/Overview/Token/token.css @@ -20,6 +20,7 @@ .info>div { display: inline-block; + padding: 0.25em 0.5em; } .address { @@ -31,5 +32,8 @@ .name { } +.supply { +} + .global { } diff --git a/js/src/dapps/basiccoin/Overview/Token/token.js b/js/src/dapps/basiccoin/Overview/Token/token.js index 90accb4c975..b678d42a0c7 100644 --- a/js/src/dapps/basiccoin/Overview/Token/token.js +++ b/js/src/dapps/basiccoin/Overview/Token/token.js @@ -16,6 +16,7 @@ import React, { Component, PropTypes } from 'react'; +import { totalSupply, getCoin } from '../../services'; import styles from './token.css'; export default class Token extends Component { @@ -30,11 +31,8 @@ export default class Token extends Component { } state = { - id: null, - tla: null, - base: null, - name: null, - owner: null, + coin: null, + totalSupply: null, isGlobal: false } @@ -44,17 +42,18 @@ export default class Token extends Component { render () { const { address } = this.props; - const { tla, name, isGlobal, base } = this.state; + const { coin, isGlobal, totalSupply } = this.state; - if (!base) { + if (!coin) { return null; } return (
      { address }
      -
      { tla }
      -
      { name }
      +
      { coin.tla }
      +
      { coin.name }
      +
      { totalSupply.div(1000000).toFormat(0) }
      { isGlobal ? 'global' : 'local' }
      ); @@ -66,10 +65,13 @@ export default class Token extends Component { const isGlobal = tokenreg === tokenregInstance.address; const registry = isGlobal ? tokenregInstance : registryInstance; - registry.fromAddress - .call({}, [address]) - .then(([id, tla, base, name, owner]) => { - this.setState({ id, tla, base, name, owner, isGlobal }); + Promise + .all([ + getCoin(registry, address), + totalSupply(address) + ]) + .then(([coin, totalSupply]) => { + this.setState({ coin, isGlobal, totalSupply }); }); } } diff --git a/js/src/dapps/basiccoin/services.js b/js/src/dapps/basiccoin/services.js new file mode 100644 index 00000000000..362e0216a03 --- /dev/null +++ b/js/src/dapps/basiccoin/services.js @@ -0,0 +1,33 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { eip20 } from '../../contracts/abi'; +import { api } from './parity'; + +export function totalSupply (address) { + return api.newContract(eip20, address) + .instance.totalSupply.call(); +} + +export function getCoin (registry, address) { + return registry.fromAddress + .call({}, [address]) + .then(([id, tla, base, name, owner]) => { + return { + id, tla, base, name, owner + }; + }); +} From b79065ef8ec2875187c24e10aa2a1a8dab81c79c Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 3 Oct 2016 16:28:17 +0200 Subject: [PATCH 0915/1062] use services for calls --- .../basiccoin/Application/application.js | 36 ++++--------- .../basiccoin/Deployments/Event/event.js | 6 +-- .../dapps/basiccoin/Overview/Token/token.js | 21 ++------ js/src/dapps/basiccoin/Overview/overview.css | 24 +++++++++ js/src/dapps/basiccoin/Overview/overview.js | 31 ++++++++++-- js/src/dapps/basiccoin/services.js | 50 +++++++++++++++++-- 6 files changed, 113 insertions(+), 55 deletions(-) create mode 100644 js/src/dapps/basiccoin/Overview/overview.css diff --git a/js/src/dapps/basiccoin/Application/application.js b/js/src/dapps/basiccoin/Application/application.js index 358af32e48f..71a618ce1a1 100644 --- a/js/src/dapps/basiccoin/Application/application.js +++ b/js/src/dapps/basiccoin/Application/application.js @@ -16,8 +16,8 @@ import React, { Component, PropTypes } from 'react'; -import * as abis from '../../../contracts/abi'; import { api } from '../parity'; +import { attachInstances } from '../services'; import Header from './Header'; import Loading from './Loading'; @@ -85,36 +85,22 @@ export default class Application extends Component { } attachInstance () { - api.ethcore - .registryAddress() - .then((registryAddress) => { - console.log(`contract was found at registry=${registryAddress}`); - - const registry = api.newContract(abis.registry, registryAddress).instance; - - return Promise - .all([ - registry.getAddress.call({}, [api.util.sha3('playbasiccoinmgr'), 'A']), - registry.getAddress.call({}, [api.util.sha3('basiccoinreg'), 'A']), - registry.getAddress.call({}, [api.util.sha3('tokenreg'), 'A']), - api.personal.accountsInfo() - ]); - }) - .then(([managerAddress, registryAddress, tokenregAddress, accountsInfo]) => { - console.log(`contracts were found at basiccoinmgr=${managerAddress}, basiccoinreg=${registryAddress}, tokenreg=${registryAddress}`); - - const managerInstance = api.newContract(abis.basiccoinmanager, managerAddress).instance; - const registryInstance = api.newContract(abis.tokenreg, registryAddress).instance; - const tokenregInstance = api.newContract(abis.tokenreg, tokenregAddress).instance; + Promise + .all([ + attachInstances(), + api.personal.accountsInfo() + ]) + .then(([{ managerInstance, registryInstance, tokenregInstance }, accountsInfo]) => { + const accounts = Object.keys(accountsInfo) + .filter((address) => accountsInfo[address].uuid) + .map((address) => Object.assign(accountsInfo[address], { address })); this.setState({ loading: false, managerInstance, registryInstance, tokenregInstance, - accounts: Object.keys(accountsInfo) - .filter((address) => accountsInfo[address].uuid) - .map((address) => Object.assign(accountsInfo[address], { address })) + accounts }); }); } diff --git a/js/src/dapps/basiccoin/Deployments/Event/event.js b/js/src/dapps/basiccoin/Deployments/Event/event.js index 16528807be1..e490090c8c2 100644 --- a/js/src/dapps/basiccoin/Deployments/Event/event.js +++ b/js/src/dapps/basiccoin/Deployments/Event/event.js @@ -76,19 +76,15 @@ export default class Event extends Component { lookup () { const { event } = this.props; - const { registryInstance, tokenregInstance } = this.context; if (event.type === 'pending') { return; } - const isGlobal = event.params.tokenreg === tokenregInstance.address; - const registry = isGlobal ? tokenregInstance : registryInstance; - Promise .all([ api.eth.getBlockByNumber(event.blockNumber), - getCoin(registry, event.params.coin) + getCoin(event.params.tokenreg, event.params.coin) ]) .then(([block, coin]) => { this.setState({ block, coin }); diff --git a/js/src/dapps/basiccoin/Overview/Token/token.js b/js/src/dapps/basiccoin/Overview/Token/token.js index b678d42a0c7..548e73b7324 100644 --- a/js/src/dapps/basiccoin/Overview/Token/token.js +++ b/js/src/dapps/basiccoin/Overview/Token/token.js @@ -20,11 +20,6 @@ import { totalSupply, getCoin } from '../../services'; import styles from './token.css'; export default class Token extends Component { - static contextTypes = { - registryInstance: PropTypes.object.isRequired, - tokenregInstance: PropTypes.object.isRequired - } - static propTypes = { address: PropTypes.string.isRequired, tokenreg: PropTypes.string.isRequired @@ -32,8 +27,7 @@ export default class Token extends Component { state = { coin: null, - totalSupply: null, - isGlobal: false + totalSupply: null } componentDidMount () { @@ -41,8 +35,7 @@ export default class Token extends Component { } render () { - const { address } = this.props; - const { coin, isGlobal, totalSupply } = this.state; + const { coin, totalSupply } = this.state; if (!coin) { return null; @@ -50,28 +43,24 @@ export default class Token extends Component { return (
      -
      { address }
      { coin.tla }
      { coin.name }
      { totalSupply.div(1000000).toFormat(0) }
      -
      { isGlobal ? 'global' : 'local' }
      +
      { coin.isGlobal ? 'global' : 'local' }
      ); } lookupToken () { - const { registryInstance, tokenregInstance } = this.context; const { address, tokenreg } = this.props; - const isGlobal = tokenreg === tokenregInstance.address; - const registry = isGlobal ? tokenregInstance : registryInstance; Promise .all([ - getCoin(registry, address), + getCoin(tokenreg, address), totalSupply(address) ]) .then(([coin, totalSupply]) => { - this.setState({ coin, isGlobal, totalSupply }); + this.setState({ coin, totalSupply }); }); } } diff --git a/js/src/dapps/basiccoin/Overview/overview.css b/js/src/dapps/basiccoin/Overview/overview.css new file mode 100644 index 00000000000..4af067f6ab6 --- /dev/null +++ b/js/src/dapps/basiccoin/Overview/overview.css @@ -0,0 +1,24 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.body { +} + +.statusHeader { + font-size: 1.25em; + margin-bottom: 0.25em; +} diff --git a/js/src/dapps/basiccoin/Overview/overview.js b/js/src/dapps/basiccoin/Overview/overview.js index 8f32b083ae9..651fc365b65 100644 --- a/js/src/dapps/basiccoin/Overview/overview.js +++ b/js/src/dapps/basiccoin/Overview/overview.js @@ -20,6 +20,8 @@ import React, { Component, PropTypes } from 'react'; import Container from '../Container'; import Owner from './Owner'; +import styles from './overview.css'; + export default class Overview extends Component { static contextTypes = { accounts: PropTypes.array.isRequired, @@ -27,6 +29,7 @@ export default class Overview extends Component { } state = { + loading: true, total: new BigNumber(0), tokenOwners: [] } @@ -36,16 +39,36 @@ export default class Overview extends Component { } render () { - const { total } = this.state; + const { loading } = this.state; return ( - You have { total.toFormat(0) } tokens created by your accounts - { this.renderOwners() } + { loading ? this.renderLoading() : this.renderBody() } ); } + renderLoading () { + return ( +
      + Loading tokens +
      + ); + } + + renderBody () { + const { total } = this.state; + + return ( +
      +
      + You have { total.toFormat(0) } tokens created by your accounts +
      + { this.renderOwners() } +
      + ); + } + renderOwners () { const { tokenOwners } = this.state; @@ -70,7 +93,7 @@ export default class Overview extends Component { } }); - this.setState({ tokenOwners, total }); + this.setState({ tokenOwners, total, loading: false }); }); } } diff --git a/js/src/dapps/basiccoin/services.js b/js/src/dapps/basiccoin/services.js index 362e0216a03..2d362ebb74e 100644 --- a/js/src/dapps/basiccoin/services.js +++ b/js/src/dapps/basiccoin/services.js @@ -14,20 +14,60 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -import { eip20 } from '../../contracts/abi'; +import * as abis from '../../contracts/abi'; import { api } from './parity'; +let managerInstance; +let tokenregInstance; +let registryInstance; + +const registries = {}; + export function totalSupply (address) { - return api.newContract(eip20, address) + return api.newContract(abis.eip20, address) .instance.totalSupply.call(); } -export function getCoin (registry, address) { - return registry.fromAddress +export function getCoin (tokenreg, address) { + return registries[tokenreg].fromAddress .call({}, [address]) .then(([id, tla, base, name, owner]) => { return { - id, tla, base, name, owner + id, tla, base, name, owner, + isGlobal: tokenregInstance.address === tokenreg + }; + }); +} + +export function attachInstances () { + return api.ethcore + .registryAddress() + .then((registryAddress) => { + console.log(`contract was found at registry=${registryAddress}`); + + const registry = api.newContract(abis.registry, registryAddress).instance; + + return Promise + .all([ + registry.getAddress.call({}, [api.util.sha3('playbasiccoinmgr'), 'A']), + registry.getAddress.call({}, [api.util.sha3('basiccoinreg'), 'A']), + registry.getAddress.call({}, [api.util.sha3('tokenreg'), 'A']) + ]); + }) + .then(([managerAddress, registryAddress, tokenregAddress]) => { + console.log(`contracts were found at basiccoinmgr=${managerAddress}, basiccoinreg=${registryAddress}, tokenreg=${registryAddress}`); + + managerInstance = api.newContract(abis.basiccoinmanager, managerAddress).instance; + registryInstance = api.newContract(abis.tokenreg, registryAddress).instance; + tokenregInstance = api.newContract(abis.tokenreg, tokenregAddress).instance; + + registries[registryInstance.address] = registryInstance; + registries[tokenregInstance.address] = tokenregInstance; + + return { + managerInstance, + registryInstance, + tokenregInstance }; }); } From b441be8991848ec9226895479ee6fdc43db37531 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 3 Oct 2016 17:17:25 +0200 Subject: [PATCH 0916/1062] address selector for deploy (non-perfect) --- .../basiccoin/AddressSelect/addressSelect.css | 26 +++++++ .../basiccoin/AddressSelect/addressSelect.js | 75 +++++++++++++++++++ js/src/dapps/basiccoin/AddressSelect/index.js | 17 +++++ js/src/dapps/basiccoin/Deploy/deploy.js | 15 +++- .../basiccoin/IdentityIcon/identityIcon.css | 23 ++++++ .../basiccoin/IdentityIcon/identityIcon.js | 36 +++++++++ js/src/dapps/basiccoin/IdentityIcon/index.js | 17 +++++ 7 files changed, 207 insertions(+), 2 deletions(-) create mode 100644 js/src/dapps/basiccoin/AddressSelect/addressSelect.css create mode 100644 js/src/dapps/basiccoin/AddressSelect/addressSelect.js create mode 100644 js/src/dapps/basiccoin/AddressSelect/index.js create mode 100644 js/src/dapps/basiccoin/IdentityIcon/identityIcon.css create mode 100644 js/src/dapps/basiccoin/IdentityIcon/identityIcon.js create mode 100644 js/src/dapps/basiccoin/IdentityIcon/index.js diff --git a/js/src/dapps/basiccoin/AddressSelect/addressSelect.css b/js/src/dapps/basiccoin/AddressSelect/addressSelect.css new file mode 100644 index 00000000000..017be8c8f3c --- /dev/null +++ b/js/src/dapps/basiccoin/AddressSelect/addressSelect.css @@ -0,0 +1,26 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.iconMenu { + /*appearance: none; + -moz-appearance: none; + -webkit-appearance: none;*/ +} + +.iconMenu option { + padding-left: 30px; +} diff --git a/js/src/dapps/basiccoin/AddressSelect/addressSelect.js b/js/src/dapps/basiccoin/AddressSelect/addressSelect.js new file mode 100644 index 00000000000..640e264121b --- /dev/null +++ b/js/src/dapps/basiccoin/AddressSelect/addressSelect.js @@ -0,0 +1,75 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import { api } from '../parity'; +import styles from './addressSelect.css'; + +export default class AddressSelect extends Component { + static contextTypes = { + accounts: PropTypes.array.isRequired + } + + static propTypes = { + onChange: PropTypes.func.isRequired + } + + state = { + selected: null + } + + componentDidMount () { + const { accounts } = this.context; + + this.onChange({ + target: { + value: accounts[0].address + } + }); + } + + render () { + const { accounts } = this.context; + const options = accounts.map(this.renderOption); + + return ( + + ); + } + + renderOption = (account) => { + const style = { background: `transparent url(${api.util.createIdentityImg(account.address, 3)}) no-repeat left center` }; + + return ( + + ); + } + + onChange = (event) => { + this.setState({ selected: event.target.value }); + this.props.onChange(event); + } +} diff --git a/js/src/dapps/basiccoin/AddressSelect/index.js b/js/src/dapps/basiccoin/AddressSelect/index.js new file mode 100644 index 00000000000..58059cd2e1e --- /dev/null +++ b/js/src/dapps/basiccoin/AddressSelect/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './addressSelect'; diff --git a/js/src/dapps/basiccoin/Deploy/deploy.js b/js/src/dapps/basiccoin/Deploy/deploy.js index 22a3156cde9..b412fda33a1 100644 --- a/js/src/dapps/basiccoin/Deploy/deploy.js +++ b/js/src/dapps/basiccoin/Deploy/deploy.js @@ -18,6 +18,7 @@ import React, { Component, PropTypes } from 'react'; import { api } from '../parity'; +import AddressSelect from '../AddressSelect'; import Container from '../Container'; import styles from './deploy.css'; import layout from '../style.css'; @@ -44,7 +45,7 @@ export default class Deploy extends Component { globalReg: false, globalFee: 0, globalFeeText: '1.000', - fromAddress: '0x63Cf90D3f0410092FC0fca41846f596223979195', + fromAddress: null, name: '', nameError: ERRORS.name, tla: '', @@ -91,7 +92,7 @@ export default class Deploy extends Component { Your token has been deployed
      - Start sending tokens or view information relating to this and any of your other tokens. In addition, you can view the deployment along with others. + Start sending tokens or view information relating to this and any of your other tokens.
      { deployState } @@ -130,6 +131,10 @@ export default class Deploy extends Component { return (
      +
      + + +
      { + const fromAddress = event.target.value; + + this.setState({ fromAddress }); + } + onChangeName = (event) => { const name = event.target.value; const nameError = name && (name.length > 2) && (name.length < 32) diff --git a/js/src/dapps/basiccoin/IdentityIcon/identityIcon.css b/js/src/dapps/basiccoin/IdentityIcon/identityIcon.css new file mode 100644 index 00000000000..2b645d8239b --- /dev/null +++ b/js/src/dapps/basiccoin/IdentityIcon/identityIcon.css @@ -0,0 +1,23 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.icon { + width: 32px; + height: 32px; + border-radius: 50%; + margin-right: 0.5em; +} diff --git a/js/src/dapps/basiccoin/IdentityIcon/identityIcon.js b/js/src/dapps/basiccoin/IdentityIcon/identityIcon.js new file mode 100644 index 00000000000..51f48d46ab3 --- /dev/null +++ b/js/src/dapps/basiccoin/IdentityIcon/identityIcon.js @@ -0,0 +1,36 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import { api } from '../parity'; +import styles from './identityIcon.css'; + +export default class IdentityIcon extends Component { + static propTypes = { + address: PropTypes.string.isRequired + } + + render () { + const { address } = this.props; + + return ( + + ); + } +} diff --git a/js/src/dapps/basiccoin/IdentityIcon/index.js b/js/src/dapps/basiccoin/IdentityIcon/index.js new file mode 100644 index 00000000000..76c107bfb75 --- /dev/null +++ b/js/src/dapps/basiccoin/IdentityIcon/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './identityIcon'; From d744d212e12fce308671671acd3a086b71a6d337 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 3 Oct 2016 20:45:53 +0200 Subject: [PATCH 0917/1062] update styling, simplify --- js/src/dapps/basiccoin/Application/application.css | 2 +- js/src/dapps/basiccoin/Application/application.js | 6 +----- js/src/dapps/basiccoin/Container/container.css | 4 ++-- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/js/src/dapps/basiccoin/Application/application.css b/js/src/dapps/basiccoin/Application/application.css index 1ec0f9a0ac4..cec2cf43f27 100644 --- a/js/src/dapps/basiccoin/Application/application.css +++ b/js/src/dapps/basiccoin/Application/application.css @@ -23,5 +23,5 @@ } .body { - padding: 4em; + padding: 0 4em; } diff --git a/js/src/dapps/basiccoin/Application/application.js b/js/src/dapps/basiccoin/Application/application.js index 71a618ce1a1..b0a80329c7a 100644 --- a/js/src/dapps/basiccoin/Application/application.js +++ b/js/src/dapps/basiccoin/Application/application.js @@ -59,12 +59,8 @@ export default class Application extends Component { ); } - const path = (window.location.hash || '').split('?')[0].split('/')[1]; - const page = PAGES.find((page) => page.path === path); - const style = { background: page.color }; - return ( -
      +
      { children } diff --git a/js/src/dapps/basiccoin/Container/container.css b/js/src/dapps/basiccoin/Container/container.css index 097dd08fc73..efcd2b82bdf 100644 --- a/js/src/dapps/basiccoin/Container/container.css +++ b/js/src/dapps/basiccoin/Container/container.css @@ -16,8 +16,8 @@ */ .content { - background: whitesmoke; - border-radius: 1px; + /*background: whitesmoke; + border-radius: 1px;*/ padding: 4em 2em; margin-bottom: 2em; } From 00806e4370c6d50c15779bd1a3885c2d8d629fb8 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 3 Oct 2016 22:18:45 +0200 Subject: [PATCH 0918/1062] address -> name mappings --- .../basiccoin/AddressSelect/addressSelect.js | 9 +++-- .../basiccoin/Application/application.js | 14 ++++---- js/src/dapps/basiccoin/Deploy/deploy.css | 21 ++--------- js/src/dapps/basiccoin/Deploy/deploy.js | 26 +++++++------- .../basiccoin/Deployments/Event/event.js | 6 +++- .../dapps/basiccoin/Overview/Owner/owner.js | 6 +++- js/src/dapps/basiccoin/Overview/overview.css | 7 ++-- js/src/dapps/basiccoin/Overview/overview.js | 12 +++---- .../dapps/basiccoin/{style.css => _form.css} | 4 +++ js/src/dapps/basiccoin/_status.css | 36 +++++++++++++++++++ 10 files changed, 85 insertions(+), 56 deletions(-) rename js/src/dapps/basiccoin/{style.css => _form.css} (97%) create mode 100644 js/src/dapps/basiccoin/_status.css diff --git a/js/src/dapps/basiccoin/AddressSelect/addressSelect.js b/js/src/dapps/basiccoin/AddressSelect/addressSelect.js index 640e264121b..a23e089dc6d 100644 --- a/js/src/dapps/basiccoin/AddressSelect/addressSelect.js +++ b/js/src/dapps/basiccoin/AddressSelect/addressSelect.js @@ -21,7 +21,7 @@ import styles from './addressSelect.css'; export default class AddressSelect extends Component { static contextTypes = { - accounts: PropTypes.array.isRequired + accounts: PropTypes.object.isRequired } static propTypes = { @@ -37,14 +37,17 @@ export default class AddressSelect extends Component { this.onChange({ target: { - value: accounts[0].address + value: Object.keys(accounts)[0] } }); } render () { const { accounts } = this.context; - const options = accounts.map(this.renderOption); + const options = Object + .values(accounts) + .filter((account) => account.uuid) + .map(this.renderOption); return ( -
      +
      { nameError || 'an identifying name for the token' }
      -
      +
      -
      +
      { tlaError || 'unique network acronym for this token' }
      -
      +
      -
      +
      { totalSupplyError || `number of tokens in circulation (base: ${baseText})` }
      -
      +
      -
      +
      register as a network token (fee: { globalFeeText }ETH)
      diff --git a/js/src/dapps/basiccoin/Deployments/Event/event.js b/js/src/dapps/basiccoin/Deployments/Event/event.js index e490090c8c2..cc109f09f87 100644 --- a/js/src/dapps/basiccoin/Deployments/Event/event.js +++ b/js/src/dapps/basiccoin/Deployments/Event/event.js @@ -24,6 +24,7 @@ import styles from './event.css'; export default class Event extends Component { static contextTypes = { + accounts: PropTypes.object.isRequired, registryInstance: PropTypes.object.isRequired, tokenregInstance: PropTypes.object.isRequired } @@ -67,7 +68,10 @@ export default class Event extends Component { } renderAddress (address) { - return address; + const { accounts } = this.context; + const account = accounts[address]; + + return account ? account.name : address; } renderHash (hash) { diff --git a/js/src/dapps/basiccoin/Overview/Owner/owner.js b/js/src/dapps/basiccoin/Overview/Owner/owner.js index 288189bf426..be3717d1381 100644 --- a/js/src/dapps/basiccoin/Overview/Owner/owner.js +++ b/js/src/dapps/basiccoin/Overview/Owner/owner.js @@ -21,6 +21,7 @@ import styles from './owner.css'; export default class Owner extends Component { static contextTypes = { + accounts: PropTypes.object.isRequired, managerInstance: PropTypes.object.isRequired } @@ -37,6 +38,7 @@ export default class Owner extends Component { } render () { + const { accounts } = this.context; const { address } = this.props; const { tokens } = this.state; @@ -46,7 +48,9 @@ export default class Owner extends Component { return (
      -
      { address }
      +
      + { accounts[address].name } +
      { this.renderTokens() }
      ); diff --git a/js/src/dapps/basiccoin/Overview/overview.css b/js/src/dapps/basiccoin/Overview/overview.css index 4af067f6ab6..62d4c936275 100644 --- a/js/src/dapps/basiccoin/Overview/overview.css +++ b/js/src/dapps/basiccoin/Overview/overview.css @@ -15,10 +15,7 @@ /* along with Parity. If not, see . */ -.body { -} +@import '../_status.css'; -.statusHeader { - font-size: 1.25em; - margin-bottom: 0.25em; +.body { } diff --git a/js/src/dapps/basiccoin/Overview/overview.js b/js/src/dapps/basiccoin/Overview/overview.js index 651fc365b65..f8d6b006990 100644 --- a/js/src/dapps/basiccoin/Overview/overview.js +++ b/js/src/dapps/basiccoin/Overview/overview.js @@ -24,7 +24,7 @@ import styles from './overview.css'; export default class Overview extends Component { static contextTypes = { - accounts: PropTypes.array.isRequired, + accounts: PropTypes.object.isRequired, managerInstance: PropTypes.object.isRequired } @@ -72,10 +72,10 @@ export default class Overview extends Component { renderOwners () { const { tokenOwners } = this.state; - return tokenOwners.map((account) => ( + return tokenOwners.map((address) => ( + key={ address } + address={ address } /> )); } @@ -83,10 +83,10 @@ export default class Overview extends Component { const { accounts, managerInstance } = this.context; Promise - .all(accounts.map((account) => managerInstance.countByOwner.call({}, [account.address]))) + .all(Object.keys(accounts).map((address) => managerInstance.countByOwner.call({}, [address]))) .then((counts) => { let total = 0; - const tokenOwners = accounts.filter((account, index) => { + const tokenOwners = Object.keys(accounts).filter((address, index) => { if (counts[index].gt(0)) { total = counts[index].add(total); return true; diff --git a/js/src/dapps/basiccoin/style.css b/js/src/dapps/basiccoin/_form.css similarity index 97% rename from js/src/dapps/basiccoin/style.css rename to js/src/dapps/basiccoin/_form.css index 748cb1d93d1..a1a4b89b73b 100644 --- a/js/src/dapps/basiccoin/style.css +++ b/js/src/dapps/basiccoin/_form.css @@ -62,6 +62,10 @@ border: 1px solid rgba(255, 0, 0, 0.5); } +.form .error label { + color: red; +} + .form .error .hint { color: red; } diff --git a/js/src/dapps/basiccoin/_status.css b/js/src/dapps/basiccoin/_status.css new file mode 100644 index 00000000000..4b49f7bc6e5 --- /dev/null +++ b/js/src/dapps/basiccoin/_status.css @@ -0,0 +1,36 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.statusHeader { + font-size: 1.25em; + margin-bottom: 0.75em; + opacity: 0.75; +} + +.statusInfo { + margin-bottom: 0.25em; +} + +.statusState { + opacity: 0.75; + margin-top: 1em; +} + +.statusError { + color: red; + margin-top: 1em; +} From d2a74611d1062d64709e06b03b263d1303d1f155 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 3 Oct 2016 23:44:43 +0200 Subject: [PATCH 0919/1062] expanding, loading all coin details --- .../dapps/basiccoin/Overview/Owner/owner.js | 36 +----- js/src/dapps/basiccoin/Overview/overview.js | 29 ++--- js/src/dapps/basiccoin/Send/send.css | 20 +++ js/src/dapps/basiccoin/Send/send.js | 49 ++++++- js/src/dapps/basiccoin/services.js | 120 ++++++++++++++++++ 5 files changed, 204 insertions(+), 50 deletions(-) create mode 100644 js/src/dapps/basiccoin/Send/send.css diff --git a/js/src/dapps/basiccoin/Overview/Owner/owner.js b/js/src/dapps/basiccoin/Overview/Owner/owner.js index be3717d1381..b2862cbb473 100644 --- a/js/src/dapps/basiccoin/Overview/Owner/owner.js +++ b/js/src/dapps/basiccoin/Overview/Owner/owner.js @@ -26,21 +26,17 @@ export default class Owner extends Component { } static propTypes = { - address: PropTypes.string.isRequired + address: PropTypes.string.isRequired, + tokens: PropTypes.array.isRequired } state = { tokens: [] } - componentDidMount () { - this.loadTokens(); - } - render () { const { accounts } = this.context; - const { address } = this.props; - const { tokens } = this.state; + const { address, tokens } = this.props; if (!tokens.length) { return null; @@ -57,7 +53,7 @@ export default class Owner extends Component { } renderTokens () { - const { tokens } = this.state; + const { tokens } = this.props; return tokens.map((token) => ( )); } - - loadTokens () { - const { managerInstance } = this.context; - const { address } = this.props; - - managerInstance - .countByOwner.call({}, [address]) - .then((count) => { - const promises = []; - - for (let index = 0; count.gt(index); index++) { - promises.push(managerInstance.getByOwner.call({}, [address, index])); - } - - return Promise.all(promises); - }) - .then((tokens) => { - this.setState({ - tokens: tokens.map(([address, _owner, tokenreg]) => { - return { address, tokenreg }; - }) - }); - }); - } } diff --git a/js/src/dapps/basiccoin/Overview/overview.js b/js/src/dapps/basiccoin/Overview/overview.js index f8d6b006990..eec2256dc86 100644 --- a/js/src/dapps/basiccoin/Overview/overview.js +++ b/js/src/dapps/basiccoin/Overview/overview.js @@ -17,6 +17,7 @@ import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; +import { loadTokens } from '../services'; import Container from '../Container'; import Owner from './Owner'; @@ -70,30 +71,26 @@ export default class Overview extends Component { } renderOwners () { - const { tokenOwners } = this.state; + const { tokens } = this.state; - return tokenOwners.map((address) => ( + return Object.keys(tokens).map((address) => ( )); } loadOwners () { - const { accounts, managerInstance } = this.context; - - Promise - .all(Object.keys(accounts).map((address) => managerInstance.countByOwner.call({}, [address]))) - .then((counts) => { - let total = 0; - const tokenOwners = Object.keys(accounts).filter((address, index) => { - if (counts[index].gt(0)) { - total = counts[index].add(total); - return true; - } - }); - - this.setState({ tokenOwners, total, loading: false }); + const { accounts } = this.context; + const addresses = Object + .values(accounts) + .filter((account) => account.uuid) + .map((account) => account.address); + + loadTokens(addresses) + .then(({ tokens, total }) => { + this.setState({ tokens, total, loading: false }); }); } } diff --git a/js/src/dapps/basiccoin/Send/send.css b/js/src/dapps/basiccoin/Send/send.css new file mode 100644 index 00000000000..ef1aa573612 --- /dev/null +++ b/js/src/dapps/basiccoin/Send/send.css @@ -0,0 +1,20 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +@import '../_form.css'; +@import '../_status.css'; +@import '../_vars.css'; diff --git a/js/src/dapps/basiccoin/Send/send.js b/js/src/dapps/basiccoin/Send/send.js index ca6273eab08..96eca8466b9 100644 --- a/js/src/dapps/basiccoin/Send/send.js +++ b/js/src/dapps/basiccoin/Send/send.js @@ -14,14 +14,59 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -import React, { Component } from 'react'; +import React, { Component, PropTypes } from 'react'; +import { loadBalances } from '../services'; import Container from '../Container'; +import styles from './send.css'; + export default class Send extends Component { + static contextTypes = { + accounts: PropTypes.object.isRequired + } + + state = { + loading: true + } + + componentDidMount () { + this.loadBalances(); + } + render () { + const { loading } = this.state; + return ( - + + { loading ? this.renderLoading() : this.renderBody() } + ); } + + renderLoading () { + return ( +
      + Loading tokens +
      + ); + } + + renderBody () { + return 'loaded'; + } + + loadBalances () { + const { accounts } = this.context; + const myAccounts = Object + .values(accounts) + .filter((account) => account.uuid) + .map((account) => account.address); + + loadBalances(myAccounts) + .then((balances) => { + console.log(balances); + this.setState({ balances, loading: false }); + }); + } } diff --git a/js/src/dapps/basiccoin/services.js b/js/src/dapps/basiccoin/services.js index 2d362ebb74e..900329510d8 100644 --- a/js/src/dapps/basiccoin/services.js +++ b/js/src/dapps/basiccoin/services.js @@ -14,6 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . +import BigNumber from 'bignumber.js'; + import * as abis from '../../contracts/abi'; import { api } from './parity'; @@ -36,6 +38,10 @@ export function getCoin (tokenreg, address) { id, tla, base, name, owner, isGlobal: tokenregInstance.address === tokenreg }; + }) + .catch((error) => { + console.error('getCoin', error); + throw error; }); } @@ -69,5 +75,119 @@ export function attachInstances () { registryInstance, tokenregInstance }; + }) + .catch((error) => { + console.error('attachInstances', error); + throw error; + }); +} + +export function loadTokens (addresses) { + let total = new BigNumber(0); + + return Promise + .all( + addresses.map((address) => managerInstance.countByOwner.call({}, [address])) + ) + .then((counts) => { + return Promise.all( + addresses.reduce((promises, address, index) => { + total = counts[index].add(total); + for (let i = 0; counts[index].gt(i); i++) { + promises.push(managerInstance.getByOwner.call({}, [address, i])); + } + return promises; + }, []) + ); + }) + .then((_tokens) => { + const tokens = _tokens.reduce((tokens, token) => { + const [address, owner, tokenreg] = token; + tokens[owner] = tokens[owner] || []; + tokens[owner].push({ address, owner, tokenreg }); + return tokens; + }, {}); + + return { tokens, total }; + }) + .catch((error) => { + console.error('loadTokens', error); + throw error; + }); +} + +export function loadBalances (addresses) { + return Promise + .all([ + loadInstanceBalances(tokenregInstance, addresses), + loadInstanceBalances(registryInstance, addresses) + ]) + .then(([trBalances, bcBalances]) => { + return { + global: trBalances, + local: bcBalances + }; + }) + .catch((error) => { + console.error('loadBalances', error); + throw error; + }); +} + +export function loadInstanceBalances (tokenreg, addresses) { + return loadInstanceCoins(tokenreg) + .then((coins) => { + return Promise.all( + coins.map((coin) => { + return Promise.all( + addresses.map((address) => loadCoinBalance(coin.address, address)) + ); + }) + ) + .then((_balances) => { + return _balances.map((_balance, cindex) => { + return { + coin: coins[cindex], + balances: _balance.reduce((balance, value, aindex) => { + balance[addresses[aindex]] = value; + return balance; + }, {}) + }; + }); + }); + }) + .catch((error) => { + console.error('loadInstanceBalances', error); + throw error; + }); +} + +export function loadCoinBalance (coinAddress, address) { + return api.newContract(abis.eip20, coinAddress).instance + .balanceOf.call({}, [address]) + .catch((error) => { + console.error('loadCoinBalance', error); + throw error; + }); +} + +export function loadInstanceCoins (tokenreg) { + return tokenreg + .tokenCount.call() + .then((count) => { + const promises = []; + for (let i = 0; count.gt(i); i++) { + promises.push(tokenreg.token.call({}, [i])); + } + return Promise.all(promises); + }) + .then((coins) => { + return coins.map(([address, tla, base, name, owner], id) => { + return { id, address, tla, base, name, owner }; + }); + }) + .catch((error) => { + console.error('loadInstanceCoins', error); + throw error; }); } From 483eafdf3eeca19c7ea6e48641f7c8028c12b1a0 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 4 Oct 2016 11:00:52 +0200 Subject: [PATCH 0920/1062] send use only actual BasicCoin tokens registered (any reg) --- js/src/dapps/basiccoin/Overview/overview.js | 4 +- js/src/dapps/basiccoin/services.js | 99 ++++++++++----------- 2 files changed, 50 insertions(+), 53 deletions(-) diff --git a/js/src/dapps/basiccoin/Overview/overview.js b/js/src/dapps/basiccoin/Overview/overview.js index eec2256dc86..7452406eac3 100644 --- a/js/src/dapps/basiccoin/Overview/overview.js +++ b/js/src/dapps/basiccoin/Overview/overview.js @@ -17,7 +17,7 @@ import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; -import { loadTokens } from '../services'; +import { loadOwnedTokens } from '../services'; import Container from '../Container'; import Owner from './Owner'; @@ -88,7 +88,7 @@ export default class Overview extends Component { .filter((account) => account.uuid) .map((account) => account.address); - loadTokens(addresses) + loadOwnedTokens(addresses) .then(({ tokens, total }) => { this.setState({ tokens, total, loading: false }); }); diff --git a/js/src/dapps/basiccoin/services.js b/js/src/dapps/basiccoin/services.js index 900329510d8..77ac128cf6e 100644 --- a/js/src/dapps/basiccoin/services.js +++ b/js/src/dapps/basiccoin/services.js @@ -82,7 +82,7 @@ export function attachInstances () { }); } -export function loadTokens (addresses) { +export function loadOwnedTokens (addresses) { let total = new BigNumber(0); return Promise @@ -116,78 +116,75 @@ export function loadTokens (addresses) { }); } -export function loadBalances (addresses) { - return Promise - .all([ - loadInstanceBalances(tokenregInstance, addresses), - loadInstanceBalances(registryInstance, addresses) - ]) - .then(([trBalances, bcBalances]) => { - return { - global: trBalances, - local: bcBalances - }; +export function loadAllTokens () { + return managerInstance + .count.call() + .then((count) => { + const promises = []; + + for (let index = 0; count.gt(index); index++) { + promises.push(managerInstance.get.call({}, [index])); + } + + return Promise.all(promises); + }) + .then((_tokens) => { + const tokens = []; + + return Promise + .all( + _tokens.map(([address, owner, tokenreg]) => { + const isGlobal = tokenreg === tokenregInstance.address; + tokens.push({ address, owner, tokenreg, isGlobal }); + return registries[tokenreg].fromAddress.call({}, [address]); + }) + ) + .then((coins) => { + return tokens.map((token, index) => { + const [id, tla, base, name, owner] = coins[index]; + token.coin = { id, tla, base, name, owner }; + return token; + }); + }); }) .catch((error) => { - console.error('loadBalances', error); + console.log('loadAllTokens', error); throw error; }); } -export function loadInstanceBalances (tokenreg, addresses) { - return loadInstanceCoins(tokenreg) - .then((coins) => { +export function loadBalances (addresses) { + return loadAllTokens() + .then((tokens) => { return Promise.all( - coins.map((coin) => { + tokens.map((token) => { return Promise.all( - addresses.map((address) => loadCoinBalance(coin.address, address)) + addresses.map((address) => loadTokenBalance(token.address, address)) ); }) ) .then((_balances) => { - return _balances.map((_balance, cindex) => { - return { - coin: coins[cindex], - balances: _balance.reduce((balance, value, aindex) => { - balance[addresses[aindex]] = value; - return balance; - }, {}) - }; + return tokens.map((token, tindex) => { + const balances = _balances[tindex]; + token.balances = addresses.reduce((balance, address, aindex) => { + balance[address] = balances[aindex]; + return balance; + }, {}); + return token; }); }); }) .catch((error) => { - console.error('loadInstanceBalances', error); + console.error('loadBalances', error); throw error; }); } -export function loadCoinBalance (coinAddress, address) { - return api.newContract(abis.eip20, coinAddress).instance +export function loadTokenBalance (tokenAddress, address) { + return api.newContract(abis.eip20, tokenAddress).instance .balanceOf.call({}, [address]) .catch((error) => { - console.error('loadCoinBalance', error); - throw error; - }); -} - -export function loadInstanceCoins (tokenreg) { - return tokenreg - .tokenCount.call() - .then((count) => { - const promises = []; - for (let i = 0; count.gt(i); i++) { - promises.push(tokenreg.token.call({}, [i])); - } - return Promise.all(promises); - }) - .then((coins) => { - return coins.map(([address, tla, base, name, owner], id) => { - return { id, address, tla, base, name, owner }; - }); - }) - .catch((error) => { - console.error('loadInstanceCoins', error); + console.error('loadTokenBalance', error); throw error; }); } From e55b069c1959e6989f449f6b2f37bdcc819f7675 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 4 Oct 2016 12:04:06 +0200 Subject: [PATCH 0921/1062] sending token & accounts --- .../basiccoin/AddressSelect/addressSelect.js | 17 ++-- js/src/dapps/basiccoin/Send/send.js | 81 +++++++++++++++++-- js/src/dapps/basiccoin/services.js | 7 +- 3 files changed, 85 insertions(+), 20 deletions(-) diff --git a/js/src/dapps/basiccoin/AddressSelect/addressSelect.js b/js/src/dapps/basiccoin/AddressSelect/addressSelect.js index a23e089dc6d..aaa1ac7fd13 100644 --- a/js/src/dapps/basiccoin/AddressSelect/addressSelect.js +++ b/js/src/dapps/basiccoin/AddressSelect/addressSelect.js @@ -25,6 +25,7 @@ export default class AddressSelect extends Component { } static propTypes = { + addresses: PropTypes.array.isRequired, onChange: PropTypes.func.isRequired } @@ -33,32 +34,30 @@ export default class AddressSelect extends Component { } componentDidMount () { - const { accounts } = this.context; + const { addresses } = this.props; this.onChange({ target: { - value: Object.keys(accounts)[0] + value: addresses[0] } }); } render () { - const { accounts } = this.context; - const options = Object - .values(accounts) - .filter((account) => account.uuid) - .map(this.renderOption); + const { addresses } = this.props; return ( ); } - renderOption = (account) => { + renderOption = (address) => { + const { accounts } = this.context; + const account = accounts[address]; const style = { background: `transparent url(${api.util.createIdentityImg(account.address, 3)}) no-repeat left center` }; return ( diff --git a/js/src/dapps/basiccoin/Send/send.js b/js/src/dapps/basiccoin/Send/send.js index 96eca8466b9..bdefaabb862 100644 --- a/js/src/dapps/basiccoin/Send/send.js +++ b/js/src/dapps/basiccoin/Send/send.js @@ -17,6 +17,7 @@ import React, { Component, PropTypes } from 'react'; import { loadBalances } from '../services'; +import AddressSelect from '../AddressSelect'; import Container from '../Container'; import styles from './send.css'; @@ -27,7 +28,11 @@ export default class Send extends Component { } state = { - loading: true + loading: true, + tokens: null, + selectedToken: null, + availableBalances: [], + fromAddress: null } componentDidMount () { @@ -38,7 +43,7 @@ export default class Send extends Component { const { loading } = this.state; return ( - + { loading ? this.renderLoading() : this.renderBody() } ); @@ -47,13 +52,65 @@ export default class Send extends Component { renderLoading () { return (
      - Loading tokens + Loading available tokens
      ); } renderBody () { - return 'loaded'; + const { availableBalances } = this.state; + const fromAddresses = availableBalances.map((balance) => balance.address); + + return ( +
      +
      + + +
      + The token type to transfer from +
      +
      +
      + + +
      + The account to transfer from +
      +
      +
      + ); + } + + renderTokens () { + const { tokens } = this.state; + + return tokens.map((token) => ( + + )); + } + + onSelectFrom = (event) => { + const fromAddress = event.target.value; + + this.setState({ fromAddress }); + } + + onSelectToken = (event) => { + const { tokens } = this.state; + const address = event.target.value; + const selectedToken = tokens.find((_token) => _token.address === address); + const availableBalances = selectedToken.balances.filter((balance) => balance.balance.gt(0)); + + this.setState({ selectedToken, availableBalances }); + this.onSelectFrom({ target: { value: availableBalances.address } }); } loadBalances () { @@ -64,9 +121,19 @@ export default class Send extends Component { .map((account) => account.address); loadBalances(myAccounts) - .then((balances) => { - console.log(balances); - this.setState({ balances, loading: false }); + .then((_tokens) => { + const tokens = _tokens.filter((token) => { + for (let index = 0; index < token.balances.length; index++) { + if (token.balances[index].balance.gt(0)) { + return true; + } + } + + return false; + }); + + this.setState({ tokens, loading: false }); + this.onSelectToken({ target: { value: tokens[0].address } }); }); } } diff --git a/js/src/dapps/basiccoin/services.js b/js/src/dapps/basiccoin/services.js index 77ac128cf6e..58a8d8ef283 100644 --- a/js/src/dapps/basiccoin/services.js +++ b/js/src/dapps/basiccoin/services.js @@ -166,10 +166,9 @@ export function loadBalances (addresses) { .then((_balances) => { return tokens.map((token, tindex) => { const balances = _balances[tindex]; - token.balances = addresses.reduce((balance, address, aindex) => { - balance[address] = balances[aindex]; - return balance; - }, {}); + token.balances = addresses.map((address, aindex) => { + return { address, balance: balances[aindex] }; + }); return token; }); }); From 3faef8c427365b7dfa126c295d024f196eb9baa4 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 4 Oct 2016 12:04:21 +0200 Subject: [PATCH 0922/1062] form styling updates --- js/src/dapps/basiccoin/Container/container.css | 5 ----- js/src/dapps/basiccoin/Container/container.js | 5 ++--- js/src/dapps/basiccoin/Deploy/deploy.js | 13 +++++++++---- .../dapps/basiccoin/Deployments/deployments.js | 2 +- js/src/dapps/basiccoin/Overview/overview.js | 2 +- js/src/dapps/basiccoin/_form.css | 18 +++++++++++------- 6 files changed, 24 insertions(+), 21 deletions(-) diff --git a/js/src/dapps/basiccoin/Container/container.css b/js/src/dapps/basiccoin/Container/container.css index efcd2b82bdf..9d98eb51b84 100644 --- a/js/src/dapps/basiccoin/Container/container.css +++ b/js/src/dapps/basiccoin/Container/container.css @@ -16,12 +16,7 @@ */ .content { - /*background: whitesmoke; - border-radius: 1px;*/ padding: 4em 2em; margin-bottom: 2em; -} - -.center { text-align: center; } diff --git a/js/src/dapps/basiccoin/Container/container.js b/js/src/dapps/basiccoin/Container/container.js index f0e4dc443f4..82805e71b57 100644 --- a/js/src/dapps/basiccoin/Container/container.js +++ b/js/src/dapps/basiccoin/Container/container.js @@ -20,14 +20,13 @@ import styles from './container.css'; export default class Container extends Component { static propTypes = { - center: PropTypes.bool, className: PropTypes.string, children: PropTypes.node.isRequired } render () { - const { center, className, children } = this.props; - const classes = `${styles.content} ${center ? styles.center : null} ${className}`; + const { className, children } = this.props; + const classes = `${styles.content} ${className}`; return (
      diff --git a/js/src/dapps/basiccoin/Deploy/deploy.js b/js/src/dapps/basiccoin/Deploy/deploy.js index e77a293ea69..c0fdf1bb915 100644 --- a/js/src/dapps/basiccoin/Deploy/deploy.js +++ b/js/src/dapps/basiccoin/Deploy/deploy.js @@ -28,6 +28,7 @@ const ERRORS = { export default class Deploy extends Component { static contextTypes = { + accounts: PropTypes.object.isRequired, router: PropTypes.object.isRequired, managerInstance: PropTypes.object.isRequired, registryInstance: PropTypes.object.isRequired, @@ -85,7 +86,7 @@ export default class Deploy extends Component { if (deployDone) { return ( - +
      Your token has been deployed
      @@ -109,7 +110,7 @@ export default class Deploy extends Component { } return ( - +
      Your token is currently being deployed to the network
      @@ -122,16 +123,20 @@ export default class Deploy extends Component { } renderForm () { + const { accounts } = this.context; const { baseText, globalFeeText, name, nameError, tla, tlaError, totalSupply, totalSupplyError } = this.state; const hasError = !!(nameError || tlaError || totalSupplyError); const error = `${styles.input} ${styles.error}`; + const addresses = Object.keys(accounts).filter((address) => accounts[address].uuid); return (
      - +
      @@ -164,7 +169,7 @@ export default class Deploy extends Component { value={ totalSupply } onChange={ this.onChangeSupply } />
      - { totalSupplyError || `number of tokens in circulation (base: ${baseText})` } + { totalSupplyError || `number of tokens (base: ${baseText})` }
      diff --git a/js/src/dapps/basiccoin/Deployments/deployments.js b/js/src/dapps/basiccoin/Deployments/deployments.js index e317ff52dbe..4996bb87f17 100644 --- a/js/src/dapps/basiccoin/Deployments/deployments.js +++ b/js/src/dapps/basiccoin/Deployments/deployments.js @@ -61,7 +61,7 @@ export default class Deployments extends Component { const { loading } = this.state; return ( - + { loading ? this.renderLoading() : this.renderEvents() } ); diff --git a/js/src/dapps/basiccoin/Overview/overview.js b/js/src/dapps/basiccoin/Overview/overview.js index 7452406eac3..6a3e820759b 100644 --- a/js/src/dapps/basiccoin/Overview/overview.js +++ b/js/src/dapps/basiccoin/Overview/overview.js @@ -43,7 +43,7 @@ export default class Overview extends Component { const { loading } = this.state; return ( - + { loading ? this.renderLoading() : this.renderBody() } ); diff --git a/js/src/dapps/basiccoin/_form.css b/js/src/dapps/basiccoin/_form.css index a1a4b89b73b..46b689ddf11 100644 --- a/js/src/dapps/basiccoin/_form.css +++ b/js/src/dapps/basiccoin/_form.css @@ -16,6 +16,9 @@ */ .form { + text-align: left; + margin: 0 auto; + display: inline-block; } .form .input { @@ -24,16 +27,21 @@ .form .input>* { display: inline-block; - margin-right: 1em; + margin: 0 0.5em; padding: 0.5em; font-size: 1em; } .form label { - opacity: 0.8; width: 20em; + opacity: 0.8; text-align: right; - padding: 0.5em 0; +} + +.form .hint { + width: 20em; + opacity: 0.5; + font-size: 0.75em; } .form input, @@ -54,10 +62,6 @@ margin-right: 11em; } -.form .hint { - opacity: 0.5; -} - .form .error input { border: 1px solid rgba(255, 0, 0, 0.5); } From 6919baf74062cec76f12060ff1e866a372c52c37 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 4 Oct 2016 14:35:05 +0200 Subject: [PATCH 0923/1062] send form layout in place --- .../basiccoin/AddressSelect/addressSelect.css | 3 - .../basiccoin/AddressSelect/addressSelect.js | 22 ++- .../basiccoin/Application/application.js | 4 + js/src/dapps/basiccoin/Deploy/deploy.css | 18 --- js/src/dapps/basiccoin/Deploy/deploy.js | 17 ++- js/src/dapps/basiccoin/Send/send.css | 9 ++ js/src/dapps/basiccoin/Send/send.js | 140 ++++++++++++++---- js/src/dapps/basiccoin/_form.css | 28 +++- js/src/dapps/basiccoin/_vars.css | 1 + 9 files changed, 180 insertions(+), 62 deletions(-) diff --git a/js/src/dapps/basiccoin/AddressSelect/addressSelect.css b/js/src/dapps/basiccoin/AddressSelect/addressSelect.css index 017be8c8f3c..ddfd334e8bd 100644 --- a/js/src/dapps/basiccoin/AddressSelect/addressSelect.css +++ b/js/src/dapps/basiccoin/AddressSelect/addressSelect.css @@ -16,9 +16,6 @@ */ .iconMenu { - /*appearance: none; - -moz-appearance: none; - -webkit-appearance: none;*/ } .iconMenu option { diff --git a/js/src/dapps/basiccoin/AddressSelect/addressSelect.js b/js/src/dapps/basiccoin/AddressSelect/addressSelect.js index aaa1ac7fd13..f770ab15002 100644 --- a/js/src/dapps/basiccoin/AddressSelect/addressSelect.js +++ b/js/src/dapps/basiccoin/AddressSelect/addressSelect.js @@ -43,12 +43,30 @@ export default class AddressSelect extends Component { }); } + componentWillReceiveProps (newProps) { + const { addresses } = this.props; + let changed = addresses.length !== newProps.addresses.length; + + if (!changed) { + changed = addresses.filter((address, index) => newProps.addresses[index] !== address).length; + } + + if (changed) { + this.onChange({ target: { value: newProps.addresses[0] } }); + } + } + render () { const { addresses } = this.props; + const { selectedAddress } = this.state; + const style = { + background: `transparent url(${api.util.createIdentityImg(selectedAddress, 3)}) no-repeat 98% center` + }; return ( @@ -58,12 +76,10 @@ export default class AddressSelect extends Component { renderOption = (address) => { const { accounts } = this.context; const account = accounts[address]; - const style = { background: `transparent url(${api.util.createIdentityImg(account.address, 3)}) no-repeat left center` }; return ( @@ -71,7 +87,7 @@ export default class AddressSelect extends Component { } onChange = (event) => { - this.setState({ selected: event.target.value }); + this.setState({ selectedAddress: event.target.value }); this.props.onChange(event); } } diff --git a/js/src/dapps/basiccoin/Application/application.js b/js/src/dapps/basiccoin/Application/application.js index c96d4786225..1e268e7203f 100644 --- a/js/src/dapps/basiccoin/Application/application.js +++ b/js/src/dapps/basiccoin/Application/application.js @@ -93,6 +93,10 @@ export default class Application extends Component { tokenregInstance, accounts: Object .keys(accountsInfo) + .filter((address) => !accountsInfo[address].meta.deleted) + .sort((a, b) => { + return (accountsInfo[b].uuid || '').localeCompare(accountsInfo[a].uuid || ''); + }) .reduce((accounts, address) => { accounts[address] = Object.assign(accountsInfo[address], { address }); return accounts; diff --git a/js/src/dapps/basiccoin/Deploy/deploy.css b/js/src/dapps/basiccoin/Deploy/deploy.css index 4a4f9b00214..803a9108d30 100644 --- a/js/src/dapps/basiccoin/Deploy/deploy.css +++ b/js/src/dapps/basiccoin/Deploy/deploy.css @@ -24,24 +24,6 @@ a.link, a.link:hover, a.link:visited { cursor: pointer; } -.buttonRow { - width: 40em; - text-align: right; - padding: 0 2em; -} - .button { background: $bgDeploy; - color: white; - border: none; - border-radius: 1px; - padding: 1em 2em; - display: inline-block; - margin-left: 1em; - cursor: pointer; -} - -.button[disabled] { - opacity: 0.5; - cursor: default; } diff --git a/js/src/dapps/basiccoin/Deploy/deploy.js b/js/src/dapps/basiccoin/Deploy/deploy.js index c0fdf1bb915..d4834361888 100644 --- a/js/src/dapps/basiccoin/Deploy/deploy.js +++ b/js/src/dapps/basiccoin/Deploy/deploy.js @@ -182,13 +182,16 @@ export default class Deploy extends Component { register as a network token (fee: { globalFeeText }ETH)
      -
      -
      -
      - Deploy Token +
      +
      diff --git a/js/src/dapps/basiccoin/Send/send.css b/js/src/dapps/basiccoin/Send/send.css index ef1aa573612..d8bea918703 100644 --- a/js/src/dapps/basiccoin/Send/send.css +++ b/js/src/dapps/basiccoin/Send/send.css @@ -18,3 +18,12 @@ @import '../_form.css'; @import '../_status.css'; @import '../_vars.css'; + +a.link, a.link:hover, a.link:visited { + color: $bgSend; + cursor: pointer; +} + +.button { + background: $bgSend; +} diff --git a/js/src/dapps/basiccoin/Send/send.js b/js/src/dapps/basiccoin/Send/send.js index bdefaabb862..86075a96179 100644 --- a/js/src/dapps/basiccoin/Send/send.js +++ b/js/src/dapps/basiccoin/Send/send.js @@ -32,56 +32,114 @@ export default class Send extends Component { tokens: null, selectedToken: null, availableBalances: [], - fromAddress: null + fromAddress: null, + fromBalance: null, + toAddress: null, + toKnown: true, + amount: 0, + amountError: null } componentDidMount () { this.loadBalances(); + this.onAmountChange({ target: { value: '0' } }); } render () { const { loading } = this.state; - return ( - - { loading ? this.renderLoading() : this.renderBody() } - - ); + return loading + ? this.renderLoading() + : this.renderBody(); } renderLoading () { return ( -
      - Loading available tokens -
      + +
      + Loading available tokens +
      +
      ); } renderBody () { - const { availableBalances } = this.state; + const { accounts } = this.context; + const { availableBalances, fromAddress, amount, amountError, toKnown, toAddress } = this.state; + const fromBalance = availableBalances.find((balance) => balance.address === fromAddress); const fromAddresses = availableBalances.map((balance) => balance.address); + const toAddresses = Object.keys(accounts); + const toInput = toKnown + ? + : ; + const hasError = amountError; + const error = `${styles.input} ${styles.error}`; + const maxAmountHint = `Value to transfer (max: ${fromBalance ? fromBalance.balance.div(1000000).toFormat(6) : '1'})`; return ( -
      -
      - - -
      - The token type to transfer from + +
      +
      + + +
      + The token type to transfer +
      -
      -
      - - -
      - The account to transfer from +
      + + +
      + The account to transfer from +
      +
      +
      + + +
      + the type of address input +
      +
      +
      +
      +
      + + +
      + { amountError || maxAmountHint } +
      +
      +
      +
      -
      +
      ); } @@ -92,7 +150,7 @@ export default class Send extends Component { )); } @@ -103,6 +161,18 @@ export default class Send extends Component { this.setState({ fromAddress }); } + onChangeTo = (event) => { + const toAddress = event.target.value; + + this.setState({ toAddress }); + } + + onChangeToType = (event) => { + const toKnown = event.target.value === 'known'; + + this.setState({ toKnown }); + } + onSelectToken = (event) => { const { tokens } = this.state; const address = event.target.value; @@ -110,7 +180,19 @@ export default class Send extends Component { const availableBalances = selectedToken.balances.filter((balance) => balance.balance.gt(0)); this.setState({ selectedToken, availableBalances }); - this.onSelectFrom({ target: { value: availableBalances.address } }); + this.onSelectFrom({ target: { value: availableBalances[0].address } }); + } + + onAmountChange = (event) => { + const amount = parseFloat(event.target.value); + const amountError = !isFinite(amount) || amount <= 0 + ? 'amount needs to be > 0' + : null; + + this.setState({ amount, amountError }); + } + + onSend = () => { } loadBalances () { diff --git a/js/src/dapps/basiccoin/_form.css b/js/src/dapps/basiccoin/_form.css index 46b689ddf11..f17a2a815f0 100644 --- a/js/src/dapps/basiccoin/_form.css +++ b/js/src/dapps/basiccoin/_form.css @@ -25,7 +25,7 @@ margin-bottom: 1.5em; } -.form .input>* { +.form .input * { display: inline-block; margin: 0 0.5em; padding: 0.5em; @@ -48,9 +48,12 @@ .form select { width: 20em; background: rgba(255, 255, 255, 0.25); - border-radius: 5px; + border-radius: 1px; border: 1px solid rgba(0, 0, 0, 0.25); box-sizing: border-box; + -moz-appearance: none; + -webkit-appearance: none; + appearance: none; } .form select { @@ -64,6 +67,7 @@ .form .error input { border: 1px solid rgba(255, 0, 0, 0.5); + color: red; } .form .error label { @@ -73,3 +77,23 @@ .form .error .hint { color: red; } + +.buttonRow { + text-align: right; + width: 20em; +} + +.button { + color: white; + border: none; + border-radius: 1px; + padding: 1em 2em !important; + display: inline-block; + margin-left: 1em !important; + cursor: pointer; +} + +.button[disabled] { + opacity: 0.5; + cursor: default; +} diff --git a/js/src/dapps/basiccoin/_vars.css b/js/src/dapps/basiccoin/_vars.css index ebfc9076b32..dfd2ab322cc 100644 --- a/js/src/dapps/basiccoin/_vars.css +++ b/js/src/dapps/basiccoin/_vars.css @@ -19,3 +19,4 @@ $bgEvents: #808; $bgDeploy: #088; $bgOverview: #080; $bgDeployments: #f80; +$bgSend: #80f; From ac717b4efcad9fe0e13cf2a7b45b1672d5585ea6 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 4 Oct 2016 16:13:21 +0200 Subject: [PATCH 0924/1062] coin send working as expected --- js/src/dapps/basiccoin/Deploy/deploy.js | 20 ++-- js/src/dapps/basiccoin/Events/events.js | 2 +- js/src/dapps/basiccoin/Send/send.js | 116 +++++++++++++++++++++++- js/src/dapps/basiccoin/_form.css | 13 ++- 4 files changed, 132 insertions(+), 19 deletions(-) diff --git a/js/src/dapps/basiccoin/Deploy/deploy.js b/js/src/dapps/basiccoin/Deploy/deploy.js index d4834361888..c4b52ec390f 100644 --- a/js/src/dapps/basiccoin/Deploy/deploy.js +++ b/js/src/dapps/basiccoin/Deploy/deploy.js @@ -100,12 +100,16 @@ export default class Deploy extends Component { ); } - let error = null; if (deployError) { - error = ( -
      - { deployError } -
      + return ( + +
      + Your deployment has encountered an error +
      +
      + { deployError } +
      +
      ); } @@ -117,7 +121,6 @@ export default class Deploy extends Component {
      { deployState }
      - { error } ); } @@ -179,7 +182,7 @@ export default class Deploy extends Component {
      - register as a network token (fee: { globalFeeText }ETH) + register on network (fee: { globalFeeText }ETH)
      @@ -246,7 +249,6 @@ export default class Deploy extends Component { const tokenreg = (globalReg ? tokenregInstance : registryInstance).address; const values = [base.mul(totalSupply), tla, name, tokenreg]; - let gasPassed = 0; const options = { from: fromAddress, value: globalReg ? globalFee : 0 @@ -259,7 +261,7 @@ export default class Deploy extends Component { .then((gas) => { this.setState({ deployState: 'Gas estimated, Posting transaction to the network' }); - gasPassed = gas.mul(1.2); + const gasPassed = gas.mul(1.2); options.gas = gasPassed.toFixed(0); console.log(`gas estimated at ${gas.toFormat(0)}, passing ${gasPassed.toFormat(0)}`); diff --git a/js/src/dapps/basiccoin/Events/events.js b/js/src/dapps/basiccoin/Events/events.js index 4ccb8bb6e17..823338388b0 100644 --- a/js/src/dapps/basiccoin/Events/events.js +++ b/js/src/dapps/basiccoin/Events/events.js @@ -21,7 +21,7 @@ import Container from '../Container'; export default class Deploy extends Component { render () { return ( - + todo ... ); } } diff --git a/js/src/dapps/basiccoin/Send/send.js b/js/src/dapps/basiccoin/Send/send.js index 86075a96179..2ea250339b0 100644 --- a/js/src/dapps/basiccoin/Send/send.js +++ b/js/src/dapps/basiccoin/Send/send.js @@ -14,8 +14,12 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . +import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; +import { eip20 } from '../../../contracts/abi'; + +import { api } from '../parity'; import { loadBalances } from '../services'; import AddressSelect from '../AddressSelect'; import Container from '../Container'; @@ -37,7 +41,14 @@ export default class Send extends Component { toAddress: null, toKnown: true, amount: 0, - amountError: null + amountError: null, + sendBusy: false, + sendError: null, + sendState: null, + sendDone: false, + signerRequestId: null, + txHash: null, + txReceipt: null } componentDidMount () { @@ -53,6 +64,58 @@ export default class Send extends Component { : this.renderBody(); } + renderBody () { + const { sendBusy } = this.state; + + return sendBusy + ? this.renderSending() + : this.renderForm(); + } + + renderSending () { + const { sendDone, sendError, sendState } = this.state; + + if (sendDone) { + return ( + +
      + Your token value transfer has been completed +
      +
      + View token events or view information relating to this transaction and any of your other tokens. +
      +
      + { sendState } +
      +
      + ); + } + + if (sendError) { + return ( + +
      + Your deployment has encountered an error +
      +
      + { sendError } +
      +
      + ); + } + + return ( + +
      + Your token value is being transferred +
      +
      + { sendState } +
      +
      + ); + } + renderLoading () { return ( @@ -63,7 +126,7 @@ export default class Send extends Component { ); } - renderBody () { + renderForm () { const { accounts } = this.context; const { availableBalances, fromAddress, amount, amountError, toKnown, toAddress } = this.state; const fromBalance = availableBalances.find((balance) => balance.address === fromAddress); @@ -193,6 +256,55 @@ export default class Send extends Component { } onSend = () => { + const { amount, fromAddress, toAddress, amountError, selectedToken, sendBusy } = this.state; + const hasError = amountError; + + if (hasError || sendBusy) { + return; + } + + const values = [toAddress, new BigNumber(amount).mul(1000000).toFixed(0)]; + const options = { + from: fromAddress + }; + const instance = api.newContract(eip20, selectedToken.address).instance; + + this.setState({ sendBusy: true, sendState: 'Estimating gas for the transaction' }); + + instance + .transfer.estimateGas(options, values) + .then((gas) => { + this.setState({ sendState: 'Gas estimated, Posting transaction to the network' }); + + const gasPassed = gas.mul(1.2); + options.gas = gasPassed.toFixed(0); + console.log(`gas estimated at ${gas.toFormat(0)}, passing ${gasPassed.toFormat(0)}`); + + return instance.transfer.postTransaction(options, values); + }) + .then((signerRequestId) => { + this.setState({ signerRequestId, sendState: 'Transaction posted, Waiting for transaction authorization' }); + + return api.pollMethod('eth_checkRequest', signerRequestId); + }) + .then((txHash) => { + this.setState({ txHash, sendState: 'Transaction authorized, Waiting for network confirmations' }); + + return api.pollMethod('eth_getTransactionReceipt', txHash, (receipt) => { + if (!receipt || !receipt.blockNumber || receipt.blockNumber.eq(0)) { + return false; + } + + return true; + }); + }) + .then((txReceipt) => { + this.setState({ txReceipt, sendDone: true, sendState: 'Network confirmed, Received transaction receipt' }); + }) + .catch((error) => { + console.error('onSend', error); + this.setState({ sendError: error.message }); + }); } loadBalances () { diff --git a/js/src/dapps/basiccoin/_form.css b/js/src/dapps/basiccoin/_form.css index f17a2a815f0..458e029ebbc 100644 --- a/js/src/dapps/basiccoin/_form.css +++ b/js/src/dapps/basiccoin/_form.css @@ -33,20 +33,19 @@ } .form label { - width: 20em; + width: 25em; opacity: 0.8; text-align: right; } .form .hint { - width: 20em; + width: 25em; opacity: 0.5; - font-size: 0.75em; } .form input, .form select { - width: 20em; + width: 18em; background: rgba(255, 255, 255, 0.25); border-radius: 1px; border: 1px solid rgba(0, 0, 0, 0.25); @@ -61,8 +60,8 @@ } .form input.small { - width: 10em; - margin-right: 11em; + width: 9em; + margin-right: 10em; } .form .error input { @@ -80,7 +79,7 @@ .buttonRow { text-align: right; - width: 20em; + width: 18em; } .button { From 3d362e17f2a7671128144ef7ba38d9bd513a3852 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 4 Oct 2016 18:05:59 +0200 Subject: [PATCH 0925/1062] api subscriptions on multiple addresses --- js/src/api/contract/contract.spec.js | 2 +- js/src/api/format/input.js | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/js/src/api/contract/contract.spec.js b/js/src/api/contract/contract.spec.js index 2d03bed6cc8..2c97eed185b 100644 --- a/js/src/api/contract/contract.spec.js +++ b/js/src/api/contract/contract.spec.js @@ -113,7 +113,7 @@ describe('api/contract/Contract', () => { ]); contract.at('6789'); - expect(Object.keys(contract.instance)).to.deep.equal(['Drained', 'balanceOf']); + expect(Object.keys(contract.instance)).to.deep.equal(['Drained', 'balanceOf', 'address']); expect(contract.address).to.equal('6789'); }); }); diff --git a/js/src/api/format/input.js b/js/src/api/format/input.js index f87d5ec5c11..16ca2b7f299 100644 --- a/js/src/api/format/input.js +++ b/js/src/api/format/input.js @@ -16,7 +16,7 @@ import BigNumber from 'bignumber.js'; -import { isHex, isInstanceOf, isString } from '../util/types'; +import { isArray, isHex, isInstanceOf, isString } from '../util/types'; export function inAddress (address) { // TODO: address validation if we have upper-lower addresses @@ -63,7 +63,11 @@ export function inFilter (options) { Object.keys(options).forEach((key) => { switch (key) { case 'address': - options[key] = inAddress(options[key]); + if (isArray(options[key])) { + options[key] = options[key].map(inAddress); + } else { + options[key] = inAddress(options[key]); + } break; case 'fromBlock': From dbe83ae59c61f44fec595bd3f0f049a803d05f3d Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 4 Oct 2016 18:06:10 +0200 Subject: [PATCH 0926/1062] bring in events --- js/src/dapps/basiccoin/Events/events.css | 20 +++++ js/src/dapps/basiccoin/Events/events.js | 81 +++++++++++++++++++- js/src/dapps/basiccoin/services.js | 96 ++++++++++++++++++++---- 3 files changed, 183 insertions(+), 14 deletions(-) create mode 100644 js/src/dapps/basiccoin/Events/events.css diff --git a/js/src/dapps/basiccoin/Events/events.css b/js/src/dapps/basiccoin/Events/events.css new file mode 100644 index 00000000000..ef1aa573612 --- /dev/null +++ b/js/src/dapps/basiccoin/Events/events.css @@ -0,0 +1,20 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +@import '../_form.css'; +@import '../_status.css'; +@import '../_vars.css'; diff --git a/js/src/dapps/basiccoin/Events/events.js b/js/src/dapps/basiccoin/Events/events.js index 823338388b0..9eeaa8a4d3c 100644 --- a/js/src/dapps/basiccoin/Events/events.js +++ b/js/src/dapps/basiccoin/Events/events.js @@ -16,12 +16,91 @@ import React, { Component } from 'react'; +import { loadAllTokens, subscribeEvents, unsubscribeEvents } from '../services'; import Container from '../Container'; +import styles from './events.css'; + export default class Deploy extends Component { + state = { + subscriptionId: 0, + loading: true, + events: [], + pendingEvents: [], + minedEvents: [] + } + + componentDidMount () { + loadAllTokens() + .then((tokens) => { + const addresses = tokens.map((token) => token.address); + + return subscribeEvents(addresses, this.eventCallback); + }) + .then((subscriptionId) => { + this.setState({ subscriptionId, loading: false }); + }) + .catch((error) => { + console.error('componentDidMount', error); + }); + } + + componentWillUnmount () { + const { subscriptionId } = this.state; + + if (subscriptionId) { + unsubscribeEvents(subscriptionId); + } + } + render () { + const { loading } = this.state; + + return loading + ? this.renderLoading() + : this.renderEvents(); + } + + renderLoading () { + return ( + +
      + Attaching events +
      +
      + ); + } + + renderEvents () { + const { events } = this.state; + + return events.length + ? this.renderEventsList() + : this.renderEventsNone(); + } + + renderEventsNone () { return ( - todo ... + +
      + There are currently no events available +
      +
      ); } + + renderEventsList () { + return ( + events go here ... + ); + } + + eventCallback = (error, events) => { + if (error) { + console.error('eventCallback', error); + return; + } + + console.log(events); + } } diff --git a/js/src/dapps/basiccoin/services.js b/js/src/dapps/basiccoin/services.js index 58a8d8ef283..acb967506b7 100644 --- a/js/src/dapps/basiccoin/services.js +++ b/js/src/dapps/basiccoin/services.js @@ -24,28 +24,78 @@ let tokenregInstance; let registryInstance; const registries = {}; +const subscriptions = {}; +let nextSubscriptionId = 1000; -export function totalSupply (address) { - return api.newContract(abis.eip20, address) - .instance.totalSupply.call(); -} +export function subscribeEvents (addresses, callback) { + const subscriptionId = nextSubscriptionId++; + const contract = api.newContract(abis.eip20); + const event = contract.events.filter((evt) => evt.name === 'Transfer'); -export function getCoin (tokenreg, address) { - return registries[tokenreg].fromAddress - .call({}, [address]) - .then(([id, tla, base, name, owner]) => { - return { - id, tla, base, name, owner, - isGlobal: tokenregInstance.address === tokenreg - }; + return api.eth + .newFilter({ + address: addresses, + fromBlock: 0, + toBlock: 'pending', + limit: 50, + topics: [event.signature] + }) + .then((filterId) => { + subscriptions[subscriptionId] = { subscriptionId, filterId, addresses, callback, contract }; + + return api.eth.getFilterLogs(filterId); }) + .then((logs) => callback(null, contract.parseEventLogs(logs))) + .then(() => subscriptionId) .catch((error) => { - console.error('getCoin', error); + console.error('subscribeEvents', error); throw error; }); } +export function unsubscribeEvents (subscriptionId) { + api.eth + .uninstallFilter(subscriptions[subscriptionId].filterId) + .catch((error) => { + console.error('unsubscribeEvents', error); + }); + + delete subscriptions[subscriptionId]; +} + +function pollEvents () { + const loop = Object.values(subscriptions); + const timeout = () => setTimeout(pollEvents, 1000); + + Promise + .all(loop.map((subscription) => api.eth.getFilterChanges(subscription.filterId))) + .then((logsArray) => { + logsArray.forEach((logs, index) => { + const subscription = loop[index]; + + if (!logs || !logs.length) { + return; + } + + try { + subscription.callback(null, subscription.contract.parseEventLogs(logs)); + } catch (error) { + unsubscribeEvents(loop.subscriptionId); + console.error('pollEvents', error); + } + }); + + timeout(); + }) + .catch((error) => { + console.error('pollEvents', error); + timeout(); + }); +} + export function attachInstances () { + pollEvents(); + return api.ethcore .registryAddress() .then((registryAddress) => { @@ -82,6 +132,26 @@ export function attachInstances () { }); } +export function totalSupply (address) { + return api.newContract(abis.eip20, address) + .instance.totalSupply.call(); +} + +export function getCoin (tokenreg, address) { + return registries[tokenreg].fromAddress + .call({}, [address]) + .then(([id, tla, base, name, owner]) => { + return { + id, tla, base, name, owner, + isGlobal: tokenregInstance.address === tokenreg + }; + }) + .catch((error) => { + console.error('getCoin', error); + throw error; + }); +} + export function loadOwnedTokens (addresses) { let total = new BigNumber(0); From b01dc4136b4f0863a053697b069c5357e1fc8a6b Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Tue, 4 Oct 2016 22:43:53 +0200 Subject: [PATCH 0927/1062] simplify --- js/src/dapps/basiccoin.js | 8 +- .../basiccoin/Application/Header/header.css | 3 +- .../basiccoin/Application/Header/header.js | 21 +- js/src/dapps/basiccoin/Application/pages.js | 25 +- .../dapps/basiccoin/Container/container.css | 4 +- .../Deployment/deployment.css} | 7 +- .../basiccoin/Deploy/Deployment/deployment.js | 288 ++++++++++++++++++ .../Deployment}/index.js | 2 +- .../{Deployments => Deploy}/Event/event.css | 0 .../{Deployments => Deploy}/Event/event.js | 0 .../{Deployments => Deploy}/Event/index.js | 0 .../Events/events.css} | 7 - .../Events/events.js} | 10 +- .../basiccoin/{ => Deploy}/Events/index.js | 0 js/src/dapps/basiccoin/Deploy/deploy.css | 29 -- js/src/dapps/basiccoin/Deploy/deploy.js | 277 +---------------- .../{ => Transfer}/Events/events.css | 5 +- .../basiccoin/{ => Transfer}/Events/events.js | 6 +- .../dapps/basiccoin/Transfer/Events/index.js | 17 ++ .../basiccoin/{ => Transfer}/Send/index.js | 0 .../basiccoin/{ => Transfer}/Send/send.css | 14 +- .../basiccoin/{ => Transfer}/Send/send.js | 18 +- js/src/dapps/basiccoin/Transfer/index.js | 17 ++ js/src/dapps/basiccoin/Transfer/transfer.js | 31 ++ js/src/dapps/basiccoin/_form.css | 10 + 25 files changed, 413 insertions(+), 386 deletions(-) rename js/src/dapps/basiccoin/{_vars.css => Deploy/Deployment/deployment.css} (88%) create mode 100644 js/src/dapps/basiccoin/Deploy/Deployment/deployment.js rename js/src/dapps/basiccoin/{Deployments => Deploy/Deployment}/index.js (94%) rename js/src/dapps/basiccoin/{Deployments => Deploy}/Event/event.css (100%) rename js/src/dapps/basiccoin/{Deployments => Deploy}/Event/event.js (100%) rename js/src/dapps/basiccoin/{Deployments => Deploy}/Event/index.js (100%) rename js/src/dapps/basiccoin/{Deployments/deployments.css => Deploy/Events/events.css} (87%) rename js/src/dapps/basiccoin/{Deployments/deployments.js => Deploy/Events/events.js} (94%) rename js/src/dapps/basiccoin/{ => Deploy}/Events/index.js (100%) delete mode 100644 js/src/dapps/basiccoin/Deploy/deploy.css rename js/src/dapps/basiccoin/{ => Transfer}/Events/events.css (90%) rename js/src/dapps/basiccoin/{ => Transfer}/Events/events.js (95%) create mode 100644 js/src/dapps/basiccoin/Transfer/Events/index.js rename js/src/dapps/basiccoin/{ => Transfer}/Send/index.js (100%) rename js/src/dapps/basiccoin/{ => Transfer}/Send/send.css (78%) rename js/src/dapps/basiccoin/{ => Transfer}/Send/send.js (93%) create mode 100644 js/src/dapps/basiccoin/Transfer/index.js create mode 100644 js/src/dapps/basiccoin/Transfer/transfer.js diff --git a/js/src/dapps/basiccoin.js b/js/src/dapps/basiccoin.js index e167a880317..58fb37cf635 100644 --- a/js/src/dapps/basiccoin.js +++ b/js/src/dapps/basiccoin.js @@ -23,11 +23,9 @@ import injectTapEventPlugin from 'react-tap-event-plugin'; injectTapEventPlugin(); import Deploy from './basiccoin/Deploy'; -import Deployments from './basiccoin/Deployments'; -import Events from './basiccoin/Events'; import Application from './basiccoin/Application'; import Overview from './basiccoin/Overview'; -import Send from './basiccoin/Send'; +import Transfer from './basiccoin/Transfer'; const routerHistory = useRouterHistory(createHashHistory)({}); @@ -39,10 +37,8 @@ ReactDOM.render( - - - + , document.querySelector('#container') diff --git a/js/src/dapps/basiccoin/Application/Header/header.css b/js/src/dapps/basiccoin/Application/Header/header.css index aa896389bc7..7edb580c50a 100644 --- a/js/src/dapps/basiccoin/Application/Header/header.css +++ b/js/src/dapps/basiccoin/Application/Header/header.css @@ -16,6 +16,7 @@ */ .header { + margin-bottom: 4em; } .titlebar { @@ -27,7 +28,7 @@ .navigation { table-layout: fixed; width: 100%; - border-spacing: 0; + border-spacing: 0.25em; border-collapse: separate; border-color: white; background: white; diff --git a/js/src/dapps/basiccoin/Application/Header/header.js b/js/src/dapps/basiccoin/Application/Header/header.js index 353e3dee01a..3afd5872edf 100644 --- a/js/src/dapps/basiccoin/Application/Header/header.js +++ b/js/src/dapps/basiccoin/Application/Header/header.js @@ -19,6 +19,8 @@ import React, { Component, PropTypes } from 'react'; import PAGES from '../pages'; import styles from './header.css'; +const colors = ['#622', '#733', '#844']; + export default class Header extends Component { static contextTypes = { router: PropTypes.object.isRequired @@ -35,11 +37,9 @@ export default class Header extends Component { { this.renderHeader(0, offset) } { this.renderHeader(1, offset) } - { this.renderHeader(2, offset) } - { this.renderHeader(3, offset) } - { this.renderHeader(4, offset) } + { this.renderHeader(2, offset) } @@ -47,15 +47,16 @@ export default class Header extends Component { ); } - renderHeader (index, offset) { - const page = PAGES[(index + offset) % PAGES.length]; + renderHeader (position, offset) { + const index = (position + offset) % PAGES.length; + const page = PAGES[index]; return (
      { page.title } @@ -64,7 +65,7 @@ export default class Header extends Component { { page.byline }
      - { index ? null : page.description } + { position ? null : page.description }
      ); diff --git a/js/src/dapps/basiccoin/Application/pages.js b/js/src/dapps/basiccoin/Application/pages.js index faf597c2fa7..5ab422ee4aa 100644 --- a/js/src/dapps/basiccoin/Application/pages.js +++ b/js/src/dapps/basiccoin/Application/pages.js @@ -17,36 +17,21 @@ const PAGES = [ { path: 'overview', - color: '#080', title: 'Overview', byline: 'Display all the current information relating to your own deployed tokens', - description: 'View the total number of tokens in circulation, the number of different tokens associated with your accounts as well as the types of tokens created by you.' + description: 'View the total number of tokens in circulation, the number of different tokens associated with your accounts as well as the types of tokens created by you. In addition view the balances associated with your accounts in reltion to the total in circulation.' }, { - path: 'send', - color: '#80f', - title: 'Send', - byline: 'Send tokens associated with your accounts to other addresses' - }, - { - path: 'events', - color: '#808', - title: 'Events', - byline: 'Track the events for your tokens, showing actions as they hapenned' + path: 'transfer', + title: 'Transfer', + byline: 'Send tokens associated with your accounts to other addresses', + description: 'Send any tokens created byt you or received from others. In addition have a bird\'s eye view of all events relating to token transfers, be it yours, created byt others, either local or globally available on the network.' }, { path: 'deploy', - color: '#088', title: 'Deploy', byline: 'Deploy a new token to the network', description: 'Token registration has never been this easy. Select the name for your token, the TLA and the number of tokens in circulation. Start sending the tokens to contacts right from this interface. Optionally you can register the token with the Token Registry which would allow you to transaction in tokens from anywhere these transactions are allowed.' - }, - { - path: 'deployments', - color: '#f80', - title: 'Deployments', - byline: 'Show the status of all network tokens deployed with this application', - description: 'Showing all the token creation events, both for your tokens and tokens created by others on the network. This includes when, by whom, name & TLA as well as the global and local network status.' } ]; diff --git a/js/src/dapps/basiccoin/Container/container.css b/js/src/dapps/basiccoin/Container/container.css index 9d98eb51b84..e860a4332d4 100644 --- a/js/src/dapps/basiccoin/Container/container.css +++ b/js/src/dapps/basiccoin/Container/container.css @@ -16,7 +16,7 @@ */ .content { - padding: 4em 2em; - margin-bottom: 2em; + padding: 0 2em; + margin-bottom: 4em; text-align: center; } diff --git a/js/src/dapps/basiccoin/_vars.css b/js/src/dapps/basiccoin/Deploy/Deployment/deployment.css similarity index 88% rename from js/src/dapps/basiccoin/_vars.css rename to js/src/dapps/basiccoin/Deploy/Deployment/deployment.css index dfd2ab322cc..f24729cf78f 100644 --- a/js/src/dapps/basiccoin/_vars.css +++ b/js/src/dapps/basiccoin/Deploy/Deployment/deployment.css @@ -15,8 +15,5 @@ /* along with Parity. If not, see . */ -$bgEvents: #808; -$bgDeploy: #088; -$bgOverview: #080; -$bgDeployments: #f80; -$bgSend: #80f; +@import '../../_form.css'; +@import '../../_status.css'; diff --git a/js/src/dapps/basiccoin/Deploy/Deployment/deployment.js b/js/src/dapps/basiccoin/Deploy/Deployment/deployment.js new file mode 100644 index 00000000000..c78366c5685 --- /dev/null +++ b/js/src/dapps/basiccoin/Deploy/Deployment/deployment.js @@ -0,0 +1,288 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import { api } from '../../parity'; +import AddressSelect from '../../AddressSelect'; +import Container from '../../Container'; +import styles from './deployment.css'; + +const ERRORS = { + name: 'specify a valid name >2 & <32 characters', + tla: 'specify a valid TLA, 3 characters in length' +}; + +export default class Deployment extends Component { + static contextTypes = { + accounts: PropTypes.object.isRequired, + router: PropTypes.object.isRequired, + managerInstance: PropTypes.object.isRequired, + registryInstance: PropTypes.object.isRequired, + tokenregInstance: PropTypes.object.isRequired + } + + state = { + base: null, + deployBusy: false, + deployDone: false, + deployError: null, + deployState: null, + globalReg: false, + globalFee: 0, + globalFeeText: '1.000', + fromAddress: null, + name: '', + nameError: ERRORS.name, + tla: '', + tlaError: ERRORS.tla, + totalSupply: '5000000', + totalSupplyError: null, + signerRequestId: null, + txHash: null + } + + componentDidMount () { + const { managerInstance, tokenregInstance } = this.context; + + Promise + .all([ + managerInstance.base.call(), + tokenregInstance.fee.call() + ]) + .then(([base, globalFee]) => { + this.setState({ + base, + baseText: base.toFormat(0), + globalFee, + globalFeeText: api.util.fromWei(globalFee).toFormat(3) + }); + }); + } + + render () { + const { deployBusy } = this.state; + + return deployBusy + ? this.renderDeploying() + : this.renderForm(); + } + + renderDeploying () { + const { deployDone, deployError, deployState } = this.state; + + if (deployDone) { + return ( + +
      + Your token has been deployed +
      +
      + ); + } + + if (deployError) { + return ( + +
      + Your deployment has encountered an error +
      +
      + { deployError } +
      +
      + ); + } + + return ( + +
      + Your token is currently being deployed to the network +
      +
      + { deployState } +
      +
      + ); + } + + renderForm () { + const { accounts } = this.context; + const { baseText, globalFeeText, name, nameError, tla, tlaError, totalSupply, totalSupplyError } = this.state; + const hasError = !!(nameError || tlaError || totalSupplyError); + const error = `${styles.input} ${styles.error}`; + const addresses = Object.keys(accounts).filter((address) => accounts[address].uuid); + + return ( + +
      +
      + + +
      +
      + + +
      + { nameError || 'an identifying name for the token' } +
      +
      +
      + + +
      + { tlaError || 'unique network acronym for this token' } +
      +
      +
      + + +
      + { totalSupplyError || `number of tokens (base: ${baseText})` } +
      +
      +
      + + +
      + register on network (fee: { globalFeeText }ETH) +
      +
      +
      +
      +
      +
      + ); + } + + onChangeFrom = (event) => { + const fromAddress = event.target.value; + + this.setState({ fromAddress }); + } + + onChangeName = (event) => { + const name = event.target.value; + const nameError = name && (name.length > 2) && (name.length < 32) + ? null + : ERRORS.name; + + this.setState({ name, nameError }); + } + + onChangeRegistrar = (event) => { + this.setState({ globalReg: event.target.value === 'yes' }); + } + + onChangeSupply = (event) => { + const totalSupply = event.target.value; + + this.setState({ totalSupply }); + } + + onChangeTla = (event) => { + const _tla = event.target.value; + const tla = _tla && (_tla.length > 3) + ? _tla.substr(0, 3) + : _tla; + const tlaError = tla && (tla.length === 3) + ? null + : ERRORS.tla; + + this.setState({ tla, tlaError }); + } + + onDeploy = () => { + const { managerInstance, registryInstance, tokenregInstance } = this.context; + const { base, deployBusy, fromAddress, globalReg, globalFee, name, nameError, tla, tlaError, totalSupply, totalSupplyError } = this.state; + const hasError = !!(nameError || tlaError || totalSupplyError); + + if (hasError || deployBusy) { + return; + } + + const tokenreg = (globalReg ? tokenregInstance : registryInstance).address; + const values = [base.mul(totalSupply), tla, name, tokenreg]; + const options = { + from: fromAddress, + value: globalReg ? globalFee : 0 + }; + + this.setState({ deployBusy: true, deployState: 'Estimating gas for the transaction' }); + + managerInstance + .deploy.estimateGas(options, values) + .then((gas) => { + this.setState({ deployState: 'Gas estimated, Posting transaction to the network' }); + + const gasPassed = gas.mul(1.2); + options.gas = gasPassed.toFixed(0); + console.log(`gas estimated at ${gas.toFormat(0)}, passing ${gasPassed.toFormat(0)}`); + + return managerInstance.deploy.postTransaction(options, values); + }) + .then((signerRequestId) => { + this.setState({ signerRequestId, deployState: 'Transaction posted, Waiting for transaction authorization' }); + + return api.pollMethod('eth_checkRequest', signerRequestId); + }) + .then((txHash) => { + this.setState({ txHash, deployState: 'Transaction authorized, Waiting for network confirmations' }); + + return api.pollMethod('eth_getTransactionReceipt', txHash, (receipt) => { + if (!receipt || !receipt.blockNumber || receipt.blockNumber.eq(0)) { + return false; + } + + return true; + }); + }) + .then((txReceipt) => { + this.setState({ txReceipt, deployDone: true, deployState: 'Network confirmed, Received transaction receipt' }); + }) + .catch((error) => { + console.error('onDeploy', error); + this.setState({ deployError: error.message }); + }); + } +} diff --git a/js/src/dapps/basiccoin/Deployments/index.js b/js/src/dapps/basiccoin/Deploy/Deployment/index.js similarity index 94% rename from js/src/dapps/basiccoin/Deployments/index.js rename to js/src/dapps/basiccoin/Deploy/Deployment/index.js index 089378dd7ed..927cff5691f 100644 --- a/js/src/dapps/basiccoin/Deployments/index.js +++ b/js/src/dapps/basiccoin/Deploy/Deployment/index.js @@ -14,4 +14,4 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -export default from './deployments'; +export default from './deployment'; diff --git a/js/src/dapps/basiccoin/Deployments/Event/event.css b/js/src/dapps/basiccoin/Deploy/Event/event.css similarity index 100% rename from js/src/dapps/basiccoin/Deployments/Event/event.css rename to js/src/dapps/basiccoin/Deploy/Event/event.css diff --git a/js/src/dapps/basiccoin/Deployments/Event/event.js b/js/src/dapps/basiccoin/Deploy/Event/event.js similarity index 100% rename from js/src/dapps/basiccoin/Deployments/Event/event.js rename to js/src/dapps/basiccoin/Deploy/Event/event.js diff --git a/js/src/dapps/basiccoin/Deployments/Event/index.js b/js/src/dapps/basiccoin/Deploy/Event/index.js similarity index 100% rename from js/src/dapps/basiccoin/Deployments/Event/index.js rename to js/src/dapps/basiccoin/Deploy/Event/index.js diff --git a/js/src/dapps/basiccoin/Deployments/deployments.css b/js/src/dapps/basiccoin/Deploy/Events/events.css similarity index 87% rename from js/src/dapps/basiccoin/Deployments/deployments.css rename to js/src/dapps/basiccoin/Deploy/Events/events.css index c23352732a2..5e8548e914f 100644 --- a/js/src/dapps/basiccoin/Deployments/deployments.css +++ b/js/src/dapps/basiccoin/Deploy/Events/events.css @@ -15,13 +15,6 @@ /* along with Parity. If not, see . */ -@import '../_vars.css'; - -a.link, a.link:hover, a.link:visited { - color: $bgDeployments; - cursor: pointer; -} - .statusHeader { font-size: 1.25em; } diff --git a/js/src/dapps/basiccoin/Deployments/deployments.js b/js/src/dapps/basiccoin/Deploy/Events/events.js similarity index 94% rename from js/src/dapps/basiccoin/Deployments/deployments.js rename to js/src/dapps/basiccoin/Deploy/Events/events.js index 4996bb87f17..a21672a8efc 100644 --- a/js/src/dapps/basiccoin/Deployments/deployments.js +++ b/js/src/dapps/basiccoin/Deploy/Events/events.js @@ -16,13 +16,13 @@ import React, { Component, PropTypes } from 'react'; -import { api } from '../parity'; -import Container from '../Container'; -import Event from './Event'; +import { api } from '../../parity'; +import Container from '../../Container'; +import Event from '../Event'; -import styles from './deployments.css'; +import styles from './events.css'; -export default class Deployments extends Component { +export default class Events extends Component { static contextTypes = { managerInstance: PropTypes.object.isRequired } diff --git a/js/src/dapps/basiccoin/Events/index.js b/js/src/dapps/basiccoin/Deploy/Events/index.js similarity index 100% rename from js/src/dapps/basiccoin/Events/index.js rename to js/src/dapps/basiccoin/Deploy/Events/index.js diff --git a/js/src/dapps/basiccoin/Deploy/deploy.css b/js/src/dapps/basiccoin/Deploy/deploy.css deleted file mode 100644 index 803a9108d30..00000000000 --- a/js/src/dapps/basiccoin/Deploy/deploy.css +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright 2015, 2016 Ethcore (UK) Ltd. -/* This file is part of Parity. -/* -/* Parity is free software: you can redistribute it and/or modify -/* it under the terms of the GNU General Public License as published by -/* the Free Software Foundation, either version 3 of the License, or -/* (at your option) any later version. -/* -/* Parity is distributed in the hope that it will be useful, -/* but WITHOUT ANY WARRANTY; without even the implied warranty of -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -/* GNU General Public License for more details. -/* -/* You should have received a copy of the GNU General Public License -/* along with Parity. If not, see . -*/ - -@import '../_form.css'; -@import '../_status.css'; -@import '../_vars.css'; - -a.link, a.link:hover, a.link:visited { - color: $bgDeploy; - cursor: pointer; -} - -.button { - background: $bgDeploy; -} diff --git a/js/src/dapps/basiccoin/Deploy/deploy.js b/js/src/dapps/basiccoin/Deploy/deploy.js index c4b52ec390f..34c7eed8a32 100644 --- a/js/src/dapps/basiccoin/Deploy/deploy.js +++ b/js/src/dapps/basiccoin/Deploy/deploy.js @@ -14,281 +14,18 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -import React, { Component, PropTypes } from 'react'; +import React, { Component } from 'react'; -import { api } from '../parity'; -import AddressSelect from '../AddressSelect'; -import Container from '../Container'; -import styles from './deploy.css'; - -const ERRORS = { - name: 'specify a valid name >2 & <32 characters', - tla: 'specify a valid TLA, 3 characters in length' -}; +import Deployment from './Deployment'; +import Events from './Events'; export default class Deploy extends Component { - static contextTypes = { - accounts: PropTypes.object.isRequired, - router: PropTypes.object.isRequired, - managerInstance: PropTypes.object.isRequired, - registryInstance: PropTypes.object.isRequired, - tokenregInstance: PropTypes.object.isRequired - } - - state = { - base: null, - deployBusy: false, - deployDone: false, - deployError: null, - deployState: null, - globalReg: false, - globalFee: 0, - globalFeeText: '1.000', - fromAddress: null, - name: '', - nameError: ERRORS.name, - tla: '', - tlaError: ERRORS.tla, - totalSupply: '5000000', - totalSupplyError: null, - signerRequestId: null, - txHash: null - } - - componentDidMount () { - const { managerInstance, tokenregInstance } = this.context; - - Promise - .all([ - managerInstance.base.call(), - tokenregInstance.fee.call() - ]) - .then(([base, globalFee]) => { - this.setState({ - base, - baseText: base.toFormat(0), - globalFee, - globalFeeText: api.util.fromWei(globalFee).toFormat(3) - }); - }); - } - render () { - const { deployBusy } = this.state; - - return deployBusy - ? this.renderDeploying() - : this.renderForm(); - } - - renderDeploying () { - const { deployDone, deployError, deployState } = this.state; - - if (deployDone) { - return ( - -
      - Your token has been deployed -
      -
      - Start sending tokens or view information relating to this and any of your other tokens. -
      -
      - { deployState } -
      -
      - ); - } - - if (deployError) { - return ( - -
      - Your deployment has encountered an error -
      -
      - { deployError } -
      -
      - ); - } - return ( - -
      - Your token is currently being deployed to the network -
      -
      - { deployState } -
      -
      +
      + + +
      ); } - - renderForm () { - const { accounts } = this.context; - const { baseText, globalFeeText, name, nameError, tla, tlaError, totalSupply, totalSupplyError } = this.state; - const hasError = !!(nameError || tlaError || totalSupplyError); - const error = `${styles.input} ${styles.error}`; - const addresses = Object.keys(accounts).filter((address) => accounts[address].uuid); - - return ( - -
      -
      - - -
      -
      - - -
      - { nameError || 'an identifying name for the token' } -
      -
      -
      - - -
      - { tlaError || 'unique network acronym for this token' } -
      -
      -
      - - -
      - { totalSupplyError || `number of tokens (base: ${baseText})` } -
      -
      -
      - - -
      - register on network (fee: { globalFeeText }ETH) -
      -
      -
      -
      -
      -
      - ); - } - - onChangeFrom = (event) => { - const fromAddress = event.target.value; - - this.setState({ fromAddress }); - } - - onChangeName = (event) => { - const name = event.target.value; - const nameError = name && (name.length > 2) && (name.length < 32) - ? null - : ERRORS.name; - - this.setState({ name, nameError }); - } - - onChangeRegistrar = (event) => { - this.setState({ globalReg: event.target.value === 'yes' }); - } - - onChangeSupply = (event) => { - const totalSupply = event.target.value; - - this.setState({ totalSupply }); - } - - onChangeTla = (event) => { - const _tla = event.target.value; - const tla = _tla && (_tla.length > 3) - ? _tla.substr(0, 3) - : _tla; - const tlaError = tla && (tla.length === 3) - ? null - : ERRORS.tla; - - this.setState({ tla, tlaError }); - } - - onDeploy = () => { - const { managerInstance, registryInstance, tokenregInstance } = this.context; - const { base, deployBusy, fromAddress, globalReg, globalFee, name, nameError, tla, tlaError, totalSupply, totalSupplyError } = this.state; - const hasError = !!(nameError || tlaError || totalSupplyError); - - if (hasError || deployBusy) { - return; - } - - const tokenreg = (globalReg ? tokenregInstance : registryInstance).address; - const values = [base.mul(totalSupply), tla, name, tokenreg]; - const options = { - from: fromAddress, - value: globalReg ? globalFee : 0 - }; - - this.setState({ deployBusy: true, deployState: 'Estimating gas for the transaction' }); - - managerInstance - .deploy.estimateGas(options, values) - .then((gas) => { - this.setState({ deployState: 'Gas estimated, Posting transaction to the network' }); - - const gasPassed = gas.mul(1.2); - options.gas = gasPassed.toFixed(0); - console.log(`gas estimated at ${gas.toFormat(0)}, passing ${gasPassed.toFormat(0)}`); - - return managerInstance.deploy.postTransaction(options, values); - }) - .then((signerRequestId) => { - this.setState({ signerRequestId, deployState: 'Transaction posted, Waiting for transaction authorization' }); - - return api.pollMethod('eth_checkRequest', signerRequestId); - }) - .then((txHash) => { - this.setState({ txHash, deployState: 'Transaction authorized, Waiting for network confirmations' }); - - return api.pollMethod('eth_getTransactionReceipt', txHash, (receipt) => { - if (!receipt || !receipt.blockNumber || receipt.blockNumber.eq(0)) { - return false; - } - - return true; - }); - }) - .then((txReceipt) => { - this.setState({ txReceipt, deployDone: true, deployState: 'Network confirmed, Received transaction receipt' }); - }) - .catch((error) => { - console.error('onDeploy', error); - this.setState({ deployError: error.message }); - }); - } } diff --git a/js/src/dapps/basiccoin/Events/events.css b/js/src/dapps/basiccoin/Transfer/Events/events.css similarity index 90% rename from js/src/dapps/basiccoin/Events/events.css rename to js/src/dapps/basiccoin/Transfer/Events/events.css index ef1aa573612..f24729cf78f 100644 --- a/js/src/dapps/basiccoin/Events/events.css +++ b/js/src/dapps/basiccoin/Transfer/Events/events.css @@ -15,6 +15,5 @@ /* along with Parity. If not, see . */ -@import '../_form.css'; -@import '../_status.css'; -@import '../_vars.css'; +@import '../../_form.css'; +@import '../../_status.css'; diff --git a/js/src/dapps/basiccoin/Events/events.js b/js/src/dapps/basiccoin/Transfer/Events/events.js similarity index 95% rename from js/src/dapps/basiccoin/Events/events.js rename to js/src/dapps/basiccoin/Transfer/Events/events.js index 9eeaa8a4d3c..d78f520efb8 100644 --- a/js/src/dapps/basiccoin/Events/events.js +++ b/js/src/dapps/basiccoin/Transfer/Events/events.js @@ -16,12 +16,12 @@ import React, { Component } from 'react'; -import { loadAllTokens, subscribeEvents, unsubscribeEvents } from '../services'; -import Container from '../Container'; +import { loadAllTokens, subscribeEvents, unsubscribeEvents } from '../../services'; +import Container from '../../Container'; import styles from './events.css'; -export default class Deploy extends Component { +export default class Events extends Component { state = { subscriptionId: 0, loading: true, diff --git a/js/src/dapps/basiccoin/Transfer/Events/index.js b/js/src/dapps/basiccoin/Transfer/Events/index.js new file mode 100644 index 00000000000..88ad6d407c9 --- /dev/null +++ b/js/src/dapps/basiccoin/Transfer/Events/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './events'; diff --git a/js/src/dapps/basiccoin/Send/index.js b/js/src/dapps/basiccoin/Transfer/Send/index.js similarity index 100% rename from js/src/dapps/basiccoin/Send/index.js rename to js/src/dapps/basiccoin/Transfer/Send/index.js diff --git a/js/src/dapps/basiccoin/Send/send.css b/js/src/dapps/basiccoin/Transfer/Send/send.css similarity index 78% rename from js/src/dapps/basiccoin/Send/send.css rename to js/src/dapps/basiccoin/Transfer/Send/send.css index d8bea918703..f24729cf78f 100644 --- a/js/src/dapps/basiccoin/Send/send.css +++ b/js/src/dapps/basiccoin/Transfer/Send/send.css @@ -15,15 +15,5 @@ /* along with Parity. If not, see . */ -@import '../_form.css'; -@import '../_status.css'; -@import '../_vars.css'; - -a.link, a.link:hover, a.link:visited { - color: $bgSend; - cursor: pointer; -} - -.button { - background: $bgSend; -} +@import '../../_form.css'; +@import '../../_status.css'; diff --git a/js/src/dapps/basiccoin/Send/send.js b/js/src/dapps/basiccoin/Transfer/Send/send.js similarity index 93% rename from js/src/dapps/basiccoin/Send/send.js rename to js/src/dapps/basiccoin/Transfer/Send/send.js index 2ea250339b0..0640002ac50 100644 --- a/js/src/dapps/basiccoin/Send/send.js +++ b/js/src/dapps/basiccoin/Transfer/Send/send.js @@ -17,12 +17,12 @@ import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; -import { eip20 } from '../../../contracts/abi'; +import { eip20 } from '../../../../contracts/abi'; -import { api } from '../parity'; -import { loadBalances } from '../services'; -import AddressSelect from '../AddressSelect'; -import Container from '../Container'; +import { api } from '../../parity'; +import { loadBalances } from '../../services'; +import AddressSelect from '../../AddressSelect'; +import Container from '../../Container'; import styles from './send.css'; @@ -81,12 +81,6 @@ export default class Send extends Component {
      Your token value transfer has been completed
      -
      - View token events or view information relating to this transaction and any of your other tokens. -
      -
      - { sendState } -
      ); } @@ -197,7 +191,7 @@ export default class Send extends Component { className={ styles.button } disabled={ hasError } onClick={ this.onSend }> - Send Tokens + Transfer Tokens
      diff --git a/js/src/dapps/basiccoin/Transfer/index.js b/js/src/dapps/basiccoin/Transfer/index.js new file mode 100644 index 00000000000..24d36d79637 --- /dev/null +++ b/js/src/dapps/basiccoin/Transfer/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './transfer'; diff --git a/js/src/dapps/basiccoin/Transfer/transfer.js b/js/src/dapps/basiccoin/Transfer/transfer.js new file mode 100644 index 00000000000..842d4b7bcfb --- /dev/null +++ b/js/src/dapps/basiccoin/Transfer/transfer.js @@ -0,0 +1,31 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component } from 'react'; + +import Events from './Events'; +import Send from './Send'; + +export default class Transfer extends Component { + render () { + return ( +
      + + +
      + ); + } +} diff --git a/js/src/dapps/basiccoin/_form.css b/js/src/dapps/basiccoin/_form.css index 458e029ebbc..3d42af41214 100644 --- a/js/src/dapps/basiccoin/_form.css +++ b/js/src/dapps/basiccoin/_form.css @@ -15,6 +15,15 @@ /* along with Parity. If not, see . */ +.button { + background: #622; +} + +a.link, a.link:hover, a.link:visited { + color: #622; + cursor: pointer; +} + .form { text-align: left; margin: 0 auto; @@ -90,6 +99,7 @@ display: inline-block; margin-left: 1em !important; cursor: pointer; + position: relative; } .button[disabled] { From adf8493969cccf91ddcff3111a3edb82bdd500ef Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 5 Oct 2016 11:16:13 +0200 Subject: [PATCH 0928/1062] basic events display in-place, functionally complete --- js/src/contracts/abi/eip20.json | 164 +++++++++++++++++- js/src/dapps/basiccoin/Deploy/Event/event.css | 6 +- js/src/dapps/basiccoin/Deploy/Event/event.js | 2 +- .../dapps/basiccoin/Transfer/Event/event.js | 103 +++++++++++ .../dapps/basiccoin/Transfer/Event/index.js | 17 ++ .../basiccoin/Transfer/Events/events.css | 5 + .../dapps/basiccoin/Transfer/Events/events.js | 65 +++++-- 7 files changed, 343 insertions(+), 19 deletions(-) create mode 100644 js/src/dapps/basiccoin/Transfer/Event/event.js create mode 100644 js/src/dapps/basiccoin/Transfer/Event/index.js diff --git a/js/src/contracts/abi/eip20.json b/js/src/contracts/abi/eip20.json index 23dcd747882..6937e28c85b 100644 --- a/js/src/contracts/abi/eip20.json +++ b/js/src/contracts/abi/eip20.json @@ -1 +1,163 @@ -[{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"total","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_spender","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Approval","type":"event"}] +[ + { + "constant": false, + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "name": "total", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "name": "balance", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + }, + { + "name": "_spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "name": "remaining", + "type": "uint256" + } + ], + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": true, + "name": "to", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + } +] diff --git a/js/src/dapps/basiccoin/Deploy/Event/event.css b/js/src/dapps/basiccoin/Deploy/Event/event.css index 823dc2b079f..51396a56df8 100644 --- a/js/src/dapps/basiccoin/Deploy/Event/event.css +++ b/js/src/dapps/basiccoin/Deploy/Event/event.css @@ -36,10 +36,14 @@ text-align: right; } -.frominfo { +.address { text-align: left; } .description { text-align: left; } + +.center { + text-align: right; +} diff --git a/js/src/dapps/basiccoin/Deploy/Event/event.js b/js/src/dapps/basiccoin/Deploy/Event/event.js index cc109f09f87..5417f60391c 100644 --- a/js/src/dapps/basiccoin/Deploy/Event/event.js +++ b/js/src/dapps/basiccoin/Deploy/Event/event.js @@ -54,7 +54,7 @@ export default class Event extends Component {
      { isPending ? 'Pending' : event.blockNumber.toFormat() }
      { event.event } - +
      { this.renderAddress(event.params.owner) }
      { this.renderHash(event.transactionHash) }
      diff --git a/js/src/dapps/basiccoin/Transfer/Event/event.js b/js/src/dapps/basiccoin/Transfer/Event/event.js new file mode 100644 index 00000000000..b86653036f7 --- /dev/null +++ b/js/src/dapps/basiccoin/Transfer/Event/event.js @@ -0,0 +1,103 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +// TODO: This is a copy & paste for Deploy/Event -> render() different. Not very DRY +import moment from 'moment'; +import React, { Component, PropTypes } from 'react'; + +import { api } from '../../parity'; +import { getCoin } from '../../services'; +import styles from '../../Deploy/Event/event.css'; + +export default class Event extends Component { + static contextTypes = { + accounts: PropTypes.object.isRequired, + registryInstance: PropTypes.object.isRequired, + tokenregInstance: PropTypes.object.isRequired + } + + static propTypes = { + event: PropTypes.object.isRequired + } + + state = { + block: null, + coin: {} + } + + componentDidMount () { + this.lookup(); + } + + render () { + const { event } = this.props; + const { block, coin } = this.state; + const isPending = event.type === 'pending'; + + return ( + + +
      { (isPending || !block) ? '' : moment(block.timestamp).fromNow() }
      +
      { isPending ? 'Pending' : event.blockNumber.toFormat() }
      + + { event.event } + +
      { this.renderAddress(event.params.from) }
      + + +
      { event.params.value.div(1000000).toFormat(6) }
      +
      ⇒
      +
      { this.renderHash(event.transactionHash) }
      + + +
      { this.renderAddress(event.params.to) }
      + + +
      { isPending ? '' : coin.tla }
      +
      { isPending ? '' : coin.name }
      + + + ); + } + + renderAddress (address) { + const { accounts } = this.context; + const account = accounts[address]; + + return account ? account.name : address; + } + + renderHash (hash) { + return `${hash.substr(0, 10)}...${hash.slice(-10)}`; + } + + lookup () { + const { event } = this.props; + + if (event.type === 'pending') { + return; + } + + Promise + .all([ + api.eth.getBlockByNumber(event.blockNumber), + getCoin(event.params.tokenreg, event.params.coin) + ]) + .then(([block, coin]) => { + this.setState({ block, coin }); + }); + } +} diff --git a/js/src/dapps/basiccoin/Transfer/Event/index.js b/js/src/dapps/basiccoin/Transfer/Event/index.js new file mode 100644 index 00000000000..0925882d3e3 --- /dev/null +++ b/js/src/dapps/basiccoin/Transfer/Event/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './event'; diff --git a/js/src/dapps/basiccoin/Transfer/Events/events.css b/js/src/dapps/basiccoin/Transfer/Events/events.css index f24729cf78f..f07aa7192a9 100644 --- a/js/src/dapps/basiccoin/Transfer/Events/events.css +++ b/js/src/dapps/basiccoin/Transfer/Events/events.css @@ -17,3 +17,8 @@ @import '../../_form.css'; @import '../../_status.css'; + +.eventList { + border: none; + margin: 0 auto; +} diff --git a/js/src/dapps/basiccoin/Transfer/Events/events.js b/js/src/dapps/basiccoin/Transfer/Events/events.js index d78f520efb8..b6a0307d0f3 100644 --- a/js/src/dapps/basiccoin/Transfer/Events/events.js +++ b/js/src/dapps/basiccoin/Transfer/Events/events.js @@ -16,8 +16,10 @@ import React, { Component } from 'react'; +import { api } from '../../parity'; import { loadAllTokens, subscribeEvents, unsubscribeEvents } from '../../services'; import Container from '../../Container'; +import Event from '../Event'; import styles from './events.css'; @@ -56,18 +58,18 @@ export default class Events extends Component { render () { const { loading } = this.state; - return loading - ? this.renderLoading() - : this.renderEvents(); + return ( + + { loading ? this.renderLoading() : this.renderEvents() } + + ); } renderLoading () { return ( - -
      - Attaching events -
      -
      +
      + Attaching events +
      ); } @@ -81,26 +83,57 @@ export default class Events extends Component { renderEventsNone () { return ( - -
      - There are currently no events available -
      -
      +
      + There are currently no events available +
      ); } renderEventsList () { + const { events } = this.state; + const rows = events.map((event) => ( + + )); + return ( - events go here ... + + + { rows } + +
      ); } - eventCallback = (error, events) => { + logToEvent = (log) => { + log.key = api.util.sha3(JSON.stringify(log)); + + return log; + } + + eventCallback = (error, logs) => { if (error) { console.error('eventCallback', error); return; } - console.log(events); + const { minedEvents, pendingEvents } = this.state; + const minedNew = logs + .filter((log) => log.type === 'mined') + .map(this.logToEvent) + .filter((log) => !minedEvents.find((event) => event.transactionHash === log.transactionHash)) + .reverse() + .concat(minedEvents); + const pendingNew = logs + .filter((log) => log.type === 'pending') + .map(this.logToEvent) + .filter((log) => !pendingEvents.find((event) => event.transactionHash === log.transactionHash)) + .reverse() + .concat(pendingEvents) + .filter((log) => !minedNew.find((event) => event.transactionHash === log.transactionHash)); + const events = [].concat(pendingNew).concat(minedNew); + + this.setState({ loading: false, events, minedEvents: minedNew, pendingEvents: pendingNew }); } } From d86e6e1cbbd9248f66734533e78a73fb7d5618ed Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 5 Oct 2016 12:29:43 +0200 Subject: [PATCH 0929/1062] basic functionality in-place --- js/src/dapps/basiccoin/Deploy/Event/event.css | 6 +-- js/src/dapps/basiccoin/Deploy/Event/event.js | 10 ++++- .../dapps/basiccoin/Deploy/Events/events.css | 8 ++++ .../basiccoin/IdentityIcon/identityIcon.css | 7 ++-- .../basiccoin/IdentityIcon/identityIcon.js | 2 +- .../dapps/basiccoin/Transfer/Event/event.js | 38 ++++++++++--------- .../basiccoin/Transfer/Events/events.css | 24 ------------ .../dapps/basiccoin/Transfer/Events/events.js | 26 ++++++++----- 8 files changed, 57 insertions(+), 64 deletions(-) delete mode 100644 js/src/dapps/basiccoin/Transfer/Events/events.css diff --git a/js/src/dapps/basiccoin/Deploy/Event/event.css b/js/src/dapps/basiccoin/Deploy/Event/event.css index 51396a56df8..47c060c2102 100644 --- a/js/src/dapps/basiccoin/Deploy/Event/event.css +++ b/js/src/dapps/basiccoin/Deploy/Event/event.css @@ -25,11 +25,7 @@ .mined td, .pending td { padding: 0.5em 1em; -} - -.mined td>div+div, -.pending td>div+div { - margin-top: 0.25em; + line-height: 24px; } .blocknumber { diff --git a/js/src/dapps/basiccoin/Deploy/Event/event.js b/js/src/dapps/basiccoin/Deploy/Event/event.js index 5417f60391c..e11b21258f6 100644 --- a/js/src/dapps/basiccoin/Deploy/Event/event.js +++ b/js/src/dapps/basiccoin/Deploy/Event/event.js @@ -19,6 +19,7 @@ import React, { Component, PropTypes } from 'react'; import { api } from '../../parity'; import { getCoin } from '../../services'; +import IdentityIcon from '../../IdentityIcon'; import styles from './event.css'; @@ -55,7 +56,7 @@ export default class Event extends Component { { event.event } -
      { this.renderAddress(event.params.owner) }
      + { this.renderAddress(event.params.owner) }
      { this.renderHash(event.transactionHash) }
      @@ -71,7 +72,12 @@ export default class Event extends Component { const { accounts } = this.context; const account = accounts[address]; - return account ? account.name : address; + return ( +
      + + { account ? account.name : address } +
      + ); } renderHash (hash) { diff --git a/js/src/dapps/basiccoin/Deploy/Events/events.css b/js/src/dapps/basiccoin/Deploy/Events/events.css index 5e8548e914f..52469504541 100644 --- a/js/src/dapps/basiccoin/Deploy/Events/events.css +++ b/js/src/dapps/basiccoin/Deploy/Events/events.css @@ -22,4 +22,12 @@ .eventList { border: none; margin: 0 auto; + border-collapse: collapse; +} + +.eventList tr:nth-child(even) { + background: #faf5f5; +} + +.eventList tr:nth-child(odd) { } diff --git a/js/src/dapps/basiccoin/IdentityIcon/identityIcon.css b/js/src/dapps/basiccoin/IdentityIcon/identityIcon.css index 2b645d8239b..6abbcf808b7 100644 --- a/js/src/dapps/basiccoin/IdentityIcon/identityIcon.css +++ b/js/src/dapps/basiccoin/IdentityIcon/identityIcon.css @@ -16,8 +16,7 @@ */ .icon { - width: 32px; - height: 32px; - border-radius: 50%; - margin-right: 0.5em; + width: 24px; + height: 24px; + margin: 0 0.5em -4px 0; } diff --git a/js/src/dapps/basiccoin/IdentityIcon/identityIcon.js b/js/src/dapps/basiccoin/IdentityIcon/identityIcon.js index 51f48d46ab3..0bc86731d45 100644 --- a/js/src/dapps/basiccoin/IdentityIcon/identityIcon.js +++ b/js/src/dapps/basiccoin/IdentityIcon/identityIcon.js @@ -30,7 +30,7 @@ export default class IdentityIcon extends Component { return ( + src={ api.util.createIdentityImg(address, 3) } /> ); } } diff --git a/js/src/dapps/basiccoin/Transfer/Event/event.js b/js/src/dapps/basiccoin/Transfer/Event/event.js index b86653036f7..2e74fd8ea38 100644 --- a/js/src/dapps/basiccoin/Transfer/Event/event.js +++ b/js/src/dapps/basiccoin/Transfer/Event/event.js @@ -19,7 +19,7 @@ import moment from 'moment'; import React, { Component, PropTypes } from 'react'; import { api } from '../../parity'; -import { getCoin } from '../../services'; +import IdentityIcon from '../../IdentityIcon'; import styles from '../../Deploy/Event/event.css'; export default class Event extends Component { @@ -30,12 +30,12 @@ export default class Event extends Component { } static propTypes = { - event: PropTypes.object.isRequired + event: PropTypes.object.isRequired, + token: PropTypes.object.isRequired } state = { - block: null, - coin: {} + block: null } componentDidMount () { @@ -43,8 +43,8 @@ export default class Event extends Component { } render () { - const { event } = this.props; - const { block, coin } = this.state; + const { event, token } = this.props; + const { block } = this.state; const isPending = event.type === 'pending'; return ( @@ -55,7 +55,7 @@ export default class Event extends Component { { event.event } -
      { this.renderAddress(event.params.from) }
      + { this.renderAddress(event.params.from) }
      { event.params.value.div(1000000).toFormat(6) }
      @@ -63,11 +63,11 @@ export default class Event extends Component {
      { this.renderHash(event.transactionHash) }
      -
      { this.renderAddress(event.params.to) }
      + { this.renderAddress(event.params.to) } -
      { isPending ? '' : coin.tla }
      -
      { isPending ? '' : coin.name }
      +
      { isPending ? '' : token && token.coin.tla }
      +
      { isPending ? '' : token && token.coin.name }
      ); @@ -77,7 +77,12 @@ export default class Event extends Component { const { accounts } = this.context; const account = accounts[address]; - return account ? account.name : address; + return ( +
      + + { account ? account.name : address } +
      + ); } renderHash (hash) { @@ -91,13 +96,10 @@ export default class Event extends Component { return; } - Promise - .all([ - api.eth.getBlockByNumber(event.blockNumber), - getCoin(event.params.tokenreg, event.params.coin) - ]) - .then(([block, coin]) => { - this.setState({ block, coin }); + api.eth + .getBlockByNumber(event.blockNumber) + .then((block) => { + this.setState({ block }); }); } } diff --git a/js/src/dapps/basiccoin/Transfer/Events/events.css b/js/src/dapps/basiccoin/Transfer/Events/events.css deleted file mode 100644 index f07aa7192a9..00000000000 --- a/js/src/dapps/basiccoin/Transfer/Events/events.css +++ /dev/null @@ -1,24 +0,0 @@ -/* Copyright 2015, 2016 Ethcore (UK) Ltd. -/* This file is part of Parity. -/* -/* Parity is free software: you can redistribute it and/or modify -/* it under the terms of the GNU General Public License as published by -/* the Free Software Foundation, either version 3 of the License, or -/* (at your option) any later version. -/* -/* Parity is distributed in the hope that it will be useful, -/* but WITHOUT ANY WARRANTY; without even the implied warranty of -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -/* GNU General Public License for more details. -/* -/* You should have received a copy of the GNU General Public License -/* along with Parity. If not, see . -*/ - -@import '../../_form.css'; -@import '../../_status.css'; - -.eventList { - border: none; - margin: 0 auto; -} diff --git a/js/src/dapps/basiccoin/Transfer/Events/events.js b/js/src/dapps/basiccoin/Transfer/Events/events.js index b6a0307d0f3..dcead03bb78 100644 --- a/js/src/dapps/basiccoin/Transfer/Events/events.js +++ b/js/src/dapps/basiccoin/Transfer/Events/events.js @@ -21,7 +21,7 @@ import { loadAllTokens, subscribeEvents, unsubscribeEvents } from '../../service import Container from '../../Container'; import Event from '../Event'; -import styles from './events.css'; +import styles from '../../Deploy/Events/events.css'; export default class Events extends Component { state = { @@ -29,14 +29,15 @@ export default class Events extends Component { loading: true, events: [], pendingEvents: [], - minedEvents: [] + minedEvents: [], + tokens: [] } componentDidMount () { loadAllTokens() .then((tokens) => { const addresses = tokens.map((token) => token.address); - + this.setState({ tokens }); return subscribeEvents(addresses, this.eventCallback); }) .then((subscriptionId) => { @@ -90,12 +91,17 @@ export default class Events extends Component { } renderEventsList () { - const { events } = this.state; - const rows = events.map((event) => ( - - )); + const { events, tokens } = this.state; + const rows = events.map((event) => { + const token = tokens.find((token) => token.address === event.address); + + return ( + + ); + }); return ( @@ -133,7 +139,7 @@ export default class Events extends Component { .concat(pendingEvents) .filter((log) => !minedNew.find((event) => event.transactionHash === log.transactionHash)); const events = [].concat(pendingNew).concat(minedNew); - + console.log('*** events', events.map((event) => event.address)); this.setState({ loading: false, events, minedEvents: minedNew, pendingEvents: pendingNew }); } } From 67542867d9d414beaa689f59c4fae80b14a94698 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 5 Oct 2016 13:17:25 +0200 Subject: [PATCH 0930/1062] fix horrible event address issue --- js/src/api/contract/contract.js | 1 - js/src/api/contract/contract.spec.js | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/js/src/api/contract/contract.js b/js/src/api/contract/contract.js index 4402898f03d..40caa764334 100644 --- a/js/src/api/contract/contract.js +++ b/js/src/api/contract/contract.js @@ -147,7 +147,6 @@ export default class Contract { const decoded = event.decodeLog(log.topics, log.data); log.params = {}; - log.address = decoded.address; log.event = event.name; decoded.params.forEach((param) => { diff --git a/js/src/api/contract/contract.spec.js b/js/src/api/contract/contract.spec.js index 2c97eed185b..7ac3e099c9d 100644 --- a/js/src/api/contract/contract.spec.js +++ b/js/src/api/contract/contract.spec.js @@ -171,7 +171,7 @@ describe('api/contract/Contract', () => { const log = decoded.logs[0]; expect(log.event).to.equal('Message'); - expect(log.address).to.equal('0xfa64203C044691aA57251aF95f4b48d85eC00Dd5'); + expect(log.address).to.equal('0x22bff18ec62281850546a664bb63a5c06ac5f76c'); expect(log.params).to.deep.equal({ at: new BigNumber('1457965151'), message: 'post(message)', @@ -457,7 +457,7 @@ describe('api/contract/Contract', () => { transactionIndex: '0x0' }]; const parsed = [{ - address: '0xfa64203C044691aA57251aF95f4b48d85eC00Dd5', + address: '0x22bfF18ec62281850546a664bb63a5C06AC5F76C', blockHash: '0xa9280530a3b47bee2fc80f2862fd56502ae075350571d724d6442ea4c597347b', blockNumber: new BigNumber(20429), data: '0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063cf90d3f0410092fc0fca41846f5962239791950000000000000000000000000000000000000000000000000000000056e6c85f0000000000000000000000000000000000000000000000000001000000004fcd00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000d706f7374286d6573736167652900000000000000000000000000000000000000', From 0d8cfd9360f3a9698f73fa77d515838dbde18ae0 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 5 Oct 2016 13:23:14 +0200 Subject: [PATCH 0931/1062] rwork display of events slightly --- js/src/dapps/basiccoin/Deploy/Event/event.js | 8 ++++---- js/src/dapps/basiccoin/Transfer/Event/event.js | 8 ++++---- js/src/dapps/basiccoin/services.js | 15 ++++++++------- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/js/src/dapps/basiccoin/Deploy/Event/event.js b/js/src/dapps/basiccoin/Deploy/Event/event.js index e11b21258f6..9b524f9284b 100644 --- a/js/src/dapps/basiccoin/Deploy/Event/event.js +++ b/js/src/dapps/basiccoin/Deploy/Event/event.js @@ -55,14 +55,14 @@ export default class Event extends Component {
      { isPending ? 'Pending' : event.blockNumber.toFormat() }
      - + ); diff --git a/js/src/dapps/basiccoin/Transfer/Event/event.js b/js/src/dapps/basiccoin/Transfer/Event/event.js index 2e74fd8ea38..03f88f1e881 100644 --- a/js/src/dapps/basiccoin/Transfer/Event/event.js +++ b/js/src/dapps/basiccoin/Transfer/Event/event.js @@ -54,6 +54,10 @@ export default class Event extends Component {
      { isPending ? 'Pending' : event.blockNumber.toFormat() }
      + @@ -65,10 +69,6 @@ export default class Event extends Component { - ); } diff --git a/js/src/dapps/basiccoin/services.js b/js/src/dapps/basiccoin/services.js index acb967506b7..60705aef91a 100644 --- a/js/src/dapps/basiccoin/services.js +++ b/js/src/dapps/basiccoin/services.js @@ -31,15 +31,16 @@ export function subscribeEvents (addresses, callback) { const subscriptionId = nextSubscriptionId++; const contract = api.newContract(abis.eip20); const event = contract.events.filter((evt) => evt.name === 'Transfer'); + const options = { + address: addresses, + fromBlock: 0, + toBlock: 'pending', + limit: 50, + topics: [event.signature] + }; return api.eth - .newFilter({ - address: addresses, - fromBlock: 0, - toBlock: 'pending', - limit: 50, - topics: [event.signature] - }) + .newFilter(options) .then((filterId) => { subscriptions[subscriptionId] = { subscriptionId, filterId, addresses, callback, contract }; From 227b19f5911906b7d68f3a5e84452576a6da715e Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 5 Oct 2016 15:47:43 +0200 Subject: [PATCH 0932/1062] test TLA availability --- .../basiccoin/Deploy/Deployment/deployment.js | 40 ++++++++++++++++--- js/src/dapps/basiccoin/_form.css | 3 +- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/js/src/dapps/basiccoin/Deploy/Deployment/deployment.js b/js/src/dapps/basiccoin/Deploy/Deployment/deployment.js index c78366c5685..dab42446ed6 100644 --- a/js/src/dapps/basiccoin/Deploy/Deployment/deployment.js +++ b/js/src/dapps/basiccoin/Deploy/Deployment/deployment.js @@ -23,7 +23,9 @@ import styles from './deployment.css'; const ERRORS = { name: 'specify a valid name >2 & <32 characters', - tla: 'specify a valid TLA, 3 characters in length' + tla: 'specify a valid TLA, 3 characters in length', + usedtla: 'the TLA used is not available for registration', + supply: 'supply needs to be valid >999 & <1 trillion' }; export default class Deployment extends Component { @@ -161,7 +163,7 @@ export default class Deployment extends Component { @@ -211,13 +213,16 @@ export default class Deployment extends Component { } onChangeRegistrar = (event) => { - this.setState({ globalReg: event.target.value === 'yes' }); + this.setState({ globalReg: event.target.value === 'yes' }, this.testTlaAvailability); } onChangeSupply = (event) => { - const totalSupply = event.target.value; + const totalSupply = parseInt(event.target.value, 10); + const totalSupplyError = isFinite(totalSupply) && totalSupply > 999 + ? null + : ERRORS.supply; - this.setState({ totalSupply }); + this.setState({ totalSupply, totalSupplyError }); } onChangeTla = (event) => { @@ -229,7 +234,30 @@ export default class Deployment extends Component { ? null : ERRORS.tla; - this.setState({ tla, tlaError }); + this.setState({ tla, tlaError }, this.testTlaAvailability); + } + + testTlaAvailability = () => { + const { registryInstance, tokenregInstance } = this.context; + const { globalReg, tla, tlaError } = this.state; + const tokenreg = globalReg ? tokenregInstance : registryInstance; + + if (tlaError && tlaError !== ERRORS.usedtla) { + return; + } + + tokenreg + .fromTLA.call({}, [tla]) + .then(([id, addr, base, name, owner]) => { + if (owner !== '0x0000000000000000000000000000000000000000') { + this.setState({ tlaError: ERRORS.usedtla }); + } else if (tlaError === ERRORS.usedtla) { + this.setState({ tlaError: null }); + } + }) + .catch((error) => { + console.log('testTlaAvailability', error); + }); } onDeploy = () => { diff --git a/js/src/dapps/basiccoin/_form.css b/js/src/dapps/basiccoin/_form.css index 3d42af41214..2ec3d7b873e 100644 --- a/js/src/dapps/basiccoin/_form.css +++ b/js/src/dapps/basiccoin/_form.css @@ -70,12 +70,13 @@ a.link, a.link:hover, a.link:visited { .form input.small { width: 9em; - margin-right: 10em; + margin-right: 9.5em; } .form .error input { border: 1px solid rgba(255, 0, 0, 0.5); color: red; + background: rgba(255, 0, 0, 0.1); } .form .error label { From 0482c605f659778df92d1bffd8a00b2bea185d69 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 5 Oct 2016 18:41:56 +0200 Subject: [PATCH 0933/1062] table for owner -> tokens --- .../basiccoin/IdentityIcon/identityIcon.js | 8 +++-- .../dapps/basiccoin/Overview/Owner/owner.css | 25 ++++++++++++++++ .../dapps/basiccoin/Overview/Owner/owner.js | 29 ++++++++++++------- js/src/dapps/basiccoin/Overview/overview.css | 5 ++++ js/src/dapps/basiccoin/Overview/overview.js | 13 ++++++++- 5 files changed, 66 insertions(+), 14 deletions(-) diff --git a/js/src/dapps/basiccoin/IdentityIcon/identityIcon.js b/js/src/dapps/basiccoin/IdentityIcon/identityIcon.js index 0bc86731d45..c55c6a8abb4 100644 --- a/js/src/dapps/basiccoin/IdentityIcon/identityIcon.js +++ b/js/src/dapps/basiccoin/IdentityIcon/identityIcon.js @@ -21,15 +21,17 @@ import styles from './identityIcon.css'; export default class IdentityIcon extends Component { static propTypes = { - address: PropTypes.string.isRequired + address: PropTypes.string.isRequired, + className: PropTypes.string, } render () { - const { address } = this.props; + const { address, className } = this.props; + const classes = `${styles.icon} ${className}` return ( ); } diff --git a/js/src/dapps/basiccoin/Overview/Owner/owner.css b/js/src/dapps/basiccoin/Overview/Owner/owner.css index 8a29d72b2eb..c37e8f39eed 100644 --- a/js/src/dapps/basiccoin/Overview/Owner/owner.css +++ b/js/src/dapps/basiccoin/Overview/Owner/owner.css @@ -19,4 +19,29 @@ } .owner { + vertical-align: top; + text-align: right; +} + +.owner>div { + border-radius: 1px; + padding: 1em 2em; + white-space: nowrap; +} + +.tokens { + text-align: left; +} + +.tokens>div { + border-radius: 1px; + background: rgba(255, 240, 240, 1); + padding: 1em 2em; + margin: 0 0 0.5em 0.5em; + display: inline-block; + white-space: nowrap; +} + +.icon { + margin: 0 0 -4px 1em; } diff --git a/js/src/dapps/basiccoin/Overview/Owner/owner.js b/js/src/dapps/basiccoin/Overview/Owner/owner.js index b2862cbb473..cc30036937c 100644 --- a/js/src/dapps/basiccoin/Overview/Owner/owner.js +++ b/js/src/dapps/basiccoin/Overview/Owner/owner.js @@ -16,6 +16,7 @@ import React, { Component, PropTypes } from 'react'; +import IdentityIcon from '../../IdentityIcon'; import Token from '../Token'; import styles from './owner.css'; @@ -43,12 +44,19 @@ export default class Owner extends Component { } return ( -
      -
      - { accounts[address].name } -
      - { this.renderTokens() } -
      +
      + + + ); } @@ -56,10 +64,11 @@ export default class Owner extends Component { const { tokens } = this.props; return tokens.map((token) => ( - +
      + +
      )); } } diff --git a/js/src/dapps/basiccoin/Overview/overview.css b/js/src/dapps/basiccoin/Overview/overview.css index 62d4c936275..9757a81458c 100644 --- a/js/src/dapps/basiccoin/Overview/overview.css +++ b/js/src/dapps/basiccoin/Overview/overview.css @@ -19,3 +19,8 @@ .body { } + +.ownerTable { + margin: 0 auto; + border-collapse: collapse; +} diff --git a/js/src/dapps/basiccoin/Overview/overview.js b/js/src/dapps/basiccoin/Overview/overview.js index 6a3e820759b..46831d782ff 100644 --- a/js/src/dapps/basiccoin/Overview/overview.js +++ b/js/src/dapps/basiccoin/Overview/overview.js @@ -59,13 +59,24 @@ export default class Overview extends Component { renderBody () { const { total } = this.state; + let owners = null; + + if (total.gt(0)) { + owners = ( +
      { event.event } - { this.renderAddress(event.params.owner) } -
      { this.renderHash(event.transactionHash) }
      -
      { isPending ? '' : coin.tla }
      { isPending ? '' : coin.name }
      + { this.renderAddress(event.params.owner) } +
      { this.renderHash(event.transactionHash) }
      +
      { isPending || !coin.isGlobal ? '' : 'global' }
      { event.event } +
      { isPending ? '' : token.coin.tla }
      +
      { isPending ? '' : token.coin.name }
      +
      { this.renderAddress(event.params.from) } { this.renderAddress(event.params.to) } -
      { isPending ? '' : token && token.coin.tla }
      -
      { isPending ? '' : token && token.coin.name }
      -
      +
      + { accounts[address].name } + +
      +
      + { this.renderTokens() } +
      + + { this.renderOwners() } + +
      + ); + } return (
      You have { total.toFormat(0) } tokens created by your accounts
      - { this.renderOwners() } + { owners }
      ); } From 5d7470d4a0912c635a4ef85a5b16d2745db43bf3 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 5 Oct 2016 21:06:02 +0200 Subject: [PATCH 0934/1062] fix signature lookup address --- js/src/contracts/registry.js | 7 ++++++- js/src/dapps/signaturereg/services.js | 1 - 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/js/src/contracts/registry.js b/js/src/contracts/registry.js index 09a741683ca..85b9d6bb51c 100644 --- a/js/src/contracts/registry.js +++ b/js/src/contracts/registry.js @@ -63,9 +63,14 @@ export default class Registry { lookupAddress (_name) { const name = _name.toLowerCase(); + const sha3 = this._api.util.sha3(name); return this.getInstance().then((instance) => { - return instance.getAddress.call({}, [this._api.util.sha3(name), 'A']); + return instance.getAddress.call({}, [sha3, 'A']); + }) + .then((address) => { + console.log('lookupAddress', name, sha3, address); + return address; }); } } diff --git a/js/src/dapps/signaturereg/services.js b/js/src/dapps/signaturereg/services.js index 7cadc290002..09c2c201195 100644 --- a/js/src/dapps/signaturereg/services.js +++ b/js/src/dapps/signaturereg/services.js @@ -52,7 +52,6 @@ export function attachInterface (callback) { }) .then(([address, addresses, accountsInfo]) => { console.log(`signaturereg was found at ${address}`); - address = '0x15fF40Ceb6092b8EBeD4046E2d4c54e5e4cae458'; const contract = api.newContract(abis.signaturereg, address); const accounts = addresses.reduce((obj, address) => { From 1761eca9ca79ede73d5fdf403013ca1d3bf5dbe5 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 5 Oct 2016 21:06:02 +0200 Subject: [PATCH 0935/1062] fix signature lookup address --- js/src/contracts/registry.js | 7 ++++++- js/src/dapps/signaturereg/services.js | 1 - 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/js/src/contracts/registry.js b/js/src/contracts/registry.js index 09a741683ca..85b9d6bb51c 100644 --- a/js/src/contracts/registry.js +++ b/js/src/contracts/registry.js @@ -63,9 +63,14 @@ export default class Registry { lookupAddress (_name) { const name = _name.toLowerCase(); + const sha3 = this._api.util.sha3(name); return this.getInstance().then((instance) => { - return instance.getAddress.call({}, [this._api.util.sha3(name), 'A']); + return instance.getAddress.call({}, [sha3, 'A']); + }) + .then((address) => { + console.log('lookupAddress', name, sha3, address); + return address; }); } } diff --git a/js/src/dapps/signaturereg/services.js b/js/src/dapps/signaturereg/services.js index 7cadc290002..09c2c201195 100644 --- a/js/src/dapps/signaturereg/services.js +++ b/js/src/dapps/signaturereg/services.js @@ -52,7 +52,6 @@ export function attachInterface (callback) { }) .then(([address, addresses, accountsInfo]) => { console.log(`signaturereg was found at ${address}`); - address = '0x15fF40Ceb6092b8EBeD4046E2d4c54e5e4cae458'; const contract = api.newContract(abis.signaturereg, address); const accounts = addresses.reduce((obj, address) => { From 0464d7aa37f5f8be22e6ecf6fb42834e8a821622 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 5 Oct 2016 21:54:48 +0200 Subject: [PATCH 0936/1062] basic overview styling --- js/src/dapps/basiccoin/Overview/Owner/owner.css | 7 ++++--- js/src/dapps/basiccoin/Overview/Token/token.css | 14 ++++++++++++++ js/src/dapps/basiccoin/Overview/Token/token.js | 5 ++++- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/js/src/dapps/basiccoin/Overview/Owner/owner.css b/js/src/dapps/basiccoin/Overview/Owner/owner.css index c37e8f39eed..1b8a326a420 100644 --- a/js/src/dapps/basiccoin/Overview/Owner/owner.css +++ b/js/src/dapps/basiccoin/Overview/Owner/owner.css @@ -35,11 +35,12 @@ .tokens>div { border-radius: 1px; - background: rgba(255, 240, 240, 1); - padding: 1em 2em; - margin: 0 0 0.5em 0.5em; + background: #889; + padding: 1em; + margin: 0 0 0.25em 0.25em; display: inline-block; white-space: nowrap; + color: white; } .icon { diff --git a/js/src/dapps/basiccoin/Overview/Token/token.css b/js/src/dapps/basiccoin/Overview/Token/token.css index ae5d79f662a..def73a9f1c1 100644 --- a/js/src/dapps/basiccoin/Overview/Token/token.css +++ b/js/src/dapps/basiccoin/Overview/Token/token.css @@ -21,12 +21,15 @@ .info>div { display: inline-block; padding: 0.25em 0.5em; + vertical-align: middle; } .address { } .tla { + background: #667; + border-radius: 1px; } .name { @@ -35,5 +38,16 @@ .supply { } +.supply div { + display: block; + text-align: center; +} + +.supply .info { + font-size: 0.75em; + opacity: 0.75; +} + .global { + font-size: 0.75em; } diff --git a/js/src/dapps/basiccoin/Overview/Token/token.js b/js/src/dapps/basiccoin/Overview/Token/token.js index 548e73b7324..43f41e9447b 100644 --- a/js/src/dapps/basiccoin/Overview/Token/token.js +++ b/js/src/dapps/basiccoin/Overview/Token/token.js @@ -45,7 +45,10 @@ export default class Token extends Component {
      { coin.tla }
      { coin.name }
      -
      { totalSupply.div(1000000).toFormat(0) }
      +
      +
      { totalSupply.div(1000000).toFormat(0) }
      +
      total supply
      +
      { coin.isGlobal ? 'global' : 'local' }
      ); From 63938780d0c1b7c35b393c3f27247c35e51229b1 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 5 Oct 2016 22:15:39 +0200 Subject: [PATCH 0937/1062] txhash links --- js/src/dapps/basiccoin/Deploy/Event/event.css | 13 ++++++++++++ js/src/dapps/basiccoin/Deploy/Event/event.js | 4 ++-- .../dapps/basiccoin/Transfer/Event/event.js | 3 ++- js/src/dapps/basiccoin/_form.css | 5 ----- js/src/dapps/basiccoin/services.js | 20 ++++++++++++++----- 5 files changed, 32 insertions(+), 13 deletions(-) diff --git a/js/src/dapps/basiccoin/Deploy/Event/event.css b/js/src/dapps/basiccoin/Deploy/Event/event.css index 47c060c2102..52eada915cb 100644 --- a/js/src/dapps/basiccoin/Deploy/Event/event.css +++ b/js/src/dapps/basiccoin/Deploy/Event/event.css @@ -15,6 +15,19 @@ /* along with Parity. If not, see . */ +a.link, a.link:visited { + text-decoration: none; +} + +a.link:hover { + text-decoration: underline; +} + +a.link, a.link:hover, a.link:visited { + color: #822; + cursor: pointer; +} + .mined { } diff --git a/js/src/dapps/basiccoin/Deploy/Event/event.js b/js/src/dapps/basiccoin/Deploy/Event/event.js index 9b524f9284b..889822208dc 100644 --- a/js/src/dapps/basiccoin/Deploy/Event/event.js +++ b/js/src/dapps/basiccoin/Deploy/Event/event.js @@ -18,7 +18,7 @@ import moment from 'moment'; import React, { Component, PropTypes } from 'react'; import { api } from '../../parity'; -import { getCoin } from '../../services'; +import { getCoin, txLink } from '../../services'; import IdentityIcon from '../../IdentityIcon'; import styles from './event.css'; @@ -61,7 +61,7 @@ export default class Event extends Component { { this.renderAddress(event.params.owner) } -
      { this.renderHash(event.transactionHash) }
      + { isPending || !coin.isGlobal ? '' : 'global' } diff --git a/js/src/dapps/basiccoin/Transfer/Event/event.js b/js/src/dapps/basiccoin/Transfer/Event/event.js index 03f88f1e881..190035b1d43 100644 --- a/js/src/dapps/basiccoin/Transfer/Event/event.js +++ b/js/src/dapps/basiccoin/Transfer/Event/event.js @@ -19,6 +19,7 @@ import moment from 'moment'; import React, { Component, PropTypes } from 'react'; import { api } from '../../parity'; +import { txLink } from '../../services'; import IdentityIcon from '../../IdentityIcon'; import styles from '../../Deploy/Event/event.css'; @@ -64,7 +65,7 @@ export default class Event extends Component {
      { event.params.value.div(1000000).toFormat(6) }
      ⇒
      -
      { this.renderHash(event.transactionHash) }
      + { this.renderAddress(event.params.to) } diff --git a/js/src/dapps/basiccoin/_form.css b/js/src/dapps/basiccoin/_form.css index 2ec3d7b873e..fbcc399dfd2 100644 --- a/js/src/dapps/basiccoin/_form.css +++ b/js/src/dapps/basiccoin/_form.css @@ -19,11 +19,6 @@ background: #622; } -a.link, a.link:hover, a.link:visited { - color: #622; - cursor: pointer; -} - .form { text-align: left; margin: 0 auto; diff --git a/js/src/dapps/basiccoin/services.js b/js/src/dapps/basiccoin/services.js index 60705aef91a..ca586ea917d 100644 --- a/js/src/dapps/basiccoin/services.js +++ b/js/src/dapps/basiccoin/services.js @@ -26,6 +26,7 @@ let registryInstance; const registries = {}; const subscriptions = {}; let nextSubscriptionId = 1000; +let isTest = false; export function subscribeEvents (addresses, callback) { const subscriptionId = nextSubscriptionId++; @@ -97,12 +98,17 @@ function pollEvents () { export function attachInstances () { pollEvents(); - return api.ethcore - .registryAddress() - .then((registryAddress) => { - console.log(`contract was found at registry=${registryAddress}`); - + return Promise + .all([ + api.ethcore.registryAddress(), + api.ethcore.netChain() + ]) + .then(([registryAddress, netChain]) => { const registry = api.newContract(abis.registry, registryAddress).instance; + isTest = netChain === 'morden' || netChain === 'testnet'; + + console.log(`contract was found at registry=${registryAddress}`); + console.log(`running on ${netChain}, isTest=${isTest}`); return Promise .all([ @@ -258,3 +264,7 @@ export function loadTokenBalance (tokenAddress, address) { throw error; }); } + +export function txLink (txHash) { + return `https://${isTest ? 'testnet.' : ''}etherscan.io/tx/${txHash}`; +} From 8f9476044ec3f5a710557e22414f94b231b2bcf6 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 5 Oct 2016 22:31:35 +0200 Subject: [PATCH 0938/1062] page layout adjustments --- js/src/ui/Page/page.css | 2 +- js/src/views/Settings/settings.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/js/src/ui/Page/page.css b/js/src/ui/Page/page.css index e4fac198a18..81f4e0e685d 100644 --- a/js/src/ui/Page/page.css +++ b/js/src/ui/Page/page.css @@ -15,7 +15,7 @@ /* along with Parity. If not, see . */ .layout { - padding: 0; + padding: 0.25em; } .layout>div { diff --git a/js/src/views/Settings/settings.js b/js/src/views/Settings/settings.js index c587f0d29b5..3fee956437b 100644 --- a/js/src/views/Settings/settings.js +++ b/js/src/views/Settings/settings.js @@ -39,10 +39,10 @@ export default class Settings extends Component { return (
      + + { this.renderTabs() } + - - { this.renderTabs() } - { children }
      From aee0930f2ac395220e502d1c43d5000d2ac89289 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 5 Oct 2016 23:20:09 +0200 Subject: [PATCH 0939/1062] background import --- .../basiccoin/Application/application.css | 1 + js/src/dapps/basiccoin/background.jpg | Bin 0 -> 127459 bytes js/webpack.config.js | 1 - 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 js/src/dapps/basiccoin/background.jpg diff --git a/js/src/dapps/basiccoin/Application/application.css b/js/src/dapps/basiccoin/Application/application.css index cec2cf43f27..aacc3d38c92 100644 --- a/js/src/dapps/basiccoin/Application/application.css +++ b/js/src/dapps/basiccoin/Application/application.css @@ -20,6 +20,7 @@ font-family: 'Roboto'; vertical-align: middle; min-height: 100vh; + position:relative; } .body { diff --git a/js/src/dapps/basiccoin/background.jpg b/js/src/dapps/basiccoin/background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c873064f581cff2718a31fd1dad77e11651a679c GIT binary patch literal 127459 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%0DGrQO}I@EZ$o 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%0Aau=oz8_s za2=2uBIqFSSTxWO0&gy!XgnaLgFulX=zwUzMil{+2krzi1PU|>=p0o99LS5jFa`|( z#DQZWz!wi-U%Vn9fbe1j15yJsP&)z=D27f0wYW%!fP>ysy`TmF05t$L0t|ftfD8?K zn*c!&7J-6Y7yzL_@6kaRIvq3|=nvA7VL(q_D5HyjBQY14VGtY(UN6*xgX|Cx9C2X` z-e3_paDu=95eSqI1!TlRfOr~oQDp)QfkT4G7@R5u7y-@Guo(FN!AW*O1Ox#>0s0`< zMIumBpfhMH9q=gz1)(8OeKIt3QAczd7BKx^p+U)D2m;Ut6dhzoqSJuR;8PeH0%ib= zE_9LiLK!pxPy@zfXp}BE1e5_<;0ua~z^NioI*5zX=%V4Ec4UAohz7w`5jfoo3V5K> zg)$fv5(5V{MS?RCfdd!-BM6*32mlPc2ZaN^X`m=Dzy$+fq=9h=hHUg(vYAu;AFf|1Jc0&%>ia`2w;GAf|Fq&5C@6C=^%h6pb67J zSpj`j2&H>*2vo%bW3mg%Ks_)BGJ-^Ox}Y;5fDNSz0h(#57yW;cOBaFw5iEudivVhX zm}#mPI)Fw3X9}JSlm;L~;6M;y4B`VD9Rv;rIHGYd&_AFq5CH=Epy9e8J{qNifdFPz z3?2(g4}o-WG9b%^n0W991h}Z8all0fC;$O=5U{z30A1u&1u!r;@Cx$kq9HN_=p{NN zh7O>GAaDq}_ktjVNCVV>3qXrS;IU|wE}BjU5WkQG4nyOy5Dtl;Lm~)R;DrHULE$b= z99;zJfBN8H7rjKlqT#9+NC+3*1;Jq$5P<-Q=m0tx9Eh)rA*dn%{)-5pTXZ2Dh^z{p zpm{K$N$>#AMa3ZyKTQV>umLW3RSaAgg9EU^AQ^}WaDwt(C<(z3Z~&MLO&~)<5J(Nu zVQ?@s3X1?RP{0gOCcDrLfWNR*g@7>*m_io@X%LVX!s$SG2z}8Tp!8%Hbp(zm2$bWZ z3Us3qE01S{q6+=K`P&#M=76bYU4!RwN0Hp-rK_XCS zIv4^E^aluG5RjKZ2H_wGXoXV6K)Qezz<>bh0C$}31tj1LxB%sWB>_UG0q_@)Ac8Ii zphY3U2$~Lw0eubx1dvc3OEu2ks$yQAUj||2g9KLhxVe)AV3EK4T%R{SOf?T+zF}>Pz)ji zZGgdpk1oam3y2N^y@5ulBGQ0RphJ)s7}7xDkO)Wzx)2S90kT}s2N`t{bPzy}0QSHg zg#`f6phl1?;(zS^PdUK&MNEJM7r*) z;7|vRyFdkKB0#s((SUt1FVVuF|L>#ye|unpZ8B9*$|e6l7V!Vaf)52Y)P!F={_o8- zVYJZyySL`W)|#kY^#8N9CMx@-BABjuw-)Vk*bmyJ@tkD-$vfYAn0sR02z}`oM8 z_&eUNg%s7jB-?Y!3gqfXaQ?1c?Zn8D0=OT$2_8@z5`?HCQQZ!*~%1QJ+S#! zUxKeVsJRe5LKUgOBwc%Nt0&U5&jyU|D)V)7avp^p7k&>l9Xz4Ef37!0)N>wlzSQsQ zXD(pzXkeA(rWSj)^d}P?g@;}_27^9E#HO|)Qd&2(j3g);lVXPcgIFLAH@*cA8_mH&E~#$+t;pDO zRWTx0#is6kqbuyeQEJZoFZ+_tcX8y-l;R`r1C*G9Mi+8cKeTnUIB-n8Xj#vooTwb# z7I0750y_uPoGre1oOLgj(+7J^x8SA6$y$-q)UFEWDkNi=Sd~IEe6BaAifS%v88J+O zb!yQ{*xyah$UPQzF4AO6!?;*B1W@s7Uu}`O4`U$_SCnFvY%^WoO%FByuz0yga^aF3 zYiyz(ziFO(-q>SbX~l!)^OvG^F%IVZH`yuU6#Nf# z4-f-oUSOqR!)rVTYnTEAv5C2HK;O*=1lfdf#)_Xm`_V#woPv90o-WmXXANtqQ(<~T zE)?Qe7PO7~@Hq7-L)=!sT;$ul&*L|NEtmhSF6V&_PZ>j%S;%D-?Wd!7Mfc~M)b|

      F@S(CS;P}0<}T#`j6L6(fNvd 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 literal 0 HcmV?d00001 diff --git a/js/webpack.config.js b/js/webpack.config.js index d369ae3a338..178578bbcfe 100644 --- a/js/webpack.config.js +++ b/js/webpack.config.js @@ -80,7 +80,6 @@ module.exports = { 'less' ] }, - { test: /\.(png|jpg|)$/, loader: 'file-loader' From 9d9943e3e1a254654186fb5477a23d53871f741d Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 6 Oct 2016 11:05:42 +0200 Subject: [PATCH 0940/1062] adjust colors --- js/src/dapps/basiccoin/Application/Header/header.css | 1 - js/src/dapps/basiccoin/Application/application.css | 4 ++-- js/src/dapps/basiccoin/Container/container.css | 9 +++++++-- js/src/dapps/basiccoin/_form.css | 1 + 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/js/src/dapps/basiccoin/Application/Header/header.css b/js/src/dapps/basiccoin/Application/Header/header.css index 7edb580c50a..5416d7c05c8 100644 --- a/js/src/dapps/basiccoin/Application/Header/header.css +++ b/js/src/dapps/basiccoin/Application/Header/header.css @@ -16,7 +16,6 @@ */ .header { - margin-bottom: 4em; } .titlebar { diff --git a/js/src/dapps/basiccoin/Application/application.css b/js/src/dapps/basiccoin/Application/application.css index aacc3d38c92..97b66be8759 100644 --- a/js/src/dapps/basiccoin/Application/application.css +++ b/js/src/dapps/basiccoin/Application/application.css @@ -16,7 +16,7 @@ */ .container { - color: #333; + color: #444; font-family: 'Roboto'; vertical-align: middle; min-height: 100vh; @@ -24,5 +24,5 @@ } .body { - padding: 0 4em; + padding: 0 0.25em; } diff --git a/js/src/dapps/basiccoin/Container/container.css b/js/src/dapps/basiccoin/Container/container.css index e860a4332d4..773a959d600 100644 --- a/js/src/dapps/basiccoin/Container/container.css +++ b/js/src/dapps/basiccoin/Container/container.css @@ -16,7 +16,12 @@ */ .content { - padding: 0 2em; - margin-bottom: 4em; + padding: 4em; + margin-bottom: 0.25em; text-align: center; } + +.content:nth-child(odd) { + background: whitesmoke; + border: 1px solid #eee; +} diff --git a/js/src/dapps/basiccoin/_form.css b/js/src/dapps/basiccoin/_form.css index fbcc399dfd2..c2f89b3609e 100644 --- a/js/src/dapps/basiccoin/_form.css +++ b/js/src/dapps/basiccoin/_form.css @@ -50,6 +50,7 @@ .form input, .form select { width: 18em; + color: #444; background: rgba(255, 255, 255, 0.25); border-radius: 1px; border: 1px solid rgba(0, 0, 0, 0.25); From f54734bc63f9934a64ef777117c933407ed04e42 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 6 Oct 2016 11:28:32 +0200 Subject: [PATCH 0941/1062] no global registration, simplify color selection --- .../basiccoin/Application/Header/header.js | 5 ++-- .../dapps/basiccoin/Container/container.css | 4 ++-- .../basiccoin/Deploy/Deployment/deployment.js | 23 ++++++++++--------- .../dapps/basiccoin/Overview/Token/token.js | 1 - js/src/dapps/basiccoin/_status.css | 2 +- 5 files changed, 17 insertions(+), 18 deletions(-) diff --git a/js/src/dapps/basiccoin/Application/Header/header.js b/js/src/dapps/basiccoin/Application/Header/header.js index 3afd5872edf..90fa909ef06 100644 --- a/js/src/dapps/basiccoin/Application/Header/header.js +++ b/js/src/dapps/basiccoin/Application/Header/header.js @@ -19,8 +19,6 @@ import React, { Component, PropTypes } from 'react'; import PAGES from '../pages'; import styles from './header.css'; -const colors = ['#622', '#733', '#844']; - export default class Header extends Component { static contextTypes = { router: PropTypes.object.isRequired @@ -50,11 +48,12 @@ export default class Header extends Component { renderHeader (position, offset) { const index = (position + offset) % PAGES.length; const page = PAGES[index]; + const background = `rgba(102, 34, 34, ${1 - (0.1 * position)})`; return ( diff --git a/js/src/dapps/basiccoin/Container/container.css b/js/src/dapps/basiccoin/Container/container.css index 773a959d600..4868b250acb 100644 --- a/js/src/dapps/basiccoin/Container/container.css +++ b/js/src/dapps/basiccoin/Container/container.css @@ -22,6 +22,6 @@ } .content:nth-child(odd) { - background: whitesmoke; - border: 1px solid #eee; + background: rgba(102, 34, 34, 0.05); + border: 1px solid rgba(102, 34, 34, 0.075); } diff --git a/js/src/dapps/basiccoin/Deploy/Deployment/deployment.js b/js/src/dapps/basiccoin/Deploy/Deployment/deployment.js index dab42446ed6..b90ebd4beca 100644 --- a/js/src/dapps/basiccoin/Deploy/Deployment/deployment.js +++ b/js/src/dapps/basiccoin/Deploy/Deployment/deployment.js @@ -123,11 +123,22 @@ export default class Deployment extends Component { renderForm () { const { accounts } = this.context; - const { baseText, globalFeeText, name, nameError, tla, tlaError, totalSupply, totalSupplyError } = this.state; + const { baseText, name, nameError, tla, tlaError, totalSupply, totalSupplyError } = this.state; const hasError = !!(nameError || tlaError || totalSupplyError); const error = `${styles.input} ${styles.error}`; const addresses = Object.keys(accounts).filter((address) => accounts[address].uuid); + //

      + return (
      @@ -171,16 +182,6 @@ export default class Deployment extends Component { { totalSupplyError || `number of tokens (base: ${baseText})` }
      -
      - - -
      - register on network (fee: { globalFeeText }ETH) -
      -
      ); } diff --git a/js/src/dapps/basiccoin/_status.css b/js/src/dapps/basiccoin/_status.css index 4b49f7bc6e5..8fd93cfe402 100644 --- a/js/src/dapps/basiccoin/_status.css +++ b/js/src/dapps/basiccoin/_status.css @@ -17,7 +17,7 @@ .statusHeader { font-size: 1.25em; - margin-bottom: 0.75em; + margin-bottom: 1.25em; opacity: 0.75; } From 02836ecfbf80942cc7bfdf7ef2b05c6cc063b3d2 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 6 Oct 2016 12:04:49 +0200 Subject: [PATCH 0942/1062] updated styling --- js/src/dapps/basiccoin/AddressSelect/addressSelect.js | 2 +- js/src/dapps/basiccoin/Container/container.css | 3 +-- js/src/dapps/basiccoin/Deploy/Deployment/deployment.js | 5 ++++- js/src/dapps/basiccoin/Deploy/Events/events.css | 2 +- js/src/dapps/basiccoin/Overview/Owner/owner.css | 2 +- js/src/dapps/basiccoin/Overview/Token/token.css | 2 +- js/src/dapps/basiccoin/Transfer/Send/send.js | 6 +++--- js/src/dapps/basiccoin/_form.css | 2 +- 8 files changed, 13 insertions(+), 11 deletions(-) diff --git a/js/src/dapps/basiccoin/AddressSelect/addressSelect.js b/js/src/dapps/basiccoin/AddressSelect/addressSelect.js index f770ab15002..529e7753d98 100644 --- a/js/src/dapps/basiccoin/AddressSelect/addressSelect.js +++ b/js/src/dapps/basiccoin/AddressSelect/addressSelect.js @@ -60,7 +60,7 @@ export default class AddressSelect extends Component { const { addresses } = this.props; const { selectedAddress } = this.state; const style = { - background: `transparent url(${api.util.createIdentityImg(selectedAddress, 3)}) no-repeat 98% center` + background: `rgba(255, 255, 255, 0.75) url(${api.util.createIdentityImg(selectedAddress, 3)}) no-repeat 98% center` }; return ( diff --git a/js/src/dapps/basiccoin/Container/container.css b/js/src/dapps/basiccoin/Container/container.css index 4868b250acb..7cc00e11e21 100644 --- a/js/src/dapps/basiccoin/Container/container.css +++ b/js/src/dapps/basiccoin/Container/container.css @@ -22,6 +22,5 @@ } .content:nth-child(odd) { - background: rgba(102, 34, 34, 0.05); - border: 1px solid rgba(102, 34, 34, 0.075); + background: rgba(102, 34, 34, 0.075); } diff --git a/js/src/dapps/basiccoin/Deploy/Deployment/deployment.js b/js/src/dapps/basiccoin/Deploy/Deployment/deployment.js index b90ebd4beca..f9232789b11 100644 --- a/js/src/dapps/basiccoin/Deploy/Deployment/deployment.js +++ b/js/src/dapps/basiccoin/Deploy/Deployment/deployment.js @@ -147,6 +147,9 @@ export default class Deployment extends Component { +
      + the owner account to eploy from +
      @@ -170,7 +173,7 @@ export default class Deployment extends Component {
      - + div { border-radius: 1px; - background: #889; + background: #988; padding: 1em; margin: 0 0 0.25em 0.25em; display: inline-block; diff --git a/js/src/dapps/basiccoin/Overview/Token/token.css b/js/src/dapps/basiccoin/Overview/Token/token.css index def73a9f1c1..5324aa7c5a1 100644 --- a/js/src/dapps/basiccoin/Overview/Token/token.css +++ b/js/src/dapps/basiccoin/Overview/Token/token.css @@ -28,7 +28,7 @@ } .tla { - background: #667; + background: #766; border-radius: 1px; } diff --git a/js/src/dapps/basiccoin/Transfer/Send/send.js b/js/src/dapps/basiccoin/Transfer/Send/send.js index 0640002ac50..aee860fe25b 100644 --- a/js/src/dapps/basiccoin/Transfer/Send/send.js +++ b/js/src/dapps/basiccoin/Transfer/Send/send.js @@ -142,7 +142,7 @@ export default class Send extends Component { { this.renderTokens() }
      - The token type to transfer + type of token to transfer
      @@ -151,7 +151,7 @@ export default class Send extends Component { addresses={ fromAddresses } onChange={ this.onSelectFrom } />
      - The account to transfer from + account to transfer from
      @@ -168,7 +168,7 @@ export default class Send extends Component {
      diff --git a/js/src/dapps/basiccoin/_form.css b/js/src/dapps/basiccoin/_form.css index c2f89b3609e..ffafdbeafae 100644 --- a/js/src/dapps/basiccoin/_form.css +++ b/js/src/dapps/basiccoin/_form.css @@ -51,7 +51,7 @@ .form select { width: 18em; color: #444; - background: rgba(255, 255, 255, 0.25); + background: rgba(255, 255, 255, 0.75); border-radius: 1px; border: 1px solid rgba(0, 0, 0, 0.25); box-sizing: border-box; From dbff79941e41f0e06c3bb10e6ad3bc4cb33843ec Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 6 Oct 2016 14:32:28 +0200 Subject: [PATCH 0943/1062] connection dialog for "busy connecting" --- js/src/redux/providers/status.js | 6 ++ js/src/redux/providers/statusReducer.js | 2 + js/src/ui/Container/container.js | 7 +- js/src/ui/Modal/modal.css | 5 ++ js/src/ui/Modal/modal.js | 3 +- .../views/Application/Container/container.js | 8 +- js/src/views/Application/application.js | 10 ++- js/src/views/Connection/connection.js | 86 +++++++++++++++++++ js/src/views/Connection/index.js | 17 ++++ 9 files changed, 137 insertions(+), 7 deletions(-) create mode 100644 js/src/views/Connection/connection.js create mode 100644 js/src/views/Connection/index.js diff --git a/js/src/redux/providers/status.js b/js/src/redux/providers/status.js index 0bc365991cc..92bb35f7056 100644 --- a/js/src/redux/providers/status.js +++ b/js/src/redux/providers/status.js @@ -44,6 +44,12 @@ export default class Status { _pollStatus = () => { const nextTimeout = (timeout = 1000) => setTimeout(this._pollStatus, timeout); + const isApiConnected = this._api.transport.isConnected; + + this._store.dispatch(statusCollection({ isApiConnected })); + if (!isApiConnected) { + nextTimeout(100); + } Promise .all([ diff --git a/js/src/redux/providers/statusReducer.js b/js/src/redux/providers/statusReducer.js index 594874e521f..18a60284bb6 100644 --- a/js/src/redux/providers/statusReducer.js +++ b/js/src/redux/providers/statusReducer.js @@ -39,6 +39,8 @@ const initialState = { nodeName: '', rpcSettings: {}, syncing: false, + isApiConnected: true, + isPingConnected: true, isTest: true }; diff --git a/js/src/ui/Container/container.js b/js/src/ui/Container/container.js index 3ac92503221..a91f0ab06a8 100644 --- a/js/src/ui/Container/container.js +++ b/js/src/ui/Container/container.js @@ -23,15 +23,16 @@ export default class Container extends Component { static propTypes = { children: PropTypes.node, className: PropTypes.string, - light: PropTypes.bool + light: PropTypes.bool, + style: PropTypes.object } render () { - const { children, className, light } = this.props; + const { children, className, light, style } = this.props; const classes = `${styles.container} ${light ? styles.light : ''} ${className}`; return ( -
      +
      { children } diff --git a/js/src/ui/Modal/modal.css b/js/src/ui/Modal/modal.css index f1219d72f1b..8361d4d96ad 100644 --- a/js/src/ui/Modal/modal.css +++ b/js/src/ui/Modal/modal.css @@ -41,6 +41,10 @@ background: rgba(0, 0, 0, 0.5) !important; } +.content div { + transition: none !important; +} + .title { padding: 1em; margin-bottom: 0; @@ -62,4 +66,5 @@ .overlay { background: rgba(255, 255, 255, 0.5) !important; + transition: none !important; } diff --git a/js/src/ui/Modal/modal.js b/js/src/ui/Modal/modal.js index 56181dc43f5..fbdf2a6c18a 100644 --- a/js/src/ui/Modal/modal.js +++ b/js/src/ui/Modal/modal.js @@ -77,11 +77,12 @@ class Modal extends Component { modal open={ visible } overlayClassName={ styles.overlay } + overlayStyle={ { transition: 'none' } } repositionOnUpdate={ false } style={ DIALOG_STYLE } title={ header } titleStyle={ TITLE_STYLE }> - + { children } diff --git a/js/src/views/Application/Container/container.js b/js/src/views/Application/Container/container.js index a1b9124c7d1..6efca706e74 100644 --- a/js/src/views/Application/Container/container.js +++ b/js/src/views/Application/Container/container.js @@ -18,24 +18,30 @@ import React, { Component, PropTypes } from 'react'; import { FirstRun } from '../../../modals'; import { Errors, ParityBackground, Tooltips } from '../../../ui'; +import Connection from '../../Connection'; import styles from '../application.css'; export default class Container extends Component { static propTypes = { children: PropTypes.node.isRequired, + isApiConnected: PropTypes.bool, + isPingConnected: PropTypes.bool, showFirstRun: PropTypes.bool, onCloseFirstRun: PropTypes.func }; render () { - const { children, showFirstRun, onCloseFirstRun } = this.props; + const { children, isApiConnected, isPingConnected, showFirstRun, onCloseFirstRun } = this.props; return ( + { children } diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index 9f637c058cb..c0550327f5a 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -40,6 +40,8 @@ class Application extends Component { static propTypes = { children: PropTypes.node, netChain: PropTypes.string, + isApiConnected: PropTypes.bool, + isPingConnected: PropTypes.bool, isTest: PropTypes.bool, pending: PropTypes.array } @@ -71,11 +73,13 @@ class Application extends Component { } renderApp () { - const { children, pending, netChain, isTest } = this.props; + const { children, pending, netChain, isApiConnected, isPingConnected, isTest } = this.props; const { showFirstRun } = this.state; return ( . + +import React, { Component, PropTypes } from 'react'; + +const styleOverlay = { + position: 'fixed', + top: 0, + right: 0, + bottom: 0, + left: 0, + background: 'rgba(255, 255, 255, 0.75)', + zIndex: 20000 +}; + +const styleModal = { + position: 'fixed', + top: 0, + right: 0, + bottom: 0, + left: 0, + zIndex: 20001 +}; + +const styleBody = { + margin: '0 auto', + padding: '3em 2em', + textAlign: 'center', + maxWidth: '40em', + background: 'rgba(25, 25, 25, 0.75)', + color: 'rgb(208, 208, 208)', + boxShadow: 'rgba(0, 0, 0, 0.25) 0px 14px 45px, rgba(0, 0, 0, 0.22) 0px 10px 18px' +}; + +const styleHeader = { + fontSize: '1.25em', + margin: '0 0 0.5em 0' +}; + +const styleContent = { +}; + +export default class Connection extends Component { + static propTypes = { + isApiConnected: PropTypes.bool, + isPingConnected: PropTypes.bool + } + + render () { + const { isApiConnected, isPingConnected } = this.props; + const isConnected = isApiConnected && isPingConnected; + + if (isConnected) { + return null; + } + + return ( +
      +
      +
      +
      +
      + Connecting to Parity +
      +
      + If this message persists, please check that your Parity node is running. +
      +
      +
      +
      + ); + } +} diff --git a/js/src/views/Connection/index.js b/js/src/views/Connection/index.js new file mode 100644 index 00000000000..f33fc42fe62 --- /dev/null +++ b/js/src/views/Connection/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './connection'; From 245811b0bdbb2f60d454bbca1e56d7384d940e08 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 6 Oct 2016 21:15:58 +0200 Subject: [PATCH 0944/1062] initial token connection - WIP --- js/package.json | 3 +- js/src/api/rpc/personal/personal.js | 5 + js/src/api/transport/ws/ws.js | 50 +++++-- js/src/index.js | 8 +- js/src/parity.js | 2 +- js/src/redux/providers/status.js | 20 ++- js/src/secureApi.js | 105 ++++++++++++++ .../views/Application/Container/container.js | 6 +- js/src/views/Connection/connection.js | 128 +++++++++++------- js/src/views/Connection/styles.js | 77 +++++++++++ .../Signer/providers/signerDataProvider.js | 20 +-- js/src/views/Signer/signer.js | 16 +-- js/src/views/Signer/utils/parity.js | 34 ----- js/src/web3.html | 12 -- js/src/web3.js | 24 ---- 15 files changed, 334 insertions(+), 176 deletions(-) create mode 100644 js/src/secureApi.js create mode 100644 js/src/views/Connection/styles.js delete mode 100644 js/src/views/Signer/utils/parity.js delete mode 100644 js/src/web3.html delete mode 100644 js/src/web3.js diff --git a/js/package.json b/js/package.json index 4db0b67afa5..878c0622e91 100644 --- a/js/package.json +++ b/js/package.json @@ -142,6 +142,7 @@ "store": "^1.3.20", "utf8": "^2.1.1", "validator": "^5.7.0", - "web3": "^0.17.0-alpha" + "web3": "^0.17.0-alpha", + "whatwg-fetch": "^1.0.0" } } diff --git a/js/src/api/rpc/personal/personal.js b/js/src/api/rpc/personal/personal.js index cd20bc4be59..fa4a2908b88 100644 --- a/js/src/api/rpc/personal/personal.js +++ b/js/src/api/rpc/personal/personal.js @@ -28,6 +28,11 @@ export default class Personal { .then(outAccountInfo); } + generateAuthorizationToken () { + return this._transport + .execute('personal_generateAuthorizationToken'); + } + listAccounts () { return this._transport .execute('personal_listAccounts') diff --git a/js/src/api/transport/ws/ws.js b/js/src/api/transport/ws/ws.js index 700235e920b..59c3098f187 100644 --- a/js/src/api/transport/ws/ws.js +++ b/js/src/api/transport/ws/ws.js @@ -28,30 +28,42 @@ export default class Ws extends JsonRpcBase { this._token = token; this._messages = {}; + this._connecting = true; + this._lastError = null; + this._autoConnect = false; + this._connect(); } - _hash () { - const time = parseInt(new Date().getTime() / 1000, 10); - const sha3 = keccak_256(`${this._token}:${time}`); + updateToken (token) { + this._token = token; + this._autoConnect = false; - return `${sha3}_${time}`; + this._connect(); } _connect () { - this._ws = new WebSocket(this._url, this._hash()); + const time = parseInt(new Date().getTime() / 1000, 10); + const sha3 = keccak_256(`${this._token}:${time}`); + const hash = `${sha3}_${time}`; + + this._connecting = true; + this._connected = false; + this._lastError = null; + + this._ws = new WebSocket(this._url, hash); this._ws.onerror = this._onError; this._ws.onopen = this._onOpen; this._ws.onclose = this._onClose; this._ws.onmessage = this._onMessage; - - this._connected = false; } _onOpen = (event) => { console.log('ws:onOpen', event); this._connected = true; + this._connecting = false; + this._autoConnect = true; Object.keys(this._messages) .filter((id) => this._messages[id].queued) @@ -61,11 +73,16 @@ export default class Ws extends JsonRpcBase { _onClose = (event) => { console.log('ws:onClose', event); this._connected = false; - this._connect(); + this._connecting = false; + + if (this._autoConnect) { + this._connect(); + } } _onError = (event) => { console.error('ws:onError', event); + this._lastError = event; } _onMessage = (event) => { @@ -106,8 +123,19 @@ export default class Ws extends JsonRpcBase { }); } - updateToken (token) { - this._token = token; - this._connect(); + get token () { + return this._token; + } + + get isAutoConnect () { + return this._autoConnect; + } + + get isConnecting () { + return this._connecting; + } + + get lastError () { + return this._lastError; } } diff --git a/js/src/index.js b/js/src/index.js index ae7b904307c..69361e69c78 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -15,7 +15,7 @@ // along with Parity. If not, see . import 'babel-polyfill'; -import 'isomorphic-fetch'; +import 'whatwg-fetch'; import es6Promise from 'es6-promise'; es6Promise.polyfill(); @@ -28,7 +28,7 @@ import { Redirect, Router, Route, useRouterHistory } from 'react-router'; import Web3 from 'web3'; -import Api from './api'; +import SecureApi from './secureApi'; import ContractInstances from './contracts'; import { initStore } from './redux'; @@ -47,7 +47,7 @@ import './index.html'; injectTapEventPlugin(); -const initToken = window.localStorage.getItem('sysuiToken') || 'initial'; +const initToken = window.localStorage.getItem('sysuiToken'); const parityUrl = process.env.PARITY_URL || ( process.env.NODE_ENV === 'production' @@ -55,7 +55,7 @@ const parityUrl = process.env.PARITY_URL || : '127.0.0.1:8180' ); -const api = new Api(new Api.Transport.Ws(`ws://${parityUrl}`, initToken)); // new Api.Transport.Http('/rpc/')); +const api = new SecureApi(`ws://${parityUrl}`, initToken); ContractInstances.create(api); // signer diff --git a/js/src/parity.js b/js/src/parity.js index 626c97ef1ab..664757adeb0 100644 --- a/js/src/parity.js +++ b/js/src/parity.js @@ -15,7 +15,7 @@ // along with Parity. If not, see . import 'babel-polyfill'; -import 'isomorphic-fetch'; +import 'whatwg-fetch'; import es6Promise from 'es6-promise'; es6Promise.polyfill(); diff --git a/js/src/redux/providers/status.js b/js/src/redux/providers/status.js index 92bb35f7056..cb88d094e2f 100644 --- a/js/src/redux/providers/status.js +++ b/js/src/redux/providers/status.js @@ -24,6 +24,7 @@ export default class Status { start () { this._subscribeBlockNumber(); + this._pollPing(); this._pollStatus(); this._pollLogs(); } @@ -42,13 +43,24 @@ export default class Status { }); } + _pollPing = () => { + const dispatch = (status, timeout = 500) => { + this._store.dispatch(statusCollection({ isPingConnected: status })); + setTimeout(this._pollPing, timeout); + }; + + fetch(`http://${window.location.host}/api/ping`, { method: 'GET' }) + .then((response) => dispatch(!!response.ok)) + .catch(() => dispatch(false)); + } + _pollStatus = () => { const nextTimeout = (timeout = 1000) => setTimeout(this._pollStatus, timeout); - const isApiConnected = this._api.transport.isConnected; + const { token, isConnected } = this._api.transport; - this._store.dispatch(statusCollection({ isApiConnected })); - if (!isApiConnected) { - nextTimeout(100); + this._store.dispatch(statusCollection({ isApiConnected: isConnected, secureToken: token })); + if (!isConnected) { + nextTimeout(250); } Promise diff --git a/js/src/secureApi.js b/js/src/secureApi.js new file mode 100644 index 00000000000..4c88d87ce2b --- /dev/null +++ b/js/src/secureApi.js @@ -0,0 +1,105 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import Api from './api'; + +export default class SecureApi extends Api { + constructor (url, token) { + super(new Api.Transport.Ws(url, token)); + + this._isConnecting = true; + this._connectState = 0; + this._needsToken = false; + + this._followConnection(); + } + + _followConnection = () => { + const nextTick = () => setTimeout(this._followConnection, 250); + const lastError = this._transport.lastError; + const isConnected = this._transport.isConnected; + const isConnecting = this._transport.isConnecting; + + console.log('_followConnection', isConnected, this._connectState); + + switch (this._connectState) { + // token = + case 0: + if (isConnected) { + this._isConnecting = false; + return; + } else if (lastError) { + this.updateToken('initial', 1); + } + break; + + // token = 'initial' + case 1: + if (isConnected) { + this.personal + .generateAuthorizationToken() + .then((token) => { + console.log('token', token); + this.updateToken(token, 2); + }) + .catch((error) => { + console.error('_followConnection', error); + this._isConnecting = false; + }); + return; + } else if (lastError) { + this._connectedState = 100; + this._needsToken = true; + this._isConnecting = false; + return; + } + break; + + // token = + case 2: + if (isConnected) { + this._isConnecting = false; + return; + } else if (lastError) { + this._connectedState = 100; + this._needsToken = true; + this._isConnecting = false; + return; + } + break; + } + + nextTick(); + } + + updateToken (token, connectedState = 0) { + this._connectState = connectedState; + this._transport.updateToken(token); + this._followConnection(); + } + + get isConnecting () { + return this._isConnecting; + } + + get isConnected () { + return this._transport.isConnected; + } + + get secureToken () { + return this._transport.token; + } +} diff --git a/js/src/views/Application/Container/container.js b/js/src/views/Application/Container/container.js index 6efca706e74..46f4c03b983 100644 --- a/js/src/views/Application/Container/container.js +++ b/js/src/views/Application/Container/container.js @@ -32,16 +32,14 @@ export default class Container extends Component { }; render () { - const { children, isApiConnected, isPingConnected, showFirstRun, onCloseFirstRun } = this.props; + const { children, showFirstRun, onCloseFirstRun } = this.props; return ( - + { children } diff --git a/js/src/views/Connection/connection.js b/js/src/views/Connection/connection.js index 9356dc06a18..aa8916a3eb4 100644 --- a/js/src/views/Connection/connection.js +++ b/js/src/views/Connection/connection.js @@ -15,53 +15,33 @@ // along with Parity. If not, see . import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; +import ActionDone from 'material-ui/svg-icons/action/done'; +import ContentClear from 'material-ui/svg-icons/content/clear'; + +import * as styles from './styles'; + +class Connection extends Component { + static contextTypes = { + api: PropTypes.object.isRequired + } -const styleOverlay = { - position: 'fixed', - top: 0, - right: 0, - bottom: 0, - left: 0, - background: 'rgba(255, 255, 255, 0.75)', - zIndex: 20000 -}; - -const styleModal = { - position: 'fixed', - top: 0, - right: 0, - bottom: 0, - left: 0, - zIndex: 20001 -}; - -const styleBody = { - margin: '0 auto', - padding: '3em 2em', - textAlign: 'center', - maxWidth: '40em', - background: 'rgba(25, 25, 25, 0.75)', - color: 'rgb(208, 208, 208)', - boxShadow: 'rgba(0, 0, 0, 0.25) 0px 14px 45px, rgba(0, 0, 0, 0.22) 0px 10px 18px' -}; - -const styleHeader = { - fontSize: '1.25em', - margin: '0 0 0.5em 0' -}; - -const styleContent = { -}; - -export default class Connection extends Component { static propTypes = { + secureToken: PropTypes.string, isApiConnected: PropTypes.bool, isPingConnected: PropTypes.bool } + state = { + generatingToken: false, + manualToken: false + } + render () { - const { isApiConnected, isPingConnected } = this.props; - const isConnected = isApiConnected && isPingConnected; + const { isApiConnected, isPingConnected, secureToken } = this.props; + const isSecured = secureToken && secureToken !== 'initial'; + const isConnected = isApiConnected && isPingConnected && isSecured; if (isConnected) { return null; @@ -69,18 +49,70 @@ export default class Connection extends Component { return (
      -
      -
      -
      -
      - Connecting to Parity -
      -
      - If this message persists, please check that your Parity node is running. +
      +
      +
      +
      + { this.renderIcon(isPingConnected, 'Node') } + { this.renderIcon(isApiConnected, 'API') }
      + { isPingConnected ? this.renderSigner() : this.renderPing() }
      ); } + + renderSigner () { + const { isApiConnected, secureToken } = this.props; + let details = null; + + return ( +
      + Connecting to the Parity Secure API. { details } +
      + ); + } + + renderPing () { + return ( +
      + Connecting to the Parity Node. If this informational message persists, please ensure that your Parity node is running and reachable on the network. +
      + ); + } + + renderIcon (connected, name) { + const icon = connected + ? + : ; + + return ( +
      + { icon } +
      + { name } +
      +
      + ); + } +} + +function mapStateToProps (state) { + const { secureToken, isApiConnected, isPingConnected } = state.nodeStatus; + + return { + secureToken, + isApiConnected, + isPingConnected + }; } + +function mapDispatchToProps (dispatch) { + return bindActionCreators({}, dispatch); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(Connection); diff --git a/js/src/views/Connection/styles.js b/js/src/views/Connection/styles.js new file mode 100644 index 00000000000..3978fdbd75c --- /dev/null +++ b/js/src/views/Connection/styles.js @@ -0,0 +1,77 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const overlay = { + position: 'fixed', + top: 0, + right: 0, + bottom: 0, + left: 0, + background: 'rgba(255, 255, 255, 0.75)', + zIndex: 20000 +}; + +const modal = { + position: 'fixed', + top: 0, + right: 0, + bottom: 0, + left: 0, + zIndex: 20001 +}; + +const body = { + margin: '0 auto', + padding: '2em 4em', + textAlign: 'center', + maxWidth: '40em', + background: 'rgba(25, 25, 25, 0.75)', + color: 'rgb(208, 208, 208)', + boxShadow: 'rgba(0, 0, 0, 0.25) 0px 14px 45px, rgba(0, 0, 0, 0.22) 0px 10px 18px' +}; + +const header = { + fontSize: '1.25em' +}; + +const info = { + marginTop: '2em', + lineHeight: '1.618em' +}; + +const icons = { +}; + +const icon = { + display: 'inline-block', + padding: '0.5em 1em 1em 1em', + margin: '0 1em', + background: 'rgba(200, 200, 200, 0.25)', + borderRadius: '50%' +}; + +const iconName = { +}; + +const iconSvg = { + width: '5.5em', + height: '5.5em', + margin: '0 0 -1em 0' +}; + +export { + body, header, icons, icon, iconName, iconSvg, info, modal, overlay +}; diff --git a/js/src/views/Signer/providers/signerDataProvider.js b/js/src/views/Signer/providers/signerDataProvider.js index 0a7d53255c6..7fb1a143293 100644 --- a/js/src/views/Signer/providers/signerDataProvider.js +++ b/js/src/views/Signer/providers/signerDataProvider.js @@ -15,36 +15,18 @@ // along with Parity. If not, see . import logger from '../utils/logger'; -import { updateIsConnected, updateIsNodeRunning } from '../actions/signer'; - -import { isParityRunning } from '../utils/parity'; +import { updateIsConnected } from '../actions/signer'; export default class SignerDataProvider { constructor (store, ws) { this.store = store; this.ws = ws; - this.checkIfIsRunning(); - this.ws.onOpen.push(this.onWsOpen); this.ws.onError.push(this.onWsError); this.ws.onClose.push(this.onWsError); } - checkIfIsRunning = () => { - const { isNodeRunning, isLoading, url } = this.store.getState().signer; - const nextCheck = () => setTimeout(this.checkIfIsRunning, 1000); - - isParityRunning(url) - .then((isRunning) => { - if (isRunning !== isNodeRunning || isLoading) { - this.store.dispatch(updateIsNodeRunning(isRunning)); - } - - nextCheck(); - }); - } - onWsOpen = () => { logger.log('[Signer Provider] connected'); this.store.dispatch(updateIsConnected(true)); diff --git a/js/src/views/Signer/signer.js b/js/src/views/Signer/signer.js index 05d69eed34a..88c5d360bcd 100644 --- a/js/src/views/Signer/signer.js +++ b/js/src/views/Signer/signer.js @@ -20,18 +20,14 @@ import { connect } from 'react-redux'; import { Actionbar, Page } from '../../ui'; import LoadingPage from './containers/LoadingPage'; -import OfflinePage from './containers/OfflinePage'; import RequestsPage from './containers/RequestsPage'; -import UnAuthorizedPage from './containers/UnAuthorizedPage'; import styles from './signer.css'; export class Signer extends Component { static propTypes = { signer: PropTypes.shape({ - isLoading: PropTypes.bool.isRequired, - isConnected: PropTypes.bool.isRequired, - isNodeRunning: PropTypes.bool.isRequired + isLoading: PropTypes.bool.isRequired }).isRequired }; @@ -48,20 +44,12 @@ export class Signer extends Component { } renderPage () { - const { isLoading, isConnected, isNodeRunning } = this.props.signer; + const { isLoading } = this.props.signer; if (isLoading) { return ( ); - } else if (!isNodeRunning) { - return ( - - ); - } else if (!isConnected) { - return ( - - ); } return ( diff --git a/js/src/views/Signer/utils/parity.js b/js/src/views/Signer/utils/parity.js deleted file mode 100644 index 437c25242e1..00000000000 --- a/js/src/views/Signer/utils/parity.js +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -import logger from './logger'; - -import { isExtension } from './extension'; - -const isProd = process.env.NODE_ENV === 'production'; - -export const isParityRunning = (path) => { - const url = isProd || isExtension() - ? `http://${path}/index.html` - : `http://${window.location.host}/api/ping`; - - return fetch(url, { method: 'GET' }) - .then(() => true) - .catch((error) => { - logger.error('isParityRunning', error); - return false; - }); -}; diff --git a/js/src/web3.html b/js/src/web3.html deleted file mode 100644 index bc95578a22f..00000000000 --- a/js/src/web3.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - Web3 Global - - - - - diff --git a/js/src/web3.js b/js/src/web3.js deleted file mode 100644 index 1b560ef2c62..00000000000 --- a/js/src/web3.js +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -import Web3 from 'web3'; - -import './web3.html'; - -const http = new Web3.providers.HttpProvider('/rpc/'); -const web3 = new Web3(http); - -window.web3 = web3; From 400c667b81d332434bf4ec18b5e1edebdf0ff6f3 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 6 Oct 2016 22:40:03 +0200 Subject: [PATCH 0945/1062] init token updates take place --- js/src/index.js | 6 ++-- js/src/redux/providers/status.js | 6 ++-- js/src/secureApi.js | 45 ++++++++++++++++----------- js/src/views/Connection/connection.js | 35 ++++++++------------- 4 files changed, 44 insertions(+), 48 deletions(-) diff --git a/js/src/index.js b/js/src/index.js index 69361e69c78..66bcf8238ee 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -47,7 +47,6 @@ import './index.html'; injectTapEventPlugin(); -const initToken = window.localStorage.getItem('sysuiToken'); const parityUrl = process.env.PARITY_URL || ( process.env.NODE_ENV === 'production' @@ -55,7 +54,8 @@ const parityUrl = process.env.PARITY_URL || : '127.0.0.1:8180' ); -const api = new SecureApi(`ws://${parityUrl}`, initToken); +const ws = new Ws(parityUrl); +const api = new SecureApi(`ws://${parityUrl}`, ws.init); ContractInstances.create(api); // signer @@ -63,7 +63,6 @@ function tokenSetter (token, cb) { window.localStorage.setItem('sysuiToken', token); } -const ws = new Ws(parityUrl); const web3ws = new Web3(new WebSocketsProvider(ws)); statusWeb3Extension(web3ws).map((extension) => web3ws._extend(extension)); @@ -73,7 +72,6 @@ store.dispatch({ type: 'initAll', api }); // signer new WsDataProvider(store, ws); // eslint-disable-line no-new new SignerDataProvider(store, ws); // eslint-disable-line no-new -ws.init(initToken); const routerHistory = useRouterHistory(createHashHistory)({}); diff --git a/js/src/redux/providers/status.js b/js/src/redux/providers/status.js index cb88d094e2f..62828b6c6b8 100644 --- a/js/src/redux/providers/status.js +++ b/js/src/redux/providers/status.js @@ -45,7 +45,7 @@ export default class Status { _pollPing = () => { const dispatch = (status, timeout = 500) => { - this._store.dispatch(statusCollection({ isPingConnected: status })); + this._store.dispatch(statusCollection({ isPingable: status })); setTimeout(this._pollPing, timeout); }; @@ -56,9 +56,9 @@ export default class Status { _pollStatus = () => { const nextTimeout = (timeout = 1000) => setTimeout(this._pollStatus, timeout); - const { token, isConnected } = this._api.transport; + const { secureToken, isConnected, isConnecting, needsToken } = this._api; - this._store.dispatch(statusCollection({ isApiConnected: isConnected, secureToken: token })); + this._store.dispatch(statusCollection({ isConnected, isConnecting, needsToken, secureToken })); if (!isConnected) { nextTimeout(250); } diff --git a/js/src/secureApi.js b/js/src/secureApi.js index 4c88d87ce2b..3714bbd6afe 100644 --- a/js/src/secureApi.js +++ b/js/src/secureApi.js @@ -16,31 +16,40 @@ import Api from './api'; +const sysuiToken = window.localStorage.getItem('sysuiToken'); + export default class SecureApi extends Api { - constructor (url, token) { - super(new Api.Transport.Ws(url, token)); + constructor (url, updateTokenCallback) { + super(new Api.Transport.Ws(url, sysuiToken)); this._isConnecting = true; this._connectState = 0; this._needsToken = false; + this._updateTokenCallback = (token) => updateTokenCallback(token); this._followConnection(); } _followConnection = () => { const nextTick = () => setTimeout(this._followConnection, 250); + const setToken = () => { + window.localStorage.setItem('sysuiToken', this._transport.token); + this._updateTokenCallback(this._transport.token); + }; + const setManual = () => { + this._connectedState = 100; + this._needsToken = true; + this._isConnecting = false; + }; const lastError = this._transport.lastError; const isConnected = this._transport.isConnected; - const isConnecting = this._transport.isConnecting; - - console.log('_followConnection', isConnected, this._connectState); switch (this._connectState) { // token = case 0: if (isConnected) { this._isConnecting = false; - return; + return setToken(); } else if (lastError) { this.updateToken('initial', 1); } @@ -49,35 +58,29 @@ export default class SecureApi extends Api { // token = 'initial' case 1: if (isConnected) { + this._connectState = 2; this.personal .generateAuthorizationToken() .then((token) => { - console.log('token', token); - this.updateToken(token, 2); + this.updateToken(token.replace(/[^a-zA-Z0-9]/g, ''), 2); }) .catch((error) => { console.error('_followConnection', error); - this._isConnecting = false; + setManual(); }); return; } else if (lastError) { - this._connectedState = 100; - this._needsToken = true; - this._isConnecting = false; - return; + return setManual(); } break; - // token = + // token = case 2: if (isConnected) { this._isConnecting = false; - return; + return setToken(); } else if (lastError) { - this._connectedState = 100; - this._needsToken = true; - this._isConnecting = false; - return; + return setManual(); } break; } @@ -99,6 +102,10 @@ export default class SecureApi extends Api { return this._transport.isConnected; } + get needsToken () { + return this._needsToken; + } + get secureToken () { return this._transport.token; } diff --git a/js/src/views/Connection/connection.js b/js/src/views/Connection/connection.js index aa8916a3eb4..ea91aa3d8ae 100644 --- a/js/src/views/Connection/connection.js +++ b/js/src/views/Connection/connection.js @@ -28,22 +28,17 @@ class Connection extends Component { } static propTypes = { - secureToken: PropTypes.string, - isApiConnected: PropTypes.bool, - isPingConnected: PropTypes.bool - } - - state = { - generatingToken: false, - manualToken: false + isConnected: PropTypes.bool, + isConnecting: PropTypes.bool, + isPingable: PropTypes.bool, + needsToken: PropTypes.bool } render () { - const { isApiConnected, isPingConnected, secureToken } = this.props; - const isSecured = secureToken && secureToken !== 'initial'; - const isConnected = isApiConnected && isPingConnected && isSecured; + const { isConnected, isConnecting, isPingable } = this.props; + const isOk = isConnected && !isConnecting && isPingable; - if (isConnected) { + if (isOk) { return null; } @@ -53,10 +48,10 @@ class Connection extends Component {
      - { this.renderIcon(isPingConnected, 'Node') } - { this.renderIcon(isApiConnected, 'API') } + { this.renderIcon(isPingable, 'Node') } + { this.renderIcon(isConnected, 'API') }
      - { isPingConnected ? this.renderSigner() : this.renderPing() } + { isPingable ? this.renderSigner() : this.renderPing() }
      @@ -64,7 +59,7 @@ class Connection extends Component { } renderSigner () { - const { isApiConnected, secureToken } = this.props; + // const { isConnected } = this.props; let details = null; return ( @@ -99,13 +94,9 @@ class Connection extends Component { } function mapStateToProps (state) { - const { secureToken, isApiConnected, isPingConnected } = state.nodeStatus; + const { isConnected, isConnecting, isPingable, needsToken } = state.nodeStatus; - return { - secureToken, - isApiConnected, - isPingConnected - }; + return { isConnected, isConnecting, isPingable, needsToken }; } function mapDispatchToProps (dispatch) { From 24ee1854563f91ea6079cc3bd3838703f2a2156c Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 7 Oct 2016 10:55:31 +0200 Subject: [PATCH 0946/1062] basic test for manual token --- js/src/api/transport/ws/ws.js | 9 ++++++++- js/src/views/Connection/connection.js | 16 ++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/js/src/api/transport/ws/ws.js b/js/src/api/transport/ws/ws.js index 59c3098f187..ecab2a5a27d 100644 --- a/js/src/api/transport/ws/ws.js +++ b/js/src/api/transport/ws/ws.js @@ -47,12 +47,19 @@ export default class Ws extends JsonRpcBase { const sha3 = keccak_256(`${this._token}:${time}`); const hash = `${sha3}_${time}`; + if (this._ws) { + this._ws.onerror = null; + this._ws.onopen = null; + this._ws.onclose = null; + this._ws.onmessage = null; + this._ws = null; + } + this._connecting = true; this._connected = false; this._lastError = null; this._ws = new WebSocket(this._url, hash); - this._ws.onerror = this._onError; this._ws.onopen = this._onOpen; this._ws.onclose = this._onClose; diff --git a/js/src/views/Connection/connection.js b/js/src/views/Connection/connection.js index ea91aa3d8ae..183cffee5fd 100644 --- a/js/src/views/Connection/connection.js +++ b/js/src/views/Connection/connection.js @@ -36,7 +36,7 @@ class Connection extends Component { render () { const { isConnected, isConnecting, isPingable } = this.props; - const isOk = isConnected && !isConnecting && isPingable; + const isOk = !isConnecting && isConnected && isPingable; if (isOk) { return null; @@ -59,12 +59,20 @@ class Connection extends Component { } renderSigner () { - // const { isConnected } = this.props; - let details = null; + const { api } = this.context; + const { needsToken, isConnecting } = api; + + if (needsToken && !isConnecting) { + return ( +
      + You need a manual token. +
      + ); + } return (
      - Connecting to the Parity Secure API. { details } + Connecting to the Parity Secure API.
      ); } From b7be1b08939d78a2bc0b2d2be47d0e21618b7549 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 7 Oct 2016 11:54:04 +0200 Subject: [PATCH 0947/1062] rework connection display --- js/src/views/Connection/connection.css | 96 ++++++++++++++++++++++++++ js/src/views/Connection/connection.js | 50 +++++++++----- js/src/views/Connection/styles.js | 77 --------------------- 3 files changed, 129 insertions(+), 94 deletions(-) create mode 100644 js/src/views/Connection/connection.css delete mode 100644 js/src/views/Connection/styles.js diff --git a/js/src/views/Connection/connection.css b/js/src/views/Connection/connection.css new file mode 100644 index 00000000000..c0254e57d3a --- /dev/null +++ b/js/src/views/Connection/connection.css @@ -0,0 +1,96 @@ +/* Copyright 2015; 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation; either version 3 of the License; or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful; +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not; see . +*/ + +.overlay { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: rgba(255, 255, 255, 0.75); + z-index: 20000 +} + +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 20001 +} + +.body { + margin: 0 auto; + padding: 2em 4em; + text-align: center; + max-width: 40em; + background: rgba(25, 25, 25, 0.75); + color: rgb(208, 208, 208); + box-shadow: rgba(0, 0, 0, 0.25) 0px 14px 45px, rgba(0, 0, 0, 0.22) 0px 10px 18px +} + +.header { + fontSize: 1.25em +} + +.info { + margin-top: 2em; + line-height: 1.618em +} + +.icons { +} + +.icon, +.iconSmall { + display: inline-block; + padding: 1em; + vertical-align: middle; +} + +.iconName { +} + +.icon .svg { + width: 6em !important; + height: 6em !important; +} + +.iconSmall .svg { + width: 3em !important; + height: 3em !important; +} + +@keyframes pulse { + 0% { + fill: rgb(0, 200, 0); + } + 50% { + fill: rgb(150, 200, 150); + } + 100% { + fill: rgb(0, 200, 0); + } +} + +.pulse { + fill: red; + animation-name: pulse; + animation-duration: 1.5s; + animation-iteration-count: infinite; +} diff --git a/js/src/views/Connection/connection.js b/js/src/views/Connection/connection.js index 183cffee5fd..4ba9d662e42 100644 --- a/js/src/views/Connection/connection.js +++ b/js/src/views/Connection/connection.js @@ -17,10 +17,12 @@ import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; -import ActionDone from 'material-ui/svg-icons/action/done'; -import ContentClear from 'material-ui/svg-icons/content/clear'; +import ActionCompareArrows from 'material-ui/svg-icons/action/compare-arrows'; +import ActionDashboard from 'material-ui/svg-icons/action/dashboard'; +import HardwareDesktopMac from 'material-ui/svg-icons/hardware/desktop-mac'; +import NotificationVpnLock from 'material-ui/svg-icons/notification/vpn-lock'; -import * as styles from './styles'; +import styles from './connection.css'; class Connection extends Component { static contextTypes = { @@ -42,16 +44,30 @@ class Connection extends Component { return null; } + const typeIcon = isPingable + ? + : ; + const description = isPingable + ? this.renderSigner() + : this.renderPing(); + return (
      -
      -
      -
      -
      - { this.renderIcon(isPingable, 'Node') } - { this.renderIcon(isConnected, 'API') } +
      +
      +
      +
      +
      + +
      +
      + +
      +
      + { typeIcon } +
      - { isPingable ? this.renderSigner() : this.renderPing() } + { description }
      @@ -64,14 +80,14 @@ class Connection extends Component { if (needsToken && !isConnecting) { return ( -
      +
      You need a manual token.
      ); } return ( -
      +
      Connecting to the Parity Secure API.
      ); @@ -79,7 +95,7 @@ class Connection extends Component { renderPing () { return ( -
      +
      Connecting to the Parity Node. If this informational message persists, please ensure that your Parity node is running and reachable on the network.
      ); @@ -87,13 +103,13 @@ class Connection extends Component { renderIcon (connected, name) { const icon = connected - ? - : ; + ? + : ; return ( -
      +
      { icon } -
      +
      { name }
      diff --git a/js/src/views/Connection/styles.js b/js/src/views/Connection/styles.js deleted file mode 100644 index 3978fdbd75c..00000000000 --- a/js/src/views/Connection/styles.js +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -const overlay = { - position: 'fixed', - top: 0, - right: 0, - bottom: 0, - left: 0, - background: 'rgba(255, 255, 255, 0.75)', - zIndex: 20000 -}; - -const modal = { - position: 'fixed', - top: 0, - right: 0, - bottom: 0, - left: 0, - zIndex: 20001 -}; - -const body = { - margin: '0 auto', - padding: '2em 4em', - textAlign: 'center', - maxWidth: '40em', - background: 'rgba(25, 25, 25, 0.75)', - color: 'rgb(208, 208, 208)', - boxShadow: 'rgba(0, 0, 0, 0.25) 0px 14px 45px, rgba(0, 0, 0, 0.22) 0px 10px 18px' -}; - -const header = { - fontSize: '1.25em' -}; - -const info = { - marginTop: '2em', - lineHeight: '1.618em' -}; - -const icons = { -}; - -const icon = { - display: 'inline-block', - padding: '0.5em 1em 1em 1em', - margin: '0 1em', - background: 'rgba(200, 200, 200, 0.25)', - borderRadius: '50%' -}; - -const iconName = { -}; - -const iconSvg = { - width: '5.5em', - height: '5.5em', - margin: '0 0 -1em 0' -}; - -export { - body, header, icons, icon, iconName, iconSvg, info, modal, overlay -}; From 1f1fc111a8723b33bf23cc1e645530aaaa98ab24 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 7 Oct 2016 12:45:35 +0200 Subject: [PATCH 0948/1062] allow updates of the secure token --- js/src/secureApi.js | 4 +-- js/src/ui/SignerIcon/signerIcon.js | 29 +++++++++++++---- js/src/views/Connection/connection.css | 17 ++++++++++ js/src/views/Connection/connection.js | 43 ++++++++++++++++++-------- 4 files changed, 72 insertions(+), 21 deletions(-) diff --git a/js/src/secureApi.js b/js/src/secureApi.js index 3714bbd6afe..9b0339155e2 100644 --- a/js/src/secureApi.js +++ b/js/src/secureApi.js @@ -62,7 +62,7 @@ export default class SecureApi extends Api { this.personal .generateAuthorizationToken() .then((token) => { - this.updateToken(token.replace(/[^a-zA-Z0-9]/g, ''), 2); + this.updateToken(token, 2); }) .catch((error) => { console.error('_followConnection', error); @@ -90,7 +90,7 @@ export default class SecureApi extends Api { updateToken (token, connectedState = 0) { this._connectState = connectedState; - this._transport.updateToken(token); + this._transport.updateToken(token.replace(/[^a-zA-Z0-9]/g, '')); this._followConnection(); } diff --git a/js/src/ui/SignerIcon/signerIcon.js b/js/src/ui/SignerIcon/signerIcon.js index 82b3207848a..6d7cd45e8ac 100644 --- a/js/src/ui/SignerIcon/signerIcon.js +++ b/js/src/ui/SignerIcon/signerIcon.js @@ -15,27 +15,29 @@ // along with Parity. If not, see . import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; import { keccak_256 } from 'js-sha3'; // eslint-disable-line camelcase import ActionFingerprint from 'material-ui/svg-icons/action/fingerprint'; import IdentityIcon from '../IdentityIcon'; -export default class SignerIcon extends Component { +class SignerIcon extends Component { static propTypes = { - className: PropTypes.string + className: PropTypes.string, + secureToken: PropTypes.string } render () { - const { className } = this.props; - const signerToken = window.localStorage.getItem('sysuiToken'); + const { className, secureToken } = this.props; - if (!signerToken) { + if (!secureToken) { return ( ); } - const signerSha = keccak_256(signerToken); + const signerSha = keccak_256(secureToken); return ( - You need a manual token. +
      Unable to make a connection to the Parity Secure API. To update your secure token or to generate a new one, run parity signer new-token and supply the token below
      +
      + +
      ); } @@ -101,19 +118,19 @@ class Connection extends Component { ); } - renderIcon (connected, name) { - const icon = connected - ? - : ; + onChangeToken = (event, token) => { + const validToken = /[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}/.test(token); + this.setState({ token, validToken }, () => { + validToken && this.setToken(); + }); + } - return ( -
      - { icon } -
      - { name } -
      -
      - ); + setToken = () => { + const { api } = this.context; + const { token } = this.state; + + api.updateToken(token); + this.setState({ token: '', validToken: false }); } } From 39bfde4fad91b57cda4fbc8e1a6ca24737c8159b Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 7 Oct 2016 13:53:46 +0200 Subject: [PATCH 0949/1062] first stab at making the build build --- .gitlab-ci.yml | 33 +++++++++++++++++++++++++++++++-- js/scripts/release.sh | 33 +++++++++------------------------ 2 files changed, 40 insertions(+), 26 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 90bf0129352..7ca47bf2025 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -284,12 +284,41 @@ test-linux: stage: test before_script: - git submodule update --init --recursive - - ./js/scripts/install-deps.sh script: - - ./js/scripts/test.sh - export RUST_BACKTRACE=1 - ./test.sh --verbose tags: - rust-test dependencies: - linux-stable +js-build: + stage: build + only: + - js + - jg-gitlab-build + - master + - beta + - tags + - stable + before_script: + - ./js/scripts/install-deps.sh + script: + - ./js/scripts/build.sh + - ./js/scripts/release.sh + tags: + - javascript + - javascript-stable + artifacts: + paths: + - js/build + name: "stable-javascript_parity" +js-test: + stage: test + before_script: + - ./js/scripts/install-deps.sh + script: + - ./js/scripts/test.sh + tags: + - javascript-test + dependencies: + - js-build diff --git a/js/scripts/release.sh b/js/scripts/release.sh index fea2b5d6c2d..a3a35ac787d 100644 --- a/js/scripts/release.sh +++ b/js/scripts/release.sh @@ -1,29 +1,14 @@ #!/bin/bash -set -o errexit +# change into the js directory (one down from scripts) +pushd `dirname $0` +cd .. -if [[ ("$TRAVIS_PULL_REQUEST" != "false") || ("$TRAVIS_BRANCH" != "master") ]]; then - exit 0 -fi +# run release +EXICCODE=0 -git config --global user.email "admin@travis-ci.org" -git config --global user.name "Travis CI" -git config --global push.default simple -git config credential.helper "store --file=.git/credentials" -echo "https://${GITHUB_TOKEN}:@github.com" > .git/credentials -git checkout master +# back to root +popd -DATE=`date` - -npm run build -echo "/* ${DATE} */" >> ./index.js - -git add --force index.js -git commit --message "[CI skip] ${DATE}" - -npm version patch --message "[CI skip] ${DATE} %s" -git push -git push --tags - -echo -e "$NPM_USERNAME\n$NPM_PASSWORD\n$NPM_EMAIL" | npm login -npm publish +# exit with exit code +exit $EXITCODE From e61652e8abc01386808df939dea26e3d4dfa3fa8 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 7 Oct 2016 13:58:11 +0200 Subject: [PATCH 0950/1062] update runner tags --- .gitlab-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7ca47bf2025..77f2e8ba26a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -306,8 +306,8 @@ js-build: - ./js/scripts/build.sh - ./js/scripts/release.sh tags: - - javascript - - javascript-stable + - rust + - rust-stable artifacts: paths: - js/build @@ -319,6 +319,6 @@ js-test: script: - ./js/scripts/test.sh tags: - - javascript-test + - rust-test dependencies: - js-build From 1541aadb8b61bc6da4ee9117e4a7f4546e234baa Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 7 Oct 2016 14:08:38 +0200 Subject: [PATCH 0951/1062] fix linting issues --- .../basiccoin/IdentityIcon/identityIcon.js | 4 +-- js/src/dapps/registry/names/actions.js | 2 +- js/src/dapps/registry/names/names.js | 28 +++++++++---------- js/src/dapps/registry/names/reducers.js | 4 +-- .../TransactionFinished.js | 3 -- 5 files changed, 19 insertions(+), 22 deletions(-) diff --git a/js/src/dapps/basiccoin/IdentityIcon/identityIcon.js b/js/src/dapps/basiccoin/IdentityIcon/identityIcon.js index c55c6a8abb4..ee1374f7ec9 100644 --- a/js/src/dapps/basiccoin/IdentityIcon/identityIcon.js +++ b/js/src/dapps/basiccoin/IdentityIcon/identityIcon.js @@ -22,12 +22,12 @@ import styles from './identityIcon.css'; export default class IdentityIcon extends Component { static propTypes = { address: PropTypes.string.isRequired, - className: PropTypes.string, + className: PropTypes.string } render () { const { address, className } = this.props; - const classes = `${styles.icon} ${className}` + const classes = `${styles.icon} ${className}`; return ( - !!queue.find((entry) => entry.action === action && entry.name === name) + !!queue.find((entry) => entry.action === action && entry.name === name); export const reserveStart = (name) => ({ type: 'names reserve start', name }); diff --git a/js/src/dapps/registry/names/names.js b/js/src/dapps/registry/names/names.js index ffcc951cb30..330eb413971 100644 --- a/js/src/dapps/registry/names/names.js +++ b/js/src/dapps/registry/names/names.js @@ -26,16 +26,16 @@ import { fromWei } from '../parity.js'; import styles from './names.css'; -const useSignerText = (

      Use the Signer to authenticate the following changes.

      ) +const useSignerText = (

      Use the Signer to authenticate the following changes.

      ); const renderNames = (names) => { - const out = [] + const out = []; for (let name of names) { - out.push(({ name }), ', ') + out.push(({ name }), ', '); } - out.pop() - return out -} + out.pop(); + return out; +}; const renderQueue = (queue) => { if (queue.length === 0) { @@ -43,18 +43,18 @@ const renderQueue = (queue) => { } const grouped = queue.reduce((grouped, change) => { - const last = grouped[grouped.length - 1] + const last = grouped[grouped.length - 1]; if (last && last.action === change.action) { - last.names.push(change.name) + last.names.push(change.name); } else { - grouped.push({action: change.action, names: [change.name]}) + grouped.push({ action: change.action, names: [change.name] }); } - return grouped + return grouped; }, []); return (
        - { grouped.map(({action, names}) => ( + { grouped.map(({ action, names }) => (
      • { renderNames(names) } { ' will be ' } @@ -63,7 +63,7 @@ const renderQueue = (queue) => { )) }
      ); -} +}; export default class Names extends Component { @@ -92,8 +92,8 @@ export default class Names extends Component { ? (

      Please select an account first.

      ) : (action === 'reserve' ? (

      - The fee to reserve a name is { fromWei(fee).toFixed(3) }ΞTH. -

      ) + The fee to reserve a name is { fromWei(fee).toFixed(3) }ΞTH. +

      ) : (

      To drop a name, you have to be the owner.

      ) ) } diff --git a/js/src/dapps/registry/names/reducers.js b/js/src/dapps/registry/names/reducers.js index eb5e7c69043..1fcee57d8b2 100644 --- a/js/src/dapps/registry/names/reducers.js +++ b/js/src/dapps/registry/names/reducers.js @@ -31,7 +31,7 @@ export default (state = initialState, action) => { if (action.type === 'names reserve success') { return { ...state, pending: false, - queue: state.queue.concat({action: 'reserve', name: action.name}) + queue: state.queue.concat({ action: 'reserve', name: action.name }) }; } if (action.type === 'names reserve fail') { @@ -44,7 +44,7 @@ export default (state = initialState, action) => { if (action.type === 'names drop success') { return { ...state, pending: false, - queue: state.queue.concat({action: 'drop', name: action.name}) + queue: state.queue.concat({ action: 'drop', name: action.name }) }; } if (action.type === 'names drop fail') { diff --git a/js/src/views/Signer/components/TransactionFinished/TransactionFinished.js b/js/src/views/Signer/components/TransactionFinished/TransactionFinished.js index bba9856f06d..4a75fdb9704 100644 --- a/js/src/views/Signer/components/TransactionFinished/TransactionFinished.js +++ b/js/src/views/Signer/components/TransactionFinished/TransactionFinished.js @@ -15,9 +15,6 @@ // along with Parity. If not, see . import React, { Component, PropTypes } from 'react'; -import ReactTooltip from 'react-tooltip'; -import TimeIcon from 'material-ui/svg-icons/device/access-time'; -import moment from 'moment'; import TransactionMainDetails from '../TransactionMainDetails'; import TxHashLink from '../TxHashLink'; From ffc2bf859029f726906d131da56f6062b48e000b Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 7 Oct 2016 14:10:44 +0200 Subject: [PATCH 0952/1062] skip tests requiring network (should be e2e, TODO) --- js/src/3rdparty/etherscan/account.spec.js | 2 +- js/src/3rdparty/etherscan/stats.spec.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/3rdparty/etherscan/account.spec.js b/js/src/3rdparty/etherscan/account.spec.js index 10494690eef..283fab3d292 100644 --- a/js/src/3rdparty/etherscan/account.spec.js +++ b/js/src/3rdparty/etherscan/account.spec.js @@ -18,7 +18,7 @@ import etherscan from './'; const TESTADDR = '0xbf885e2b55c6bcc84556a3c5f07d3040833c8d00'; -describe('etherscan/account', () => { +describe.skip('etherscan/account', () => { const checkBalance = function (balance, addr) { expect(balance).to.be.ok; expect(balance.account).to.equal(addr); diff --git a/js/src/3rdparty/etherscan/stats.spec.js b/js/src/3rdparty/etherscan/stats.spec.js index 788c1a18e23..fde2b035c2e 100644 --- a/js/src/3rdparty/etherscan/stats.spec.js +++ b/js/src/3rdparty/etherscan/stats.spec.js @@ -16,7 +16,7 @@ import etherscan from './'; -describe('etherscan/stats', () => { +describe.skip('etherscan/stats', () => { it('retrieves the latest price', () => { return etherscan.stats .price() From 633280ecdb0bf319e7726c475ec7dca40fe57b0e Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 7 Oct 2016 14:29:36 +0200 Subject: [PATCH 0953/1062] re-enable javascript tag/runner --- .gitlab-ci.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 77f2e8ba26a..cc4279a71fa 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -306,8 +306,7 @@ js-build: - ./js/scripts/build.sh - ./js/scripts/release.sh tags: - - rust - - rust-stable + - javascript artifacts: paths: - js/build @@ -319,6 +318,6 @@ js-test: script: - ./js/scripts/test.sh tags: - - rust-test + - javascript dependencies: - js-build From 58b486f4b95a90bb00b45a70018cb3eaa972fea7 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 7 Oct 2016 15:40:18 +0200 Subject: [PATCH 0954/1062] release push does the trick --- js/scripts/release.sh | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) mode change 100644 => 100755 js/scripts/release.sh diff --git a/js/scripts/release.sh b/js/scripts/release.sh old mode 100644 new mode 100755 index a3a35ac787d..6bc71307f24 --- a/js/scripts/release.sh +++ b/js/scripts/release.sh @@ -2,13 +2,30 @@ # change into the js directory (one down from scripts) pushd `dirname $0` -cd .. +cd ../build -# run release -EXICCODE=0 +# variables +UTCDATE=`date -u "+%Y%m%d-%H%M%S"` + +# init git +rm -rf ./.git +git init + +# our user details +git config push.default simple +git config user.email "jaco+gitlab@ethcore.io" +git config user.name "GitLab Build Bot" + +# add local files and send it up +git remote add origin https://${GITHUB_JS_PRECOMPILED}:@github.com/ethcore/js-precompiled.git +git fetch +git checkout master +git add . +git commit -m "$UTCDATE" +git push origin master --force # back to root popd # exit with exit code -exit $EXITCODE +exit 0 From 898262be8a6d1b5b1f57790c2395469174efddf6 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 7 Oct 2016 16:07:23 +0200 Subject: [PATCH 0955/1062] push to any branch, CI name --- js/scripts/release.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/js/scripts/release.sh b/js/scripts/release.sh index 6bc71307f24..1543ddc9b26 100755 --- a/js/scripts/release.sh +++ b/js/scripts/release.sh @@ -13,16 +13,16 @@ git init # our user details git config push.default simple +git config merge.ours.driver true git config user.email "jaco+gitlab@ethcore.io" git config user.name "GitLab Build Bot" # add local files and send it up git remote add origin https://${GITHUB_JS_PRECOMPILED}:@github.com/ethcore/js-precompiled.git -git fetch -git checkout master +git checkout -b $CI_BUILD_REF_NAME git add . git commit -m "$UTCDATE" -git push origin master --force +git push origin $CI_BUILD_REF_NAME --force # back to root popd From 9a1d088b7df681904088ec602991f16ae0f1f3e9 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 7 Oct 2016 16:21:53 +0200 Subject: [PATCH 0956/1062] javscript-test runner as well --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cc4279a71fa..3656ca31384 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -318,6 +318,6 @@ js-test: script: - ./js/scripts/test.sh tags: - - javascript + - javascript-test dependencies: - js-build From ece9204c1eaa6b35d0a70054bf89dd06a0df19a0 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 7 Oct 2016 16:28:33 +0200 Subject: [PATCH 0957/1062] swap dependencies build requires test --- .gitlab-ci.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3656ca31384..9f8e03250af 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -291,6 +291,14 @@ test-linux: - rust-test dependencies: - linux-stable +js-test: + stage: test + before_script: + - ./js/scripts/install-deps.sh + script: + - ./js/scripts/test.sh + tags: + - javascript-test js-build: stage: build only: @@ -311,13 +319,5 @@ js-build: paths: - js/build name: "stable-javascript_parity" -js-test: - stage: test - before_script: - - ./js/scripts/install-deps.sh - script: - - ./js/scripts/test.sh - tags: - - javascript-test dependencies: - - js-build + - js-test From acc33c73e47adcea13a185bf8b05a8589f0f33de Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 7 Oct 2016 16:36:42 +0200 Subject: [PATCH 0958/1062] revert stages swap --- .gitlab-ci.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9f8e03250af..3656ca31384 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -291,14 +291,6 @@ test-linux: - rust-test dependencies: - linux-stable -js-test: - stage: test - before_script: - - ./js/scripts/install-deps.sh - script: - - ./js/scripts/test.sh - tags: - - javascript-test js-build: stage: build only: @@ -319,5 +311,13 @@ js-build: paths: - js/build name: "stable-javascript_parity" +js-test: + stage: test + before_script: + - ./js/scripts/install-deps.sh + script: + - ./js/scripts/test.sh + tags: + - javascript-test dependencies: - - js-test + - js-build From 4bf8e843ef04e837b331cb23b430cebb0a529573 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 7 Oct 2016 17:37:14 +0200 Subject: [PATCH 0959/1062] retrieve images associated with tokens --- js/src/redux/actions.js | 2 ++ js/src/redux/providers/balances.js | 21 +++++++++++------- js/src/redux/providers/imagesActions.js | 23 ++++++++++++++++++++ js/src/redux/providers/imagesReducer.js | 29 +++++++++++++++++++++++++ js/src/redux/providers/index.js | 1 + js/src/redux/reducers.js | 3 ++- 6 files changed, 70 insertions(+), 9 deletions(-) create mode 100644 js/src/redux/providers/imagesActions.js create mode 100644 js/src/redux/providers/imagesReducer.js diff --git a/js/src/redux/actions.js b/js/src/redux/actions.js index 9b456e129c9..58e9c2a3673 100644 --- a/js/src/redux/actions.js +++ b/js/src/redux/actions.js @@ -15,12 +15,14 @@ // along with Parity. If not, see . import { newError } from '../ui/Errors/actions'; +import { setAddressImage } from './providers/imagesActions'; import { clearStatusLogs, toggleStatusLogs } from './providers/statusActions'; import { toggleView } from '../views/Settings'; export { newError, clearStatusLogs, + setAddressImage, toggleStatusLogs, toggleView }; diff --git a/js/src/redux/providers/balances.js b/js/src/redux/providers/balances.js index d262a3f19c7..2e61b52ff7c 100644 --- a/js/src/redux/providers/balances.js +++ b/js/src/redux/providers/balances.js @@ -15,12 +15,12 @@ // along with Parity. If not, see . import { getBalances, getTokens } from './balancesActions'; +import { setAddressImage } from './imagesActions'; import * as abis from '../../contracts/abi'; import imagesEthereum from '../../images/contracts/ethereum-56.png'; import imagesGavcoin from '../../images/contracts/gavcoin-56.png'; -import imagesUnknown from '../../images/contracts/unknown-56.png'; // TODO: Images should not be imported like this, should be via the content from GitHubHint contract (here until it is ready) const images = { @@ -89,18 +89,23 @@ export default class Balances { return tokenreg.instance.tokenCount .call() .then((numTokens) => { - const promises = []; + const promisesTokens = []; + const promisesImages = []; - while (promises.length < numTokens.toNumber()) { - promises.push(tokenreg.instance.token.call({}, [promises.length])); + while (promisesTokens.length < numTokens.toNumber()) { + promisesTokens.push(tokenreg.instance.token.call({}, [promisesTokens.length])); + promisesImages.push(tokenreg.instance.meta.call({}, [promisesImages.length, 'IMG'])); } - return Promise.all(promises); + return Promise.all([ + Promise.all(promisesTokens), + Promise.all(promisesImages) + ]); }); }) - .then((_tokens) => { + .then(([_tokens, images]) => { const tokens = {}; - this._tokens = _tokens.map((_token) => { + this._tokens = _tokens.map((_token, index) => { const [address, tag, format, name] = _token; const token = { @@ -108,10 +113,10 @@ export default class Balances { name, tag, format: format.toString(), - image: images[name.toLowerCase()] || imagesUnknown, contract: this._api.newContract(abis.eip20, address) }; tokens[address] = token; + this._store.dispatch(setAddressImage(address, images[index])); return token; }); diff --git a/js/src/redux/providers/imagesActions.js b/js/src/redux/providers/imagesActions.js new file mode 100644 index 00000000000..1da6cf1a0d5 --- /dev/null +++ b/js/src/redux/providers/imagesActions.js @@ -0,0 +1,23 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export function setAddressImage (address, hash) { + return { + type: 'setAddressImage', + address, + hash + }; +} diff --git a/js/src/redux/providers/imagesReducer.js b/js/src/redux/providers/imagesReducer.js new file mode 100644 index 00000000000..675a239208a --- /dev/null +++ b/js/src/redux/providers/imagesReducer.js @@ -0,0 +1,29 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { handleActions } from 'redux-actions'; + +const initialState = { + images: {} +}; + +export default handleActions({ + setAddressImage (state, action) { + const { address, hash } = action; + + return Object.assign({}, state, { [address]: hash }); + } +}, initialState); diff --git a/js/src/redux/providers/index.js b/js/src/redux/providers/index.js index a6f52fdaf3d..a29e9c32d08 100644 --- a/js/src/redux/providers/index.js +++ b/js/src/redux/providers/index.js @@ -19,5 +19,6 @@ export Personal from './personal'; export Status from './status'; export balancesReducer from './balancesReducer'; +export imagesReducer from './imagesReducer'; export personalReducer from './personalReducer'; export statusReducer from './statusReducer'; diff --git a/js/src/redux/reducers.js b/js/src/redux/reducers.js index 42cbc6ef4f9..e98e17acc2b 100644 --- a/js/src/redux/reducers.js +++ b/js/src/redux/reducers.js @@ -17,7 +17,7 @@ import { combineReducers } from 'redux'; import { routerReducer } from 'react-router-redux'; -import { balancesReducer, personalReducer, statusReducer as nodeStatusReducer } from './providers'; +import { balancesReducer, imagesReducer, personalReducer, statusReducer as nodeStatusReducer } from './providers'; import { errorReducer } from '../ui/Errors'; import { settingsReducer } from '../views/Settings'; @@ -36,6 +36,7 @@ export default function () { settings: settingsReducer, balances: balancesReducer, + images: imagesReducer, nodeStatus: nodeStatusReducer, personal: personalReducer, From 67a3f32b28077f51fececc8383f1d6226fe39f4e Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 7 Oct 2016 19:19:33 +0200 Subject: [PATCH 0960/1062] remove js build deps order --- .gitlab-ci.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3656ca31384..590b1024541 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -307,10 +307,6 @@ js-build: - ./js/scripts/release.sh tags: - javascript - artifacts: - paths: - - js/build - name: "stable-javascript_parity" js-test: stage: test before_script: @@ -319,5 +315,3 @@ js-test: - ./js/scripts/test.sh tags: - javascript-test - dependencies: - - js-build From 377f767cc9624bc2303f4e9cd058ed34f9f3d560 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 7 Oct 2016 20:21:16 +0200 Subject: [PATCH 0961/1062] null image when hash = 0x0 --- js/src/redux/providers/imagesReducer.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/js/src/redux/providers/imagesReducer.js b/js/src/redux/providers/imagesReducer.js index 675a239208a..209a79e7d9d 100644 --- a/js/src/redux/providers/imagesReducer.js +++ b/js/src/redux/providers/imagesReducer.js @@ -16,6 +16,8 @@ import { handleActions } from 'redux-actions'; +const ZERO = '0x0000000000000000000000000000000000000000000000000000000000000000'; + const initialState = { images: {} }; @@ -24,6 +26,8 @@ export default handleActions({ setAddressImage (state, action) { const { address, hash } = action; - return Object.assign({}, state, { [address]: hash }); + return Object.assign({}, state, { + [address]: hash === ZERO ? null : hash + }); } }, initialState); From 3a2c307bf57ad8fbcb8f7f5870a0d3e30048c16c Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 7 Oct 2016 20:21:56 +0200 Subject: [PATCH 0962/1062] 6x64 images (hashes for registries) --- ...ethereum-56.png => ethereum-black-64x64.png} | Bin 707 -> 771 bytes js/src/images/contracts/gavcoin-56.png | Bin 9329 -> 0 bytes js/src/images/contracts/gavcoin-6x64.png | Bin 0 -> 11587 bytes js/src/images/contracts/unknown-56.png | Bin 2355 -> 0 bytes js/src/images/contracts/unknown-64x64.png | Bin 0 -> 2248 bytes 5 files changed, 0 insertions(+), 0 deletions(-) rename js/src/images/contracts/{ethereum-56.png => ethereum-black-64x64.png} (50%) delete mode 100644 js/src/images/contracts/gavcoin-56.png create mode 100644 js/src/images/contracts/gavcoin-6x64.png delete mode 100644 js/src/images/contracts/unknown-56.png create mode 100644 js/src/images/contracts/unknown-64x64.png diff --git a/js/src/images/contracts/ethereum-56.png b/js/src/images/contracts/ethereum-black-64x64.png similarity index 50% rename from js/src/images/contracts/ethereum-56.png rename to js/src/images/contracts/ethereum-black-64x64.png index a88a419a4ba6fbb6baee5fad7f8a737ee04d191f..8e80e4ff134759b9cfbbc6f535791b93aac64a49 100644 GIT binary patch delta 351 zcmV-l0igcF1%n15iBL{Q4GJ0x0000DNk~Le0000$0000$2m=5B0G+pi?6D!R0e=by z5)u?}dqRo;009w6L_t(o!^PLj4ul{Kh2gGF(x>Q(SLFG}cpC~Rv`vuZWd2W0lnc@O zUHwez?T5;0KNnG1Q6+W0N(&y0Qdr61;E{309FIs09Xrf2Y|0H0IUP}0l+GN z9|1Ue4ZsYDBrBlmZKQ3O1f3s1L4Qp5A`18ubG=9d+{6SR(gjXp*o!;@2k{C>Gg3X? z0FenGB{C7FyeAm@maygxVavG{ntt>m)I^<+-^A)U^xe;W3`)?KpZy#QLg&--!T&kR zyEjcqmr!2bII9*v+2(a_1pmUIbJyBN2rkdr)yDzq0M1QPj_%Uj09Al{t2CMs+->LR xc0U5p4Mfg7IeO@d0ki|Lqic@!ae(sZ4?l?yQl1Z-#b*Ej002ovPDHLkV1ky(k@Elm delta 286 zcmV+(0pb3G2Ezp*iBL{Q4GJ0x0000DNk~Le0000u0000u2m=5B0H0XPEU_W50e=V+ z3OO=kh+BRD007ZRL_t(Y$Hmr54#O}A1kkKT;uNfW|0_0WJ{_Fa1}Zx&BR$ztFwC+H zD8XbX0_5BZF%ilRF%8NIk#IZ26etWa0g8o)x(i}3lsm*wDBmDLjv z^*PlOeyGE#GQ4OHs@CwJO{ZLit8*nStKdq1In_2SWpPq3yGg&RXn+*NcU6POUJ&%JjbG~H$5*!_tg{Bp=*nAAS2X;q(%{{P@|41F_oRf$7 kESHa+>7bj3`7qzC7ljTv&}F2?2LJ#707*qoM6N<$f}z-RQ2+n{ diff --git a/js/src/images/contracts/gavcoin-56.png b/js/src/images/contracts/gavcoin-56.png deleted file mode 100644 index 7970f0705262a76f66d0428265ea0e6bc9a0d27d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9329 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 WV>_h@iILR+0000 Date: Fri, 7 Oct 2016 20:34:05 +0200 Subject: [PATCH 0963/1062] don't pass tokens as prop to IdentityIcon --- js/src/ui/Form/AddressSelect/addressSelect.js | 3 --- js/src/ui/Form/InputAddress/inputAddress.js | 3 +-- js/src/ui/IdentityIcon/identityIcon.js | 27 +++++++++---------- js/src/ui/MethodDecoding/methodDecoding.js | 3 +-- .../Transactions/Transaction/transaction.js | 1 - js/src/views/Dapps/Summary/summary.js | 5 ++-- .../Signer/components/Account/Account.js | 5 ++-- 7 files changed, 19 insertions(+), 28 deletions(-) diff --git a/js/src/ui/Form/AddressSelect/addressSelect.js b/js/src/ui/Form/AddressSelect/addressSelect.js index 6cd0996ff75..c7500846cbd 100644 --- a/js/src/ui/Form/AddressSelect/addressSelect.js +++ b/js/src/ui/Form/AddressSelect/addressSelect.js @@ -63,14 +63,11 @@ export default class AddressSelect extends Component { } renderSelectEntry = (entry) => { - const { tokens } = this.props; - const item = (
      diff --git a/js/src/ui/Form/InputAddress/inputAddress.js b/js/src/ui/Form/InputAddress/inputAddress.js index dde7c3a7cc0..5bc0f1a4d68 100644 --- a/js/src/ui/Form/InputAddress/inputAddress.js +++ b/js/src/ui/Form/InputAddress/inputAddress.js @@ -56,7 +56,7 @@ export default class InputAddress extends Component { } renderIcon () { - const { value, tokens } = this.props; + const { value } = this.props; if (!value || !value.length) { return null; @@ -66,7 +66,6 @@ export default class InputAddress extends Component {
      ); diff --git a/js/src/ui/IdentityIcon/identityIcon.js b/js/src/ui/IdentityIcon/identityIcon.js index 292e99b9a8d..e89ed4541de 100644 --- a/js/src/ui/IdentityIcon/identityIcon.js +++ b/js/src/ui/IdentityIcon/identityIcon.js @@ -31,8 +31,7 @@ export default class IdentityIcon extends Component { center: PropTypes.bool, padded: PropTypes.bool, inline: PropTypes.bool, - tiny: PropTypes.bool, - tokens: PropTypes.object + tiny: PropTypes.bool } state = { @@ -46,9 +45,9 @@ export default class IdentityIcon extends Component { } componentWillReceiveProps (newProps) { - const { address, tokens } = this.props; + const { address } = this.props; - if (newProps.address === address && newProps.tokens === tokens) { + if (newProps.address === address) { return; } @@ -57,16 +56,16 @@ export default class IdentityIcon extends Component { updateIcon (_address) { const { api } = this.context; - const { button, tokens, inline, tiny } = this.props; - const token = (tokens || {})[_address]; - - if (token && token.image) { - this.setState({ - iconsrc: token.image - }); - - return; - } + const { button, inline, tiny } = this.props; + // const token = (tokens || {})[_address]; + // + // if (token && token.image) { + // this.setState({ + // iconsrc: token.image + // }); + // + // return; + // } let scale = 7; if (tiny) { diff --git a/js/src/ui/MethodDecoding/methodDecoding.js b/js/src/ui/MethodDecoding/methodDecoding.js index 58aeb68f857..fc9254c42f9 100644 --- a/js/src/ui/MethodDecoding/methodDecoding.js +++ b/js/src/ui/MethodDecoding/methodDecoding.js @@ -270,13 +270,12 @@ export default class Method extends Component { } renderAddressName (address, withName = true) { - const { tokens } = this.props; const account = this.getAccount(address); const name = account ? account.name.toUpperCase() : null; return ( - + { withName ? (name || address) : address } ); diff --git a/js/src/views/Account/Transactions/Transaction/transaction.js b/js/src/views/Account/Transactions/Transaction/transaction.js index 9fcd5744ebb..af10086a2ab 100644 --- a/js/src/views/Account/Transactions/Transaction/transaction.js +++ b/js/src/views/Account/Transactions/Transaction/transaction.js @@ -132,7 +132,6 @@ export default class Transaction extends Component {
      diff --git a/js/src/views/Dapps/Summary/summary.js b/js/src/views/Dapps/Summary/summary.js index 43377be5fd7..3182d19d700 100644 --- a/js/src/views/Dapps/Summary/summary.js +++ b/js/src/views/Dapps/Summary/summary.js @@ -32,7 +32,7 @@ export default class Summary extends Component { } render () { - const { app, tokens } = this.props; + const { app } = this.props; if (!app) { return null; @@ -43,8 +43,7 @@ export default class Summary extends Component { return ( + address={ app.address } /> { app.name }</Link> } byline={ app.description } /> diff --git a/js/src/views/Signer/components/Account/Account.js b/js/src/views/Signer/components/Account/Account.js index 248a9d497ae..618292fd138 100644 --- a/js/src/views/Signer/components/Account/Account.js +++ b/js/src/views/Signer/components/Account/Account.js @@ -56,15 +56,14 @@ class Account extends Component { } render () { - const { address, chain, className, tokens } = this.props; + const { address, chain, className } = this.props; return ( <div className={ `${styles.acc} ${className}` } title={ this.renderTitle() }> <AccountLink address={ address } chain={ chain }> <IdentityIcon center - address={ address } - tokens={ tokens } /> + address={ address } /> </AccountLink> { this.renderName() } { this.renderBalance() } From ce7bc39ae7d0e6c291246df3a921105fb3183b25 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Fri, 7 Oct 2016 20:47:53 +0200 Subject: [PATCH 0964/1062] check images against content hash pictures --- js/src/ui/IdentityIcon/identityIcon.js | 50 ++++++++++++++++---------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/js/src/ui/IdentityIcon/identityIcon.js b/js/src/ui/IdentityIcon/identityIcon.js index e89ed4541de..7afb0361e97 100644 --- a/js/src/ui/IdentityIcon/identityIcon.js +++ b/js/src/ui/IdentityIcon/identityIcon.js @@ -15,11 +15,13 @@ // along with Parity. If not, see <http://www.gnu.org/licenses/>. import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; import ContractIcon from 'material-ui/svg-icons/action/code'; import styles from './identityIcon.css'; -export default class IdentityIcon extends Component { +class IdentityIcon extends Component { static contextTypes = { api: PropTypes.object.isRequired } @@ -31,7 +33,8 @@ export default class IdentityIcon extends Component { center: PropTypes.bool, padded: PropTypes.bool, inline: PropTypes.bool, - tiny: PropTypes.bool + tiny: PropTypes.bool, + images: PropTypes.object.isRequired } state = { @@ -39,33 +42,29 @@ export default class IdentityIcon extends Component { } componentDidMount () { - const { address } = this.props; - - this.updateIcon(address); + this.updateIcon(this.props.address, this.props.images); } componentWillReceiveProps (newProps) { - const { address } = this.props; + const sameAddress = newProps.address === this.props.address; + const sameImages = Object.keys(newProps.images).length === Object.keys(this.props.images).length; - if (newProps.address === address) { + if (sameAddress && sameImages) { return; } - this.updateIcon(newProps.address); + this.updateIcon(newProps.address, newProps.images); } - updateIcon (_address) { + updateIcon (_address, images) { const { api } = this.context; const { button, inline, tiny } = this.props; - // const token = (tokens || {})[_address]; - // - // if (token && token.image) { - // this.setState({ - // iconsrc: token.image - // }); - // - // return; - // } + const imageHash = images[_address]; + + if (imageHash) { + this.setState({ iconsrc: `/api/content/${imageHash}` }); + return; + } let scale = 7; if (tiny) { @@ -120,3 +119,18 @@ export default class IdentityIcon extends Component { ); } } + +function mapStateToProps (state) { + const { images } = state; + + return { images }; +} + +function mapDispatchToProps (dispatch) { + return bindActionCreators({}, dispatch); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(IdentityIcon); From 9f85eb2540ee7491b7fc14216f593e5bc7e35d52 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Fri, 7 Oct 2016 21:05:54 +0200 Subject: [PATCH 0965/1062] cleanup signer after connection changes --- .../LoadingPage.css | 0 .../LoadingPage.js | 0 .../index.js | 0 .../OfflinePage.js | 0 .../index.js | 0 .../UnAuthorizedPage.css | 0 .../UnAuthorizedPage.js | 0 .../index.js | 0 js/src/views/Signer/signer.js | 42 ++----------------- 9 files changed, 3 insertions(+), 39 deletions(-) rename js/src/views/Signer/containers/{LoadingPage => --remove-LoadingPage}/LoadingPage.css (100%) rename js/src/views/Signer/containers/{LoadingPage => --remove-LoadingPage}/LoadingPage.js (100%) rename js/src/views/Signer/containers/{LoadingPage => --remove-LoadingPage}/index.js (100%) rename js/src/views/Signer/containers/{OfflinePage => --remove-OfflinePage}/OfflinePage.js (100%) rename js/src/views/Signer/containers/{OfflinePage => --remove-OfflinePage}/index.js (100%) rename js/src/views/Signer/containers/{UnAuthorizedPage => --remove-UnAuthorizedPage}/UnAuthorizedPage.css (100%) rename js/src/views/Signer/containers/{UnAuthorizedPage => --remove-UnAuthorizedPage}/UnAuthorizedPage.js (100%) rename js/src/views/Signer/containers/{UnAuthorizedPage => --remove-UnAuthorizedPage}/index.js (100%) diff --git a/js/src/views/Signer/containers/LoadingPage/LoadingPage.css b/js/src/views/Signer/containers/--remove-LoadingPage/LoadingPage.css similarity index 100% rename from js/src/views/Signer/containers/LoadingPage/LoadingPage.css rename to js/src/views/Signer/containers/--remove-LoadingPage/LoadingPage.css diff --git a/js/src/views/Signer/containers/LoadingPage/LoadingPage.js b/js/src/views/Signer/containers/--remove-LoadingPage/LoadingPage.js similarity index 100% rename from js/src/views/Signer/containers/LoadingPage/LoadingPage.js rename to js/src/views/Signer/containers/--remove-LoadingPage/LoadingPage.js diff --git a/js/src/views/Signer/containers/LoadingPage/index.js b/js/src/views/Signer/containers/--remove-LoadingPage/index.js similarity index 100% rename from js/src/views/Signer/containers/LoadingPage/index.js rename to js/src/views/Signer/containers/--remove-LoadingPage/index.js diff --git a/js/src/views/Signer/containers/OfflinePage/OfflinePage.js b/js/src/views/Signer/containers/--remove-OfflinePage/OfflinePage.js similarity index 100% rename from js/src/views/Signer/containers/OfflinePage/OfflinePage.js rename to js/src/views/Signer/containers/--remove-OfflinePage/OfflinePage.js diff --git a/js/src/views/Signer/containers/OfflinePage/index.js b/js/src/views/Signer/containers/--remove-OfflinePage/index.js similarity index 100% rename from js/src/views/Signer/containers/OfflinePage/index.js rename to js/src/views/Signer/containers/--remove-OfflinePage/index.js diff --git a/js/src/views/Signer/containers/UnAuthorizedPage/UnAuthorizedPage.css b/js/src/views/Signer/containers/--remove-UnAuthorizedPage/UnAuthorizedPage.css similarity index 100% rename from js/src/views/Signer/containers/UnAuthorizedPage/UnAuthorizedPage.css rename to js/src/views/Signer/containers/--remove-UnAuthorizedPage/UnAuthorizedPage.css diff --git a/js/src/views/Signer/containers/UnAuthorizedPage/UnAuthorizedPage.js b/js/src/views/Signer/containers/--remove-UnAuthorizedPage/UnAuthorizedPage.js similarity index 100% rename from js/src/views/Signer/containers/UnAuthorizedPage/UnAuthorizedPage.js rename to js/src/views/Signer/containers/--remove-UnAuthorizedPage/UnAuthorizedPage.js diff --git a/js/src/views/Signer/containers/UnAuthorizedPage/index.js b/js/src/views/Signer/containers/--remove-UnAuthorizedPage/index.js similarity index 100% rename from js/src/views/Signer/containers/UnAuthorizedPage/index.js rename to js/src/views/Signer/containers/--remove-UnAuthorizedPage/index.js diff --git a/js/src/views/Signer/signer.js b/js/src/views/Signer/signer.js index 88c5d360bcd..b9aace59530 100644 --- a/js/src/views/Signer/signer.js +++ b/js/src/views/Signer/signer.js @@ -14,59 +14,23 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see <http://www.gnu.org/licenses/>. -import React, { Component, PropTypes } from 'react'; -import { connect } from 'react-redux'; +import React, { Component } from 'react'; import { Actionbar, Page } from '../../ui'; - -import LoadingPage from './containers/LoadingPage'; import RequestsPage from './containers/RequestsPage'; import styles from './signer.css'; -export class Signer extends Component { - static propTypes = { - signer: PropTypes.shape({ - isLoading: PropTypes.bool.isRequired - }).isRequired - }; - +export default class Signer extends Component { render () { return ( <div className={ styles.signer }> <Actionbar title='Trusted Signer' /> <Page> - { this.renderPage() } + <RequestsPage /> </Page> </div> ); } - - renderPage () { - const { isLoading } = this.props.signer; - - if (isLoading) { - return ( - <LoadingPage /> - ); - } - - return ( - <RequestsPage /> - ); - } -} - -function mapStateToProps (state) { - return state; } - -function mapDispatchToProps (dispatch) { - return {}; -} - -export default connect( - mapStateToProps, - mapDispatchToProps -)(Signer); From 2a074cb31210a283ca4b69ef289aae50ce9825a9 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Fri, 7 Oct 2016 22:03:21 +0200 Subject: [PATCH 0966/1062] fix naming typo --- .../{gavcoin-6x64.png => gavcoin-64x64.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename js/src/images/contracts/{gavcoin-6x64.png => gavcoin-64x64.png} (100%) diff --git a/js/src/images/contracts/gavcoin-6x64.png b/js/src/images/contracts/gavcoin-64x64.png similarity index 100% rename from js/src/images/contracts/gavcoin-6x64.png rename to js/src/images/contracts/gavcoin-64x64.png From 47cd3546c3f1491c5d22e9d0a5514b90733d7146 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Fri, 7 Oct 2016 22:04:00 +0200 Subject: [PATCH 0967/1062] display unknownImages for balances (not available as content hash) --- js/src/redux/providers/balances.js | 11 ++-------- js/src/redux/providers/imagesReducer.js | 4 +++- js/src/ui/Balance/balance.js | 28 +++++++++++++++++++++---- 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/js/src/redux/providers/balances.js b/js/src/redux/providers/balances.js index 2e61b52ff7c..01243dccbed 100644 --- a/js/src/redux/providers/balances.js +++ b/js/src/redux/providers/balances.js @@ -19,19 +19,12 @@ import { setAddressImage } from './imagesActions'; import * as abis from '../../contracts/abi'; -import imagesEthereum from '../../images/contracts/ethereum-56.png'; -import imagesGavcoin from '../../images/contracts/gavcoin-56.png'; - -// TODO: Images should not be imported like this, should be via the content from GitHubHint contract (here until it is ready) -const images = { - ethereum: imagesEthereum, - gavcoin: imagesGavcoin -}; +import imagesEthereum from '../../images/contracts/ethereum-black-64x64.png'; const ETH = { name: 'Ethereum', tag: 'ΞTH', - image: images.ethereum + image: imagesEthereum }; export default class Balances { diff --git a/js/src/redux/providers/imagesReducer.js b/js/src/redux/providers/imagesReducer.js index 209a79e7d9d..4d4ac1f8f97 100644 --- a/js/src/redux/providers/imagesReducer.js +++ b/js/src/redux/providers/imagesReducer.js @@ -15,6 +15,7 @@ // along with Parity. If not, see <http://www.gnu.org/licenses/>. import { handleActions } from 'redux-actions'; +import { bytesToHex } from '../../api/util/format'; const ZERO = '0x0000000000000000000000000000000000000000000000000000000000000000'; @@ -24,7 +25,8 @@ const initialState = { export default handleActions({ setAddressImage (state, action) { - const { address, hash } = action; + const { address, hashArray } = action; + const hash = hashArray ? bytesToHex(hashArray) : ZERO; return Object.assign({}, state, { [address]: hash === ZERO ? null : hash diff --git a/js/src/ui/Balance/balance.js b/js/src/ui/Balance/balance.js index 6b94b60b302..9c18849cb1e 100644 --- a/js/src/ui/Balance/balance.js +++ b/js/src/ui/Balance/balance.js @@ -16,21 +16,25 @@ import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; +import unknownImage from '../../images/contracts/unknown-64x64.png'; import styles from './balance.css'; -export default class Balance extends Component { +class Balance extends Component { static contextTypes = { api: PropTypes.object } static propTypes = { - balance: PropTypes.object + balance: PropTypes.object, + images: PropTypes.object.isRequired } render () { const { api } = this.context; - const { balance } = this.props; + const { balance, images } = this.props; if (!balance) { return null; @@ -43,13 +47,14 @@ export default class Balance extends Component { const value = token.format ? new BigNumber(balance.value).div(new BigNumber(token.format)).toFormat(3) : api.util.fromWei(balance.value).toFormat(3); + const imagesrc = token.image || images[token.address] || unknownImage; return ( <div className={ styles.balance } key={ token.tag }> <img - src={ token.image } + src={ imagesrc } alt={ token.name } /> <div>{ value }<small> { token.tag }</small></div> </div> @@ -71,3 +76,18 @@ export default class Balance extends Component { ); } } + +function mapStateToProps (state) { + const { images } = state; + + return { images }; +} + +function mapDispatchToProps (dispatch) { + return bindActionCreators({}, dispatch); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(Balance); From 217c3db62acb9cbdffb0c83286b78012dfb83382 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Fri, 7 Oct 2016 22:17:04 +0200 Subject: [PATCH 0968/1062] unknownImage for transfer dialog --- js/src/modals/Transfer/Details/details.js | 7 +++++-- js/src/modals/Transfer/transfer.js | 4 +++- js/src/views/Account/account.js | 8 ++++++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/js/src/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js index f74620ba46c..456fdf9cb4f 100644 --- a/js/src/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -20,6 +20,7 @@ import { Checkbox, MenuItem } from 'material-ui'; import Form, { Input, InputAddressSelect, Select } from '../../../ui/Form'; +import imageUnknown from '../../../images/contracts/unknown-64x64.png'; import styles from '../transfer.css'; const CHECK_STYLE = { @@ -38,6 +39,7 @@ export default class Details extends Component { balance: PropTypes.object, all: PropTypes.bool, extras: PropTypes.bool, + images: PropTypes.object.isRequired, recipient: PropTypes.string, recipientError: PropTypes.string, tag: PropTypes.string, @@ -114,13 +116,14 @@ export default class Details extends Component { renderTokenSelect () { const { api } = this.context; - const { balance, tag } = this.props; + const { balance, images, tag } = this.props; const items = balance.tokens .filter((token) => token.value.gt(0)) .map((balance, idx) => { const token = balance.token; const isEth = idx === 0; + const imagesrc = token.image || images[token.address] || imageUnknown; let value = 0; if (isEth) { @@ -131,7 +134,7 @@ export default class Details extends Component { const label = ( <div className={ styles.token }> - <img src={ token.image } /> + <img src={ imagesrc } /> <div className={ styles.tokenname }> { token.name } </div> diff --git a/js/src/modals/Transfer/transfer.js b/js/src/modals/Transfer/transfer.js index 01e77d93762..78dc6f77080 100644 --- a/js/src/modals/Transfer/transfer.js +++ b/js/src/modals/Transfer/transfer.js @@ -49,6 +49,7 @@ export default class Transfer extends Component { account: PropTypes.object, balance: PropTypes.object, balances: PropTypes.object, + images: PropTypes.object.isRequired, onClose: PropTypes.func } @@ -147,7 +148,7 @@ export default class Transfer extends Component { } renderDetailsPage () { - const { account, balance } = this.props; + const { account, balance, images } = this.props; return ( <Details @@ -155,6 +156,7 @@ export default class Transfer extends Component { all={ this.state.valueAll } balance={ balance } extras={ this.state.extras } + images={ images } recipient={ this.state.recipient } recipientError={ this.state.recipientError } tag={ this.state.tag } diff --git a/js/src/views/Account/account.js b/js/src/views/Account/account.js index bbba53479a1..0470653643a 100644 --- a/js/src/views/Account/account.js +++ b/js/src/views/Account/account.js @@ -35,6 +35,7 @@ class Account extends Component { params: PropTypes.object, accounts: PropTypes.object, balances: PropTypes.object, + images: PropTypes.object.isRequired, isTest: PropTypes.bool } @@ -141,7 +142,7 @@ class Account extends Component { } const { address } = this.props.params; - const { accounts, balances } = this.props; + const { accounts, balances, images } = this.props; const account = accounts[address]; const balance = balances[address]; @@ -150,6 +151,7 @@ class Account extends Component { account={ account } balance={ balance } balances={ balances } + images={ images } onClose={ this.onTransferClose } /> ); } @@ -184,12 +186,14 @@ class Account extends Component { function mapStateToProps (state) { const { accounts } = state.personal; const { balances } = state.balances; + const { images } = state; const { isTest } = state.nodeStatus; return { isTest, accounts, - balances + balances, + images }; } From 1630c5ea731ccfb1499ec258487f58623b84f99e Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Fri, 7 Oct 2016 23:58:33 +0200 Subject: [PATCH 0969/1062] basic githubhint layout --- js/src/dapps/githubhint.html | 18 ++++ js/src/dapps/githubhint.js | 31 ++++++ .../githubhint/Application/application.css | 82 ++++++++++++++++ .../githubhint/Application/application.js | 98 +++++++++++++++++++ js/src/dapps/githubhint/Application/index.js | 17 ++++ js/src/dapps/githubhint/Button/button.css | 57 +++++++++++ js/src/dapps/githubhint/Button/button.js | 53 ++++++++++ js/src/dapps/githubhint/Button/index.js | 17 ++++ .../githubhint/IdentityIcon/identityIcon.css | 23 +++++ .../githubhint/IdentityIcon/identityIcon.js | 36 +++++++ js/src/dapps/githubhint/IdentityIcon/index.js | 17 ++++ js/src/dapps/githubhint/Loading/index.js | 17 ++++ js/src/dapps/githubhint/Loading/loading.css | 24 +++++ js/src/dapps/githubhint/Loading/loading.js | 29 ++++++ js/src/dapps/githubhint/parity.js | 21 ++++ js/src/dapps/githubhint/services.js | 64 ++++++++++++ js/src/views/Dapps/dapps.js | 5 + js/webpack.config.js | 1 + 18 files changed, 610 insertions(+) create mode 100644 js/src/dapps/githubhint.html create mode 100644 js/src/dapps/githubhint.js create mode 100644 js/src/dapps/githubhint/Application/application.css create mode 100644 js/src/dapps/githubhint/Application/application.js create mode 100644 js/src/dapps/githubhint/Application/index.js create mode 100644 js/src/dapps/githubhint/Button/button.css create mode 100644 js/src/dapps/githubhint/Button/button.js create mode 100644 js/src/dapps/githubhint/Button/index.js create mode 100644 js/src/dapps/githubhint/IdentityIcon/identityIcon.css create mode 100644 js/src/dapps/githubhint/IdentityIcon/identityIcon.js create mode 100644 js/src/dapps/githubhint/IdentityIcon/index.js create mode 100644 js/src/dapps/githubhint/Loading/index.js create mode 100644 js/src/dapps/githubhint/Loading/loading.css create mode 100644 js/src/dapps/githubhint/Loading/loading.js create mode 100644 js/src/dapps/githubhint/parity.js create mode 100644 js/src/dapps/githubhint/services.js diff --git a/js/src/dapps/githubhint.html b/js/src/dapps/githubhint.html new file mode 100644 index 00000000000..5776cbde5dd --- /dev/null +++ b/js/src/dapps/githubhint.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>GitHub Hint + + + + +
      + + + + + + diff --git a/js/src/dapps/githubhint.js b/js/src/dapps/githubhint.js new file mode 100644 index 00000000000..fdbd13a6dee --- /dev/null +++ b/js/src/dapps/githubhint.js @@ -0,0 +1,31 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import ReactDOM from 'react-dom'; +import React from 'react'; + +import injectTapEventPlugin from 'react-tap-event-plugin'; +injectTapEventPlugin(); + +import Application from './githubhint/Application'; + +import './style.css'; +import './githubhint.html'; + +ReactDOM.render( + , + document.querySelector('#container') +); diff --git a/js/src/dapps/githubhint/Application/application.css b/js/src/dapps/githubhint/Application/application.css new file mode 100644 index 00000000000..476ee0e5668 --- /dev/null +++ b/js/src/dapps/githubhint/Application/application.css @@ -0,0 +1,82 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.container { + background: #333; + font-family: 'Roboto'; + vertical-align: middle; + padding: 4em 0; + text-align: center; +} + +.form { + text-align: right; + margin: 0 auto; + border-radius: 5px; + width: 44em; + color: #eee; +} + +.box { + padding: 2em; + background: rgba(255, 255, 255, 0.1); + border-radius: 5px; +} + +.buttons { + text-align: center; + margin: 0 auto 2em auto; +} + +.box .buttons { + text-align: right; + margin: 2em 0 0 0; +} + +.box .description { + margin: 0 0 2em 0; + text-align: center; + opacity: 0.75; +} + +.capture { +} + +.capture+.capture { + margin-top: 1em; +} + +.capture * { + display: inline-block; + padding: 0.5em 0.5em; + vertical-align: middle; + box-sizing: border-box; + width: 20em; +} + +.capture input { + color: #333; + background: #eee; + border: none; + border-radius: 5px; + width: 20em; + font-size: 1em; +} + +.capture[disabled] { + opacity: 0.15; +} diff --git a/js/src/dapps/githubhint/Application/application.js b/js/src/dapps/githubhint/Application/application.js new file mode 100644 index 00000000000..6ed3633be8b --- /dev/null +++ b/js/src/dapps/githubhint/Application/application.js @@ -0,0 +1,98 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component } from 'react'; + +import { attachInterface } from '../services'; +import Button from '../Button'; +import Loading from '../Loading'; + +import styles from './application.css'; + +export default class Application extends Component { + state = { + loading: true, + fileHash: false + } + + componentDidMount () { + attachInterface() + .then((accounts, address, accountsInfo, contract, instance, fromAddress) => { + this.setState({ + accounts, + address, + accountsInfo, + contract, + instance, + fromAddress, + loading: false + }); + }); + } + + render () { + const { loading } = this.state; + + return loading + ? this.renderLoading() + : this.renderPage(); + } + + renderLoading () { + return ( + + ); + } + + renderPage () { + const { fileHash } = this.state; + + return ( +
      +
      + + +
      +
      +
      +
      + Provide a valid GitHub account, repo and { fileHash ? 'filename' : 'commit' } to register. The content information can be used in other contracts that allows for reverse lookups, e.g. image registries, dapp registries, etc. +
      +
      +
      https://github.com/
      + +
      +
      +
      commit #
      + +
      +
      + +
      +
      +
      +
      + ); + } + + onClickContentHash = () => { + this.setState({ fileHash: false }); + } + + onClickFileHash = () => { + this.setState({ fileHash: true }); + } +} diff --git a/js/src/dapps/githubhint/Application/index.js b/js/src/dapps/githubhint/Application/index.js new file mode 100644 index 00000000000..236578226a8 --- /dev/null +++ b/js/src/dapps/githubhint/Application/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './application'; diff --git a/js/src/dapps/githubhint/Button/button.css b/js/src/dapps/githubhint/Button/button.css new file mode 100644 index 00000000000..e4d16f9491c --- /dev/null +++ b/js/src/dapps/githubhint/Button/button.css @@ -0,0 +1,57 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.button { + background: #08a; + color: white; + border-radius: 5px; + font-size: 1em; + line-height: 24px; + height: 24px; + padding: 0.75em 1.5em; + cursor: pointer; + display: inline-block; + width: 7.5em; + text-align: center; +} + +.button.first { + border-radius: 5px 0 0 5px; +} + +.button.middle { + border-radius: 0; +} + +.button.last { + border-radius: 0 5px 5px 0; +} + +.button.disabled { + opacity: 0.25; + cursor: default; +} + +.button.inverse { + color: #08a; + background: white; +} + +.button * { + display: inline-block; + vertical-align: top; +} diff --git a/js/src/dapps/githubhint/Button/button.js b/js/src/dapps/githubhint/Button/button.js new file mode 100644 index 00000000000..42fca1af7d4 --- /dev/null +++ b/js/src/dapps/githubhint/Button/button.js @@ -0,0 +1,53 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import styles from './button.css'; + +export default class Button extends Component { + static propTypes = { + children: PropTypes.node.isRequired, + className: PropTypes.string, + disabled: PropTypes.bool, + invert: PropTypes.bool, + first: PropTypes.bool, + last: PropTypes.bool, + middle: PropTypes.bool, + onClick: PropTypes.func.isRequired + } + + render () { + const { children, className, disabled, invert, first, last, middle } = this.props; + const classes = `${styles.button} ${disabled ? styles.disabled : ''} ${invert ? styles.inverse : ''} ${first ? styles.first : ''} ${last ? styles.last : ''} ${middle ? styles.middle : ''} ${className}`; + + return ( +
      + { children } +
      + ); + } + + onClick = (event) => { + const { disabled, onClick } = this.props; + + if (disabled) { + return; + } + + onClick(event); + } +} diff --git a/js/src/dapps/githubhint/Button/index.js b/js/src/dapps/githubhint/Button/index.js new file mode 100644 index 00000000000..f69a65e3d53 --- /dev/null +++ b/js/src/dapps/githubhint/Button/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './button'; diff --git a/js/src/dapps/githubhint/IdentityIcon/identityIcon.css b/js/src/dapps/githubhint/IdentityIcon/identityIcon.css new file mode 100644 index 00000000000..3fa1df99e4d --- /dev/null +++ b/js/src/dapps/githubhint/IdentityIcon/identityIcon.css @@ -0,0 +1,23 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.icon { + width: 24px; + height: 24px; + border-radius: 50%; + margin-right: 0.5em; +} diff --git a/js/src/dapps/githubhint/IdentityIcon/identityIcon.js b/js/src/dapps/githubhint/IdentityIcon/identityIcon.js new file mode 100644 index 00000000000..0bc86731d45 --- /dev/null +++ b/js/src/dapps/githubhint/IdentityIcon/identityIcon.js @@ -0,0 +1,36 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import { api } from '../parity'; +import styles from './identityIcon.css'; + +export default class IdentityIcon extends Component { + static propTypes = { + address: PropTypes.string.isRequired + } + + render () { + const { address } = this.props; + + return ( + + ); + } +} diff --git a/js/src/dapps/githubhint/IdentityIcon/index.js b/js/src/dapps/githubhint/IdentityIcon/index.js new file mode 100644 index 00000000000..76c107bfb75 --- /dev/null +++ b/js/src/dapps/githubhint/IdentityIcon/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './identityIcon'; diff --git a/js/src/dapps/githubhint/Loading/index.js b/js/src/dapps/githubhint/Loading/index.js new file mode 100644 index 00000000000..0468cab37df --- /dev/null +++ b/js/src/dapps/githubhint/Loading/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './loading'; diff --git a/js/src/dapps/githubhint/Loading/loading.css b/js/src/dapps/githubhint/Loading/loading.css new file mode 100644 index 00000000000..b77d1a23725 --- /dev/null +++ b/js/src/dapps/githubhint/Loading/loading.css @@ -0,0 +1,24 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.loading { + width: 100%; + text-align: center; + padding-top: 5em; + font-size: 2em; + color: #999; +} diff --git a/js/src/dapps/githubhint/Loading/loading.js b/js/src/dapps/githubhint/Loading/loading.js new file mode 100644 index 00000000000..b884597d763 --- /dev/null +++ b/js/src/dapps/githubhint/Loading/loading.js @@ -0,0 +1,29 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component } from 'react'; + +import styles from './loading.css'; + +export default class Loading extends Component { + render () { + return ( +
      + Attaching to contract ... +
      + ); + } +} diff --git a/js/src/dapps/githubhint/parity.js b/js/src/dapps/githubhint/parity.js new file mode 100644 index 00000000000..f6d59f44d57 --- /dev/null +++ b/js/src/dapps/githubhint/parity.js @@ -0,0 +1,21 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const { api } = window.parity; + +export { + api +}; diff --git a/js/src/dapps/githubhint/services.js b/js/src/dapps/githubhint/services.js new file mode 100644 index 00000000000..ee198ff6dfa --- /dev/null +++ b/js/src/dapps/githubhint/services.js @@ -0,0 +1,64 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import * as abis from '../../contracts/abi'; +import { api } from './parity'; + +export function attachInterface () { + return api.ethcore + .registryAddress() + .then((registryAddress) => { + console.log(`the registry was found at ${registryAddress}`); + + const registry = api.newContract(abis.registry, registryAddress).instance; + + return Promise + .all([ + registry.getAddress.call({}, [api.util.sha3('githubhint'), 'A']), + api.personal.listAccounts(), + api.personal.accountsInfo() + ]); + }) + .then(([address, addresses, accountsInfo]) => { + console.log(`githubhint was found at ${address}`); + + const contract = api.newContract(abis.githubhint, address); + const accounts = addresses.reduce((obj, address) => { + const info = accountsInfo[address]; + + return Object.assign(obj, { + [address]: { + address, + name: info.name || 'Unnamed', + uuid: info.uuid + } + }); + }, {}); + const fromAddress = Object.keys(accounts)[0]; + + return { + accounts, + address, + accountsInfo, + contract, + instance: contract.instance, + fromAddress + }; + }) + .catch((error) => { + console.error('attachInterface', error); + }); +} diff --git a/js/src/views/Dapps/dapps.js b/js/src/views/Dapps/dapps.js index f341b3fa42c..f975d8c8243 100644 --- a/js/src/views/Dapps/dapps.js +++ b/js/src/views/Dapps/dapps.js @@ -59,6 +59,11 @@ class Dapps extends Component { name: 'Method Registry', description: 'A registry of method signatures for lookups on transactions', url: 'signaturereg' + }, + { + name: 'GitHub Hint', + description: 'A mapping of GitHub URLs to hashes for use in contracts as references', + url: 'githubhint' } ] } diff --git a/js/webpack.config.js b/js/webpack.config.js index 178578bbcfe..fbd454e0700 100644 --- a/js/webpack.config.js +++ b/js/webpack.config.js @@ -34,6 +34,7 @@ module.exports = { // dapps 'basiccoin': ['./dapps/basiccoin.js'], 'gavcoin': ['./dapps/gavcoin.js'], + 'githubhint': ['./dapps/githubhint.js'], 'registry': ['./dapps/registry.js'], 'signaturereg': ['./dapps/signaturereg.js'], 'tokenreg': ['./dapps/tokenreg.js'], From 6ced51d2db8c624fff0df1ae0ee495747e69cc0d Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 8 Oct 2016 00:09:33 +0200 Subject: [PATCH 0970/1062] single input for commit/filename --- js/src/dapps/githubhint/Application/application.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/js/src/dapps/githubhint/Application/application.js b/js/src/dapps/githubhint/Application/application.js index 6ed3633be8b..92232a83005 100644 --- a/js/src/dapps/githubhint/Application/application.js +++ b/js/src/dapps/githubhint/Application/application.js @@ -73,11 +73,11 @@ export default class Application extends Component {
      https://github.com/
      - +
      -
      -
      commit #
      - +
      +
      { fileHash ? '/' : 'commit #' }
      +
      From 25debcfe166d1545890e409fdc055bb76db5a4ce Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 8 Oct 2016 09:02:21 +0200 Subject: [PATCH 0971/1062] ethcore_hashContent call --- js/src/api/rpc/ethcore/ethcore.js | 5 +++++ js/src/jsonrpc/interfaces/ethcore.js | 16 +++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/js/src/api/rpc/ethcore/ethcore.js b/js/src/api/rpc/ethcore/ethcore.js index 8efdb7a3615..1ccc95bbadc 100644 --- a/js/src/api/rpc/ethcore/ethcore.js +++ b/js/src/api/rpc/ethcore/ethcore.js @@ -68,6 +68,11 @@ export default class Ethcore { .execute('ethcore_generateSecretPhrase'); } + hashContent (url) { + return this._transport + .execute('ethcore_hashContent', url); + } + minGasPrice () { return this._transport .execute('ethcore_minGasPrice') diff --git a/js/src/jsonrpc/interfaces/ethcore.js b/js/src/jsonrpc/interfaces/ethcore.js index 735b08ff9f6..7cea0473d83 100644 --- a/js/src/jsonrpc/interfaces/ethcore.js +++ b/js/src/jsonrpc/interfaces/ethcore.js @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -import { Address, Data, Quantity } from '../types'; +import { Address, Data, Hash, Quantity } from '../types'; export default { acceptNonReservedPeers: { @@ -104,6 +104,20 @@ export default { } }, + hashContent: { + desc: 'Creates a hash of the file as retrieved', + params: [ + { + type: String, + desc: 'The url of the content' + } + ], + returns: { + types: Hash, + desc: 'The hash of the content' + } + }, + minGasPrice: { desc: 'Returns currently set minimal gas price', params: [], From 87af4738c6fd83737495494f80a802669923571a Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 8 Oct 2016 10:19:16 +0200 Subject: [PATCH 0972/1062] lookup hash --- .../githubhint/Application/application.css | 27 ++++-- .../githubhint/Application/application.js | 87 ++++++++++++++----- js/src/dapps/githubhint/Button/button.css | 1 - 3 files changed, 84 insertions(+), 31 deletions(-) diff --git a/js/src/dapps/githubhint/Application/application.css b/js/src/dapps/githubhint/Application/application.css index 476ee0e5668..0a73597dd40 100644 --- a/js/src/dapps/githubhint/Application/application.css +++ b/js/src/dapps/githubhint/Application/application.css @@ -35,6 +35,7 @@ padding: 2em; background: rgba(255, 255, 255, 0.1); border-radius: 5px; + margin-bottom: 2em; } .buttons { @@ -56,13 +57,9 @@ .capture { } -.capture+.capture { - margin-top: 1em; -} - .capture * { display: inline-block; - padding: 0.5em 0.5em; + padding: 0.75em; vertical-align: middle; box-sizing: border-box; width: 20em; @@ -73,10 +70,28 @@ background: #eee; border: none; border-radius: 5px; - width: 20em; + width: 100%; font-size: 1em; } +.capture input.error { + background: #fcc; +} + .capture[disabled] { opacity: 0.15; } + +.hashError { + padding-top: 0.5em; + color: #f66; + text-align: center; + font-size: 0.75em; +} + +.hashOk { + padding-top: 0.5em; + opacity: 0.5; + text-align: center; + font-size: 0.75em; +} diff --git a/js/src/dapps/githubhint/Application/application.js b/js/src/dapps/githubhint/Application/application.js index 92232a83005..a28f60e62a0 100644 --- a/js/src/dapps/githubhint/Application/application.js +++ b/js/src/dapps/githubhint/Application/application.js @@ -16,29 +16,29 @@ import React, { Component } from 'react'; +import { api } from '../parity'; import { attachInterface } from '../services'; import Button from '../Button'; import Loading from '../Loading'; import styles from './application.css'; +const INVALID_URL_HASH = '0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470'; + export default class Application extends Component { state = { loading: true, - fileHash: false + url: '', + urlError: null, + contentHash: null, + contentHashError: null } componentDidMount () { attachInterface() - .then((accounts, address, accountsInfo, contract, instance, fromAddress) => { - this.setState({ - accounts, - address, - accountsInfo, - contract, - instance, - fromAddress, - loading: false + .then((state) => { + this.setState(state, () => { + this.setState({ loading: false }); }); }); } @@ -58,29 +58,30 @@ export default class Application extends Component { } renderPage () { - const { fileHash } = this.state; + const { url, urlError, contentHash, contentHashError } = this.state; return (
      -
      - - -
      - Provide a valid GitHub account, repo and { fileHash ? 'filename' : 'commit' } to register. The content information can be used in other contracts that allows for reverse lookups, e.g. image registries, dapp registries, etc. + Provide a valid URL to register. The content information can be used in other contracts that allows for reverse lookups, e.g. image registries, dapp registries, etc.
      -
      https://github.com/
      - +
      -
      -
      { fileHash ? '/' : 'commit #' }
      - +
      + { contentHashError || contentHash }
      - +
      @@ -89,10 +90,48 @@ export default class Application extends Component { } onClickContentHash = () => { - this.setState({ fileHash: false }); + this.setState({ fileHash: false, commit: '' }); } onClickFileHash = () => { - this.setState({ fileHash: true }); + this.setState({ fileHash: true, commit: 0 }); + } + + onChangeUrl = (event) => { + const url = event.target.value; + let urlError = null; + + if (url && url.length) { + var re = /^https?:\/\/(?:www\.|(?!www))[^\s\.]+\.[^\s]{2,}/g; + urlError = re.test(url) + ? null + : 'not matching rexex'; + } + + this.setState({ url, urlError, contentHashError: 'hash lookup in progress' }, () => { + this.lookupHash(); + }); + } + + onClickRegister = (event) => { + } + + lookupHash () { + const { url } = this.state; + + api.ethcore + .hashContent(url) + .then((contentHash) => { + console.log('lookupHash', contentHash); + if (contentHash === INVALID_URL_HASH) { + this.setState({ contentHashError: 'invalid url endpoint', contentHash }); + } else { + this.setState({ contentHashError: null, contentHash }); + } + }) + .catch((error) => { + console.error('lookupHash', error); + this.setState({ contentHashError: error.message, contentHash: null }); + }); } } diff --git a/js/src/dapps/githubhint/Button/button.css b/js/src/dapps/githubhint/Button/button.css index e4d16f9491c..28519094b2e 100644 --- a/js/src/dapps/githubhint/Button/button.css +++ b/js/src/dapps/githubhint/Button/button.css @@ -25,7 +25,6 @@ padding: 0.75em 1.5em; cursor: pointer; display: inline-block; - width: 7.5em; text-align: center; } From 58b1fb73a66c621ae994cb1dc792c4415f9dd87c Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 8 Oct 2016 11:03:29 +0200 Subject: [PATCH 0973/1062] registration in place --- .../githubhint/Application/application.css | 36 ++++- .../githubhint/Application/application.js | 148 ++++++++++++++++-- 2 files changed, 165 insertions(+), 19 deletions(-) diff --git a/js/src/dapps/githubhint/Application/application.css b/js/src/dapps/githubhint/Application/application.css index 0a73597dd40..aa4a68dc697 100644 --- a/js/src/dapps/githubhint/Application/application.css +++ b/js/src/dapps/githubhint/Application/application.css @@ -46,6 +46,13 @@ .box .buttons { text-align: right; margin: 2em 0 0 0; + position: relative; +} + +.box .buttons .addressSelect { + position: absolute; + top: 0; + left: 0; } .box .description { @@ -54,6 +61,24 @@ opacity: 0.75; } +.progress { + margin: 2em 0 0 0; + opacity: 0.75; + text-align: center; +} + +.statusHeader { + font-size: 1em; +} + +.statusState, .statusError { + padding: 1em 0 0 0; +} + +.statusError { + color: #f66; +} + .capture { } @@ -72,26 +97,25 @@ border-radius: 5px; width: 100%; font-size: 1em; + text-align: center; } -.capture input.error { - background: #fcc; +.capture input[disabled] { + opacity: 0.5; } -.capture[disabled] { - opacity: 0.15; +.capture input.error { + background: #fcc; } .hashError { padding-top: 0.5em; color: #f66; text-align: center; - font-size: 0.75em; } .hashOk { padding-top: 0.5em; opacity: 0.5; text-align: center; - font-size: 0.75em; } diff --git a/js/src/dapps/githubhint/Application/application.js b/js/src/dapps/githubhint/Application/application.js index a28f60e62a0..37b7a817654 100644 --- a/js/src/dapps/githubhint/Application/application.js +++ b/js/src/dapps/githubhint/Application/application.js @@ -19,19 +19,24 @@ import React, { Component } from 'react'; import { api } from '../parity'; import { attachInterface } from '../services'; import Button from '../Button'; +import IdentityIcon from '../IdentityIcon'; import Loading from '../Loading'; import styles from './application.css'; const INVALID_URL_HASH = '0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470'; +const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'; export default class Application extends Component { state = { loading: true, url: '', urlError: null, - contentHash: null, - contentHashError: null + contentHash: '', + contentHashError: null, + registerBusy: false, + registerError: null, + registerState: '' } componentDidMount () { @@ -58,7 +63,7 @@ export default class Application extends Component { } renderPage () { - const { url, urlError, contentHash, contentHashError } = this.state; + const { registerBusy, url, urlError, contentHash, contentHashError } = this.state; return (
      @@ -71,6 +76,7 @@ export default class Application extends Component { @@ -78,17 +84,60 @@ export default class Application extends Component {
      { contentHashError || contentHash }
      -
      - -
      + { registerBusy ? this.renderProgress() : this.renderButtons() }
      ); } + renderButtons () { + const { accounts, fromAddress, url, urlError, contentHashError } = this.state; + const account = accounts[fromAddress]; + + return ( +
      +
      + +
      + +
      + ); + } + + renderProgress () { + const { registerError, registerState } = this.state; + + if (registerError) { + return ( +
      +
      + Your registration has encountered an error +
      +
      + { registerError } +
      +
      + ); + } + + return ( +
      +
      + Your URL is being registered +
      +
      + { registerState } +
      +
      + ); + } + onClickContentHash = () => { this.setState({ fileHash: false, commit: '' }); } @@ -113,21 +162,94 @@ export default class Application extends Component { }); } - onClickRegister = (event) => { + onClickRegister = () => { + const { url, urlError, contentHash, contentHashError, fromAddress, instance } = this.state; + + if (!!contentHashError || !!urlError || url.length === 0) { + return; + } + + this.setState({ registerBusy: true, registerState: 'Estimating gas for the transaction' }); + + const values = [contentHash, url]; + const options = { from: fromAddress }; + + instance + .hintURL.estimateGas(options, values) + .then((gas) => { + this.setState({ registerState: 'Gas estimated, Posting transaction to the network' }); + + const gasPassed = gas.mul(1.2); + options.gas = gasPassed.toFixed(0); + console.log(`gas estimated at ${gas.toFormat(0)}, passing ${gasPassed.toFormat(0)}`); + + return instance.hintURL.postTransaction(options, values); + }) + .then((signerRequestId) => { + this.setState({ signerRequestId, registerState: 'Transaction posted, Waiting for transaction authorization' }); + + return api.pollMethod('eth_checkRequest', signerRequestId); + }) + .then((txHash) => { + this.setState({ txHash, registerState: 'Transaction authorized, Waiting for network confirmations' }); + + return api.pollMethod('eth_getTransactionReceipt', txHash, (receipt) => { + if (!receipt || !receipt.blockNumber || receipt.blockNumber.eq(0)) { + return false; + } + + return true; + }); + }) + .then((txReceipt) => { + this.setState({ txReceipt, registerBusy: false, registerState: 'Network confirmed, Received transaction receipt', url: '', contentHash: '' }); + }) + .catch((error) => { + console.error('onSend', error); + this.setState({ registerError: error.message }); + }); + } + + onSelectFromAddress = () => { + const { accounts, fromAddress } = this.state; + const addresses = Object.keys(accounts); + let index = 0; + + addresses.forEach((address, _index) => { + if (address === fromAddress) { + index = _index; + } + }); + + index++; + if (index >= addresses.length) { + index = 0; + } + + this.setState({ fromAddress: addresses[index] }); } lookupHash () { - const { url } = this.state; + const { url, instance } = this.state; api.ethcore .hashContent(url) .then((contentHash) => { console.log('lookupHash', contentHash); if (contentHash === INVALID_URL_HASH) { - this.setState({ contentHashError: 'invalid url endpoint', contentHash }); - } else { - this.setState({ contentHashError: null, contentHash }); + this.setState({ contentHashError: 'invalid url endpoint', contentHash: null }); + return; } + + instance.entries + .call({}, [contentHash]) + .then(([accountSlashRepo, commit, owner]) => { + if (owner !== ZERO_ADDRESS) { + this.setState({ contentHashError: contentHash, contentHash: null }); + } else { + this.setState({ contentHashError: null, contentHash }); + } + }); }) .catch((error) => { console.error('lookupHash', error); From c21f115963ae8f9419b869fe8e1bb09259283e43 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 8 Oct 2016 13:29:43 +0200 Subject: [PATCH 0974/1062] fixes --- js/src/dapps/registry/Application/application.js | 10 +++++++--- js/src/dapps/registry/Container.js | 1 + .../{records/reducer.js => Records/reducers.js} | 0 js/src/dapps/registry/actions.js | 9 +++++---- js/src/dapps/registry/records/records.css | 4 ---- js/src/dapps/registry/records/records.js | 6 +++--- js/src/dapps/registry/reducers.js | 11 +++++++---- 7 files changed, 23 insertions(+), 18 deletions(-) rename js/src/dapps/registry/{records/reducer.js => Records/reducers.js} (100%) diff --git a/js/src/dapps/registry/Application/application.js b/js/src/dapps/registry/Application/application.js index adf92a258d9..3d3d8d582d8 100644 --- a/js/src/dapps/registry/Application/application.js +++ b/js/src/dapps/registry/Application/application.js @@ -23,9 +23,10 @@ const muiTheme = getMuiTheme(lightBaseTheme); import CircularProgress from 'material-ui/CircularProgress'; import styles from './application.css'; import Accounts from '../Accounts'; +import Events from '../Events'; import Lookup from '../Lookup'; import Names from '../Names'; -import Events from '../Events'; +import Records from '../Records'; const nullable = (type) => React.PropTypes.oneOfType([ React.PropTypes.oneOf([ null ]), type ]); @@ -46,7 +47,8 @@ export default class Application extends Component { fee: nullable(PropTypes.object.isRequired), lookup: PropTypes.object.isRequired, events: PropTypes.object.isRequired, - names: PropTypes.object.isRequired + names: PropTypes.object.isRequired, + records: PropTypes.object.isRequired }; render () { @@ -56,7 +58,8 @@ export default class Application extends Component { contract, fee, lookup, events, - names + names, + records } = this.props; return ( @@ -69,6 +72,7 @@ export default class Application extends Component {
      +

      The Registry is provided by the contract at { contract.address }. diff --git a/js/src/dapps/registry/Container.js b/js/src/dapps/registry/Container.js index 9651488cd28..1464320e63c 100644 --- a/js/src/dapps/registry/Container.js +++ b/js/src/dapps/registry/Container.js @@ -60,6 +60,7 @@ export default connect( bound.lookup = bindActionCreators(actions.lookup, dispatch); bound.events = bindActionCreators(actions.events, dispatch); bound.names = bindActionCreators(actions.names, dispatch); + bound.records = bindActionCreators(actions.records, dispatch); return { actions: bound }; } )(Container); diff --git a/js/src/dapps/registry/records/reducer.js b/js/src/dapps/registry/Records/reducers.js similarity index 100% rename from js/src/dapps/registry/records/reducer.js rename to js/src/dapps/registry/Records/reducers.js diff --git a/js/src/dapps/registry/actions.js b/js/src/dapps/registry/actions.js index 90b261045bb..ae07771e850 100644 --- a/js/src/dapps/registry/actions.js +++ b/js/src/dapps/registry/actions.js @@ -18,12 +18,13 @@ import { registry as registryAbi } from '../../contracts/abi'; import { newContract, ethcore } from './parity.js'; import * as addresses from './addresses/actions.js'; -import * as accounts from './accounts/actions.js'; +import * as accounts from './Accounts/actions.js'; import * as lookup from './Lookup/actions.js'; -import * as events from './events/actions.js'; -import * as names from './names/actions.js'; +import * as events from './Events/actions.js'; +import * as names from './Names/actions.js'; +import * as records from './Records/actions.js'; -export { addresses, accounts, lookup, events, names }; +export { addresses, accounts, lookup, events, names, records }; export const setContract = (contract) => ({ type: 'set contract', contract }); diff --git a/js/src/dapps/registry/records/records.css b/js/src/dapps/registry/records/records.css index 061634c74ed..72b62595d0f 100644 --- a/js/src/dapps/registry/records/records.css +++ b/js/src/dapps/registry/records/records.css @@ -19,10 +19,6 @@ margin: 1em; } -.box { - margin: 0 1em; -} - .noSpacing { margin-top: 0; } diff --git a/js/src/dapps/registry/records/records.js b/js/src/dapps/registry/records/records.js index 58f79153064..355522e6054 100644 --- a/js/src/dapps/registry/records/records.js +++ b/js/src/dapps/registry/records/records.js @@ -1,5 +1,5 @@ import React, { Component, PropTypes } from 'react'; -import { Card, CardHeader } from 'material-ui/Card'; +import { Card, CardHeader, CardText } from 'material-ui/Card'; import TextField from 'material-ui/TextField'; import RaisedButton from 'material-ui/RaisedButton'; import SaveIcon from 'material-ui/svg-icons/content/save'; @@ -29,7 +29,7 @@ export default class Records extends Component { return ( -

      + { !hasAccount ? (

      Please select an account first.

      ) : (

      You can only modify entries of names that you previously registered.

      ) @@ -55,7 +55,7 @@ export default class Records extends Component { icon={ } onClick={ this.onSaveClick } /> -
      + ); } diff --git a/js/src/dapps/registry/reducers.js b/js/src/dapps/registry/reducers.js index 0183d53eecd..e0f620b7084 100644 --- a/js/src/dapps/registry/reducers.js +++ b/js/src/dapps/registry/reducers.js @@ -17,8 +17,9 @@ import accountsReducer from './addresses/accounts-reducer.js'; import contactsReducer from './addresses/contacts-reducer.js'; import lookupReducer from './Lookup/reducers.js'; -import eventsReducer from './events/reducers.js'; -import namesReducer from './names/reducers.js'; +import eventsReducer from './Events/reducers.js'; +import namesReducer from './Names/reducers.js'; +import recordsReducer from './Records/reducers.js'; const contractReducer = (state = null, action) => action.type === 'set contract' ? action.contract : state; @@ -37,7 +38,8 @@ const initialState = { owner: ownerReducer(undefined, { type: '' }), lookup: lookupReducer(undefined, { type: '' }), events: eventsReducer(undefined, { type: '' }), - names: namesReducer(undefined, { type: '' }) + names: namesReducer(undefined, { type: '' }), + records: recordsReducer(undefined, { type: '' }) }; export default (state = initialState, action) => ({ @@ -48,5 +50,6 @@ export default (state = initialState, action) => ({ owner: ownerReducer(state.owner, action), lookup: lookupReducer(state.lookup, action), events: eventsReducer(state.events, action), - names: namesReducer(state.names, action) + names: namesReducer(state.names, action), + records: recordsReducer(state.records, action) }); From 23d469b5c42e0deb6d3f17d9079782e8c2a08f84 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 8 Oct 2016 13:39:39 +0200 Subject: [PATCH 0975/1062] events is using a proper table --- js/src/dapps/registry/events/events.css | 14 +++++--- js/src/dapps/registry/events/events.js | 43 ++++++++++++++----------- 2 files changed, 34 insertions(+), 23 deletions(-) diff --git a/js/src/dapps/registry/events/events.css b/js/src/dapps/registry/events/events.css index 2e3ec53bab4..66277dae3d5 100644 --- a/js/src/dapps/registry/events/events.css +++ b/js/src/dapps/registry/events/events.css @@ -24,11 +24,6 @@ } .reserved, .dropped, .dataChanged { - margin: .5em 0; - display: flex; - justify-content: space-between; - flex-wrap: wrap; - align-items: center; } .reserved abbr, .dropped abbr { @@ -45,3 +40,12 @@ line-height: 32px; word-wrap: break-word; } + +.eventsList { + width: 100%; + boder: none; +} + +.eventsList td { + padding: 0.25em 0.5em; +} diff --git a/js/src/dapps/registry/events/events.js b/js/src/dapps/registry/events/events.js index 28d32f59a71..372f78f962a 100644 --- a/js/src/dapps/registry/events/events.js +++ b/js/src/dapps/registry/events/events.js @@ -47,12 +47,12 @@ const renderEvent = (classNames, verb) => (e, accounts, contacts) => { ? classNames + ' ' + styles.pending : classNames; return ( -
      - { renderAddress(e.parameters.owner, accounts, contacts) } - { ' ' }{ verb } - { ' ' }{ renderHash(bytesToHex(e.parameters.name)) } - { ' ' }{ renderStatus(e.timestamp, e.state === 'pending') } -
      + + { renderAddress(e.parameters.owner, accounts, contacts) } + { verb } + { renderHash(bytesToHex(e.parameters.name)) } + { renderStatus(e.timestamp, e.state === 'pending') } + ); }; @@ -63,13 +63,14 @@ const renderDataChanged = (e, accounts, contacts) => { } return ( -
      - { renderAddress(e.parameters.owner, accounts, contacts) } - { ' ' }updated - key { new Buffer(e.parameters.plainKey).toString('utf8') } - of { renderHash(bytesToHex(e.parameters.name)) } - { ' ' }{ renderStatus(e.timestamp, e.state === 'pending') } -
      + + { renderAddress(e.parameters.owner, accounts, contacts) } + updated + + key { new Buffer(e.parameters.plainKey).toString('utf8') } of { renderHash(bytesToHex(e.parameters.name)) } + + { renderStatus(e.timestamp, e.state === 'pending') } + ); }; @@ -118,11 +119,17 @@ export default class Events extends Component { style={ inlineButton } /> - { - this.props.events - .filter((e) => eventTypes[e.type]) - .map((e) => eventTypes[e.type](e, accounts, contacts)) - } + + + + { + this.props.events + .filter((e) => eventTypes[e.type]) + .map((e) => eventTypes[e.type](e, accounts, contacts)) + } + +
      +
      ); } From 729e95f0a02aea79f6d71e34b1553ad83a1c3902 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 8 Oct 2016 13:50:53 +0200 Subject: [PATCH 0976/1062] pass value through as-is --- js/src/dapps/registry/records/actions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/dapps/registry/records/actions.js b/js/src/dapps/registry/records/actions.js index 2bf9224f91e..b93a85fcf5a 100644 --- a/js/src/dapps/registry/records/actions.js +++ b/js/src/dapps/registry/records/actions.js @@ -15,7 +15,7 @@ export const update = (name, key, value) => (dispatch, getState) => { name = name.toLowerCase(); const options = { from: account.address }; - const values = [ sha3(name), key, key.toLowerCase() === 'a' ? value : sha3(value) ]; + const values = [ sha3(name), key, value ]; dispatch(start(name, key, value)); fn.estimateGas(options, values) From 3eb8d09bd57f4a16b50909f9714fd249a15e8564 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 8 Oct 2016 17:13:14 +0200 Subject: [PATCH 0977/1062] stop wrongly using main app IdentityIcon --- .../registry/IdentityIcon/identityIcon.css | 23 ++++++++++++ .../registry/IdentityIcon/identityIcon.js | 36 +++++++++++++++++++ js/src/dapps/registry/IdentityIcon/index.js | 17 +++++++++ js/src/dapps/registry/accounts/accounts.js | 4 +-- js/src/dapps/registry/parity.js | 4 +-- js/src/dapps/registry/ui/address.js | 6 ++-- js/src/parity.js | 6 +--- 7 files changed, 84 insertions(+), 12 deletions(-) create mode 100644 js/src/dapps/registry/IdentityIcon/identityIcon.css create mode 100644 js/src/dapps/registry/IdentityIcon/identityIcon.js create mode 100644 js/src/dapps/registry/IdentityIcon/index.js diff --git a/js/src/dapps/registry/IdentityIcon/identityIcon.css b/js/src/dapps/registry/IdentityIcon/identityIcon.css new file mode 100644 index 00000000000..3fa1df99e4d --- /dev/null +++ b/js/src/dapps/registry/IdentityIcon/identityIcon.css @@ -0,0 +1,23 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.icon { + width: 24px; + height: 24px; + border-radius: 50%; + margin-right: 0.5em; +} diff --git a/js/src/dapps/registry/IdentityIcon/identityIcon.js b/js/src/dapps/registry/IdentityIcon/identityIcon.js new file mode 100644 index 00000000000..0bc86731d45 --- /dev/null +++ b/js/src/dapps/registry/IdentityIcon/identityIcon.js @@ -0,0 +1,36 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import { api } from '../parity'; +import styles from './identityIcon.css'; + +export default class IdentityIcon extends Component { + static propTypes = { + address: PropTypes.string.isRequired + } + + render () { + const { address } = this.props; + + return ( + + ); + } +} diff --git a/js/src/dapps/registry/IdentityIcon/index.js b/js/src/dapps/registry/IdentityIcon/index.js new file mode 100644 index 00000000000..76c107bfb75 --- /dev/null +++ b/js/src/dapps/registry/IdentityIcon/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './identityIcon'; diff --git a/js/src/dapps/registry/accounts/accounts.js b/js/src/dapps/registry/accounts/accounts.js index 9774136b7c0..c4f4d0ee8fc 100644 --- a/js/src/dapps/registry/accounts/accounts.js +++ b/js/src/dapps/registry/accounts/accounts.js @@ -19,7 +19,7 @@ import IconMenu from 'material-ui/IconMenu'; import IconButton from 'material-ui/IconButton/IconButton'; import AccountIcon from 'material-ui/svg-icons/action/account-circle'; import MenuItem from 'material-ui/MenuItem'; -import IdentityIcon from '../../../ui/IdentityIcon'; +import IdentityIcon from '../IdentityIcon'; import styles from './accounts.css'; @@ -30,7 +30,7 @@ const renderAccount = (active) => (account) => { key={ account.address } value={ account.address } checked={ selected } insetChildren={ !selected } > - + { account.name } ); diff --git a/js/src/dapps/registry/parity.js b/js/src/dapps/registry/parity.js index 77c8e9e7083..a7d9b12ff3f 100644 --- a/js/src/dapps/registry/parity.js +++ b/js/src/dapps/registry/parity.js @@ -14,14 +14,14 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -const { IdentityIcon } = window.parity.react; +const api = window.parity.api; const newContract = window.parity.api.newContract.bind(window.parity.api); const { personal, ethcore } = window.parity.api; const { bytesToHex, sha3, toWei, fromWei } = window.parity.api.util; const getBlockByNumber = window.parity.api.eth.getBlockByNumber.bind(window.parity.api.eth); export { - IdentityIcon, + api, personal, ethcore, newContract, bytesToHex, sha3, toWei, fromWei, getBlockByNumber diff --git a/js/src/dapps/registry/ui/address.js b/js/src/dapps/registry/ui/address.js index 327212eaee7..a62d20cc230 100644 --- a/js/src/dapps/registry/ui/address.js +++ b/js/src/dapps/registry/ui/address.js @@ -15,8 +15,8 @@ // along with Parity. If not, see . import React from 'react'; -import renderHash from './hash.js'; -import { IdentityIcon } from '../parity.js'; +import renderHash from './hash'; +import IdentityIcon from '../IdentityIcon'; const container = { display: 'inline-block' @@ -38,7 +38,7 @@ export default (address, accounts, contacts, shortenHash = true) => { } return (
      - + { caption }
      ); diff --git a/js/src/parity.js b/js/src/parity.js index 664757adeb0..1fe788b5a23 100644 --- a/js/src/parity.js +++ b/js/src/parity.js @@ -21,14 +21,10 @@ import es6Promise from 'es6-promise'; es6Promise.polyfill(); import Api from './api'; -import { IdentityIcon } from './ui'; const api = new Api(new Api.Transport.Http('/rpc/')); window.parity = { Api, - api, - react: { - IdentityIcon - } + api }; From 0925439e095e707dfa67aff8caa449fba60c7a13 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 8 Oct 2016 17:16:00 +0200 Subject: [PATCH 0978/1062] NEVER export class instance functions --- js/src/dapps/registry/actions.js | 6 +++--- js/src/dapps/registry/addresses/actions.js | 4 ++-- js/src/dapps/registry/events/actions.js | 4 ++-- js/src/dapps/registry/parity.js | 7 +------ 4 files changed, 8 insertions(+), 13 deletions(-) diff --git a/js/src/dapps/registry/actions.js b/js/src/dapps/registry/actions.js index ae07771e850..882af036036 100644 --- a/js/src/dapps/registry/actions.js +++ b/js/src/dapps/registry/actions.js @@ -16,7 +16,7 @@ import { registry as registryAbi } from '../../contracts/abi'; -import { newContract, ethcore } from './parity.js'; +import { api } from './parity.js'; import * as addresses from './addresses/actions.js'; import * as accounts from './Accounts/actions.js'; import * as lookup from './Lookup/actions.js'; @@ -29,9 +29,9 @@ export { addresses, accounts, lookup, events, names, records }; export const setContract = (contract) => ({ type: 'set contract', contract }); export const fetchContract = () => (dispatch) => - ethcore.registryAddress() + api.ethcore.registryAddress() .then((address) => { - const contract = newContract(registryAbi, address); + const contract = api.newContract(registryAbi, address); dispatch(setContract(contract)); dispatch(fetchFee()); dispatch(fetchOwner()); diff --git a/js/src/dapps/registry/addresses/actions.js b/js/src/dapps/registry/addresses/actions.js index 6a9ae826afe..ab274023b4e 100644 --- a/js/src/dapps/registry/addresses/actions.js +++ b/js/src/dapps/registry/addresses/actions.js @@ -14,12 +14,12 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -import { personal } from '../parity.js'; +import { api } from '../parity'; export const set = (addresses) => ({ type: 'addresses set', addresses }); export const fetch = () => (dispatch) => { - return Promise.all([ personal.listAccounts(), personal.accountsInfo() ]) + return Promise.all([ api.personal.listAccounts(), api.personal.accountsInfo() ]) .then(([ accounts, data ]) => { const addresses = Object.keys(data) .filter((address) => data[address] && !data[address].meta.deleted) diff --git a/js/src/dapps/registry/events/actions.js b/js/src/dapps/registry/events/actions.js index df33a531243..e12c98c4f67 100644 --- a/js/src/dapps/registry/events/actions.js +++ b/js/src/dapps/registry/events/actions.js @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -import { getBlockByNumber } from '../parity.js'; +import { api } from '../parity.js'; export const start = (name, from, to) => ({ type: 'events subscribe start', name, from, to }); export const fail = (name) => ({ type: 'events subscribe fail', name }); @@ -38,7 +38,7 @@ export const subscribe = (name, from = 0, to = 'pending') => } events.forEach((e) => { - getBlockByNumber(e.blockNumber) + api.eth.getBlockByNumber(e.blockNumber) .then((block) => { const data = { type: name, diff --git a/js/src/dapps/registry/parity.js b/js/src/dapps/registry/parity.js index a7d9b12ff3f..cf9819b60eb 100644 --- a/js/src/dapps/registry/parity.js +++ b/js/src/dapps/registry/parity.js @@ -15,14 +15,9 @@ // along with Parity. If not, see . const api = window.parity.api; -const newContract = window.parity.api.newContract.bind(window.parity.api); -const { personal, ethcore } = window.parity.api; const { bytesToHex, sha3, toWei, fromWei } = window.parity.api.util; -const getBlockByNumber = window.parity.api.eth.getBlockByNumber.bind(window.parity.api.eth); export { api, - personal, ethcore, newContract, - bytesToHex, sha3, toWei, fromWei, - getBlockByNumber + bytesToHex, sha3, toWei, fromWei }; From e7646660b3471c764e358febd40da31f0f148085 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 8 Oct 2016 17:44:24 +0200 Subject: [PATCH 0979/1062] alignment back to normal --- .../registry/IdentityIcon/identityIcon.js | 9 +++-- js/src/dapps/registry/accounts/accounts.css | 4 +-- js/src/dapps/registry/accounts/accounts.js | 35 ++++++++++--------- js/src/dapps/registry/addresses/actions.js | 31 ++++++++-------- js/src/dapps/registry/events/events.js | 6 ++-- js/src/dapps/registry/ui/address.js | 8 +++-- 6 files changed, 52 insertions(+), 41 deletions(-) diff --git a/js/src/dapps/registry/IdentityIcon/identityIcon.js b/js/src/dapps/registry/IdentityIcon/identityIcon.js index 0bc86731d45..e4baf27057d 100644 --- a/js/src/dapps/registry/IdentityIcon/identityIcon.js +++ b/js/src/dapps/registry/IdentityIcon/identityIcon.js @@ -21,15 +21,18 @@ import styles from './identityIcon.css'; export default class IdentityIcon extends Component { static propTypes = { - address: PropTypes.string.isRequired + address: PropTypes.string.isRequired, + className: PropTypes.string, + style: PropTypes.object } render () { - const { address } = this.props; + const { address, className, style } = this.props; return ( ); } diff --git a/js/src/dapps/registry/accounts/accounts.css b/js/src/dapps/registry/accounts/accounts.css index b9612358a4c..344a92867e2 100644 --- a/js/src/dapps/registry/accounts/accounts.css +++ b/js/src/dapps/registry/accounts/accounts.css @@ -33,6 +33,6 @@ } .menuText { display: inline-block; - line-height: 20px; - vertical-align: middle; + line-height: 24px; + vertical-align: top; } diff --git a/js/src/dapps/registry/accounts/accounts.js b/js/src/dapps/registry/accounts/accounts.js index c4f4d0ee8fc..fe262a84ffc 100644 --- a/js/src/dapps/registry/accounts/accounts.js +++ b/js/src/dapps/registry/accounts/accounts.js @@ -19,23 +19,12 @@ import IconMenu from 'material-ui/IconMenu'; import IconButton from 'material-ui/IconButton/IconButton'; import AccountIcon from 'material-ui/svg-icons/action/account-circle'; import MenuItem from 'material-ui/MenuItem'; + import IdentityIcon from '../IdentityIcon'; +import renderAddress from '../ui/address'; import styles from './accounts.css'; -const renderAccount = (active) => (account) => { - const selected = active && active.address === account.address; - return ( - - - { account.name } - - ); -}; - export default class Accounts extends Component { static propTypes = { @@ -50,23 +39,37 @@ export default class Accounts extends Component { const accountsButton = ( { selected - ? () + ? () : () } ); return ( - { Object.values(all).map(renderAccount(selected)) } + { Object.values(all).map(this.renderAccount) } ); } + renderAccount = (account) => { + const { all, selected } = this.props; + const isSelected = selected && selected.address === account.address; + + return ( + + { renderAddress(account.address, all, {}) } + + ); + }; + onAccountSelect = (e, address) => { this.props.actions.select(address); }; diff --git a/js/src/dapps/registry/addresses/actions.js b/js/src/dapps/registry/addresses/actions.js index ab274023b4e..b6091acb57f 100644 --- a/js/src/dapps/registry/addresses/actions.js +++ b/js/src/dapps/registry/addresses/actions.js @@ -19,18 +19,21 @@ import { api } from '../parity'; export const set = (addresses) => ({ type: 'addresses set', addresses }); export const fetch = () => (dispatch) => { - return Promise.all([ api.personal.listAccounts(), api.personal.accountsInfo() ]) - .then(([ accounts, data ]) => { - const addresses = Object.keys(data) - .filter((address) => data[address] && !data[address].meta.deleted) - .map((address) => ({ - ...data[address], address, - isAccount: accounts.includes(address) - })); - dispatch(set(addresses)); - }) - .catch((err) => { - console.error('could not fetch addresses'); - if (err) console.error(err.stack); - }); + return Promise + .all([ + api.personal.listAccounts(), + api.personal.accountsInfo() + ]) + .then(([ accounts, data ]) => { + const addresses = Object.keys(data) + .filter((address) => data[address] && !data[address].meta.deleted) + .map((address) => ({ + ...data[address], address, + isAccount: accounts.includes(address) + })); + dispatch(set(addresses)); + }) + .catch((error) => { + console.error('could not fetch addresses', error); + }); }; diff --git a/js/src/dapps/registry/events/events.js b/js/src/dapps/registry/events/events.js index 372f78f962a..ffb1fc9190a 100644 --- a/js/src/dapps/registry/events/events.js +++ b/js/src/dapps/registry/events/events.js @@ -19,9 +19,9 @@ import { Card, CardHeader, CardActions, CardText } from 'material-ui/Card'; import Toggle from 'material-ui/Toggle'; import moment from 'moment'; -import { bytesToHex } from '../parity.js'; -import renderHash from '../ui/hash.js'; -import renderAddress from '../ui/address.js'; +import { bytesToHex } from '../parity'; +import renderHash from '../ui/hash'; +import renderAddress from '../ui/address'; import styles from './events.css'; const inlineButton = { diff --git a/js/src/dapps/registry/ui/address.js b/js/src/dapps/registry/ui/address.js index a62d20cc230..e4a5a953e5d 100644 --- a/js/src/dapps/registry/ui/address.js +++ b/js/src/dapps/registry/ui/address.js @@ -19,12 +19,14 @@ import renderHash from './hash'; import IdentityIcon from '../IdentityIcon'; const container = { - display: 'inline-block' + display: 'inline-block', + verticalAlign: 'middle', + height: '24px' }; const align = { display: 'inline-block', verticalAlign: 'top', - lineHeight: '32px' + lineHeight: '24px' }; export default (address, accounts, contacts, shortenHash = true) => { @@ -38,7 +40,7 @@ export default (address, accounts, contacts, shortenHash = true) => { } return (
      - + { caption }
      ); From f3b45e04218ceb926b4a117ac0ec738e453f7a8b Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 8 Oct 2016 19:52:15 +0200 Subject: [PATCH 0980/1062] typo in definition --- js/src/jsonrpc/interfaces/ethcore.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/jsonrpc/interfaces/ethcore.js b/js/src/jsonrpc/interfaces/ethcore.js index 7cea0473d83..5b291061852 100644 --- a/js/src/jsonrpc/interfaces/ethcore.js +++ b/js/src/jsonrpc/interfaces/ethcore.js @@ -113,7 +113,7 @@ export default { } ], returns: { - types: Hash, + type: Hash, desc: 'The hash of the content' } }, From 981eaaad4dc5764361ff4cd682b631c3cd1b2f8b Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 9 Oct 2016 00:11:45 +0200 Subject: [PATCH 0981/1062] set & get images working (mostly) --- js/src/abi/util/pad.js | 13 ++++----- .../dapps/tokenreg/Tokens/Token/add-meta.js | 3 +- js/src/dapps/tokenreg/Tokens/Token/token.js | 15 +++++++--- js/src/dapps/tokenreg/Tokens/actions.js | 29 +++++-------------- js/src/dapps/tokenreg/Tokens/container.js | 16 ++++++---- js/src/dapps/tokenreg/Tokens/tokens.js | 14 ++++++--- js/src/dapps/tokenreg/constants.js | 4 +-- 7 files changed, 49 insertions(+), 45 deletions(-) diff --git a/js/src/abi/util/pad.js b/js/src/abi/util/pad.js index b14991ac2fb..dcd9c8e84ba 100644 --- a/js/src/abi/util/pad.js +++ b/js/src/abi/util/pad.js @@ -52,11 +52,11 @@ export function padFixedBytes (input) { let sinput; if (isArray(input)) { - sinput = input.map((code) => code.toString(16)).join(''); + sinput = input.map((code) => `0${code.toString(16)}`.slice(-2)).join(''); } else if (input.substr(0, 2) === '0x') { - sinput = `${input.substr(2)}`; + return padFixedBytes(`${input.substr(2)}`.match(/.{1,2}/g).map((value) => parseInt(value, 16))); } else { - sinput = `${input}`; + return padFixedBytes(input.split('').map((char) => char.charCodeAt(0))); } const max = Math.floor((sinput.length + 63) / 64) * 64; @@ -65,10 +65,9 @@ export function padFixedBytes (input) { } export function padString (input) { - const encoded = utf8.encode(input) + const array = utf8.encode(input) .split('') - .map((char) => char.charCodeAt(0).toString(16)) - .join(''); + .map((char) => char.charCodeAt(0)); - return padBytes(encoded); + return padBytes(array); } diff --git a/js/src/dapps/tokenreg/Tokens/Token/add-meta.js b/js/src/dapps/tokenreg/Tokens/Token/add-meta.js index bb4c5b49796..09e65954d25 100644 --- a/js/src/dapps/tokenreg/Tokens/Token/add-meta.js +++ b/js/src/dapps/tokenreg/Tokens/Token/add-meta.js @@ -19,6 +19,7 @@ import { Dialog, RaisedButton, FlatButton, SelectField, MenuItem } from 'materia import AddIcon from 'material-ui/svg-icons/content/add'; import InputText from '../../Inputs/Text'; +import { ADDRESS_TYPE } from '../../Inputs/validation'; import styles from './token.css'; @@ -133,7 +134,7 @@ export default class AddMeta extends Component { diff --git a/js/src/dapps/tokenreg/Tokens/Token/token.js b/js/src/dapps/tokenreg/Tokens/Token/token.js index 2669920edc7..b940a8360fb 100644 --- a/js/src/dapps/tokenreg/Tokens/Token/token.js +++ b/js/src/dapps/tokenreg/Tokens/Token/token.js @@ -55,8 +55,7 @@ export default class Token extends Component { metaMined: PropTypes.bool, isLoading: PropTypes.bool, isPending: PropTypes.bool, - isOwner: PropTypes.bool, - isTokenOwner: PropTypes.bool, + isTokenOwner: PropTypes.bool.isRequired, fullWidth: PropTypes.bool }; @@ -197,7 +196,9 @@ export default class Token extends Component { renderIsPending () { const { isPending } = this.props; - if (!isPending) return null; + if (!isPending) { + return null; + } return (
      @@ -205,6 +206,10 @@ export default class Token extends Component { } renderAddMeta () { + if (!this.props.isTokenOwner) { + return null; + } + return ( ({ @@ -164,17 +164,15 @@ export const queryTokenMeta = (index, query) => (dispatch, getState) => { const state = getState(); const contractInstance = state.status.contract.instance; - const key = sha3(query); - const startDate = Date.now(); dispatch(setTokenMetaLoading(index, true)); contractInstance .meta - .call({}, [ index, key ]) + .call({}, [ index, query ]) .then((value) => { const meta = { - key, query, + query, value: value.find(v => v !== 0) ? bytesToHex(value) : null }; @@ -195,35 +193,22 @@ export const addTokenMeta = (index, key, value) => (dispatch, getState) => { const state = getState(); const contractInstance = state.status.contract.instance; - const token = state.tokens.tokens.find(t => t.index === index); - const keyHash = sha3(key); - const options = { - from: token.owner - }; - - let values; - - if (key === 'IMG') { - const valueHash = sha3(value); - dispatch(addGithubhintURL(token.owner, valueHash, value)); - values = [ index, keyHash, valueHash ]; - } else { - values = [ index, keyHash, value ]; - } + const options = { from: token.owner }; + const values = [ index, key, value ]; contractInstance .setMeta .estimateGas(options, values) .then((gasEstimate) => { options.gas = gasEstimate.mul(1.2).toFixed(0); - console.log(`transfer: gas estimated as ${gasEstimate.toFixed(0)} setting to ${options.gas}`); + console.log(`addTokenMeta: gas estimated as ${gasEstimate.toFixed(0)} setting to ${options.gas}`); return contractInstance.setMeta.postTransaction(options, values); }) .catch((e) => { - console.error(`addTokenMeta #${index} error`, e); + console.error(`addTokenMeta: #${index} error`, e); }); }; diff --git a/js/src/dapps/tokenreg/Tokens/container.js b/js/src/dapps/tokenreg/Tokens/container.js index 5e9af4b4ae4..b6171c2cc1d 100644 --- a/js/src/dapps/tokenreg/Tokens/container.js +++ b/js/src/dapps/tokenreg/Tokens/container.js @@ -27,7 +27,8 @@ class TokensContainer extends Component { isLoading: PropTypes.bool, tokens: PropTypes.array, tokenCount: PropTypes.number, - onLoadTokens: PropTypes.func + onLoadTokens: PropTypes.func, + accounts: PropTypes.array }; componentDidMount () { @@ -35,17 +36,22 @@ class TokensContainer extends Component { } render () { - return (); + console.log(this.props); + return ( + + ); } } const mapStateToProps = (state) => { + const { list } = state.accounts; const { isLoading, tokens, tokenCount } = state.tokens; + const { isOwner } = state.status.contract; - return { isLoading, tokens, tokenCount, isOwner }; + return { isLoading, tokens, tokenCount, isOwner, accounts: list }; }; const mapDispatchToProps = (dispatch) => { diff --git a/js/src/dapps/tokenreg/Tokens/tokens.js b/js/src/dapps/tokenreg/Tokens/tokens.js index a45213d90c8..57c2a2a9138 100644 --- a/js/src/dapps/tokenreg/Tokens/tokens.js +++ b/js/src/dapps/tokenreg/Tokens/tokens.js @@ -28,12 +28,12 @@ export default class Tokens extends Component { handleMetaLookup: PropTypes.func.isRequired, isOwner: PropTypes.bool.isRequired, isLoading: PropTypes.bool.isRequired, - tokens: PropTypes.array + tokens: PropTypes.array, + accounts: PropTypes.array }; render () { const { isLoading, tokens } = this.props; - const loading = isLoading ? () : null; return ( @@ -45,8 +45,14 @@ export default class Tokens extends Component { } renderTokens (tokens) { + const { accounts } = this.props; + return tokens.map((token, index) => { - if (!token || !token.tla) return null; + if (!token || !token.tla) { + return null; + } + + const isTokenOwner = !!accounts.find((account) => account.address === token.owner); return ( + isTokenOwner={ isTokenOwner } /> ); }); } diff --git a/js/src/dapps/tokenreg/constants.js b/js/src/dapps/tokenreg/constants.js index 64a03e8a3c0..e9e7bebcab8 100644 --- a/js/src/dapps/tokenreg/constants.js +++ b/js/src/dapps/tokenreg/constants.js @@ -14,13 +14,13 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -import { URL_TYPE, ADDRESS_TYPE } from './Inputs/validation'; +import { HEX_TYPE, ADDRESS_TYPE } from './Inputs/validation'; export const metaDataKeys = [ { label: 'Image', value: 'IMG', - validation: URL_TYPE + validation: HEX_TYPE }, { label: 'Address', From 5181d2493c9d039c20e8b3171eba584effbb4daa Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 9 Oct 2016 09:47:05 +0200 Subject: [PATCH 0982/1062] show content retrieval info --- js/src/dapps/githubhint/Application/application.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/js/src/dapps/githubhint/Application/application.js b/js/src/dapps/githubhint/Application/application.js index 37b7a817654..ea7e760c588 100644 --- a/js/src/dapps/githubhint/Application/application.js +++ b/js/src/dapps/githubhint/Application/application.js @@ -244,6 +244,8 @@ export default class Application extends Component { instance.entries .call({}, [contentHash]) .then(([accountSlashRepo, commit, owner]) => { + console.log('lookupHash', accountSlashRepo, api.util.bytesToHex(commit), owner); + if (owner !== ZERO_ADDRESS) { this.setState({ contentHashError: contentHash, contentHash: null }); } else { From ad49ca4aeb0b66c577d455ac63a48d3cb900c459 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 9 Oct 2016 15:47:16 +0200 Subject: [PATCH 0983/1062] set exitcode via || --- js/scripts/build.sh | 4 ++-- js/scripts/install-deps.sh | 4 ++-- js/scripts/test.sh | 5 +++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/js/scripts/build.sh b/js/scripts/build.sh index a2d0c300cad..f54787a454c 100755 --- a/js/scripts/build.sh +++ b/js/scripts/build.sh @@ -5,8 +5,8 @@ pushd `dirname $0` cd .. # run build (production) and store the exit code -NODE_ENV=production npm run build -EXICCODE=$? +EXITCODE=0 +NODE_ENV=production npm run build || EXITCODE=1 # back to root popd diff --git a/js/scripts/install-deps.sh b/js/scripts/install-deps.sh index 9a89382a193..17e190a6fac 100755 --- a/js/scripts/install-deps.sh +++ b/js/scripts/install-deps.sh @@ -5,8 +5,8 @@ pushd `dirname $0` cd .. # install deps and store the exit code -npm install -EXICCODE=$? +EXITCODE=0 +npm install || EXITCODE=1 # back to root popd diff --git a/js/scripts/test.sh b/js/scripts/test.sh index 4bc7661ebf4..03159606846 100755 --- a/js/scripts/test.sh +++ b/js/scripts/test.sh @@ -5,8 +5,9 @@ pushd `dirname $0` cd .. # run lint & tests and store the exit code -npm run lint && npm run test -EXICCODE=$? +EXITCODE=0 +npm run lint || EXITCODE=1 +npm run test || EXITCODE=1 # back to root popd From 3d79906a3b17e4af653583788bbf500e8b038ac8 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 9 Oct 2016 15:54:28 +0200 Subject: [PATCH 0984/1062] use javascript:latest images --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 590b1024541..05a438d04e6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -293,6 +293,7 @@ test-linux: - linux-stable js-build: stage: build + image: ethcore/javascript:latest only: - js - jg-gitlab-build @@ -309,6 +310,7 @@ js-build: - javascript js-test: stage: test + image: ethcore/javascript:latest before_script: - ./js/scripts/install-deps.sh script: From 8a7f53d81bac862078d24d0c778cc50928a427e5 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 9 Oct 2016 15:56:30 +0200 Subject: [PATCH 0985/1062] disable npm progress bar --- js/scripts/install-deps.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/scripts/install-deps.sh b/js/scripts/install-deps.sh index 17e190a6fac..67113f27ea9 100755 --- a/js/scripts/install-deps.sh +++ b/js/scripts/install-deps.sh @@ -6,7 +6,7 @@ cd .. # install deps and store the exit code EXITCODE=0 -npm install || EXITCODE=1 +npm install --progress=false || EXITCODE=1 # back to root popd From 39af38bafb0b49ecfe7902f8b84cddc356597d67 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 9 Oct 2016 15:58:54 +0200 Subject: [PATCH 0986/1062] rename phase I --- js/src/dapps/registry/{records => -Records}/actions.js | 0 js/src/dapps/registry/{records => -Records}/index.js | 0 js/src/dapps/registry/{records => -Records}/records.css | 0 js/src/dapps/registry/{records => -Records}/records.js | 0 js/src/dapps/registry/{Records => -Records}/reducers.js | 0 js/src/dapps/registry/{accounts => -accounts}/accounts.css | 0 js/src/dapps/registry/{accounts => -accounts}/accounts.js | 0 js/src/dapps/registry/{accounts => -accounts}/actions.js | 0 js/src/dapps/registry/{accounts => -accounts}/index.js | 0 js/src/dapps/registry/{events => -events}/actions.js | 0 js/src/dapps/registry/{events => -events}/events.css | 0 js/src/dapps/registry/{events => -events}/events.js | 0 js/src/dapps/registry/{events => -events}/index.js | 0 js/src/dapps/registry/{events => -events}/reducers.js | 0 js/src/dapps/registry/{names => -names}/actions.js | 0 js/src/dapps/registry/{names => -names}/index.js | 0 js/src/dapps/registry/{names => -names}/names.css | 0 js/src/dapps/registry/{names => -names}/names.js | 0 js/src/dapps/registry/{names => -names}/reducers.js | 0 19 files changed, 0 insertions(+), 0 deletions(-) rename js/src/dapps/registry/{records => -Records}/actions.js (100%) rename js/src/dapps/registry/{records => -Records}/index.js (100%) rename js/src/dapps/registry/{records => -Records}/records.css (100%) rename js/src/dapps/registry/{records => -Records}/records.js (100%) rename js/src/dapps/registry/{Records => -Records}/reducers.js (100%) rename js/src/dapps/registry/{accounts => -accounts}/accounts.css (100%) rename js/src/dapps/registry/{accounts => -accounts}/accounts.js (100%) rename js/src/dapps/registry/{accounts => -accounts}/actions.js (100%) rename js/src/dapps/registry/{accounts => -accounts}/index.js (100%) rename js/src/dapps/registry/{events => -events}/actions.js (100%) rename js/src/dapps/registry/{events => -events}/events.css (100%) rename js/src/dapps/registry/{events => -events}/events.js (100%) rename js/src/dapps/registry/{events => -events}/index.js (100%) rename js/src/dapps/registry/{events => -events}/reducers.js (100%) rename js/src/dapps/registry/{names => -names}/actions.js (100%) rename js/src/dapps/registry/{names => -names}/index.js (100%) rename js/src/dapps/registry/{names => -names}/names.css (100%) rename js/src/dapps/registry/{names => -names}/names.js (100%) rename js/src/dapps/registry/{names => -names}/reducers.js (100%) diff --git a/js/src/dapps/registry/records/actions.js b/js/src/dapps/registry/-Records/actions.js similarity index 100% rename from js/src/dapps/registry/records/actions.js rename to js/src/dapps/registry/-Records/actions.js diff --git a/js/src/dapps/registry/records/index.js b/js/src/dapps/registry/-Records/index.js similarity index 100% rename from js/src/dapps/registry/records/index.js rename to js/src/dapps/registry/-Records/index.js diff --git a/js/src/dapps/registry/records/records.css b/js/src/dapps/registry/-Records/records.css similarity index 100% rename from js/src/dapps/registry/records/records.css rename to js/src/dapps/registry/-Records/records.css diff --git a/js/src/dapps/registry/records/records.js b/js/src/dapps/registry/-Records/records.js similarity index 100% rename from js/src/dapps/registry/records/records.js rename to js/src/dapps/registry/-Records/records.js diff --git a/js/src/dapps/registry/Records/reducers.js b/js/src/dapps/registry/-Records/reducers.js similarity index 100% rename from js/src/dapps/registry/Records/reducers.js rename to js/src/dapps/registry/-Records/reducers.js diff --git a/js/src/dapps/registry/accounts/accounts.css b/js/src/dapps/registry/-accounts/accounts.css similarity index 100% rename from js/src/dapps/registry/accounts/accounts.css rename to js/src/dapps/registry/-accounts/accounts.css diff --git a/js/src/dapps/registry/accounts/accounts.js b/js/src/dapps/registry/-accounts/accounts.js similarity index 100% rename from js/src/dapps/registry/accounts/accounts.js rename to js/src/dapps/registry/-accounts/accounts.js diff --git a/js/src/dapps/registry/accounts/actions.js b/js/src/dapps/registry/-accounts/actions.js similarity index 100% rename from js/src/dapps/registry/accounts/actions.js rename to js/src/dapps/registry/-accounts/actions.js diff --git a/js/src/dapps/registry/accounts/index.js b/js/src/dapps/registry/-accounts/index.js similarity index 100% rename from js/src/dapps/registry/accounts/index.js rename to js/src/dapps/registry/-accounts/index.js diff --git a/js/src/dapps/registry/events/actions.js b/js/src/dapps/registry/-events/actions.js similarity index 100% rename from js/src/dapps/registry/events/actions.js rename to js/src/dapps/registry/-events/actions.js diff --git a/js/src/dapps/registry/events/events.css b/js/src/dapps/registry/-events/events.css similarity index 100% rename from js/src/dapps/registry/events/events.css rename to js/src/dapps/registry/-events/events.css diff --git a/js/src/dapps/registry/events/events.js b/js/src/dapps/registry/-events/events.js similarity index 100% rename from js/src/dapps/registry/events/events.js rename to js/src/dapps/registry/-events/events.js diff --git a/js/src/dapps/registry/events/index.js b/js/src/dapps/registry/-events/index.js similarity index 100% rename from js/src/dapps/registry/events/index.js rename to js/src/dapps/registry/-events/index.js diff --git a/js/src/dapps/registry/events/reducers.js b/js/src/dapps/registry/-events/reducers.js similarity index 100% rename from js/src/dapps/registry/events/reducers.js rename to js/src/dapps/registry/-events/reducers.js diff --git a/js/src/dapps/registry/names/actions.js b/js/src/dapps/registry/-names/actions.js similarity index 100% rename from js/src/dapps/registry/names/actions.js rename to js/src/dapps/registry/-names/actions.js diff --git a/js/src/dapps/registry/names/index.js b/js/src/dapps/registry/-names/index.js similarity index 100% rename from js/src/dapps/registry/names/index.js rename to js/src/dapps/registry/-names/index.js diff --git a/js/src/dapps/registry/names/names.css b/js/src/dapps/registry/-names/names.css similarity index 100% rename from js/src/dapps/registry/names/names.css rename to js/src/dapps/registry/-names/names.css diff --git a/js/src/dapps/registry/names/names.js b/js/src/dapps/registry/-names/names.js similarity index 100% rename from js/src/dapps/registry/names/names.js rename to js/src/dapps/registry/-names/names.js diff --git a/js/src/dapps/registry/names/reducers.js b/js/src/dapps/registry/-names/reducers.js similarity index 100% rename from js/src/dapps/registry/names/reducers.js rename to js/src/dapps/registry/-names/reducers.js From f0c2bc69b98b7108ea49e661701aad335daf2ed0 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 9 Oct 2016 15:59:40 +0200 Subject: [PATCH 0987/1062] rename phase II --- js/src/dapps/registry/{-accounts => Accounts}/accounts.css | 0 js/src/dapps/registry/{-accounts => Accounts}/accounts.js | 0 js/src/dapps/registry/{-accounts => Accounts}/actions.js | 0 js/src/dapps/registry/{-accounts => Accounts}/index.js | 0 js/src/dapps/registry/{-events => Events}/actions.js | 0 js/src/dapps/registry/{-events => Events}/events.css | 0 js/src/dapps/registry/{-events => Events}/events.js | 0 js/src/dapps/registry/{-events => Events}/index.js | 0 js/src/dapps/registry/{-events => Events}/reducers.js | 0 js/src/dapps/registry/{-names => Names}/actions.js | 0 js/src/dapps/registry/{-names => Names}/index.js | 0 js/src/dapps/registry/{-names => Names}/names.css | 0 js/src/dapps/registry/{-names => Names}/names.js | 0 js/src/dapps/registry/{-names => Names}/reducers.js | 0 js/src/dapps/registry/{-Records => Records}/actions.js | 0 js/src/dapps/registry/{-Records => Records}/index.js | 0 js/src/dapps/registry/{-Records => Records}/records.css | 0 js/src/dapps/registry/{-Records => Records}/records.js | 0 js/src/dapps/registry/{-Records => Records}/reducers.js | 0 19 files changed, 0 insertions(+), 0 deletions(-) rename js/src/dapps/registry/{-accounts => Accounts}/accounts.css (100%) rename js/src/dapps/registry/{-accounts => Accounts}/accounts.js (100%) rename js/src/dapps/registry/{-accounts => Accounts}/actions.js (100%) rename js/src/dapps/registry/{-accounts => Accounts}/index.js (100%) rename js/src/dapps/registry/{-events => Events}/actions.js (100%) rename js/src/dapps/registry/{-events => Events}/events.css (100%) rename js/src/dapps/registry/{-events => Events}/events.js (100%) rename js/src/dapps/registry/{-events => Events}/index.js (100%) rename js/src/dapps/registry/{-events => Events}/reducers.js (100%) rename js/src/dapps/registry/{-names => Names}/actions.js (100%) rename js/src/dapps/registry/{-names => Names}/index.js (100%) rename js/src/dapps/registry/{-names => Names}/names.css (100%) rename js/src/dapps/registry/{-names => Names}/names.js (100%) rename js/src/dapps/registry/{-names => Names}/reducers.js (100%) rename js/src/dapps/registry/{-Records => Records}/actions.js (100%) rename js/src/dapps/registry/{-Records => Records}/index.js (100%) rename js/src/dapps/registry/{-Records => Records}/records.css (100%) rename js/src/dapps/registry/{-Records => Records}/records.js (100%) rename js/src/dapps/registry/{-Records => Records}/reducers.js (100%) diff --git a/js/src/dapps/registry/-accounts/accounts.css b/js/src/dapps/registry/Accounts/accounts.css similarity index 100% rename from js/src/dapps/registry/-accounts/accounts.css rename to js/src/dapps/registry/Accounts/accounts.css diff --git a/js/src/dapps/registry/-accounts/accounts.js b/js/src/dapps/registry/Accounts/accounts.js similarity index 100% rename from js/src/dapps/registry/-accounts/accounts.js rename to js/src/dapps/registry/Accounts/accounts.js diff --git a/js/src/dapps/registry/-accounts/actions.js b/js/src/dapps/registry/Accounts/actions.js similarity index 100% rename from js/src/dapps/registry/-accounts/actions.js rename to js/src/dapps/registry/Accounts/actions.js diff --git a/js/src/dapps/registry/-accounts/index.js b/js/src/dapps/registry/Accounts/index.js similarity index 100% rename from js/src/dapps/registry/-accounts/index.js rename to js/src/dapps/registry/Accounts/index.js diff --git a/js/src/dapps/registry/-events/actions.js b/js/src/dapps/registry/Events/actions.js similarity index 100% rename from js/src/dapps/registry/-events/actions.js rename to js/src/dapps/registry/Events/actions.js diff --git a/js/src/dapps/registry/-events/events.css b/js/src/dapps/registry/Events/events.css similarity index 100% rename from js/src/dapps/registry/-events/events.css rename to js/src/dapps/registry/Events/events.css diff --git a/js/src/dapps/registry/-events/events.js b/js/src/dapps/registry/Events/events.js similarity index 100% rename from js/src/dapps/registry/-events/events.js rename to js/src/dapps/registry/Events/events.js diff --git a/js/src/dapps/registry/-events/index.js b/js/src/dapps/registry/Events/index.js similarity index 100% rename from js/src/dapps/registry/-events/index.js rename to js/src/dapps/registry/Events/index.js diff --git a/js/src/dapps/registry/-events/reducers.js b/js/src/dapps/registry/Events/reducers.js similarity index 100% rename from js/src/dapps/registry/-events/reducers.js rename to js/src/dapps/registry/Events/reducers.js diff --git a/js/src/dapps/registry/-names/actions.js b/js/src/dapps/registry/Names/actions.js similarity index 100% rename from js/src/dapps/registry/-names/actions.js rename to js/src/dapps/registry/Names/actions.js diff --git a/js/src/dapps/registry/-names/index.js b/js/src/dapps/registry/Names/index.js similarity index 100% rename from js/src/dapps/registry/-names/index.js rename to js/src/dapps/registry/Names/index.js diff --git a/js/src/dapps/registry/-names/names.css b/js/src/dapps/registry/Names/names.css similarity index 100% rename from js/src/dapps/registry/-names/names.css rename to js/src/dapps/registry/Names/names.css diff --git a/js/src/dapps/registry/-names/names.js b/js/src/dapps/registry/Names/names.js similarity index 100% rename from js/src/dapps/registry/-names/names.js rename to js/src/dapps/registry/Names/names.js diff --git a/js/src/dapps/registry/-names/reducers.js b/js/src/dapps/registry/Names/reducers.js similarity index 100% rename from js/src/dapps/registry/-names/reducers.js rename to js/src/dapps/registry/Names/reducers.js diff --git a/js/src/dapps/registry/-Records/actions.js b/js/src/dapps/registry/Records/actions.js similarity index 100% rename from js/src/dapps/registry/-Records/actions.js rename to js/src/dapps/registry/Records/actions.js diff --git a/js/src/dapps/registry/-Records/index.js b/js/src/dapps/registry/Records/index.js similarity index 100% rename from js/src/dapps/registry/-Records/index.js rename to js/src/dapps/registry/Records/index.js diff --git a/js/src/dapps/registry/-Records/records.css b/js/src/dapps/registry/Records/records.css similarity index 100% rename from js/src/dapps/registry/-Records/records.css rename to js/src/dapps/registry/Records/records.css diff --git a/js/src/dapps/registry/-Records/records.js b/js/src/dapps/registry/Records/records.js similarity index 100% rename from js/src/dapps/registry/-Records/records.js rename to js/src/dapps/registry/Records/records.js diff --git a/js/src/dapps/registry/-Records/reducers.js b/js/src/dapps/registry/Records/reducers.js similarity index 100% rename from js/src/dapps/registry/-Records/reducers.js rename to js/src/dapps/registry/Records/reducers.js From 62fb468d9f46335162e2433b92fa55cc84ee5cf5 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 9 Oct 2016 16:05:13 +0200 Subject: [PATCH 0988/1062] only send build output to GitHub on major branches --- .gitlab-ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 05a438d04e6..6916b3a3f41 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -296,7 +296,6 @@ js-build: image: ethcore/javascript:latest only: - js - - jg-gitlab-build - master - beta - tags From 7af352683ced612db593f3a3036b9986a1b166f7 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 9 Oct 2016 16:11:18 +0200 Subject: [PATCH 0989/1062] also run the build step as part of the test (until comprehensive) --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6916b3a3f41..c5a65e46c43 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -313,6 +313,7 @@ js-test: before_script: - ./js/scripts/install-deps.sh script: + - ./js/scripts/build.sh - ./js/scripts/test.sh tags: - javascript-test From 032e796717e0ba8b77fa00cec7087455a6fdb7cf Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 9 Oct 2016 16:20:33 +0200 Subject: [PATCH 0990/1062] ci-specific build (no webpack progress) --- .gitlab-ci.yml | 2 +- js/package.json | 3 +++ js/scripts/build.sh | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c5a65e46c43..023492722b8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -313,7 +313,7 @@ js-test: before_script: - ./js/scripts/install-deps.sh script: - - ./js/scripts/build.sh - ./js/scripts/test.sh + - ./js/scripts/build.sh tags: - javascript-test diff --git a/js/package.json b/js/package.json index 878c0622e91..cf8644737cb 100644 --- a/js/package.json +++ b/js/package.json @@ -26,6 +26,9 @@ "build": "npm run build:dll && npm run build:app", "build:app": "webpack --progress", "build:dll": "webpack --config webpack.vendor.js --progress", + "ci:build": "npm run ci:build:dll && npm run ci:build:app", + "ci:build:app": "NODE_ENV=production webpack", + "ci:build:dll": "NODE_ENV=production webpack --config webpack.vendor.js", "clean": "rm -rf ./build ./coverage", "coveralls": "npm run testCoverage && coveralls < coverage/lcov.info", "lint": "eslint --ignore-path .gitignore ./src/", diff --git a/js/scripts/build.sh b/js/scripts/build.sh index f54787a454c..07487ffd55f 100755 --- a/js/scripts/build.sh +++ b/js/scripts/build.sh @@ -6,7 +6,7 @@ cd .. # run build (production) and store the exit code EXITCODE=0 -NODE_ENV=production npm run build || EXITCODE=1 +npm run ci:build || EXITCODE=1 # back to root popd From 2a467cfda5740c4b226ce52fed7223540f6974a4 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 9 Oct 2016 18:41:43 +0200 Subject: [PATCH 0991/1062] allow for account creation via recovery phrase --- .../AccountDetails/accountDetails.css | 30 --- .../AccountDetails/accountDetails.js | 31 ++- .../CreationType/creationType.js | 3 + .../modals/CreateAccount/NewAccount/index.js | 6 + .../CreateAccount/NewAccount/newAccount.js | 5 + .../CreateAccount/RecoveryPhrase/index.js | 17 ++ .../RecoveryPhrase/recoveryPhrase.js | 181 ++++++++++++++++++ js/src/modals/CreateAccount/createAccount.js | 9 +- 8 files changed, 232 insertions(+), 50 deletions(-) delete mode 100644 js/src/modals/CreateAccount/AccountDetails/accountDetails.css create mode 100644 js/src/modals/CreateAccount/RecoveryPhrase/index.js create mode 100644 js/src/modals/CreateAccount/RecoveryPhrase/recoveryPhrase.js diff --git a/js/src/modals/CreateAccount/AccountDetails/accountDetails.css b/js/src/modals/CreateAccount/AccountDetails/accountDetails.css deleted file mode 100644 index bc005f09344..00000000000 --- a/js/src/modals/CreateAccount/AccountDetails/accountDetails.css +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright 2015, 2016 Ethcore (UK) Ltd. -/* This file is part of Parity. -/* -/* Parity is free software: you can redistribute it and/or modify -/* it under the terms of the GNU General Public License as published by -/* the Free Software Foundation, either version 3 of the License, or -/* (at your option) any later version. -/* -/* Parity is distributed in the hope that it will be useful, -/* but WITHOUT ANY WARRANTY; without even the implied warranty of -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -/* GNU General Public License for more details. -/* -/* You should have received a copy of the GNU General Public License -/* along with Parity. If not, see . -*/ -.icon { - margin: 1em -100% 0 0; -} - -.details { - float: left; - margin-bottom: 0.5em; - width: 100%; - padding-left: 72px; -} - -.details input { - width: 100%; -} diff --git a/js/src/modals/CreateAccount/AccountDetails/accountDetails.js b/js/src/modals/CreateAccount/AccountDetails/accountDetails.js index a6f45d8cd40..c6a6f81114a 100644 --- a/js/src/modals/CreateAccount/AccountDetails/accountDetails.js +++ b/js/src/modals/CreateAccount/AccountDetails/accountDetails.js @@ -16,9 +16,7 @@ import React, { Component, PropTypes } from 'react'; -import { Form, Input, IdentityIcon } from '../../../ui'; - -import styles from './accountDetails.css'; +import { Form, Input, InputAddress } from '../../../ui'; export default class AccountDetails extends Component { static propTypes = { @@ -32,22 +30,17 @@ export default class AccountDetails extends Component { return (
      - -
      - - - { this.renderPhrase() } -
      + + + { this.renderPhrase() } ); } diff --git a/js/src/modals/CreateAccount/CreationType/creationType.js b/js/src/modals/CreateAccount/CreationType/creationType.js index 45a9c933030..866b3323686 100644 --- a/js/src/modals/CreateAccount/CreationType/creationType.js +++ b/js/src/modals/CreateAccount/CreationType/creationType.js @@ -38,6 +38,9 @@ export default class CreationType extends Component { + diff --git a/js/src/modals/CreateAccount/NewAccount/index.js b/js/src/modals/CreateAccount/NewAccount/index.js index 9b442283a23..f030a32d962 100644 --- a/js/src/modals/CreateAccount/NewAccount/index.js +++ b/js/src/modals/CreateAccount/NewAccount/index.js @@ -14,4 +14,10 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . +import { ERRORS } from './newAccount'; + export default from './newAccount'; + +export { + ERRORS +}; diff --git a/js/src/modals/CreateAccount/NewAccount/newAccount.js b/js/src/modals/CreateAccount/NewAccount/newAccount.js index ae88414f956..282efb5ab7c 100644 --- a/js/src/modals/CreateAccount/NewAccount/newAccount.js +++ b/js/src/modals/CreateAccount/NewAccount/newAccount.js @@ -25,10 +25,15 @@ import styles from '../createAccount.css'; const ERRORS = { noName: 'you need to specify a valid name for the account', + noPhrase: 'you need to specify the recovery phrase', invalidPassword: 'you need to specify a password >= 8 characters', noMatchPassword: 'the supplied passwords does not match' }; +export { + ERRORS +}; + export default class CreateAccount extends Component { static contextTypes = { api: PropTypes.object.isRequired, diff --git a/js/src/modals/CreateAccount/RecoveryPhrase/index.js b/js/src/modals/CreateAccount/RecoveryPhrase/index.js new file mode 100644 index 00000000000..b88a8580e83 --- /dev/null +++ b/js/src/modals/CreateAccount/RecoveryPhrase/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './recoveryPhrase'; diff --git a/js/src/modals/CreateAccount/RecoveryPhrase/recoveryPhrase.js b/js/src/modals/CreateAccount/RecoveryPhrase/recoveryPhrase.js new file mode 100644 index 00000000000..451650c698f --- /dev/null +++ b/js/src/modals/CreateAccount/RecoveryPhrase/recoveryPhrase.js @@ -0,0 +1,181 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import { Form, Input } from '../../../ui'; + +import styles from '../createAccount.css'; + +import { ERRORS } from '../NewAccount'; + +export default class RecoveryPhrase extends Component { + static propTypes = { + onChange: PropTypes.func.isRequired + } + + state = { + recoveryPhrase: '', + recoveryPhraseError: ERRORS.noPhrase, + accountName: '', + accountNameError: ERRORS.noName, + passwordHint: '', + password1: '', + password1Error: ERRORS.invalidPassword, + password2: '', + password2Error: ERRORS.noMatchPassword, + isValidPass: false, + isValidName: false, + isValidPhrase: false + } + + componentWillMount () { + this.props.onChange(false, {}); + } + + render () { + const { accountName, accountNameError, passwordHint, password1, password1Error, password2, password2Error, recoveryPhrase } = this.state; + + return ( +
      + + + +
      +
      + +
      +
      + +
      +
      +
      + ); + } + + updateParent = () => { + const { isValidName, isValidPass, isValidPhrase, accountName, passwordHint, password1, recoveryPhrase } = this.state; + const isValid = isValidName && isValidPass && isValidPhrase; + + this.props.onChange(isValid, { + name: accountName, + passwordHint, + password: password1, + phrase: recoveryPhrase + }); + } + + onEditPasswordHint = (event, value) => { + this.setState({ + passwordHint: value + }); + } + + onEditPhrase = (event) => { + const value = event.target.value; + let error = null; + + if (!value || value.trim().length < 25) { + error = ERRORS.noPhrase; + } + + this.setState({ + recoveryPhrase: value, + recoveryPhraseError: error, + isValidPhrase: !error + }, this.updateParent); + } + + onEditAccountName = (event) => { + const value = event.target.value; + let error = null; + + if (!value || value.trim().length < 2) { + error = ERRORS.noName; + } + + this.setState({ + accountName: value, + accountNameError: error, + isValidName: !error + }, this.updateParent); + } + + onEditPassword1 = (event) => { + const value = event.target.value; + let error1 = null; + let error2 = null; + + if (!value || value.trim().length < 8) { + error1 = ERRORS.invalidPassword; + } + + if (value !== this.state.password2) { + error2 = ERRORS.noMatchPassword; + } + + this.setState({ + password1: value, + password1Error: error1, + password2Error: error2, + isValidPass: !error1 && !error2 + }, this.updateParent); + } + + onEditPassword2 = (event) => { + const value = event.target.value; + let error2 = null; + + if (value !== this.state.password1) { + error2 = ERRORS.noMatchPassword; + } + + this.setState({ + password2: value, + password2Error: error2, + isValidPass: !error2 + }, this.updateParent); + } +} diff --git a/js/src/modals/CreateAccount/createAccount.js b/js/src/modals/CreateAccount/createAccount.js index 62d54e3bf0e..e4b50257174 100644 --- a/js/src/modals/CreateAccount/createAccount.js +++ b/js/src/modals/CreateAccount/createAccount.js @@ -29,6 +29,7 @@ import CreationType from './CreationType'; import NewAccount from './NewAccount'; import NewGeth from './NewGeth'; import NewImport from './NewImport'; +import RecoveryPhrase from './RecoveryPhrase'; const TITLES = { type: 'creation type', @@ -104,6 +105,11 @@ export default class CreateAccount extends Component { accounts={ accounts } onChange={ this.onChangeGeth } /> ); + } else if (createType === 'fromPhrase') { + return ( + + ); } return ( @@ -194,10 +200,11 @@ export default class CreateAccount extends Component { canCreate: false }); - if (createType === 'fromNew') { + if (createType === 'fromNew' || createType === 'fromPhrase') { return api.personal .newAccountFromPhrase(this.state.phrase, this.state.password) .then((address) => { + this.setState({ address }); return api.personal .setAccountName(address, this.state.name) .then(() => api.personal.setAccountMeta(address, { passwordHint: this.state.passwordHint })); From d1bcfdd0ce7e31e4d6ac13259afbca361a72c80b Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 9 Oct 2016 21:47:46 +0200 Subject: [PATCH 0992/1062] display account uuid (where available), closes #2546 --- js/src/views/Account/Header/header.css | 12 +++++++++--- js/src/views/Account/Header/header.js | 7 ++++++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/js/src/views/Account/Header/header.css b/js/src/views/Account/Header/header.css index ede42ed3aac..35ce0a700db 100644 --- a/js/src/views/Account/Header/header.css +++ b/js/src/views/Account/Header/header.css @@ -28,10 +28,16 @@ } .addressline, -.infoline { +.infoline, +.uuidline { line-height: 1.618em; } -.infoline { - color: #aaa; +.infoline, +.uuidline { + opacity: 0.25; +} + +.uuidline { + display: inline-block; } diff --git a/js/src/views/Account/Header/header.js b/js/src/views/Account/Header/header.js index a8c4cd2fc42..9bb135ce7e6 100644 --- a/js/src/views/Account/Header/header.js +++ b/js/src/views/Account/Header/header.js @@ -47,13 +47,17 @@ export default class Header extends Component { render () { const { account, balance } = this.props; - const { address, meta } = account; + const { address, meta, uuid } = account; const { name } = this.state; if (!account) { return null; } + const uuidText = !uuid + ? null + :
      uuid: { uuid }
      ; + return ( { address }
      + { uuidText }
      { meta.description }
      From 50298814c96f61c342981383d78757b366038338 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 9 Oct 2016 22:16:26 +0200 Subject: [PATCH 0993/1062] connection dialog now shows up in dapps as well, closes #2538 --- js/src/views/Application/Container/container.js | 4 ---- js/src/views/Application/application.js | 12 ++++-------- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/js/src/views/Application/Container/container.js b/js/src/views/Application/Container/container.js index 46f4c03b983..a1b9124c7d1 100644 --- a/js/src/views/Application/Container/container.js +++ b/js/src/views/Application/Container/container.js @@ -18,15 +18,12 @@ import React, { Component, PropTypes } from 'react'; import { FirstRun } from '../../../modals'; import { Errors, ParityBackground, Tooltips } from '../../../ui'; -import Connection from '../../Connection'; import styles from '../application.css'; export default class Container extends Component { static propTypes = { children: PropTypes.node.isRequired, - isApiConnected: PropTypes.bool, - isPingConnected: PropTypes.bool, showFirstRun: PropTypes.bool, onCloseFirstRun: PropTypes.func }; @@ -39,7 +36,6 @@ export default class Container extends Component { - { children } diff --git a/js/src/views/Application/application.js b/js/src/views/Application/application.js index c0550327f5a..5b046e4016c 100644 --- a/js/src/views/Application/application.js +++ b/js/src/views/Application/application.js @@ -18,6 +18,7 @@ import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; +import Connection from '../Connection'; import ParityBar from '../ParityBar'; import Container from './Container'; @@ -40,8 +41,6 @@ class Application extends Component { static propTypes = { children: PropTypes.node, netChain: PropTypes.string, - isApiConnected: PropTypes.bool, - isPingConnected: PropTypes.bool, isTest: PropTypes.bool, pending: PropTypes.array } @@ -67,19 +66,18 @@ class Application extends Component { return (
      { isDapp ? this.renderDapp() : this.renderApp() } +
      ); } renderApp () { - const { children, pending, netChain, isApiConnected, isPingConnected, isTest } = this.props; + const { children, pending, netChain, isTest } = this.props; const { showFirstRun } = this.state; return ( Date: Mon, 10 Oct 2016 15:10:49 +0200 Subject: [PATCH 0994/1062] token images show up as expected --- js/src/redux/providers/balances.js | 6 ++++-- js/src/redux/providers/imagesActions.js | 4 ++-- js/src/redux/providers/imagesReducer.js | 2 +- js/src/ui/IdentityIcon/identityIcon.js | 6 +++--- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/js/src/redux/providers/balances.js b/js/src/redux/providers/balances.js index 01243dccbed..151cb014dd4 100644 --- a/js/src/redux/providers/balances.js +++ b/js/src/redux/providers/balances.js @@ -86,8 +86,10 @@ export default class Balances { const promisesImages = []; while (promisesTokens.length < numTokens.toNumber()) { - promisesTokens.push(tokenreg.instance.token.call({}, [promisesTokens.length])); - promisesImages.push(tokenreg.instance.meta.call({}, [promisesImages.length, 'IMG'])); + const index = promisesTokens.length; + + promisesTokens.push(tokenreg.instance.token.call({}, [index])); + promisesImages.push(tokenreg.instance.meta.call({}, [index, 'IMG'])); } return Promise.all([ diff --git a/js/src/redux/providers/imagesActions.js b/js/src/redux/providers/imagesActions.js index 1da6cf1a0d5..ce9221a3b97 100644 --- a/js/src/redux/providers/imagesActions.js +++ b/js/src/redux/providers/imagesActions.js @@ -14,10 +14,10 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -export function setAddressImage (address, hash) { +export function setAddressImage (address, hashArray) { return { type: 'setAddressImage', address, - hash + hashArray }; } diff --git a/js/src/redux/providers/imagesReducer.js b/js/src/redux/providers/imagesReducer.js index 4d4ac1f8f97..af4be49b5f5 100644 --- a/js/src/redux/providers/imagesReducer.js +++ b/js/src/redux/providers/imagesReducer.js @@ -29,7 +29,7 @@ export default handleActions({ const hash = hashArray ? bytesToHex(hashArray) : ZERO; return Object.assign({}, state, { - [address]: hash === ZERO ? null : hash + [address]: hash === ZERO ? null : `/api/content/${hash.substr(2)}` }); } }, initialState); diff --git a/js/src/ui/IdentityIcon/identityIcon.js b/js/src/ui/IdentityIcon/identityIcon.js index 7afb0361e97..928a340a737 100644 --- a/js/src/ui/IdentityIcon/identityIcon.js +++ b/js/src/ui/IdentityIcon/identityIcon.js @@ -59,10 +59,10 @@ class IdentityIcon extends Component { updateIcon (_address, images) { const { api } = this.context; const { button, inline, tiny } = this.props; - const imageHash = images[_address]; + const iconsrc = images[_address]; - if (imageHash) { - this.setState({ iconsrc: `/api/content/${imageHash}` }); + if (iconsrc) { + this.setState({ iconsrc }); return; } From 381be02a1c95bb93f949bf86953ef28136e3c26d Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 10 Oct 2016 16:05:34 +0200 Subject: [PATCH 0995/1062] IdentityName component added and deployed --- js/src/ui/IdentityName/identityName.js | 75 +++++++++++++++++++ js/src/ui/IdentityName/index.js | 17 +++++ js/src/ui/MethodDecoding/methodDecoding.js | 46 ++++++------ js/src/ui/index.js | 2 + js/src/views/Account/Header/header.js | 6 +- .../Transactions/Transaction/transaction.js | 21 +----- js/src/views/Accounts/Summary/summary.js | 4 +- js/src/views/Address/Delete/delete.js | 4 +- js/src/views/Contracts/Summary/summary.js | 7 +- 9 files changed, 130 insertions(+), 52 deletions(-) create mode 100644 js/src/ui/IdentityName/identityName.js create mode 100644 js/src/ui/IdentityName/index.js diff --git a/js/src/ui/IdentityName/identityName.js b/js/src/ui/IdentityName/identityName.js new file mode 100644 index 00000000000..5eac6398723 --- /dev/null +++ b/js/src/ui/IdentityName/identityName.js @@ -0,0 +1,75 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; + +class IdentityName extends Component { + static propTypes = { + address: PropTypes.string, + accounts: PropTypes.object, + contacts: PropTypes.object, + contracts: PropTypes.object, + tokens: PropTypes.object, + shorten: PropTypes.bool, + unknown: PropTypes.bool + } + + render () { + const { address, accounts, contacts, contracts, tokens, shorten, unknown } = this.props; + const account = (accounts || {})[address] || (contacts || {})[address] || (tokens || {})[address] || (contracts || {})[address]; + const addressFallback = shorten ? this.formatHash(address) : address; + const fallback = unknown ? 'UNNAMED' : addressFallback; + const isUuid = account && account.name === account.uuid; + const name = account && !isUuid + ? account.name.toUpperCase() + : fallback; + + return ( + { name } + ); + } + + formatHash (hash) { + if (!hash || hash.length <= 16) { + return hash; + } + + return `${hash.substr(2, 6)}...${hash.slice(-6)}`; + } +} + +function mapStateToProps (state) { + const { accounts, contacts, contracts } = state.personal; + const { tokens } = state.balances; + + return { + accounts, + contacts, + contracts, + tokens + }; +} + +function mapDispatchToProps (dispatch) { + return bindActionCreators({}, dispatch); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(IdentityName); diff --git a/js/src/ui/IdentityName/index.js b/js/src/ui/IdentityName/index.js new file mode 100644 index 00000000000..3774b0e5278 --- /dev/null +++ b/js/src/ui/IdentityName/index.js @@ -0,0 +1,17 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './identityName'; diff --git a/js/src/ui/MethodDecoding/methodDecoding.js b/js/src/ui/MethodDecoding/methodDecoding.js index 58aeb68f857..8875b2244d1 100644 --- a/js/src/ui/MethodDecoding/methodDecoding.js +++ b/js/src/ui/MethodDecoding/methodDecoding.js @@ -16,9 +16,12 @@ import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; import Contracts from '../../contracts'; import IdentityIcon from '../IdentityIcon'; +import IdentityName from '../IdentityName'; import { Input, InputAddress } from '../Form'; import styles from './methodDecoding.css'; @@ -28,16 +31,13 @@ const TOKEN_METHODS = { '0xa9059cbb': 'transfer(to,value)' }; -export default class Method extends Component { +class Method extends Component { static contextTypes = { api: PropTypes.object.isRequired } static propTypes = { address: PropTypes.string.isRequired, - accounts: PropTypes.object, - contacts: PropTypes.object, - contracts: PropTypes.object, tokens: PropTypes.object, transaction: PropTypes.object, historic: PropTypes.bool @@ -210,8 +210,6 @@ export default class Method extends Component { switch (input.type) { case 'address': const address = input.value; - const account = this.getAccount(address); - const name = account ? account.name.toUpperCase() : null; return ( } label={ input.type } /> ); @@ -270,27 +268,14 @@ export default class Method extends Component { } renderAddressName (address, withName = true) { - const { tokens } = this.props; - const account = this.getAccount(address); - const name = account ? account.name.toUpperCase() : null; - return ( - - { withName ? (name || address) : address } + + { withName ? : address } ); } - getAccount (address) { - const { accounts, contacts, contracts, tokens } = this.props; - - return (accounts || {})[address] || - (contacts || {})[address] || - (tokens || {})[address] || - (contracts || {})[address]; - } - lookup (transaction) { const { api } = this.context; const { address, tokens } = this.props; @@ -347,3 +332,20 @@ export default class Method extends Component { }); } } + +function mapStateToProps (state) { + const { tokens } = state.balances; + + return { + tokens + }; +} + +function mapDispatchToProps (dispatch) { + return bindActionCreators({}, dispatch); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(Method); diff --git a/js/src/ui/index.js b/js/src/ui/index.js index 47ac1150e74..3a324bcebcc 100644 --- a/js/src/ui/index.js +++ b/js/src/ui/index.js @@ -24,6 +24,7 @@ import ContextProvider from './ContextProvider'; import Errors from './Errors'; import Form, { AddressSelect, FormWrap, Input, InputAddress, InputAddressSelect, InputInline, Select } from './Form'; import IdentityIcon from './IdentityIcon'; +import IdentityName from './IdentityName'; import MethodDecoding from './MethodDecoding'; import Modal, { Busy as BusyStep, Completed as CompletedStep } from './Modal'; import muiTheme from './Theme'; @@ -52,6 +53,7 @@ export { InputInline, Select, IdentityIcon, + IdentityName, MethodDecoding, Modal, BusyStep, diff --git a/js/src/views/Account/Header/header.js b/js/src/views/Account/Header/header.js index 9bb135ce7e6..432d0ddc6d0 100644 --- a/js/src/views/Account/Header/header.js +++ b/js/src/views/Account/Header/header.js @@ -16,12 +16,10 @@ import React, { Component, PropTypes } from 'react'; -import { Balance, Container, ContainerTitle, IdentityIcon } from '../../../ui'; +import { Balance, Container, ContainerTitle, IdentityIcon, IdentityName } from '../../../ui'; import styles from './header.css'; -const DEFAULT_NAME = 'Unnamed'; - export default class Header extends Component { static contextTypes = { api: PropTypes.object @@ -63,7 +61,7 @@ export default class Header extends Component {
      - + } />
      { address }
      diff --git a/js/src/views/Account/Transactions/Transaction/transaction.js b/js/src/views/Account/Transactions/Transaction/transaction.js index 9fcd5744ebb..1982fca411f 100644 --- a/js/src/views/Account/Transactions/Transaction/transaction.js +++ b/js/src/views/Account/Transactions/Transaction/transaction.js @@ -18,7 +18,7 @@ import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; import moment from 'moment'; -import { IdentityIcon, MethodDecoding } from '../../../../ui'; +import { IdentityIcon, IdentityName, MethodDecoding } from '../../../../ui'; import styles from '../transactions.css'; @@ -30,10 +30,6 @@ export default class Transaction extends Component { static propTypes = { transaction: PropTypes.object.isRequired, address: PropTypes.string.isRequired, - accounts: PropTypes.object, - contacts: PropTypes.object, - contracts: PropTypes.object, - tokens: PropTypes.object, isTest: PropTypes.bool.isRequired } @@ -72,7 +68,7 @@ export default class Transaction extends Component { } renderMethod () { - const { address, accounts, contacts, contracts, tokens } = this.props; + const { address } = this.props; const { info } = this.state; if (!info) { @@ -83,10 +79,6 @@ export default class Transaction extends Component { ); } @@ -111,18 +103,12 @@ export default class Transaction extends Component { } renderAddress (prefix, address) { - const { accounts, contacts, contracts, tokens } = this.props; - - const account = (accounts || {})[address] || (contacts || {})[address] || (tokens || {})[address] || (contracts || {})[address]; - const name = account - ? account.name.toUpperCase() - : this.formatHash(address); const eslink = address ? (
      - { name } + ) : 'DEPLOY'; @@ -132,7 +118,6 @@ export default class Transaction extends Component {
      diff --git a/js/src/views/Accounts/Summary/summary.js b/js/src/views/Accounts/Summary/summary.js index 94935b13592..0bfb41a20d9 100644 --- a/js/src/views/Accounts/Summary/summary.js +++ b/js/src/views/Accounts/Summary/summary.js @@ -17,7 +17,7 @@ import React, { Component, PropTypes } from 'react'; import { Link } from 'react-router'; -import { Balance, Container, ContainerTitle, IdentityIcon } from '../../../ui'; +import { Balance, Container, ContainerTitle, IdentityIcon, IdentityName } from '../../../ui'; export default class Summary extends Component { static contextTypes = { @@ -49,7 +49,7 @@ export default class Summary extends Component { { account.name || 'Unnamed' } } + title={ { } } byline={ account.address } /> diff --git a/js/src/views/Address/Delete/delete.js b/js/src/views/Address/Delete/delete.js index f4e134c33ea..66e6edb95f4 100644 --- a/js/src/views/Address/Delete/delete.js +++ b/js/src/views/Address/Delete/delete.js @@ -18,7 +18,7 @@ import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; -import { ConfirmDialog, IdentityIcon } from '../../../ui'; +import { ConfirmDialog, IdentityIcon, IdentityName } from '../../../ui'; import { newError } from '../../../redux/actions'; import styles from '../address.css'; @@ -61,7 +61,7 @@ class Delete extends Component { address={ account.address } />
      - { account.name || 'Unnamed' } +
      { account.address } diff --git a/js/src/views/Contracts/Summary/summary.js b/js/src/views/Contracts/Summary/summary.js index 4d93ba2332d..4df795797a0 100644 --- a/js/src/views/Contracts/Summary/summary.js +++ b/js/src/views/Contracts/Summary/summary.js @@ -17,8 +17,7 @@ import React, { Component, PropTypes } from 'react'; import { Link } from 'react-router'; -import Container, { Title } from '../../../ui/Container'; -import IdentityIcon from '../../../ui/IdentityIcon'; +import { Container, ContainerTitle, IdentityIcon, IdentityName } from '../../../ui'; export default class Summary extends Component { static contextTypes = { @@ -43,8 +42,8 @@ export default class Summary extends Component { - { contract.name || 'Unnamed' }</Link> } + <ContainerTitle + title={ <Link to={ viewLink }>{ <IdentityName address={ contract.address } unknown /> }</Link> } byline={ contract.address } /> { this.props.children } </Container> From fa0458edfe7f5114d702a6c449dda70448822002 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 10 Oct 2016 16:28:47 +0200 Subject: [PATCH 0996/1062] fix padding tests --- js/src/abi/util/pad.js | 26 ++++++++++++++------------ js/src/abi/util/pad.spec.js | 10 +++++----- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/js/src/abi/util/pad.js b/js/src/abi/util/pad.js index dcd9c8e84ba..9f2a45b86b2 100644 --- a/js/src/abi/util/pad.js +++ b/js/src/abi/util/pad.js @@ -42,23 +42,25 @@ export function padU32 (input) { return `${ZERO_64}${bn.toString(16)}`.slice(-64); } -export function padBytes (input) { - const length = isArray(input) ? input.length : (`${input}`.length / 2); - - return `${padU32(length)}${padFixedBytes(input)}`; -} - -export function padFixedBytes (input) { - let sinput; - +function stringToBytes (input) { if (isArray(input)) { - sinput = input.map((code) => `0${code.toString(16)}`.slice(-2)).join(''); + return input; } else if (input.substr(0, 2) === '0x') { - return padFixedBytes(`${input.substr(2)}`.match(/.{1,2}/g).map((value) => parseInt(value, 16))); + return input.substr(2).match(/.{1,2}/g).map((value) => parseInt(value, 16)); } else { - return padFixedBytes(input.split('').map((char) => char.charCodeAt(0))); + return input.split('').map((char) => char.charCodeAt(0)); } +} + +export function padBytes (_input) { + const input = stringToBytes(_input); + + return `${padU32(input.length)}${padFixedBytes(input)}`; +} +export function padFixedBytes (_input) { + const input = stringToBytes(_input); + const sinput = input.map((code) => `0${code.toString(16)}`.slice(-2)).join(''); const max = Math.floor((sinput.length + 63) / 64) * 64; return `${sinput}${ZERO_64}`.substr(0, max); diff --git a/js/src/abi/util/pad.spec.js b/js/src/abi/util/pad.spec.js index 2ce9e65bf76..96c73368248 100644 --- a/js/src/abi/util/pad.spec.js +++ b/js/src/abi/util/pad.spec.js @@ -74,7 +74,7 @@ describe('abi/util/pad', () => { describe('padFixedBytes', () => { it('right pads length < 64 bytes to 64 bytes (string)', () => { - expect(padFixedBytes(SHORT15)).to.equal(LONG15); + expect(padFixedBytes(`0x${SHORT15}`)).to.equal(LONG15); }); it('right pads length < 64 bytes to 64 bytes (array)', () => { @@ -82,7 +82,7 @@ describe('abi/util/pad', () => { }); it('right pads length > 64 bytes (64 byte multiples)', () => { - expect(padFixedBytes(`${LONG15}${SHORT15}`)).to.equal(`${LONG15}${LONG15}`); + expect(padFixedBytes(`0x${LONG15}${SHORT15}`)).to.equal(`${LONG15}${LONG15}`); }); it('strips leading 0x when passed in', () => { @@ -92,7 +92,7 @@ describe('abi/util/pad', () => { describe('padBytes', () => { it('right pads length < 64, adding the length (string)', () => { - const result = padBytes(SHORT15); + const result = padBytes(`0x${SHORT15}`); expect(result.length).to.equal(128); expect(result).to.equal(`${padU32(8)}${LONG15}`); @@ -106,7 +106,7 @@ describe('abi/util/pad', () => { }); it('right pads length > 64, adding the length', () => { - const result = padBytes(`${LONG15}${SHORT15}`); + const result = padBytes(`0x${LONG15}${SHORT15}`); expect(result.length).to.equal(192); expect(result).to.equal(`${padU32(0x28)}${LONG15}${LONG15}`); @@ -118,7 +118,7 @@ describe('abi/util/pad', () => { const result = padString('gavofyork'); expect(result.length).to.equal(128); - expect(result).to.equal(padBytes('6761766f66796f726b')); + expect(result).to.equal(padBytes('0x6761766f66796f726b')); }); }); }); From 0526551b75c1afef35ecadf1799ab77ad19ac2a2 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 10 Oct 2016 16:37:46 +0200 Subject: [PATCH 0997/1062] adjust tests to map to stricter 0x-prefixed hex --- js/src/abi/encoder/encoder.spec.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/js/src/abi/encoder/encoder.spec.js b/js/src/abi/encoder/encoder.spec.js index 32d75e7ec91..008861602d1 100644 --- a/js/src/abi/encoder/encoder.spec.js +++ b/js/src/abi/encoder/encoder.spec.js @@ -192,9 +192,9 @@ describe('abi/encoder/Encoder', () => { }); describe('bytes', () => { - const bytes1 = '1234'; - const bytes2 = '10000000000000000000000000000000000000000000000000000000000002'; - const bytes3 = '1000000000000000000000000000000000000000000000000000000000000000'; + const bytes1 = '0x1234'; + const bytes2 = '0x10000000000000000000000000000000000000000000000000000000000002'; + const bytes3 = '0x1000000000000000000000000000000000000000000000000000000000000000'; it('encodes fixed bytes', () => { const token = new Token('fixedBytes', bytes1); @@ -215,15 +215,15 @@ describe('abi/encoder/Encoder', () => { }); it('encodes bytes (two blocks)', () => { - const input = `${bytes3}${bytes3}`; + const input = `${bytes3}${bytes3.slice(-64)}`; const token = new Token('bytes', input); expect(Encoder.encode([token])).to.equal(`${padU32(0x20)}${padU32(0x40)}${padFixedBytes(input)}`); }); it('encodes two consecutive bytes', () => { - const in1 = '10000000000000000000000000000000000000000000000000000000000002'; - const in2 = '0010000000000000000000000000000000000000000000000000000000000002'; + const in1 = '0x10000000000000000000000000000000000000000000000000000000000002'; + const in2 = '0x0010000000000000000000000000000000000000000000000000000000000002'; const tokens = [new Token('bytes', in1), new Token('bytes', in2)]; expect(Encoder.encode(tokens)).to.equal(`${padU32(0x40)}${padU32(0x80)}${padU32(0x1f)}${padFixedBytes(in1)}${padU32(0x20)}${padFixedBytes(in2)}`); @@ -233,7 +233,7 @@ describe('abi/encoder/Encoder', () => { describe('string', () => { it('encodes a string', () => { const string = 'gavofyork'; - const stringEnc = padFixedBytes('6761766f66796f726b'); + const stringEnc = padFixedBytes('0x6761766f66796f726b'); const token = new Token('string', string); expect(Encoder.encode([token])).to.equal(`${padU32(0x20)}${padU32(string.length.toString(16))}${stringEnc}`); @@ -272,16 +272,16 @@ describe('abi/encoder/Encoder', () => { describe('comprehensive test', () => { it('encodes a complex sequence', () => { - const bytes = '131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'; + const bytes = '0x131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'; const tokens = [new Token('int', 5), new Token('bytes', bytes), new Token('int', 3), new Token('bytes', bytes)]; - expect(Encoder.encode(tokens)).to.equal(`${padU32(5)}${padU32(0x80)}${padU32(3)}${padU32(0xe0)}${padU32(0x40)}${bytes}${padU32(0x40)}${bytes}`); + expect(Encoder.encode(tokens)).to.equal(`${padU32(5)}${padU32(0x80)}${padU32(3)}${padU32(0xe0)}${padU32(0x40)}${bytes.substr(2)}${padU32(0x40)}${bytes.substr(2)}`); }); it('encodes a complex sequence (nested)', () => { const array = [new Token('int', 5), new Token('int', 6), new Token('int', 7)]; const tokens = [new Token('int', 1), new Token('string', 'gavofyork'), new Token('int', 2), new Token('int', 3), new Token('int', 4), new Token('array', array)]; - const stringEnc = padFixedBytes('6761766f66796f726b'); + const stringEnc = padFixedBytes('0x6761766f66796f726b'); expect(Encoder.encode(tokens)).to.equal(`${padU32(1)}${padU32(0xc0)}${padU32(2)}${padU32(3)}${padU32(4)}${padU32(0x100)}${padU32(9)}${stringEnc}${padU32(3)}${padU32(5)}${padU32(6)}${padU32(7)}`); }); From 2aa8182c64d511dce4a3d67a282fd0316f3a2fb4 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 10 Oct 2016 21:18:53 +0200 Subject: [PATCH 0998/1062] render names via common component for the address -> name --- js/src/redux/providers/personalReducer.js | 2 + js/src/ui/Form/AddressSelect/addressSelect.js | 3 +- js/src/ui/Form/InputAddress/inputAddress.js | 32 +++++++++-- js/src/ui/IdentityName/identityName.js | 25 ++++---- js/src/ui/MethodDecoding/methodDecoding.js | 4 +- .../Signer/components/Account/Account.js | 57 ++----------------- 6 files changed, 53 insertions(+), 70 deletions(-) diff --git a/js/src/redux/providers/personalReducer.js b/js/src/redux/providers/personalReducer.js index a28584e2aa9..6d35610e9b3 100644 --- a/js/src/redux/providers/personalReducer.js +++ b/js/src/redux/providers/personalReducer.js @@ -17,6 +17,7 @@ import { handleActions } from 'redux-actions'; const initialState = { + accountsInfo: {}, accounts: {}, hasAccounts: false, contacts: {}, @@ -46,6 +47,7 @@ export default handleActions({ }); return Object.assign({}, state, { + accountsInfo, accounts, hasAccounts: Object.keys(accounts).length !== 0, contacts, diff --git a/js/src/ui/Form/AddressSelect/addressSelect.js b/js/src/ui/Form/AddressSelect/addressSelect.js index c7500846cbd..617d02481d2 100644 --- a/js/src/ui/Form/AddressSelect/addressSelect.js +++ b/js/src/ui/Form/AddressSelect/addressSelect.js @@ -18,6 +18,7 @@ import React, { Component, PropTypes } from 'react'; import { MenuItem } from 'material-ui'; import IdentityIcon from '../../IdentityIcon'; +import IdentityName from '../../IdentityName'; import Select from '../Select'; import styles from './addressSelect.css'; @@ -72,7 +73,7 @@ export default class AddressSelect extends Component { </div> <div className={ styles.details }> <div className={ styles.name }> - { entry.name || 'Unnamed' } + <IdentityName address={ entry.address } /> </div> </div> </div> diff --git a/js/src/ui/Form/InputAddress/inputAddress.js b/js/src/ui/Form/InputAddress/inputAddress.js index 5bc0f1a4d68..37025c1c8a9 100644 --- a/js/src/ui/Form/InputAddress/inputAddress.js +++ b/js/src/ui/Form/InputAddress/inputAddress.js @@ -15,13 +15,15 @@ // along with Parity. If not, see <http://www.gnu.org/licenses/>. import React, { Component, PropTypes } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; import Input from '../Input'; import IdentityIcon from '../../IdentityIcon'; import styles from './inputAddress.css'; -export default class InputAddress extends Component { +class InputAddress extends Component { static propTypes = { className: PropTypes.string, disabled: PropTypes.bool, @@ -29,15 +31,18 @@ export default class InputAddress extends Component { label: PropTypes.string, hint: PropTypes.string, value: PropTypes.string, - nameValue: PropTypes.string, + accountsInfo: PropTypes.object, tokens: PropTypes.object, + text: PropTypes.bool, onChange: PropTypes.func, onSubmit: PropTypes.func }; render () { - const { className, disabled, error, label, hint, value, nameValue, onChange, onSubmit } = this.props; + const { className, disabled, error, label, hint, value, text, onChange, onSubmit, accountsInfo, tokens } = this.props; const classes = `${styles.input} ${className}`; + const account = accountsInfo[value] || tokens[value]; + const hasAccount = account && !account.meta.deleted; return ( <div className={ styles.container }> @@ -47,7 +52,7 @@ export default class InputAddress extends Component { label={ label } hint={ hint } error={ error } - value={ nameValue || value } + value={ text && hasAccount ? account.name : value } onChange={ onChange } onSubmit={ onSubmit } /> { this.renderIcon() } @@ -71,3 +76,22 @@ export default class InputAddress extends Component { ); } } + +function mapStateToProps (state) { + const { accountsInfo } = state.personal; + const { tokens } = state.balances; + + return { + accountsInfo, + tokens + }; +} + +function mapDispatchToProps (dispatch) { + return bindActionCreators({}, dispatch); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(InputAddress); diff --git a/js/src/ui/IdentityName/identityName.js b/js/src/ui/IdentityName/identityName.js index 5eac6398723..ca56bcacff5 100644 --- a/js/src/ui/IdentityName/identityName.js +++ b/js/src/ui/IdentityName/identityName.js @@ -21,21 +21,26 @@ import { bindActionCreators } from 'redux'; class IdentityName extends Component { static propTypes = { address: PropTypes.string, - accounts: PropTypes.object, - contacts: PropTypes.object, - contracts: PropTypes.object, + accountsInfo: PropTypes.object, tokens: PropTypes.object, + empty: PropTypes.bool, shorten: PropTypes.bool, unknown: PropTypes.bool } render () { - const { address, accounts, contacts, contracts, tokens, shorten, unknown } = this.props; - const account = (accounts || {})[address] || (contacts || {})[address] || (tokens || {})[address] || (contracts || {})[address]; + const { address, accountsInfo, tokens, empty, shorten, unknown } = this.props; + const account = accountsInfo[address] || tokens[address]; + const hasAccount = account && (!account.meta || !account.meta.deleted); + + if (!hasAccount && empty) { + return null; + } + const addressFallback = shorten ? this.formatHash(address) : address; const fallback = unknown ? 'UNNAMED' : addressFallback; - const isUuid = account && account.name === account.uuid; - const name = account && !isUuid + const isUuid = hasAccount && account.name === account.uuid; + const name = hasAccount && !isUuid ? account.name.toUpperCase() : fallback; @@ -54,13 +59,11 @@ class IdentityName extends Component { } function mapStateToProps (state) { - const { accounts, contacts, contracts } = state.personal; + const { accountsInfo } = state.personal; const { tokens } = state.balances; return { - accounts, - contacts, - contracts, + accountsInfo, tokens }; } diff --git a/js/src/ui/MethodDecoding/methodDecoding.js b/js/src/ui/MethodDecoding/methodDecoding.js index 8875b2244d1..ec84d92ee30 100644 --- a/js/src/ui/MethodDecoding/methodDecoding.js +++ b/js/src/ui/MethodDecoding/methodDecoding.js @@ -209,15 +209,13 @@ class Method extends Component { return methodInputs.map((input, index) => { switch (input.type) { case 'address': - const address = input.value; - return ( <InputAddress disabled + text key={ index } className={ styles.input } value={ input.value } - nameValue={ <IdentityName address={ address } /> } label={ input.type } /> ); diff --git a/js/src/views/Signer/components/Account/Account.js b/js/src/views/Signer/components/Account/Account.js index 618292fd138..63a6013732c 100644 --- a/js/src/views/Signer/components/Account/Account.js +++ b/js/src/views/Signer/components/Account/Account.js @@ -15,20 +15,15 @@ // along with Parity. If not, see <http://www.gnu.org/licenses/>. import React, { Component, PropTypes } from 'react'; -import { connect } from 'react-redux'; -import { bindActionCreators } from 'redux'; -import styles from './Account.css'; - -import { IdentityIcon } from '../../../../ui'; +import { IdentityIcon, IdentityName } from '../../../../ui'; import AccountLink from './AccountLink'; -class Account extends Component { +import styles from './Account.css'; + +export default class Account extends Component { static propTypes = { className: PropTypes.string, - accounts: PropTypes.object, - contacts: PropTypes.object, - tokens: PropTypes.object, address: PropTypes.string.isRequired, chain: PropTypes.string.isRequired, balance: PropTypes.object // eth BigNumber, not required since it mght take time to fetch @@ -59,7 +54,7 @@ class Account extends Component { const { address, chain, className } = this.props; return ( - <div className={ `${styles.acc} ${className}` } title={ this.renderTitle() }> + <div className={ `${styles.acc} ${className}` }> <AccountLink address={ address } chain={ chain }> <IdentityIcon center @@ -71,17 +66,6 @@ class Account extends Component { ); } - renderTitle () { - const { address } = this.props; - const name = this._retrieveName(); - - if (name) { - return address + ' ' + name; - } - - return address; - } - renderBalance () { const { balanceDisplay } = this.state; return ( @@ -91,7 +75,7 @@ class Account extends Component { renderName () { const { address } = this.props; - const name = this._retrieveName(); + const name = <IdentityName address={ address } empty />; if (!name) { return ( @@ -111,15 +95,6 @@ class Account extends Component { ); } - _retrieveName () { - const { address, accounts, contacts, tokens } = this.props; - const account = (accounts || {})[address] || (contacts || {})[address] || (tokens || {})[address]; - - return account - ? account.name - : null; - } - tinyAddress () { const { address } = this.props; const len = address.length; @@ -132,23 +107,3 @@ class Account extends Component { return address.slice(2, 8) + '..' + address.slice(len - 7); } } - -function mapStateToProps (state) { - const { accounts, contacts } = state.personal; - const { tokens } = state.balances; - - return { - accounts, - contacts, - tokens - }; -} - -function mapDispatchToProps (dispatch) { - return bindActionCreators({}, dispatch); -} - -export default connect( - mapStateToProps, - mapDispatchToProps -)(Account); From 4efc8315f50917534ca5fa0178615e6425e06895 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 10 Oct 2016 22:31:09 +0200 Subject: [PATCH 0999/1062] split lint into seperate script (early exit) --- .gitlab-ci.yml | 1 + js/scripts/lint.sh | 15 +++++++++++++++ js/scripts/test.sh | 1 - js/src/views/Account/Header/header.js | 1 - 4 files changed, 16 insertions(+), 2 deletions(-) create mode 100755 js/scripts/lint.sh diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 023492722b8..3a123c8fc59 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -313,6 +313,7 @@ js-test: before_script: - ./js/scripts/install-deps.sh script: + - ./js/scripts/lint.sh - ./js/scripts/test.sh - ./js/scripts/build.sh tags: diff --git a/js/scripts/lint.sh b/js/scripts/lint.sh new file mode 100755 index 00000000000..147bb0a2d01 --- /dev/null +++ b/js/scripts/lint.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +# change into the js directory (one down from scripts) +pushd `dirname $0` +cd .. + +# run lint & tests and store the exit code +EXITCODE=0 +npm run lint || EXITCODE=1 + +# back to root +popd + +# exit with exit code +exit $EXITCODE diff --git a/js/scripts/test.sh b/js/scripts/test.sh index 03159606846..6827b243ca6 100755 --- a/js/scripts/test.sh +++ b/js/scripts/test.sh @@ -6,7 +6,6 @@ cd .. # run lint & tests and store the exit code EXITCODE=0 -npm run lint || EXITCODE=1 npm run test || EXITCODE=1 # back to root diff --git a/js/src/views/Account/Header/header.js b/js/src/views/Account/Header/header.js index 432d0ddc6d0..d23fd50812b 100644 --- a/js/src/views/Account/Header/header.js +++ b/js/src/views/Account/Header/header.js @@ -46,7 +46,6 @@ export default class Header extends Component { render () { const { account, balance } = this.props; const { address, meta, uuid } = account; - const { name } = this.state; if (!account) { return null; From 16393d26df67668d742b61e513f0d0578ee80aff Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 10 Oct 2016 22:40:03 +0200 Subject: [PATCH 1000/1062] test phases changed to lint, test & pack --- .gitlab-ci.yml | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3a123c8fc59..a37a188878f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -291,7 +291,7 @@ test-linux: - rust-test dependencies: - linux-stable -js-build: +js-release: stage: build image: ethcore/javascript:latest only: @@ -307,14 +307,30 @@ js-build: - ./js/scripts/release.sh tags: - javascript -js-test: +js-lint: stage: test image: ethcore/javascript:latest before_script: - ./js/scripts/install-deps.sh script: - ./js/scripts/lint.sh + tags: + - javascript-test +js-test: + stage: test + image: ethcore/javascript:latest + before_script: + - ./js/scripts/install-deps.sh + script: - ./js/scripts/test.sh + tags: + - javascript-test +js-pack: + stage: build + image: ethcore/javascript:latest + before_script: + - ./js/scripts/install-deps.sh + script: - ./js/scripts/build.sh tags: - javascript-test From ea921247619486203929770da01bafb277096af5 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Mon, 10 Oct 2016 22:41:18 +0200 Subject: [PATCH 1001/1062] pack part of test phase --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a37a188878f..7adc6a40d3d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -326,7 +326,7 @@ js-test: tags: - javascript-test js-pack: - stage: build + stage: test image: ethcore/javascript:latest before_script: - ./js/scripts/install-deps.sh From aa910f5120445be8f7eade7e1b51af36cfddb6f8 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 11 Oct 2016 11:17:27 +0200 Subject: [PATCH 1002/1062] remove files marked for deletion (cleanup) --- .../--remove-LoadingPage/LoadingPage.css | 20 --- .../--remove-LoadingPage/LoadingPage.js | 36 ----- .../containers/--remove-LoadingPage/index.js | 17 --- .../--remove-OfflinePage/OfflinePage.js | 67 -------- .../containers/--remove-OfflinePage/index.js | 17 --- .../UnAuthorizedPage.css | 31 ---- .../UnAuthorizedPage.js | 143 ------------------ .../--remove-UnAuthorizedPage/index.js | 17 --- js/src/views/Status/--remove-store/index.js | 17 --- js/src/views/Status/--remove-store/store.js | 40 ----- .../components/--remove-Footer/Footer.css | 48 ------ .../components/--remove-Footer/Footer.js | 63 -------- .../components/--remove-Footer/index.js | 17 --- .../components/--remove-Header/Header.css | 39 ----- .../components/--remove-Header/Header.js | 85 ----------- .../components/--remove-Header/index.js | 17 --- .../MuiThemeProvider.js | 51 ------- .../--remove-MuiThemeProvider/index.js | 17 --- .../components/--remove-Value/Value.css | 26 ---- .../Status/components/--remove-Value/Value.js | 45 ------ .../Status/components/--remove-Value/index.js | 17 --- .../--remove-AccountsPage/AccountsPage.js | 50 ------ .../containers/--remove-AccountsPage/index.js | 17 --- .../--remove-DebugPage/DebugPage.js | 50 ------ .../containers/--remove-DebugPage/index.js | 17 --- 25 files changed, 964 deletions(-) delete mode 100644 js/src/views/Signer/containers/--remove-LoadingPage/LoadingPage.css delete mode 100644 js/src/views/Signer/containers/--remove-LoadingPage/LoadingPage.js delete mode 100644 js/src/views/Signer/containers/--remove-LoadingPage/index.js delete mode 100644 js/src/views/Signer/containers/--remove-OfflinePage/OfflinePage.js delete mode 100644 js/src/views/Signer/containers/--remove-OfflinePage/index.js delete mode 100644 js/src/views/Signer/containers/--remove-UnAuthorizedPage/UnAuthorizedPage.css delete mode 100644 js/src/views/Signer/containers/--remove-UnAuthorizedPage/UnAuthorizedPage.js delete mode 100644 js/src/views/Signer/containers/--remove-UnAuthorizedPage/index.js delete mode 100644 js/src/views/Status/--remove-store/index.js delete mode 100644 js/src/views/Status/--remove-store/store.js delete mode 100644 js/src/views/Status/components/--remove-Footer/Footer.css delete mode 100644 js/src/views/Status/components/--remove-Footer/Footer.js delete mode 100644 js/src/views/Status/components/--remove-Footer/index.js delete mode 100644 js/src/views/Status/components/--remove-Header/Header.css delete mode 100644 js/src/views/Status/components/--remove-Header/Header.js delete mode 100644 js/src/views/Status/components/--remove-Header/index.js delete mode 100644 js/src/views/Status/components/--remove-MuiThemeProvider/MuiThemeProvider.js delete mode 100644 js/src/views/Status/components/--remove-MuiThemeProvider/index.js delete mode 100644 js/src/views/Status/components/--remove-Value/Value.css delete mode 100644 js/src/views/Status/components/--remove-Value/Value.js delete mode 100644 js/src/views/Status/components/--remove-Value/index.js delete mode 100644 js/src/views/Status/containers/--remove-AccountsPage/AccountsPage.js delete mode 100644 js/src/views/Status/containers/--remove-AccountsPage/index.js delete mode 100644 js/src/views/Status/containers/--remove-DebugPage/DebugPage.js delete mode 100644 js/src/views/Status/containers/--remove-DebugPage/index.js diff --git a/js/src/views/Signer/containers/--remove-LoadingPage/LoadingPage.css b/js/src/views/Signer/containers/--remove-LoadingPage/LoadingPage.css deleted file mode 100644 index 8b249275fb0..00000000000 --- a/js/src/views/Signer/containers/--remove-LoadingPage/LoadingPage.css +++ /dev/null @@ -1,20 +0,0 @@ -/* Copyright 2015, 2016 Ethcore (UK) Ltd. -/* This file is part of Parity. -/* -/* Parity is free software: you can redistribute it and/or modify -/* it under the terms of the GNU General Public License as published by -/* the Free Software Foundation, either version 3 of the License, or -/* (at your option) any later version. -/* -/* Parity is distributed in the hope that it will be useful, -/* but WITHOUT ANY WARRANTY; without even the implied warranty of -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -/* GNU General Public License for more details. -/* -/* You should have received a copy of the GNU General Public License -/* along with Parity. If not, see <http://www.gnu.org/licenses/>. -*/ -.main { - padding: 3em 0; - text-align: center; -} diff --git a/js/src/views/Signer/containers/--remove-LoadingPage/LoadingPage.js b/js/src/views/Signer/containers/--remove-LoadingPage/LoadingPage.js deleted file mode 100644 index 561c5f46f13..00000000000 --- a/js/src/views/Signer/containers/--remove-LoadingPage/LoadingPage.js +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -import React, { Component } from 'react'; -import { CircularProgress } from 'material-ui'; - -import { Container, ContainerTitle } from '../../../../ui'; - -import styles from './LoadingPage.css'; - -export default class LoadingPage extends Component { - render () { - return ( - <Container> - <ContainerTitle - title='Connecting to Parity' /> - <div className={ styles.main }> - <CircularProgress size={ 2 } /> - </div> - </Container> - ); - } -} diff --git a/js/src/views/Signer/containers/--remove-LoadingPage/index.js b/js/src/views/Signer/containers/--remove-LoadingPage/index.js deleted file mode 100644 index fde867f4c11..00000000000 --- a/js/src/views/Signer/containers/--remove-LoadingPage/index.js +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -export default from './LoadingPage'; diff --git a/js/src/views/Signer/containers/--remove-OfflinePage/OfflinePage.js b/js/src/views/Signer/containers/--remove-OfflinePage/OfflinePage.js deleted file mode 100644 index 22814aed062..00000000000 --- a/js/src/views/Signer/containers/--remove-OfflinePage/OfflinePage.js +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -import React, { Component, PropTypes } from 'react'; -import { bindActionCreators } from 'redux'; -import { connect } from 'react-redux'; - -import { Container, ContainerTitle } from '../../../../ui'; - -import { updateAppState } from '../../actions/signer'; -import { isExtension } from '../../utils/extension'; - -class OfflinePage extends Component { - static propTypes = { - parityUrl: PropTypes.string.isRequired - } - - render () { - return ( - <Container> - <ContainerTitle title='Offline' /> - <p>Could not connect to the node. Make sure Parity is running and Trusted Signer is enabled.</p> - { this.renderInstallLink() } - </Container> - ); - } - - renderInstallLink () { - if (!isExtension()) { - return; - } - - return ( - <p> - If you do not have Parity installed yet, get it <a href='https://github.com/ethcore/parity/releases' target='_blank'>here</a>. - </p> - ); - } -} - -function mapStateToProps (state) { - return { - parityUrl: state.signer.url - }; -} - -function mapDispatchToProps (dispatch) { - return bindActionCreators({ updateAppState }, dispatch); -} - -export default connect( - mapStateToProps, - mapDispatchToProps -)(OfflinePage); diff --git a/js/src/views/Signer/containers/--remove-OfflinePage/index.js b/js/src/views/Signer/containers/--remove-OfflinePage/index.js deleted file mode 100644 index b18d40367f9..00000000000 --- a/js/src/views/Signer/containers/--remove-OfflinePage/index.js +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -export default from './OfflinePage'; diff --git a/js/src/views/Signer/containers/--remove-UnAuthorizedPage/UnAuthorizedPage.css b/js/src/views/Signer/containers/--remove-UnAuthorizedPage/UnAuthorizedPage.css deleted file mode 100644 index 076542fc141..00000000000 --- a/js/src/views/Signer/containers/--remove-UnAuthorizedPage/UnAuthorizedPage.css +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright 2015, 2016 Ethcore (UK) Ltd. -/* This file is part of Parity. -/* -/* Parity is free software: you can redistribute it and/or modify -/* it under the terms of the GNU General Public License as published by -/* the Free Software Foundation, either version 3 of the License, or -/* (at your option) any later version. -/* -/* Parity is distributed in the hope that it will be useful, -/* but WITHOUT ANY WARRANTY; without even the implied warranty of -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -/* GNU General Public License for more details. -/* -/* You should have received a copy of the GNU General Public License -/* along with Parity. If not, see <http://www.gnu.org/licenses/>. -*/ - -.section { - padding: 1em 0; -} - -.toggleToken { - margin-top: 10px; - margin-bottom: 10px; -} - -.code { - background: rgba(80, 80, 80, 1); - padding: 4px; - border-radius: 3px; -} diff --git a/js/src/views/Signer/containers/--remove-UnAuthorizedPage/UnAuthorizedPage.js b/js/src/views/Signer/containers/--remove-UnAuthorizedPage/UnAuthorizedPage.js deleted file mode 100644 index 47c4c6ca886..00000000000 --- a/js/src/views/Signer/containers/--remove-UnAuthorizedPage/UnAuthorizedPage.js +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -import React, { Component, PropTypes } from 'react'; -import { bindActionCreators } from 'redux'; -import { connect } from 'react-redux'; -import { RaisedButton } from 'material-ui'; - -import { Container, ContainerTitle, Input } from '../../../../ui'; -import { updateToken } from '../../actions/signer'; - -import styles from './UnAuthorizedPage.css'; - -class UnAuthorizedPage extends Component { - static propTypes = { - signer: PropTypes.shape({ - token: PropTypes.string.isRequired - }).isRequired, - actions: PropTypes.shape({ - updateToken: PropTypes.func.isRequired - }).isRequired - } - - state = { - token: this.props.signer.token, - tokenInvalid: null, - processing: false - }; - - componentWillReceiveProps (nextProps) { - if (this.props.signer.token === nextProps.signer.token) { - return; - } - this.setState({ - token: nextProps.signer.token - }); - } - - componentWillUnmount () { - clearTimeout(this.tokenInvalidTimeout); - } - - render () { - const { processing, token } = this.state; - return ( - <Container> - <ContainerTitle title='Not Authorized' /> - <div className={ styles.section }> - Connections used by Trusted Signer are secured. You need to authorize this application. - </div> - <div className={ styles.section }> - Make sure Parity is running and generate an authorization token with <code className={ styles.code }>parity signer new-token</code> in your console, pasting the token below: - </div> - <div className={ styles.section }> - <Input - value={ token } - disabled={ processing } - onChange={ this.onTokenChange } - hint='token from Parity' - label='Authorization Token' /> - <br /> - <RaisedButton - primary - onClick={ this.onSubmit } - disabled={ processing || !token } - label='Authorize' - /> - { this.renderInvalidToken() } - { this.renderProcessing() } - </div> - </Container> - ); - } - - onTokenChange = evt => { - this.setState({ token: evt.target.value, tokenInvalid: false }); - } - - onSubmit = () => { - const token = this.state.token.replace(/[^a-zA-Z0-9]/g, ''); - this.setState({ - processing: true, - tokenInvalid: false - }); - this.props.actions.updateToken(token); - - // todo [adgo] - listen to event instead of timeout - this.tokenInvalidTimeout = setTimeout(this.onTokenInvalid, 4000); // if token is valid this component should unmount. after 4 sconds we assume it's invalid. - } - - renderProcessing () { - if (!this.state.processing) { - return null; - } - - return ( - <span> Processing ...</span> - ); - } - - renderInvalidToken () { - if (!this.state.tokenInvalid) { - return null; - } - - return <span> The token is invalid or your node is not running.</span>; - } - - onTokenInvalid = () => { - this.setState({ - processing: false, - tokenInvalid: true - }); - } -} - -function mapStateToProps (state) { - return state; -} - -function mapDispatchToProps (dispatch) { - return { - actions: bindActionCreators({ updateToken }, dispatch) - }; -} - -export default connect( - mapStateToProps, - mapDispatchToProps -)(UnAuthorizedPage); diff --git a/js/src/views/Signer/containers/--remove-UnAuthorizedPage/index.js b/js/src/views/Signer/containers/--remove-UnAuthorizedPage/index.js deleted file mode 100644 index 6f25ac436be..00000000000 --- a/js/src/views/Signer/containers/--remove-UnAuthorizedPage/index.js +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -export default from './UnAuthorizedPage'; diff --git a/js/src/views/Status/--remove-store/index.js b/js/src/views/Status/--remove-store/index.js deleted file mode 100644 index 6746f75eb64..00000000000 --- a/js/src/views/Status/--remove-store/index.js +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -export default from './store'; diff --git a/js/src/views/Status/--remove-store/store.js b/js/src/views/Status/--remove-store/store.js deleted file mode 100644 index c1e8dde183a..00000000000 --- a/js/src/views/Status/--remove-store/store.js +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -import { createStore, applyMiddleware } from 'redux'; - -import rootReducer from '../reducers'; - -export default function configure (middlewares) { - const create = window.devToolsExtension - ? window.devToolsExtension()(createStore) - : createStore; - - const createStoreWithMiddleware = applyMiddleware( - ...middlewares - )(create); - - const store = createStoreWithMiddleware(rootReducer); - - if (module.hot) { - module.hot.accept('../reducers', () => { - const nextReducer = require('../reducers'); - store.replaceReducer(nextReducer); - }); - } - - return store; -} diff --git a/js/src/views/Status/components/--remove-Footer/Footer.css b/js/src/views/Status/components/--remove-Footer/Footer.css deleted file mode 100644 index b538df8c46a..00000000000 --- a/js/src/views/Status/components/--remove-Footer/Footer.css +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright 2015, 2016 Ethcore (UK) Ltd. -/* This file is part of Parity. -/* -/* Parity is free software: you can redistribute it and/or modify -/* it under the terms of the GNU General Public License as published by -/* the Free Software Foundation, either version 3 of the License, or -/* (at your option) any later version. -/* -/* Parity is distributed in the hope that it will be useful, -/* but WITHOUT ANY WARRANTY; without even the implied warranty of -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -/* GNU General Public License for more details. -/* -/* You should have received a copy of the GNU General Public License -/* along with Parity. If not, see <http://www.gnu.org/licenses/>. -*/ -.footer { - position: fixed; - bottom: 0; - left: 0; - right: 0; - background: rgba(255, 255, 255, 0.85); - border-top: 1px solid #6691C2; - padding: 10px; - margin: 50px 0 0; - color: #6691C2; -} -.right { - float: right; -} - -.logButton { - float: right; - height: 15px !important; - width: 15px !important; - padding: 0 !important; - margin-top: 3px !important; - margin-left: 3px; -} - -.logIcon { - height: 100% !important; - width: 100% !important; -} - -.off { - opacity: .3; -} diff --git a/js/src/views/Status/components/--remove-Footer/Footer.js b/js/src/views/Status/components/--remove-Footer/Footer.js deleted file mode 100644 index 9057b0433b0..00000000000 --- a/js/src/views/Status/components/--remove-Footer/Footer.js +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -import React, { Component, PropTypes } from 'react'; -import IconButton from 'material-ui/IconButton'; -import IconEventNote from 'material-ui/svg-icons/notification/event-note'; - -import styles from './Footer.css'; - -export default class Footer extends Component { - - render () { - return ( - <footer { ...this._testInherit() }> - <div className={ styles.footer }> - <a href='http://ethcore.io'>ethcore.io</a> - { this.renderLogIcon() } - <span className={ styles.right }> - Powered by: { this.props.version } - </span> - </div> - </footer> - ); - } - - renderLogIcon () { - const { updateLogging, logging } = this.props; - const isOffClass = !logging ? styles.off : ''; - - const onClick = () => updateLogging(!logging); - - return ( - <IconButton - { ...this._testInherit('log-button') } - onClick={ onClick } - tooltip='Toggle logging' tooltipPosition='top-left' - className={ styles.logButton } - > - <IconEventNote className={ `${styles.logIcon} ${isOffClass}` } /> - </IconButton> - ); - } - - static propTypes = { - version: PropTypes.string.isRequired, - logging: PropTypes.bool.isRequired, - updateLogging: PropTypes.func.isRequired - } - -} diff --git a/js/src/views/Status/components/--remove-Footer/index.js b/js/src/views/Status/components/--remove-Footer/index.js deleted file mode 100644 index 8d04903be59..00000000000 --- a/js/src/views/Status/components/--remove-Footer/index.js +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -export default from './Footer'; diff --git a/js/src/views/Status/components/--remove-Header/Header.css b/js/src/views/Status/components/--remove-Header/Header.css deleted file mode 100644 index 5f3ddf37494..00000000000 --- a/js/src/views/Status/components/--remove-Header/Header.css +++ /dev/null @@ -1,39 +0,0 @@ -/* Copyright 2015, 2016 Ethcore (UK) Ltd. -/* This file is part of Parity. -/* -/* Parity is free software: you can redistribute it and/or modify -/* it under the terms of the GNU General Public License as published by -/* the Free Software Foundation, either version 3 of the License, or -/* (at your option) any later version. -/* -/* Parity is distributed in the hope that it will be useful, -/* but WITHOUT ANY WARRANTY; without even the implied warranty of -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -/* GNU General Public License for more details. -/* -/* You should have received a copy of the GNU General Public License -/* along with Parity. If not, see <http://www.gnu.org/licenses/>. -*/ -.title { - position: relative; - top: -8px; - left: -8px; -} -.title h1, .title h3 { - margin: 0; -} -.title h3 { - text-transform: none; - font-weight: 300; -} -.error { - color: #C20E25 !important; -} - -.warning { - color: #E88305 !important; -} - -.hidden { - display: none !important; -} diff --git a/js/src/views/Status/components/--remove-Header/Header.js b/js/src/views/Status/components/--remove-Header/Header.js deleted file mode 100644 index 0b1a2f61f73..00000000000 --- a/js/src/views/Status/components/--remove-Header/Header.js +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -import { Link } from 'react-router'; -import React, { Component, PropTypes } from 'react'; - -import styles from './Header.css'; - -export default class Header extends Component { - - renderErrors () { - const { disconnected } = this.props; - if (!disconnected) { - return; - } - - return ( - <nav> - <ul> - <li className={ disconnected ? {} : styles.hidden }> - <a className={ styles.error } disabled title='It seems that we cannot connect to your node. Make sure the node is online and RPC is enabled.'> - <i className='icon-power'></i> - <span>Node is Down</span> - </a> - </li> - </ul> - </nav> - ); - } - - render () { - return ( - <header className='dapp-header' { ...this._testInherit() }> - <hgroup className={ styles.title }> - <h1>Status Page</h1> - <h3>{ this.props.nodeName }</h3> - </hgroup> - { this.renderErrors() } - <div className='dapp-flex-item'></div> - <nav> - <ul> - <li> - <Link to={ '/status' } activeClassName='active' { ...this._test('home-link') }> - <i className='icon-globe'></i> - <span>Status</span> - </Link> - </li> - <li> - <Link to={ '/status/rpc' } activeClassName='active' { ...this._test('rpc-link') }> - <i className='icon-call-out'></i> - <span>Rpc Methods</span> - </Link> - </li> - <li> - <Link to={ '/status/debug' } activeClassName='active' { ...this._test('debug-link') }> - <i className='icon-bar-chart'></i> - <span>Debug</span> - </Link> - </li> - </ul> - </nav> - </header> - ); - } - - static propTypes = { - nodeName: PropTypes.string.isRequired, - noOfErrors: PropTypes.number.isRequired, - disconnected: PropTypes.bool - } - -} diff --git a/js/src/views/Status/components/--remove-Header/index.js b/js/src/views/Status/components/--remove-Header/index.js deleted file mode 100644 index 4fa6f48de6f..00000000000 --- a/js/src/views/Status/components/--remove-Header/index.js +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -export default from './Header'; diff --git a/js/src/views/Status/components/--remove-MuiThemeProvider/MuiThemeProvider.js b/js/src/views/Status/components/--remove-MuiThemeProvider/MuiThemeProvider.js deleted file mode 100644 index ea8f7ff04e9..00000000000 --- a/js/src/views/Status/components/--remove-MuiThemeProvider/MuiThemeProvider.js +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -import React, { Component, PropTypes } from 'react'; -import injectTapEventPlugin from 'react-tap-event-plugin'; -// Needed for onTouchTap, for material ui -// http://stackoverflow.com/a/34015469/988941 -injectTapEventPlugin(); - -import { deepOrange500 } from 'material-ui/styles/colors'; -import getMuiTheme from 'material-ui/styles/getMuiTheme'; -import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; - -const muiTheme = getMuiTheme({ - fontFamily: '"Source Sans Pro", "Helvetica Neue", arial, sans-serif', - palette: { - primary1Color: '#6691C2', - accent1Color: deepOrange500 - } -}); - -export default class WrappedMuiThemeProvider extends Component { - - render () { - return ( - <MuiThemeProvider muiTheme={ muiTheme }> - { this.props.children && React.cloneElement(this.props.children, { - ...this.props - }) } - </MuiThemeProvider> - ); - } - - static propTypes = { - children: PropTypes.object.isRequired - } - -} diff --git a/js/src/views/Status/components/--remove-MuiThemeProvider/index.js b/js/src/views/Status/components/--remove-MuiThemeProvider/index.js deleted file mode 100644 index e47f95f6102..00000000000 --- a/js/src/views/Status/components/--remove-MuiThemeProvider/index.js +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -export default from './MuiThemeProvider'; diff --git a/js/src/views/Status/components/--remove-Value/Value.css b/js/src/views/Status/components/--remove-Value/Value.css deleted file mode 100644 index 8f528631110..00000000000 --- a/js/src/views/Status/components/--remove-Value/Value.css +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright 2015, 2016 Ethcore (UK) Ltd. -/* This file is part of Parity. -/* -/* Parity is free software: you can redistribute it and/or modify -/* it under the terms of the GNU General Public License as published by -/* the Free Software Foundation, either version 3 of the License, or -/* (at your option) any later version. -/* -/* Parity is distributed in the hope that it will be useful, -/* but WITHOUT ANY WARRANTY; without even the implied warranty of -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -/* GNU General Public License for more details. -/* -/* You should have received a copy of the GNU General Public License -/* along with Parity. If not, see <http://www.gnu.org/licenses/>. -*/ -.value { - background: none; - margin-top: 0; - padding-left: 10px; - padding-right: 20px; - width: 100%; -} -.valueContainer { - position: relative; -} diff --git a/js/src/views/Status/components/--remove-Value/Value.js b/js/src/views/Status/components/--remove-Value/Value.js deleted file mode 100644 index 6927fd7685e..00000000000 --- a/js/src/views/Status/components/--remove-Value/Value.js +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -import React, { Component, PropTypes } from 'react'; - -import styles from './Value.css'; - -export default class Value extends Component { - - render () { - return ( - <div - className={ styles.inputContainer } - { ...this._testInherit() } - > - <input - className={ styles.value } - type='text' - value={ this.props.value } - readOnly - /> - { this.props.children } - </div> - ); - } - - static propTypes = { - value: PropTypes.any, - children: PropTypes.element - } - -} diff --git a/js/src/views/Status/components/--remove-Value/index.js b/js/src/views/Status/components/--remove-Value/index.js deleted file mode 100644 index b56d2bc7821..00000000000 --- a/js/src/views/Status/components/--remove-Value/index.js +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -export default from './Value'; diff --git a/js/src/views/Status/containers/--remove-AccountsPage/AccountsPage.js b/js/src/views/Status/containers/--remove-AccountsPage/AccountsPage.js deleted file mode 100644 index b4e3d34c8a5..00000000000 --- a/js/src/views/Status/containers/--remove-AccountsPage/AccountsPage.js +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -import React, { Component, PropTypes } from 'react'; -import { connect } from 'react-redux'; - -class AccountsPage extends Component { - - render () { - return ( - <div className='dapp-flex-content'> - <main className='dapp-content'> - <h1>Accounts</h1> - </main> - </div> - ); - } - - static propTypes = { - logger: PropTypes.object.isRequired, - actions: PropTypes.object.isRequired, - status: PropTypes.object.isRequired - } -} - -function mapStateToProps (state) { - return state; -} - -function mapDispatchToProps (dispatch) { - return {}; -} - -export default connect( - mapStateToProps, - mapDispatchToProps -)(AccountsPage); diff --git a/js/src/views/Status/containers/--remove-AccountsPage/index.js b/js/src/views/Status/containers/--remove-AccountsPage/index.js deleted file mode 100644 index 770a2d6abda..00000000000 --- a/js/src/views/Status/containers/--remove-AccountsPage/index.js +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -export default from './AccountsPage'; diff --git a/js/src/views/Status/containers/--remove-DebugPage/DebugPage.js b/js/src/views/Status/containers/--remove-DebugPage/DebugPage.js deleted file mode 100644 index 7a99893ff81..00000000000 --- a/js/src/views/Status/containers/--remove-DebugPage/DebugPage.js +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -import React, { Component, PropTypes } from 'react'; -import { bindActionCreators } from 'redux'; -import { connect } from 'react-redux'; -import { extend } from 'lodash'; - -import * as debugActions from '../../actions/debug'; -import { updateLogging } from '../../actions/logger'; -import Debug from '../../components/Debug'; - -class DebugPage extends Component { - static propTypes = { - actions: PropTypes.object.isRequired, - statusDebug: PropTypes.object.isRequired - } - - render () { - return <Debug { ...this.props } />; - } -} - -function mapStateToProps (state) { - return state; -} - -function mapDispatchToProps (dispatch) { - return { - actions: bindActionCreators(extend({}, debugActions, { updateLogging }), dispatch) - }; -} - -export default connect( - mapStateToProps, - mapDispatchToProps -)(DebugPage); diff --git a/js/src/views/Status/containers/--remove-DebugPage/index.js b/js/src/views/Status/containers/--remove-DebugPage/index.js deleted file mode 100644 index a205744ddd2..00000000000 --- a/js/src/views/Status/containers/--remove-DebugPage/index.js +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -export default from './DebugPage'; From b553d11f11ab7089fd652f9af123087cbebddcdf Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 11 Oct 2016 11:28:30 +0200 Subject: [PATCH 1003/1062] Signer cleanups, start moving in the direction of the rest --- js/src/index.js | 3 +- js/src/redux/reducers.js | 6 +- js/src/views/Signer/middleware/index.js | 8 +- js/src/views/Signer/middleware/logger.js | 34 -------- js/src/views/Signer/middleware/signer.js | 31 ------- js/src/views/Signer/middleware/ws.js | 6 +- js/src/views/Signer/providers/index.js | 1 - .../Signer/providers/signerDataProvider.js | 39 --------- .../views/Signer/providers/wsDataProvider.js | 9 +- js/src/views/Signer/reducers/index.js | 3 - js/src/views/Signer/reducers/signer.js | 85 ------------------- js/src/views/Signer/utils/Ws.js | 18 ++-- js/src/views/Signer/utils/logger.js | 45 ---------- 13 files changed, 17 insertions(+), 271 deletions(-) delete mode 100644 js/src/views/Signer/middleware/logger.js delete mode 100644 js/src/views/Signer/middleware/signer.js delete mode 100644 js/src/views/Signer/providers/signerDataProvider.js delete mode 100644 js/src/views/Signer/reducers/signer.js delete mode 100644 js/src/views/Signer/utils/logger.js diff --git a/js/src/index.js b/js/src/index.js index 66bcf8238ee..7ae4352f4e7 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -38,7 +38,7 @@ import { Accounts, Account, Addresses, Address, Application, Contract, Contracts // TODO: This is VERY messy, just dumped here to get the Signer going import { Web3Provider as SignerWeb3Provider, web3Extension as statusWeb3Extension } from './views/Signer/components'; import { WebSocketsProvider, Ws } from './views/Signer/utils'; -import { SignerDataProvider, WsDataProvider } from './views/Signer/providers'; +import { WsDataProvider } from './views/Signer/providers'; import './environment'; @@ -71,7 +71,6 @@ store.dispatch({ type: 'initAll', api }); // signer new WsDataProvider(store, ws); // eslint-disable-line no-new -new SignerDataProvider(store, ws); // eslint-disable-line no-new const routerHistory = useRouterHistory(createHashHistory)({}); diff --git a/js/src/redux/reducers.js b/js/src/redux/reducers.js index e98e17acc2b..977cab367dc 100644 --- a/js/src/redux/reducers.js +++ b/js/src/redux/reducers.js @@ -23,10 +23,7 @@ import { errorReducer } from '../ui/Errors'; import { settingsReducer } from '../views/Settings'; import { tooltipReducer } from '../ui/Tooltips'; -import { - signer as signerReducer, - requests as signerRequestsReducer -} from '../views/Signer/reducers'; +import { requests as signerRequestsReducer } from '../views/Signer/reducers'; export default function () { return combineReducers({ @@ -40,7 +37,6 @@ export default function () { nodeStatus: nodeStatusReducer, personal: personalReducer, - signer: signerReducer, signerRequests: signerRequestsReducer }); } diff --git a/js/src/views/Signer/middleware/index.js b/js/src/views/Signer/middleware/index.js index aac44f08c7a..b604cd863ee 100644 --- a/js/src/views/Signer/middleware/index.js +++ b/js/src/views/Signer/middleware/index.js @@ -14,19 +14,13 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see <http://www.gnu.org/licenses/>. -// Middleware classes (except logger) import Ws from './ws'; -import Signer from './signer'; -import logger from './logger'; export default function middlewares (ws, setToken) { // Middleware instances const wsMiddleware = new Ws(ws, setToken); - const signer = new Signer(); return [ - logger, - wsMiddleware.toMiddleware(), - signer.toMiddleware() + wsMiddleware.toMiddleware() ]; } diff --git a/js/src/views/Signer/middleware/logger.js b/js/src/views/Signer/middleware/logger.js deleted file mode 100644 index 2281bf1573b..00000000000 --- a/js/src/views/Signer/middleware/logger.js +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -import logger from '../utils/logger'; - -export default store => next => action => { - if (store.getState().signer.logging) { - const msg = [`[${now()}] action:`, `${action.type};`, 'payload: ', action.payload]; - // const logMethod = action.type.indexOf('error') > -1 ? 'error' : 'log'; - logger.log(...msg); // todo [adgo] - implement error logs - } - return next(action); -}; - -function now () { - const date = new Date(Date.now()); - const seconds = date.getSeconds(); - const minutes = date.getMinutes(); - const hour = date.getHours(); - return `${hour}::${minutes}::${seconds}`; -} diff --git a/js/src/views/Signer/middleware/signer.js b/js/src/views/Signer/middleware/signer.js deleted file mode 100644 index 9b3033831ca..00000000000 --- a/js/src/views/Signer/middleware/signer.js +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -export default class SignerMiddleware { - toMiddleware () { - return store => next => action => { - next(action); - - // redirect to proper url - if (action.type === 'update isConnected' || action.type === 'update isNodeRunning') { - this.redirect(store); - } - }; - } - - redirect (store) { - } -} diff --git a/js/src/views/Signer/middleware/ws.js b/js/src/views/Signer/middleware/ws.js index 0879d58b8b9..f717df8bb00 100644 --- a/js/src/views/Signer/middleware/ws.js +++ b/js/src/views/Signer/middleware/ws.js @@ -14,11 +14,9 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see <http://www.gnu.org/licenses/>. -import logger from '../utils/logger'; import * as actions from '../actions/requests'; export default class LocalstorageMiddleware { - constructor (ws, setToken) { this.setToken = setToken; this.ws = ws; @@ -57,7 +55,7 @@ export default class LocalstorageMiddleware { const method = store.getState().signerRequests.compatibilityMode ? 'personal_confirmTransaction' : 'personal_confirmRequest'; this.send(method, [ id, {}, password ], (err, txHash) => { - logger.log('[WS MIDDLEWARE] confirm request cb:', err, txHash); + console.log('[WS MIDDLEWARE] confirm request cb:', err, txHash); if (err || !txHash) { store.dispatch(actions.errorConfirmRequest({ id, err: err ? err.message : 'Unable to confirm.' })); return; @@ -75,7 +73,7 @@ export default class LocalstorageMiddleware { const method = store.getState().signerRequests.compatibilityMode ? 'personal_rejectTransaction' : 'personal_rejectRequest'; this.send(method, [ id ], (err, res) => { - logger.log('[WS MIDDLEWARE] reject request cb:', err, res); + console.log('[WS MIDDLEWARE] reject request cb:', err, res); if (err) { store.dispatch(actions.errorRejectRequest({ id, err: err.message })); return; diff --git a/js/src/views/Signer/providers/index.js b/js/src/views/Signer/providers/index.js index 4039c693345..d1dac565e64 100644 --- a/js/src/views/Signer/providers/index.js +++ b/js/src/views/Signer/providers/index.js @@ -14,5 +14,4 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see <http://www.gnu.org/licenses/>. -export SignerDataProvider from './signerDataProvider'; export WsDataProvider from './wsDataProvider'; diff --git a/js/src/views/Signer/providers/signerDataProvider.js b/js/src/views/Signer/providers/signerDataProvider.js deleted file mode 100644 index 7fb1a143293..00000000000 --- a/js/src/views/Signer/providers/signerDataProvider.js +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -import logger from '../utils/logger'; -import { updateIsConnected } from '../actions/signer'; - -export default class SignerDataProvider { - constructor (store, ws) { - this.store = store; - this.ws = ws; - - this.ws.onOpen.push(this.onWsOpen); - this.ws.onError.push(this.onWsError); - this.ws.onClose.push(this.onWsError); - } - - onWsOpen = () => { - logger.log('[Signer Provider] connected'); - this.store.dispatch(updateIsConnected(true)); - } - - onWsError = () => { - logger.log('[Signer Provider] error'); - this.store.dispatch(updateIsConnected(false)); - } -} diff --git a/js/src/views/Signer/providers/wsDataProvider.js b/js/src/views/Signer/providers/wsDataProvider.js index 195f67ca76a..b80c32a4e1a 100644 --- a/js/src/views/Signer/providers/wsDataProvider.js +++ b/js/src/views/Signer/providers/wsDataProvider.js @@ -15,7 +15,6 @@ // along with Parity. If not, see <http://www.gnu.org/licenses/>. import { isEqual } from 'lodash'; -import logger from '../utils/logger'; import { updatePendingRequests, updateCompatibilityMode } from '../actions/requests'; export default class WsDataProvider { @@ -52,7 +51,7 @@ export default class WsDataProvider { return; } - logger.warn('[WS Provider] error fetching pending requests', err); + console.warn('[WS Provider] error fetching pending requests', err); return; } @@ -61,7 +60,7 @@ export default class WsDataProvider { return; } - logger.log('[WS Provider] requests changed ', txsWs); + console.log('[WS Provider] requests changed ', txsWs); this.store.dispatch(updatePendingRequests(txsWs)); }); } @@ -75,7 +74,7 @@ export default class WsDataProvider { this.fetchPendingRequests(); return; } - logger.warn('[WS Provider] error fetching pending transactions', err); + console.warn('[WS Provider] error fetching pending transactions', err); return; } @@ -92,7 +91,7 @@ export default class WsDataProvider { return; } - logger.log('[WS Provider] transactions changed ', txsWs); + console.log('[WS Provider] transactions changed ', txsWs); this.store.dispatch(updatePendingRequests(txsWs)); }); } diff --git a/js/src/views/Signer/reducers/index.js b/js/src/views/Signer/reducers/index.js index 73028cd025b..b310332a978 100644 --- a/js/src/views/Signer/reducers/index.js +++ b/js/src/views/Signer/reducers/index.js @@ -16,16 +16,13 @@ import { combineReducers } from 'redux'; import { routerReducer as routing } from 'react-router-redux'; -import signer from './signer'; import requests from './requests'; export default combineReducers({ routing, - signer, requests }); export { - signer, requests }; diff --git a/js/src/views/Signer/reducers/signer.js b/js/src/views/Signer/reducers/signer.js deleted file mode 100644 index 172124cac70..00000000000 --- a/js/src/views/Signer/reducers/signer.js +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -import { handleActions } from 'redux-actions'; - -const isProd = process.env.NODE_ENV === 'production'; - -const initialState = { - isLoading: true, - isNodeRunning: true, - isConnected: false, - logging: false && !isProd, - token: '', - url: window.location.host, - proxyUrl: 'http://localhost:8080/proxy/proxy.pac' -}; - -export default handleActions({ - - 'update isConnected' (state, action) { - const isDisconnected = state.isConnected && !action.payload; - return { - ...state, - isLoading: false, - isConnected: action.payload, - // if we are disconnected assume automatically that node is down - isNodeRunning: !isDisconnected && state.isNodeRunning - }; - }, - - 'update isNodeRunning' (state, action) { - const isRunning = action.payload; - const goesOnline = isRunning && !state.isNodeRunning; - - return { - ...state, - isNodeRunning: isRunning, - // if node is down assume automatically that we are not connected - isLoading: goesOnline || (isRunning && state.isLoading), - isConnected: isRunning && state.isConnected - }; - }, - - 'update logging' (state, action) { - return { - ...state, - logging: action.payload - }; - }, - - 'update url' (state, action) { - return { - ...state, - url: action.payload - }; - }, - - 'update proxy' (state, action) { - return { - ...state, - proxyUrl: action.payload - }; - }, - - 'update token' (state, action) { - return { - ...state, - token: action.payload - }; - } - -}, initialState); diff --git a/js/src/views/Signer/utils/Ws.js b/js/src/views/Signer/utils/Ws.js index 8c4b3c2dd73..7874773cc93 100644 --- a/js/src/views/Signer/utils/Ws.js +++ b/js/src/views/Signer/utils/Ws.js @@ -15,10 +15,8 @@ // along with Parity. If not, see <http://www.gnu.org/licenses/>. import { keccak_256 } from 'js-sha3'; // eslint-disable-line camelcase -import logger from './logger'; export default class Ws { - constructor (path = window.location.host, reconnectDelay = 5000) { this._path = path; this._reconnectTimeout = reconnectDelay; @@ -39,7 +37,7 @@ export default class Ws { const hash = token ? this._hash(token) : null; this._ws = new global.WebSocket(`ws://${this._path}`, hash); } catch (err) { - logger.warn('[WS] error connecting to ws', err); // throws when port is blocked, not when hash is incorrect + console.warn('[WS] error connecting to ws', err); // throws when port is blocked, not when hash is incorrect } this._ws.addEventListener('open', this._onOpen); @@ -48,7 +46,7 @@ export default class Ws { send (payload, callback) { if (!this._isConnected) { - logger.log('[WS] not connected. incoming msg added to queue'); + console.log('[WS] not connected. incoming msg added to queue'); this._queue.push({ payload, callback }); return; } @@ -61,7 +59,7 @@ export default class Ws { } _onOpen = () => { - logger.log('[WS] connected'); + console.log('[WS] connected'); this._ws.addEventListener('close', this._onClose); this._ws.addEventListener('message', this._onMsg); this._isConnected = true; @@ -74,7 +72,7 @@ export default class Ws { try { msg = JSON.parse(msg.data); } catch (err) { - return logger.warn('[WS] unknown msg from server: ', msg, err); + return console.warn('[WS] unknown msg from server: ', msg, err); } const cb = this._callbacks[msg.id]; delete this._callbacks[msg.id]; @@ -87,7 +85,7 @@ export default class Ws { } _onClose = () => { - logger.warn('[WS] closed'); + console.warn('[WS] closed'); this._executeCbsWithError(); this._isConnected = false; this._triggerEvent(this.onClose); @@ -95,7 +93,7 @@ export default class Ws { } _onError = err => { - logger.warn('[WS] error', err); + console.warn('[WS] error', err); this._triggerEvent(this.onError, err); this._initTimeout = this._initWithTimeout(); } @@ -109,7 +107,7 @@ export default class Ws { } _executeQueue () { - logger.log('[WS] executing queue: ', this._queue); + console.log('[WS] executing queue: ', this._queue); this._queue.forEach(call => { this.send(call.payload, call.callback); }); @@ -117,7 +115,7 @@ export default class Ws { } _executeCbsWithError () { - logger.log('[WS] executing callbacks with error: ', this._callbacks); + console.log('[WS] executing callbacks with error: ', this._callbacks); for (const msgId in this._callbacks) { const cb = this._callbacks[msgId]; cb('[WS] disconnected, cb cannot be called'); diff --git a/js/src/views/Signer/utils/logger.js b/js/src/views/Signer/utils/logger.js deleted file mode 100644 index a7db0b2f70c..00000000000 --- a/js/src/views/Signer/utils/logger.js +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2015, 2016 Ethcore (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see <http://www.gnu.org/licenses/>. - -// this module disable logging on prod - -const isLogging = process.env.LOGGING; - -export default logger(); - -function logger () { - return !isLogging ? prodLogger() : devLogger(); -} - -function prodLogger () { - return { - log: noop, - info: noop, - error: noop, - warn: noop - }; -} - -function devLogger () { - return { - log: console.log.bind(console), - info: console.info.bind(console), - error: console.error.bind(console), - warn: console.warn.bind(console) - }; -} - -function noop () {} From d3b492fe7e08733ed8ad98999892d12b44a4e28a Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 11 Oct 2016 12:06:43 +0200 Subject: [PATCH 1004/1062] add personal signer methods --- js/src/api/rpc/personal/personal.js | 17 +++++++++- js/src/jsonrpc/interfaces/personal.js | 46 +++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/js/src/api/rpc/personal/personal.js b/js/src/api/rpc/personal/personal.js index fa4a2908b88..f1f3bc122a7 100644 --- a/js/src/api/rpc/personal/personal.js +++ b/js/src/api/rpc/personal/personal.js @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see <http://www.gnu.org/licenses/>. -import { inAddress, inNumber10, inOptions } from '../../format/input'; +import { inAddress, inNumber10, inNumber16, inOptions } from '../../format/input'; import { outAccountInfo, outAddress } from '../../format/output'; export default class Personal { @@ -28,6 +28,11 @@ export default class Personal { .then(outAccountInfo); } + confirmRequest (requestId) { + return this._transport + .execute('personal_confirmRequest', inNumber16(requestId)); + } + generateAuthorizationToken () { return this._transport .execute('personal_generateAuthorizationToken'); @@ -69,6 +74,16 @@ export default class Personal { .then(outAddress); } + rejectRequest (requestId) { + return this._transport + .execute('personal_rejectRequest', inNumber16(requestId)); + } + + requestsToConfirm () { + return this._transport + .execute('personal_requestsToConfirm'); + } + setAccountName (address, name) { return this._transport .execute('personal_setAccountName', inAddress(address), name); diff --git a/js/src/jsonrpc/interfaces/personal.js b/js/src/jsonrpc/interfaces/personal.js index 97618db0ac7..82175403cf8 100644 --- a/js/src/jsonrpc/interfaces/personal.js +++ b/js/src/jsonrpc/interfaces/personal.js @@ -40,6 +40,52 @@ export default { } }, + generateAuthorizationToken: { + desc: 'Generates a new authorization token', + params: [], + returns: { + type: String, + desc: 'The new authorization token' + } + }, + + requestsToConfirm: { + desc: 'Returns a list of the transactions requiring authorization', + params: [], + returns: { + type: Array, + desc: 'A list of the outstanding transactions' + } + }, + + confirmRequest: { + desc: 'Confirm a request in the signer queue', + params: [ + { + type: Quantity, + desc: 'The request id' + } + ], + returns: { + type: Boolean, + desc: 'The status of the confirmation' + } + }, + + rejectRequest: { + desc: 'Rejects a request in the signer queue', + params: [ + { + type: Quantity, + desc: 'The request id' + } + ], + returns: { + type: Boolean, + desc: 'The status of the rejection' + } + }, + listAccounts: { desc: 'Returns a list of addresses owned by client.', params: [], From 7ce9b763b2195f9f64bb294e5f9f87dbda68dbe2 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 11 Oct 2016 12:27:23 +0200 Subject: [PATCH 1005/1062] basic signer request subscription --- js/src/api/format/output.js | 18 +++++++++ js/src/api/rpc/personal/personal.js | 5 ++- js/src/api/subscriptions/manager.js | 2 + js/src/api/subscriptions/signer.js | 61 +++++++++++++++++++++++++++++ 4 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 js/src/api/subscriptions/signer.js diff --git a/js/src/api/format/output.js b/js/src/api/format/output.js index 96c41dc3297..611c2e74e79 100644 --- a/js/src/api/format/output.js +++ b/js/src/api/format/output.js @@ -121,6 +121,24 @@ export function outReceipt (receipt) { return receipt; } +export function outSignerRequest (request) { + if (request) { + Object.keys(request).forEach((key) => { + switch (key) { + case 'id': + request[key] = outNumber(request[key]); + break; + + case 'payload': + request[key].transaction = outTransaction(request[key].transaction); + break; + } + }); + } + + return request; +} + export function outTransaction (tx) { if (tx) { Object.keys(tx).forEach((key) => { diff --git a/js/src/api/rpc/personal/personal.js b/js/src/api/rpc/personal/personal.js index f1f3bc122a7..2b2318ac36b 100644 --- a/js/src/api/rpc/personal/personal.js +++ b/js/src/api/rpc/personal/personal.js @@ -15,7 +15,7 @@ // along with Parity. If not, see <http://www.gnu.org/licenses/>. import { inAddress, inNumber10, inNumber16, inOptions } from '../../format/input'; -import { outAccountInfo, outAddress } from '../../format/output'; +import { outAccountInfo, outAddress, outSignerRequest } from '../../format/output'; export default class Personal { constructor (transport) { @@ -81,7 +81,8 @@ export default class Personal { requestsToConfirm () { return this._transport - .execute('personal_requestsToConfirm'); + .execute('personal_requestsToConfirm') + .then((requests) => (requests || []).map(outSignerRequest)); } setAccountName (address, name) { diff --git a/js/src/api/subscriptions/manager.js b/js/src/api/subscriptions/manager.js index 6c1e92b99b8..abdfc3f1bb6 100644 --- a/js/src/api/subscriptions/manager.js +++ b/js/src/api/subscriptions/manager.js @@ -19,6 +19,7 @@ import { isError } from '../util/types'; import Eth from './eth'; import Logging from './logging'; import Personal from './personal'; +import Signer from './signer'; const events = [ 'logging', @@ -48,6 +49,7 @@ export default class Manager { this._logging = new Logging(this._updateSubscriptions); this._eth = new Eth(this._updateSubscriptions, api); this._personal = new Personal(this._updateSubscriptions, api, this); + this._signer = new Signer(this._updateSubscriptions, api, this); } _validateType (_subscriptionName) { diff --git a/js/src/api/subscriptions/signer.js b/js/src/api/subscriptions/signer.js new file mode 100644 index 00000000000..09923fc3189 --- /dev/null +++ b/js/src/api/subscriptions/signer.js @@ -0,0 +1,61 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see <http://www.gnu.org/licenses/>. + +export default class Signer { + constructor (updateSubscriptions, api, subscriber) { + this._subscriber = subscriber; + this._api = api; + this._updateSubscriptions = updateSubscriptions; + this._started = false; + } + + get isStarted () { + return this._started; + } + + start () { + this._started = true; + + return Promise.all([ + this._listRequests(), + this._loggingSubscribe() + ]); + } + + _listRequests = () => { + return this._api.personal + .requestsToConfirm() + .then((requests) => { + this._updateSubscriptions('personal_requestsToConfirm', null, requests); + }); + } + + _loggingSubscribe () { + return this._subscriber.subscribe('logging', (error, data) => { + if (error || !data) { + return; + } + + switch (data.method) { + case 'eth_postTransaction': + case 'eth_sendTranasction': + case 'eth_sendRawTransaction': + this._listRequests(); + return; + } + }); + } +} From de2a5c46073bff46d767e78865d26e2697b6f182 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 11 Oct 2016 13:10:50 +0200 Subject: [PATCH 1006/1062] don't poll blockNumber when not connected --- js/src/api/subscriptions/eth.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/js/src/api/subscriptions/eth.js b/js/src/api/subscriptions/eth.js index 01809ba1615..bf029722d26 100644 --- a/js/src/api/subscriptions/eth.js +++ b/js/src/api/subscriptions/eth.js @@ -36,7 +36,14 @@ export default class Eth { } _blockNumber = () => { - const nextTimeout = () => setTimeout(() => this._blockNumber(), 1000); + const nextTimeout = (timeout = 1000) => { + setTimeout(() => this._blockNumber(), timeout); + }; + + if (!this._api.transport.isConnected()) { + nextTimeout(500); + return; + } return this._api.eth .blockNumber() From 2aa406644a7020952ea757d3e9fd9d16bed67913 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 11 Oct 2016 13:11:22 +0200 Subject: [PATCH 1007/1062] missing return, creating massive ws queue backlogs --- js/src/redux/providers/status.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/js/src/redux/providers/status.js b/js/src/redux/providers/status.js index 62828b6c6b8..b5c32018044 100644 --- a/js/src/redux/providers/status.js +++ b/js/src/redux/providers/status.js @@ -55,12 +55,15 @@ export default class Status { } _pollStatus = () => { - const nextTimeout = (timeout = 1000) => setTimeout(this._pollStatus, timeout); const { secureToken, isConnected, isConnecting, needsToken } = this._api; + const nextTimeout = (timeout = 1000) => { + setTimeout(this._pollStatus, timeout); + }; this._store.dispatch(statusCollection({ isConnected, isConnecting, needsToken, secureToken })); if (!isConnected) { nextTimeout(250); + return; } Promise From 45d25e66a8b6197c572a6245c43098d14e3d3341 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 11 Oct 2016 13:17:39 +0200 Subject: [PATCH 1008/1062] =?UTF-8?q?=CE=9ETH=20->=20ETH?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gavcoin/AccountSelector/AccountItem/accountItem.js | 2 +- js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js | 6 +++--- js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js | 4 ++-- js/src/dapps/gavcoin/Events/Event/event.js | 2 +- js/src/dapps/gavcoin/Status/status.js | 2 +- js/src/dapps/registry/Names/names.js | 2 +- js/src/dapps/tokenreg/Status/status.js | 2 +- js/src/modals/CreateAccount/NewGeth/newGeth.js | 2 +- js/src/modals/ExecuteContract/DetailsStep/detailsStep.js | 2 +- js/src/modals/Shapeshift/Value/value.js | 2 +- js/src/modals/Transfer/Details/details.js | 2 +- js/src/modals/Transfer/Extras/extras.js | 2 +- js/src/modals/Transfer/transfer.js | 2 +- js/src/redux/providers/balances.js | 2 +- js/src/ui/MethodDecoding/methodDecoding.js | 4 ++-- .../views/Account/Transactions/Transaction/transaction.js | 2 +- 16 files changed, 20 insertions(+), 20 deletions(-) diff --git a/js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.js b/js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.js index a5397b9a871..1a55e7f9307 100644 --- a/js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.js +++ b/js/src/dapps/gavcoin/AccountSelector/AccountItem/accountItem.js @@ -40,7 +40,7 @@ export default class AccountItem extends Component { } else { if (account.ethBalance) { balance = account.ethBalance; - token = 'ΞTH'; + token = 'ETH'; } } diff --git a/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js b/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js index dcf73733657..f97e20a6c65 100644 --- a/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js +++ b/js/src/dapps/gavcoin/Actions/ActionBuyIn/actionBuyIn.js @@ -96,7 +96,7 @@ export default class ActionBuyIn extends Component { } renderFields () { - const maxPriceLabel = `maximum price in ΞTH (current ${api.util.fromWei(this.props.price).toFormat(3)})`; + const maxPriceLabel = `maximum price in ETH (current ${api.util.fromWei(this.props.price).toFormat(3)})`; return ( <div> @@ -110,9 +110,9 @@ export default class ActionBuyIn extends Component { <TextField autoComplete='off' floatingLabelFixed - floatingLabelText='amount in ΞTH' + floatingLabelText='amount in ETH' fullWidth - hintText='the amount of ΞTH you wish to spend' + hintText='the amount of ETH you wish to spend' errorText={ this.state.amountError } name={ NAME_ID } id={ NAME_ID } diff --git a/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js b/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js index 82a7fdd8745..8ebbfb35129 100644 --- a/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js +++ b/js/src/dapps/gavcoin/Actions/ActionRefund/actionRefund.js @@ -94,7 +94,7 @@ export default class ActionRefund extends Component { } renderFields () { - const priceLabel = `price in ΞTH (current ${api.util.fromWei(this.props.price).toFormat(3)})`; + const priceLabel = `price in ETH (current ${api.util.fromWei(this.props.price).toFormat(3)})`; return ( <div> @@ -111,7 +111,7 @@ export default class ActionRefund extends Component { floatingLabelFixed floatingLabelText='number of coins' fullWidth - hintText='the number of coins to exchange for an ΞTH refund' + hintText='the number of coins to exchange for an ETH refund' errorText={ this.state.amountError } name={ NAME_ID } id={ NAME_ID } diff --git a/js/src/dapps/gavcoin/Events/Event/event.js b/js/src/dapps/gavcoin/Events/Event/event.js index fa080290a21..4fb29a382ac 100644 --- a/js/src/dapps/gavcoin/Events/Event/event.js +++ b/js/src/dapps/gavcoin/Events/Event/event.js @@ -102,7 +102,7 @@ export default class Event extends Component { return ( <td className={ styles.ethvalue }> - { formatEth(price) }<small> ΞTH</small> + { formatEth(price) }<small> ETH</small> </td> ); } diff --git a/js/src/dapps/gavcoin/Status/status.js b/js/src/dapps/gavcoin/Status/status.js index 92b1efb7aec..81dd0cb1694 100644 --- a/js/src/dapps/gavcoin/Status/status.js +++ b/js/src/dapps/gavcoin/Status/status.js @@ -46,7 +46,7 @@ export default class Status extends Component { { formatCoins(remaining, -1) } </div> <div className={ styles.byline }> - available for { formatEth(price) }ΞTH + available for { formatEth(price) }ETH </div> </div> <div className={ styles.item }> diff --git a/js/src/dapps/registry/Names/names.js b/js/src/dapps/registry/Names/names.js index 330eb413971..907e3bf873e 100644 --- a/js/src/dapps/registry/Names/names.js +++ b/js/src/dapps/registry/Names/names.js @@ -92,7 +92,7 @@ export default class Names extends Component { ? (<p className={ styles.noSpacing }>Please select an account first.</p>) : (action === 'reserve' ? (<p className={ styles.noSpacing }> - The fee to reserve a name is <code>{ fromWei(fee).toFixed(3) }</code>ΞTH. + The fee to reserve a name is <code>{ fromWei(fee).toFixed(3) }</code>ETH. </p>) : (<p className={ styles.noSpacing }>To drop a name, you have to be the owner.</p>) ) diff --git a/js/src/dapps/tokenreg/Status/status.js b/js/src/dapps/tokenreg/Status/status.js index b183e969edc..f8c7b347a4b 100644 --- a/js/src/dapps/tokenreg/Status/status.js +++ b/js/src/dapps/tokenreg/Status/status.js @@ -42,7 +42,7 @@ export default class Status extends Component { <Chip isAddress={ false } - value={ api.util.fromWei(fee).toFixed(3) + 'ΞTH' } + value={ api.util.fromWei(fee).toFixed(3) + 'ETH' } label='Fee' /> </div> ); diff --git a/js/src/modals/CreateAccount/NewGeth/newGeth.js b/js/src/modals/CreateAccount/NewGeth/newGeth.js index 1fd6130b085..8853a671bdb 100644 --- a/js/src/modals/CreateAccount/NewGeth/newGeth.js +++ b/js/src/modals/CreateAccount/NewGeth/newGeth.js @@ -57,7 +57,7 @@ export default class NewGeth extends Component { </div> <div className={ styles.detail }> <div className={ styles.address }>{ account.address }</div> - <div className={ styles.balance }>{ account.balance } ΞTH</div> + <div className={ styles.balance }>{ account.balance } ETH</div> </div> </div> ); diff --git a/js/src/modals/ExecuteContract/DetailsStep/detailsStep.js b/js/src/modals/ExecuteContract/DetailsStep/detailsStep.js index 226ff3a93de..6aab34e7aae 100644 --- a/js/src/modals/ExecuteContract/DetailsStep/detailsStep.js +++ b/js/src/modals/ExecuteContract/DetailsStep/detailsStep.js @@ -54,7 +54,7 @@ export default class DetailsStep extends Component { { this.renderFunctionSelect() } { this.renderParameters() } <Input - label='transaction value (in ΞTH)' + label='transaction value (in ETH)' hint='the amount to send to with the transaction' value={ amount } error={ amountError } diff --git a/js/src/modals/Shapeshift/Value/value.js b/js/src/modals/Shapeshift/Value/value.js index d0b3845f48f..be8c447114d 100644 --- a/js/src/modals/Shapeshift/Value/value.js +++ b/js/src/modals/Shapeshift/Value/value.js @@ -38,7 +38,7 @@ export default class Value extends Component { return ( <div className={ styles.body }> - <span>{ value }</span><small>{ symbol || 'ΞTH' }</small> + <span>{ value }</span><small>{ symbol || 'ETH' }</small> </div> ); } diff --git a/js/src/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js index 456fdf9cb4f..6fdd9eaa68e 100644 --- a/js/src/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -83,7 +83,7 @@ export default class Details extends Component { label='total transaction amount' error={ totalError }> <div className={ styles.inputoverride }> - { total }<small> ΞTH</small> + { total }<small> ETH</small> </div> </Input> </div> diff --git a/js/src/modals/Transfer/Extras/extras.js b/js/src/modals/Transfer/Extras/extras.js index 95d46a198a9..c5ddd4eac47 100644 --- a/js/src/modals/Transfer/Extras/extras.js +++ b/js/src/modals/Transfer/Extras/extras.js @@ -69,7 +69,7 @@ export default class Extras extends Component { label='total transaction amount' hint='the total amount of the transaction' error={ totalError } - value={ `${total} ΞTH` } /> + value={ `${total} ETH` } /> </div> </div> </Form> diff --git a/js/src/modals/Transfer/transfer.js b/js/src/modals/Transfer/transfer.js index 78dc6f77080..fe983f840a3 100644 --- a/js/src/modals/Transfer/transfer.js +++ b/js/src/modals/Transfer/transfer.js @@ -66,7 +66,7 @@ export default class Transfer extends Component { recipient: '', recipientError: ERRORS.requireRecipient, sending: false, - tag: 'ΞTH', + tag: 'ETH', total: '0.0', totalError: null, value: '0.0', diff --git a/js/src/redux/providers/balances.js b/js/src/redux/providers/balances.js index 151cb014dd4..3c3e22d75a3 100644 --- a/js/src/redux/providers/balances.js +++ b/js/src/redux/providers/balances.js @@ -23,7 +23,7 @@ import imagesEthereum from '../../images/contracts/ethereum-black-64x64.png'; const ETH = { name: 'Ethereum', - tag: 'ΞTH', + tag: 'ETH', image: imagesEthereum }; diff --git a/js/src/ui/MethodDecoding/methodDecoding.js b/js/src/ui/MethodDecoding/methodDecoding.js index ec84d92ee30..741716428ba 100644 --- a/js/src/ui/MethodDecoding/methodDecoding.js +++ b/js/src/ui/MethodDecoding/methodDecoding.js @@ -93,7 +93,7 @@ class Method extends Component { return ( <div className={ styles.gasDetails }> - { historic ? 'Used' : 'Will use' } <span className={ styles.highlight }>{ gas.toFormat(0) } gas ({ gasPrice.div(1000000).toFormat(0) }M/<small>ΞTH</small>)</span> for a total transaction cost of <span className={ styles.highlight }>{ this.renderEtherValue(gasValue) }</span> + { historic ? 'Used' : 'Will use' } <span className={ styles.highlight }>{ gas.toFormat(0) } gas ({ gasPrice.div(1000000).toFormat(0) }M/<small>ETH</small>)</span> for a total transaction cost of <span className={ styles.highlight }>{ this.renderEtherValue(gasValue) }</span> </div> ); } @@ -260,7 +260,7 @@ class Method extends Component { return ( <span className={ styles.etherValue }> - { ether.toFormat(5) }<small>ΞTH</small> + { ether.toFormat(5) }<small>ETH</small> </span> ); } diff --git a/js/src/views/Account/Transactions/Transaction/transaction.js b/js/src/views/Account/Transactions/Transaction/transaction.js index 1982fca411f..4d8060ecaff 100644 --- a/js/src/views/Account/Transactions/Transaction/transaction.js +++ b/js/src/views/Account/Transactions/Transaction/transaction.js @@ -143,7 +143,7 @@ export default class Transaction extends Component { return ( <div className={ styles.value }> - { value.toFormat(5) }<small>ΞTH</small> + { value.toFormat(5) }<small>ETH</small> </div> ); } From 297e3a4b0345ec39e924dfbcf48162a808e6a8cd Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 11 Oct 2016 13:33:13 +0200 Subject: [PATCH 1009/1062] fix failing tests --- js/src/api/subscriptions/eth.js | 2 +- js/src/api/subscriptions/eth.spec.js | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/js/src/api/subscriptions/eth.js b/js/src/api/subscriptions/eth.js index bf029722d26..2c0afd0d3a3 100644 --- a/js/src/api/subscriptions/eth.js +++ b/js/src/api/subscriptions/eth.js @@ -40,7 +40,7 @@ export default class Eth { setTimeout(() => this._blockNumber(), timeout); }; - if (!this._api.transport.isConnected()) { + if (!this._api.transport.isConnected) { nextTimeout(500); return; } diff --git a/js/src/api/subscriptions/eth.spec.js b/js/src/api/subscriptions/eth.spec.js index ddbd9eb50d6..24398483e46 100644 --- a/js/src/api/subscriptions/eth.spec.js +++ b/js/src/api/subscriptions/eth.spec.js @@ -29,6 +29,9 @@ function stubApi (blockNumber) { return { _calls, + transport: { + isConnected: true + }, eth: { blockNumber: () => { const stub = sinon.stub().resolves(new BigNumber(blockNumber || START_BLOCK))(); From 02501b8e239336b0dc01436c56f1a1dede8d98e6 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 11 Oct 2016 13:55:36 +0200 Subject: [PATCH 1010/1062] registry uses setAddress to actually set addresses now --- js/src/dapps/registry/Records/actions.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/js/src/dapps/registry/Records/actions.js b/js/src/dapps/registry/Records/actions.js index b93a85fcf5a..8b140721190 100644 --- a/js/src/dapps/registry/Records/actions.js +++ b/js/src/dapps/registry/Records/actions.js @@ -10,8 +10,13 @@ export const update = (name, key, value) => (dispatch, getState) => { const state = getState(); const account = state.accounts.selected; const contract = state.contract; - if (!contract || !account) return; - const fn = contract.functions.find((f) => f.name === 'set'); + + if (!contract || !account) { + return; + } + + const fnName = key === 'A' ? 'setAddress' : 'set'; + const fn = contract.functions.find((f) => f.name === fnName); name = name.toLowerCase(); const options = { from: account.address }; From 0b0f28d1876848e0278a68bcbae8d6083db28bbc Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 11 Oct 2016 14:21:45 +0200 Subject: [PATCH 1011/1062] bytes mapping operates on lowerCase hex strings --- js/src/abi/util/pad.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/abi/util/pad.js b/js/src/abi/util/pad.js index 9f2a45b86b2..a7d94043169 100644 --- a/js/src/abi/util/pad.js +++ b/js/src/abi/util/pad.js @@ -46,7 +46,7 @@ function stringToBytes (input) { if (isArray(input)) { return input; } else if (input.substr(0, 2) === '0x') { - return input.substr(2).match(/.{1,2}/g).map((value) => parseInt(value, 16)); + return input.substr(2).toLowerCase().match(/.{1,2}/g).map((value) => parseInt(value, 16)); } else { return input.split('').map((char) => char.charCodeAt(0)); } From 98137d93e3840a23f0e6040c4b2f057df4444600 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 11 Oct 2016 14:37:59 +0200 Subject: [PATCH 1012/1062] sha3 ids for each application --- js/src/views/Dapps/dapps.js | 72 ++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 32 deletions(-) diff --git a/js/src/views/Dapps/dapps.js b/js/src/views/Dapps/dapps.js index f975d8c8243..9464920b0ee 100644 --- a/js/src/views/Dapps/dapps.js +++ b/js/src/views/Dapps/dapps.js @@ -18,12 +18,51 @@ import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; +import { sha3 } from '../../api/util/sha3'; import { Actionbar, Page } from '../../ui'; import Summary from './Summary'; import styles from './dapps.css'; +const APPS = [ + { + name: 'Token Deployment', + description: 'Deploy new basic tokens that you are able to send around', + url: 'basiccoin' + }, + { + name: 'GAVcoin', + description: 'Manage your GAVcoins, the hottest new property in crypto', + url: 'gavcoin' + }, + { + name: 'Registry', + description: 'A global registry of addresses on the network', + url: 'registry' + }, + { + name: 'Token Registry', + description: 'A registry of transactable tokens on the network', + url: 'tokenreg' + }, + { + name: 'Method Registry', + description: 'A registry of method signatures for lookups on transactions', + url: 'signaturereg' + }, + { + name: 'GitHub Hint', + description: 'A mapping of GitHub URLs to hashes for use in contracts as references', + url: 'githubhint' + } +]; + +APPS.forEach((app) => { + app.id = sha3(app.url); + console.log(`dapps ${app.id} -> ${app.url}`); +}); + class Dapps extends Component { static contextTypes = { api: PropTypes.object.isRequired @@ -34,38 +73,7 @@ class Dapps extends Component { } state = { - apps: [ - { - name: 'Token Deployment', - description: 'Deploy new basic tokens that you are able to send around', - url: 'basiccoin' - }, - { - name: 'GAVcoin', - description: 'Manage your GAVcoins, the hottest new property in crypto', - url: 'gavcoin' - }, - { - name: 'Registry', - description: 'A global registry of addresses on the network', - url: 'registry' - }, - { - name: 'Token Registry', - description: 'A registry of transactable tokens on the network', - url: 'tokenreg' - }, - { - name: 'Method Registry', - description: 'A registry of method signatures for lookups on transactions', - url: 'signaturereg' - }, - { - name: 'GitHub Hint', - description: 'A mapping of GitHub URLs to hashes for use in contracts as references', - url: 'githubhint' - } - ] + apps: APPS } render () { From 5271a792ccc37ba04785e68c7d8a8228207195ad Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 11 Oct 2016 14:48:39 +0200 Subject: [PATCH 1013/1062] add dappreg to list of contracts --- js/src/contracts/abi/dappreg.json | 1 + js/src/contracts/abi/index.js | 2 + js/src/contracts/contracts.js | 6 +++ js/src/contracts/dappreg.js | 68 +++++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+) create mode 100644 js/src/contracts/abi/dappreg.json create mode 100644 js/src/contracts/dappreg.js diff --git a/js/src/contracts/abi/dappreg.json b/js/src/contracts/abi/dappreg.json new file mode 100644 index 00000000000..bd7bc2c2f4f --- /dev/null +++ b/js/src/contracts/abi/dappreg.json @@ -0,0 +1 @@ +[{"constant":true,"inputs":[{"name":"_id","type":"bytes32"},{"name":"_key","type":"bytes32"}],"name":"meta","outputs":[{"name":"","type":"bytes32"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"count","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_new","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"bytes32"}],"name":"unregister","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_fee","type":"uint256"}],"name":"setFee","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"bytes32"}],"name":"get","outputs":[{"name":"id","type":"bytes32"},{"name":"owner","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"bytes32"},{"name":"_key","type":"bytes32"},{"name":"_value","type":"bytes32"}],"name":"setMeta","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"drain","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"bytes32"},{"name":"_owner","type":"address"}],"name":"setDappOwner","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"fee","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"at","outputs":[{"name":"id","type":"bytes32"},{"name":"owner","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"bytes32"}],"name":"register","outputs":[],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"bytes32"},{"indexed":true,"name":"key","type":"bytes32"},{"indexed":false,"name":"value","type":"bytes32"}],"name":"MetaChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"bytes32"},{"indexed":true,"name":"owner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"bytes32"},{"indexed":true,"name":"owner","type":"address"}],"name":"Registered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"bytes32"}],"name":"Unregistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"old","type":"address"},{"indexed":true,"name":"current","type":"address"}],"name":"NewOwner","type":"event"}] diff --git a/js/src/contracts/abi/index.js b/js/src/contracts/abi/index.js index 09c5347823b..8789e133923 100644 --- a/js/src/contracts/abi/index.js +++ b/js/src/contracts/abi/index.js @@ -15,6 +15,7 @@ // along with Parity. If not, see <http://www.gnu.org/licenses/>. import basiccoinmanager from './basiccoinmanager.json'; +import dappreg from './dappreg.json'; import eip20 from './eip20.json'; import gavcoin from './gavcoin.json'; import githubhint from './githubhint.json'; @@ -25,6 +26,7 @@ import tokenreg from './tokenreg.json'; export { basiccoinmanager, + dappreg, eip20, gavcoin, githubhint, diff --git a/js/src/contracts/contracts.js b/js/src/contracts/contracts.js index e540a5fce91..e1d608c1e18 100644 --- a/js/src/contracts/contracts.js +++ b/js/src/contracts/contracts.js @@ -14,6 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see <http://www.gnu.org/licenses/>. +import DappReg from './dappreg'; import Registry from './registry'; import SignatureReg from './signaturereg'; import TokenReg from './tokenreg'; @@ -26,6 +27,7 @@ export default class Contracts { this._api = api; this._registry = new Registry(api); + this._dappreg = new DappReg(api, this._registry); this._signaturereg = new SignatureReg(api, this._registry); this._tokenreg = new TokenReg(api, this._registry); } @@ -34,6 +36,10 @@ export default class Contracts { return this._registry; } + get dappReg () { + return this._dappReg; + } + get signatureReg () { return this._signaturereg; } diff --git a/js/src/contracts/dappreg.js b/js/src/contracts/dappreg.js new file mode 100644 index 00000000000..4067270c1db --- /dev/null +++ b/js/src/contracts/dappreg.js @@ -0,0 +1,68 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see <http://www.gnu.org/licenses/>. + +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see <http://www.gnu.org/licenses/>. + +export default class DappReg { + constructor (api, registry) { + this._api = api; + this._registry = registry; + + this.getInstance(); + } + + getInstance () { + return this._registry.getContractInstance('dappreg'); + } + + count () { + return this.getInstance().then((instance) => { + return instance.count.call(); + }); + } + + at (index) { + return this.getInstance().then((instance) => { + return instance.at.call({}, [index]); + }); + } + + get (id) { + return this.getInstance().then((instance) => { + return instance.get.call({}, [id]); + }); + } + + meta (id, key) { + return this.getInstance().then((instance) => { + return instance.meta.call({}, [id, key]); + }); + } +} From 3cfbab21d642fbe35d484c2a94f35c5aeb6d8ede Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 11 Oct 2016 15:10:36 +0200 Subject: [PATCH 1014/1062] adjust alignment of queries --- .../{inputQueries.js => inputQuery.js} | 38 ++++---- js/src/views/Contract/Queries/queries.css | 87 +++++++++++++++++++ js/src/views/Contract/Queries/queries.js | 50 ++++++----- js/src/views/Contract/contract.css | 63 +------------- 4 files changed, 135 insertions(+), 103 deletions(-) rename js/src/views/Contract/Queries/{inputQueries.js => inputQuery.js} (88%) create mode 100644 js/src/views/Contract/Queries/queries.css diff --git a/js/src/views/Contract/Queries/inputQueries.js b/js/src/views/Contract/Queries/inputQuery.js similarity index 88% rename from js/src/views/Contract/Queries/inputQueries.js rename to js/src/views/Contract/Queries/inputQuery.js index a6269333327..29034ff6180 100644 --- a/js/src/views/Contract/Queries/inputQueries.js +++ b/js/src/views/Contract/Queries/inputQuery.js @@ -22,9 +22,9 @@ import { Card, CardActions, CardTitle, CardText } from 'material-ui/Card'; import { Button, Input } from '../../../ui'; -import styles from '../contract.css'; +import styles from './queries.css'; -export default class InputQueries extends Component { +export default class InputQuery extends Component { static contextTypes = { api: PropTypes.object } @@ -67,22 +67,24 @@ export default class InputQueries extends Component { const inputsFields = inputs .map(input => this.renderInput(input)); - return (<div> - <CardText - className={ styles.methodContent } - > - <div className={ styles.methodResults }> - { this.renderResults() } - </div> - { inputsFields } - </CardText> - <CardActions> - <Button - label='Execute' - disabled={ !isValid } - onClick={ this.onClick } /> - </CardActions> - </div>); + return ( + <div> + <CardText + className={ styles.methodContent } + > + <div className={ styles.methodResults }> + { this.renderResults() } + </div> + { inputsFields } + </CardText> + <CardActions> + <Button + label='Execute' + disabled={ !isValid } + onClick={ this.onClick } /> + </CardActions> + </div> + ); } renderResults () { diff --git a/js/src/views/Contract/Queries/queries.css b/js/src/views/Contract/Queries/queries.css new file mode 100644 index 00000000000..0caa1006f58 --- /dev/null +++ b/js/src/views/Contract/Queries/queries.css @@ -0,0 +1,87 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see <http://www.gnu.org/licenses/>. +*/ + +.vMethods, .hMethods, .methods { + display: flex; + flex-wrap: wrap; +} + +.container { + align-items: flex-start; + display: border-box; +} + +.container .method { + background-color: rgba(255, 255, 255, 0.05) !important; + margin: 0.5em; +} + +.vMethods { + flex-direction: column; + width: 33.3333%; +} + +.hMethods { + flex: 1; + flex-direction: row; + width: 66.6666%; +} + +.hMethods .container { + width: 50%; +} + +.methodTitle { + padding-bottom: 8px !important; + padding-top: 8px !important; +} + +.methodContent { + padding-top: 0 !important; + padding-bottom: 8px !important; +} + +.methodResults { + display: flex; + flex-wrap: wrap; + max-width: 24rem; + justify-content: space-around; +} + +.methodResults > div { + margin: 0.5rem; + display: flex; + flex-direction: column; + align-items: center; + max-width: 100%; +} + +.queryValue, .queryValue * { + user-select: text !important; + max-width: 100%; + box-sizing: border-box; + white-space: normal !important; + overflow-wrap: break-word !important; +} + +.queryValue:hover { + cursor: text !important; +} + +.queryResultName { + margin-bottom: 0.25rem; +} diff --git a/js/src/views/Contract/Queries/queries.js b/js/src/views/Contract/Queries/queries.js index 7f7e06ada90..5bf595ff33b 100644 --- a/js/src/views/Contract/Queries/queries.js +++ b/js/src/views/Contract/Queries/queries.js @@ -19,10 +19,10 @@ import React, { Component, PropTypes } from 'react'; import Chip from 'material-ui/Chip'; import { Card, CardTitle, CardText } from 'material-ui/Card'; -import InputQueries from './inputQueries'; +import InputQuery from './inputQuery'; import { Container, ContainerTitle } from '../../../ui'; -import styles from '../contract.css'; +import styles from './queries.css'; export default class Queries extends Component { static contextTypes = { @@ -75,14 +75,16 @@ export default class Queries extends Component { const { contract } = this.props; return ( - <InputQueries - key={ fn.signature } - className={ styles.method } - inputs={ abi.inputs } - outputs={ abi.outputs } - name={ name } - contract={ contract } - /> + <div className={ styles.container }> + <InputQuery + key={ fn.signature } + className={ styles.method } + inputs={ abi.inputs } + outputs={ abi.outputs } + name={ name } + contract={ contract } + /> + </div> ); } @@ -90,19 +92,21 @@ export default class Queries extends Component { const { values } = this.props; return ( - <Card - className={ styles.method } - key={ fn.signature }> - <CardTitle - className={ styles.methodTitle } - title={ fn.name } - /> - <CardText - className={ styles.methodContent } - > - { this.renderValue(values[fn.name]) } - </CardText> - </Card> + <div className={ styles.container }> + <Card + className={ styles.method } + key={ fn.signature }> + <CardTitle + className={ styles.methodTitle } + title={ fn.name } + /> + <CardText + className={ styles.methodContent } + > + { this.renderValue(values[fn.name]) } + </CardText> + </Card> + </div> ); } diff --git a/js/src/views/Contract/contract.css b/js/src/views/Contract/contract.css index f6aeb1461d3..6956b8c5010 100644 --- a/js/src/views/Contract/contract.css +++ b/js/src/views/Contract/contract.css @@ -14,69 +14,8 @@ /* You should have received a copy of the GNU General Public License /* along with Parity. If not, see <http://www.gnu.org/licenses/>. */ -.contract { -} - -.vMethods, .hMethods, .methods { - display: flex; - flex-wrap: wrap; -} - -.vMethods { - flex-direction: column; -} - -.hMethods { - flex: 1; - flex-direction: row; - justify-content: space-around; -} - -.method { - background-color: rgba(255, 255, 255, 0.05) !important; - margin: 1rem; - align-items: flex-start; -} - -.methodTitle { - padding-bottom: 8px !important; - padding-top: 8px !important; -} -.methodContent { - padding-top: 0 !important; - padding-bottom: 8px !important; -} - -.methodResults { - display: flex; - flex-wrap: wrap; - max-width: 24rem; - justify-content: space-around; -} - -.methodResults > div { - margin: 0.5rem; - display: flex; - flex-direction: column; - align-items: center; - max-width: 100%; -} - -.queryValue, .queryValue * { - user-select: text !important; - max-width: 100%; - box-sizing: border-box; - white-space: normal !important; - overflow-wrap: break-word !important; -} - -.queryValue:hover { - cursor: text !important; -} - -.queryResultName { - margin-bottom: 0.25rem; +.contract { } .events { From fb8af93265396623b99418df69ef6dcf0dc772df Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 11 Oct 2016 15:41:52 +0200 Subject: [PATCH 1015/1062] show gas estimation log --- js/src/modals/ExecuteContract/executeContract.js | 1 + 1 file changed, 1 insertion(+) diff --git a/js/src/modals/ExecuteContract/executeContract.js b/js/src/modals/ExecuteContract/executeContract.js index 9954edc30d8..524326c3a2e 100644 --- a/js/src/modals/ExecuteContract/executeContract.js +++ b/js/src/modals/ExecuteContract/executeContract.js @@ -203,6 +203,7 @@ export default class ExecuteContract extends Component { .estimateGas(options, values) .then((gas) => { options.gas = gas.mul(1.2).toFixed(0); + console.log(`estimateGas: received ${gas.toFormat(0)}, adjusted to ${gas.mul(1.2).toFormat(0)}`); return func.postTransaction(options, values); }) .then((requestId) => { From 687246d83a0821d3a58e8e957df32bbb028c1aee Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 11 Oct 2016 17:52:01 +0200 Subject: [PATCH 1016/1062] abi with payable for register function --- js/src/contracts/abi/dappreg.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/contracts/abi/dappreg.json b/js/src/contracts/abi/dappreg.json index bd7bc2c2f4f..f6bec35af13 100644 --- a/js/src/contracts/abi/dappreg.json +++ b/js/src/contracts/abi/dappreg.json @@ -1 +1 @@ -[{"constant":true,"inputs":[{"name":"_id","type":"bytes32"},{"name":"_key","type":"bytes32"}],"name":"meta","outputs":[{"name":"","type":"bytes32"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"count","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_new","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"bytes32"}],"name":"unregister","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_fee","type":"uint256"}],"name":"setFee","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"bytes32"}],"name":"get","outputs":[{"name":"id","type":"bytes32"},{"name":"owner","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"bytes32"},{"name":"_key","type":"bytes32"},{"name":"_value","type":"bytes32"}],"name":"setMeta","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"drain","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"bytes32"},{"name":"_owner","type":"address"}],"name":"setDappOwner","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"fee","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"at","outputs":[{"name":"id","type":"bytes32"},{"name":"owner","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"bytes32"}],"name":"register","outputs":[],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"bytes32"},{"indexed":true,"name":"key","type":"bytes32"},{"indexed":false,"name":"value","type":"bytes32"}],"name":"MetaChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"bytes32"},{"indexed":true,"name":"owner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"bytes32"},{"indexed":true,"name":"owner","type":"address"}],"name":"Registered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"bytes32"}],"name":"Unregistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"old","type":"address"},{"indexed":true,"name":"current","type":"address"}],"name":"NewOwner","type":"event"}] +[{"constant":true,"inputs":[{"name":"_id","type":"bytes32"},{"name":"_key","type":"bytes32"}],"name":"meta","outputs":[{"name":"","type":"bytes32"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"count","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_new","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"bytes32"}],"name":"unregister","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_fee","type":"uint256"}],"name":"setFee","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"bytes32"}],"name":"get","outputs":[{"name":"id","type":"bytes32"},{"name":"owner","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"bytes32"},{"name":"_key","type":"bytes32"},{"name":"_value","type":"bytes32"}],"name":"setMeta","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"drain","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"bytes32"},{"name":"_owner","type":"address"}],"name":"setDappOwner","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"fee","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"at","outputs":[{"name":"id","type":"bytes32"},{"name":"owner","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"bytes32"}],"name":"register","outputs":[],"payable":true,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"bytes32"},{"indexed":true,"name":"key","type":"bytes32"},{"indexed":false,"name":"value","type":"bytes32"}],"name":"MetaChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"bytes32"},{"indexed":true,"name":"owner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"bytes32"},{"indexed":true,"name":"owner","type":"address"}],"name":"Registered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"bytes32"}],"name":"Unregistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"old","type":"address"},{"indexed":true,"name":"current","type":"address"}],"name":"NewOwner","type":"event"}] From ef3331395da42aba02148e9ea68aff6586ce1c3a Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 11 Oct 2016 17:53:59 +0200 Subject: [PATCH 1017/1062] add key as required --- js/src/views/Contract/Queries/queries.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/js/src/views/Contract/Queries/queries.js b/js/src/views/Contract/Queries/queries.js index 5bf595ff33b..915acd258f2 100644 --- a/js/src/views/Contract/Queries/queries.js +++ b/js/src/views/Contract/Queries/queries.js @@ -75,9 +75,8 @@ export default class Queries extends Component { const { contract } = this.props; return ( - <div className={ styles.container }> + <div className={ styles.container } key={ fn.signature }> <InputQuery - key={ fn.signature } className={ styles.method } inputs={ abi.inputs } outputs={ abi.outputs } @@ -92,10 +91,8 @@ export default class Queries extends Component { const { values } = this.props; return ( - <div className={ styles.container }> - <Card - className={ styles.method } - key={ fn.signature }> + <div className={ styles.container } key={ fn.signature }> + <Card className={ styles.method }> <CardTitle className={ styles.methodTitle } title={ fn.name } From 619a9cf440ba4d050b4267403d895d83af265aa2 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 11 Oct 2016 20:23:36 +0200 Subject: [PATCH 1018/1062] image retrieval from dappreg --- js/src/contracts/contracts.js | 2 +- js/src/contracts/dappreg.js | 4 ++++ js/src/images/dapps/signature.png | Bin 0 -> 2655 bytes js/src/views/Dapps/Summary/summary.js | 2 +- js/src/views/Dapps/dapps.js | 29 ++++++++++++++++++++++++-- 5 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 js/src/images/dapps/signature.png diff --git a/js/src/contracts/contracts.js b/js/src/contracts/contracts.js index e1d608c1e18..c9d1c2390a0 100644 --- a/js/src/contracts/contracts.js +++ b/js/src/contracts/contracts.js @@ -37,7 +37,7 @@ export default class Contracts { } get dappReg () { - return this._dappReg; + return this._dappreg; } get signatureReg () { diff --git a/js/src/contracts/dappreg.js b/js/src/contracts/dappreg.js index 4067270c1db..ef07e95c58e 100644 --- a/js/src/contracts/dappreg.js +++ b/js/src/contracts/dappreg.js @@ -65,4 +65,8 @@ export default class DappReg { return instance.meta.call({}, [id, key]); }); } + + getImage (id) { + return this.meta(id, 'IMG'); + } } diff --git a/js/src/images/dapps/signature.png b/js/src/images/dapps/signature.png new file mode 100644 index 0000000000000000000000000000000000000000..36b341a036642764e48a0a958077b2440f370cbe GIT binary patch literal 2655 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 literal 0 HcmV?d00001 diff --git a/js/src/views/Dapps/Summary/summary.js b/js/src/views/Dapps/Summary/summary.js index 3182d19d700..11df88b0b56 100644 --- a/js/src/views/Dapps/Summary/summary.js +++ b/js/src/views/Dapps/Summary/summary.js @@ -43,7 +43,7 @@ export default class Summary extends Component { return ( <Container> <IdentityIcon - address={ app.address } /> + address={ app.id } /> <Title title={ <Link to={ url }>{ app.name }</Link> } byline={ app.description } /> diff --git a/js/src/views/Dapps/dapps.js b/js/src/views/Dapps/dapps.js index 9464920b0ee..8a7d3d1956b 100644 --- a/js/src/views/Dapps/dapps.js +++ b/js/src/views/Dapps/dapps.js @@ -19,6 +19,8 @@ import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import { sha3 } from '../../api/util/sha3'; +import Contracts from '../../contracts'; +import { setAddressImage } from '../../redux/actions'; import { Actionbar, Page } from '../../ui'; import Summary from './Summary'; @@ -69,13 +71,18 @@ class Dapps extends Component { } static propTypes = { - tokens: PropTypes.object + tokens: PropTypes.object, + setAddressImage: PropTypes.func.isRequired } state = { apps: APPS } + componentDidMount () { + this.loadImages(); + } + render () { return ( <div> @@ -106,6 +113,24 @@ class Dapps extends Component { ); }); } + + loadImages () { + const { setAddressImage } = this.props; + const { apps } = this.state; + const { dappReg } = Contracts.get(); + + Promise + .all(apps.map((app) => dappReg.getImage(app.id))) + .then((images) => { + apps.forEach((app, index) => { + setAddressImage(app.id, images[index]); + }); + this.setState({ apps }); + }) + .catch((error) => { + console.error('loadImages', error); + }); + } } function mapStateToProps (state) { @@ -117,7 +142,7 @@ function mapStateToProps (state) { } function mapDispatchToProps (dispatch) { - return bindActionCreators({}, dispatch); + return bindActionCreators({ setAddressImage }, dispatch); } export default connect( From 9c03b0c107945f0ea2d2173d071f5af9a9f27030 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 11 Oct 2016 21:34:02 +0200 Subject: [PATCH 1019/1062] use proper Image urls --- js/src/redux/providers/imagesReducer.js | 9 +++++++-- js/src/redux/util.js | 2 ++ js/src/views/Dapps/Summary/summary.css | 25 +++++++++++++++++++++++++ js/src/views/Dapps/Summary/summary.js | 9 ++++++--- js/src/views/Dapps/dapps.js | 25 ++++++++++++++++++------- 5 files changed, 58 insertions(+), 12 deletions(-) diff --git a/js/src/redux/providers/imagesReducer.js b/js/src/redux/providers/imagesReducer.js index af4be49b5f5..396576cc8fc 100644 --- a/js/src/redux/providers/imagesReducer.js +++ b/js/src/redux/providers/imagesReducer.js @@ -23,13 +23,18 @@ const initialState = { images: {} }; +export function hashToImageUrl (hashArray) { + const hash = hashArray ? bytesToHex(hashArray) : ZERO; + + return hash === ZERO ? null : `/api/content/${hash.substr(2)}`; +} + export default handleActions({ setAddressImage (state, action) { const { address, hashArray } = action; - const hash = hashArray ? bytesToHex(hashArray) : ZERO; return Object.assign({}, state, { - [address]: hash === ZERO ? null : `/api/content/${hash.substr(2)}` + [address]: hashToImageUrl(hashArray) }); } }, initialState); diff --git a/js/src/redux/util.js b/js/src/redux/util.js index 047db47d2a6..0c45c4b09f8 100644 --- a/js/src/redux/util.js +++ b/js/src/redux/util.js @@ -14,8 +14,10 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see <http://www.gnu.org/licenses/>. +import { hashToImageUrl } from './providers/imagesReducer'; import { withError } from '../ui/Errors/middleware'; export { + hashToImageUrl, withError }; diff --git a/js/src/views/Dapps/Summary/summary.css b/js/src/views/Dapps/Summary/summary.css index 8b137891791..e0d3b7dbde3 100644 --- a/js/src/views/Dapps/Summary/summary.css +++ b/js/src/views/Dapps/Summary/summary.css @@ -1 +1,26 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see <http://www.gnu.org/licenses/>. +*/ +.image { + float: left; + text-align: left; + margin-right: 1em !important; + border-radius: 50%; + margin: 0; + width: 56px; + height: 56px; +} diff --git a/js/src/views/Dapps/Summary/summary.js b/js/src/views/Dapps/Summary/summary.js index 11df88b0b56..a9dbf129706 100644 --- a/js/src/views/Dapps/Summary/summary.js +++ b/js/src/views/Dapps/Summary/summary.js @@ -18,7 +18,8 @@ import React, { Component, PropTypes } from 'react'; import { Link } from 'react-router'; import Container, { Title } from '../../../ui/Container'; -import IdentityIcon from '../../../ui/IdentityIcon'; + +import styles from './summary.css'; export default class Summary extends Component { static contextTypes = { @@ -39,11 +40,13 @@ export default class Summary extends Component { } const url = `/app/${app.url}`; + const image = app.image + ? <img src={ app.image } className={ styles.image } /> + : <div className={ styles.image }> </div>; return ( <Container> - <IdentityIcon - address={ app.id } /> + { image } <Title title={ <Link to={ url }>{ app.name }</Link> } byline={ app.description } /> diff --git a/js/src/views/Dapps/dapps.js b/js/src/views/Dapps/dapps.js index 8a7d3d1956b..6edde29f00e 100644 --- a/js/src/views/Dapps/dapps.js +++ b/js/src/views/Dapps/dapps.js @@ -20,7 +20,7 @@ import { bindActionCreators } from 'redux'; import { sha3 } from '../../api/util/sha3'; import Contracts from '../../contracts'; -import { setAddressImage } from '../../redux/actions'; +import { hashToImageUrl } from '../../redux/util'; import { Actionbar, Page } from '../../ui'; import Summary from './Summary'; @@ -71,15 +71,16 @@ class Dapps extends Component { } static propTypes = { - tokens: PropTypes.object, - setAddressImage: PropTypes.func.isRequired + tokens: PropTypes.object } state = { - apps: APPS + apps: APPS, + local: [] } componentDidMount () { + this.loadLocalApps(); this.loadImages(); } @@ -114,8 +115,18 @@ class Dapps extends Component { }); } + loadLocalApps () { + fetch(`http://${window.location.host}/api/apps`, { method: 'GET' }) + .then((response) => response.ok ? response.json() : []) + .then((apps) => { + console.log('loadLocalApps', apps); + }) + .catch((error) => { + console.error('loadLocalApps', error); + }); + } + loadImages () { - const { setAddressImage } = this.props; const { apps } = this.state; const { dappReg } = Contracts.get(); @@ -123,7 +134,7 @@ class Dapps extends Component { .all(apps.map((app) => dappReg.getImage(app.id))) .then((images) => { apps.forEach((app, index) => { - setAddressImage(app.id, images[index]); + app.image = hashToImageUrl(images[index]); }); this.setState({ apps }); }) @@ -142,7 +153,7 @@ function mapStateToProps (state) { } function mapDispatchToProps (dispatch) { - return bindActionCreators({ setAddressImage }, dispatch); + return bindActionCreators({}, dispatch); } export default connect( From d751b1b57dfae24cbeb5ebe443874097d1e76966 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Tue, 11 Oct 2016 21:34:43 +0200 Subject: [PATCH 1020/1062] embed and link apps from Parity, retrieved via /api/apps --- js/src/index.js | 2 +- js/src/ui/Container/Title/title.js | 5 +- js/src/views/Dapp/dapp.js | 6 +- js/src/views/Dapps/Summary/summary.css | 24 +++++- js/src/views/Dapps/Summary/summary.js | 19 +++-- js/src/views/Dapps/dapps.css | 4 + js/src/views/Dapps/dapps.js | 112 +++++++++++++------------ js/webpack.config.js | 7 ++ 8 files changed, 109 insertions(+), 70 deletions(-) diff --git a/js/src/index.js b/js/src/index.js index 7ae4352f4e7..6d294e2a377 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -86,7 +86,7 @@ ReactDOM.render( <Route path='addresses' component={ Addresses } /> <Route path='address/:address' component={ Address } /> <Route path='apps' component={ Dapps } /> - <Route path='app/:name' component={ Dapp } /> + <Route path='app/:type/:name' component={ Dapp } /> <Route path='contracts' component={ Contracts } /> <Route path='contract/:address' component={ Contract } /> <Route path='settings' component={ Settings }> diff --git a/js/src/ui/Container/Title/title.js b/js/src/ui/Container/Title/title.js index 9a6f2f51a95..2acfc30bb1b 100644 --- a/js/src/ui/Container/Title/title.js +++ b/js/src/ui/Container/Title/title.js @@ -20,6 +20,7 @@ import styles from './title.css'; export default class Title extends Component { static propTypes = { + className: PropTypes.string, title: PropTypes.oneOfType([ PropTypes.string, PropTypes.node ]), @@ -31,8 +32,10 @@ export default class Title extends Component { } render () { + const { className } = this.props; + return ( - <div> + <div className={ className }> <h3 className={ styles.title }> { this.props.title } </h3> diff --git a/js/src/views/Dapp/dapp.js b/js/src/views/Dapp/dapp.js index 306fe5dc82e..a0873392cdd 100644 --- a/js/src/views/Dapp/dapp.js +++ b/js/src/views/Dapp/dapp.js @@ -24,8 +24,10 @@ export default class Dapp extends Component { }; render () { - const { name } = this.props.params; - const src = `${name}.html`; + const { name, type } = this.props.params; + const src = type === 'global' + ? `${name}.html` + : `/app/${name}/`; return ( <iframe diff --git a/js/src/views/Dapps/Summary/summary.css b/js/src/views/Dapps/Summary/summary.css index e0d3b7dbde3..67247077658 100644 --- a/js/src/views/Dapps/Summary/summary.css +++ b/js/src/views/Dapps/Summary/summary.css @@ -15,12 +15,28 @@ /* along with Parity. If not, see <http://www.gnu.org/licenses/>. */ +.container { + position: relative; +} + .image { - float: left; - text-align: left; - margin-right: 1em !important; + position: absolute; + top: 1.5em; + left: 1.5em; border-radius: 50%; - margin: 0; width: 56px; height: 56px; } + +.description { + margin-left: 72px; +} + +.title { + mragin-bottom: 0.5em; +} + +.author, .version { + font-size: 0.75em; + opacity: 0.5; +} diff --git a/js/src/views/Dapps/Summary/summary.js b/js/src/views/Dapps/Summary/summary.js index a9dbf129706..572ee70799b 100644 --- a/js/src/views/Dapps/Summary/summary.js +++ b/js/src/views/Dapps/Summary/summary.js @@ -17,7 +17,7 @@ import React, { Component, PropTypes } from 'react'; import { Link } from 'react-router'; -import Container, { Title } from '../../../ui/Container'; +import { Container, ContainerTitle } from '../../../ui'; import styles from './summary.css'; @@ -28,7 +28,6 @@ export default class Summary extends Component { static propTypes = { app: PropTypes.object.isRequired, - tokens: PropTypes.object, children: PropTypes.node } @@ -39,18 +38,22 @@ export default class Summary extends Component { return null; } - const url = `/app/${app.url}`; + const url = `/app/${app.local ? 'local' : 'global'}/${app.url}`; const image = app.image ? <img src={ app.image } className={ styles.image } /> : <div className={ styles.image }> </div>; return ( - <Container> + <Container className={ styles.container }> { image } - <Title - title={ <Link to={ url }>{ app.name }</Link> } - byline={ app.description } /> - { this.props.children } + <div className={ styles.description }> + <ContainerTitle + className={ styles.title } + title={ <Link to={ url }>{ app.name }</Link> } + byline={ app.description } /> + <div className={ styles.author }>{ app.author }, v{ app.version }</div> + { this.props.children } + </div> </Container> ); } diff --git a/js/src/views/Dapps/dapps.css b/js/src/views/Dapps/dapps.css index 769d9ac4a0e..46cb0e9d457 100644 --- a/js/src/views/Dapps/dapps.css +++ b/js/src/views/Dapps/dapps.css @@ -19,6 +19,10 @@ flex-wrap: wrap; } +.list+.list { + margin-top: -0.25em; +} + .item { flex: 0 1 50%; width: 50%; diff --git a/js/src/views/Dapps/dapps.js b/js/src/views/Dapps/dapps.js index 6edde29f00e..c2f9bc806db 100644 --- a/js/src/views/Dapps/dapps.js +++ b/js/src/views/Dapps/dapps.js @@ -15,8 +15,6 @@ // along with Parity. If not, see <http://www.gnu.org/licenses/>. import React, { Component, PropTypes } from 'react'; -import { connect } from 'react-redux'; -import { bindActionCreators } from 'redux'; import { sha3 } from '../../api/util/sha3'; import Contracts from '../../contracts'; @@ -31,32 +29,44 @@ const APPS = [ { name: 'Token Deployment', description: 'Deploy new basic tokens that you are able to send around', - url: 'basiccoin' + author: 'Ethcore <admin@ethcore.io>', + url: 'basiccoin', + version: '1.0.0' }, { name: 'GAVcoin', description: 'Manage your GAVcoins, the hottest new property in crypto', - url: 'gavcoin' + author: 'Ethcore <admin@ethcore.io>', + url: 'gavcoin', + version: '1.0.0' }, { name: 'Registry', description: 'A global registry of addresses on the network', - url: 'registry' + author: 'Ethcore <admin@ethcore.io>', + url: 'registry', + version: '1.0.0' }, { name: 'Token Registry', description: 'A registry of transactable tokens on the network', - url: 'tokenreg' + author: 'Ethcore <admin@ethcore.io>', + url: 'tokenreg', + version: '1.0.0' }, { name: 'Method Registry', description: 'A registry of method signatures for lookups on transactions', - url: 'signaturereg' + author: 'Ethcore <admin@ethcore.io>', + url: 'signaturereg', + version: '1.0.0' }, { name: 'GitHub Hint', description: 'A mapping of GitHub URLs to hashes for use in contracts as references', - url: 'githubhint' + author: 'Ethcore <admin@ethcore.io>', + url: 'githubhint', + version: '1.0.0' } ]; @@ -65,18 +75,14 @@ APPS.forEach((app) => { console.log(`dapps ${app.id} -> ${app.url}`); }); -class Dapps extends Component { +export default class Dapps extends Component { static contextTypes = { api: PropTypes.object.isRequired } - static propTypes = { - tokens: PropTypes.object - } - state = { - apps: APPS, - local: [] + globalApps: APPS, + localApps: [] } componentDidMount () { @@ -91,35 +97,50 @@ class Dapps extends Component { title='Decentralized Applications' /> <Page> <div className={ styles.list }> - { this.renderApps() } + { this.renderGlobalApps() } + </div> + <div className={ styles.list }> + { this.renderLocalApps() } </div> </Page> </div> ); } - renderApps () { - const { tokens } = this.props; - const { apps } = this.state; - - return apps.map((app, idx) => { - return ( - <div - className={ styles.item } - key={ app.url }> - <Summary - app={ app } - tokens={ tokens } /> - </div> - ); - }); + renderApp = (app) => { + return ( + <div + className={ styles.item } + key={ app.url }> + <Summary app={ app } /> + </div> + ); + } + + renderGlobalApps () { + const { globalApps } = this.state; + + return globalApps.map(this.renderApp); + } + + renderLocalApps () { + const { localApps } = this.state; + + return localApps.map(this.renderApp); } loadLocalApps () { fetch(`http://${window.location.host}/api/apps`, { method: 'GET' }) .then((response) => response.ok ? response.json() : []) - .then((apps) => { - console.log('loadLocalApps', apps); + .then((_localApps) => { + const localApps = _localApps.map((app) => { + app.image = `/app/${app.id}/${app.iconUrl}`; + app.url = app.id; + app.local = true; + return app; + }); + console.log('loadLocalApps', localApps); + this.setState({ localApps }); }) .catch((error) => { console.error('loadLocalApps', error); @@ -127,36 +148,19 @@ class Dapps extends Component { } loadImages () { - const { apps } = this.state; + const { globalApps } = this.state; const { dappReg } = Contracts.get(); Promise - .all(apps.map((app) => dappReg.getImage(app.id))) + .all(globalApps.map((app) => dappReg.getImage(app.id))) .then((images) => { - apps.forEach((app, index) => { + globalApps.forEach((app, index) => { app.image = hashToImageUrl(images[index]); }); - this.setState({ apps }); + this.setState({ globalApps }); }) .catch((error) => { console.error('loadImages', error); }); } } - -function mapStateToProps (state) { - const { tokens } = state.balances; - - return { - tokens - }; -} - -function mapDispatchToProps (dispatch) { - return bindActionCreators({}, dispatch); -} - -export default connect( - mapStateToProps, - mapDispatchToProps -)(Dapps); diff --git a/js/webpack.config.js b/js/webpack.config.js index fbd454e0700..11f4650ee4f 100644 --- a/js/webpack.config.js +++ b/js/webpack.config.js @@ -204,6 +204,13 @@ module.exports = { target: 'http://127.0.0.1:8080', changeOrigin: true }, + '/app/*': { + target: 'http://127.0.0.1:8080', + changeOrigin: true, + pathRewrite: { + '^/app': '' + } + }, '/rpc/*': { target: 'http://localhost:8080', changeOrigin: true From 13f25bcc3c778a34e77d8bb3e39737bb1db0dd26 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 12 Oct 2016 09:52:16 +0200 Subject: [PATCH 1021/1062] filter apps that has been replaced --- js/src/views/Dapps/dapps.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/js/src/views/Dapps/dapps.js b/js/src/views/Dapps/dapps.js index c2f9bc806db..b06b2efc8b0 100644 --- a/js/src/views/Dapps/dapps.js +++ b/js/src/views/Dapps/dapps.js @@ -133,12 +133,14 @@ export default class Dapps extends Component { fetch(`http://${window.location.host}/api/apps`, { method: 'GET' }) .then((response) => response.ok ? response.json() : []) .then((_localApps) => { - const localApps = _localApps.map((app) => { - app.image = `/app/${app.id}/${app.iconUrl}`; - app.url = app.id; - app.local = true; - return app; - }); + const localApps = _localApps + .filter((app) => !['home', 'status', 'parity', 'wallet'].includes(app.id)) + .map((app) => { + app.image = `/app/${app.id}/${app.iconUrl}`; + app.url = app.id; + app.local = true; + return app; + }); console.log('loadLocalApps', localApps); this.setState({ localApps }); }) From b1e9d91cce0f5204ec74f9dc7aaf111b42dc573d Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 12 Oct 2016 09:57:15 +0200 Subject: [PATCH 1022/1062] proxy entry for parity-utils --- js/webpack.config.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/js/webpack.config.js b/js/webpack.config.js index 11f4650ee4f..cbae9b9ac65 100644 --- a/js/webpack.config.js +++ b/js/webpack.config.js @@ -211,6 +211,10 @@ module.exports = { '^/app': '' } }, + '/parity-utils/*': { + target: 'http://127.0.0.1:8080', + changeOrigin: true + }, '/rpc/*': { target: 'http://localhost:8080', changeOrigin: true From f19a9f344d65ddb531dc55dfdb79457feaabd494 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 12 Oct 2016 11:03:57 +0200 Subject: [PATCH 1023/1062] add basiccoin abi --- js/src/contracts/abi/basiccoin.json | 1 + js/src/contracts/abi/index.js | 2 ++ 2 files changed, 3 insertions(+) create mode 100644 js/src/contracts/abi/basiccoin.json diff --git a/js/src/contracts/abi/basiccoin.json b/js/src/contracts/abi/basiccoin.json new file mode 100644 index 00000000000..0bdc66666fc --- /dev/null +++ b/js/src/contracts/abi/basiccoin.json @@ -0,0 +1 @@ +[{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_new","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"base","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_who","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[{"name":"_totalSupply","type":"uint256"},{"name":"_owner","type":"address"}],"type":"constructor"},{"payable":false,"type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"old","type":"address"},{"indexed":true,"name":"current","type":"address"}],"name":"NewOwner","type":"event"}] diff --git a/js/src/contracts/abi/index.js b/js/src/contracts/abi/index.js index 8789e133923..599f8a13b4a 100644 --- a/js/src/contracts/abi/index.js +++ b/js/src/contracts/abi/index.js @@ -14,6 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see <http://www.gnu.org/licenses/>. +import basiccoin from './basiccoin.json'; import basiccoinmanager from './basiccoinmanager.json'; import dappreg from './dappreg.json'; import eip20 from './eip20.json'; @@ -25,6 +26,7 @@ import signaturereg from './signaturereg.json'; import tokenreg from './tokenreg.json'; export { + basiccoin, basiccoinmanager, dappreg, eip20, From 796bd4f0b074e3b17163ee333b6392183ccd2fee Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 12 Oct 2016 11:53:45 +0200 Subject: [PATCH 1024/1062] add support for fallback abi type --- js/src/abi/spec/interface.js | 1 + 1 file changed, 1 insertion(+) diff --git a/js/src/abi/spec/interface.js b/js/src/abi/spec/interface.js index 4a5b8176e3a..1ea32e9a9c4 100644 --- a/js/src/abi/spec/interface.js +++ b/js/src/abi/spec/interface.js @@ -62,6 +62,7 @@ export default class Interface { return new Event(item); case 'function': + case 'fallback': return new Func(item); default: From ea9031cd4e39f77b43532278974f6edd1be5240b Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 12 Oct 2016 11:58:26 +0200 Subject: [PATCH 1025/1062] capture constructor paramaters --- .../DeployContract/DetailsStep/detailsStep.js | 132 +++++++++++++++++- .../modals/DeployContract/deployContract.css | 4 + .../modals/DeployContract/deployContract.js | 13 +- 3 files changed, 139 insertions(+), 10 deletions(-) diff --git a/js/src/modals/DeployContract/DetailsStep/detailsStep.js b/js/src/modals/DeployContract/DetailsStep/detailsStep.js index a2d6a07c5f4..af2c346f79f 100644 --- a/js/src/modals/DeployContract/DetailsStep/detailsStep.js +++ b/js/src/modals/DeployContract/DetailsStep/detailsStep.js @@ -16,9 +16,16 @@ import React, { Component, PropTypes } from 'react'; -import { Form, Input, AddressSelect } from '../../../ui'; +import { AddressSelect, Form, Input, InputAddressSelect } from '../../../ui'; +import { validateAbi } from '../../../util/validation'; + +import styles from '../deployContract.css'; export default class DetailsStep extends Component { + static contextTypes = { + api: PropTypes.object.isRequired + } + static propTypes = { accounts: PropTypes.object.isRequired, abi: PropTypes.string, @@ -31,16 +38,23 @@ export default class DetailsStep extends Component { fromAddressError: PropTypes.string, name: PropTypes.string, nameError: PropTypes.string, + params: PropTypes.array, + paramsError: PropTypes.array, onAbiChange: PropTypes.func.isRequired, onCodeChange: PropTypes.func.isRequired, onFromAddressChange: PropTypes.func.isRequired, onDescriptionChange: PropTypes.func.isRequired, - onNameChange: PropTypes.func.isRequired + onNameChange: PropTypes.func.isRequired, + onParamsChange: PropTypes.func.isRequired + } + + state = { + inputs: [] } render () { const { accounts } = this.props; - const { abi, abiError, code, codeError, onAbiChange, onCodeChange, fromAddress, fromAddressError, name, nameError, onFromAddressChange, onNameChange } = this.props; + const { abi, abiError, code, codeError, fromAddress, fromAddressError, name, nameError } = this.props; return ( <Form> @@ -50,26 +64,130 @@ export default class DetailsStep extends Component { value={ fromAddress } error={ fromAddressError } accounts={ accounts } - onChange={ onFromAddressChange } /> + onChange={ this.onFromAddressChange } /> <Input label='contract name' hint='a name for the deployed contract' error={ nameError } value={ name } - onSubmit={ onNameChange } /> + onSubmit={ this.onNameChange } /> <Input label='abi' hint='the abi of the contract to deploy' error={ abiError } value={ abi } - onSubmit={ onAbiChange } /> + onSubmit={ this.onAbiChange } /> <Input label='code' hint='the compiled code of the contract to deploy' error={ codeError } value={ code } - onSubmit={ onCodeChange } /> + onSubmit={ this.onCodeChange } /> + { this.renderConstructorInputs() } </Form> ); } + + renderConstructorInputs () { + const { accounts, params, paramsError } = this.props; + const { inputs } = this.state; + + if (!inputs || !inputs.length) { + return null; + } + + return inputs.map((input, index) => { + const onChange = (event, value) => this.onParamChange(index, value); + const onSubmit = (value) => this.onParamChange(index, value); + const label = `${input.name}: ${input.type}`; + let inputBox = null; + + switch (input.type) { + case 'address': + inputBox = ( + <InputAddressSelect + accounts={ accounts } + editing + label={ label } + value={ params[index] } + error={ paramsError[index] } + onChange={ onChange } /> + ); + break; + + default: + inputBox = ( + <Input + label={ label } + value={ params[index] } + error={ paramsError[index] } + onSubmit={ onSubmit } /> + ); + break; + } + + return ( + <div key={ index } className={ styles.funcparams }> + { inputBox } + </div> + ); + }); + } + + onFromAddressChange = (fromAddress) => { + const { onFromAddressChange } = this.props; + + onFromAddressChange(fromAddress); + } + + onNameChange = (name) => { + const { onNameChange } = this.props; + + onNameChange(name); + } + + onParamChange = (index, value) => { + console.log('***', index, value); + const { params, onParamsChange } = this.props; + + params[index] = value; + onParamsChange(params); + } + + onAbiChange = (abi) => { + const { api } = this.context; + const { onAbiChange, onParamsChange } = this.props; + const { abiError, abiParsed } = validateAbi(abi, api); + + if (!abiError) { + const { inputs } = abiParsed.find((method) => method.type === 'constructor') || { inputs: [] }; + const params = []; + + inputs.forEach((input) => { + switch (input.type) { + case 'string': + params.push(''); + break; + + default: + params.push('0x'); + break; + } + }); + + onParamsChange(params); + this.setState({ inputs }); + } else { + onParamsChange([]); + this.setState({ inputs: [] }); + } + + onAbiChange(abi); + } + + onCodeChange = (code) => { + const { onCodeChange } = this.props; + + onCodeChange(code); + } } diff --git a/js/src/modals/DeployContract/deployContract.css b/js/src/modals/DeployContract/deployContract.css index a42b351fab6..45fd7a852ee 100644 --- a/js/src/modals/DeployContract/deployContract.css +++ b/js/src/modals/DeployContract/deployContract.css @@ -27,3 +27,7 @@ .identityicon { margin: -8px 0.5em; } + +.funcparams { + padding-left: 3em; +} diff --git a/js/src/modals/DeployContract/deployContract.js b/js/src/modals/DeployContract/deployContract.js index 6eb4c2f4dbd..25a65641861 100644 --- a/js/src/modals/DeployContract/deployContract.js +++ b/js/src/modals/DeployContract/deployContract.js @@ -51,6 +51,8 @@ export default class DeployContract extends Component { fromAddressError: null, name: '', nameError: ERRORS.invalidName, + params: [], + paramsError: [], step: 0, deployError: null } @@ -132,7 +134,8 @@ export default class DeployContract extends Component { onCodeChange={ this.onCodeChange } onFromAddressChange={ this.onFromAddressChange } onDescriptionChange={ this.onDescriptionChange } - onNameChange={ this.onNameChange } /> + onNameChange={ this.onNameChange } + onParamsChange={ this.onParamsChange } /> ); case 1: @@ -178,6 +181,10 @@ export default class DeployContract extends Component { this.setState(validateName(name)); } + onParamsChange = (params) => { + this.setState({ params }); + } + onAbiChange = (abi) => { const { api } = this.context; @@ -192,7 +199,7 @@ export default class DeployContract extends Component { onDeployStart = () => { const { api, store } = this.context; - const { abiParsed, code, description, name, fromAddress } = this.state; + const { abiParsed, code, description, name, params, fromAddress } = this.state; const options = { data: code, from: fromAddress @@ -202,7 +209,7 @@ export default class DeployContract extends Component { api .newContract(abiParsed) - .deploy(options, null, this.onDeploymentState) + .deploy(options, params, this.onDeploymentState) .then((address) => { return Promise.all([ api.personal.setAccountName(address, name), From cfcfa81bd26f1b3cbc748d3afa1eb5c670b363fe Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 12 Oct 2016 12:01:47 +0200 Subject: [PATCH 1026/1062] merge master into js --- ethcore/res/ethereum/tests | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ethcore/res/ethereum/tests b/ethcore/res/ethereum/tests index 8f07dbc8294..ac5475d6765 160000 --- a/ethcore/res/ethereum/tests +++ b/ethcore/res/ethereum/tests @@ -1 +1 @@ -Subproject commit 8f07dbc8294a32db5ebe8098925fcefc2eab3e71 +Subproject commit ac5475d676536cb945f98e9ff98384c01abd0599 From 98d059d5470c7dd07a802bb7339927d21ee38d2f Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 12 Oct 2016 13:15:06 +0200 Subject: [PATCH 1027/1062] move images to assets/images/ --- .../images/contracts/ethereum-black-64x64.png | Bin .../images/contracts/ethereum-black.png | Bin .../images/contracts/ethereum-white.png | Bin .../images/contracts/gavcoin-64x64.png | Bin .../images/contracts/gavcoin.png | Bin .../images/contracts/unknown-64x64.png | Bin .../images/contracts/unknown.png | Bin js/assets/images/dapps/blocks-350.jpg | Bin 0 -> 235011 bytes js/{src => assets}/images/dapps/signature.png | Bin .../images/ethcore-block-blue.png | Bin js/{src => assets}/images/ethcore-block.png | Bin .../images/ethcore-logo-white-square.png | Bin js/{src => assets}/images/parity-x56.png | Bin js/{src => assets}/images/parity.xcf | Bin js/{src => assets}/images/paritybar.png | Bin js/{src => assets}/images/shapeshift-btn.png | Bin js/{src => assets}/images/shapeshift-logo.png | Bin js/src/dapps/signaturereg/Header/header.js | 2 +- .../images => images/dapps}/blocks-350.png | Bin js/src/modals/FirstRun/Welcome/welcome.js | 2 +- js/src/modals/Shapeshift/shapeshift.js | 2 +- js/src/modals/Transfer/Details/details.js | 2 +- js/src/redux/providers/balances.js | 2 +- js/src/ui/Balance/balance.js | 2 +- js/src/views/Account/account.js | 2 +- js/src/views/Application/TabBar/tabBar.js | 2 +- js/src/views/ParityBar/parityBar.js | 2 +- 27 files changed, 9 insertions(+), 9 deletions(-) rename js/{src => assets}/images/contracts/ethereum-black-64x64.png (100%) rename js/{src => assets}/images/contracts/ethereum-black.png (100%) rename js/{src => assets}/images/contracts/ethereum-white.png (100%) rename js/{src => assets}/images/contracts/gavcoin-64x64.png (100%) rename js/{src => assets}/images/contracts/gavcoin.png (100%) rename js/{src => assets}/images/contracts/unknown-64x64.png (100%) rename js/{src => assets}/images/contracts/unknown.png (100%) create mode 100644 js/assets/images/dapps/blocks-350.jpg rename js/{src => assets}/images/dapps/signature.png (100%) rename js/{src => assets}/images/ethcore-block-blue.png (100%) rename js/{src => assets}/images/ethcore-block.png (100%) rename js/{src => assets}/images/ethcore-logo-white-square.png (100%) rename js/{src => assets}/images/parity-x56.png (100%) rename js/{src => assets}/images/parity.xcf (100%) rename js/{src => assets}/images/paritybar.png (100%) rename js/{src => assets}/images/shapeshift-btn.png (100%) rename js/{src => assets}/images/shapeshift-logo.png (100%) rename js/src/{dapps/signaturereg/images => images/dapps}/blocks-350.png (100%) diff --git a/js/src/images/contracts/ethereum-black-64x64.png b/js/assets/images/contracts/ethereum-black-64x64.png similarity index 100% rename from js/src/images/contracts/ethereum-black-64x64.png rename to js/assets/images/contracts/ethereum-black-64x64.png diff --git a/js/src/images/contracts/ethereum-black.png b/js/assets/images/contracts/ethereum-black.png similarity index 100% rename from js/src/images/contracts/ethereum-black.png rename to js/assets/images/contracts/ethereum-black.png diff --git a/js/src/images/contracts/ethereum-white.png b/js/assets/images/contracts/ethereum-white.png similarity index 100% rename from js/src/images/contracts/ethereum-white.png rename to js/assets/images/contracts/ethereum-white.png diff --git a/js/src/images/contracts/gavcoin-64x64.png b/js/assets/images/contracts/gavcoin-64x64.png similarity index 100% rename from js/src/images/contracts/gavcoin-64x64.png rename to js/assets/images/contracts/gavcoin-64x64.png diff --git a/js/src/images/contracts/gavcoin.png b/js/assets/images/contracts/gavcoin.png similarity index 100% rename from js/src/images/contracts/gavcoin.png rename to js/assets/images/contracts/gavcoin.png diff --git a/js/src/images/contracts/unknown-64x64.png b/js/assets/images/contracts/unknown-64x64.png similarity index 100% rename from js/src/images/contracts/unknown-64x64.png rename to js/assets/images/contracts/unknown-64x64.png diff --git a/js/src/images/contracts/unknown.png b/js/assets/images/contracts/unknown.png similarity index 100% rename from js/src/images/contracts/unknown.png rename to js/assets/images/contracts/unknown.png diff --git a/js/assets/images/dapps/blocks-350.jpg b/js/assets/images/dapps/blocks-350.jpg new file mode 100644 index 0000000000000000000000000000000000000000..524f9267c50777c162f3f2081933716329926907 GIT binary patch literal 235011 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%0Drq7Wa>^NahS0gIYJ-XegNw8;$7>Dy?*IL>SO! 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 literal 0 HcmV?d00001 diff --git a/js/src/images/dapps/signature.png b/js/assets/images/dapps/signature.png similarity index 100% rename from js/src/images/dapps/signature.png rename to js/assets/images/dapps/signature.png diff --git a/js/src/images/ethcore-block-blue.png b/js/assets/images/ethcore-block-blue.png similarity index 100% rename from js/src/images/ethcore-block-blue.png rename to js/assets/images/ethcore-block-blue.png diff --git a/js/src/images/ethcore-block.png b/js/assets/images/ethcore-block.png similarity index 100% rename from js/src/images/ethcore-block.png rename to js/assets/images/ethcore-block.png diff --git a/js/src/images/ethcore-logo-white-square.png b/js/assets/images/ethcore-logo-white-square.png similarity index 100% rename from js/src/images/ethcore-logo-white-square.png rename to js/assets/images/ethcore-logo-white-square.png diff --git a/js/src/images/parity-x56.png b/js/assets/images/parity-x56.png similarity index 100% rename from js/src/images/parity-x56.png rename to js/assets/images/parity-x56.png diff --git a/js/src/images/parity.xcf b/js/assets/images/parity.xcf similarity index 100% rename from js/src/images/parity.xcf rename to js/assets/images/parity.xcf diff --git a/js/src/images/paritybar.png b/js/assets/images/paritybar.png similarity index 100% rename from js/src/images/paritybar.png rename to js/assets/images/paritybar.png diff --git a/js/src/images/shapeshift-btn.png b/js/assets/images/shapeshift-btn.png similarity index 100% rename from js/src/images/shapeshift-btn.png rename to js/assets/images/shapeshift-btn.png diff --git a/js/src/images/shapeshift-logo.png b/js/assets/images/shapeshift-logo.png similarity index 100% rename from js/src/images/shapeshift-logo.png rename to js/assets/images/shapeshift-logo.png diff --git a/js/src/dapps/signaturereg/Header/header.js b/js/src/dapps/signaturereg/Header/header.js index 7087e4237ff..8dd7cd578a5 100644 --- a/js/src/dapps/signaturereg/Header/header.js +++ b/js/src/dapps/signaturereg/Header/header.js @@ -17,7 +17,7 @@ import React, { Component, PropTypes } from 'react'; import styles from './header.css'; -import blocks from '../images/blocks-350.png'; +import blocks from '../../../../assets/images/dapps/blocks-350.jpg'; export default class Header extends Component { static propTypes = { diff --git a/js/src/dapps/signaturereg/images/blocks-350.png b/js/src/images/dapps/blocks-350.png similarity index 100% rename from js/src/dapps/signaturereg/images/blocks-350.png rename to js/src/images/dapps/blocks-350.png diff --git a/js/src/modals/FirstRun/Welcome/welcome.js b/js/src/modals/FirstRun/Welcome/welcome.js index 3afc62bed87..ae804317f79 100644 --- a/js/src/modals/FirstRun/Welcome/welcome.js +++ b/js/src/modals/FirstRun/Welcome/welcome.js @@ -16,7 +16,7 @@ import React, { Component } from 'react'; -import imagesEthcore from '../../../images/ethcore-logo-white-square.png'; +import imagesEthcore from '../../../../assets/images/ethcore-logo-white-square.png'; const LOGO_STYLE = { float: 'right', diff --git a/js/src/modals/Shapeshift/shapeshift.js b/js/src/modals/Shapeshift/shapeshift.js index 582f6c9f8b7..ba3252398d3 100644 --- a/js/src/modals/Shapeshift/shapeshift.js +++ b/js/src/modals/Shapeshift/shapeshift.js @@ -20,7 +20,7 @@ import ContentClear from 'material-ui/svg-icons/content/clear'; import { Button, IdentityIcon, Modal } from '../../ui'; import initShapeshift from '../../3rdparty/shapeshift'; -import shapeshiftLogo from '../../images/shapeshift-logo.png'; +import shapeshiftLogo from '../../../assets/images/shapeshift-logo.png'; import AwaitingDepositStep from './AwaitingDepositStep'; import AwaitingExchangeStep from './AwaitingExchangeStep'; diff --git a/js/src/modals/Transfer/Details/details.js b/js/src/modals/Transfer/Details/details.js index 6fdd9eaa68e..55896f0c75a 100644 --- a/js/src/modals/Transfer/Details/details.js +++ b/js/src/modals/Transfer/Details/details.js @@ -20,7 +20,7 @@ import { Checkbox, MenuItem } from 'material-ui'; import Form, { Input, InputAddressSelect, Select } from '../../../ui/Form'; -import imageUnknown from '../../../images/contracts/unknown-64x64.png'; +import imageUnknown from '../../../../assets/images/contracts/unknown-64x64.png'; import styles from '../transfer.css'; const CHECK_STYLE = { diff --git a/js/src/redux/providers/balances.js b/js/src/redux/providers/balances.js index 3c3e22d75a3..b88883fb736 100644 --- a/js/src/redux/providers/balances.js +++ b/js/src/redux/providers/balances.js @@ -19,7 +19,7 @@ import { setAddressImage } from './imagesActions'; import * as abis from '../../contracts/abi'; -import imagesEthereum from '../../images/contracts/ethereum-black-64x64.png'; +import imagesEthereum from '../../../assets/images/contracts/ethereum-black-64x64.png'; const ETH = { name: 'Ethereum', diff --git a/js/src/ui/Balance/balance.js b/js/src/ui/Balance/balance.js index 9c18849cb1e..b9df3e9fb76 100644 --- a/js/src/ui/Balance/balance.js +++ b/js/src/ui/Balance/balance.js @@ -19,7 +19,7 @@ import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; -import unknownImage from '../../images/contracts/unknown-64x64.png'; +import unknownImage from '../../../assets/images/contracts/unknown-64x64.png'; import styles from './balance.css'; class Balance extends Component { diff --git a/js/src/views/Account/account.js b/js/src/views/Account/account.js index 0470653643a..10fcd9f3ce8 100644 --- a/js/src/views/Account/account.js +++ b/js/src/views/Account/account.js @@ -23,7 +23,7 @@ import ContentSend from 'material-ui/svg-icons/content/send'; import { EditMeta, Shapeshift, Transfer } from '../../modals'; import { Actionbar, Button, Page } from '../../ui'; -import shapeshiftBtn from '../../images/shapeshift-btn.png'; +import shapeshiftBtn from '../../../assets/images/shapeshift-btn.png'; import Header from './Header'; import Transactions from './Transactions'; diff --git a/js/src/views/Application/TabBar/tabBar.js b/js/src/views/Application/TabBar/tabBar.js index 7a4c7450c20..bb690942234 100644 --- a/js/src/views/Application/TabBar/tabBar.js +++ b/js/src/views/Application/TabBar/tabBar.js @@ -23,7 +23,7 @@ import { Tabs, Tab } from 'material-ui/Tabs'; import { Badge, ParityBackground, Tooltip } from '../../../ui'; import styles from './tabBar.css'; -import imagesEthcoreBlock from '../../../images/ethcore-block.png'; +import imagesEthcoreBlock from '../../../../assets/images/ethcore-block.png'; const TABMAP = { accounts: 'account', diff --git a/js/src/views/ParityBar/parityBar.js b/js/src/views/ParityBar/parityBar.js index de48b76e813..2bf80889d20 100644 --- a/js/src/views/ParityBar/parityBar.js +++ b/js/src/views/ParityBar/parityBar.js @@ -23,7 +23,7 @@ import ContentClear from 'material-ui/svg-icons/content/clear'; import { Badge, Button, ContainerTitle, ParityBackground, SignerIcon } from '../../ui'; import { Embedded as Signer } from '../Signer'; -import imagesEthcoreBlock from '../../images/ethcore-block.png'; +import imagesEthcoreBlock from '../../../assets/images/ethcore-block.png'; import styles from './parityBar.css'; class ParityBar extends Component { From 8ed6712a46a10fc2e8e324de591c3f8c98984da3 Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 12 Oct 2016 13:43:04 +0200 Subject: [PATCH 1028/1062] add font assets --- js/assets/fonts/Roboto/LICENSE.txt | 202 ++++++++++++++++++ js/assets/fonts/Roboto/font.css | 56 +++++ js/assets/fonts/Roboto/ttf/Roboto-Black.ttf | Bin 0 -> 163488 bytes .../fonts/Roboto/ttf/Roboto-BlackItalic.ttf | Bin 0 -> 165444 bytes js/assets/fonts/Roboto/ttf/Roboto-Bold.ttf | Bin 0 -> 162464 bytes .../fonts/Roboto/ttf/Roboto-BoldItalic.ttf | Bin 0 -> 163644 bytes js/assets/fonts/Roboto/ttf/Roboto-Italic.ttf | Bin 0 -> 161484 bytes js/assets/fonts/Roboto/ttf/Roboto-Light.ttf | Bin 0 -> 162420 bytes .../fonts/Roboto/ttf/Roboto-LightItalic.ttf | Bin 0 -> 166492 bytes js/assets/fonts/Roboto/ttf/Roboto-Medium.ttf | Bin 0 -> 162588 bytes .../fonts/Roboto/ttf/Roboto-MediumItalic.ttf | Bin 0 -> 165636 bytes js/assets/fonts/Roboto/ttf/Roboto-Regular.ttf | Bin 0 -> 162876 bytes js/assets/fonts/Roboto/ttf/Roboto-Thin.ttf | Bin 0 -> 163132 bytes .../fonts/Roboto/ttf/Roboto-ThinItalic.ttf | Bin 0 -> 168276 bytes ...6m6pUHB-5mXQQnYX0hVgzZQUfRDuZrPvH3D8.woff2 | Bin 0 -> 788 bytes ...6luXEYWpBSJvXCIX0hVgzZQUfRDuZrPvH3D8.woff2 | Bin 0 -> 10824 bytes ...OxyyTHEGMXX8kcYX0hVgzZQUfRDuZrPvH3D8.woff2 | Bin 0 -> 6832 bytes ...tfSpn0qi1SFdUfZBw1xU1rKptJj_0jans920.woff2 | Bin 0 -> 10324 bytes ...Sg9YCurV6PUkTOYX0hVgzZQUfRDuZrPvH3D8.woff2 | Bin 0 -> 5176 bytes ...4gIq26G5XYbHsFIX0hVgzZQUfRDuZrPvH3D8.woff2 | Bin 0 -> 3036 bytes ...ShpZSmG3z6VYwnYX0hVgzZQUfRDuZrPvH3D8.woff2 | Bin 0 -> 8040 bytes js/assets/fonts/RobotoMono/LICENSE.txt | 202 ++++++++++++++++++ js/assets/fonts/RobotoMono/font.css | 56 +++++ .../fonts/RobotoMono/ttf/RobotoMono-Bold.ttf | Bin 0 -> 114752 bytes .../RobotoMono/ttf/RobotoMono-BoldItalic.ttf | Bin 0 -> 122808 bytes .../RobotoMono/ttf/RobotoMono-Italic.ttf | Bin 0 -> 120832 bytes .../fonts/RobotoMono/ttf/RobotoMono-Light.ttf | Bin 0 -> 118976 bytes .../RobotoMono/ttf/RobotoMono-LightItalic.ttf | Bin 0 -> 127568 bytes .../RobotoMono/ttf/RobotoMono-Medium.ttf | Bin 0 -> 114696 bytes .../ttf/RobotoMono-MediumItalic.ttf | Bin 0 -> 123640 bytes .../RobotoMono/ttf/RobotoMono-Regular.ttf | Bin 0 -> 114624 bytes .../fonts/RobotoMono/ttf/RobotoMono-Thin.ttf | Bin 0 -> 118132 bytes .../RobotoMono/ttf/RobotoMono-ThinItalic.ttf | Bin 0 -> 121456 bytes ...C58uwPiY8_59Fz-pRBTtN4E2_qSPBnw6AgMc.woff2 | Bin 0 -> 3516 bytes ...C58uwPiY8_59Fz0ExlR2MysFCBK8OirNw2kM.woff2 | Bin 0 -> 12108 bytes ...C58uwPiY8_59Fz2MSHb9EAJwuSzGfuRChQzQ.woff2 | Bin 0 -> 5264 bytes ...C58uwPiY8_59Fz2dsm03krrxlabhmVQFB99s.woff2 | Bin 0 -> 6712 bytes ...C58uwPiY8_59Fz9Dnm4qiMZlH5rhYv_7LI2Y.woff2 | Bin 0 -> 8136 bytes ...C58uwPiY8_59Fz9TIkQYohD4BpHvJ3NvbHoA.woff2 | Bin 0 -> 11032 bytes ...C58uwPiY8_59FzyJ0caWjaSBdV-xZbEgst_k.woff2 | Bin 0 -> 740 bytes 40 files changed, 516 insertions(+) create mode 100755 js/assets/fonts/Roboto/LICENSE.txt create mode 100644 js/assets/fonts/Roboto/font.css create mode 100755 js/assets/fonts/Roboto/ttf/Roboto-Black.ttf create mode 100755 js/assets/fonts/Roboto/ttf/Roboto-BlackItalic.ttf create mode 100755 js/assets/fonts/Roboto/ttf/Roboto-Bold.ttf create mode 100755 js/assets/fonts/Roboto/ttf/Roboto-BoldItalic.ttf create mode 100755 js/assets/fonts/Roboto/ttf/Roboto-Italic.ttf create mode 100755 js/assets/fonts/Roboto/ttf/Roboto-Light.ttf create mode 100755 js/assets/fonts/Roboto/ttf/Roboto-LightItalic.ttf create mode 100755 js/assets/fonts/Roboto/ttf/Roboto-Medium.ttf create mode 100755 js/assets/fonts/Roboto/ttf/Roboto-MediumItalic.ttf create mode 100755 js/assets/fonts/Roboto/ttf/Roboto-Regular.ttf create mode 100755 js/assets/fonts/Roboto/ttf/Roboto-Thin.ttf create mode 100755 js/assets/fonts/Roboto/ttf/Roboto-ThinItalic.ttf create mode 100644 js/assets/fonts/Roboto/v15/-L14Jk06m6pUHB-5mXQQnYX0hVgzZQUfRDuZrPvH3D8.woff2 create mode 100644 js/assets/fonts/Roboto/v15/0eC6fl06luXEYWpBSJvXCIX0hVgzZQUfRDuZrPvH3D8.woff2 create mode 100644 js/assets/fonts/Roboto/v15/Fl4y0QdOxyyTHEGMXX8kcYX0hVgzZQUfRDuZrPvH3D8.woff2 create mode 100644 js/assets/fonts/Roboto/v15/Hgo13k-tfSpn0qi1SFdUfZBw1xU1rKptJj_0jans920.woff2 create mode 100644 js/assets/fonts/Roboto/v15/I3S1wsgSg9YCurV6PUkTOYX0hVgzZQUfRDuZrPvH3D8.woff2 create mode 100644 js/assets/fonts/Roboto/v15/NYDWBdD4gIq26G5XYbHsFIX0hVgzZQUfRDuZrPvH3D8.woff2 create mode 100644 js/assets/fonts/Roboto/v15/Pru33qjShpZSmG3z6VYwnYX0hVgzZQUfRDuZrPvH3D8.woff2 create mode 100755 js/assets/fonts/RobotoMono/LICENSE.txt create mode 100644 js/assets/fonts/RobotoMono/font.css create mode 100755 js/assets/fonts/RobotoMono/ttf/RobotoMono-Bold.ttf create mode 100755 js/assets/fonts/RobotoMono/ttf/RobotoMono-BoldItalic.ttf create mode 100755 js/assets/fonts/RobotoMono/ttf/RobotoMono-Italic.ttf create mode 100755 js/assets/fonts/RobotoMono/ttf/RobotoMono-Light.ttf create mode 100755 js/assets/fonts/RobotoMono/ttf/RobotoMono-LightItalic.ttf create mode 100755 js/assets/fonts/RobotoMono/ttf/RobotoMono-Medium.ttf create mode 100755 js/assets/fonts/RobotoMono/ttf/RobotoMono-MediumItalic.ttf create mode 100755 js/assets/fonts/RobotoMono/ttf/RobotoMono-Regular.ttf create mode 100755 js/assets/fonts/RobotoMono/ttf/RobotoMono-Thin.ttf create mode 100755 js/assets/fonts/RobotoMono/ttf/RobotoMono-ThinItalic.ttf create mode 100644 js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz-pRBTtN4E2_qSPBnw6AgMc.woff2 create mode 100644 js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz0ExlR2MysFCBK8OirNw2kM.woff2 create mode 100644 js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz2MSHb9EAJwuSzGfuRChQzQ.woff2 create mode 100644 js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz2dsm03krrxlabhmVQFB99s.woff2 create mode 100644 js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz9Dnm4qiMZlH5rhYv_7LI2Y.woff2 create mode 100644 js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz9TIkQYohD4BpHvJ3NvbHoA.woff2 create mode 100644 js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59FzyJ0caWjaSBdV-xZbEgst_k.woff2 diff --git a/js/assets/fonts/Roboto/LICENSE.txt b/js/assets/fonts/Roboto/LICENSE.txt new file mode 100755 index 00000000000..75b52484ea4 --- /dev/null +++ b/js/assets/fonts/Roboto/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/js/assets/fonts/Roboto/font.css b/js/assets/fonts/Roboto/font.css new file mode 100644 index 00000000000..75226e62185 --- /dev/null +++ b/js/assets/fonts/Roboto/font.css @@ -0,0 +1,56 @@ +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + src: local('Roboto Light'), local('Roboto-Light'), url(./v15/0eC6fl06luXEYWpBSJvXCIX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2'); + unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + src: local('Roboto Light'), local('Roboto-Light'), url(./v15/Fl4y0QdOxyyTHEGMXX8kcYX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + src: local('Roboto Light'), local('Roboto-Light'), url(./v15/-L14Jk06m6pUHB-5mXQQnYX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + src: local('Roboto Light'), local('Roboto-Light'), url(./v15/I3S1wsgSg9YCurV6PUkTOYX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + src: local('Roboto Light'), local('Roboto-Light'), url(./v15/NYDWBdD4gIq26G5XYbHsFIX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2'); + unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + src: local('Roboto Light'), local('Roboto-Light'), url(./v15/Pru33qjShpZSmG3z6VYwnYX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2'); + unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + src: local('Roboto Light'), local('Roboto-Light'), url(./v15/Hgo13k-tfSpn0qi1SFdUfZBw1xU1rKptJj_0jans920.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; +} diff --git a/js/assets/fonts/Roboto/ttf/Roboto-Black.ttf b/js/assets/fonts/Roboto/ttf/Roboto-Black.ttf new file mode 100755 index 0000000000000000000000000000000000000000..fbde625d403cc1fe3be06e15ae90c448c013eee5 GIT binary patch literal 163488 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%0Da2vjx1R*A2K(2Xs$lp|U%Rpv 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 RlaLSiI;{f(T?y`Heg+E#ii`jN literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/ttf/Roboto-BlackItalic.ttf b/js/assets/fonts/Roboto/ttf/Roboto-BlackItalic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..60f7782a2e4aba9bbc96d7634799eaa05512c927 GIT binary patch literal 165444 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 bZNDaUay2eAgb$hIBl`Mb^wLHKd(3|VcXI0u literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/ttf/Roboto-Bold.ttf b/js/assets/fonts/Roboto/ttf/Roboto-Bold.ttf new file mode 100755 index 0000000000000000000000000000000000000000..a355c27cde02b13da43c30ae060c5fb164b36b76 GIT binary patch literal 162464 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/ttf/Roboto-BoldItalic.ttf b/js/assets/fonts/Roboto/ttf/Roboto-BoldItalic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..3c9a7a37361b6ae0571b33f09b6b55367e188cfe GIT binary patch literal 163644 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Ω6O=>jz^-Y{ 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/ttf/Roboto-Italic.ttf b/js/assets/fonts/Roboto/ttf/Roboto-Italic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..ff6046d5bfa7cd4498ad4a549d2d9028f6c73372 GIT binary patch literal 161484 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/ttf/Roboto-Light.ttf b/js/assets/fonts/Roboto/ttf/Roboto-Light.ttf new file mode 100755 index 0000000000000000000000000000000000000000..94c6bcc67e09602f6d90ac10f449b5c05c2f7021 GIT binary patch literal 162420 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/ttf/Roboto-LightItalic.ttf b/js/assets/fonts/Roboto/ttf/Roboto-LightItalic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..04cc002302024c4e032d32319f0d40a32b54aada GIT binary patch literal 166492 zcmb@v2Ut``^fx^1?$XOr6@>*9EFdTfvG?9fY_Wg^dso2TODxgYTP)ESTjIL*XzT?$ z#)2KN#R6&))0EwPe{(OpLjKA7f1mI9*8KL|JNMqXXU?2C=ggT|LMS1`8()HWHEz?o zebxmJ55hu95YqNm<MyA{Yq7RWHetix5mKyw>-I5~Hq<xWC4{cTQ;EHYBn__<(PShc z#Rn5&Nbj98+Q`?J#kH8NxZW;#c)uZ|{tVecNOWa9bEIF=sNuwk_@I6-TzBg?cx>`- zdxHcaRZkQ8$k@NnkTiD}cf8AQ3K+`m-#4kxUqg2&cozJS`2HwxTVm*i^A0#K)qlw7 zv{2W-599nVLVV^79@aa_Z|2H)yg#21=d(kS(uV5|`~a?};eO-Lq#=D91dcvQSkMzf zxZChyqek13NFTz2-^%O5NA?{)bJ37ELMq7fgG9=P5%NmEykSqz8o!euClnBJ`mJ{b zNi*)X`tp5s%T4Ear%|}iS>CID@SJ|I)eSs|_tmY#ah=dT1=my}9?81#y@>de&O}k) zM2Lrc9lK0)IOqH?8igxFS*?I08lq8tjU>z0*k46RHgU1FA)%8|7%D4o+`4sRS)a|K zBUVC^^{W{%61rYq6V((GPK<={<!HAHiU68dfD0s^H6S;{0un1akrv8Xa#UoHnzS1^ z%BGW{>`U7W{wWzL29XwYmTf1iN22KyQh|rq*5Lkuq7!ukjR2|wLBKQs<zz1)%a+g` zq$FKn+bI}nE<Pp0g(r#Ui^xvBku(#JZM(%q(p2#!6O<6rRE!4t;k+}MtIQ!ySrF+h zT9e}94a!4FQ{4$%n-4T2Y2unnM~gp6Be97@i=AYTQi_Zh*U1*0jhqnYZP&#v^1b-p z_L@E;9=sSiL!a4(^9H0l?`@mK>XJW2B~ltZMhj=sSac<y3O7=ZttFF0XJQa7NCkS1 zRHs+1xja)l*1aNSL`zaZ^d|L1C)-oegLGtDAdkOD1vZCt!nFbX3>l$3Axn6M?GpdN zwiWahTTQCb<0PD|wxuauNeVq~`yd*S9%8KRcja5+2HsoJLxhPVw&y&F3SBKSoR1|J z`4Y&oA(^hLPX_U><UaeG{4OF$Np_p`15#L3a$9t><?<iM=k!;yi{{z(q5Kt}LoV<y zNU*YvJXD^O44oI*#8=y%>Vs^XL~-H``IQx$NfWW0l+~>!f$0AcViaj1x{;b9+4e%| zP2%Wj^j{rPS(GBhm@5fU#zM~BNQ}N2>8P(l8qmw6s**+qvZc0YWfYk#dXd^nJIH@I z89+0vPa)IFJdt|vDm0XTM(*>r)RUg0zHB6UPe0fW@PXtq`wMOA3k%_5Sxa23{-EVR z-HA*7&p-~Nv@$<QgJj!8JJL)UX*;IWhkU(lw?q=rLq}SPB-;&TIZ0H8kZ+(vuA)Eb zC^p$F{1%x4erpNnEWZc-x<SV$kcq4Zbf>lL6u(2-h^^4=ZnmFAES~8~>Ox27;dq$R zjdX?%_R|f6zD^>ai8zv|D@D318DyVQmP~T0X1nAxkTlmd!TEIP@pDp7*=k#-duZDx zz9rGn(U!_Y+X<A9P%e{p$`aB*sZ3t#tCGh0uB5Tfm89xsVmw?R^-<qYeQ}Z`(rvlW z_4;U6b>5m(5fg2T6{~F<bgQgLCh-_IRYZT=8D&4Irk<k={oW6K+*ypl_3~u4t`dpY zH9$M_NH66fsV*u4v81N13!bTK%ab~d^A5V5wjXte@Jx4{qaIxznW!5=hT>Yh?r%JM zm3$)1wu2(fwo`YPj8-0zF1qd{MwvxooraJkeRb%DlkE+^XuB)>LkuCcF&=mG2V@G) zAyZOU_k>K<)qvdWb^nHORSa@IOFl(EM*!$=YdBDgxV*0pG{gI=iC;)VF$iO;8L7vI zp)E5>GyV+p5@{f+lgheQBtt1fM(Xd8M#@$atN)GE(`_NK$`vwJY$3gL=g20d1nH*4 zkcXlbF)1-rr#wSHt|K989bu%hG7YkaK1lr)(@^g;!o_IY5MJGu1RXKzijgqgUeZxl zj+hlE+!IYM@jS9kKhJho*VJ}NzlyZdje;$>34Q0}Gi5f}D6C`}`m!h6L9)3G{s3Oh zPTBXc-|%{{s|4~UtSpYDeZHyLV^*C+ODKV4n@&%@;9uBg(Lv-Ou$Cs;HiF(`-N+%9 zNWNxGZR?>Y<HP{luWUZq%ojrU1gS?}U~H}>J6RX-(1p138Me2u1p|01=sxU>juCHN zZ_>=E3~7Wh9IpHhyVnUev^#0aZ=mlL5}}0Ktcqg$O*ux+@hzmLl&!cyei6TuNy>Y2 zQMa4yguU1Tdz2&6NORcRQevj<8<9%B6OBj%r<$ZYqt@4A0Q5uJdS<&Lyod|`oit;V z^n$M$PaoO-#JHOzs^EG9GD(-B0rqH;t^+A6{geK0+qX_tNH_izy3~`Dp_i>Wbg}I* zUqHk7U|O7y0Q!>~{2kB-{I?<}aIH8!N#2VZw(X)ci4utz-~C7w+7`vralVpt6DLR% zy#>8GNEA^Q<%>v^at+tc01IJD%Br*(bgvxx)lay>Rt$yCMv?K5-x3jSJ1pFxXD+rZ zmPx{ZRF-Lb2g*VJ1T6!U0_p?Kz$d&7nax&HqX@O_7hjT3l?dpbjkMx-Nkzp4^c1Ox zclq;QY`+OVjOq2@A<DK#<p-2cv)vQh!0RPjhEj)gL4V8=7l{w-$#B_5y|eA8J^<~g z23~QWC`V$%E88OF9o`p00-*CTD61rv*^WXV+laTgrwZw!{7Ry9RdM_ZJPpG=C4p`j zUtuWgXv+~g!gR5yqXnK_LMkCJ>8Y$BJw-LNe~|64&Vct<A$@=-Wd!<rA*rFh4|0@k z;X8<remm-#VtXb!Lf8D^KaxljK7w3=e$*8`Fvk1B2f4vUcSij+$#i83nFYJs3ifik zvXso?C&?MyTT_)uBij_Q+ja{&y$l!#tN~U4`+*6-4$<CrO$3r8-7NIwbiDIE8B8Bo zpVDgp{24uM8>{*?=!cAfWITiS#z=^P@PCLQ;K#kxxJ1S#{{k7SsBwynRSF>El)`}h zS7Q_zrxXF=6B(n}p~fdN2Kg_@xCAjtVQB4;ZPDO}M`TP=7>Gq=JYt6$iy$6R+a%v7 z+g6CG?ZW&1lgjw)En+0uX35k4LS+nxel`3jMSLgyk(3+S;#ok870{|I$hL}}vkjBy zx`CuO;@9dj7F1&k#Dg*>lQE%;(KHHO#X0M)owH4(y6gujpMO%dOvaFqm+YUyRK}AG zF`Y(j-#g9`V{*iKGS>XRQcZ_C73h*iO{A0TbJ-XFuT;jcGLDowBKyuB%gT6C#<Yd0 zjO%0^hqjc(7_KS$*)FJ%_DkBs{{rlXY9FPIEP%9+h2gM`(moc3w2Ory?PB5gNc&qD zc3WKNUGkl(U6!`l4$VfF1P_rKAGV2-7Pi^aZrh>qC+)Z0hTD0RHrx(r%L_xw#g4*l zD0Hmad)cM}doOLi3OR0WlK>?b@%&`itsZ2g;$z#1Ia>%~%QEV?!kk7OALu8?JO(=Z z&-shg5w%}2SCM+I9?SR@c1gx3YOIQQRE@*s*p{(A<`;5qfots%FAY=2Jg6G0$}x#J zS?Z{)PpwnVpWtuQITYei2Y>QD+>f!*QsoQdQMFYvrj~OnY3C$=avmk^gdFoS4wZb! zxeshb!Tjcuyv7l;%5kC2nWSyPyh+Ba@*cY`|C7r0%IoTU6Z25Ml*G&NE#n@^lRDqB z+o=Lx?R+RQ-bajXk2{@8lKRd9{fhV-e3VuBm-bV>19Jh@jvzjlF|{fed%XqJK8Eae zO_8x7<}ea6u9wd_>W0juETrsIYPTT;v9MyNi0#owHRU`&9mD^ia!#Pe?U)Ow@j7HJ z`xbMNPu2MY;{AWx>Hpu){}(%Mm&bomDNE^#Kto}#|NN&t{eM2U&msRe`cFGrFz2+- zJ^zc^b?tx9H2AbM;;D`i=&KyBs-8pl<@`$Ozw8rxU)iY~XB;|j*A2%UL(Z`<uT#-Z z&gEbOd@xpClZFm`DR_rE?l7No^tGm|o$T*a?La@<BRMBPtX?$FG6=q5GU9T(pDplp z4*e+TSM-Yq;-2mHez5y9yB`uOZ2b^VHkEl0H3uVgPx^XE3w*S+9jd>zQ`PU<{<e=% zv`h7~(r&1>LG_`wUmU*D?h}!lk@idGXe71U1G_&{7TFA{5Am{H5f<AcX0W{$s}NT< zwN1lZtE74jv772Qq&+T(=VdIf#_`hj%NSnTc4@Z}uS?${kL5FJ90@<5`ISOGMaIPi z^9Fg3T0i1uwNAW4^?Ne5mUT;?ChM1Tfe_?Q<n=_-R=z`xgYle<vlSVu+igriU!WiU z#Eg$(7Wl;31rtKX7*`a%!Z;WBVnT6z7{j4((kVKf0x(6VIN?w|Q=D*3-Y)PoKKN!# zFj=Z_lnK4SCC2d-9%JgcqQ?c!aS`tnLZ{aYCtSqK@sT$&yugX+INl*2!AHJ<b1;k# zs>i$KHTkW8QT&I><kONrRHN7HoSpT!jCxT3>ZI2zIFtA4<(=|D`AWTdI|`g|(Md1= z1Ms+$dL8#T>7DerQ+v1ioO~7T&^e<{RS=SK$&XsQyjwWwol%H)bH!P4=8z!6tdnz{ z9&JXe(RheQN1Y*U$Xl;>#*1}AJ|UbH9bSo3)aNWk4>@s3QKl!(&gdS9Tl;92!4LXN zNH(;OJi<E)KC)|2FRGXSB$Kk~QpS>KPwAv6aEdehS8yab5a36BMt*}mR3s}Ys9L>S zwg?U6@+o|2A9=ehx1Y<4g+A&dj&mr1DnQ3~p_?6LYIX8Ch8|>K1Mft?t6GBl3-04k z8>tNTf4ISZi*^SD4gS^3YR5X5&=d{Te=KnvsnS-@R0i-gK8~wJ4jl57q5yN?jOnDB z;G<Tp4is&?$b0cVDI<9w?vgwfeDDG&J}yI><UgqfIM;ej_JtyxT{JCaPI`<PsjE^B zk`xsv`X2wJ0zt+8^Pm02b}F0t-**?jQXp-$W_c{HNwzgvsP6`IvXN5m+CZ0_s`o(x zpsJ(_id0?I8j1^eLhVqkRjPpihp2`XR3uFVDpC6bN7_rZM&OOAXyuZHG#?Tr@D01C zQe=2^bBNGk4T-!YQ?U9m5J!x-lSyO)*-5@5$H-Z7l{_PFh!t65Z(5p0(pcJ__N4vj zBs!Tcq>JfBYNBtcjRmm;)`cBm=h%7nfc?fPMu{``<l%fSpU)Tbjoic!@$>u&|B2rc zrA3TrC|ZkNVwe~!W{E2zQ{;%>6{>hCKEX7&cJR#LUxI%N{yU_l(bec}^fLw<!;F!} zSYw>Anz4qlfpN5PvT?I<yK$#+xA6z#kD*GaPpE%rSZG9Oh0q>hEKC>X8D<D89u^!{ zKCDStVp!kO7hbbJPJIwoo6TZFX0V{GMznP!+WI{?PR@}G@-ul$Y}AVyXap@oE7A@$ zk@hcW>jt_DZGF!I3)*@XZM}`Q!nhT*bq3n{1z*B9@!k9fet};@TZxDev7(V^BYKPB zVw{*Gu8P~@k@y3h=p9UgYXwgU-Vpq2@H@1X7`==>#sH(ySQ>4uWUT6F>n7tC;|{d- zknu>7wtiO7R_{V>?Sr;bw3VW*`DiP8-1dj<3EgZvNmtrV!1c`oW&zWHDZnHk1xT~` z*>pBx{nPrA{vbtU?PIM^-dHj%w=C(FJ(h1RTPzzbYb~Fn#tXLd@(znLj<@Gq^4}AZ ze+bwOYymdlX=Gomzu>qjAy2=5I`nDC(^gORJZ<r`Th3=Woe0V4kkdY=ZBEn2V{+;~ z9+LA(j&nA8CL1fA**CMVWM9snl|42)HG6Q@lI*1HDp`vk?#P;zH8X2c*7&SpS?#lG zWL3R)(`UU)mTnW<L3gQ|Em`{bK}`f}jub0=v`isLO)vDJ1L^2Or$r8FFL{bPq`cN? zm*{>RW08+V08N0-z$4&S3^QGk$JG<8u>8x1J;xKk|CbMI&RVdRtQBj`+K{QNG5d^l zW8GN~){`ZYX=FM}V!c>z)(7i4GssMq%=)qZYyca`29a6Fgr=}mmd3`iacn%9Lq2B{ z*hDsoO=eTbT-FFV<aub-e71|3*luQKd)QvGfbC=Z*#UNt9b!MQ!|Vw8f-Gb|vZL%6 zJI+q9lk5~$Rlj7X*%@{gRv?|7CyU7vjE_6)J}kmRmc^Q~W~?n6%>HD5vA@}Sc8g`Q zyX>AEeY_pn#oO}^Sm!ih1*049&U+9u@5vJp|0nTYWH0Yc_94r>pZDd-<N)tS4w6H> zKOevc@<DtsAHs+7VdNAa!AFwQd^kA++jWkllk?;PR`5oVOXM;v&{%Sfk0U?v@q7ZG z$S0BO<OaFPr(m>BCAauAlF6s@8RRyfN$!xl<Q|{JCu7ZQHlM>khaH=T(Y=5?AP+Id z7b4UDlDs0h$bjUL*W?ZV5|-l^@+<j`FDCC`1D2BC`7-hcU(U^Z1*Lo?WqcK1&DZd? zlv6<!{uSTD*HInSQzy}l@8$cbKMkOPv>4yd55QU;guN{zl3*o2qh)D1TAoJHXwhBt zpcQD0=qNhD#vB$+L{nJhilV1Tq?Kr#XeOG|%CriNrwQ~ET9qH+KZ+KjB|plKi2-7u zXeC<HYP34+QCnJr)}*yWS6Z9a5uHUBew?4cN?%=CPxKT0X?@xNHmi?lC)$g?BAGVi zm-!`F@T)unmhC6nh&C1-#Hajc{+u?UP5BG{QVbG<X*2#x4B@#vj}D*%Vd00;$)Yix zNw6}H?FV(_H^vVFZ^uXaB<ZK@aL2KP^jSs#_KC>*H)y~L27%Qk@KS{I2ENn48iHb# z2cC<NVZd?V461DodbR*lLC*nKQQi(TLj!9JdJVXR^3Omsf!n||;12Kr<w>9qfh=GK zkPSRVc{1p;0?Y#a8F+*8A)s<kgT!nAwvhaRa@blT=OEH9%mMxeEGVA<3cI3WE-0)a z^+Y*%rd}FYBT#P*7^#FBfYP{UF=&JaBJF#m25FyE+ZT&_w&1v;1~MPC5|DuMU7(+6 zAPYdN0(DTn540{&54?N<S|5NdXFq~A1EgFRfwlnJqWm-{WJ=qkT=LTa=!x<RposwF z#~@Q_Q)you-v><w`r#P$(*6MYnq`Ad)<BkmF4RDlfy#OTvK({+uo1^AKxG?DI9>(% zRs-J-3cn=5z#sjffei-5UKI-YGV}ur1d0K&?~4OL0DK3NvH{2%&@LLtTF@gJu)0Fn zS>PP*`3m&B2C^O$?PSmyvH|or4FvL+D$Oarz6HgJI<?yd>a2l)XO2FXAgG^*YmmAQ z+eBcSRDI{Oa4Z3N^Vu2*WPn`<gwF-g2ONE@q9Z8!50;7WPQVfXa)qrWuu+7s0J;Gy zH4rl><j7Y8=s%A3OOQRFXg^0=Ir@^X(?IruqRlFLgKp43pg$b_qoNP!CJkgi=w{#> zpf4ch0+0isQZ5qxfUN*z16xmIUvkMWbcF8)4x#)9P&<a<_^<|Y3KV_Bp{H2sBK)WZ zavJnl0fvJf2hO6NGoa@RFbXssKwrXZ5Pku;0*nT(0Y9N!o<mn8r2P;e5|TfGzLkKl zA=t^FLfRE%zE!~g5P_Q|2<pO$FA+|-e>^C309g$JzeJE>Rl%o#!WK%%b_)*;@K^+y zT@})1VTD%(yciMQ8l(*q2EYf;P6zeXAnh7fIaNq~!m1z<fq3s7&|(^-Zef>-3V1;x zf;5o(pe2AX)Hxe894Linq3fcw2B~Wz0*FC*7HF&ncuj)c5JXf)`3ul08sI~ThzCAF zc^+t04e+VhI|bB4`CHIh8l)bJ+8W3^&^ka}@UsN8o(A$eXnhS*$Fa(-LfT)^Py=5M z+6ZWk`u_xNqk)@2+iH+wL$uRCW#6{fAjgX6pn=MM{uJm89#(;N0X~C$k$v7xgB&xW zy9T}ow1);chD1*w3HR$jdlf)F*Bcmya;X=?ff1;GFX%{M49aD{r2wfY-w&FmL5>YE zRs%l>Ds^ra?w9>J2lyPvk)W^>Vjh5Z3)l)3;2S%Uh=A;ASx_l!DObt+QUJ1~6+orz zq-;6@QWj{p9E)N#um)%XtOd|+8Vf4hxgL;h-2iMvc_q-VflWX&U^B1{<&{A(-i5S( zM?iN1-vKRv?}1$?KMHCBb^`+dGa%*K3Xn3|hkB}kO1T^WWZz0zfJa&b^l$;Xg35RN zh;pe@vfg7rXW%$+67Q1q6mS~%)CD~QoCW#;=K$CX=^Mp)0QN%dw~L^cfOf!T;0n+e zxC&&VPFde=4OHsm9SvOGdshRO&));GaKC&$8_2=Cq|QD9en<Ir&_94bfeyf5z~3nU z8T38y0r$(k$OkMae*tO*Y``Gwb0iw1KUb&*{tA=<UU;@SsJ8~}Fd~Wp@IgJfgaqT+ zU_8UoC&9G<$dB&?odV3n@p{k=z%Mv{4f-qa8;-vLeFuO~QHPL_mKtQ=8wucw_kIS7 z_Z#tU86Oz&PNOf5(bq;l4RUN40{}3B)hc4d!^SWij{+?XMB+FFG*$y03t9<?0}tPV zRt2izo^hbi2?^<MjIb3FbOPvT4Rj*tWDPP#F>ca;)mLJK-b%=r#kd84?$RlsJ2Z&K zppc6M;$UKg&Pvc(pof4Ta6B9I2q5+Fb8ISAG|0JnDB3PT=Y#rdpbJ3JRtfqAXoLoW z`a&ycka1He<QUom_bejVDx-le1=VRF;3Lda1I5@5gS^Ag$8<SpaSe1OC}b=_SAmw- zKv#o8w<PEq&_oS%EodL0FUr3nq%_8a1cg4lhQ7Q8A9MpkVT=I@`ZXaRQ2s&S7;?1Q zG*HOVmJdL0=?)W#YHo6F(|I?gUvxQ0Z8J>`O73>%J$po(Xq3^|a6khSO^i0NC=)Fg z8g1fH#zrPyx>38%;a!Y#jdPp!nQLrh?4Q)fBuc9k7y8ca5@R%x_MHddyF=$tQ=KkB zj>EoPx>Soc30V!Ez}<7Zpn`z~6@aQmF_vhP64l&j;t_2+x9x12(jdrGr$LvX&`@JT z)A2T)O~)Gqg?8x@ZPGb-1g{eZ1Zv#sqfEMT(IzLYhW4FJb%IQ!%iOuLzV@BNLrqiW z&JCK27TC{^7d<~n$v+F~6fS@S8Xlxm+Mp_s@X#Px5FQ#H3J$w8h&DM#HE-X!Ay^Cr zi!M>7$cE7-*C<mN5Vxq^k#vr6Zu`!M>L9%7eb9-_>CpKQiR90RcL_3ugIVL8gI<tZ zL78l&dz7ipoP$Qvwe#*Wq(RUjQieZofO5C;CQ_c5sVgf_&2ALm2i&T~mJK!#r}E?g z9nz&?rII*2z$W!;^ND)IQxcoUt4CsbpH|h>Bc*XQ?U4hzFH^f!3ztvm9nU(otyj5p zfGl&a8dIvcmppQD+~;bqkC@%v^<YQq1+&SUjxx9LrlZYM<kxU-I>zi-5@o|m(lMkQ z=})?nMADILAg#zy%$m|c6J;bxe65MZm#raQwyMP4x`G&ZD0aS9BfjvTUW$qM>H>+M z?l|$neA1v7s;R|e_#`_1EhmR)b$W)4M5;cRx8ReIi@3vo7jB}mXfDhmNBKlKilp#h z-BZ0mzr`uoshm^1Q-7yLPDh=~IX`j<by?x^!L^0!m#!Dw;@#5RmbhJX_jHeQpYDFb zBg$if$4k#<p2s|2dBuA5^xET<?;Y)(>^<LmllKMh-wYmx@`eLGrF|y*{NkJFd&sY` z-x9xc|Kk2h{uBKF2xt<pB`_#(Vc@l5^@^=7_NsXC;zNt?FaCE>rJ%_{%Y&Yks90h| ziCZP>mox_l23HM!7!nY2-dNw*+BhUMHnef*qR^kh%7m>C`!T#&c!Tid@U7uDN|h;9 zxm2rC{Yy<N^;_wr((59kBW6eZ9eKG-pE5_w)+oEPoKLw5<tCInU*5TVa`}v?p3yGR zwWIe}C{<x|jBm_{m|L-KvEyU6#b(6buIN;;e8uF7%PMA8a;?<7QvXV`DlM#ZveI91 zfpJyhX2vau+Z*?|a{tQ9D!;5!yh`UPx8tkC??{MEFeg0yWZ)-ntG2KDb+wRcZL4jm z9#MT#^+z?D)i_X-)NE1nc&(^f+iF*;y|_+^Iy36(>rSnwua{VFeZ3F$JJdhZpk;$O z4Q@0n-f&67tBw2{b!_x?BWvU2#s`{IY;v(_`KH^Nm2cLr+4klk%{MpCY7y6BQj7GK z0WBN19Nj9kRhL#9T4lE`(|UUAyf(GloNU{*?GNp0wmaRvcKiJu!a5{%`03NypYG|{ zwBy50<vWe*^mFIVov(Lk(dALsQJ)q2>{z#2-M;VkTla+S`+7w6WIb;sc1wJk)F^2~ z(v76Iy`p;6@71+;yWU6oMD_Wyuc2?FzGM2PCwnFjPrlhNrr)A|5Bpc^zo`HH0iy@} zHL%&hF9$vw6hCOfU@~~@;7ddNhD;sudT8>{qr?1%l^#}k*vw&Xhff;*VZ@LTKaKok z<eE`*RPRwIM@NjFF#6({&@rpVT>Q^}*T>u&^K{JH6eT4rrFKe>lo=_DQr4ziOEsjX zrmjuhntCubBkf39X4<>4`msS{lg2(Dw`6>o@s%fpO;|KBWa7C=l_ss4^xNb?Qv#>V zof<K9_SCo2=rqH$@M)E&nWo*IZkS$nde0e7Gg{6#FysA9_nF3-U1tuNxpwBUnHOip z%~~`&e)gp~tv{!q(|LjOCe7P1KX!iN{FM0*7gS!5x*+e1CSQE{#odL$3u`W%u<+%g zhKs&jl=-FSmuX)f`trtN*TwA@r!Ky*L@Y^OvTteN(y>e5EDKuJW7&dbIm^o}|7`iv z<#{WDR*YQnVr8Y3YgXx3RbF*qb;RnLtCy^4y5`i{N^2*rJ^PjOS1rG~w66NP{p)hp z`>$WP{`dyZ4fQt6-eBFBwDI!S6~ErH$+&6PX5Ho{o4?s?`DW}EWlQ}nOSU}xw)D5X zzTNiitF51GUAlF{)?c?JZ~Jrmr`uQWh}bcI$FDm(d`G`?|E||}yT8|e-}3u2yP|e2 zH+h;i?2g-g!`#ArY){ah*?Si5dA&Dj@3nok_FdQ?wSU$Amj~J%IC|ja!TJYB9K3p{ z*rDh{bq}>a)bG&PLyHb={=xN!N<aK~xZ>f(hgTo|`tbI{`wstjq&)t`9ohJ!=Z|B4 zJbbkD(HckFA02pf>d{q4cOU)n==r1BNB=zLaV+9k&0`&o4LUac*s^0gkDWSp_t-DT zosS!jCme5eJo)&<<4ce4IDYc@o#Vfpa6aL8BJ{*3Ct9EAdt$<g1t->>*molRMAnHv zPP(5gb+Y=&_9q9PoO*KQNz=)5Cm){t{gm6O@Ke=JZ9CoJ^q|wzPOmz>>-5>v4^F>3 z<8mhSOvN)z&U865=*+}3OV4aMTjK2Qv*~B=p3ObS&J{Zsd#>@h9_I$0n|f~Lx$Wmp zoV$JQO}Z|<WP0WF+Ud>GlhTKzk4;~c{%!i6^keC_(x0clJ5SF0oiBa9%K3)pyPY3( ze)9Qw=f6IG==_=UndhIMe}BR4La7T07n)v3yfFAe+J%J|zPWJZ!u1O;FOrLH7XvSr zx)^)0-o^G8dtMxLG4<l~i>ohgxp?s6g^TwuzP>~*87`H+^vR{>mwH^fc)8)_ZkI=0 zo_l%2<vo`#T+X@t*A>qz5m#zlX@6zlm8n-&UNK!szjFP`(<^^ob-!BbYK^NMt|nd` ze0BQO)mKed&s}|R^|uU{jIfNV8ErE9WlYLgmhoN2>5O|Bzg}~>7J4n=TB~bEu3f+O z@+bOJ;7=8PYVcFnpGN%j{3q*mzw1%g>tAnuJ^A{?>r1cixW51TrR$Hczqz5@@V*go zBmPFq8(nS;zcKs9x*Pj%T)uJV#+#eEn<Z|RxmoLGvzv)G2j852bJ@+EH&5TpyjA~J z*IUDH&Azqn*1lU8Z{51}=+^67?=y9ohRop1s+n~&n`XAn?2?(3IUsXH=Ge@snV)BV znYk)+W9GKZ6Pb51-`>{W4!&LacB|VRZ}+&Je0%8al-pn2{^s_P+t+Wuyu<DkyEFIB z;yc^#nD6{>=h~g;ci!Il>n^$LbT{N~<lUIN33qGXZG5-&-A;FV-tBjH*xgxozqq^n zZr<JB?^^Ep-Yb7E?q2nK?eBedZ{)o>_txLrfA8|WC-?I2``#~qKjD7u`;G6nzu))% zkoz<4FS@_>{?_})?%%qf_dq;wd*J&Z>Oq4CZ60)c(Eq{c2U8x*f3Wny+6S8-m>wK? zaQZ>UgZmHOJtPmE9(p}2@vzLp$`5NiZ1OPiVcNqP4;Mb%^6<xpHy`Fb{5wm@a?kS1 z3eAens+!dxt4-EtS^cs`VjXI3*7B^4S-Z1NWL?g>la-T|m-TnHlI@*cGP`Vc-Rzdx zeX~boPt5*2ds+6z?A_TXvM*=f$$pysOSUD)Ima(2G^b)t-JF&=U2^*7jL4aoGbd+5 z&d!|EIahP;<vh#zHOKPE{ZWZWWgb<2ROeBPN1Y$_c{Kddghz88Eq%1%(T+z49-Vx2 z<<Xr-FCP8%SUmQ6T;g$=$CV$~dEDZ0=f`~>4}U!2@tns?A8&ZP^YOvQryplLzW@07 z<9AQU6SpUUPf9(BeNy8|lP4XX^nCK-$=^?vr`}IXJ}vvS%G0_}TR!dbwC~dqPbWV8 z{OPi%8=mfbdhqG#rx{OgKWq4G`?K7iEBw6t=f9piJr8_d>Ur$*8qb?N@9;eF`FGDP zFS@=s_~Q7BYcKA<c=96m#k&{zFU3o@m*Fp~y=?ok|H~;aSH3j8On;gE@~>B3ugbit z^Q!Z!;jiYrTKa0ktDUb7zB>IX<JJ9F&tJXECAo&&;M{V#@wxSKTjh4mP0k&e`+4rN z+>N>4<sQmClY1@qLGFv(cX=ewEiW*yR9<Xejl3p#9r6<M2Ir;a&B$Anw>EEc-p;(e zc}Mb2=UvLXk#|4uNnUQ=yS)6@;&s65vahSZZu$Dt*WF(af1UPv;p=Z+fA@Od>mOgA zd42!&lh?Vg-@VR%Bi^{Z@qJU`&HlF$Zx_8?`F8W${ckV5z412tZSLE@ei6T5W{P;O z59W(y5b1HEBhFag@Fc^`ZeHHrhN>nvFB8d--#Yc%S^aj;ASTkVvx&t7?Peuwbx}_U zPKbN0E@q?)@uV3uZ%OnTaZ-uN<-XZXD{$8en3u`per(0iQ14LgO|d%9L$T-+%F9@4 zu+#C@*VZ4X+Y`pER>~|E#q@r&qPI+BsUN&qnxzNpF^BaajKtgipu1K6JxGOrVa*+^ zxl7jcic9&<p|^wHburNl6OD<j=o9V}N8{t;;{Ej=EaJDJrU};Bta3<rG-s6>MA2m; z=>77rSQ;B18qK1S{>JYctFykCbP7nykC=FjiDf_#CVhs9dzqXvVk=UPIs@bv9nhd{ z^Q0>c+O<ehhFUMvGmESj=^0rIX7b`5I1VBqWTD2f8<=#n3)2fHUiK4J%wS&?b8%cL zF56PljX}N>OeJFi&4fGJB{EDU)!xFlYlg`+#_aU*qAR40GB1-M!{p>;@>TEk&oB`$ zQ=nQBEcp)w@8Jp9i2%fLi8y^YfO4FLvIEwei<6i9=}mQCS${Rq;AP3nY1H!MWe>bx zfAxo#_3tIgV`<bn>kYcvnoL)Br-u^h2CIrhYvb-H`;#6bl(ewLigLOIB$`Y#`&NiS zWBx@D&S<W)T@Xf`80~@x$4R&p1UEWMMe}ktf<RTxKGY!%?qv>ioSDn0cbbe|=JJk0 zv^PGYR76BVe0)MeoZjDGA08hO8G$Wl0sj60{@7Bb*M}!mU<q+LoW}EpuA{8?=ht^~ zf3zF(fz>O$Qaq+io^`;(dvQc|jjz4jpC1VA8#?;yX0EC3D;CT@M~C)aGG@fmURy4E zpT8LJ{Mf1=I9oeuW2b;_Q7NalT=6`5)OFOc)YWFj*2$50)b>oNp<KYKVGt=x5=eFO zx!I{kP1!K?7kUccWz_HT>h~uYiPd6EpTwxT!66cE7ghvLBBZdOmM$44ml(6RC?c1S zXAxeekPK5uj48s)9R0C4#LHaSafYE19}khpO=gi0SAZ&xgal1k7()MfO^KudS3Gx* zA2r)q@40*Ih<VOQ`gSeajr4GGYTvAFsvFJp{C?t?S-7|-ZPXm+M19+qZN_*w>07n# zFvivLM^iqgp;$3vmk`^h)L-zOU^^zWo}(B`>D8*|7{<mY=iiw2Jrmoew3>m7J14Uq zC>_(Mb<#*&?EAQi7=*#bNln{xF+w?qJwuVC5*cF-j;k!C8ti3q%aGp{3v8MWV$<1W z7=V)iyTbY6#8)buyDmT~oS#Ze0bb^k4s9}rYS+qX*K}UySjRPJTBKAnDJUovjfYC< z1HvO!amL5{_$Savxtmev@1qMyh=*juBXo3U>GrN}7gkJO>EwQUIZYTIJUDdK${9%~ z@9urz?!4~N&hM-zT`N}J;pM$%fP3$~6I`8own&`LOVnL8e&tanz8bS-d4Fr%(nIfe zK3%j`u%C7exnkMLSJ9iE;brH4K6af5OWimvX;||<42e66Uu@T-!&K|$W5%vFH1ng0 zE3j;|bM4Ps^i_sfZ_=Z9VyLw|`(2kryoi_C)7zjv;S6<zZKVM^#(V+{0s06Ykzg<o zmhHD8cc#Mp&xEHpDC^?7gF5Sy+6}R$SngV_^{m6Uv|L7Op1432=0=ASYMWs#%RF>F zi4W@5`TE(p@sM>hqK}L>_$0(fMzF{Pe*-pV(l^zu>5u(>w0<H2nKCjteC--H;l}D( z=UDEJYc-YT(N4bGHvCL$cW5!vTG^W2qaFAk$;R`~VTnD6Q8PaR-7HiE$S8(p1e%;d zonr#=&e91AjA7{j#YfM1B;9De7DHod_HRmCd0Mw_>9YELEB<P5(gZr%x^UvaQP$fv zXhrMwdQz?}$YN0*Ieb@AoS-u4Q=QQ!hi;g-YIvoI)yyuNNWb^Bw(pSE!P?cAe$zIM zJsEBdrjLfxpHQD|r}YgvL5>hT@g^px7_)FVw%Ce1Qnh3{@A{+s14sLZTHhqhnDNCT zBxNan$<c-x*glL0JjY_p)WHFo2Yb(mHQGS0vo<p2Nh;X>Aos{R{E9Nnthl<V@|S*J zHOi{#E%aJwc7o<bV|iS7sS2FMHHv8xUXjvDrNX0G1#rE_Hk}WFtT}oVqAe0b#8wOl zr*ZBhdD4i9I@Qw-#P34<mGj^<j5IR)g_pwnO@3bRv06tJaSit9LyFbc(I_~!LW485 zq5?af;A0@#5af(d2KCW%&DO^!_{7tTW4>-C^yOoy+nwFJb<DX;73;5*`Q7>YO6e$1 zozwV1%P*CW_3`B?kLM4jC9q|srXnnlo7A^jt*5M4@kb0w=oPEw59_nBJr=Iy`nP#B z4rzHx-C%?&EBg>(6}UMCdZyS7jh%fn(rdDrBF4-etuSL>HwqCYh5IN8rQ=xjv?tcS zel$NoDX}<ZpX@1Q&4m}Nn?L!~>>Lp2=qXRU#Pff=1dH<WC7xbpr;jgjQwz<$+BFEy z&v8x0X9=)ZnyuHzm(t{iK;f(W&plbnIUlbXQ|DhSJ}QuUoZNTL+xLm(G<%%HhMnIy zakCJIzM`l8Vj^?PnP-+ulH01V#lhefzkWAImMibz)&tyn*tvBCI@F`M<d(*mds5nc zZ)<GaWFyQm@>p)(WFt%-US_?6S+i@w{a)tCkA=RGR8~^l%N*(`loqPeKU<}fA%IRu z7pHlAv^s{-9ivuU_w<-Ob?&iZqy4Gt;XUbI&MRgP9p>U?eSP+a9FG*YujVgL_i$UZ z)Nc|m#@5Z6u~x9nbLpN(Og#8*u&GMq-n3)6Lj1gUmPv?ROQx)Jk;||Qeje-B7!xkA zKu!Neu~l;<#~O7O1!7>17MKu~QyJ%(opi3aYIav|Lc?UlCQS*AqoJ@?Rqq?_)lIEq z8RW#P&&t2c_@Y|$W?$<fI=nu&<d^1^+sl5LhQD6W3%ryd$!6b@!KhGUh@xMpy<hCX zG+ta-NA=WQvZqIw;jWiQ?nMTo-pgFv!M3@CdNV=_pHP@QctnF<M<DVlaWdx8x<voN z%+47sn`Wf0+H=z2Ykhxd_xTZQ{?wJny*%d6UNxQNveUz?zHJ$^emI+DeIrDcdBJ)i zZkt!15^_n9k%6|K`7`AR353t@WezJ-R`M0*W%4SpAnK^Iw@VGVRbTH_$Sj)m#H*lP zie4U>i#eKM^7@B1>BDsdtqEo_YLspr{@#FJG9j9TSC=i5P2-2%jF{K7T=`(s<`(YG zZR^fCvE{O-b7(EPp4PV>OL-9N?jAqASI;%Q-MwckM+PX?OzX?tf{njBHThVh#X`w4 zcRNGJ&~GfO*u1{|N1aMxtlz<r8?T`U_d=V7p$Bz{aa8kK#LB4sD4VDh={iziUMLNh zK0x%#zdDUa<!5>E4a%VR%amrxu-J0U#wh6|fP|A6GR0gbwxX0v8Fdzc@1O#i`axIx z>@syYifBI>qnn~JhNEeBa}2)rwvO%@je#8Gkf)hP2T2Kg21U!8VaY#^RT%z4!x;(= z2|ETV#3}=LX_k0F@GgbzQ|MTPx~`ZyaIll7^-0E&`<|}bmvrsy<WBX+c3!yav3}<2 zOi$0RK3{pex7)n5xko+lJ@bsHm$JKZ#e<^`KbJ~1`9zi2?fv#X5#nb4`l;ImJ2-Fp zCMI_ACSx`s?3|IZ7BMJvZi($3ehYIBI#)*OT-kE6DbP7XfqYycA6L74d~o6;2RCu` zku5K#5>v6l*5Bk)*c4;(R!AzU93tV=YB97OvlT{^@PxQ{Qd$n8DwUytQWGJTVJ*%M z7`eH*o9E}ZrtUnW;~_Pz<E=L;x|R8ZR<UM{yi~(u_T;4X1KeEW#;}b&2M9Lp-n1`& zo5{rUYr_v&S6Zhj{RIs<Bj$}8S8>NN!3Lci-gkFD?8+{Qx%WWqbcrB_H~3=<#6TAE zH8z`!P-st-N1|i~c3tU+%r#KboczpBW7mt0R5KI36IxwJQHwzoOs{&tBEgAN*pI;y z>;^WQCQ$tiHr(G*(wp}WWb>^z#?pz2bo@;8!EpLD{{t)I9Q>3fut_G4*?EkaI8@C9 zdn6oZ5F_-SOFYiM;lrao%fIQv%k!E8EguGg=Xmm%AIIMd(P7^HF=&y@evF^YieApg z@h3uxa7rbgG=W#PO!H&Ed*{y%V9RMtigjj^b;fjQqjuW<;42a31Y%ruHwTs~Eh`E1 zGL<aQmm-;fQ0Pmj)R!Pf;3Y#z5@Tjws!NAOa&|Ne_6d_4v%hM=(8gNA;lbmfE^-p0 z)AL#kM^KUo+TK0!Y}+`Ud%r=W*29;-+_Gwir{TzmfgvY&Y@;Z~D}{zf(ZxfzZ|&Ky z)`&%d%^pX$qzjS$_2F$jdv3Iv!(y1slTaFsb~UqB)qSTdB-Kb`%(lulX)4=Q*2~lo z?J5^ziqoP$N8H2XRQ}=5bTMXk?Zh4Tc$sT`OkenAnBox7F~>BvoR_)u$1`}G297fX zd$7OiTs1PnAln<jF%n=F3<>cJ0|S4>N@u`1X0nkHrC6291_A>j41T^$N43eV4{pOx zl`eN2p=-OUUAKWc*Oj?nv>a1)wv$q$=D-a}dR^*od)`_H+H|@Jzi$0@d%%iY$E?p* ztfRqn*u~Q{VDaSJ7FVTyz3w|Ar`2e;?m?I@>)UlmXU?Zg{EkjK&)6pwEhk$x?aIYw z8h`i)>a&0g>np31HTMVW?NwB?YuAO*Z)v@2S@aNX|2^j$tQRiavMxVCt0WHN%F^M? zDOxDjOK%9XVgG|@2g|QVB+*FI(vLG4d#+A(Z#YpWxl)gug{rj9g~x{3MJ<$rf+HlC zPJ#0UmT7lpa-T7@*jURD7PpA5wDw0jt_`Ey596#U-aZp=_ke#0AtTMjjG?l>i>di0 ze0vvYbCF2G(fP%w+W9bhF~#5=h83eD%mEHHHai6rla)aiyd8xy`Ur8H#a4{-QKUu} zIE8ThI!}x2N-J;<@uf>Qwb0eqZg{ya8sC4kv#0e{*023(k9C>e?h9sH*V5W+Pk9ux zUa($MOjJ3&bL6%t<Ds;pPuLO5PP%2u<dxV(&Q?#gxFBMqWCH#M$s<^JBWY!J3k?Hn znz+@#$ZpxyRE%ob-8t?sd#U6fK@qZ3A5#a?mLu%Mgak<y160wVkCX<SaC`8OAST6G z({oP!?95$)LJm{6jTtZ5*sWikwZ149ELhXU$=|<Bpl5SzIzio^v}$QOPvh5e?2x)c zcb$NqT($m|-ZkaIK(0G{1S3@T85#_I!CzA`d#JMpgwn`oYVG;gzLIixb;w=ziM!)W z?S)F<8*T_HgC2-CV0s=A3E_|5_SdigLj`M^^>O4KDpuux6UUtb&VB`fe`mdVV663; z^$Vr(hfq4-M(d8Ny5Wd`q$P)Yz@aN?ud!4lIpc_oU3F??j8tcgE7Yful^0&-!ohOk z`HrgIh(6T_G?ZVn4DQeVGUR_@;X`~Z9*Jxj`@!-(RD6KtUI8b2!HF}e_kS5%1;c5A zOc(rvjl$kbO|Z(qH<Vwp3{4$p;X{2a?!DPkw$;*EzVQOyIM?<<e1KmF!;H?T&V98P z7fBP_wd{XpJxe%x#T@1)HP93mQ)IxDb|{;HVCV#d%V-t4rcQ-Lg3LmQLCvhMwqMM5 zQ(TM1(C(C{ztyGbx39ireOflqh4CLYQaZPub*6#-{$0<$oKeG*cCEJH*Be6=@$AgX z?NGT4>mO_DHaz<?Q>N3j{&Mu7PnATqPuu=WpSr-ox!A{$-9D%;*U{U~I@MUfWW_k6 zw?Fo;IzN^P6g6ipdW|2Ke}CLK%eaxe)W`|w%|?pJGLn4(9(se3yWoM7k{S>Hx{v{N zMqLk318&7r#W6dQe*w`G?p9G(N3@5F%p%lyTaJ4-M+ZRD;&_o6B|kQPS4r!;^dqMY z<2+}~o|hh^nDXgGn-DoC7H<{eC^nL5l8V9m+(-+vi@S%z&J;20P7s)rU0_8P3e-ST zwLq#lH|y+HU9XBr&J1ZdbA8<v4V?Xg4cug@N?*@q*DhP~!OdSkv3SeK{D&GJd=dCi z5Yc|@ihsVdkiN%OOppUB?iTyOkbluKzCVVMR*!Bqjyy=0e-T`fF0gmD`Z~3VXoz~E zs=sU%#rAO6RlP=BR1#a!nZ==XKJZx_ls=(l+4FBK<A$YLf_hkg>Nj+pTtl)d4329u zOZng`Y?g7B*<h+b-hFWB40%%*Ii1$nEHZ^EBJUy!Y9EWpn@R=6T9YJFDXA1V^@$Vx zQ!G2~jJKq)j(5h2><>o8^dUrUgk>ZRqx~I5yD#GCMrPm0GI-SF>t!lYV2l5KT)21@ znmtKd99~H26wQ?&+EIcrJAe~m0y&(@>Nv+R_eJbOd|2H}Z(M|{Z}hG`R6pzdaD}@C zg#U<?*8(TnV%3mz>$B)mboa)aG$7JfP@iXQTF<2wPn=Qs#5W5&wp)G0dTAA}Q@ifC z^g$f+RLkXF7oG@()}o4Rm9*a%AW;|O`&yb^)C{i4MFypsWQ(j<*e9oESFWaNV9pC! za=1!Ep~gv(st#X-m$rL)TCU$X3%z^kp|`K~;S1~6wD)(}K3?mWSifX#ExX`obWe|8 zdOm=f)-2s2f7-yvXd4r6;mHG#iE3mPY9`7g<YI`%Uy<0`KC<PkKiI*F2{V%j$60K} z(gDaOhF2)$#ii&O|0sArP4K+^?azMg*lK3_Fr9Gq4?ao_-&}g@%-xDN_i>`FRt>&j z{W&Up*QOgZuuP>FjVb=l#H75%?OH55PwQ+zl=%92$96ldN$k_w^~PW557}S0UG8?~ z1!P~1y2`dSg6t2fqb-0Wnf(LR5X#@nq!hHRh!rVfIP3`?vzHbedKK;nv#UDNASJVZ zp=PTtO{t_tU_SbAYVQ+v*4lUAcnjTiH`mAW$FKgP(=798|JC=rz1OX_Ze=|zU!z|h zpICe&*0Rcjoum7{oWEW64Kmdj5o^&mWk_$ck2;Ii`lQH62!Ztrk=8(jxX3Z*=@KFb z4#vetWs$5F3MNabcbc%aRk+(|d<-ikXVJ*r*w_CsKIEdXoL(anDB}6nfb3(ntWW%$ z7r&V`^<rPw@gCo<T$khJzGVONeQvIc-_4(wHOzIK=Ly>8DIId8bHid|b4Qzcaz5hp z_@!7CUpBShm+{T6e3`bp2dBeNO<B1|V1qH0zed6@-eu%ouy$P}%5iiJ){+X12Vq~R zm45o2wdAXDudF3}L|vuv`$J0O0kYolwx5;asMkPhm_2=bAs9`9Mf_EfB)Z+~nmr14 zEq)3tWdOHYFe_4uZ!2Xzo3r3@ckgXuxB6|_xb@f2o$wiv&#Zq4J|TM^zn5QX+cll; ztVwRKr(_FS7!OXINX35{_<D4r-tJE9qs&YTl2WAuq^H6>1ix4JU^C`gJjPfv$L|dZ z5&7@ipiYW)5Tb9cwzI&m6frAB47N93<!yhJs!4Xgq9)2!zrs~b(rLt9CGg;q3m=UY z9;v5T4yP;io#^eMbG+Np%~LGqF$-NkvFgUm8b@bl-W1Uv&R=;X!r!+MX|v{iSRnbd zT`%ZoM>Ja`z%HWK_Kr|po+=;78h&glm0YJ0Y}SxxS~vs_Revs1co5Yznzzz&kPe<} zJ#WQdHT=xFZZ2=ek}Xk|Qf!=M7JJUpWxsq6j!G5omm(Y$=@&ak1x#q~lP)%nb!ML| zwe;*UF3I}!=WHbp%pYob#LCMbWKr8|SfO)xgEMKM^?Z>^?Ydn^v9SQ6&Pb7;Q5;HW zc2;CcS&J(YWUfZPg7@{wSG+}u{98W!lvn@$y~UFOJ<ui(YdV{yn}X34MzD+`6Vio; zP2t2R8Uel1htg1%a><%|$=muP_MX(&7602eSug*7_Zi!CCbOwru2*4?hg|!zj~*nU zpq6Kb(i*tq@9SvmaBDh!p}rY8C)`c3HKcGW<kYF~G{6ThPCy;s&<56v)+64RsNZGX zl)suJ>vHk#?)b&|d%Rmm$`{F#*_GQ&^=ep;Wf7t|OhuXm*&?5C=4(BXMmKcbG(_>R zTx6M+vfyu)Z4LVsIXI3r2em1Vh~=YzkTrpHS$6&w1Mk|mFZlRVJYcTMJ3JLkWRpn2 zswkEn)TG*8PaeWqcPUFA$6WiEW{C$BKW1U1wCyE7fZv~mk|;9W>>gbKU5E*=DYC!= z6~kaGh9sKGi#;Quo`m9xn&#rgR2_F$iOD@?Z;X3wch((wg+d12?B}jJH@_GYY-E^2 zYvg3Ru#FGJ#9GY<!Oq8FfgST59gKavH1l%aqnAn3gvc<NFlAR2=G^?m@XvQRJ5B#} z`2&Mn+L)AG{$qUecYeFiyQ>p-W!CVa=j)X{w*Q%%^RS4B=54z%wr$FwuR75Q!)6IK zw)Yo%m^it{lHDo3irc4RME^H*YFg)!kV~}f8Gnp5b^|gceXx5)&6Hr1hRpcMrC}(U z>VoZ}v3HYt#bFF|T3*4`kyrTW<FMnSXkLNIwUtP?<v6+40>7q@RGY8o@+6+$4Yyj3 z4cu5hY&dmI88Pq1nysAbQ}sM8_1=VbB^UHvcAf=deKSL0U0W{I5zAKxbmHOZI@MXv zO=ck;S^bj+aGobEN@J|JTtc4*ljdfx5F>hAQ#IA_+8g9(!$-X{bG_VdX7=?~*N(gk zZ`(mog^r0s*U8n}T3q&5q}qEj=}oVt><b<dY}+*5+}cC9wVrWc)Rxn_5p34z2}ct- zpW8;vOWAlv@VW0+l^<|+RTnO9Z=n-c3$fDra_z?N&>x>7pVJln;e!lpA9Han16$n7 zgg;)7rFB*6s`az8udY(s{f6C%nDs)=(9CWskt>pg)`<{-7#(UUH_~YNNNGS4bh2xt zW~v>7C1`o7)AtCNe{oXcx(Y*6tiKNnT5xT}4#D)}oR~-*I&5pTP9<mdTY0f0Gj6B) zDV%-Uk@b8}7H!vw$H!|`qxD;S{*~Z^yHaZsvV_0gMjPv4EM7#v6o*ypW%kw9(hJQm z)G)x_K>M`D9OA4_wL@YG1q5=M@o|CO9H8BTwVIFXI0ftMvXuy@^q~c7Ur4m-e9$xn zx<~I#JKDvadn|u8eeAa_Je({(+_Tn#-ifR0HfnlaH|<JgHkupe__77REeKmqJr{B| z<;mQpfkV!XVZ2TKsy&jpRXJ&*o?l#+S~m$st+uW>_Twd+J^kh898K#~-yc$7Vboz{ zZ(<RBw71s;wfmURM;;8jtqP^LV9iZF8Q3%@^ITYENsy)^Kpznfi=mh6ty6b=Z}`ry z*oj5en)-bb*Jrx7&j-WbJNWHhOV)qSn4!1lw9!*~<(HAR(O_+X-^R2@{-Hc<V|bLh z;1w?ST56oDEZLbYqJ65uc^0(EzCX##iMl1p(?t>)|9;Grn*G#ka-UKm+lXE)TSz4- z3_(I1N3;v=!*&{21*oK|nuhp-ym^6YvZhHJDwH0!-)GjfDaqY?RBhI8%hGeji!Zvk za+}c2c>F}i)5i4qzV@d<GyAVPFIw}Co!5T2Gbdx1U==HMX|zU&!y6}kqZ2tN_s|}@ zEC;)9-XlbEANqIF2(I7<pxAYS-n_1k$EIfYf?YobZ5*lrgIz2|T!wx1){H+iEkyv& zTO<R6u7Z^h_dz~V4lgyaU3Kk^wO{z9q@*B!xO>3<hEq~t{`mB(Li}{lQiq+aS_PX} zr%tmJ2Q%oi>R|4Oat5Bzy+|Bu=f|N&u;tiO=7xnJ$107MOTsJ=a@Ohe5qr{pOzo(& zjSN*>A|l#~YP4!yZ+&=~h;S!2!mPR02K10}7MY&_($wsx&E2pEH{d_D0}4@i;RpLU zu~y<2WA-Y<0p&XMC^|RJKf%Z6<Fe1dE56%jmapfL5W1`Ml`s|~mwGCOg_jrAJ~Ujh zSy12Jp7^^~`)SqCSgh}aRiHGcpqKuFVBAPS9#7R$`(RT?o?S5ZFi$n5j<l2ulZ$`Q zRVck#=cGn`Ixp<YMJS>657$yubpD3Msnj)f`vjV~-jYkl%wQq2t^IW*ztTv$+!|+D z0&ZmA90fN;GkSJz>^&oUfyV7gqpoSVmtt;7bR+P~<}i|K4l0ymEn+JEr)jjetB4~A zM9dOs_X<Xw$c?Jlw4r(hol5?(H>rf$QmL2$(vl!eP*^{G44R($&`x2CAB<dKXm)1w z>SgXMH8n-2`0gKfx%h<Cw35$9oei6kdPGz+r3*H+SKncbpZPw(Qk$KsUS&6Do5oox zvrE)h&z26g6vJ=&3Pu-xMea-5n?3#f9k#NFktt$+)V{R0%z%~|)Rqag`{3G&OcwQ8 zQ;M{Nb}QB7$HD&?YT)@$pF!-OLk&DKQXiRC0dM6+jHJF9e-BM63UU|HBg^op2(ONe z;K%(+a>`$LVMTSg(iO=-2r&ev^Zu}KFmW=BVEX2UwJ+w(`mvJ-3$|Xnu^-!GQr&CL z>N9xHXm4&<vt+}I;w<tjs?6bR;h)QWY{Ys&;Z&DdHTC>R&PHZT3O(^VGBCEAuoAYX z)<pgYzhL))Rt+^5(>yI!!0eV?wcmCPQX?VziP|c=Ww)!WnY*ZyJ|~q(%l>gcvvkFU z*TCe0r!;JORi~g&9t`^<HG8KvIDx+F{!Lt;6e@<6Sa4(Ic0_ri*xa*!==iv_0XwR9 zG0sc+@_e`-Yu?6kTe-Vxk51f8uU);wF6%_rsON_LSoKe~{Mjv$D~~UtmpWP#g)4j* zcDRs1=D@IU*-Kct<^{b}WE2%?sXC<WEp?=ubX@KrLi$f7MZ?*T2{(jK>i#{rD;n+t zgNF7cBxozU_TZ@}5>Tgmu8R#HZp}|ko_A@b44%g7d1`9!9ko9Tnb~LUg%T{3G8(I} zwjGwdk6;lSbRz3it?IPL=KVtS>dt(-4dhCGMu9(K*I^|*kt1|2l=m+Zq!+Og4$p)c z2y?7RBZ)6v6U<wLoMd2#pr_&kDh04pk!406HBL!6GNx4ZZ~KJD@S9F_-XKe$sJ1h) z5A%?t7JsXIJw|N=vSC4LcDPW4V^^RO7@H;J*yK(nq$J%+s6!M%jHkoZ%eg_J@Xe^+ zX)57mF6Fod48})7sM<)D*)TaJ3emO+=n;d<)N!SFcGv6R&OCShtFPCe)u-rY4jsAH z#q+y~^&h!AUHhi&5K|9b>fEtuTWRsRwc^?wp1qB+U5k^(u|b`uRxTCr>G5gbx=_}3 zaZj3@g1;|CNhez_8>h5J4A;}_S15*4Qxf(Ts{3W^Cw9fbyc(lR?k6p>BTY{KK5lPB zyRit3T{vi+`f~=oZ-7742KtjAgE=31E%uK0oix@bq@Gf}=72=^)RTte6_wW3SG_D1 zY7ODksh2ln3+J$Fy{I4f9e`Pbr~H*P?5IZ}JF51*oy8(yW)U~|ap#Y>>iH0_6kbRz ztucm_n{*Ed#*lprXZcefuUhUmI%Skj(I<9DyA(Vt?a1gkU+Z}0F}BarB)&?wK3o~w zi+g=I3l2xX9X<hvI`T=83_=l!s`)lMyY`u;nJ6;1fQgq(y~$J;y)wyiH7O@$8~^gd zS=Em$LGCCIdtwas)tn;3y@>xWA_e<|Nj2mjvu@s6)=eYsD#7dh{+V@4pdBOWyyQW; zvNU<J)sUP@1FXH0M-Bh`)9$=#{+Z-{yxNDeylah``QIX_!sxYO!zs@M$3?Sl_7)eh z#;O6fJGzgPRLubEH1e-mH?C&gu-epfDI&L^8IP=AET&hizsz7W=|0QPmMofX{e(p` zckr{-+KA_ZA5VBTY|Md}wUJz;SJcSD&ZDYPGQcAqYBt2B&`6aXq(ybm<^;8;uFkX! zZn~*YL^Zb>Ta#K`n`q*5KLjow$CyViz5enFQBF$b6{K<qToldA+23f_)IyoF|JS_S z61K&Vf7**1ENcwR=H0h%4?d<}PiSK`>rn2itBn~?l(|H(Ow$vS2cr5Iv$Kaf%fy22 z$Kh)Bb&?wfrLC0PA!OJJZ*3?YATSxxV?<y%E5JX1-d{e?Cq$?7UGMfRA}pSEHrPn{ zuu{jyxN#BUq`2>}4vl-W{c)8FOI-Uo|NbZK-oH&J>*Zgrx2v-%I{I;~YA5S~vv90- zEw^X+{>QF#A2`%GeW^!Z>#sWe-och;9mv}2sv~z3Wp-C{H^k%}gCEbBi+QVy57@<0 zXs4@ET;`^*DZdn4af0To&>R_t7qmgI<9epdp`x6zRC<j@_{+$_daiud-ne*<Z!ns+ z&NVkYB;LB!dbkUXdy(0?#IP386`t0tp7^=3W#!ymPpd>Pb?Wb8&Hvf@O+U0Ig?=q= z^8oDWsB2aVc7jVeXP9|_j78ObaGZ9RDGDdOV<#2NBYq?V=kW2zQxLwYT9No2ie7pu z{{Z|4TO@A#n5U+W?AoG*sce6r-P1-7@7cUn`!Rkjf6Xz$lRGxxFW6Uy7*Fcjkg>Ee zGAjCDT}8*he{tx2Ewiik+d}*f%^npM@ujNz`C*C+3;r*^*n=emV|tzRPzmw=2Zou( z(^Q5Ti#BhGV&)G&D}6(;K|IDWTj^nQ<uCDnO9~?$%=$u+z8cQj)&Ap<cZ@LPrQ}aq zuw77!#~`Ow=3)k!qrx6$yYL(dD)~z>gd=jlS;23~)I1dePhWrfByDf#h!XeKmrsjI zsyW7B==Xm}dk^rasxEAF_CDv#q-QddWKu{-4?RF2p@t#|NC~||=)IQ&lF*y<8fi-J zpoBw{CZJL*Xap;wSWpxz`st^TIl1rJXU-Jm`=9&Y`zVvlBs1A%?N#3OuC;&IUTsG8 zl^YR(ESz@mjze11SzcDK=Dhvu`?mTc&KzU?Zbp3iS@gRltavM!6o35EdD}6_-ycBK zCm~Z@*)&oObIBk1#9}5!YQvpHiL(hZWt<NPj+CW`E)RDNeq<?11yL{<Omp-`t|EoK zG+R<FiP;WVA+nSt3GOO6Dbd2#rbhMVAK1#XZ2c$4r=GGMPmL`<x#wh9Ver&~*+(N& zStlD`r2SqxgpV4@s@-Lgqgc$lzsvGRhl+qxy}VER5zG*73aYrLY?U8EL)0=gQ&Tc( z)552CxMPM^B0G)~2aD-RcN28uUDGG*XF6a`2uXH2hK?aSvK<yAC@l^PGgC&Kq=yb9 zdVE)0x;6Yv>l5uxcZsdMZ_$7SuUsE|y!Dl5uJo)FyKVl!@_9k&d7FkW`p+(VSg%us z^M5_GV5`hKJhQF;^T)5>JNaVQgR5lTruB;h51oDEqhklU@~Qn#tnM$#tN&Ut_orpD zy!bKBWk=Y{0BD&=(-d9dN5Wf+G&al~#F&C8B%@%5m8qfnlh6#po$MJWLhY69K)+Gq ziNpqI!8W&VSqkE0sI?SDs35zdt|P?rlK|R6m<doa=s&ofK=|oDq;3ZD@Dk@$HrT3- zO<~XBv0-6DZGx4pP0_|%*+}i}Mf?k1<_zoec5m%GYt{ShJ{(*_AQZo`y+UJJz*{BH zizHCkDNG278>u?nbhs>3UCS5GSaP6XVS)CWB$Yd*>-<mXgYUEuc@46=wM{vuLbXn_ z<}~R#*3tyT4lc}9BmwB-8YBugwt+VdTICT9=q<j!ZBUt7SO4X@C}eb>Pc^o#z}FJ3 zY8Cg3rKz+oW<{iU$;jx*O)B<Cfy|`olxlY}7^*KaH62<fQg#TzNtdgIRhZUW{g-^Z zu<SutLFmC3HhgRi7&U8GXH5$a`|pY{|7G7SeB(oVe#n;9+si^Dul}%og_gPSL3HpW z_DpEu>Y$*)=h^9NJ%*i~vbVRy?_cE`PI6^cVeg{q^(&A6_FAvurzY+1Ey)iquRS62 z<%Rn@c5ZlZPxbV31Llu1+otyEx2P^o4U?5*sVlIeKww3pwoH}Wm``aam6<_jVWt?g zo}N!iOU)AX&d{MrY0L~vM^rl#x%Uv2KG)#9ZemhRWm*!d+maJ&v6@Mu0y?QCh`rF@ zlPd0;O{fHj25X|BsYFd{)R?v+jqoXYtm%sXYC*tj83LY#Cs`sk$r5=W3DPVQM`}Q= zEP8uD#tBn^HGqS^r>9;+0>}qdtsY5+b#i!~Wg*6QSErWN0u$K%%w@UAb8zV@!cs(x zn5{&j`YXkTTta%9Z04vT6s%uj#}Exz?r1-;VpU0qU-*sZmaYyQV!J$MU06Wy;K5g` zmH!mU!mq!^`dx~!F8yHP8tvf+!&^mu%?4dL&MK{NME{`ex$v^~-3p$!X}>Jr+0*I# z9WL)*{h7@7E*Ua!uVlGj;}h)xmmjcIZ>{>WNRsCMS9>S$3LE;4%&%xWFTSH~y&}t3 z*dUy+x40@b#`%Z?e}23guUD?1O4UF>1n^6TL#`qaU+4o70)e}$BfuGi_gdZ5Y1J-} z;bLf!C_+c#-9I5nA<6v=E0>mSPEI1*N;xtzW@cnt#4;inNv)f0WXRT<rJ-|2&NM4$ zcP#an<&g0mCfY}ZzBFh0%)mOK0owJ+dGWKy&h=BC<`-*cjLYvoWe&?pP8cWgRvpaa zXLEUDp>}mZpU$HXvM%i!=b(~cjA?^30{tb^SYhB#CJQTM*%d!Qb1q=>r6ZCb_-BxB zOjK0v(<Hp9f4~Bu(xg!Zb)AFkQY4$tDvd#n{@9A|6encW3XGx=xSLzl_@`QtxVh_o z8;R=QCN7y3A%G#XMu4e?yCq8?OYUcCaxj52rO6o(K0+-@Qz6Bv)>KGw<7C0)Z=9hf zxn)+Zo+OS6fd0&~(p0P3()}Zm6*44|$bu<6TS#h_TT~UOZfGIl|HAuqSd!D4aYX0o z4pK<z>GPw%WdmMCq1I}LZPgdrFRMrx$CAvhX2Bnhw1zDCWZ`P<*PEl+o7qDa{%6rr zOThEpP%XeXA3_(lSh735bhztu|L|9~^PBIofp5tCHEqYGjoLRKOp-`0<3HBE=hE!I zS?#UMzMcj7{aq`|)b>klm{K%pVTWo%ayle7v!<l9t<k=t+@J9t&!AyAAt-m0Txo`| z7h#k`Mm?j)brO{qqn%T&e1(!bnEZf0r1$uTkbTl<P1FD#{RT`N;@Tq-Xwn`*yM-cr zaIYb`uMzHNw4y?6&1MSn&5@ac5sqxl-|`E?`xnXb=HY{i2AZE~{M10RxphwSA@b!h z&vU+N$e2xd9F)^5uT|6jc{HLpsJ&n1-!Y<4Q#0QrErp9vu{eDHtmh@~)dP*HiU{6t zzT7t0o=GChr?KKNZBgq9t%c!jJ#lUMEvr;hYC1xDhMgM0PCX75wYVesW`0Y#fHmo^ zhKM!M-H3lzc!ohOM7o!ul*9A))O&hfhr1A1<|_B3Vd({)C^<KB;^t7E$k#jH4`EX$ z1o*Yf=`t*Ar1e1lq<I!gNweSB9=^FVYcZr-^VY0ShiOaU=?|VdFY7ApcRpXi?_#WJ z&|M*3XqC@cMf#t{%A!#>jz$&?s)<TceTIlc3Q!$Sk%t<dD%gQQR4bJc4<Nz)>zG6) z4g#DynuG{g#9^`M0szogNI-fz#@i>mp4pt+;;G@bQK7phPg-iR>{?(}UYeD^Mjk2k z?AUdzCHPnuxvNwqt!Ykc)~W>?IRi}v2Ise`v1sf(&S#Bk*15}5^Qh4%!>!q$^X>*i zf><JiMV$zRhYnv2IYSAI2}#tCJAf0s@|^acNy>kih7g=p{3tL~LXk$QW-k=U2Y~m% z7KNX0V5bIt;*(jSMfBp%1pCwSs$t>_)=07dUW?QbrEDAxf{fXS(PsbCg_q+O7Mvd! zJM-<*b^`$t%Z;3iJ7+ww$g?I$(&MXJP-Q;T`KNLlb6$!QaY#7^W@n0O@v00LxR0Sf z4GbF`SUVlTEEC$I@T`8_-v1Jzd!4)YoZOFb?X8cPnLX-^Pd&<KvVPQkkgC&BujTLd zWW-^1IWXolmDf#9t;wm(ye7YqT$|NSNk+I=n^yFs*5338`MMC(Gmv|#*woL7F&K}l zN{|W@Br4*yfI4C^8)}JUF4+AHX(I|8%$96j(Pl4*TxnJgu4RL!`uUH{uGuo?*&*Yk zT&ZQFT$|r)%;N|C0`H+52lDo$DoimF5`3>(Z*L(^wp&o-&E6e7_2)3wHVmJ&q4hv8 z`nc&${-QJtu^)8@X|4uWiX)Q)MoqL!Gm1|pufS4CKq^#>>sGatEr@bIgCGb1Lg+@! z%f;<;r3-kwB^!bR>{r$-*%0U-_Eteq-@b#Ega!um?K5mquyRGdykY2;S7rHPN$=fP zw48~HxxAvV--IQ|k4!hglE<5NNhwk(EO`;yuv%CVL+4n${yAbGhw_psoqd2i=QrVN zG42KMV;1%?KY~58>RTnES4^XJ9lQq+yz-2APciO5@e}Xu!#CkQAMyvD_lPrMyk|Gw zvl#k^K7Xrt&&Lw#tnr?YOgs2y<L@NFCruLX5qX<p{t-H8N10N<m*uHxw6-|C@vgNM zzic1{BHK&|MUqvm<Q7tw3x*cv^j@D*JhW4y7m<r6iNxZEphj3Yq*;hO#3tYy97?k} z*-XwCfDK+PwA+D*Ro37M<0ov3ogRH}|E?oe+r?$MQI~Z$9R+zwHF@c{^&7$$Zzx#F z<!5KJLsw<_o#!tdozZCp%hekfAz_P@I<LU0Se}9v4h3erRJ934C_x%#*9?vLO`H&) z<6;1#YM5So5e5_P38Zjxynwp^{a4U#CL;jl8J;9O$)A@!w29xN&H~`Up~Q^JVdx*q z)y?zEzsYpIu6?#i?k;t(IrG}`CN}5w&iv5hc=p$Lwn!^dN=G>Fj&SZ`Yb8WMC?7Ko zr5in<IU4AiL$7%OrYK7UB&q@aBAQ?_;mni_P|8$`o>PPQ4n%~MO{JQ+xCByyHdI@+ zUwW|+wyc$w&*FM&_p}i&vk7cqd(g@U^wf51>z-lbv=T%^RV!Xn3Y0HUGoJ=lzz8*{ zZYKQ&Wb2c`0q{ga!kL7y`K+#5*(8!(RfC1dRHXoz{01+gMrCVhH9~0A8txUR(nhek z2-~oM-tQo20~$(zqKIOc*?|lb)$*`<=?pL9x3YLMb=urX$A(L+?Z?}u%^#$;Tr%-e z?SO!=$i$1<!|mGPfF@GpfD`X(_o`Kro{cL1v-jGCx3@GhN5})W-+um!!E6s}^>jUn zKh@^IPvi3ormp@_yYd3(^-s^1ewqz<>YDb)Nj9x_&+>$hiZqw`v$<VKW3>fZMciDf z3+$za>AqYTfoWb^*;o}f2m&mK)(|DYVfuFvI1lQLQ|U$MCX0pw2jn`FQ{f=njlw^6 zzCNo{bfI5h(DHAWYnK`pIO~jOnJ;`EX5EZ-FIpLsM!Y<I?!}QzJCCPhovYZf)r${M z)mc?=*dCdKfkJgrV+9IjLRGKWH&NVfWC)BSqJ}EenuaRWJsc=CF+w13z}mcVDO42c zPH6~mY>XO5KZ&qlGRRp-t>s8A4ZNe^a;4jQSL_OuD^ILs_G`GIh2sD7?#{dG)f&Bc z`isGqMkUS7N=ja;IbdMV{4EZ7<n_-LdEeZO?q}LnZ!~`WjOHbm<my$1cIJH1=q3}_ z%xqDo*Onf2x=ojrJug6Nqbj~Pk45gb26{|2H{DQETC}7o0Bx&NMvskM`y*HlhSrON zzKk=T7_;}-QxV<A2{jjFrWPciz?{ekY8C`HD9VSC6dojg9G;=Z>c8Jad?{^`p(eU5 z6v?~?u2HM$zXE0B0d{b{)ViKGK&~3#AiL{+(Gh@RSeym3D};66u%J8<j5Inlkzk|| zwa~6}KB-MZB4P9Lgu?UHyL`W3!ybRMcz(AcC}h~UqGOJ!;eV+G+avaVe)3Fos53<g z^b1;BaBx@p#`36MC)?Ejb<G<={!^si=U!{XM~3)^7TNi@yfGsszW>=hFS9=L*U5a= zq@a=$3ZF9QV;L8?y)`VpWBcOul037|qLI97dsdUJn3gvNw=11KGazU11Uf&H!Gy>) zSA{QG)3jQR6kXB?987lYPb{`1)}Xl<L=Dv%D-bgjZbZh4o)z(tqOn3;Jb{ZyuTpCd z)f7i!tJ=jct5Ffcn~3%9(?K@O3u6V?=F1twouDvcM9W0w1Qs+aoe)<N=WK^0pjBbw zY{*QlSt?6)mJXh>yy#T#ppYfE7xmteB^Upv%4ZWU*SWpsR+V!J>xXRnD8jaJ*>ms2 z`7040YhM>=Z~xW0i!9H%Gk4t&3uNB5&Ce&6=gu0{YIwV)Gjp9ayZ7bt-7{Nmqvl1q z(~6L(4yH1>hD=&H6j(tgRf(lMc&S1)t@Id<Rr75FAX$$E!|D4t_D-K;lnkM7Ab7{@ z#*5LeZ=hxfGR?v<6|P`Xnxub^u7R?nynclAmgWbyG$liVTbfp5vGM)WwfMqmtSy{W zR)@UQI!?v)eJ!4Wkv6TECR=e^Lj=60G}w<ydhJ&wk#N9cs%xjkc{2{5n?w}_R~dT< zmzgG-NUk8A8;>3$LPk;<b&c>z@Y4>F#URj2-?TJaipy}Ad1{uh8#Z1rq5s%n%cq#7 zRoY+Mhx8veY-ypzyo&j2Ur8OfxlL}-8&mi@QY&Y9i}q(8;VQ0LJJ^j`Z{5%?pOjd& zo$T$x_g-i1&N_SU9wJq$#-xqf@69%jD*rA4m1r&Dk$exX%(q}-*@4asQ=@eTiHj>^ z)-~?G6SPL`V<;eSA4Tr?|Arx>)1bpa2(p-cDKhM@0edos6|imvlUBU<`~hy}Df8wX zGfOjPx(G5G-`4ptmL1MLrDpkySDQ6P%fro^cw2)Z^GClyTmjLZn=;{tZiV%;!}_^U zf1eQ8ePF}=C`K!VLbQg9@2m(Qt(C3NoQNiI3LPFThkOm104gA&`lN9jLSWGG0XZCm z_JZi(Y61kaNO>Dk7E4mBgsco(sTLNNe>$^JT@<#kabaUAwNc^YU!{~P<)6w!20hlO zTvq0TSSL+oot#s?ARntC9>ybQ?8~t;MAFy}o#}WC{6_pL-c=7CKs9_DWE!lSeBn$Q z@ABaZxDz~-O>m1ifLU4_bH<5@<~e3Q;6x2`6MXSv>cTg05o@UD5xP|(+X0ty*|R;- zue*B@XIq>%*tX^DSIsIn(h}Gg&L2?Jjj=^TX)MS71e^NlV-p^T;f@G@n2Z_=qK~H_ z5u1U?(98G5X22qOI*E{H=?5%`P9eNX_&HD<sTPHNTZDC>aj;ITNtkwJ96w_#f4g9} zb$5P|RBzD0!Or!g_>npT>+-!cvdR#jRGf@J(=+<W#5ph&z1tsmxwHRkWXJ}IfnYeI zF=@7-80y0qbIx{V(TrK=!p_Z_Aq{FhxV4k<ckqS3M}Plmt+mn@D-(`$`7d0;SRldc zFrFA-sqhDUa0xM53buhYy1K8bA-dmd7hkYME)oN%sR)By^|DG|?JvjK)mb@F+0}dI z+k>5_ZWp3<w!>}I+dMjOLFV@1c0PAj5Bc8XN~olblfR~sXMkVv2DpQj5yk1X6;BX5 zA7v^=ZfF(Z<A_a<6JiHv+_#j_liSCzb&v^;w})B_cS4}%#P4D~;+mf<n6oa}5-`(o zYE6T-G1>KdObaiz@W59-FIq&r&6o2gNz(d-xm}&%2hMOFJ|c`4OyPewY4VX`xnKS_ zogpyoDt@wz1tJ=W*z`FyLXS<+3D4-c<P%$ngJbN9&yg~YC`A|^Mi}~aiQof1c19Q? zHV*-SEQzPc)7R}Li{hODPfP?H4Q?gKd6l_4m{TG_$xBW%=^ggWQ_J7~xn;?F{UU4E zWL+P0zAI(hoWXg##O@q7lK=JixnZmC=I3A1{!FbE=pVYrE^lLDJ8)fO6l;Y(l4!&* z%K1`+6e9m_<=QVlX}5dzTzd%Gs8z*%3-J(>kWFj=FDa^FBRZ}yd{xWnvEGv`s5sn) z77|{Ra9>TrPpU7zl-Bo&I^Y?3s)^7-tTa}z0c;V1loO@D1uN#|p4Oq$Pkxch?R0yc za5B^3`cplN&7>FMfbL6<Di>ZToK{}6^!4N(pBJA#8x`t|xB7=Hn{ckA`nsQrucvhT ze#xTKU9G$_%eW)0nZ4lM(P7q=Q)a$CO)i`FRyH4}*cRb>%=I%DujFP8q^KbsW^a<s zMO|0Od~Ly^<+8l;ueCO?9~(J4Z8|B-2N4!6MnTLv+?KmXy7Xe@m1l8|pzYDuGX}b` zE;{OwQSv%Rh9YuH6tXd%(+v|Kq8x`MjXZ0q;X9FM*VXMCTPJ(i+|V-l;;u8CMdXF> z#p50~gLIFn_+DuWUVRLDH4Rt8($Z=7;L97e?>@{1<1eaan~++#31BREPzE(bf8Ey! zf{y+NQ5GwoNa-!Cxhpn6TtGQMM9U~Iq@Ci!5B@wX+Ab@>VL{<<?YVg?uKWFE$Nm@- z6A^z!`)b#M+dHe2Pw}^gM!go!_prp{#jVB;-+e)niw3j+@8w19oeL|@X)nJxR$9QM zeOW{MuG$0rR8bT9sfsxo`f0Li_u_Ae(9&2}fiD@-84n*n-gqLgF;Z6XKIOm&Gra<2 z*q#u00jL1*_U0jr$)u-}$U&#D$5q2p7yG2wu<!*x?uj_DqWaU3wQBdAX5D)<^r$uB z%$kh;(OFq}v#eo1NgqFc7iuben3eOz)8#rt<{UiDBZh>|o{171ZkmJ4aI!fL=wwY( zKQ%#*RuZf*hh9d^P)+Wg3=R-G8JwYpyJ1kuN>=u;ldzlKk%z0bfk@rb=^_YC$3M`~ zQ#3u}+>APVOw)vBPi@{pi-VvDs<Gdf|3=G+#ZhA&+gE@}78;oeJSY3uu7#g&uCJiz z9wnGHQ$(MG9$i<y$(rqy_|TyNi`TFhPdf7QM&&KlUe{JiuU`LJmKJD#YCBt`7QX?W zFiY1^hr~_I5UqVLzXUy<jQPjvm1Iy8M&?RP+1N?LMylK-Tt1*3Ua2f#_#R6`irCW% zk93OHq#?5|Jt7zkx*kF6<E#1o2Zj%`&6yIV1gy~h*t7UdcTySk?uM@~ng9N1Tj<)U z`+kO=SQRw7n62IH=#=}ew*Rs$ulO6v0e8zekG=9xkq@&v+ZH?zfagEZ2}Kp(nunYH za8kRg4iQ`F`|5K-Mc+<iliiRG3o@E`dgXTzzI*J8ZcfEkO6Gr6oTp5g9X%rU<wFHY z+Lf<Y7?tO{jy;S$sFZ#fwCH*E`q@Bd&#$!KL1zDa6;+@gde1E1IxY!M4{Ti}S>6hi zZm>^hOJO;U9WmT-;lda`7K|l$4QjNX$g5LlKDUsnW|Kj%_83h}1Hvfjg?*xEUO){v zZp8M^R+8;&Hf)|2H~-5m#N?fZwCkXr({5B=G9#wnK!?0_^TvSk?H)>RcKyC1BsqV$ zWL@GnU_SJR_Knt>k!u|c=A^e?_K~e8xLg>Q;iQPe&kC+ZonDsJB%)63?$aZ#q1b2q z;nOg)!@zQ$HCx8jYTQ&0NZ6b3rKqRZD6gJg_9t0XWA)S^eN|BZ<l899vqpfyjfL~7 zW&j;9mJB8pYCr&}P{T__+o7?jl90EYd$L=ooS=Pp_0)x^P<~Gd@Ut$PaJHn{x?XeM zXy`0a!k5S$<rTlLs{BZMT`@D$wGr`8x1al*Y@XG9#p4R;d};i0>V?cg<nN^#C^-{d z3FM4pl<(2wfAFgWWPnG(s5%vDscgxxNCQ9zB(IP}H9g%zX&R{p8#nLO3HY>j@*hF$ z<Ovp{;j<IvyHX3~AwFBLLKmEcQ=tqdo8e<{wJI4oL<)Y?%Q`zd0;)ON!Gqr%qy66V z0voN=zQ}^La;5|`<Uox4x!E)c84t!n<r`8<<rZWhO|<9s9VA65$b<*DX$trYQ2R*0 zxq7xsEkh2>%wJ_5uH<&<F)CEKRS3^u<y4m2kF);B!?AEBf}K;&=y^C`=pIH9J_<st zLm=oF7%A0GGRQ;9h(ur<C=f#fK*~3m9?7S9zPT<w#X(&dQQEB6q)G0?8s*GG-Oogh zFH?||h=AgiurKEYx$Q?H0o%3xh+Mf|t=i96<m{Rm9h9-%rj6~;dD_U_TFqP6uifGq z*w@qAP~450X0lSfy44Frpa?{9htX&^O$iuBBo;-dyJY{_YOcRu+v+)%7H!*gmZkhf zQk}fKb`neMQLSH_XI7z^4Kv-4A4;>7o6zvtV&%mSQqYH3FE9gvxf<&J6SN88o@WTk zBT2lG;Yq5+$>65LFRUBSGwWtcvqC0!tDHHcUVN>mLi&VE?Ut6)A}6(figIJv)QHxO zoCeaM0-jVe37w?5>5g0`ZBZ)V`C3r-Ci)T}%6me_nPO1j1i-G5$1+oAMH;CE>1c~c zM`yBh#G`0szEQg{pRd+_n66Z4?_u|}n+$))Pg}+6Rvbc(*8waXz}YF2WR(&mX#lwv z#Jq5C9ZfaD{S0fHm4%IrFq>%~9g&$NGik|YRQU~T+Nc}vKcjnFInrJ!p}r!g$5qb$ zv1y;&#yQ>FH?0(5V^tI4tFoFV=6qiMOgm)c)kTOKjcG<90w*|+W5T>LH#!e!hlU<@ zbsk_^r2JXMCgYvdi2-3dejTUp-x+yJg=v%av!0R1S#wsCA6DGP4qHrn$_LPC(}Lyq zDjJ)615<<)gNrFno61533)s&+Yb3YGj*H`r>87V=6IaJ<v1q~J8FMU_!ko}K&&ty9 zUV-w>Vsluhc0qCnsaN|}Jp!6xSIh6q_bS>bKZ{*Ok2$bpnxVrr&a!*bz#6az#F_)f zh@TJ}EE<F;u_F3DV|&FuV-Qrffqz>6+5biR?a5cx%J*1+_9qK4vGOmq>&|B@#$jiX zXNTY6=T2b)J$Dy|mVd3c{Um1feZBTm9BszxDKf8au7|PWjQt-O55(10XKwFpuBRc9 zE3sH5NqW&d7w-m;Hsje>B}W|Go+q6{N*U~><T)*cZZAg*B2o4~geNE*};P*@ME z(VWKTFPSn-`@xkat<$O|`-#4%OI<*7G|w%!x)_bTmd<Si%aPTBrgbq8xY;y=_8#a9 zZvF)hqM%OO;}#g+jXSzV_~YqifPo2?t-Rcs@&lUt^%OmMN`ZG?#HZcBr_nt-8T#i5 zv;EJ{^8%Dqv$!V*pUD#Ge`yhG`{*~Rt8=1sUPFHn>Vfm<W!w}jAy@Fd{1Z?DWOtC) z8S2$>11k(KhPbtatcl_h<4+oHj*7S%(pwA>^J!g(DgjUA1heSlhYLttZ!<=|IFYJF z5an(&h9p;nsI@fNrBlv(HXf%<dh=Jq8Q;6;jY$?MC^F#{^a@75v5s5EzNdX#CDM;~ z-Z+jLU-8|;%kRm|`hE9qt3=-`srW%j@7y&vwAY@Onl)=#_!f1(dR_bP+ME`JH}Jh^ ze#I(2#5(uDI-7m!w2di?N*hG`VlmuIc?hR|dVw6`<naGGM=h0DKJ%L`|Ml397Md~) z7JTw(v4a-aH5aBUJRjrJ4Vmx~2vyOmo6#D0g+g8HmDLIwUmsQ2<P*6{9(`W}udDs( zVJ1Cz+Qg7a@kDm6&UyqU;$Mt3*IqvNK0jx7wyrPrv6t^3HA)H_E%}Xx<aPq~+z%tQ zP)6LFo-Ljj!IyYq$N)i^9&FRyPBBr=EBc}Q9z+>e3{ZQiQk;y6_puU_@NJN(iT?RM ztKhCA^XjJn73DJ-9A+WbC@nzh9rI!Qs`G-BZ7;7G#z$(?t<rXTxyB~(`_6fz2J`26 z|6Ze=S7;XoVQ$o?KGKu`e(Y2=O6SKyGXUwtW1>saeJJ)u;h7p9DL4S(q;u5t0KvCU zhj~b^oDNvo10~Rh0b}<BUc_%srxXi@Eu2)dOcfu9zOu4XQ1Bt4HHolv>FM|hqA_X4 z`fn!(v#{gZodc;wY0rH-A=G-3CGAfws<T6${mn+J<MmhO-_*WwIIf+Se^;J;usYy{ zzgDtKmzCu|uiN(ba&}((w0s*2nDoKim+u8}`OjBRf9Hq21w^b6ZtXDjSN*-XfMO#J zLG)=}_vDp`(Af}ZoCEC(tiWgPm?S0xINc2RF4<1lp6CDuM*nwb{+rOdsCT+{=3$$n zwx8av)Vr{^WBcwyGuV%|pI_l-=c7NhyCGT;TN1@;e~RaSAA1-jUB<}KnofQVI;x5Z z7g%|9brTqeF><3eQV3@{(2sP&=2G40F^v}RhX-&XTZkL2Qgsh26$p;2`MD{Sllp;# zrKU+~I$6SotQV((7C!gDr)f6J-VLv4f27#Wma5~rglkRh%(2%`Y4^se3A4|C6J+V~ z$|@FP*P7=yWSI|(8#X<IbffmsUrV}7ytz8DU=%;aY;)OcmfE~7n({e6ou|#!?)K%P zo~38SJvjilWHe-SrW&EkC{WuJmvjom$A~?BnjslcvseIkT;<6!r~wf~kU-8>@FWmM zd+MWUAAM4N(7{Od!T+yMF#r`yyXvQzNX{BH({jMGa&X65ezj_pJg0Y?;VF#2K59!^ zU1uG$R5bPd1y9E=%G-E7QEpWJVcq%MJkY_VOK)4`PcAfV9Kp=2u_BEbeAf9&|LsS( z<uA6Yc!{L^{T+Op3a2(%t^?kh9rqBAQ)8>wz~Bi!r8p7}6=^3QJ7~;b4cF-($cuR~ z0nAmXmmN|FV)B4Synqrch3C9Nf^`>+9x2fYG0sY{>y4q)5Tp}8M6OyIoHhRDp4USB z7mS%OG0>)c|Hj*s`xiWpX2H!@o(Kt=H*L;E$BLBaM{N4g7Sg88y!AG4;BM_4y+5<+ zs|&9FA}ht3qMTG8I>&8zcIqaXpLn+X+S5I_e0=lLo;_qH_`7p8^sGVL9$?rcpMc#5 zjuy&OBuvbD87>SGhAvS9I%)P?=W88ibiR?lLrFu>{<+qUU6t+SM?3bU*dPa0$w5Hi z5`cvdQPFXQRvO;FQIjD)+CUkFQXoSJ@7;^RRYMXgv4(foA2q&)C?1Ubhj79B!toOD zAsFdcPIu@|hcGS8MJvP-L-ODZv!4F9_ik7ixp@A#l7O%mx}NIO)lN+pZe6_<DLEb- z;Qe|o3g57H*(bH){X$oc8Fp&1RblhCvQ{Hn=5?9gymHfxD^A+})NYv-mU=hlA`7S# zSYwH^+39Z-<=md}{T93&95nJ%!b#9&>prTVJL2publC^pO!<&$Q=wc^Nx4M$3$}g) zl8g~^B47q`BVe2}BAVg*6LTU~N5DpVpbC{o3F<_U{w_qZR*!N5t>1GR)x=c2j@7PT zQ30qD!l-wzvX~Wzg#dDa+o351L^Lfs<geVWvfoE9*F5sRWtyd=XvxVSJ2PJjduh*0 zfdT86EWa9=AEEu{^6}d&;cB~->Ft&t2w=*=Wvu^HNt!YY`#6kE7(H;J#AlD*d{V(B z2w00bTCto6dl6^qt%iEl-v0C4c@(cVg+OJof@Hw$0;fgYnMd=gF($gW0w>J^bwV?N z2w<Oa1r<7K5<!jH_2Kdj&EEZJRAA?+C+7Pp<GVLs6m04BVzVoeA$#|;way+^rL>## zm%JP2yG=}QQaiunwz^G*Pi#@SeoX&2=dwyKvK=EZi`qCrx6y|o9Q}E{JC_KVHuR{^ zsS*X9MrKcdlrCxa@DOR_Sq|(8=>}a&>08z>VZ~=VOCrw|oVCc75d#XYRh~!bx+Aa4 z(nr@GpO8B=X*h6%#Me%6hEtACGR?wmRSD2>Ho*iOp~mPu4)hTNMu0~{>l;K>kJcmk z3m0v)iopQDePccqnD9V6txRC(ya+iu)v3O&(Ct`vYH)((&PwM%&m<+$5H0q}t`lZU zT5V?isN(4uiTkH#YY(-ld}gp!iTGqkSrtCmInOEu7SCG!R%W>T?Z>spI$0L$sF<}s zhR<l*@=wtFu1kqMXZ59Aw)UI$_t6PCS3Z@^-x4Z312=$N5QwC!KeW#ti22eKJ?0B* zE)iUBv|nKJmvDJdR9hvd;m9Gui(y~hZ;FNs{=-74;etfH3ty}FuXIlN5w`RhmBmn! z4yReS9EM*f7SsUMDSzN`qG2n9%ZJtTG>O3|>N-$RlZ{~j0ZOML{&bjvWYE0XvxjPy z1y{-q=Si`x2gWbfqL%T_wSwY0MMasDlpnu-{8haHe$sINe$)9&<;&&dvYLYwo)<u8 zt+O^?4n{p*4bx~fQ1m=Bp%If9Ts3H$YKD_zB$`XBc{|;zrJCRpg1PPS`cawdov%#} z5XeJS{Wq&pAgn83p-$j<Dy}n_tsg=`Cx&K$H<t~c^!K8PJFf&su`2s)GvC+B?J+Fq z+%i99Xs=eadIeZIX10F+XlT&2V|nAu{tvI$STI|uUwz)BTQ)wDy?*HDyhgRBJiWA0 zPI`w<4J%p0n?ad>R6lj~fQ{!+MpT35Kc(VNc_*YH0={XGS04{?d!lhlefG>~-9^r} zCyJ&W^i(mBho`5s;OE)N0Z;Z3Aqu#0WvRUCcs@iat&uKD)3vNa1&5B=<T&Y;vniT* z@POe$rueJnHKki4$v3$V4$_zK(yY*qz0@F~9f`MV<ko$(ix4kEp}4)25J5KfPMpJ_ zdYlr%HBEYO%mHhY7XsnOX6Vesjma$J(zva;oLN$|idWtrJaopxme)((Ote^L6s)+O z$OqnMA#knUn$xnG_J{VVqHJ*9;fGGi(pUEf9lazgUtFVg@2M@3zJPX2MsCJWWS(?; z=W`f^%SpU-a=F~?Vr0Eq0H?#NEF3LiJRAY6H&i6Gf*~XBt>z(OI5dFjb2y)~_k76Y z;MoO34&~d-VOtNiSsI{>>X_5Ip*f&S?xiz!*|z>35>B^{%tG1si1+5y-tkFhRK2;a z*Vbv$uvbR=SVv=Kc|Cbs#Y*yIS|FFU7yU)7g2`bPnNkF(?tKwkVaStDzSJn=C*G8o zJfWkkr}0fG@@pQF9HysWOI(>Wl&L6`wfAh18M*Oy7Y7He&>n4DjLf@KiDi7kYnI2G z*B0;kE>5<uUc382r2y%cG~@DV?L2boEC1dQ{WGWw&XLa_la=yoi6_4d;XhyQPCK={ z;zya`goL5D8@G}9)OX5f5(fS0ACmy<!lTyQhXUhIl+a@U%8VR++^U9B$X~R=d|tn9 zLJMn7$2&38w5>L2nDoB0Y4Zjx8MF3_=Mqcf7e>&CCc;;`inWeJy<M2s?SWzt#v1zw zl3`4}MuS11K-7Uj*rc>{e6?|m1>JSn_{nB2IksH<DM(2yj_2~+$GdiHiJXk`qCWK+ zB$XmZ^Bn8^>;krMG46X__XY&}8b`4LH}%$%<O(@QFaz?`P@Ne79G%W)w60Tq9A}?K zGh)1Cc!E8?8MH{0z`|nDLcp75Po@-MybbFon5@KKAbPe4eRE(=)5xpg*1Mm?haX;7 zf5Qex*!H=LgXj01d8Bh_toGvLZUvvL_+pN1SvbCCeLtInW&Co8MfB}ELff~u_<5TY zHDog9YacCns9m*c^?9w(lE2q)KO^(TRcZZ4YOUpRtbYP}A0>F*C?i6@C$7H_FIxzX zp_SY_;|1FR|3;lhD5*`sT7?p#ed02?IwB^d&>mip19xBTKUH2m!5UJ%s7heOa_!d5 zj`^Jqy%`Z4+O?o-kU3!e!cy4h$gl_3O18}@U^9z<*XDi_sP$rp?Qb0%HHCezh4=2h z;-zruTg+<`Iy(G-c~u3kBgE^TM-g}!^QsD~Sk-tUZ~$`BNI@mzC*p=@kI1Wm@l`3L zLHO@+xz$8LXvXX;+^!#7%tv>tkq+1AY9V1H$4GZdKkIrt%x_4~*?VI%W@K0_Lx)b^ z*})oAtGHS~P`yTT9!%UEGW(mgThP0GirjFyc2WCr_Op`Z-773r`?T}s-JD-!V^1z$ z$QCczue~w(Z!=#uMSE<KzrJ>iJ+lvz+Yh(pO;z54HqJnAv|6>rU3s+#o!8I0u>OWC zU??m#J&r7UX*zh@9+^e`W{^d2v!TJfxM)D45~*p2PhkjycBUqtICk0kj*=E5{S1L7 zFE=Zj?zXaL)lY*ex5!gF3``E6eQn;UbCFpyvi$slXAEC?GA8xS&#Wx;{Gt^r!W;By z?z|YXb!Q_*ey;oEAigWw|NWIW#>nRXzQ)>d?L^C_!zangOGiJBVScYfth+2rw~uK@ z1MRH;#w#(bQ_ajv3ZF-KBrrSqH{}wnY<D%*6@$<w8<p&0$Az&qmc_8IzTqj=wR=`U zt>hpS09#M<LnNA>W)ZP+I$R<|A;?0($IF(+w3yd5Co4T6sb^bl%!tC#2druBDy2na z)o(i{WxhE@{waR|mt*?}%gO}jAm>RwkPodkIA~CG-b5`T2T1^K8c^}IITu<x9GQUW zYMS1$HO<3q@o7!w9y-m?*k0<`;ju?*fL-7h@Mi!k`an3ivB%YP#tZhq6qD)9dc@cU zLMiT+Oi$HS7B<==_2$Mq!X$b8o69FXXPx=os@00Jzr?P*rhR7)FP}Q5yCU`JQM@az z#*FF~%i!VTOWH}dCXN3@Tk$F`b(;o3Hh+HwozOW@*mDymF;%<0t!R~ExqgL3Xuk>Z zKg&8{Pfu3-s*FQi8I4YdZm%3O7TU?!Mjv0#xI-H#t@m2UQNlk*aX-91FV+C^4Po9a zAY@RnT38BkX(*vOdQB#6J5(9Wp8S{d&X6-JZhjpeu6=Pw-g76+wr$(Wi?fS<(E8iu zr<69%2Owwt=e=vcSVr;-TehB&L0@m^x-nrk(35*WCsT00WsqQ5>ZjF*Unyji?21Y6 z!2P6~z0_#EEjQ>QtLa8FajjV%zB`c{ofpj~pO_Q98ehDeL=tiz<ciP$9Aq3^-@Cwo zle=;%Xv8$Po_75U*L`5;S>Vq1zUMRdZM&-dS{IEC?aotS?n}Y$m3uA)Yp?}arS=hf z=~ZBvA81<TQDa&f*Mh+#M#nUZDt47RSn7RI39Wl#&6W|~iR0_GJ={d7he+%B>?f#t z9u^1{aHEvVQ|pF(6{TEeIT`s4bj1P@gywID4`GybDOJa??sHxp2$1fxueIbKoc9){ zH2-*ir=V&pj@OCU$k$9_J@?!T3wvQLZhP9nq><+fU;7cee(nUWcl%Eu8wsEij?Z+y z$JxL+mz^qEd>A(l;8seL<y*{|qW7(8u(<n{a%NO9LT6ZHbqtC2;XS(@HTpFp{8Ski z1sSe8i|OLx$?9t4bH%mA>KuBi=)Z#OJQW*z^gUcWPmo#)VxKq77S)lNlI!9dS|hqx zNK)X0Q!v3gN^#Q*C$JVbzYDWzcfZk6^ULqyda*(&YAoxqYV=Bb=#EuV7~k$(&e-jj zFMrDqI(uQ6lAW6wZ{BO)k{4w1MouETKsQ!I;6BQbe@1Y|8W^awSe++FaH<?GSU$MR z+G~0`R4+m}*CECvD6lXN@PD0O4Y_#a?%UC=iduy)-Miz~tilIcPrKX_yZCh`mw$X$ z8^&JP`=Tt>cQ&Jgi!80SUFm}n2cq84XrV9MKV!5$i4oy48a{@hoxBoXrQ$AjQ7wTR z+Mrcfo1z~i+_2)*8Z|A>(Qqf%qnDMok2-7H*<i>{OIWrN{PiHL*g#bhD~96?wu>%1 zK7?%ddBHY&83PGr);KUyhM>fFgaKN?BMd_Cc{bmDCgcUqlzyz`t#7gGUw*44BjsGa zcMR*X=gY9r7uI0e9%8#sU%rQ}u8gfdQu6E;$b7{%tl9vKI|SqIq2ek`8Ug&oV2qm* z@{ngA#b=}my~gb#mS9f-a)A;JV!5aBING8i{V#;nk%cpy$Wq0rmZv_~xv=Tu+c||@ z`usXGem2@w7D<U8JHHqkH+7Vj%?4v#-{9xi%|iavqf@By(!!@|T_Bki2XRX43&~uf zFRfTjW0QRb>vKkpoUE9W&-NSkNVWQNnm$VAGOReJdGz4fA22OcKclQ0Tp!hL)NxbA zNivWlK=f2$qnDn@{dUeQocV(Dz%IUCD_O?cADL1(We3mL;@rfRtU;^J_Tt~4sIr;B z*NK0Poe^~QYF0du*TVu;$Ia-$!pG1j>XWl~)74EOgoFVIQ_*1&x&;p>a!q+A{YrE% zuQ|Z=i{9ybHN2{TbrWI*vJZN@r_>LU=FXB>L~WnNtY57OvxIyndTCI2jAM($$%r$z zLqiU2-||Jw4C}fd7k==AHDKq;Y2yO}HfZIW7ri|yaAs)f<`aKeL${wgZkJ*<FI}*e z^F2#g!OJ5g<<{}ZM>DIaGmBmu%cZfG3ZFd*Z*u*T5`~SS^`Ne4gR$fOrq=pG_#A8D zSsB~!v&rtXzJ8sI>Mw4U!L&#s(JLrZlE0dx6@FA6G{;%=5oPz~TaRm^iUiCxR&lxF zvC<uXH4L|w$zBn<&mZ@p5x9>vKorSyd;#Tpa;jwB=r~y5!zH`yn$q1__`q4Zs8*|c zFV+f5TX(#61X@vo)B%fiPy6t1h3u7?rBCNOuo{yqzEN6;aiMpp*SN$`jCByo*mz<H zJ7iguDR_J<j0Q4mhC2zO5;aCat5sge>y|hpdY_(FBP+5>wYG(=+G=|j@epa(<93^h zCEV`f*JHvoxeDRkT`OK!4g-;mLhW8P<P~D{tR9f=0D*T`fffNHE()<sl(2=7#KTg9 z14ZdCuJ*;RA)A!$SuB(;LVu)rUWg%2FEf%ZhX*v1j8uD)2+~tBGexq!F38=mdS;sg z_c0`yq^*%#f1Vs>zo311Aiior)k6>S?e+_-%Hc{?r(_(6{Djr66m{;nGc@|fYq5ty zKi6(3v2uy#+<HL!?K$?rhwGW&3;S6}NtyO$c^e=kAHV9fY6<UX6=vy-U_ZCgb}HSl z`hljFsuV<Z`|e(KK7!$6Y@TFa%wk>=nR1~ZS&O0vQl%dXA1v!Vx#{E2T;}C0R3W+# zG1CK_fhhc4EBa64uZq7*%Gu|S`e;H!G*vX5B?SR$y$4Fw#Sr_B7%@}gRHCCqIg1M3 zK6U5a=%<QWrn9FG-Yp~{<j*yg<?lXV>$LHjYL*)EV;D^v=->#k3b3{R8ir2*=W{%b z6XI33R|-amSPQWfv>b_ccJT*Z7nhmw+OW5eGU&QSvbDnA;;-WGYdgi?4>ffc0``9~ z1Ysb^b7vkI6GI@T2gH%nzPQICw#H{XKP>JwzUiZQ?=hX!ny@^Ki<=6tOJnez?gfCM zPYVyKVyMdt`1fwnNF?1+hTVta@Ep$nvljpz;^PHm2~E6=cbmYTx+$E1Z{QhgY3y4# z0S7;`k`qwse3qPmSHD)CaV{c%@5OcG1xV!inn~9Mh$_`ds!i|F06ze%F+3VxjE{i% z&`I3!Ep3I{pfZ1fWq`K{*uu;IgR|=i0kGcgnSegyx;2pWGwbegXi}VobKUL?SIMDm z@NbXCSy$}CQ}D*xxaQMYW%`|y*aw5N?lTW#=(wlh|NCe={Ev}7X^?cDCji-gUwISE z@O;(k)r;0=QQbEidaQ}+A1N9P8#mwP(e<~h@o*y7KhGc0q{rZsX7!-=s;#o9`%e<@ zM>>L#ViQHnu3IUo<rjL-ff+*?MA8i3AKY_|*=sppwDS(3tV7AD{ogm3S&wCZdhG{X zJ{?_K+xO@Dzi@U{y@2ZbCM<4r|JF0Fj+T^j7rw&n)7rzYay#wTu4`))S^I?0lfmdW zaT$J1Eb?OO)O7tWFd$gQ>F{yagw8Z9m^e3vx9;ArAd3JDP-Bo6L<<m<7lZ{^jqlYA zdSOn`YI?z=^$6}w@Em)bHV>mjfWHW}MK~oPf9k_!^t~`OJ4+6s8&j>ClOn6>jQJ&B zW`WxmyRS}t$ToUioO**r)X*!6a`T<IpWQhW%>LRXlK1_om;P~kYPIrrux1rMLXuA? z$H4NBq^cGDes0{^6!@gL!e^P>5QR;&2S9INFO`Qy5%w4Xi1$I%+wc%NnvzMkTSPh( zduozdYBExrqzzlnE)|Rg5uy6G?5xwd#k%rYmN!`|JMkr5t;+N3U7h>hujt_={kG_c znemnEEcW~<pefDG#KW%vE=sJv=fDw++f{uk-rRQ56rrbTGgNzo@K15A6I7`hC#uA} z$*6#eJkA0%iB8D_&a0P0!NY=|N~8p{CCiZpU{rTn;WO}=#ix1&N<sbFmfT!$v5z&l zCQH0mtj3IRTy8pM`!^jAUVr}UNGa_3H7|VYkgVIJ-}tOMi<8E`+Gf3(Kl{UqVXQ4% zUn??s*4d_ZtK;Lci=*Yw4kVtqhhD8`68C&S-VyGjk$whRNPTZAn^t($&LE444hLbb zJrtJO0KbhrRHJmW9R)T@)SM_{phT^Xf;exFVpG)IC}O5WHN)%byYzzBLH7$4-W8<V zgN_rt;K>D0ZKhDUE_XiJt#wmDrOwVuO>KORjd}ge0L!$IeTJI-?!Q{`G;6nHe?UO- zRP7wAymE)XUAwRSj_&$w?c$zuQXEUWui3+X)26VA!+H#rhI47mfD>r@$V~OI21Qr{ zU+%OqS+~3XMDDaS%K7u5g7bWtbgR53K7&`R(_WSBVnuzURqBWuq(`g5@iIQ&El^%s z5oujmdL$9C35Zq+U39AiP-~I?foXNeta`MXI(~Ka-hASraqaROl>gjd$}>0lQyaCy zHjy2Mj$*;r*_QI^+5ncLy~>akkcMl=`e<KL41rixDaUvtOl!PiRbzC*6)~O&<!3x` zuM1gI!+jTymfN&i^(!OLBVwX;4thkK$gnoU7d6)kSn2<B&?+5S)vKV_0xfk1kJ0Wd zX69Ah3c4*}hqq|4tn(`NA1#Rf@jBdJOJ$$ZKhZ{k`XzlQ?Uw0ok|nCitJ|Z`9F6Od zfST$eiou)aphKdXYa)3@Urmy8(`pJ{5e9g64GdS&S`|X=;WetZ6rmhq^-lwu>@DJ+ z;5AuKd$@$1ESswait01iUyHVqTu(X@Io<Z~;K7#zLf-3^YYu#LYWKVT(=BTz%|9Lx zt{t-Rej^9>8_oID!OLIb%8n)bdc@D|y%7N3$@OgbY|aZtU6$D>NPHGFHp!@Ov})|E zFkZ$JpKbO;s}@2bRDbaWD$O0ON}Gz#&)DM3E<B&V8LYpn(!}z$$iuB6e*))BPQYIc zGL6?I&F38W<Pd%Ss)1ah#K5=1hMH@pEipHvZX0vVtIbe79+&xlblcdsTXfsl#6H;O z{FN21_3F0qlM_AwtGH58E)!YmiBYw&E=K4gB;JS_$T{}-LF61iA*x0wOHnlfS-Tv5 ze#T*~M^8t_*$s7q)5k1KvJDffc1s&K<Ci<~Xr`RLF`A(rA?~HXIUOoiuaCZZJ}TKK z18$hrf5S+|Kvh$qXfvniU;M-uagB<A9q3N_OumXYd+tKPX6Nl5+O~r8oAyd2*w3-$ zCDO|BsThct90i)j>SGdmz*r)o*^DQK%@AX9BXs_HNwq%?ng1Mr+C~4><RRwz)5iKY z!%OORf7p&E(EWAbv)7DX&Ko@o&KLCHnLP?zn;FZ#@fw|PWx@Y(K+w5Q`csKguNjA( zH=yVNwCai;pATA&bQcR@F_^MGvv-RyKGH|mA)3UA5r8c`xwo|ihYJpAYiwvK{eF23 z>HQI~%DuHgN<DN{i3h&c5PoP~y>oe8Q8k6fbl4K~&nM06v++I$%0rUGuL+;sNWF{7 zXL42HT6wTEO8a?yO;7=m12FoakO`{ienvzgTb2VEOZ}c!_%0kNAR-J=xL&_rD&ZXf z$_4nQkUInRHeP^_GbnQY#iAkYdgb@+I<#a9{I}FUPY&<cCBJL;{;OV)`}$eNP3ZZ| zx`usLzf!3@-ZE}n=T7VE_qjN{zRiz^yu`v5ah}1x)MD##{_}gyvcbdnLg8qo!p>xH z{=sXthxa{xo=Y{#Uk0!6`<p{|;y%l&QrjwAx;=GWHpzr`QE0wEsz`J-@E4+Kh=tD* zx^1&Z`~(mn5C9h_@>{_nUKd+9w%de;<qx3is!Jch)b?d9=!7hRjL_XiHd9+Q#OrQz zA8qGjSB-<BhJ=yjC`K7nln*B{5vz<ACZfv0A?`@bl&Z|=zNPs5VMq0X8h#eXTSeOk z7O-pe`OR0EP5Y@;_A#C*Zs&sDSKtxp`3E;3VN6}94daQA5pb&wk9K_`CNlaEdlyT= z-a1@x{!s;JsQO|^AGq#fs;ynbT}*VRP<yvC<g@z!dkFsn6Y+l%6f*P>D-**2scv@H z2@N0p=`|F6Z!idW{zG7qK<{y3A^tiRf;O8*wC6K6_aglN!a~f+6u=k=!gTg}E0(<d zY+&%im$hDpv}0_350*NsG&nFH9jvqhCZ8(Vc}aR-E6`%tlKhdg2?>GEuFMv@7!Fi( zlFFk+%L1_H;Va@X(&e-J=wCr!FgDjGDJH@jfi^ir8VpDX%AZ0!1;OykJ%luYgb3ay zCPGk%4(bRfqzZGC<V^_*{`HL3`+R=S9xQF%k>H@hv3w@FZ1H29b?Com$E%oEm=?qN z(y60n$<9;yPEZ`O*EJ`gA)>=Hp;AUi3ZJ<c!&h0r|Bn&>&(S_{pg7A-!9KeN=3=60 zmFpHk-RSw8Wp|1ZYv@t?s_ZBF8-`oOfT>ZMTbrtJ;%B9}`{rUC9OGO(oR}ClCypHE zxMuWaPTcA^SjD4pY|4pu<L<`sDP9?Q><9&ol>M-QG%8>bSKfn=6X;#ua>mK1$su!I z8++y&8luE&x8L1!F=T4+ylHE0*3lB|>?6PEq}I~+@~V6`a({o6Dt_}-lwEUb*A-ks zUARM5K6+<(?xqHl=*%?2O$FcM-pD9aEbLINdbN<%(*?)J2>Q^!jHI)$TW+Z{MLfaJ zRxgsXt$W!gwwsQU&#k-OY6X7cC67dq^x~bv*m|6AGP5L}4&qt?n->u`-A;gff}mfy zdXQMqO*b`aScj792i^&h{llMsuyXF%z9HJJ9t9WjS+n5mMZ*@{8bggp4*VF+J5G4L z?Mg-d>}=z)&sUgmZO+0UmNE^OmO9^@adoPMP9(Lr&wBxkh2L)yI`R`F`vJIRIyw@p zqa$7!dmkO+<5jx7ZJQou10C@=m#Re~^FSV_H##CRH%RjlK9WV#bfF^;&KGphE^Eh8 ze=(r1U*M0&wHpB=`m&B4wY!Cf$mL`wv<~cQ^7fG%PipGGNit(+8G7a5Mn|o+xaBz2 zG+(s|W}~SzN%uX(01cfYs6>W`;il|nBmwCPrH9l?Ni<$mop>D!u878$U=?`++)_{p zyzV4N&Ng0@%q8e<lO8BZ@S-Upg!>&`eay&brA9%SD45%)ebBP~h0&YWM9g!XTG_az zqi%Mu>EZKneX{z=vbp&m9<v=w&QE4F<Xc+lh>=_>J6C@Hz*%Z4V&$`oq}Yb_k1LY) z*cl_=8gcC!twML4{oCj;k^t64NFvQdKl?uHUN`FJHAC4##rCRARN<4bdKhzRjQ(Ow z#))5IDq@Ij6SJDWOpKWmLjh+D&cODVqxk+rMocq$>7x53D1w-~F;E2F>|p)=c`DDL ztG!6>jS?PW<KQW~Rd6bCa=hl;z4vmEU#qn@=IngkJjJ|d+Pe2@v#)JhvY%hbV!GaI z2ikLgbYUS2duxIuzki4oZj+UpZ;xoxws<*Y`a(syISbmFa%wZx7`-1RGHOQuBp+jA ztcp1Hh7M4f!vM0ulk?Q+&<c52a|FqI=0^ZgqFZeWLqs(^WKcn(^h8yOZm38)&60PV z4-EMEtk(08me<o!`wZf&DkB#pM-1c3`gdZfMMq(3C-bFDIkddwj6`wQ?;lg#b?ntb z_PO(c)|}0mFkrGmnh)NSxiw~O13ElkWqMb8FT`GW{Kj$c@#%~R_8&_SW^ixhK#|m^ zJ7auu5b(M^hnu{0A3N-(*yu|@YR&K~fH7vaFX+HhcAg0g{2AtWkn_eM1WCLj&H1I^ zz-g2D3igtgi+Qiubdsk#KY{+D+0LFga1v&Va}T{mx0}bBrm3M~uA&J7d5u0kvSEzH z+}y;fj3_$y^bl(k`aRbBW;c~T;ZkO(GSHZaz!m8_=_J26)hKr&4yf1pKCWGD{;xaH zKRICApNLc45JZeU|GpbtzB}UFIm|0d+wO`0kg0!C1mNR?8ai0a&g}tu++awdBocxc z9g>2hMJ#Y$JDO9FqwRNjosX{)0f+n?hU%;P<}Z=;Nk-oT^FON}j8uXTi9!_I8b2`t zXE7XibYd|PF5*SNA&psCc*dkA)6&JGD`0>rgvt~Z($vJ#ZvOH_(y!`-oiWW`p1JQu z$FXA7Z1x}3r|4MhiP^_OCryxMl}3PN_xP)8_hdeC@CdMIf4v~vAOF~(;m|3va%7{N z@c73P6c3!<B!^>$6DscE?y*MD41?5Ip&4{d>0{^q4Y?WT#%G4^1-C?r8G6LOG|qc^ zn4>;B#H8-oiOEG4#NItHY+Y3G%}rZv)AOgB6(wQqr0vnTojiEN@QKfd=R@vWpU2%- z!+XAFRz6etdFNAg>nHA1l<gb%1?N-G?v|8&EBOWe{7d`Hf#UqnQX};9k2-0|<!_5g z#kx4*;`|#=jCoLU$ICWI!3LQMqL0QrxI+f*1mVP^9T2c151|SyEiXMtZjGK;rGpQf zN8zaZ=<@^Gm6j}d=jq_!U(RX0&t0@#Y&N4gYoZP6%~I#S6dW{TEIja~Oun#j*LAtk za9j_t!TE~j$JXSJpC@>ALm;EOa2Hh#__;Bz$}l&`Ye-@ZaNcVePZIGY(a3#OC7wLR z6Q-)7ej2PFBK)8WPa-)0@X)-nte7~6#c*Q0kOwG%MDO{kaf!qU!L%JB<prKaIyKM3 z#Q~^}cXjTN?V>JKFj0x?l*vZ_$*W&rY}>m(@R|F!UDO^mQ@F+EtO)Ys?bnV#9qNoM z?fTu<9$2K{AZIZpYisbpo2<?nkWMQ;W-q-47w$*xA=)dpZ``Z^9XtYA@z**#wR?xw z;Nnu2zd^-)Wh$z&(oDP62ro=I4U3TGBh$u{Wc-AR1;i0HitAKUavCiTI?Mb|v|06& z1-l+b!7Ble1w@hn3+SPz(!G<Q+j}`0(V|Bz7BCY9UjK3m=*Z}chY~}vbdCoNS;WO% zuL;*+ZCM6;$EG##w*)PkGUH^z<Ty>+d-Ba7`L|wVQTqJB6h;2<fN&AYu8e5gZuS~k zUY@`0I`uohS(Ew_QC{R_#M)U{vq0pUdU^#;h77s!GPkH1i{#dG!FqcVutYqEh!}4n z;&n`qHXi@L7s5pyk~HRiw;5eO{A-~k<ulv}^b-52h}{O=0RIGSq&2@p9{Lejx&;_x zpvmepGGoX7-;9ilxDF%pm<AeI=)Xn=5?-Q|ZsF(lH7#hm|IK-P>ZtPRS_+%gD>#Ss z)ArIo;g4Tt6AI=->r8{!(E#gaM|QPXUpFxzW8H+wHJ<orPan(d!}K?TRNO))5OsHB z4No?McqSqNg)6$~cSz~bx=OA!hR;QZEKy?J*k)Fi&&-A0u-x4~{Ci=!wxS!36Rx)V zv52>p#y;w7tU9G*l+yANvF^B!+oaUPy4&GL&heU=vF>7K#*_csnVGDjG=VN#hk&@f zMpCmDYK~2=MnswFuz4m&qN59tdvfU(^x|sCCXRkQy{p);x8}W}-ERUogZ0w4>@uH; z;K{Xdtgp5Y_GF3JI_zBrX80rat`g#ge5f%I0pa>ugR3H9Wn=G*m`NxGf!7)bK==cs zQRPTdgmkwcXspl!USX15^a6~dP4nUp=pAk|9oRd=nF1A(4taWdiX>q}m5gSU%5RU+ zZppdM?{cr5v*#4$*ru=F5j?$chO}KfRkax}2}LfwJuABQCgXdZ{g~yAi`pVqyl$1k zt<Ld$QvjE>TiPNikT+rEC)dVF{}lTg2Ol6`t*l1}xE{vfsQZMC!Ywc+>f<N75dv8e zkuGM9oqN)(;q4%1^bQR&Df)#`gsuY{Pt?o1W=&8DO}lnt<%geqh3=@M&z45S7sUJf zg-jj&RA~2t-qO=sOQRCFe>khBg?)JbGP|!uDmTu(_WILV-OwZ>42Sh=f5umAd4qRl z^Tdn?gKJifeNI8Ym^Eq@(J!X73f1uGVx0n=pJME@kYwYDkL5J@vO)rk>5C_B^wSiP zqT31Fw@_*pia)_4+^89ZHN_HntSOya2YMS||AB#E;{gbH1OQL7bwC75!iGvMS%&s8 zNkXRsd2=F36bjbtgeVm7?b^wzIYmz;6>9bJ$yQD$q39q5F@_3-eoXE#;*%!{1zUeA zk2}$!-PzA29q89=UIXd)=UN#|1D`I!!dMzAz-M`kGx6`WGF*1Gax7gRf*a3itxWKU zy^Ed6NJ7OW|6{G(0%I%^+Fp<Z>8k|J4M`Q&O8)z7X?W#=%Km<_Z?_5Qk>6YH@!UQ~ z!pyX!DcY!>&<{QM+3<j`r3KE9Y%EI)<DJbn&XNf2wYVgRuU=jD&4IyOL#k1WVvw>Z zU79L>(MHKJmKpHB>Z6M~t_q}CWa_u4g=Li1)xj6xW*K5+92_;Fs)#8Qz&A>O&y_(B zo{Y09RZgG}LnP_JA4{uxuYnp`7v21jW2#qHS`S_P>Q%0nQ4gI!Yu2qt@60GG&7eYl zv!1C&Unv9^XxwAb0VjfENWijP-=yLi+ela2(E1MP*MOaC^Cty{Xup44ujRl&=74pX z{l?46{#7}pKUqU}o>*!tI`e60NXaJcl8se*_rCTW^%?DPVYJ+E%8`2MYSEFqp`1x= zn@(=gGksmx@x^Ta%4N?fD3;m0bjE6hjo|D}_P)C#DQx>~ZL~DboB^z|wrQto*89xB zu2G+vn2gez`da!RxbA}o1lLn%uBQ8mh6iZCm66^o9gxh#^f~yV=B5);nZ7z50Ii4S zqlV~3z-V&hS^m<RR(%0ag=SRF$jHF5R;igm%UZ3hv>Gj|zI<ZUELdR+))ouwUf+Z) zEN?0Z0dUk{inAT;+1<wj{pT#vK0}}MQy&EcfBQ<H|1Z~5YMcrQSXZzA7+E>MqPGt5 zkI-ISVrSLf8pCKg*=XKt%+TEa5*CiFTePcRi^D4p1u&*8oYbO6mDSzG7uU&abB?o- zQshMzq&;HhV1~Sd(YG%gn!PG+fbkcVvWQfuKnjn>4KTuAGbGc{?`nid^%kSYL=+Xz zdBHlqYXn!;(?QE%y#0gfmY7vv1OQBd_b<xHv$A<ZPxox^hJ9L9X;6r|>xTB76j#1W z_CLO(Vq?!LqIdR_y7k57wYq)}p8q@AbQYD<;*D=){~s5>f!R~fY(F4?VFL9Uqz37B z4OAVNUOXCi8~Ru`x8C+(T525nv{PO$4tYJV5YGqo6d6_mu0^wVfm<_p>51k@{qiS7 zKV2hEt{OPy%m;o_#MYlzE;`%Y%9d{UqMoyP=w?=}<m=k}6-#_t2cCAAMKrGtNdG^d zXPnZ?SBs|lT6^V_>&Nd&8<fv3<!)>=m5_;J@Ksu%yFIbDfkt77y6y7uQ3QNvY^{58 zEL0F*;CXm}Jdg=sb|9~rmh?23Tx#?Afqxx#t;GwYQbPiYI#hCAnD+VH^5J8oQzbLl zI3_L5emn>^l$qwjf2e~DLnuZPWDRqVL>NxP7zq7uJTaVGm4%2}RaijpkpSM$a!~hp zj6@7%d>|XvZ&U5M(aDkBnrN*CoxmlcGx=ZdNsd9mOqx}`4)%$oL&y~QM{`5bRknv( zMclAPRvlM83acajs<9XXH4=V|kcQBIl**zN00r?L1%W#sAlxu5dhw*qguZ+hgV_rB zKHZX@ZRXS#&Vd_{!1zLc_(@SSV$?F32S(OptsX`dM5))okqpn!E;GAj<?N{Z@biDC z#wh0XD;)XZr+!b54i1|&JBr!vbZ)nnrLa*EGYTtdzkJ%c?R@QBZHx5Y^Vg%M^MWYt z=AXxUo&G+0I?In{2|w-bg}Jw=C`M1XbEqP&iVpEr^^;!JGj|^}#|Y2}!9(*`T!D<n zr#Rygo*W`hwU?g)Hx;-^Izc!zYj`GHnAtRri=s{FX`s7ov;=0+<{&$hw~fqqtUcuK zU;NASj(o??!@-=#v5+lmUyBY@{3qo_<wwsr-Z#K9X;9QOx&5RmQFmTCrd@v}Y-)Zb z7V=K4?H5+FymIVsM+ZJru-#F}ilPo`e{L+;=0JEQndVh|V}8Ms1s+FhRPr2An|8`2 zt=v@HjflsmT{|vJgR$d=_|sJ2T_B}nDN_T2g_VFx^Mv0-6Z04WH910@mMT<MLburA z?M=%{n`V?|mX&5^sCC_K+sWoPEGuo8;dT8sjj3H(X}gTlj%B4C$z%{lYBs04Q9h(Y zvd}3Ac&TWV0Ii{eee{iRgzc8(T9UX&0e%fsOe9W6He}3fQF8Yka12QN?dbS@m2ytc z+;K33_fPosLeT8PF?pz99@Q71V3(p!VN(mHAFMRUB3VZE+2<FRF>rm~>aF_)^1f2= zs*!yj^>cpS$r?5)Bx14hqVm@j=j*qBRrsX5VUr}~yUUTh>Bry8qa^it=cxuwM$94r zk$tUIU2{rNj&0*z8Z{YFU}hb9u;e~TU0d1`#uRYAoolzAYCo6_pY#m&Y7lxg+(O6l z4AWC!5gb)pb?8WY)rvY-(PLBBUOl<a-7fYD>KdU0^)3pcwkE`U@q!kSjq+p^)kMAg zJ*^CFf5>{{6U3&_*44>SYkRh<j<vLY8C}Mb<9V&2wX{uHX`77F_GP8*|FK=zvwv?E z&Vx?>b#GRhXqrS$C|Z3;?#+_-ZZ3&PkH52L#KxGSTN_`9tWxPtY0%^?(bdedGO)|! zol$A|X`$mrPuS>4H*=+LmomS&KIL6n_YLBGc;KqBO~woum*c#Z8yq$!G-9#b+Vb5= z?az1aDSUXZ*Ui%RXPNcQ+wyQ}=Q{1Hy4i!K$;$4Hzx?s+9!WZ~jRn`s9yr0w#`oke zbZKdem^h2GdJXDv?fO&C=-UJhLP+-)=HE~~Pz@P`N_y25?uo1F+8-ZN;?^K?88Sey zrMUAnns$b?h$p^5pa)KJl6b6IR$4VfcbwD|cMExRse)cXX9}DQpJPFXfMnh0Jfu=L zSFEi03t-^KC+vvLdAV@^p~z#!$It?NbngYnBGlQXp_3;P1YSNah<_feT@0V#FwpSv zL%q@P!C0d+&&lDBe|+wkB+&3*yLO#CnId9=iNm%fgU?l<#_By8km#u9S_>az<_3$g z7KnL6D2!As{vwM4RM<;UD~l$w$>LFXkfqhjN~>q6xNOsPe^qI9Ybg{BY?o&_gxJw) zP(-L}2V-HFu^t}Se9LAxY(9A#VDsr_bHI=;ledKDmmdx0cZ0N7q9(@rVCbJ8^I+&Z z*Aa$ZuU=o2T<l-LFR;`uT^1~Wji0Tpmp?<D1$Eho^XjtUV^f8ZF}gq*D4c5L!p7s2 zdgaDYpYKzCo@}oLDA?6V)zuJ+%Jgxz9K3!}^ZWySIq&-IfdQk-z7Hw%-??q}N6(>V zTiRaIOIy$SS(p5<VlsP~waiHZxKZ&DZY!3SqMzK+h}^e+!Bq{IK~HTRm|fI0wYwT^ zbb3Q_Ol+Uwm^^s~!Cc_}*i0|>J7(Z>>$T`)tG7UPjX#vb)pf8>3tAl97s=yU+Izb$ zhD;8eH)Y$MI7L}JqrJ9{4TxrmckGNY^g;P#ANp4*f4`M7c=KsljJXFqt3yf-5I4IC zyfWd%7{D4N1YI5ho+5Y?{}AO`(s}sf7S3N*vgF4tG#2lC3O7A0)!x9pYmeCBBYh5n zu(bYg??Y_$;l791D6Plg-k_5+XPSJe;tX!Au)tfUs$b7d3ivBHZwR9;&LfVADePza zghZur(VOGW(fcA5N5x%pI7Wv){<e%#Bt%d-<GIL$>b!t_A!|ns8r)hIABtiSSLhBW z4|i54XFD4WWR8Ku$NNeBxVb^gjG;Tn)JYCdrtlrScu-|~4*HlS^iE+|5~d|9wY2xl zgHZtxL>=vk+osTw!7v>bE!nX&rb=Vwt2yhZ)u7+bQEFAxHh!Bb;>s{b{B}CIaN5-R z-6EGpD79+OUbM($@_W=+dyQ>TK)8h;NnLgto1QjxH4QXfHkD@SJ0M&~coisJ%!1DI zx?KmCG|($_hk;H1S%iDiYOMY<Bv#|~pC!7rpqj4#3=Mj!=|8LK`B_8#XK*VrJs;LW ze-XY&E0KbIrcCXqzm#Y#?F@x#E$vyR_R(KL7~7wGH{m@%IFpks_?|XEe2>;mP$=%# z|JV0V`j!8Ow6B0~>T3VbIrk=Mlcq_N8bxZ9qAO6KxWn)Q#Rilj6<q32+}$>0xNpFK zat91HY#U5~4Hz&t-Z6I{qq+TmpL25~dwJjA@Avt$^-6M+ob#OLJTCqpb#DqO9XuqL zPcmlougZ3W6bu`Z$0r*zde;aGDH%LCmrXYI?^j(dvlY=(xJj?!ZWK~9bZ8FU;GIq( zrRAQFt84L*AvyG2eXG}^Yx+b+zpC<YkL7T%yj)b_AC$|phu|V;Xf|iLgL1Roe+?VM znRxTwkQ~OxW#ncXV;;+q#Y^Hb`hfc{`T$+gdiPMru)e6PC?mQ)RM@twg9j#4PX<u) z>M5ueRUV&$fLuawBp#EyLxe~G1E3K^!9?dmy9<e>8O=%fKh4O}lA?^vY)npaC8O#% zi*lJI_a*C*?77?Mz>bBmreW&22WxHW)iBmcx+<~sR_f~&6J_;yE7oFk*zj)a`AJ7+ z_qDCU)MIR<yvNS^tGiW)b@qs^tt~jPqmC^-UanXjwx#FG{2t=;I;b}*KIiJmP7Ee& z#C$<WK42OnJf9{1@O*meA`59)7mbDUQ@`=@v;Wcg`G4_wVyltQvsp8;H}QAW%hM1? zc}DYjetXe*A+972KF>z*dCogRK2M~RPS<>%#vZxPK3j1F9#6hnxI8(eeuMlf_%ro- z7>!=UA}9&cxgLF}?@+N=dW;s-8<Dge;qQ(@8+Y*{YKd6Il^>H*V#F)hI9Owm+XU(Y z>kjIGqd1Zj-#87Ho!Vo|-0c19ABIQn9Nl+($tIROw&so})b;sn$mHx{{V0viSk6q} zJb$C?@pju9@k=9F+!2|%^J}g|W=iGfs1o@Zbms_QT(Od<Mdu|t;EU39)_`~=u`+td zme*{`?bHxl3DQnBaiXvsKW77M6+UfFsi{4gBu=FFV^R<@h?k(16iFFT;as9XL?|T? z!DyaQ&6-IO8U6c?n=oQeYBtpG$<<cf`k`|K%XLcAXNVTIOGaf3%gE@{t^1@EZ5OuT ztVdt>yT<pQeAZ-s&>Nw$Z?iKyPRo2kuKQ2)v2DDv-Mm3aKxd-L$xX8pyRVfZS;!jt z5Ics>^vYqg@Q>~Guoo;*VuXm$ccse9xH}Fx-u!O6d}DV`Z3Wn9{0_Vv(kbKP;Bif~ z9|$l{=+X)q;|)FmRu&QbCgK*Jub1-N-%tWsWb0Bbvw*=ZMwMbd75zLS3_TTxh)ebs zj1lQo#4dc_t4QH`Bmwr2UqM!w9DE{%_|Ygt5TjaPnznJUMy`13|1s<&WCm6}M*ZYn z^X?C#V=lh(`Yf#_i2FCj)Hf>)KdCp&+0tLH-@?5crDbT84b`6|>hTp}XsK8qGD?U+ z4;|&d4GO#f8f&uOprmZ~_ial){v{&p*W(fE${nslyB;3~IITd8)(*!1xc1afHAf_! znY;ZtBXd*xQD*223ziK73)l0Dg!HA8p#aI!yF5gFb>%~`TZCi@ZkuH%<2eo|((PGx zSayTFYp5`-2Qp*?Xe!jcIGCfb3IIueND81o^uuz0#D=a@-x%6BxAC&lGIv?QvPQX$ zhp^9$$J{O5QM_FJj8%8{g=1tqi&4Me8ws9GK!+a1T*3`y8cqqSstc21;q@DR(1IlC z#wR7zB5Vtx2qOrc6AB~soX|C)lur{1BXvq>JG`Xq3`IVT&pd{da#2?W^MR`2nU6$8 zEIji8rA=k>qiSDP{qY}q)Xl9oZ!onho>wooUMDsYqW@3sx7klW{Gc^0{`qJ2DQ0p5 zULFuCP*hLvkpMHI7`(nP0c)WfRg@qTjF9L&hP4QywZP#-dQesnCgbN~$M*G=Yeupa zdEsgE5?Uj<Myqlo6<#VS`%bOp<Qau0`KCSY7VO)V{IGi<IDtExZ*xE5P9WAo#0 z{ZLpS1z5$H0|2hyJbcW-7BS}kIh)D1bBO@?&p?z}__rDG^ZN!PNob~%J;>P1Ztq0m zTG@KabwX`m(I@%`_q#NMt`I<C0CgK`>xdbMaq55$*a2d0y5ChtCX@ps2lGtGz|qJg z@EaLC=6-vCC<!%oAutotvtCltG^x4M-Rax185JMS0J=*Fe046WBB4LGhgJZ(M*v-0 zKoo-xP%$?B=0A*0?{0l!3Y&ulStsVOHH>f@MaoX3uy%M!*~wV`|7qZM-gqF7a;hT_ zl?-yfDFRvsvd{A>8fckhfN4kdD>HS{i8l06oFdc08#btyghVi_Umk*QYZ1_VNzYUe z(x<TkgsAz5iZNbVERdEUDu1@_z*l)LofcO)bzVVPKu=>EspE3B@@btIzxkWVUEAC1 z2K4wRQvzTdWoV-~JpEQYd14}<00354q$lv!KPm!c7<?WI42@*=e-dO`>+?%L|1%=& zn-kHi%EMeo4m>@y<dFLsrNt%iX^j8&=H6eDM<$$Jxcw9nWj#}l8>XYH<t|Yzstsya zw{F{xwsvbW6B|(T1=^E9R^bcRkyYo=N|ktu&`|362ylvcg<`~-dtW3+5lJ1$exNe* zFo2S>FN#@<s-jNRjDR45vJohtOhuEyYFrQ<HKD|0w7tH4>+W~dze0_+#73<8P3!iL zYQ_e0KK#&>L1U+njI34ruM_L{OUzuWrTW=~Rqi(|6EbHWsL{YI*B<fcjAJ$HS!3jm z9l4QJ|9<G8PvA>WMZrn+k9(IpcAobZKvR7ZtGWAEWSiG9%AcQWllF(Y^imDZ&KI9< z)ve+Hi^>?jcd%r9@0$8kPsrP&QC+JGq_|{ogrQ24ra}p9;)^s4@R55VWvfAuqLQ<I z@h*@*lD(BFm3rDEAoSGoS%8e}BqR;cdQ)lU#%VB1;swAfA{?)Iz(p2$2yk3-?<ku) zYvR+{W>a*{_jcGyb~^d$IURZo>tqkDaduh3jO2omJ@VCoroNrFCRdfL#RCc&+vL>t zoK1XVX4Z<EKN!au|GL+8|0Nzh?CaTMZvSAEU*FTc;#Ni!XCnu%O__Ud=a}1Od8c|7 zdvCA0+teL<&t({5C=b)H<Uf-%Z^9!emmiPd!r041N<9p{e$r7WDY4)aO`%JGm{A<B zNUG;a>TD;QRmRvpmzw>aD0#F(D|ysCm$BRjv8eQ;l|5pH;m9a_7JE+Qv=K5xq7eL8 zr)GM{JNbWnq@Jt>5UTwGt|TFR!Z&U449kB=Y_9sDlOIRNm(4uYn{9|}(cFr4{`rPT z6*h(dVo`>4MfU5s6d(!(uwOxWMR1YUr^Xv*<D*pwNd=&&MG7D!EQUxyq_7AwV6&4Q zo%46M&1to457GUSZR=8UQ{H+lrlYZ3owW0)g$-1XSnF{GWtukCxBm5q`SaUsJ=PWi zq-+J;qT%J!=_<i4AfYuNkwDCWM#`foAP5z}#VK5zL>DmcpoFp4JK8=a1IFdV<;6d< zHKJZgy&$9QY_q&3IXNRr*{g~6g9ohFE>N0eyQYW2P&WC~&^T^4Fow`~V-rB~pZ-vx z{^?XoACg#gUC~A15)rV3HflES*2DM+ctlu1<DE&h%*cK9uV$s56V<HT<3%kibuxRL z^+7EwcRJ|7R79EXM?`KsVnW6#4y{6o!)HGZ(6{w5c@jvKM3F}dvx5>9;E(h3al~qm zKtZn)KvA*dsW}d!L!rYtDRh)bC_--O0u>5G4-cZDC_mnO@3+lbRH-_5jxEn<v@K0x zL%&r%sS@f4s~8;}-s8l=8yBkYb|04Nm_vf?2bP^se@_W#8yBrQwl(6!sz++ii)BeH z8|h|e3#LulwCZ28xjbXUA}OQ(kReYThCBZIAIJ_73%b}1HrF`BS>+<WxGvGVgomlN zULb_n1(GC*Q+X14cY9}uwe?G*Q>tr^U{m@>k{PK;3xU8K9);RNRJ%oF(vayq%4BlY zg4+yyg!i6*Zg99cb5L-$G_VtkJY2TFt3BB5a)dZHOdYkQW7qCiBNtvz<AqYhl5oEI z{_^@UTT0sI)qdw!qdf2K^6r`GGdIan-%c$?jFKviFQRMbx+^5nbyhEn{Tzu3e-WOF z_a4J-03p=HYXxc21QeJ^(Gk&4_&_jAgdZ}d3RMM>OaUTD(gp0`{Jng^Hh0lazf_G; zKmNqJ=Y#0z=g+HGp{Y#cYuuBA)VC^rRNpk^NWWjX^}S{bZ=(Jr$6_y2U4DaSlxX5g z+c_W)M)*%j2ysP-Kt`8;#Z{1)f0H^$l}hEY&z%kn`%#Hlb1W?U$TR0f{f093%ML!E z%Gc%lzD~+YJU(~RahYivh|oWJs$GmjuzMp6^Aw9mGo|4OywG=VfLX`OJ?JqJ5CqGJ z!n9sOp8B{aj<E|QW_l~+o=9g|kU=S7)-R|XVqbtXMVti@Q(&NJ$kzq|C83$UR3cR? znW6p_b!K(*wpG&V4J-<uTXC;&2FkX%2lB)B|9<+M%w0JyKC6`9cV}ZVz=wvYz)$hi z5rzf-J};f)1hAin&x=dK@rmZNQ}`S-r#&%;ui+$2a}uWEhQ}-~;QAjk184Om>Jd*M zqUM>Ia3+bFjTr!`y5v=)-ZktL)##A{g%R08wnm^EDl<HoM5%Vp9Q5x-<A;H?XtcM- zSAK15gZPseSW0u07%hAXIc3#6+dE+8yrkBy)ukgNq`#+7iPBz&HN-E_2wU6dhZpE3 z!fPmB4x8Mshj%k65)l`mbD(%qgX6!CkBO*pS^d}32Y<+};*t@+6B2%P-&?n;5BReA zg7<gVuE-B|*rQ)IzRZuPZ=PHEf_nOh#P_lIXJ>YvkhAxkB$s7&=<@d(X#tZCG#fK? z^**t)QFUrM7PTrYJXJjTRi64l`p)*ZoftK*7pgD^I=(1u$V=8SCx|m<+DBS(egFEW z(j9kum(<VU{_~|vPV4e77M_03F~hcb;g&o0u=U#uT_{nU<NiD7tCwb7o*>EJo?U&M z%gX8lM;V(y<CWBWxha;4#vA^S@zS>T>9r_2BWx-EKjU5H?&g&G*xmQfzUH*9{A}Ur zcO50RCl_sf+a9)IN4^WX?`ZcgAzwZ}>(Y2h{{Fd@C%F9V>Ye3AHpx&~Svg7VDxU{@ z(Rn=HV5r4DKHS-0X2%RG4fO6PwX3uTv#DkHHd(y8dXab+u}8qgILIbz@mZ=h*jKS> zwfPX>p;s0UkO92L7Xzc3Dx}Ro(hEq@2rL7GEt3R}0+*GGDwmN@QaUuD%&j(l?V~U! zOaADyDeB<^AG^Y~tdn~2Y=qC7K7QfySMI8OCOh`{@<S$!Frl*2_%=oug|UuMqP58K zXx|700n_Q6kfKO%G6#ujj|hCQiYvvTy#USB*EEijE`7FM*mJe98ZqpsW~2p>MVFhB zll8%~SFXJq=3=!zWZ4tSzMZ-W7!x+tX0nWZYuT4m)I$e84Z}=W@W-cL{eodSrx^eF z`+)=5zyU|pKi06ZezQU+N>jWk8h)}yhAB$T#;F9)npELYGiL}@NAC(K2!c-X^x%0E zswCsR5~7_VwNs2Z5sB~%z(V7oN4&Ctpavu`(w0Zq9ilH%wP`}U0p*5_gM?Z%F{ot{ zF<FsmX}o9FmIl*G-ZV;5@6Km#OUyRK%H^5A?#x~mw*IqChh@3LlCx}H`xiG~h14KT zFM4C1S?<FJ4&o&b+Sh%g_ecrVi&(;#?CjAu)om|Id{o{|ll=DCVix)S1oaLI7OEdc zWNtso&98OF{!@^5zY{A?9h0N{va&?%fWFdo^xP{`XdQx`DIjIsuDuBRrmrj!MgRId z=SqTj1km`mC|<MB1tYZR6lc>WIvM~w_*UEG!b`55$8I`8H}6%qx>$$LzI0gktzToY z2Br6$Ql1xDXq8M0zT3KJsg=!{zZFH3+4c=Hmm1kP#x5P3`$FT^NBZWDE|E-oSc_9* zvRU@%H`T2#bADtKW<DN~mxr-esTZpjTkq}08Hf4C5e|T~`{l+5$BCrtXmO&_zP=a| zC0=_mp4_H-m;{g<n=n$tZcpzD=)nGQ%p|x|L@qBfrgqNR+{YwG7DhNG-C15xWDX9! z^S0yVnY%5PIYsK<Ar(i?Swe5Gx8Ls2nM-qiTi&M++qPMK2UhFi;{J%U&1MsaXHG=8 zJu~iHdT>B<ig~=IUX>0QkAWUNsw8>x$f{}*RDiZt3lpvthOO-LS}0bF$Q`qyKe``2 zyL>U&V(g^JN7^~Ui(qF@Bb}c-XV;uhp1x}j-MmHp+<E`QPr@wQR_%+#qrpYd@f*91 zjc-)n#G*o%FXZcU*{(H9H_8kO@QpKtr<*i8(zM00e(Rr~-@IfoYd<-D&pecA#Y_&W zx25h_twh+%ES?NkG*2g~N^ouB6I_dCK}UCsc4bNN548^WyzO6|2obT`gp$0`(WHyO zY~eqhgO1y4c88$vr20WPOFV)?Y46N%7){Qx;c+`Vjfra+fgJzf@!9NFE*qcsI#hXP z+`jy|^!jDV^(M2qSLZh?n#YnKsk<sOo90sae&s!L73{g1hW1LLU!RSDJtxdoWJ!g< z?PGvsp7LQGF=o*xLR9{u8uMO4)5J$;(&Q8F_ZK9!1FN#tU8XdywqA-j3-Z#d%c)!3 zRsiZU|Ho~smV#5ePd%@`rT%O})$RK%dM981;OV*z`iuZYnaGleqP(x}ykL@EIz+R$ z2J730Sdk>cEl&jpT8@CIqXZyU!oSTzF@`1(9ZC52$w2DU%b4ktX+}+qyks*?nyQuz zifVl3@rIt#X1t(G=Db_Sak~a^7CPB#v`qVG-IDp><m$xYKi~G2J9F2l-JtJCNnXRk z_K(27lj`&3vUKTbU{@bRYW{*1i3MMd5WUt6<t`1o0t7^nE22|H!T+#nD9+E%-~z7a z(}A%<dVrWS&3{ca3pWH^WAqDHi$0x-mC-D;AViWE{J4GDQhTbqP9fPn_&cSD3p+r| zz~o)5$qTd$x7E$(Wa;7&*3q2<v3>x526L#5_4pj?5sMy?X3rd|X>$nhA?jHPVB5kW z4YuuvU;pfTCk*kLJT6$+KNlm(eFJ6EN(b?V1B+)EX&EN$7|1!6!DN~C@!G}n!q~TJ z1Vr=*_N~4EtC^D)AoHYp`k2IDd7Acj89GMg!xoVUY;yQzum_MSu@;0)h~M*5LcxH2 za)wevWCXwrDNK+e)G5jg4r?IGEpg#yAW_LtM2~rgIWHFln=Hxo+2}uBoY#2vrkB;v zlWPZY(}|5UE{x?2We|;vD<h=BJ4<@@`kTeDEY5ppb>>|C<k!DiwN~!PQo(zd9~;V) zx6~gu&^*xjN?M9)KC!Ts8$7E(yCNWN)SFl12Y4WnZxY}fQ0UT<Q==lWA;?yM3|lSK z9D*HY!M-iq5^Cm?Wohh7GZviaZ%5!(;<W>#>Sr!kbt^eSGOg{)=gb&USg`$Ewj{6k zeWR<Awc?#JTcDiT^LZINpQW+xMm_y-V0~3X3&j#xi{T-<0-XI6!Gv0qJ|UC{5C!)= z9LLf9A=D|4a;dgMK=E`Bid!Xl;dk4YF1JH77*`Qi_mOlz%)X;;J}XNXj$(B4!JkpB z3Zv_)7(JsSNQ$B90-9b|le{y2!2Dkfl|)V-QDOJhWlkyIsm>ZlyRq}wT^X|Em=a<R znf&3}r7P^xotzx^f_jgD7|M(8?;4DMN7b7LB>p1Oe3>B&TBZ$JW<7NMtm)UcLdcIg zy%2<v<mEcmgfXQ~z{Ufa_Yn~+hj;|L(N{?iz}CciLJgDFi2}GR<mj|C2ohR@N)e1` z=9ljN=&-+j`q|3rrOsWdd(#u&6k06D4^Aiw3T3fhq+PEJoe^?s_w$uu_R|-hadBnG zhGn}Ye(VXh@M50Cb56`$@cbhU_Kkb)eJeA5Tt07~(YSZr!j+8rQgFkk@=X4X@dhH> z?1nhB2BB;U==8u35$I+@&o+k$SP7w+1Xn78x+M{TY{qEW$>(PCZ@ZtL<_L<cm)fya zki4F?jZm*K)?;YvG4)fD=l6mxWoW?rawk7&Fd^FSVfP35QF*NtZs^K3y>ICCMtgc@ zH9u;639miMHdW3r7;<yz)yl={(^55PV9AK>HdNYRgY8t;fRVRHTMP$};|;l-*{~6< z<7s&myJB)7`og6cgDCg`8bS(TzDyH|GKs7`wy4Xvs?o(^HB7E%)614lx`<D1le@Dc zFz(VPCC?{e^Y#SsxgZ<C)@S<c(eW|SMb22cd-IvI7Uy5WZ&vQEj5a8SH}J_SsOP2q zChTnDH}%hxFhZZN)+w)Qm11Z7S7{|PSCl@F-~B-D#g^cAEru8+$V$qw7%^=WVZ6ge z!N7@TfC$3u$|k$47E5CH7Im#olcBU*hmP$Vb$ohIAwlnqJc^&k>}!GDV<v2(;Wq*K zJ#u%x3%^l|O`;h>5&o6**~*=jp=^ucJB-|JsHX&LSb&Tz!UEKq&}JZlEj{6t9%$&Z ziSo><MyILKF~w1F>Al8PtyU5f|8v@+l^fPyUecm$+3x*F@Mi|BrQ8RU%1RafXl?<D zs6J8gj$jx%c@VV1!!Z6y9sm|%ZlGV#&*J5_YUYzAPpX5$*uhpMt=L}aW<`p0a~vyH zm(wc!qK=eDU<5AR&m7?P4*1ak0Z5EM4~FvcFPeha!RFicB<uNv?ebtzrWqNf@ZKN+ zmzqY!>qGVoo18h)2{og`^p5J7Ft&9$9k;bAZN-j;sTs>qi)SR;l_O2gqj}_2tOqRj z@fdEC_EP0AMG7U2#sJUKaSODTcdLE~Y(b_6e8^DAOy~>UbiZjr-(JI*X<WZv!}-@4 zd0G9E`i&VWc4)`SKlm)e4rmw7aKd~i+avG=uS@s6uP1A-)B92l;0-gR@E(S9`~_rP zL@EZE!otJ|489Sd`pDDMBc}5nh;ug?o~iu8?0{?#jbCblNUVN_fd)n4g9hW1ApDdB zg(D*Oacm}zNQ=Pr0N`Q&l=1<Z5EM}H#+!|a#3Ct0F;x-yH2^q5RUJ1Jmv)b=fVdmw zaVdCJsp}1OB|A(bZ;UIY1~f;`hNHY49(5>Pea}^KD1E$lK(}ViNd6E<$RZ|E|LKrM zhBfV;Jfu`zjVQbp*(S=IdhfjNfqB72;7VpulGT1}PPc;ShVy$CE(|u?PfYJ#Qg!5p z!X;Mq*P_LEL76^n1x`oVcjojyeTzba%zb<JD-2~X<2IupB*>iJdti~}!CiCzo&)o( zL8jQ+12Rf1X+5Q)&Map>DxLQ1(xnfV56|wr`iRWCcX?dq<ul}C@-wqLtvo98!*e>X zIQpP>W-;eQ+3BP5IWHdFm+q#IeU$EI<?!!E6mUL!bk}|@yQ53;m<Qi9lP5F;9%LDw z;we%&R@h-6n*tiniWLQ^bs_8t9eLh+CF?F{!}H-fozG^t*i3xNX4u0%(mzE};0Ol? z9!TO-NW^23`%|v&%Vz^GOXcePaCISD&KA-h{>d;yI%tdm-USOH$?=gifUtQt%ymXn zc|s$ig5&rT{3GK*W@hgi^7#|k@jfk+Sh)?`kg#|Tg2p-;&*A-c3KzCK?ZE)^zwlF# zjzBwJ#N*Np5Xk0dC17Sk407O+Py!xLcKj^s*bSxALo=rIlcmtbz2`-an6konblGOk z_pVW8_EWvuE2I(K+;^k|%<Om2$En8G!QqxEks>-%8;c%FB7R<wNs>R3qXe80#%=JT zu_9|PB5=r$0wMDb^czvyq1Y4J18}Z5yq}`rlNw&@03|UYi^f4YQ$$^%M5B^US`^Ti zO6bv_hWs8uh1}yPt9L~`W~(xo-*Hwna}J*xYddW}6@A=sv`W>AQ~OSa&9D`e%sv)T zl?`{OPer3I%14t9j^bnUSe;KNKX!2FYqx$!Nx4I1XsLaA_Zvg0>^#W}CW_dr3Mo7h zG^38;yi#4uHLOl)FDPSEj`S8Blf+Ta9TEkMb!jaCbh<a&hY18nM~JX{g4Km1jVtAZ zJv=s?XHvo#egnJ?4c+~`-AJp!kAmI+KFDkaVUg+DUy-pQ`3MPQH<VhUt*eq8OeI(W z%2acr8Gk4wLiFDQOn86D0~DVeZv;0$vpMEUG`4@kc`XrtkCptc#t)tG*j4A%#B0v0 zBZ|@X@r@B>4_;^6v((R-%7PQsA~pa0UA(B-Yts7MS8`Rzb@YczUc>z_UZdjFE3dqg z%lbU{ku}2WJu1J0Q<8M#+J+~UTAG)%7Qs`)wSfLD0nig#v(AzOf=mS8B>s%(5`%X~ zkb39Wx&%mwT1566N_-8`8v`~rpC61c(APu@ph}d;A_W5uQC3$XnrS8jWE2-o8H=e* zuO(po<Gtxz9v$69PV102%2v9mq59jkySc?~*6s9d^PWZ}4c~jv==Q$1UCxz{-<95V zKhk!R#Dd4by|i`-zxm1)=6((#yYiK%8M?xLs}}Lo+n+cBza=P0*UInAZvs-asJ0*Y z-e4Kw?l>pnfX-3^E0dusG(;tamdviSXw{l1SPM~-5=Wp3jz|r}v7R_K5XVLyNbAa( zz{UWi6~NUoH~?wAwRwUy4@$5n9YwJlQJ4Y93XhMUAOa6pKtv0cghUVscR+O$)zZTU z2+eWS()5APcpcjx&tM1O8WX@Z^2BhBJTiPk{ToV(_Vc)DbVF(4@#YZQR$7P~q8qeM z0^xz|gz!`!16Cotieh+#@QKFMw0Qb+B}PT1CDDPUCMTO=AX#;7-i@c67c>8Ksz2W= zYNd|7UsPB9(fOC-CFj#gGZNV9&nByDSXT61wc|Z>Czl%C%T%AbRqnJ6az`Aq%0t=A zgW<ugrAzEPH9YsD9QQq5js9{z%B5G>cNI53qJQf7y>I?&&69WD=IzUut-|hTP+4I_ z#Zv?Id&yJGT0so6ukVt8zrF{AD5Br!YN1$7!7qrm7^(;b5d6*0sE$YqUz`CTMb-?R zZ6ryFRXH_B6_GTMF8HPC%R|h;O^TbCx%pZ3>BGfmZ_F*8%z7@|7B#hGTD7Z3<mU3i z89n-{XIa;lX%~#FqCS;~;&<H(Ip4GweNxBVydi_rb+7zRUW7Qix`yS7Nn~7VJ3c_W z)v-;fTTQs=>iTmR@-F&{Uch5Q$W&L<IKVLqU5!x_Bq}y4B?`qWB7N)y`mZl)0$ZJM z3JDY<#ar{E>RTNq60_hjQ9g^0$xQqQB67GoK?<=t_AePVla)-^bbDwO`J&@Y^%ufU zvSzIHueo!g$K}27XH(9$g{c#2FvLPRhxA{xMdAq)5KXt98R2_)Y~L_r5DR7XIFFr} z$fbMVh8TzLLq1M-u$<l4)iH>psfAsALW$8bG2vxKW+{%~GB_rCcCRr0=zCPS{Aj)7 ztU_OoLpY6(pGwI5)?N>^WQS-k!mo>cWCzEfjye!N%Oh?m$=Z8h?lHbE!UIT-$HUm4 zSPEYy41#H05r*YuD``eF4X6EQf*IUwibooEyxEA(ILIb(HAean8<tnL{w3#&HC}XH ztjDe#cqj2i=T=LQW0$jhg?fNJWt7~lV);v9?%{k>>$lXkKfOEKJ*o<&m`I&-p2_)x z%`M6qT&DrcVZX8?)muHo>V3%;BeHYaDz*aHHW{)^Bfzt&0rByEcAo%3r(4hfSU<au zBFBh2HAs{3@ejqWy$Ju5Ukoki7En+Y^bF_-N>+uyV2mU_3!fD72^l08%snk0MM07g z_N}TP3=4X>@#aU=Tdb6=P^X1%SaBuAeJPc@w#@yoiG*&vJb&l7@(X77nNU8dKWEDq zjGM9E#HdGat;(N~*Fm)ZF~#X;7YvB8@=9pIVI-lU-Jv+Sv{SftiqcNe+Nr8v^bOQ} zh|tLi$u4s{Zbl=JR4L8Qv4|3?AEZgAqLOcKEn3*9NB-TYPpW<z`ANqa&E1g|)znD$ zlxr-aflD$jxust0(o_oJ`-jaOwryD1a8{yT$Scd+mRB~;y+}eZRR}aPR;gl*C_|&F zp_dZ#&o$Bsn?4&s*aE1Wx0R1AMoiElPDIcUPb*9;r2T+xQ@Cv+1>T}k!!IYV!55cU zTr-GE>sKu+UV7rUddVdTjaZu>lZ&OvG3vMP_UL~5ofd7*-K|nlAsM68FMs&*O;(3x zRk=#m3fL^<N~}O6)?lW`HtQ8$0<?MEYM?}hh{*fM07D(5Hjp5bI6`2vrnC>XTVt&$ z)^=7o(_eUY;Y~r@u;Y9}GBG$m84jBbZQK(<r;<GF|C0D7bzAG{tzUIru8O~f?A2S} zI3v`Lzfjl2upISOmVNkBSJ<`<U}G8T5tcD-!&v?&yLb8emu!QZ9pAR9oU(Fd!>jNI zw1!Sl74mO$Lu=4(Tbs5dXV?T&#u2gwjx9i!ESid3i`;;M`v~8k60Nxa;pvpTdMv1j z66U4QO04z>s$tb~D86*ia#Y1?>ivw;Li@f};sgkQJ&`dgP#Z95QB2y49(~x;t_TKu zq3{}^t?@TPw@#Qyn(dL2aSKdYa`#7j6xf4;`gG|u+Og68Y^l(CpDis|8a&e6ueZ>6 zYuD~Qu+ZxMy}MM@MGl@gm-A<4_g(<qc5z;pevD5a*=N{v-oK-J_`)Nyd~i-5ocJ?y z_=qA+sci|f`K+9OK|^dv*3UMT-${>~Y^c9i8=YU7CJ7@FxH=#SWq?#Y-O>ZAn9xqq zv@poKQz>G=&pBRQ@2u=cmnn)GGlrcPIaO&ctp_o-w@B8OnmJL>L;!^MoVD2&6k?vZ zB6P;AQK1<#dXLJp8ms($E?mwWx@P%tha~g*_1X-K2sdt-->+}|TJkiW!dp)}JxG!c zt!nU!x?}u;fn!TdymJnV+f=o6#{pa}-39FF2wC+8EZQgskNr}|uw9AMG$?QxCU}ia z99<r+mITyE(z#k~+|<@@;&2m3GCsj25jRw(RFRV62p3^{@yY#)EM8P1wD*t!Y4zy@ zwE;740RkmKdoo#^XiI@U2Ut-ktQew@$BIH$0ZJ%=CAziyc_;7s<l+rBtMl^OC3JeN z)G~DF$VH(cmcheEEwQOpXR0mUD{;?cuf1Qyj*pU#$rsm+-uaR&UsyY8&r52HDf76z ztT=bVBAG9p{$Pjv>4P}<=wju&z>S}!O)_ODh4}Kt1Rd0&A)M9vjc^L#2AwH{Mvizu zLomq!h&m82$TvVxL=GO%%Sw{;ahu0VhAa?b{n)@@{ghwDU}L9Ax<K|lnPX}3a{BGm zUfsG68`Ae)=J0N6_V)DdeKrNL*~Z%HRK^adLwOZ-5If}llHFG8v)f%TgV~i|%QI1t zDiT!`Mk~>xiUPboutsW9Ux2OCODbcuB&8Tw2YhP=r%br_PKneW0sZhr3{!{%NC8iy zrjw~63|7LzrAY{6j(63Pj-ER=_l<FO2x@#8pLKpzsL>tSa`fthZ{Jz81+CZ`XJr=3 zd_BsIZD3)WBx&h`4UN?2#>%GIQax#=`VEVn2z~5o<uB->z0Hu!?idE}#W>G2d_fu+ z`;h-3ESAqy{(|x*r}54^hJ&#A;0d-_dqR3rJaGWu@vZSN-g(b38)<d)#B|RSbHx*P z@x*T9GkE6%!w$YlJQ3x2g7iRc=m{TZYt%2Oj%b@<N`w|~4TED1K-LrDuNUY<pE&AS z3Ob@l+7+t(1Q=%gSPJ-20O=sT0EiC)0ZTh9OVmJGP+Tg5<ZT7%bfuxUC!aX(*`{!W zE+4aci+#&8t6%7CwLP})owAd6OcJlg>b|x0%W9_ZjcbqmRL3~vaY^N)hZmRKEs~_n zkz-}HTfP3`m+JMeaj(AF(De<gKGFE@kp{}=MkA}sEOA|?c7p6vv(hI2i9KP4eTuTx zi4b@<1w=5=6PTTRp(h}IA_EMJ@`uvD-AR9!uwd!RuckKlUpDQ9^syiP7vB(jtSK3e z#rJs~0<f+5z6q`f3N`gpWzDoxV48|gV~jkPFpHqx<kPMPFNg6r)iw^P!dbC~J<mJ3 zqjE<{Op*uZx}BKA5q?zq9-bwlhj2mqWrBF9&-)d(Tv7vmG?#3Hoxy;&V1yR**%HGG zFbaBeqM1>&OS4F10|yiK(~+<-NU5cqLpW`oG{*AGx$f#&vo<+D|D{K|d<J<Bb92Gx zB||2x<EIe4ULDmf+8{eSOv{4`6I>q0G|#@(qol=ny!=Vhx{R8%lTAB?X{SW(R8O49 z2Hx1GQGkWD^xkRQO7lpPryBT2QSCxKMMqtx`Q0JK38ds^#QtgiczU9l)3|Qa`^gK{ z%5`&|9blK@Sjx30-c6Qfv!D$-Uk^2!c)WV^?}bJ#t(m@tg?0=!kK8e2+m}^MLrg15 z*Qr0X4-Oi!Yw(O$#zz=Gec?-l#jbv^Ci-vI%4q!Pc<3jupws<{_HDz^cIIVXEv503 zr#aHC&eX}gIZrmL4{prfdWuWxpC{{NzO_J>cQEuGMfa~R{3lZtL_s!FLOj_n9yAkK zHxw!eH1pezh!gWy%%iZ|5|Yyd2ZA>xiahsJ8tY8>iPeuh8q+9wNU7^`_?fjS!(*B^ z96d8^)V@=4<R}N1%H|lW?K#CGvh1@9h+?#0z2p?>3-FS<h<lQ?YDd^HRk5Z(!Z5E$ zp(NH5qAI0hB#Nsjl!QPeiuVa<dP;5Y9eH`u8rR^c3~44ePcp_wdO})b1V%)rHikBh zmy^ZI%L`X@m^fxcVR0X8(fmhxE*;Qs+?0A9ik9@xXx1pJ)wt|N)`ErI`b_HAZ`NXI z%sigbvR<1$v*tzjN*P^S{dz8MP@{VN;VHA`)oJs{3fdb}4O^r?<WsPlr%{lNpZZ1y zQJ9d;;t1Xbjm?*4PA)_{F+uD%qm&G5GIB-n7X^iloM2m3>BTO)Uw1O}Y3T1_U%l4l zsgGUiSD&(%*&e3eZ}7o*)@VGlH~80h^*VgQ?-`hMTW(~?HN-hav^TWa!p!g)*LP<a zf(%Nm%-|3P=dj?Zx8yWDmEaufeJa!Ql!>0gD)qoNd=0zZ2){yeB}h~UAa6MH>^!mA zbe`{x>opm~<_{7lObP@kF_^m;??0M_yZ_2kzvgw+LGQ3b#$(JK=WfW~;Ti4&?q~Th zvN4V}>}SX2uRu|q@QEE`@U9u&mV1zA1E^~KkbD%}P{z0Oy3o@k(B5Vqzcf%6WHFEs z>nfWVDLfR%Nx=7b14*R7-`(7v!(Ywqk;%8S?Wjev9d!85%I=1Hpl@cx0O&q%-E)1y zAUk9j!wp&$8{O60veS@oL^)M`E^T~q-(JtqOwbO<*wYjP+X>)^@9M!r1h<?DsD6s5 z-3Zh|Dpt&*77|%HqA+&+3NaA@OMUDCDIozJqP)&N`i#zDX$Lc}a6()nAl0Iryselx zY)Yh%U;~rGO&H<PDKE9~@UgICj;go!O@AV`q+rH+m-COX-w*Rtl<1Y-9X<UpQW09^ zHsfq@!SvA;wXp)IO$DA%5A&>o4i+v?Whaztp)m=^kUo!qS{hzE2R-Hub^*WlQ^*il zji%&!X)bb4G1|AD(Q0-bF^4E{lcy%OZI!nm%=N%||8VKyqs}9)$ctMad+c<jq0qQ4 z+&ZslF2;)~EZ%*F^YFTV*9I10<fa6SoNU%-6^mxwf-y<=n*=O_=-jT)C16eJLiVq# zza#jy9&?@O(Fz1Gl5vx)>kC4YpqqfzQY=9tCLSEq=2J2wwHKkS`-~zaCC7`x>`DK& zo&+IeXK1UNsIM+b9<;*q2sjZ{UR>L$eMGZn+4B*Kem1<?on6J7;>xBLZ*n>QbpCO; z_^{gfu$-%{`r|vHP&&tiviXH`7wtR6dF$NfeDT~#0-yp3G%PS>0hV<QdlZYGEj0j! z2>?NY4ygbb3hdRvCM;q)q;%a~z)*ntAz(vSZ%xqffsKSmpLK%Z1?xSIwf_k(fl&fp z;1Oud=Z|9Xk^q-0>f(l$-2txLxd7KWSL92Z`p?}`X(+w__z;0~VGlHr0l^j>I4Pht zzhLg-J*RoKnt#_eu8G(2uc9`=3U=qU;KNDitQ_GNVJbpnbsz*7)`dk{2V6}+v8I0G z^)%J|UwE1*%GSrviS5Lod=+gh;azGB=BRm>&?Kdn$6@QG6jG`@N4S<^+sG|jj~x|K zaxv^;%l;F_%ynGXc3jly^-mt@@IE<}+D(#z#-MrLy2bqFXx5_vUpV<eJA%&M=eRsT zEdvzlRDNxG)cBL3FZ>D#{rY184XF7jmbnpT*a*w4n0q$D>xxC3%6kSRAf{_Crl%-1 zefo1#?Zrk8rG;0DQ@V;5wONw-tW6VE2#pM4%9tzU18<;NEEgF;h)?vjm8Pt3#MLF& zqK!qN)TXBI6-vBG!}!*6TKfSb%tmA3xv=N0CS%aBp3`Q!l7h@7rUerx?X!d(TF~-S zo4N4iiIa~FH5Ws-E_o)zdGherw&3sf7i5Nn4A`H&bz?-x#{gW{_N{s%85{06Y25Ip zP5J53JsPF-9>n%7`=oh`(bGAfICOTi<nRF(vsU$zc>i@-EC(e&rwm`#E;apyC5L#u zp_87<;_~G^Js?9zRz9WX2X!_cMU9SX*qJTRjk^mXjrt)!e7IqxA=@z4FcES~3F@cJ zF)Tp$)fI*{yuFgSb{%b}OsY6QM>xW8gv}qv#^Tsk9NUXyH*xGGjswK;F>xFtjyd8u zK^&)uW4<_+iQ^n`Tp*5%#BrH8t^zMa70`AmO7f#?X)G}N`>Nt8R_#TE@P}zvVJXTq z?P^-e@%|njuS88FtWq+xcQQafy@&z}=J7cFxq8|IC<WP6yK0(pyrKSP6YZrYDN3t$ zVkoUJE{D>_D{_{1xS@2?-s(hem3Kh}Q-{*s`+(9@`wAfUqYf0JRnoQl^px`Mj`Du= zboo#esdb=C99@qP*CWOCXmOp5g13(H+#B@mW5xA&aXnF7PZrlxsT-0~;$s`7+OL$R zC^NLH87az4?P_L<GF!WvoubUuuI8pF^R=t_Dau0aYGI19Si4%BqAb;}mZm7nwX5YR z%1Z5OWs0&|yIM`*geE~nC}V<lipxbu6J>+ofJ_;|k~A|GI-#2&k5l`0Y_Bx3V?pYL zY(h?dlo~}nHyD-Em^l?+mMj!oQf~3*@|@`!eR}Y2G9yw&?o|9G`CUt)wv{8Z@=d|k zK^+HX7RZ*YV<ScwrL<c8xHNUN`hu}-vo;yQHe;(+%?E@?H%GRzjPE~SG#@5ERxd5+ z{^+!6H7|tA?(i3DPENc3Y-5%Zaju5(y$F`lcuMSpuVV`)ga-F#eIl46!aXU1*(2PO zBUos})o>OT?w%OV9O3Rs;mjV+9vf0>3m!G5;>OelQzND|n0jn#{b{Dk$qgn)OldIr z*yQ?C*quCV@UoG4rR^Fb*>j|NnkO--XNQy)5pjch4wP6=#4BZVEa=pS^IqLqUv+Vx z%)!X0<*Y^RiYu(um1)zisFzK#ta{<WgN5p62P;k;G!E!ymU<S7fA^bD6aS=_O?}&O zrrxTU{dYyg{n^?HQvPuF9rHUu1(2$#0}FMW=!$GW^n(CZCUF<+1G#0SpxF#U7lUy} zM2IM{Tv&r+ktGx>N-EVzQL5Dlr=4337!fQPn_!8k3_Wq%R4ouM9QY6sl^6m4cLeI4 zM<mM8(uIl+6`f^!jha1%Keb`)E`F7_tk<G>=CG72SFZGwWiHF6{uPZX8cElGZrL(A zc}b7Cn^w$8ZPLC;R_hMKdks6}?j>7xkZ%{&iR1>*T}+0?nx#S*Cv;^+cTbihI>0Xx z${-9Dz+h^K1S4b3ifgl_N8C{^X^e5g-y2W>2~uNiwWsVvBs|HDGnF8%W*oGlnxI)E z%?e#ZXU_o{3c^OJ$4q*CMUp|l36TlDIwXoydl8W~eliSf69L^?VPyce!#q*Tqm!r6 z#-r3bNmTiF(T$1o^z2;?8sr>LP=9;%#M(#ZZQAfke8ieJHa!;{H0PIJ=Fhk>e_+*x zV`p9%gLJ#0!}dP-?OvrU4}PpSm(HKbK49XXTzZNPyWoCo`)S$yCi`pDG)dm3egS*J zUA3#>7Py8DkO-)cN~z#}KFLtQNNg09h9&on_Eut*=T@Y4sPagY!9}iwC0`ym0nt1c zQp3Em56Bz$nY!I@6ue1-4oLPjlp2MNKwu#Be8{pxOEOB;?d)R%X9@Bf(s<Khj3o{_ zB-!6BK4K527UkCq9EMdH+@f6=qC*7ko}%cclyE7Nn#m#j1F8$49^?BksA>)09UR`G zv#LhpARbVLdYT|&i6)pODa4fQ3{pGW&Z7L~a<<&3NB5ktRo3BM>&~d%r+R1GurA?A zlal+!8V}@AP+=D9+><@p?XPab2J+#KM~B*ajDm*CV&qSxcBbD1=SJs6%m;}lx-Mjf zYaA5|P=X9ieuTLk8Qo&+io;I!RVB*%uu|1Qv9KCh)+8DlG9@Ds(M*%!4>wEgLiSAW zUEGR~GWJdHHZklSN5X<2)6@<j$nr6j2OG;rPvN}Duy(9N57w#M1a9fx(kitHnmsKl zO^o#;DZ^9@-+%)a!iT~>gi6zrT^|F5P+?1HZ?oHCZ7H^Pwsc#T&6G*PsN+Tz_?e=; z9E5}~R6nEuv5e6Dv!}0-a!`cyP(rVwD=1cwGnw<LBU#7peC4axurF`R_oOkVXR+g} z8I}ucfsF5yQJTwuvjJyGm}G%P0w3C2?WR~$im9C`-DJ#ExJlC?5Ke%>wX>vKvMf_9 zb1Z8tG&magDZ4$^o?-{4Kt~j4gh4A2UPzM%(GPE60Iw!Q>tu6sQmR0aN8rZRaHIx2 z18GwK{C%G;Wz9$2w+?6%m6TpHvRy(u>k!bjZpqOdV&!{>53{dsbQs`h?O@W-kj|M- z)Q{o)wYkb2Ohnxx3}gQLTrp`Q!kNgMYm7Cf7~2`)&E>*CO91ghC3x~EHb=30XQYG& zQS~b<NMf=%F)1}lM;c=2z?%N~d+#n~$qO$!YUi5eVa-FPPL<4CgXDXspZmFRs%&Z3 z(jxVcd$cQ!K&d`%=q_K8dYgt|)D}pez!Mn8{_6?_>nlV<mW1aBLx#Z&b`mo_YR001 z@>;~2S?!isONxb7&ItPz4H<AZCMKs!y=QN}^#n`FSI-V#I!nF+u>RchOB&IO@+~>X zG}3QG0#+KS0L0)Tq(0hmCV`6M7dg6+$XY9D6K+i!Rs|y>OtjlFrvR(WvE~$WJ9E0( zm{}f7qpJdxBCJl0qA^j>Bl|i3!#SI7ZIHs(zBk!;`4^0ct^8cu_q3Nv{@Y&C=$HdR zmj7ulIfy1y0m}Y!FJTG&_ENu$Lka4+G1*<bo2f$&zVfv<$(s4Me2RT+stdbSq#s)& z<rK!ufTWRiy}P&~i^C&Kb(@UIn!RWaW>I+vHm-7c6+Uet8G_iN;DmaIPu;yH-VrVn z()NO7AyvSq?8|9TEaF8#4}u_r;R<K|xBKH~=JSmO?n3t+c54nxQ(u=?Jt$z?c_w)d zP<C3nhF_;1;<3<i#IFdJum8T+O%SEk9*RQU#3+<Zq)07P_ehV*ib8b{KYnZu6(O<U zz<&98C|u%SAS2aNrB+D0iQcZtNqS^v{VQzbnR6lb_a4hOS-!vYRv%V#;qee_$u#wy z2P+O(Ept}<D6c}2^RnlA#jG8<^#o5=+p<}cM^815V);2Eko%2w=?mLIb$K_U@gCLY zB_cfZc?oL^fzlBos99j~3)q_c-19Xgif030Nq|5J6XA=GN)$2!;-jJ<UC1u!W*znS zmtVMUk;9@ke!u$Eo4iO`vFxcYtB0Y#<;o(KIE+ns?iyNG2Hk2rWAEQfW%=gO#gEJK zkJo4R>^b`h*}@PU%4tR95Uhv=7XPkFc!cl)hSQe%FN*_fjbBP01sC`%nPkH>l3Uee z0HmWD*CZcIG9cV<?OS7<Aqnd7zv@19=MoF4ZjU_nG{7n^|LyTH-=SMut%`Q+`%5|J zzcK=vgegB@TvlXW_;68&rZ<ztidN_lWvwYEC>{p2UVQioiNxP87Z7GHkQVBSsQnl( zHFn=j=Zl<f;}!mw%RTo|<Y(1UTj$8D@>GhX(#H~PXs?asp*!ZGn}i183v$)=iswfk zao@}=)_$-jZ^R?q-_q|5#P1ES{6TIe@5K%orBwHe+!Cf)9Ryy4vP&WY4Xx1pVw8bU zzS0*;tX1F~lmL4yYLNO+jhx}$Y)_z-7sn!Diy>!+^lIC0pIrXxkT6FgYxIF~BdE~4 zZvN9h)Nn-a+Ht)kmD-z~T+y??#8>^gp~%hZnB=p&3l_-6@7~To|C3}K&8m+knnhT) zP^@O3hpeWsl<D)*34o6@2?B(iJgVmz3@Yz)wu)M56x)P!D*QcPGTfaty!dMI2)=tn zF%NP7Ca-dT&a2W05M9D(1QNWK;;RLr`{$1WdGTduO0JgRQGCi+`3-VwS0URB@qK<B zoWvmY4||=fzPMQ|v{p`tN{#`RkSH9bD<i+$dEjJ7iM2F;($;W!RmID@FU#_&?FBPA zUs~jW(s2A*h#^B8qxfe1XN3J)zX>4I-auG`=-!ILzC^7RlXhnjCya>Vb`hTk7cZ2k zqpx%YpvIrzrk&^~`_xk2c#k?2;M%>DU3CBE2CvZY-h}ZOp>O(@<DWzD+j3ANXj7%0 z;QgKM=2wezu!XemF>b(BDEtu2?!efzuM2=;z<TKWTl}h+IFLZxc<0KrUg4gW;TCa6 zC5)-?p^Kt#aAvESiI3WKwRk|Td)rX;uL1pwuK@1Vq<dgVcX>#KOZvn8nVPJRQeK9u zU|8bBPyJ`;2jHl8BXZH+Q!$GZp{5=IBwff?4Tp=b<a2hYSQHaoRnb7Y1?t-eb>Pyl z)9r}l?W#m*o!B6r26?D&z?yr16`mtsMFyh2K2204p;O_|s7R-sbF`omdM89e!8U-1 z?CWJ0GQvV@vL^3eeAgm}B&yeb2oAD8G5zrO)g8gXwkOJ-!G*l?&keaKq}|Yj;-4R; z4p;B1Z}KP8d(T}j8-KkvwNLLkn`GlJZ|fW+2ymksL%kJQt1$#^FvK$l0UsS{boJg- zR33!e4}BoY`Oz>al2}4fUfz`G4ORTLU-1>T?bxff(7&&$AF?{DpAWSzo{m)B>uMun zCTF)EIG4v4mFCZ(m_*7UNtIj4doZ>{Kv))e{vgVTz10?3)M?g7r|)FMIQfy!a+o6G zyf$kJlQ1Wn5-CL<U?xt7n(!KwMT;-Mn16hF(5>$6mz*Ey1fZL~zx={LS4c`L0p`75 zcedG{C_VCh_4+3}zhURAG(e{q<rNQ}7_M$+uW3-etF9=VyHNm{!$NF;2b*?KG<bqT zRPRM552WG$vM~h`d+SicH%gq+;SX@dDz*(VDgR0UB+z*PZ+1l_GEbOjauV;MK8-EJ zmMgE=tlJj9Gu!<Gt3UUoEo6GBL;Z*Xx=2hq^JMYCI%*9oZ^@SC=gton(osa^_tL-Q z?Vu!M6sL$^)J7ga`$aMdk$Y~Tj;BhfmVQI=pI-QvBgD%Wu&yMCCn=k!miH0Rx@IYy z+yZH75c#}G>M|S&C@1E19)NLP+>};f3;tJm-Dlpi76-4MJ^zIe%Q#l8%L}3A*|$n& zoX-s^w(MNH^gOG*zC%j*$X6B}v@rSN)+tN5R4}UBxc*6Fj%Tm#De*zOCa|I<Tq-2G zSqg5~3ae$N?k^-^3prXxGB4?dMB*>4kVZ;?C-YWqb<F9KGwK)@Wc6AP-j{3T(f1Cj z{8sLR?+rtBLfJ`m@3gNEprZjKL#Lww@);}#R4I;vwKd-4lKU*Is{VTU^mW&wqD781 zOIE#71zfM<r{~{ArrUAJS@He+owB@Xu@s9@lwo%H@@hmaG}3-PV1o<CvOZOPKf&!y z@kYJ~qcnCRxHdO0b{7`@S^D;Xfzqi51wb8q`{VHZHpU#C=&CJX7x3)?lM`-A{inR% zHiEZasg~UBghwXrgbYYA3Py2GE>Ex%I%88y$6iuPwtMpUpcbsKOqB}q<pi}${`evm zvtp@KT(Mx`<I>~@1=5l3eJh4ybgU9>e&imwvg*7#K#K{$YJCyJbOd||#SKi9gEna= z$soeggN2v_L_nuU@G$y6l}E6h8&wlaTc|!z`)}Y@_4Y#k47<zRFSyUJA5<qFz*_)v zhz*nnVnp6`2^dkpy67YF41#_ym6#QdKe4yhxL@g3+FQLjm%I23cet9xp5^ZY|0+Mh zFG%=>V6r6<oCCg8$7?^NR%Fc@jd%gS?1*5aX1Wl50#VIlC4bjhvC1LkxQ95UF7}+9 zq0+TH>fV@8`4caYY8q^i+PW$+T4X2;eP$2c69b6yhz4H%h@bPtixYpW;*A~`abwU( znn8&IPc*rb$q;KclTHP~oyMZe%0g|fLkr5v?4hm$qqwthz=Tj2le@Ofz&S*EZgc6; z(~|Vuld}&#$6G}%F!H(6kF@MDh)Hv29>FS<08n?ONZ2hrn^WuoeTZK62fYla2-VxK zDHIGT+AcvbfH^HGl?@wL@Ix5u7RI0GG6H%?C2Aw^k$^@NGCG3%Y9b4C*MCBXf?raT z!Xrs~RwQp>*dQ-Jzyd^xu?TUZbbmBEg~mp%phOK!C=?gZ<J`AHS;1sWQ1`a|vcvKm zPZv*}XEtwW_Y2$CmvtDO(Y_0NtXJVO&PzuX%xm@vAR$%$$|qv9wG2~~AWtPQ@8;A; zEArB4J1{%7$<qq<!*=I4z!32cshml^QHLjqpyldSXz=Kzr^I>RgWNz~C(j(ro;e5~ z7g0UP<Ehl0I63)?UXP_UF`3dkbjop#weOuab(z_`XMxFhbXM_NIZqnYyZ;2U?RY<S zMyg$_P1`Q4a|f1JitzkV#hvRfnlKLm`eWPm?bm4@swDHuKe09w5ZY(~kM6JS4&hYL zC+gjDELdo)3`R>9%TgH9&$xH&WdB4YgcU*9RzVPK;%RJ9n5K}Ig2h2LqRY&Foarcw zAD5s)%K4xGanxbmlbLJC3omrwRop6@mkRjTuKby=!HB9ECMglsiJxl268lsimM$I; zSM{|gQ_NiWicqM@Xr?P9V2c+Z7lr!<i+vX3y;G{$NWcK}NxwCdwOzOrYN5WK*jto7 zU>;n+E{CZbdv?v3G}mN0G;6{Vo+I_@*l$9Rsc(<Iec4*JXxP1)ODE3WB=fRt*0Bpi zPpck-8BYZ@sEHX301tAJCqb#E)rv$XMw5pch~Rd8X1bz4wX%EwR!mwKOyvH{q78%p zd|;EQ>YWc@ZceT#2|@uK8JI(bE+rxs9t^6*n_4aEXCsCeBAvl>xOn<<i@6Guuf5hf zC)S8Oke(Awre0Ew#~4??9M1WwDW!X4{`A}~Z+@?CV69Rc4l0_G-ZK*`)d{$>11lBi z5z{B4)75f_p|W>)o-!6hx`js!DLnB->?5_lgLmZbx@+^Zk3rWBuKWd9nF!lX9CYw$ zN~{(E9xGDOaMV3xPK0$h^&iyrEv2rLx<SlDNAGAQ+V{)6F12t}Y|)}>HI$JWUe|Ux z+S%3gK8eA>x9mX!>`0Qxq8dj^pf2z=3Mjh#u6eF`LmFBS9GO$L(r7t^nEJibCM<oz zIIL^>RI_nN_r6ma8T+>DGR9==-Jwf1PcQ8nGrZk|IS{%=F74WU()co7pf+yPb3n&- z-7?tW=H2?VZ{DR3=>W|u|Kwu;1;U$2N|1&(uufA<D^VmdVSV;q*&$rC$C-&V`)IEx z${&+7Wt$uge#{2Y2tXm>Lf1$Tc0*!vT58Q?;xqcR*}Wn8d1WTk@zS!g5Ton<n~~NS zW*^;lbgUfIt4E(nAWv-YkabgMK7|^RtD4{Vf(<lP^0rM<M@=i~+e_G1mhhwezr~63 z58Tg?j6iYX5{r|^bJesAxM4?JAnXiqR|&tJ$Fd%#Th`N2EMp3SPl7T*8_FdZttFV$ z;nPAAqZ58+uPXwtDbe0L52+H~HkvUa2sC<&HRqGpev$nI&uZH~9Stekw#n#hY#-lB zHr9#lYFc*YPNxw=TeZ*3Xx~3Av1Vh8wepnus9XpB+}g-m?_^l2EmjgxHA#2kia1O1 z+a`(F^V$K*jX5F-c!~+4dc7#NVnY~-S4mK+HWidD)-0Yvta*y}J(`j)N(o=CwD-P8 zbU`bgl8_7}rr>4FQzorKV0aoRMYEc*=%8UD92X|$q~yTlAi2tc))wxpJk+80pdib* zohMEQ2dz{8T2Ojwpegk8lpsr4m-a?GS_>rQv3?cbWt9d8uUNAGcYC<1o=-Ec7+-ig zR0>)=x%i|*dWVmm6SeVW9@+8H3>3qAVqW%^Oi6mQH2t~BDcvWIXtZ|V@z+r+l2ydj zn43O0TUt1|Tmt7BwFm@hY((BloRI#?4Fgg8EEhRAE<_hhR;;2%BqbBZc=pJ@$B61{ zpxZyhRuY6nh_`k!IVz#zM2fx79Eq>>%dsXRLF84`r6pDYwFJHd-CTj4g11a&sax-N z7HmFblDjTFJ*DiK=$z6E<^uQDAjw!ddG75xA*R+-x~+dLfi*j{Uy|RsFq1{Ul_yEZ zwy~D(_ub#IzdH4pPZo=3`xaasCz*eRJd5lY$g@|C$FL6)pjB5*tV!sCZnnB@K+Npl z0uzX02-Sn88Kad-MiP=wl~Yg|i@phyPVh$?QmO@0B$^1!F((33Fu!E4af7Ah&v3I# zAAS}FrE~0v&=_+Axu_l$E?qWXUBWV+z3T{le24ltU+bQV810*9il1weaCqT`5v{9q zoE*Pv;YL)R+`ew{21q2RFo`JVwurL`F=T2xM~EQ$bOg=QZ@esq=B5V#!+t0v6|l-I z#GNZCbnvw!L5d4WC|Euuj9|^Q7FArjR5HUoqwoZ^r)tT*T_xI6mHT(6LYTPpC#rgR zt(;<9dT^x}myTKwAD3B}H)&r7z+Cr-k~0dU5en4GrNc{@wPZ&DduOxz0h_Rh+uc8# z3>C%f5>svN=Siz3I8l`mtD%<$r+{S_8io!hU3?d)u4|k~Cls=%Q9A`2G$Ee!DX+D) z^GpC`Mv!DZSn(<!zMjA4ZjLINLl}R`o#KwCQ4myKN9=isK8pV<R16-YuXeKNiX;{X z;P4oIBf<a<d&yJC>fGl($(~xmWp{-sx}ra0*WGUS>ljC5rAxYJEP%ynic-TbT3D=$ zu5A14G&MxODDYB<takmz&xl8IrQgo4L9x+F%^;FS$!1gAe}6zEuL%i(%Fbbf=vJFp zjyMPiU7|^g7W65FhMl-mX|P#7J5eX6?#2VbWVu;%Iwb7PSsfX3SpIdUUQWG3XRXDS z9c!1sbhElc*R0o<?6tk~LBtEor!FReVOfV-(K&A}*>C&!Q|H<BtQe-7d}vt6*p{A$ zwJ_c=L8&gRu^LJU$x@%a*DD(55{_?FP%!u;AXs&Lx-OJY*g+|-B90utN|a0Fph6_| z_rZAU7C~<bs97Y)BIX{?-&2c%;)?hISH&@hWyvEEXYHp#s(f%@$3|x<8rl!*SFkR^ z!5-(4ZU30fbF&-$y=3r&kG?m`*UOuv4g^0quy+C07CC|P5a{nwhRuq>Pk#(B6o`0l zeX6<;tr$W?@JcWfl{Vl9wg)3jM>w3@yX@$hks`N~)8#CAiabYNBL~A%iyL@qjXuaw zg%{r)Vr1Zghp*hPE&_-N={M#it&9fgJK{gQ_&d9^TD7wpcC}mzV}l&(GYv``sD~VE zU??5ysK3lX?Zz^9{$OtG#|Bka4$2tJSJTcS@7=4Iwb9U6fjkP#^CO4)M7@*-rcfVM z!FYs4PCDs6a0b4*o5C0e&k(PC7T>xb-zvf0(poVFi#kD=itaZRU#Ne(S0^`$XuN== zyZCtMb}&N4OZzKA`N}C>t+mzq{FuDzlia}-2l4&nBWMaAfdt;11nX%Pt)oO05pRW~ zZf6&3rT?N=-IPLzh|eV9&2M5<lEZIXV$uPe3P5M%c>XVL1gWR{cPDI7%P+oXm0{#g z{oo(ogdeJhT7vD5&p7&RbsmxHE;6!^4;mtWkTrUUOX2rhd3}1%+W_Cf9qd9Kwn4~k zG7HFREA~*B3R>))E^_|_Q%VKZLqRtLbrb@of6hH;tw(VP($QRsL#RX$8?vTp^~|9A zIf^kvsJB=@CJ-_p^H_(ecNKjONX0Bl|AH5tpwJTdpZywR!EEhI*b|l&Eq@Hq<=5PH z7yn6iA8_%<*3$LQx$JT-+aT<`<Sm_y(V0=_jp;Q(!I=Zh$ogmk=3fr#;~SmVJsL0V zEji;Z1`1219u#JkHvog{_>~a!!7$k<zDR>|0HxQ3JAcM+)MOs0I=(Ddly>&mR{b+w zd2Mw7zu~Od7{*>yzj8=TUG6OA<So_uxue++?2Ey9Y749Z8pX<Re#5R^1sd8EB~sJS zyfrT<TbU#ik$9o6hG5Jjg4rFkrzw2Ra6>Vf$-PK1g^2v27%(q`A<#tn?ogaY<UwPL zlK_uW&0sJP;i>Qk^$b8_Vl%3x?=qRB`ggu@MXG0ijwp$G>-&gs*6#O+Vpw6GKC<w_ zj2RUhT>FnKdih7WrtQI{_tn3GCru7v?CKrHg2%eA?mlC4JA=oL+q&zLoqr#E74&E^ zW=r&_Dk}E|`&BX#IIPc3$kF<Z$hy&QykbWcS<sv+B771SFrW7sbH}v6Ng;q>W)MV3 zh8B04fXx@~zMaslxM@xG%X=+KTWo$l+-7T1(!^>CT3E28n5_%D`x@)0Uiw|V7pC51 zDUQ>dGIP;{`sLm|%AO44_lc^yFpEBjc1eIO(jX*fZH+|6m_F8k5-jmh+~R4$e33b% zbE3L)V4Wr~OIRkTQ(F=V17tShF6adaE{ARfH34b9<l8i+fiDi<ajL2ux%J7*6*A8m z?NY}%zv<eYOY2zBo(u1pB}=nP!;emNY(ewCFDIY9XOz{K)OTi`s$ZBRb-a-O32S)- z%_;uA)1bSmY~(pKuc`2{(CS1(0x)~JWD@QL&>pYVjNTE2=P)l4b$qOYc%u<!Jk4%~ zs5qF;d{Il3{O3#eAvQzCaA9oXRDVOL1+}np>{E5EQ_69w^Ly^xedeWVKU@o0b;xd8 zv|xiWrUY)GJau9h&M&DuF7j-?e9_`1oImP*8}p!Oq`Fw2I75MA5&KD7pNGeg7({@G z@~}`6B~rXM6XCbfCmfM+k$l>T8<C$zg4X$Q5a>GoPG~K1DJ?B9atS48^x&nB>#D!K z_}cZV{;^AYKdvjW-<_&6G$>@17Ql4+Dh%ay?)k+pNuOR1W4R-Gc_WxA&sSEMwulvr zH%wPzG#@&A1iBABK%miOH$hKy^i&LyLXbloJyO$rG`k$das3>RARvA{nBZ3M6$<lE z5mO>4JlZ3ek`vQN@u&6(X366|HKy%9Z?*k?QSEtJjT;!<^p&kC_Qc6+l3e5XmA=kF ztkI$qc57J?KP#Wwy6<JVmO6HkdiMu;0(<qt5+1BJ%!T-~ylmo3_*6)yF&)I5ouDF$ z!UPo|!?DXlDFd)Iz)z-YcLD%jTNkqn=dh<cm~x#V;%*Jw$soYl8O!%{2h(0cEFR3( zSpIf+2Np?B{VOui`=Y?erR-OU5*mLXx`Q%#Jo^MOXiD%9l2yJ|GKR8nL~%csvj2jB zR*&KCnH1B*HxCAgPT8!}i+Mh;sy1W-PM#>AD*(>Q>Emb1w1>(6dIQjjK+jQ>X7qBl z0I2AqtpJ1`^8X+9un>CD!P$ol0b7<RERiYNuV1NaT~dxqU4Z?1>AA?%(k5X=tJj_K zY}QGgIDhl9`XXz;X(N}qiJe+sJtVlj)sU_*A%{?=y%<&i!w>K&K9u|Wqb{+4cp<z3 z)D#@GPo3Mkq_sNdYVjGq{7i{@hz){7^q!2aQQVMH`9OLJ5DNj!MkuI<LQE8awba+v zYZK6^y6|fd!NaQh2%aKYMcEj{4nxrQ!vv59A0`mow3U}p+by1HYn~)Y<?g2u!+t;s z3$HXhuMWS$UsoF~DmR-J7pvC?!ymqZ$)}&(|EkO|=yz9@VjD2k4mo_SdK@|jMMgvz z1}aW%<W2|3uQz8qfU$bnr!Ojx0+pepnMBb~C?r5#|AkIN2Q}a*#T5}eqcCi2@mf=# zs5gS2Ju|;|Nvn$WElYae;%lB#8w`x<l|6<fe8Mh2cu(!g($&)pDZ0`{b!?XUE^xE* z6s!%Zz|9@#VC=(90aP8r0YNDN+gG44!JbwnfSBnhtT=-8K#wd3^%{3%IY6>w9VrgP z&#rOo#GT)=0Z^!>PeL=rlR%4i8AyV{I+0liReeY!(^|n(+?cexY(&Y30=4RHo}k`c z&gALCONLKlXSb*h)_V<{PhX0^fxNl<S8fx3FS_w_hA6~;ye;oSU8j{ww5aQ(VOGFY zz1~2Bjl6+WizdrJq{y(-fH{y!nx=xtZ;+o02DHcqSM@EV5?n=y@gU8<0<DTOSvWsy zXkQ6IDL~cH5D*4N-PuXD2hnp55|f@|nv|Tz4NsO^Eh`tyIvHK;a-URgSVDgvKH6+v z@WJf<8&fA(i;Pdq+H@%-O8sPqlg}?0KPF$|h2z#e%lZB_FAc4+c+AAD{Up}tk<5*3 z;w&!BoqE&Ease0AX_Z$2AA(WW&LHYIXmAl5T*rrp`q>2vcq1${PrHKt0@~^kx*}yd zRg&W;UY&ZhV(Y{!(~b%i=(CFI6a$CfhLIi7XSC~c6^ow+5U^na)PVr>(^-jP)<TP5 zkjpYtsJ5mF`H=>T!DpPqkTg>vTf2Nj@s*O{bGd1Y`#jsSmM{kqh=ey6+$XSC&R4pH zy~0UxWiHCadI)SDYLg?Uzb|{N9GaL<ItFTstxT(oTtt#FUGk7C#i!NSfmP#j_Kr`n z*DPL@;22BL0vjH&X8$LJ(ggX=mt$BZpw<^PmAWDR#cAk-uA0741&HiIZ_<}ffRH3# zCLC&h#1Uf=VJK!(Vy$G&QG%)**TZ_Tm22Jabu2vHqOPlHwbtX()ZgZ@GyO~Wv5JyO z$9VAQpib%1QL^&Z2mK>m(Q4?T1pjZjhgV(ptr6vJ5YIqSXV5th&p5em;G|X+lRPXV zmk659GZ<-Y(tZ4Ln4z0u^NU6bK$rlPO=nt)Er_<{Oe7m2XTz(L33b&3o0lG$MCV6J zGWYIy<wRs^acWrUs@2bpDP@178_xC1tetvs(*`be<@Jc?Ln1Ps5^zZOX!9Db1n~U- znV<R%M~6tf4h@{;Zy$63G}zHIC3Gm(prLV5u@=VXFa|qn^jSU8!v7;D7ec6xDgSX{ zG%MmimWKwU{y*Nn1HOvliT`%*-g|_ER7fb&o76ypK|uu(5EMa_qDWCnfJg}?bO99* z5D*j<5ip@B0%CYnv4Ru@qZFwI6u}tfi3(UDcmMCq-rajI<kvo*|Nn1XUT)uHZfACP zW_EUVc2V~cEw9xMY1H_Tesc7Cck3Gba*lq-vX-PP6rQ8s!)yz8Wv!Lwl{L)bFjofc zj)mxVOtmomPRnUl?uZ^waP@n=HJjq%O$(}hhnbxq4n1({*^NrO_khLw?vmA?LbcZ! zY&I!cyI{Q1?#R>vyTp@<cGr=mIIr1m{T<HKLiUOu_3B>BNELI6-6|&%AZ!c<>ESa| zbX*n`1g{h#VG*kE*&#p_U?a+Dzw8Cmq?}o_4W`McuBTnggxdbfTYJbXp{Bcr2}Wcy ztRy|W0?YL4AuBN6vvfMVG8V;^Ni=AcX^S$%dE<{LSD7aXLf*F=iug7H+B-I)S_HIr z$a)#umcdn}Kc4>tAsF$Ll)1U5xyK3rt%>AV>QDyxl;6UZQqJiHx)~KO0<jTgUdUSb zVS}vtBI<)@-|re1TgyCgV%t|zWSW6e`Zp(HaJ$^YU8gKIj2Gwa$TN)RF26X&GQTp6 zJly1qwTShTXD@u_6|iS8&tFGnjH*MPG&KXm<YL%BbL0VQGPjo^edO1ef_*5gHzTV> z(t0!UTb%9Kk{y{#M?8WGpTZ47y$PXu-;RVP+Z^|O@{+oEOtiDdsE?nsr(1dbGLB=6 z@BM=)pMKv<$HTmtlU7}<Sq)LUlQvRl^z(l|Uq%%D2vzl)r_{K^9T$0SjFCRKf9vq6 zOAODSr(mO=gPyGbjZp?RDx!DQ?1Q!CM6rd9)-a|xrnWyWf;U=lJ~lXR{UXx71u101 zrAgD8f_9+OQavQdMS|Dkq5Dm%il+wkD;4$2F0uW<_=n9UX7=_(B%n&^Y<@ZaO<Aeh zt3$H=0#WhTO+#;S9FgC9DA^z)o6z=T%(ODv1AfiEyM=7eur@np0R%hSp4ey)(Jb(U zAZH{Zo5DPXj)jSYCgl1^l|3%?8Q<rZ_)ERz;e?{K_x&Ohi++-c=`wDx*@G=-a}!(6 z6|mwhWoI+OVuKnJre)X=cIH=@JIXPZ_-`E6@`K~h@h8R7?j3wO>eQJ!Zsr_5dp_xP zI(!zKetylzk`$3S!HrP}7qX*cl2~{qQNRRf#U>n^)9T+4quPiTWruef(Xy?1>|dDH zva^|Fb`o7mvaZoXDX;*@ii_1|`k_|Qd_KT=!?KMR`wm}9WQ9LElBtgd_0hC+i0&6n z_I7k~G%X#XU&m88^_($2jQVg=m96)?cxdGPBkpWrhFE;ElUczbN*R4L+Q=f!0WD>< z$^KG&7EQ^JFvT6V85h=#?zX(g%WF{&2*G6oTe^7qd591kvW5J3-Gl4E;dw;6Lnc!x zMSBc&7HvV=Tc#9s#~a)tp<Dg*#?7T?S<wgLwMFI&w>KPA?}5JK4vv=7#FeW8R_n(| zl~$pkfUH>1(hn9%8T=NlJ?+;*PQ8TD5+)CwX%s#rBfLDPu;<nfdv060MD&9W*itnj znKZ)l5wDX*2$^m0QUy&aTpvt~u;&__jLtUwpgDaJU;cW6IMI8W^u7j?Z2P-zx@&-A z?)QUiuV}o1Ra*;fv0qoWM!+xNWOxkQbK*Q)&HxJ&W3E{vjjA-gU=(2kD#V7sk~_pV z4}DzEwF=24(<t~vS)Sb|isr3L79-Yb@Z9@opI8a?=3JFV?(VWUpy5eOq7<cRX|3cf z_=doY_Yc0f;FTl4M|;ZD5S33xE<aV-i#*>u-s<?snlj#s_0MHLzg&8~jm$s$&MW%P zH?a5Q<+z}#^!9Nps^~H0jI@?g{(bJgF@KAi#t^+=SG_iOy?;!~#OE&!f9~uL9^+tc zi{{DZo9~sA;+4@GnzjFDW%I77fBTI0-YYwca?nAza<q0GafB_Kvs!%<83L{MFq<i^ zJXY)DM+6PeW`t<bY!2I|4V%qjlfZFoVNmcSfHx*&KtysS&C(>1a7z-4BVOd&VdmDD zP9yJZjpIJyk>+L<<gC13bP0(!&xAbAKucq2A0yn_4O0&P*}x55!_$#*q#btl&0ULE zImpT4^)Ku;yv6n5@0!mm$M~D%&Qdln{NdMIlSfM+gOX+#XkB@&tG{fBA3x0h&93|6 zBi0`msa7X(Se*oAJsc&JhoUU`)sQCM4oHA)fdQ9<58iFLZG7)(^KVYCw|+&rX5&&z zd1H4rO>gq_oc>s}+!A%{See7yY1z`M*&B(%YyK0{Ok&xhcBtu8bR3;f3Ry|<9CDh+ zJas%jtnkQeG&Hsg5Jw)IO%wpF;#SeSwqNqk@qKb$-@7d_b$qk9@$=aqIp6ePA*H;L zuP#>JNaX*te)il0tF;Q^wx94<<G5`KUT{ttg{fL+lKX2a4^mBRgVs#02^kyo_F@+V zX+dfIf@vMHV}N^zf~K2otkI-R^(N7-K|G=!D10svP8e?jW-Ri+)sfd0eATyH#KI08 zq6U{cSS`D7?(s8~;;(OxsJMRp8*kKTzq{Vb9~#Tk-tsHs#GGFi-V*&tua{3%Sa$g- z!!Un1H@4Z<?+v4W-?TKNqyF8#y6eA$gu9(r^DAJPRfgv?PMt8|d?O|J8k|0WSY@^& zaYoqMfh?R5ITp6bjw$CD;5a!()YPqmj1vhk)QM2JXntOw_?Q~zo>RxqR*us<M^s$5 z{>?XPEV*Y@VS}Q&Ajw!JXJ2}8lx6Ps8lwESS*hEYn&H>B>EC}s#9$;PSwHFp7)h12 zp?(k3Qo<_O5fCI<gNnmGtKqM#ZXl>kxAh>hm0jN;BxEDCa`EUD5I}3D;$E{l$YG+l zESev$M@5^ha`%-kHRH_G2NvHljGbjKe;O4z^Mz>%SoHNbNBcG|8u`W}<RI(&su+gY z`uUTGjQ8N)$6)+J4D$L={6l#a|A749a9QBr8umIPOz5~Hvy$y<sD#NJT;x%=1rL!? zw}m<dJ>jtr9$TlRHOH0R&Vow(U<W<~k5Qg4Y9yl~VqTv3=J`fNE#y%VRVwD?NjVpq z#@ewD#g0=p5|N$nrz3vnPYf3kUGAT@*zlY=4IQAOkaDn|TCBQ{<E<P);M%I?%5WGJ zlGewRLoiMSTquHEB2_CSS7=qCO9dq6&?=xB0S)kZmJbHrAler@-!R9qb}SpLM!FF= zQ-f|Ygey^mR){0DMuob{mZ124#OPG_s@v97)KXGOkxQbNcs16{EUSx!G3JD_Ez;}= zrXfueKaAaxxIG40R!_aLY>6Gkl)0#aT+?%Mr0Cgcb_>KY)q4%0|Fe4De(DF^_`<J3 znO<Loah_mZ(m#fjs;RAW?`9_z8MfEwXhna`L{@~zR2);2EU23OYQkokR#S}H5?iwx ziK~$KtuS?oaYB*{@(bZg_%{KGf{Dio$qB6zx+D;f6A%>{8)PFk5JNTzkz2S5vVqu{ ziTGwk$TM<rsjGuhDQ9((k4+NdYIS+UeAF|0`U6w-;X}5461hG$r~Jy8*P9E^u7{sV z9FYFPo`zy=jQMDiSR>vPIdAKFwZWC8@!Kb&=ggjGe!@jTgKG%6_3fTBq5jAx=F2oz zV-Bes71sKz{o5NA!u-A*XYGu+o8hLo*?Fjjha0X}z^)1D?a1U@9aqjJZ_)HvofsQT z6N}xVa=|B9d^fpI#V=Q=O_nMoiqFfu!fG}=ei{Y~R2yBc;5||FOPq{<>DiZXUgp#J zGhdGM#2gsqd-RdMv!Xq|-VgVGCdwQTa{9WczkZkT(fnIq|G+SIE^5Afmzj|{MH;g* zTMwHi<*cmhJ44TBTLoZaXUJ2^Rx-WB8(bWwIJWzLdxJ|E=LVN9k^LgQ|J5xnwUKs@ zCmFof?zw1R^}3!k-Z-r-Z!^!=n^5n=_zx03ivMu9cw@~6Wn%t$&)gj^s$3IIpWPf2 zHD#2!yRfh@Jw08H5#CQ;TX#^Te~zf}iKFM>xHR1<R;d4h*j$PNALy^HqQI-G-8B2g z7B=Uc0A0thXZzIEj=pG$IrB&H2W_H<+zW+%uNGpz<9t4Kaa|<dQ8o*X=+>odbeIx8 z3;`U<L+*s16X$>R)Zo>P>Zgmyaig9)wtNe&=^5|6b<BhLQy#25Z_vQCW8-A`RpzzX zx_sopC0?y)`F5}I&Bv|p5RFs%=JY^Db~Ewu45>enKLgUEz4e3sHRrFt&##4ONw%pS z(p-O3h>FyGd{!<#hL`pTFA6Gq7^=|ZsqlO{%7X|26<*dJ;;Zr7s*kE-7Ond5U>O}( zr#Cp3v&TEym@(#!3l&TIqUJte%pIS-577?sXX@a%p=j<gzFH@yzG`@^v)%5W`7(Lh zI#7&0dWUX&8|W{mZhV6*C)>=v<bd^_LxQu{$-U!j7W#FK{A>PF{6U`G5L*puF(|!Y zv7iGm&1yF1K60|x!P2GfLHfELk1uaLe7yPl(4^TXmu`zFHS^cspPrPtwndMdW)2?r z?r@{C?A}B6`$v0Wy<rr*_l|gEXHl;eI}Cl;qr!ZAgl;@<{!DA3&q3T(58b<6?qj0! zE~~&Oi*p~bT6OHPR8<ij91|2`lQ~4Xqb{6`uxJ$9@S-F8Y4K@9RU%e`)H_VZw3+X9 zkCBzlPfyHzuSblh?D9+Im)^zGUj4Z?qE{={>Gaa%ym1f%3;tT1@Td8)*I4k!qMKh8 z+PtDJFYZLDllLlD>$<x2G>@^=EQGi3d-E~<ccU9*ZZ({wP@Z4fOQ$U2q@!4WJFVv~ zavpfdIavtZ$UCpj=Tsuga1Iyf=n%sNd+U|MW|Kyfi9)`8X|(oD^rhVrGL@R^fg0wo z`}(X&9XL)H1Io@nK{IKpSD!iQ@YF}DJ@@#sudB)m*UV2n^1cU(PI^wOY1F)3<J9cU zhH<p$&)$#eo@<o3q62QHj_30t)wCggO-1ZEfqG%1kY$8JB9B6cL}z@456O^J1Z1X# zbtFhacpjEtL?%w;-6@4HG@;@{kF7|qH`Kg7VeoUGzqUO>_jxP6c*MNwd1lhS*}baF z9JuUjjLC<(zx+=fStr|ToPEF5?e*R)npU*svDda4zTL8H?+nmKWAIK`(nla8k|<A= zKY_FG&{YA>*$^If4ppwT8O7En66%F4$B2mF28q9%0)fdHOt}DW2q$~?@Ca2&C1_EA z4urWtXAWt-ATG@Mq))6-RWvv_aqYdau|<hSY^xUsEniY=evfCrOq1h0WuHk9&s|<n z<GQ%rBPSkvCcVPQJz3Hi)%__$^X%SKWx<D_ECpFIqcFQ}f_;E2nd(F!LLeMF`d@b* z8&po`IVtYZdFm$Xu$_nmRS6R_7$ilE2n+b<-VA2R#9<f+n#PjTWHRxNr1AP>#{tNc znZCKY`NwDLXE&ZaFQe<r^%EB!9QZ<K>3!y0fzf1m*MS>bb+0sY@W7m*NN6B?J(6?n z;@Rtlac`ftQcvz#IBbnq4B0(ylXz@PQIB4$pcK*vihqzZQy+F>9<;(U)(@VFxbwR@ z?!8D1iT!7V=bQj>6druxtmEPhc7a02g)ESu<HANQ7Dh}}d>STYyq#o8`g~Qe&P{7> zY^ky8>Z0e4O(^AS{>=98p8WEvG0}J@dzqCJEoINund<|$i~WmFk2dr<*H(-b4Tap^ zPd7~S<OXC9de>ZcyyNV%<8;sa?}3I{R-vaM?#-+LpG;&(R3<O^92#8763cnU$Q2hH zpO91`D!^YuWh<+Z9JW}mO=_+Vbrc0-+G(Q<i5(^)h%;EMXlMTT_QLbCN=FSkC`!L_ zsHoJ0(mP&XZC+mCHTrKJKk19scbhX4#FdSGhU#Lr5NkGwfg)k9Zd};E>`lWsW={QL z-nofFwrM3M48f?yDIKH8L#K3-pc6{-=>;e+SE{o8<xuF($Kc)=Ep~%~(@s*BlqjXa z`QU2BLp8`cbvqY{8H;{i6dTj;w0UsL&8LL1MkH;m=u3R~i^aHnS5E)=wUuVJdHE&J zJ=dy>rJ~%%CM!kUYZR0B40xZ0@k6##dw(fqJ7Hcq5`$+?@fK37REQkF3<<T4a3h<| zWa2E$VQB~&Nj9sI-A4|cdvtuM(u2MbkuN=aWKx6?S*F$j^PG4~c3+jb%KUSsF1xK6 z`GdHlhPRwPPsrt~v6)wXzOFx8l+(Ry*8}E`4f-oHzaFm}Uz!sS&HQGP?!n#Vx7-4H zW?2!QW}qhtIb_@W%cyL+*vO$f=SYu*%?o!w0W%?Zv?UiV_F5tONoCG)iAuy|V5$;A zh^iH@PyPN;vscI2Urs1hy8j^&@zUHQ<9$YiQ6+z_?3R<6WBv}RdaN3`TKKY?o$v5> zBF2x*UN0UK73b;tJoBGdyLYX6-drtzc=jv^J8V9iKkFQR$rDIjBDB2_?_a^D4?k_~ z*zxYrfy9KF#2FewD1htF)4X<bS!P_WIklWPSwp{?GiIM4ymufT;wsK*P<Doxkkd6K zd(48Cqnn+91Fx`H3<=}&N3mngU(OE7a<Vh93!B_z*lVYwBTKKZijiGEjxRGgYyOc+ zV`3J3JvnDrnS}4na&m1Carl)NhfKvSgA2vDkA~`U)8hBHnopv|SRd*|o;^5ckmBB^ zLOmO{L*Ym~gbRd()W9}GSRoc+)%989JE+q!k9hW&{gJGOGN)P7&1~JmuNA-zkG)$* z?lPd~sS19V;C%Af*E93}K#02r<0v?J{S`d4>xL$fQ<ywYUXn+MpGiu@0Wx+wJzUf& zUhf!dR^GNhK4zU+xN2Koy;U1O7d4X-w!Yii2d7gX^S<~iTVMZsjxGoG?j?;&pRE5t z7p*ZktmEc3<7TwIcrFKLj5uq(aJxFVP5`UO>**oyAlwK3QeN_+`O9!%9(lCsUUf)G zMAjjfgFfWr_>XRz(Bk?ZrS$Fdu0JZXUT-pRkhxuSY;Sb9c0ym+hHT`Q<ZM~sc^_N0 zUuk3H5=a?-JDZFoRN~;5Cb$f_M4t7$4Y-q`aIWy7%UTHTH3`BQ?i9ntDtx@h0DOEG z(JQzCZ@*_daGegt<=i32zHq{|O)k;n7}wXKxL77QxTeUtXxDqdmCrC0)cZI%fZC7i za1pgx%WmCz`Mf;N&}Ty5%tjYM)6Ez($_|^a;cV1A_&Xo7v%_e75Co&l*)0hfwD9J0 zx)4rlp;mIL0xP+Y)dPY<f(urE<%$Gpr?nurdOU`k4+bcYH;w(cUf+;2^4D@jqnAzF zyXF0|F^jY2t^IOc>eRf=IL92nVD_k`ZA7*VWSX(Vq+$O3`3qM&!2B5f$Y98G?St38 zFl5JWn2(QR+|f?17k*B(pF5bDNRuTP&IYH7eZ&-g5KIB1-t~8%(%W9Y9Ir1hZvAJf zXH+^_u$^(k;5+b<CBjR#$S+jpGsK8H`Y3GcF)R!-Y<xQck-US!46FY5GPFrTnE*m; z2dJ;0TqBJeqS~;~3|(4QukNXd^ERBRE-{HB0Jz|a^@Q56cX`q5DJ&Xk{?s+^SS8A$ z_VuHiddi%HqG|1AlZ2wfo#o7H*B;!m(KO$_R5b>P>t2Y)QGvi9A)z8gtU&6{bo2J8 zQu?RS@|WX7J9nD)5^<%Gxe{_|HGIkSw1@oVls^n>=$oL`?7NX%Uci?ZoYekGd@JIV zT=FD`obUu&YKABXPol=F6X)y$^qa(@41+~DYfg-w#6;2bGg0oI*S=o+nNN>-_M5q@ z_Lhw-Q>U4^!kYbboiU=;<S$yp`t&)^zI-AvDs{pi5|<lR-{{r<-qm2<)kV_y@U1}^ zf0&!hX}WCPw>hksnPY|zUA@!Lue{rT%M+k;nDxCe0d!J2hxYzRwSGZ_RD!L&!**^R zi}2r>f)KYLgzZ>1V|8AFA#FCVGhvDty=s`df12n|k0^a_PQi1>zOFbnX6e*TX4Pn^ zzdrX<;VmuUq58|*;?*<uKRrj(`Ff)6G54C*hPf+o3g_Cfu`O4AVt7S+5uXOBVt#M7 z6LjOVS9^_ayDa{U{7RY_ZnThIZ61AZO*Dt|a~*odU#;3*8nP)2igX@4T<U~xe}AbE zD?iM0%sbi6UYiqCkc+M7;MqEVg+$)Uu7GQH-R`I3Bcc0nwV{#HltvO*uOf>9Hsl~e zXfqm81j9ny*{$!?jnSp2ExtEev}r%*nH7oCv!+-1X3O3s=IWevr6YgcF=p7z6hpo| zHGQ~83=qxxd-U}yi(=$&Cr%s2c5_oy&djw(q-+ja8_5T726ihr5(f?-svkD<FR+=T z;V(+Z{SVb>#^MOJ*B%3`=SiHBR(9q&_JQay%oJEY<wK)dupNNu9g<=;{5TBUzm*}B z`TjCWbAbIjsnOXE9P5D3g$7G)z53ws@5H||R!n~DuaQadjm-(>`Gw~3bYZ-DeNC!f zDrw(x^N0Sp?|xIdd{w+{ez|?3dDvVaHx+Fc^DJ@Kq}#IJH$)K*F8*iQ9OYAtHqOoY zpJ{`=5n{#u|D{bJ1AwL@O99UI4A!ux!z6@xQCMp_<I~;dNXB-LKZgFPSb+iuaw{fd zc@(PI#38?or*$ixaR{!B$dU?f7-LkbkxCb};LaDh*Ziu@vagmcC^v50IHX(NG;~|L z>Eljsjo(^zTy@dF_|aVYrC}V|QPf)QzU>yjM?Up*QAOj&^i7+{D#lq}&aM#S<TYTm z;|w}S)A(c5O})5(F(`3q#~pVMV5cfP{4@&VOr1`k*fE%ZbT}jX$3>GC{TBaQ2lJ)` z<E{j=a)%%FHrGGY+oX%vhYmF#r?$je0XfOj1=hk7%K8Yqv(NEH(Vk+tLv*#$O`(^r zQX@jdJ`^dogphm+*A2kS5i&3E=ShbUK}Plr-{6JgB4v~8tF8EAE4thYTl8cGR+j_K zUs}q6Roi%4-ZAvCGA%xjKiF`0{KrklH#rq|sv!=`4mFqGIb0W|`o~H6{A|%bT}1R3 z<;;uy%|A)%fyu^$K4iOu&7cXN)>b?qS~}Jt4;tci6y45P0(6$R8iaPIOqnp~rY`Q~ zniYh0amR!}KkG|$p;wF2qOH>s7k6|BbZ?(<p)&y8(#dG=;x3!dcY3%jAML`g6q8}B z+Zpgf;VWWv*zmo4vlTq<UH(S&CI)Cz%r?e%p8cptm<U!r6U7nSDrspQ!N<+MTToxm z=3@(Sm(zMzP}-ci0Xj>ZEdko5)rM~F;$E)(SORpc;*1TA6GnDRGPJ9JwkdU6QZ65v zG}uZXfcE~$EpMb+ZUutad4kah@YvV^EzgHQXKBv|q1g@~Xm1Ggejl}5;a+aN7KC<j zmkNRY3v%Cq&amDHw%mm-lMfS=TMnLk2J(nO+#km7YVjyW4DJ)f%Bh@<a{}%Lzv^oV zoT+xdJSFaN`o)zcH~$OhEZoy{BXqqm=sR58%SDqCpc{li*Kna%i<aVn8(LC747!X9 zodM{3oL+R>-6TKvcEyXy<bC9MOco2x<8i^c=E9e?u@{HVk`;r{?wZQsp@OD)tZ*+E zwS&+u?xZl>G&2=+2DswROc(m5e7>&{GiM`uv6inM;Nby5%d^BWaf`zjXFaLzhXr(P zWK`eoxeDlZicT#b^Uz++^7$`vsyDXVLeO7@Kxc{RB|s;KKyUZ_;o@G7Tk~$j-82Yo zBzV4dp;v1!W9$`gNs}P7Ug+89LT3OP_xLG2;<h_2KevtQPo~pLGe^<65}fgr1aJ30 z!54TtD|nJuTA{TU{JO_%gBvrtqW&JdkK|PkmRD^6e~>wYSw!PS+Y_XfO#<R$ExYx_ zp|ix05}<2`K@%Sdw^v&}#^s`mxo!yTA?AyM&A`>IHdkEOhWWX-Dz4CodeKt|%&^gc zx$W$$G~W>q>c}TR$Y~)ESq&Hhf!>ZxB8UN=pKKgHZMoGPnNjV2V<|(FJ2Hu&7khTP z&>2=6Ku7UAgOaE*q<@U(G@u@2Zm!l|KwcLcCu<kNS>C4kZtTMv%=?EJx~=wUkee=a zjeh~1C5Dv%T{8@tcu%;&dnA+%)pFF1+WEOP6+cx=sNJe1tF@;~Xty&86f})t1)Txt z8?o2V&rMU<hhiT#hUt97rt^5P<?MN))+E|3FAkk0CIz8+5k=6Blu^(`r^3Bln;C?5 zaaRb#O)Xc@8QQ{N%U$Ry`MLGE<<?rWy&m9}Bi#$jq}D;~ER(1$@d~>QP1p(At7YK4 zfz5L_B%nfmF5TyATNY1xNrKg8+?m1?v~yfb#J0Fd-Wd^|cLA;BK&G~+1Sw<7JGSO} z_~KmL*`lntGi)4^c6RIvk{RE5j=Q+CwQR)tlqkXA)!bwbFdoEeFbTeo@&0m^ZlZMn zJReSmKVAV7dRh%~n5?ta#|}Sdx#6a}Ks*ofYC9L7;hY2Cd*m;lz*oqWPY$t({S^}_ zTR9?Uli;t0#{j#Ulo=AC9q=K;4T|-Lafhev^oUX&8r<o-t3$^J4DW$^i=I9;Q%}ee z6|P^EsSEX{{rYv(MfL9WAH8S61To(n;>rEz0V$9;73;y;<^X*=_M@9>w<Cu*(@+m_ zO7*CpZy<<CbqHz-FuKx~j<bgl)YKuUa$-H=RORF?$(37G#s%Z`LZb!!wJY=2xQP*q z|CFFB08x_7-KP>L$L=+G0P0{58@G2+EP{Im8Qa!LJ_;vkj@xhHEYeepv&PUP?%S0) zXMIGeXD+{dCO&FH*0^^Pv&vrI@aERIUPv=1&6*=VYg6x|Z3R&gBSRTCZ*t9=?Ybfx z?OW5ISl&}i89B?469+8VEREf-6@A+??UtzS#;75`h^HnzJQ~_(3M9aHzI!pkU@g-; zl9facXN0kzj0TJ&yY4|;&F4JppsRS+-5;EFt^}xV&uN9blZ$(~s8a%NM<*%VBrgaz z<l@7wPI56j?NFFwT+BJ*w-PWrmYTv$GgP%YN7O8#)sBT(oFgm5t>TdzI8w)^QQ^Mg zwt7VduH;ao(`~gQouNOC!)%$~%-ma{6$a&sYe(H=WA1Jhcrv^~tD|)wXtC0m<>?Bq zSMJTY%n?0D*fx9r!JF$bwoL68aj)}kcNO8RXUIPI&9ej0N{eSsEJb=5SEo5VWqiIQ z7hkq!Dq9_?mh2UvrmT!(HWnYG(QM32g~#DY@pk2iEx{Fq+b+j)RT!yns9ioS2hvcp zF*YPlU{&7{a&0r@+D$nB6d#i3ngx|3&v+Bgk!LKVo$2q!F;q%o&q$?Ye{v=GP(u6= zSl<U7f4PWn#2#H_sOSrcYiC~y0`-auI=I5f$E_bO8a71!72nPiChUA$i|#MdhbI(8 zKPF$2JBv0B37xdFvOKv%i@pXg+nDq9gOGCdAm?WIZ%Roe$pj}v1KXqLnp`CEYC*8o zDrd_-*S*&`f*tpblS3Rp<k<^ufcTRb#9xum4&~NDpni~8>{r(h5o;=9B|eQ0m)apK zX^`%4;D^b1is1J^%89R^{_v49di2W$&rE!?Q*^1K1U=@?`2!wXdRO~<`Zb&73(9|E z&|^=3(M*oj<7bz}?Nak=yewj#*X8sJb32wFzCTOq58Qp*qfKh}cXh(RUivl9?pzVG zAkP{9Je%tA$XTIX3(h8YoW<F*NsTj_r)r$7fHmTbT*uO#i<Rg#AIU2^a1Of@S#WyL zSj4ub0~2p{GNO0|g50tsr6#&kiaUU`k+Y&u_!_$SvPIjVByj^aoOz=#)7&D=G`AL@ zg|;klaXTv^g_|UxYHN=8Cny13+&qK8D}|e8nZlg|PTkn<TWns<HCq_hJfA7tSgEWO zGtA!{EZ%_*7V)m=g;Qh2Tj;F5z-P~6>{)1NbF*Dg4!FCTj!y*kxqj4_2HfzC67RJk z@cw}J3CXTi4$p>O({~eKl&@knybrF#b3GeAn~E414Ig>F1T?Kg;CsNjpvY-0LsMTl z(1g1JOH+kA)5<9Uw_)S10Nh(WZ@aiNtviCa-4%+n;sI`XnI)^joo(d?N9qmjz75a| za8I4n?rf_Q?jEqY?BcfDZM|v^7N<SAiYK%u@|^(-cBDB#yzkkITGG#`-2vAaZY$Mf zwGbL}v_Zih3Gv>j{o?`F58m#Oy3B2?OB>TQYrxXdY^zWA>_a`__Gz8Pey*<w|3)O7 z$#rlij+#B+hz3r(dHj;7w*4El*CPjc@&Jv!AL?)GHtR$fH1&=%Iy#yyaI%xA#Eu7# z$VYiZHa1)6e|a_3cTx3PA=hK<=?i^PsBgm9v$PSSyo25KR5~ljmf*`i-;;oTz=j?z z=Fr#+S(Bm#`a*62FmelSqc<Ugc?<C&w*Y@j_0~th7C7*vz2%c0itA-l)$y^g9;de# zvYzL+1JY1>zLcxygKq|>azw|Xm1GA*sPF0T2VgJ3X?>2iw&)%D-sk>3d~oDHRzA2a z*)HfCa`)Sv)eO%=w(!(CIZI3dUH0g6SH8{~kNRaGQwiM6m8EXK95o)mJAsAkeGXT` z+Ok6Q53YV(neA8`)Rxm8lG&;)E3{XG647movx4N7BV^fqr*@C$L5x@BU!*aT%DtN@ z(%{uY?;_mYk?LyQOxBTFlV?83))7Lk9a~mmsqA9O7VRJ(6c)$MR9HxYtJQZlBoFHt z;Bjm~;PEu@wRiEX5sOOj8aB$$truMXkM>wD&NUj6Op$j3IBPm9R^0Qd89TU-)6@tS zN6^P;9iS@OGK=`rgnJf?UyP%yP`{iTvTU!Iwf4{fJGf_ok$bQqkN1rx&OI3qqCLRE z<9$2#Z1EPXfHivKy0&siTUv6@Qd_**iho>9=eET0gf@a!UdI06<~D6V{2L!`V=JJ) z&Q$iap`r1d@#}{4I{smWoBYEH_j2uW3Ah_Mt!CV`LLuDH{b;;BGhED$FS!wJHdw~H z5Wvh{y*1W#jK;=hJN<Q@8Nk8y-K>95-w6B;frrj*<<6uKc(GEu#P!9wvH~Xxobedi z-nW>`s=X_Q@MuJ;N~e{ZF@KR69TeTFdQ&uJ>^;%T*hfP>7Gc!O+BB};Y~B|N4`1bC zmi;}=`$FMy_W66R-%NXhz6J_E#@q_+H{n_g?tFLFC_Ta76z@HdWcFKSXU{9(jq+|M z0t<8_u&jo^ns*V9=cS6>H_F>YzTQU^4E#qCGy|}Dsb<449`@@fJei__izgur4_QhI zPbNIf4jyOCqS`|~9EB%aw7^)$yC}V67@p%Uo@{L?JU6O6j+as4p&c)UXQjvyt!Zup z54`VHLwt1XXI3p*DR65kL4h*(!|XjG!d1=J!o{^l%z^|^xUiFy6vQ>1rHR6|Mk_%7 zDqKlw*9PmY$>toyN#`QQ_;G)9NQ|+o#A)rp9&u;!#gU@ULd4BeXO!g}ZwMHT2re(m z77Lx$y*Df+d<c@KW7iy8k>IKLR{1T@rA`iAISfs~S=zX_Cax{_M$X#H)i-!@uh+@G zlvcY>Z^wU>{;1HWeEXdK_4QhB9rk+n<>~=YHWVw#7(|@Zf`6<k$L}hI%qvO9kyHb# zsv6G2zjl-H;_F7QQZ2`;6jy^hVstrCXsGxN{xJl^!$m~oa+nQ*t5b2iNBH8=d!W)& z=U;uf+}LqrydK|U-6niqW!8lELl=<qCQn)E)lYmRw-$9syQTL)-7~Sj9(!#cX3s86 z;QM^EHv~%ovuC-~g8JXJJ{^tzB4+H*yuNu<L5o%xA-0rrt!4*$Bkv5+{8l?d%e8NV zJ43E*Vb5>d3rq4-d104BG~1Y6FRUZ=8MF7Ai#bEP2+SC%h?>Kwr$lD3zAi!U?Pt9Q zuL0>aaXd(y`+nQDu`WUbzRS9yuMHhSo9knCpcywy3xzvJYzX3Z*Dto*uyK>zP`Gmh zoR$uCE^Y_9c)M3<SAyEo#ckU`#o7&R+1vF2yO<r=Rp{-zc~$(Bq7mNL8+W-KNmkza z(fb5*WR`-K3xloZ%vCfG?zUxGJ!_+9yl)I>e8z@uE2cR#y1v3@HuN3VSR<CT&m5cE z9Wfg1{&v^1wkEa?peJ!lxvV2TAZT&cy4xB7AN{tN@>R<xm&YAyUCN75{(j{}AMW}8 z5#G766ZrE$p;w&kdJ5xb9Y#d17m{4iMIp4ub^x&>%5HMT0m1AJfyojhTo`9$D?AA{ z9`XuQb|_^#mEww>9s;Z(Jb$_GT&>N3#<TgtYZHRDcL2DB$35p==nOztcJ?k@+`%Xc z)sk*5{7UV2$nntqCBhDPJBotfzw$nz;GyZi(T-c+p`RWw+tXe5sDB^)qFu=e)-}{) zEw5i<ZhUBSY%AJhx1KdR;deB8ap)}gKU`=YyCJmNxQUB|8(bXd!n&B96(M70z9`s? zkuFzU*kA+&-3^|@t=`R;+rI2#=5;T%!da~YR?ZKB&AQEnW%)<2&Q2x4j`C8A2`{Z; z+Xd-!F+1x_f?mmOR?r#N1Hry@p@VytpwXDaBLypLU|+564~`U;ZlS#9o2I$l*sJ8R z{A;i+F0|wAEe@RpOU|X!g?3gg3YzFtxR)bc>y6NkCySxE-3ofOwyuPBJAQu!O(R@E zX8_vmOSdHr@{y8=*UNlIF4OsiO=n@SE$kj8t~mBwap){TvE=r6We+_;J6cCU6P*h8 za_yBMw2RxZ@fe!>Q$c5FD}ya}p)2L*)>SQ^i2m%(EkD97&k_#>u{+W1P8<c#{6A^$ zk7bir%bey)33uLy%BVvmYi&73zQbw`l`b^P6zmhO!%kW*qR{`<K4Dn?!hdZ5{il7x z3JH8{5b?9Ya~}SR<^JtHVFLCE^`*tEpD$Y#o!#)Xe0fY!(c|Liv{1We!DL(v^BLuF z70YEGl3U1%UzvFfxrJGfCFTZs?1n@;t9k`Z{jH#vYcG`m?aUd5<{nYdIpVPrpq+iB z;w@RBy&3Eiw<XRDqq&ajD$x?sf6(y{yZz^m3}+>;WFL(TCHpcn+>znRzAy>QBSXPv zPjvCRu#Uea94~pAl7sZQ&}=)vmTrhqbP1#AChb{&T=88QnpCt(_%C*4Zc@84HzBjo zP02S=MhSQKf#NRzukFjE6dmp&XU4Y(A6(d%dG~<)E1_umJ+g_cXWl+2ba>6mGUnr$ z!3}y3{WI=HK0131y{$_|8f%4*c?>Scy4RICZh9)G=NX!NNI_>KqSnRjLOWwnK~vu= z=o~S$1l*2)qc^+?X~rrA&0d_Fc^yxqZ3ee+m)*k6K`gFbc64oJ=&d}K=Spv_hTd{V zoU0QZPkLQIf5NjwL1$X`1)*In7piTSG4%>M+v*jh-i3C&-A}@=J%g=8K$Bm4A9<wP zfQAF^8@*aijLU5ogEJpIh}Iaylz*Zq7q<l|XR9<+A2bC2dh`1z_KN%<-#Prlx|L?@ zUSRQRS+(6ax)z+H^??H?pvkfYY;hb;J$Z=5HT{g^A$IzmH6G1N7XxHkj&`OfF2n;& zy*Y<lv!7|o5}SfFxf;~g6_~dzj5+*XK=YWm)uAa2%L?s_U{AQS-;otcYtuMXT02u) z6YOR8ozAFL(4?Ofbhfr7h}(q@wFs7avCm^euMryPv29ov`sRE-Oosli5B~hY^dGe8 z?-Zop)qa)ibxD2n#~(~Tpt(OzGX3FLFvEwsv(Uxic$>;0*Zp_=#?S3H_7A?1z56tZ z950)KCM`qIuxp3Aqs4`7WVf!IiOgljas|tFcX!JKjp1)Z>!!J_b8*-)M%o1Qa7(6; z);ct5&oG4(Fiu)>t5J`3tjKh6xc%$QlL^@848Z~W|8AVdvovM%(CS6mJgZ^zxU#^t zr=0brf~HZTpfj<rSI730Ii6+(Lt{h1WNRCOW5czg!Z3PieWRdPiiF_$#(h6*F553g z*k9nWq~O<Rf1#(8Ukt0DL|A6fWj%1sHe~^-4v&{7<jjyO5J;DWWtt81csb!y$YD<x zCsRV45RVr;Kw&97$m2!-hXhI0v|T{T<7IT7Q8s)0;4VgRuUwy$wByT!nOQSqpMQ4# zz6!IE-~ZQn@7KR4y_w_i8veL(Vv`<!{pY7&H;h+i;Sz217Q8v$6qa^}c$_X5eS+iE zmE4XuN7<(|PRTySIPL3>Q+L)m<AY(@_EoSMLvNg+@%hM&#jEviF!FRBc}KY&S)yC8 z9j?A{tXYO;d9I*yMEw$=9bZZ~Zj9<t?x=P#J8N$~OW|z>4@Paw46pX~uf(M!c(Iba zw_s$}LsChf_O^MR$9hfF@A0OgzM)<J3#@00_R-{>-c-~#vg<KJQ9l}cJEgqMP@h_s z@mP0~7u?zaJhQp}4jUdb5%5*Pl@nb5t_^=L*WYaYA$QW6TvIx6qg4hzpqrGd(%m1a zlTYz@NW)D>Q1BL}4ZeIjTT0lm2WrgZ=Q{2)qG<4aJ$hEYGk)e)61?Xzeuh55-w!}f z(ay4$cH0#`-h=hh9;|xyF6HkLq+@?idx3Q7o}PKf3{eDL+ILgm8wdFNX8gPv@1wm3 zFYP_x`;B<6#m{%pvxUC5zrUToM|<S|a`u4n-QYnC)gt7*cE>0r+XbUE62#WglrQLQ z@woMsvxed&5&6QLy}m|>gu8&OC3Q5it1)IoMYPynSF+R!g>GU#uAgSyAKTE)g1B$+ zs!l-vS0I~+`yZq9(nk(v*Kg+7W+Ty#JRU0tfZ3~UtmcjsUSm)zlF755o2(9BgVW$Y zZVsb!mGhaiyl-iA#q&eV`2aHiMDq9J`1?`NuNU~a7k>{erk~*F-u(STXm5^ZlRI8B ztS%U@HmBY3iv0yUrkUEjkKt9DGy1#GE`8PVa~rBvGq;X;ht@Hts|R_<nwe;HEDeR5 zct^OYUxald_nbZBOzVQ@qUSe2lSTxzY;Aqu@S0;t33o$VH`9#T%%@*4g8==X&h20} z8_U@jo6GQ7B0uPh<(AV3WIGW$h<Efn`*9a~Z#C1MC;?tbIR{q#dTBb9isN*AI2A|M zLJp=OvrF(iw!daozCI9#TI;wgDg>{kCCgfLZ5vW%IXCb^?Qn8W?7O6T6OA-|ZPK?N z-DzGZ7xBU`vz|IQC~|W2n@d)li!Jlww!*DZkuO}G_uMxlBPYe|5)XVYhQI%Cy9yHn zV{`lI`lvmV7vsXPm!2BDDDB=a7ERdHR~MO|Okc9uScY*|T%!E1Ga3;lMhlh@jd|R4 zhJ?WV*U~G_^D{}XWH0TNLqef{vcz5y>GURRFygmk!H%-N_uR!%IcFF;Ta*t*<*+3| z(6-(2AEhhzHMb3YZA-flX-ly(p2zuZU)ygR5qukudU~6qT|vnWvNcpT7niNXiAVYE zTiv&Z%36+T#cs4$!|DvJD<*qykhK(dj#z8Jw_|vYp5te<41b@7k)7b#1y28>sL@`6 zKCz`AbDHLjLrrn{Liy9aGr9qLH)vs@aSSbD9;?9r&V!w~PZ-GTVkM4!wh+I7U-!|y z2>!DCksB8}?42}ylxGS@^mQ8ADor0HQxS*9ZLKn@inZz)f0t+@s>_V+W8T=~9VKUt zo$}#hx{f4$&yCC3Yv^;YzS>~uzE>a7jgxPPCzl$=67#2JId79*;*$p~{rV6utm4v; zcy;K%J}+|%Wa(tjH{c|8r)bRLRM16-ldg1g){-3Efan1)MIfLbXh)CYyu38N@O&F| z<c()xY)Q;(Vd5%IIv6Zl&4Affyo<JaDf<%s9<4E|dCsCWzpB=V?$%FEYj|Z#fA3gR z>I?>~dwV}G`!RQ4%H7X%{II)V5Z%W+b!r!~t?U}yO=As6<KOYazKHSsGw(~OUC6d# zAx4TlzFd9jKo`fIC4Ud%cIB+If+&tVOF|zyxLuAr&<eKzjjG)lG7`9Lj=Jp*o|RMB z>7<Ejc?O~~+_NTb%Y*P6L22mOy0)Te2|K8zl?Dnw^#V(^t+tH&?L(uD7>Ot}FS2J* zKYnGjl!N%$%g<@n9~fm6%jZFBa86A?JF1Kea-QcPTKgLJ_X_Ji>vXa8*)pS}c$;vE z;f#xA6Za(SJ{qy|LXg|8By)UWH$#$*;-2ivZ_bi?2n)`tETXe2cr#hzKJ5+o!gaK~ zwz-HU51*!?dRSvrkGK90r+1aKrL(?Ya~s==bwSPRYJx~xudCQ#I`4zGfTDkY(oV@f znz2guwbc#>XRIsx9NcTrzt6E`-oe}(Y_>D5qj$WN6BBf8!uNN1f5e)rJimLr(LuZB zj4$?{(!79`N-I^sPX`~GdUgZ8f`Zq#z#6j0qdV*3@^QeO;qNxvm+Au9$}wr+XCDJv z7kDO^?IY4WpV3-{`QOKbaf<pz=7YwI9Jh3u>P4=YX>CP)J@X-b6~`@Ivg@l@+fY9R z@FAzI0l$mk?=c??J=KW%c3jWno%z95zBV0}vB}aDK6T(LW+PZ{p%J&R-aN(a%$Cuj zEyfS(J=a+S{jBN*JfkK2J@{+5=dD0LpSJ>B*vTrY#}CFC>-qoT)H>sFPmKZ(pBe?8 zRcQC!Oy^Tf7w@zi524?&(~kG6@ob;A;P>OS1?tsUv`<)YJx*AlJ_BpZJG`gR@9mi0 z47%L`_03>QA7IU_Bmq62WbK1zZV$iD<|D0Fz(<Vn3?wFU&z!q^_f_+8(12Hyioayj zgTDkX9xTD8ci~~Z{$#w!vDrLsz=z*)juqnu*;v+aBr=T~oV<Go%u&`5M<T2FnJM}~ zPKMeKH0qr>q-NY|cgAHRbDeu0l+6RuN)EJ|`$Vb2ogoGWDRt+5f*W6@uoI<fK4)mp z1u1psa}b_wFJBqJtC_>+zCn|U{v^r&kj?q0xu-`Ve(`6ry+k5Ew}KU0ih4}I?|{GK z?|q0{rSGZ7kl*2U)H9stE7Svydvc~0jrtMz`>%WyiCSR8w-P;3e+PR0Gwyj4_2Be) zg&kHda~f7Iuw;q|aWA?+>28WwffWPj%&rmK7P5(ncM3W~M2ovzX#4ym;qKw$_O*7Q z*AS-_w9%fU%m}v+p5YBl=}(xm<r(|8T%UoP5CN|}OY2Ks5B|k%$>?$swfCV}-F!Ys zsP9W@T3xM?G0FZbWJ|#JErD&SXA{0JLVaCro)Kq%Kgh!0TSv|IcC6y<R4?AqU!qo6 zpX1~xtzPS3oyGN1S?oA(W%Od5*@5A9;qSY#hRRoPMl{#&MPx)-{`=o-ys=!r$^0}- zqiryh#IJ3B8m7@U81Va`9VD3^^aVBGI^!GhFz902+na^<shPgcctWeJ;60;!OHf~% zW~A6IqQtF^<acA*qw_gwo5EuhdHXte#CB~7d6Mn-zT)E9hI2Em96YYI1Uv~!gHU_E z^7eM|Y(sz183VN6)5=FDz0n@<cPq||-D<!0pm(DSzg3&-zPFd}hzq|(`%_f4=`HXQ zT}-dof;^kw6Mo{Suc-}R7oKCvP2$tS`0C^WK>w>;0Q7w*f495u+l=<nxFLGZc&E7U z+pNviye?mMxbQo|;GcBicZ9;1YVN}Ok(cal8-Jenx(n~eUVJGV|8U<QF8n5;i~DT& zzrF9d@SC*fk;g{SAJklRmF6l&zk4<q^s@%z@0os_nma<L=76^z^$+;6P@{ZVZOj97 z!VLA$L0q5C8b)cPZ7%#e<1^8h;K8qh-mxzHI^;~g3H1sdyEHcb)yQH3$-?m0_@q7I z_iC%Bf_j4XJnCDaplS4Ke<0$`wp)1jfh2y=ZoylP@4bDTw*r2;Rph=E`y=#L;Mt~q z4~<wHPmDVYRO=tL@p#3yk+wDIspq?-u<+O|6nCn&<4on-F7(#X!FQf?p|@z~L~WbW zFT6C9m{PIji3`+1;ya&vLJN6ZQZATc{O55?e^rNbFVMHD7hwO$tv>37M%+8=^hw+c zw6g2!9fJCKc6}m^60N%VdC2)6;L%(2?EKR_5^@5F>Jz#5Cty}x<+EK%du=dIk~Grp zHuvB*B^nh<du=d=bG*9JcJHHJ!LRegih%@A84`F@DEM_oPaYM3_pJ1hu4Z^hsXN%N zA^0D;KN%kVIfMIC;l~cO4ZjWPk7-sY{M2s*kA53N{YKa`ePpRC>|1d{kE|ww-p>7| zptp{rep9$<HLIYvh?_+N7dQ2rg5ENc`i(i`yTgWtJmFk1)H5L*;(nvQLcfhyvq$l1 z8cs{qWNGyZ_fM8=A?^TH(&9hz`e%u%7tb)ii^I1SFP8}4R{JId-jCKP{OdfmMK1?G z_k+TZo94M66#nuq{AySg?HzcYoeF+6&eYKSoMwLNt?8}o!f!B+^LtyF9~nOyB+V84 z24g5^Cz*^C@`w>fJw_&vZeG_R!unH+utxnOc6}Yjqhj5I@asGt)^;4X&)QDGuQLXb zwnNN+fp-x5PG7b8S)Qdg;5{|jU$WHZ=aZ!EZ-8$r#+C@*Ry!2}PxDOSU+2+zo-uxJ zKh!Jy>x?0q&&5yDPQkAhjak~M_K;<y;8$xeT2~3)-0L00UTX!v!Pv#)9sKdsG+uMz zHyDr-fZu55@$LslQZqm2Y945TwPpi7!2DFU)CS{_HGtqDPiy(s0nZ)Ghjqrsu+VM0 zj`^wJ*BK3%p9((Kg<p+$YDhfW4*VMR1P^K50~d^IWD9-orTlaav?&^PK7+wLj$4jp zwsXXqT}$Mni$Q#@KbihXD$kc1B1>AuLm^oP{f3urpZ6!kQVv4cDwK6NB!fH-UWa9n zM;={{kf*x<kY$i!<S8Q@($=LS^D5=fcT&jvjHByLkE}HR@GI*L>61zG4o-b+MdOy{ z7x5ys+PJFguKiX@8skTdT-%~&<(Y$*9IR~ocr9t+I<Im5<2zfFTPJ+ebzEj4Iv}mx z^$+guG-o+(vFL?cEJo^{D<{G67}H{&@OgZ#t~e|Hl4OtEt<AAWB6c>PV{ddF@<!9j zSwGJ!(p${sMm6q1_|&*wtphrm%Xz;IyNjycQ2S<SfKOofD>l6Cvju$US)E*Ql}FBC zbGiNv!~d?}#W<>m{p-Lh`!`p|7(o5!fDg5QbLD4@=O@6I=NbL2{oXTN|198X_ooha z&bj?E@Gsz%@99SP3JiZQ=vvPBVQ&*3aQ79BeDFt~%=qB}g{04&Laltu#LfvrpHk2s zek;{`t}`^R`$evCiLqpwcYD@&KE-OOmEFo*>kVM9YCej)+#f=HYgI3f<JNhc!@`>5 zC|moTP%qJonsE<2WbqjDqx||!bTc#E=~2l(ch9aBGEvAS&HH;a+~Z>S-YHz#8w^_W z>#CA&uH_q(aMxTJ+?W)WgCB?NgVzagMgb2c3^i(2r__Ozlu=M#P0AV~*PF+hi8e<I zaJ%-o0<+eh-1v8Ho&-&1KA9o9uRa$SvwWd3*gP!6>Fv8N7=zQ#pEqUEt75}TvzJoV z`cTRqSN`=dVtAX0h>4Ej{UY2A8@x0Xmy7vjY0jyP6i(5c3=vs>Loxzm2P&9Y;Qu8h zf>wMqg0wQQx40kN)jV~ID}(;GD~c(_Ic00)<PGw9Gk5Z&$#di9jM96=7uD(~y2?+A z?vS6P%V&oceTS$3j5Zpr#oFKq#s4d9Xk+f`IlkwL_!SSyxd}y=+KATT53{uRBVC*w zY|f$m63Bka^Fw#&dPDBebr)~M4tEDDbPt8O#<6A8;Ry!ca+DA@dZntA$^Hm;*U;~k zJkBwmF_Ljd3g4mYTs7-v>O{VH`I>1q+ah0CS=2&YoNqSTGk($sC*w~xp43=K<8Je? zTvpV$sD@l$)ZMr{UHHtuVZ_tA&xnM!DT|rs&=aRrj<fkwtl@DbHC$Dq;U4uHatvaq z{x?)43FO(PjO|WB)a_<|#u#y8NzpauL`?B3%~yc_>+jqx=^E#qX-3S6CSmMPjP zV~Tz=PNwhP4S90ExjVSON2@VG`+Ghu)~IhC#rJ9E?%<9YuhwYC4BzWj`TLIed)nc% zwE_OFUhwZ&-mx|Sd=&?tcL?hsPY9%`7VGKD^(}yB0K;Ea^~MOQw|1dE#G3*9jK|uG zc7=E|fWI1c1BDZffy}~>_)CY}Z5%e`cqBPO(H;BIGLnQR<Va8`Ql?i(4`h1vCi_eC z9paD`Hp?kJR4Q&882NLbNqsNHe`tO(M^u-$E-rd=o2*z=AS<TpO|BQ}<*y&2(b7|S zjI~&2pWOA)(MWg04P24n<b>g^2@HE4N<39)4g{~7_eV;;@)K#0W8wMm*p1Uu6Ot&8 zf2v&n%RLi1T#7%rYh1Rcj`(1D(Z#O}bC7r~T|asKo%?&}9j;@uLpXb>$k1%(pbg_v z*qs^<%eYDG!l5R`MY81trIH*6L#iMB6V6G@LtN$vy%NFyQpSH8z&wg^dy>u0CHqCM zx#nl4_KIxwN&E-qyK}L&`guvw&)ejVq7HIW(JZ+mUA|DXRHhe=pq76Q*#^r1Egz-i zE4SQ{ZQOF_;a{{o+HU!l<hWLGxV(B~+%$ZIwBBzh5U2V6GW@LCuM-i?kv2Dhhl4yK zyfeNt7rY==ejNYt?=y~xev8d<`^8^oDe<X!tN1Hj<eT@2t!6FEFOJ7C?uUOJ@i-Xo z-$ABq;rUb_q|te@N6j(Foac`zqfU@%3*<)6ZoRB_k9fs`XE8m!HCZEAt>Dxe?UXAk z?KZ2>sKU?i!s7c%_`V$QdU5YCJwJ{0U4MR7Rt~IxqZFbzyogw%@24V5dwuM)c(t-+ z=~?A%p?q5ns9o4St5rhY7AF!`<!zz$F1(=xjk9O&UZoo=<HUW!pAeQ^p)Jl6yP1Mr zAB*EBXA6i|rVldiwwzhO_QAXRp!Qi8+iO@CErGWWEm?2OL*%sWcX1U@6vd?Rz7u;f zJwF2;(w*VUgL)g@&8FEnKQ~3eqwVmTGy*)<LkvGI=#_Naj<Zp84F)i=U&j*wJpPj5 zHOqAHyYW}G+#IISF!Dw)e)v@gUauR(&!d^-n8!U?x(@KAJ>LTVJOwX5u`WCK8J?zs z3vc@xQURZ8x95YPU&@W-LCkV!R1>!!-UM#H5p2K9{TlhXbrikr!Ji#I;(wYApHTw; zv9nJ(+QA?6t~|>4dnkB)Y!JUIB!m7owLT~Ox7qmpLHus}5iwg{;pcTb_wOS%e0;Ef z-94E^_nhHijLjY#>-gnB(pPVr;1m9Wyk!)nSchgF>Ngmf?5ApEex#p=eO^Zc<y=2n zWpM`lVTOmW<@#w1-yMDj^4_b}8R1d8FUU|53XdrJ+8hhr9rYpbs8=T=(4H_oyaDSA z@|rd_kMMed^AquVpWu3$b8gHL>N(~}@n8ST*9`6H!u-h+uV4j&lclgqoCu_jR>RP& zHfZx!jaHJ4ty-a3ZBXAv>#cYd%ml-2c#+y*{S9AVNDdnK`pT=enMcBGgbf~s*KS7r zD9+*0Rq@cX)`1Vr=7RTL<$9()n9T+Ck1KeL$ph@8K?DWHaF*B^++}xTBOD1rQ9l<s zt7|uYD>!2P0jk=gM?*4=0Q)S$ZvAE+56v_Js$zNns}VevA(=7&|Eir?V|Q3)jSWTz z&aAN+9v2^vm|N`;Gn+?VPxI5ToE01NQ(XTBdNhr9GFveGYUHdSzxF8Jr8<lr?S*=H zN?M|k+8Y=zX^dS#Z!q3s-i*R{QLAQxrtw&l>vx$)eD^UtRx?!Z+0FGY0?*Hg3*fjB zuCK;ixCHL(XLv;EGM-nt{vz<d%XVI0yZ&~rkB5h}h361vQz|BoPxLa`tDsIgd*ZMT z-pTN9TT9I|Am9u1VSP_ot&aE*ZUUN@OU-XlPx|v?Pdw^(+4UREv#7s>p8nVqhx*-i z{Z7JzTh@Ov?&A7SOEVs;6ywJ%G!}9F5gWcU!$Uh74|`&P=ZX!VV&(%s<Sv~}#O^5C z3A_#Q{5e0r=RV`q8NOF~9^O$y=jWr&_XeF1@(M)m;P2a@z3O?l`#qiL@e1Xy1b)v; z{Jf99=aVWpG3BMRC+hv!ttI%+_;~`}N9Q8EbdDU~PsDR~em+9a7FucC%g=}Td%VAd zGru^0faSCsho!I-i>5D@>p-23W*AT|um_71&wxP|km~ukgNmg-acjSqdif`NM$$<b zb)MacA>)%IIAP+Y(<miy=)Y^R2fIQzg#av{Fc!So=*@2iUs)F18;sd^&qO(r?*Uj< z9Vo(C3Z^CGR3hg#r_(cz-1u)s#C~oGXjVN&=MvE}9wB^3%6vXyW^&82wZocwLV(u} z^fo6}vG{l(x<bcON#kP#zYWm?C5#t71&VX@UOHil?~9F}@bQAxO?k7ce$2>*74(K* z<GYKLDb6aJ8cORLwx67J4IfLPb%R!h51(ks{(c%=g0A($;q)!f<EXat(Pv9lumcA9 zN17N-*FA--ej>`#CA5?$GUP(|__~}*5*J=nI^?gS@Rtuwjtj$Gd8z8Sxoy2Z@?`N% zI5^dkq_ViA)vnuISg+<rmY(;_lUvJ=ODNjvKU6yU_ul<|kyp2M9N+QfH4#~!#ZSJn zCo0MOW<|VwdQ8TE(YhQvbkSxh*F3+wSCv@<mTdKzkBK!&xwFKuC#60;^RQ2(gJ%ul zSwtV<CZrX9J(eOv!87GQaQm0o<{r9r*M`n=&~aw_BYA0x<jDShkyv(piGQ{{ANhJD zZj-knk$)m4QjDhBQCsL%Z{jO`3BE=q<HO&IzBXLH3HcwQeNF~tTI3|qeR{aqT(6Fj zs((NJjv>8^`t=@na9m%R(|6p~40E{{Aft+|8uN?3mzA!OxYfFv-Hm#<=c}65*S>97 zjR{_nIb(utMrTa0@+IQDhy3w+2^W~c8yU<><F6J?HxHwIcDGUBEJe%O7n!QNx{{0p z{Y>3o-{~;E!<%a>#3jA_^MY+($SnQ2IdA?@IWEE%H7`rld{m5lE3cF}P^_#hs^?8w z_0Md>IJ|Mzi-z&bms9S$Z|Y*BG?MRP9u$+C+HK~8o_i?Ygv2_Fyu)%b$BQLn{>|sJ zKx+18;!K2dg3OMJ#F=lBCdXZA5^^4z89^*^;!t6&8W(xK{zmiB$(aqki**h3-zsFN zp!V6>rcsae3)O2MbA3m1c-XG`D$$hncN=q1*sl62$UwwxS+oyJcUU?5w!9Auj4>3~ zs0kwizxPE^zhnO6N&PM%-N)I#>!A5*`*$PccMr6}TD#thtVUnizx%Y-@YX9l5gNsb zsNW;CvhYf&-=m;=AGUulqxBY3?cbxdZnzCl!Nh7&va$VpoK{}8fH!%hmWkdQtqs)% zYeTfL7?ml=ve*<q)!>;NiJ!sRFl`W?I%*>j&(|2g-G!QA_<Yd)t1<jENE-vl(V%mX zHV}{x;;;Loj76!2OrXv?I-=%rU>FK~{|biQ7li7;c*o!`Mxqte#>Qx+YUeFzYfG-9 z=VoCT8~s;r9g22WLyM~6jid275N{if&(ZMtRKpw7@oy+E8izfFe=`8^!@<`f%+oQz zI24$u&5Bau&se;V=pc>^z`I5;-v$B(nJxM4qw)J#;2^%=g&ukwaOx@iZyMtJl6gaY zITnA}0xBX|8_z$DfhUNoG1@R1y_;<Jgwu{OsObdm-;KG_8GGvO5WArG9okpH-VE<4 z9rKEIvNAwNN&gA#VU*$sl^DoE4R?0-Mm(9(wtc5=TEzhqM-S6(9z1%`6I$A^$H$I9 z?5;sbFoPvNjF2bFnil*{!h#Pz>6qcA24s%O)Kd80TlwER`QNrr3>rN`yZ6R_fnRWo z1ZD{RPH&_Z(!aP|7W0>X#914v6h2F%z7{fi3+*hZs*Sl^7bkw|;S6&F%;iQHrO7-> zQ{YEvhIsrmWG1{7Yw{KtvA1Kd_fGWiVBB4ii^yR=&T(wfwrbn7?b;6QUD!28w4;y# z$F$?x33zi(X{QkbnU7e$vxp-2Ry(JCr=8a>Xx}4p@CW1`Z-@wo6l6DVA#N9UidM*I z*<MT&GjToeeA!;!BRk6bWG8vQ>@2&;2V__IpnOPnlig(x*;76&ACbM}qq4W`Bm2sJ z@-g|i>@Nq%fpU<1TF#KO<ZRprI!`W;3*`%Pv3wb~mM)dc<O-QBSIX7$4Y^jXlN;nl zxk+xujdt7RyYfBxf&57Bl6&Mn`Kdf0KbK#~L-L6HN}iObWxhNszm?y~3$j2K%AaIF zUXs7c-{ckfyZ)g5kls!2uJ_P;>JRI^^hfpHdLO;7-cNr_e_S7+57Y<g>H1)Oh(1)G zs87-->r?b6^{M(aeY*aX{<Qv#K0}|W&(fdOXX|tHx%zYZJbk{tK;NmquYaf?)lXrE zwFB(>&PEU8VWW>Rl>1t0rJK#rgq}$wNo@A!CeKTr=RNIf(xiTJi{u^6x;5G9OG{mw zy0)p7+N*Is{no5oa@*3Gr7t(F)>KP=AvrxID)m5e`N-Z)mL(r(awu{|N@mojDVZsm zO-?5tNG@IG!=~Qon^H3HZ(8z!=m{y=P3i+{{piavf!LqoK8;Ur>Wv>3KQ1M+T(hL; zq^spGRWK@)t`J+vTPdnin@VFVT~3*lGO3D@y0*&Fs`FB!s-LDdB!5f))>uv7)oM}e zdhNNj3+wDok##$yWHee>cl6CClMgiL+h9qf5sgM9A85F{QCs@0(TFDX(W)1kdK)cF zK9G`~B2#;%_DYe-^BV0Wx|8QMZreDc@z};w8!v0TvGK=^j}QmcPt$7n+mN5+9Zhzs zA8LvEabTNuBUM5_sRx=Y3;Q|Lgnx)T&QDWsQ!g+tb4v0K^+UV|bg`1UHYL+}pVKRi z^XW%@L*Ekj@z<xFl3bd8&|mapw~RiM(^C&L^-}NA58l6%FgNRlR-^Zu>`X4tZ|bFL zliN0}mU;lay%ztX{b=>+COcEI>025dslAfFrN2WD+jx@OChurkEhP%H9iq|D)SHsg z<WP!i>P=3kA9}muJGGhV2es5c$ve1ZYg3|9GE&z%oMB#oe^g7f@d*1C&~~AE7dC{W z|F*6ee{bYBaU{sg;=h9r+|R^EyMSLrbxH<}F#gQMIL!u!Xq+5q)(tanF6JA_ZZCcW zPP{~+E&)FV<Y|4#*M^Xqk&v1c)!GjJ!z$2C_d@S=!cPtO<GSF!+^#r#RtuW22c+-A z_^Ai4P9OYrKm0Vt8|Fd|FT+n0NZKuE<TgmyG}vrAA&cMFK7c&_2o~Y(utxVlChx=f z(Yqjj593WoA#d-6y!}S&4vBjnZ}?ujglMQ=@iPF~*#3l``v+${1|x3S(uN{x)X;_@ zDmy|OiHP1PL}(|83fd@9T~yb`B135-_|=+-CfWqZ>J;Q*=qNgBlf*Eb#+fWeic#8= z@Vf2Pri%}dIp`_uOzzd57N5d<F+&^>2ep|Z51xu=<<0VDZMLj08)$P#wrkHpx_8v( zL&6WkPRIy}9UnPPPS&=_>2kKV6S8}*_6g+oJZ%qT_yTP&<oH5uA7uG!+J2JX+F?lW zwc1yZ;_I|ykmMV*<B;YXwG)u&o3xXV>YKGwknCHv(~$1lwXY%J-_`OV<=@lJK+=Dv zos|dWLG7Z<lX+S|eks4yeukVstzCkw&)0r|yg#e`3Yq_{_8a8>ciLsh{tMa_$o~TE zDs(`h_B-^zPud^Q1p)0(=!4(1zn~AUXxHWM@^`HWdZDLgLLUqj2<Fj;iL!d8o+--d zqxI1uQ6Hy|6G@~GM0x0gnW7@({~S>Z(tn|-tG}SXC>rT6=}SbizCwQ;`;$3(j<`i% zrLPic`Wk($Xs)l<b45$tulvPa`Zj&LXajxmzGw@bv0t>)5oas9=z01f(N#a8pA_Bo zd_7<E)X(Y{#KZcJ`cI-CJQa!JaihFZUd%Nr8g<2UMzWDCUNusT6tUE3W;7G88Lf?W zVj1*L2iyU2uW_$fWppw+iPg|XUBnuro6%FeY4kFBiS@`;(?@JD`WgMiMq_|6K)hoN zG6o?=W~eb#Y%<<5-V%OTAh%j4ac1eHcFZ~{Qczl0(61=@C}*vc`h4r8(Fxy|!zeEc zyCWWUM<UKAm6e0EL~uG@Uc%?ES|YfcsHdY0MR{F|*K<%-p{&94Hm$7wp_XX0Mrni6 z76ovau?bc+<d%uG618}g+Ex#E*Z;zNEvvP&&f+xaMXdu$N0j?e9zyAk(!(my9>HnE zURI&j2jxZ7EkRj|x=p~b8D%G)-^X|R@%bsr0ep8Dc#om{VO<mwCCcg{lJHr<DioFR zSsf(>>!RE633?HIdQo&jLFN!K!b%jQQO2Q+N7-q8Ebp^=$WAEtqjW~;g7N@LSCn+? ztQ?Fo1Z5~n2FepC!%&7>7v%_)ktmrcqfo}9OhB24G6`ie$`tD-`6S9zlxZl_twQ+} z%G1FA4Digr=S+Og!soO2oP)o?i4{2?<$07vDBz8J3FQ@(S5aO=S&s5LN)E~@luhPe zaxXr?EBP79Y4mSC%2||ic<*_X?@@k0`4QzJ$}c$0^Pts3?}d_KUDQXw3kX{D(WuYD z@8j_MczjMZ|I*Q3eLlv(^VV5?A?ja1S&Z@$V9_pp1wP+E*$B9I0OLp9c0BLE=LaYs z;rBiGZZE#uhtK`^Jc#-{lrK<DqMSy_NBI`8-=SPUxrpaWfd2*XzvA;Zd|t-q6?|UB z=kNIZ1D}85^Dlh<jn9AZc@3Y}@mYjV6Q7oK*3hgThQO!9r;bkppB{YrkX0rEB@zX> zIgA*TIFtmGawwHhFt&`UC>UQxO_bUwby4b}G(c&Dl8n+6B^BQDTTq&#+=kK;<qniq zD0jiTaW_gkluj7O)i8gLX)UY^T1zW{Q$J@gmycmC9~0%R3z*NxFrSY>BSgzV))~y} zW0=>+Ft3lv0B*;<gt}j?GkQ;ybd;ee^Q~k0>&U&GgR%-`4eGX87xWLUGe&EaHYjaT zI$6gM{d)$ti`{DFq6I(W?T7I8T)aIOZ~qx@&&Atw@#aH#b1vSTi#O-ut%vZ|LwM^U zy!8;?dI)dL#hVV{O+VvJhw!FDc+(-g=@8xonFZXj*bBR)-DX{qkE8TQ8GtenWfRJ` zDBq!6Kq){eMES|Oq)$cuwG@<Q_}hD7BgDcQh(*L!S?K6^$d^LMmqN&wLdcgw$d*E^ zauXm=3L#GlAwx)h6heL!LS_^~W{{jHgq$dZj3|VBD1>|{gnTFz!?alF;aD*eB@<<o z7K?dah<RR!d0vQlUWj>Kh&ft_Ia-K0T8KGXh&ft_Ia-K0T8KGXh&ft_Ia-K0T8KGX zh&ft_Ia-K0R*1P%h<QVErci$q@i}Wz)}#3GyaVL}l!GXFC|{tQM!ATw;zNl*i9{)b z5`z+ll7LbUr5;KHltw5`LF*mhOaPn-fHMJbCIHR^z?A^F5&%~M;7R~o34kjBa3uh) z1i+O5xDo(Y0^mvjTnT^!0dODy4g|n~05}i;2Lj+g02~N_0|9U#01gDefdDuV00#o# zKmZ&FfCB+=AOH>oz<~fb5C8`P;6MOW2S9ZIR0lwH08|G+bpTWcKy?6A2S9ZIR0lwH z08|G+bpTWcKy?6A2S9ZIR0lwH0J(o2LaUSTw(%$vP$r^GLYa)R7X?&9J_aD?0+4S3 z$gu!qPXKZ!fO(E=lPFbDzzNLr0OolB^E`mL9iXvi&48Ah0ZlRknq&qv$qZ<c89cHB z7})`g>;Oh~03$nqksZLu4q#*lFtP&}*#V5~07iBIBRhbR9l*#AU}Ohi)p`+;5Q);u zx&n=O1)A@Q_Ph1Fs9;?Y!>r3<ILb(rOq5a9WoVKs&?HwN#jikOUx6gP0x5h2QuvDg zrgd3gi?SYNJDxv6`4;6nlnd4sNTDl`LRTP#uE5@{i+>xSq@vt{@(jugD6gRSQ9i+J zJAzjDP!drpqTGa11*ICwttj2mlABTLp#Ya`i1HvxZxm1?`=azic?@MX%3PFrC<{=Q zp`hh58)YTR9+Z73pQ8MY7WY6IfHDUKf1|&P0`BN1P)?zI4NA}^18p+UCIf9UYM|6Y zse^)cA#U%Afi@Y9QJSE<1-e>+@&Zs^0LlwMc>yRd0ObXsya1FJXxpvbpgtDV7l8T# zP+tJ*3qXAVs4oEZ1)#nF)E9vI0#IK7>I*=90jMtk^#!250Mr+N`T|g20O|`seF3O1 z0QCi+z5vu0fcgSZUjXV0Kz#wIF97ugpuPaq7l8T#P+tJ*3qXAVs4oEZ1)#nF)E9vI z0#IK7>I*=90jMtk^#!250Mr+N`T|g20O|`seE~dCwV`!xw~j#WABD|z0XEkK?Gx-3 zpR$g?uDSr*=mKn`3$TqYz&5%7+voypqYJQ&E<h(7g$;87_R9s>E*In_JpXDPg*|Zr zdf}+v3!mxu9BdtdemDyI;ex&ZzpugX8(AA2)py}}4}RZ=@+E%%5#<to{}tsj%2kv< zQ2s*s2jx17iM&o4ibOF`T3bh<XO2S895p&yM~ogQcpv<5u~rq#)heJe57gy>x;$+k z=1!EAhxuCt^S27-ZxzhnDxfqEl;(lbJW!ekO7lQz9w^NNm3g2t4^-xXx;#*p2Ws*_ zMIKt8ht}tz)p=-j9$KA;R_CGBd1!SWTAhbh=b_bkXmuW1orhNE!D{{lv6xc(3|jYh z>tpR5Nb7t^>wHM-d`Rnjtt-YS<`3lAajhFZyQA(AXzO0qIY@_dkmUK0<oViC)a}IQ z`>6X6z4|d=cfnTPZT+b2v3}L|T0cP2=R?xx<89|*L!Z$OB2M6Q<Qd4bzSb@R9uh?R z73DI@6_l$ee*peZd}97-|DY71SeWP1$`=McldR*AOy{6A@}V{I1>^=aM?TJPT@f8o zKm#;LJ~T)^G)O))NIo=3J~T)^G)TT2hq*o8Iu03q95VX2oP;tNWeO~sCsC%NOhcJ& zor9D+2aS^tjgt?JlMjuP4~>%#jgt?JlMjuP4~>%#jgt?JlMjuP4~>%#jgv1w#CyOK zxf|sZl)ZSzew5Ep&H?{<l<!e~K=~2nBFZn;IcTbUeHdiR2v|><)^SMKbFhieKxZ6> zO?(DgEMH%Q?_a?4i}+lO=a&G3w&+Xnyc}f(p5H)u8^8NezZsv~@w@}Se}M84em{uM zJd`g`zQXs%QBDHqX*}oS^IO1t_kY?u^Y|)?tnYVM)lDuT$xVQe0AX<j6$HTr6ciO) zKz0QbbzDJxzy<dmMnxGn&_U4=#g$DoqmH;BL?A2ygs_CgAOVuxu-?9bfNT2s*13tf zQJi6X{&@d+Z-36|y4BUy)m5kJ{OZ)wPzhAdwcUOZTCoVNScFzALMs-b6^qb{MQFt$ zv|<r@tPnj`h#o6Mj}@ZF3ejVQ=&?dHW)T{*2#r~UPAf!f7J*l{fLFJGSGSlh&{+^j z6ui0xO|cD4u?<bJ%}}nUH$+=+u7hrXh9ejEpu0AsyEY@m9#ZTf#U4`ZA+;V-8$oJ| zklG@o)<bGNq&9-odPr>%(z=J*5JFOSA*mjc>LIC%kkkm08b%U5q|QUyijX!BY4eaY z4+-;-Fb@gy(2twZkDJkto6(P((T|&vIuEJykU9^k^N>0Z>53p-5u_`EbVZP^BBZMb z>GF^+59#udE)VJQkS-7D@{leM>GF^+59#udE)VJQkS-4iiXcG|Bq)LeMUbEf5)?s# zijW`=>4_jYMMzErsfi#p9+KiADMd(%hlCU%Aw}rx&3ZaC3;GEEIrx3X`73BX?&X|U zLf=4}p<?{DLnY8|-$NoiB*H@?JS4(HB0MC*Ln1sR!lTqZO5LN>Jxbi8#3Ph=gc6TX z;t@(bLWxHx@dzbeM2Qzs;zd};68x!@>{O>0?aAeSl#<M&B=ac2D5aN2>FpB@3AUot zT2X3IN-B>MnM#RFr9`GuB2y`mspNi?+>es`QF1>@?&p#FdE{c0T#S;7QF1X#E=I}4 zD7lzN4o1nrJaRBf4o1njJaR3MT+1WZrjlz@$+fBESROf*N6zGtGkN4p9&Z`tEu*|; zl(&rXmQmg^%3DTx%RJsPkGISN0kLNlavMf&!^mwIxeX($VPrLooQ6d{mvCMR9rVM< zV;ETsBa2~VF^nvRk;O2w7)I{G$Xyt@3nO=7<SvYSg^{l?@)btD!pK(``3fUnVdN`} ze1(y(F!B{fzQV{?82Jh#Lt$hljLd|QmoTysMlQn0MHra~BNJg{B8*Igk%KUD5JnEd z$Uzu62qOn!<RFY3gpq?Vau7xi!pK1wIS6B2T}G|jLm5{3v)oQ#=b@CN%fI#TW%RTj z2K6S3RW`n-)eFDg^fCr<x9xFVL5QoM_+Hms{^vn8y{~25Q_};>^mkzutxq2QQBN$H zo>($Hv1EE;$@IjM-7oz4?p%MLn@cK}(mT!PyaIf@(n)n!IVtRNnnK?HzPE-211+-) zEwc+PvkNVQ6~?Kr#zKFxCx;f<g%;U`7Qu?*)Tf-v(Gt7#Xx#U3w!OR;INP4yB>Ze| z?{&`aLDQUMdVR_C`jRQnay<vXnx5Z$+{^K+>HTda4%-7P;#|zN?NAA{n_k|3>Jc`> z+Rz+o2^|F;104sohT?mR?fFlS(VXklH|Ik=DKjep8$tb7f={l7_6km!sVe-v>Hu_* zUj9qa0%$d~%inAIK|=_a%v}}SRl!{q+)=?D72Hw59TnVB!5tOcQNbM*+)?4Qq*XZ} zcU{Gqo&qh)0ed$s$pKo41GEwcXblb!+kRr(Pi(f&bAZ<1fW-Pb=l7sF(0r)oDaE+A zLnV-X;<?P{KOgD|)ja)i+PHk$xO}HGSolnEQCFUBG4TMu01Q?D{wg4aWu!1d+gC>F zEY4zlfbi>~O@!aVo1?3pQtsc)wY`LmaQ2`IXg_oSs`QsRhdBQL{RsU6`F;VIs=y8U zrEZqLj<+szTlzcPj^OZ4{vxnd0d|-*ZddSD58M|+eF)bV>F-CYGlXkH{bjVd`LwzD zw7L1Tx%srY`GV8$@e9bsGIFsDJX8Q4Do_ich0tbyjVgk^gDi%R5XRzoi{WGV{ea;2 zk$wR=UZ%%V+RuX1pCd;n;`bsn3ICVSZj*6Of#}U>i}T;(Jk8Iijn1cy&Ibn-fPo6I z5v`-7%CHlyrL@ZQ*Tl7e`&V&Z&3PSR3Zbn$tC;KCIB(~?gL4VzQo%w6dZ(0X#MnN- zx%6smKj3`MwlC0=Gx=nCLzmDe=qn{2G5x_Y1EI_CAB^7+G~RW%Z-9nFw(oEpk}!`F zx1}ASv?G-CJW6^VrMrw0+)7F9rIaF+64qva9;LLE5}N0p<L{JG8R{34;}LQ^LJrR( zhv$*Q^T=I`2O{L)JaR2UPDRM22)Pj<CnCIUgg1@wmR1i(c$)}s65$QzF*-$06Zs4y zpB2bw7<r76vNBRuh7499gZq%da#C4_{6$IWYUC+Q3d>00H>9u(87fD1!pO~D<faU{ zS&fW@No5(SEF+a=$Uztx2qObwWFSl*t^yedQ}+8vc^PGI>vEJb4pWw4$}vnC+PWR3 z3~l|6Qg-_&w|$h^KFX_{va)qPN?C;|r!Zv{=B>&o7uya*DVK7}rJORcZ9<fCKm$_} zY4p*{>7$p^M=z(3UQR9)lMBV<z*grm{=WdxzA}R%jXrxhvnbNYm11WN?zOnr<KBq1 zun2doh88<}un<Q1|Gi)AYAk)UrHs|3(Z4Sz$BNyioU@@8P%Ee-ew{h<T&acKICrNu z_N2V~Q1<=&@7w|0k1ixvx4M_p;<Z5+(avHID90X9u6kolyaeh4^@aLD{UPpCyg9al za%=_V*b2(A6_jHuD5qq$s=sm_3zHfLJ%!)jpl6`xpw}QQ?`kUa7PJUj3}Nl0M2jiW zVoJ1_65UFPZdE@}5(BX|V(p}Kx9Tf!Uypk@?wcW=g`J@sJ3~1oT}%mYWu18%rCh8( z$8Rn)55GnDErvGme-rdAWNT#^;r8Ia7upATPz7`VItYCa{RsUGRk3Q3Z|E8Y8HhYL z<hdcwv0;>(qoHG=<00}A8%8-cjB;}_)B)=5Z$*-}B1v13q++Sr1325-J&5xN;=Bps zy|8zbGl!`eb)+-(;!N7>SR3ylDN$#wUx}1Nr5!KAy#);f7DW;cQ1X1^66%9CLSwiC zXmin7l#E9XN6FzRIUFU2J#yG1S3Ppmqt4iN)1%JpCnuxQUcSr!Pw}6}*|vGMz1zz5 zZO{(Lwr6|%O5V)l%{<=B<ISSdcG<RS1lNd@IYY<MUy8K`WwZ;a)P*wSKZNXuq(xYZ zpKTR3BIlcM7eQOl>&1Slv<_wD03(0Yfe@`kn0io7JqS?;LcDcZb&C<MZZS&TZd~t! ze?Mpdcq`U&gpuhGG95yuL#i*-59$vMfNrEE`77tgp>a^%7RG9sGGsACj+G&YA#$xu zk8o1SHM9&EhkIkK4Sw(9_W}Pu<&2d>e~sTF{x61B;oeI4ZO{&=)GtL2X>su11MMZu zKFEVApaalB=zHi#=x3<P2_cIiWHE#+hA086O{^v<i?vctD)Loo1|W9>IS=AI7(ddB zjD;wbGUgU^#=g>(9PWl4tpN90-0L}S6q{P9Q^fx*^rNDnUk!Cc$DaueK<^I`n_3CE zv;&#iflTc{rb@^qYfrPbv=U^hl-wynrgoAuJCLbTa>kDAlps%~$Wtluv=e#Si9GE@ zo=TCYQoR?1*Bx8gc~B4N5`PCWRZ3f1icFQ7o48KA%%kW`O1nzxx0Cu3Qoo(lZ=+_E zkopoy{T|Ly^qv;ox1BfG&Kua2Zztv3N%?kCT9eA{q|&C&TKGzSle!X8S3>G`lcMdU zsDu=;<pFdP7OYHCvzxr!PhRdOC05firpwsojUYhA3VGUYp0=BO+D|_1C!h9{Py5Lu zTjzF@H~Yz({k;2r-hDsszMm)U=3VzQ`(prleIRrxbS1Samot5L=?(4WKe`(976H9Q zKyMMyTZFo@5A+rRy+uH85zt!%^cDfVMZg3Hzynb<Z3M&?0jWhmY7sPS1Z!6W<P`yV zML=E=wGbUY5}F9T2)#s$Fq!idXg2gQv;e==&^p|OP&u@V7J)cHH4(I?XD;JRivxm* zfM6mZm<V6Js2xeD1i@5-U@A%Z0a9p36DmnzC8?_XgHeS_P)ntX_?3DzGzoegdJn2Q zs!$1HsRXf9f><g+ER`UZN)St>>B;kwXkQxf)V;JVd!3(<kxn3vZqQIrTp4|Z0ni|> zUH&_(QEZNYM{hD_EwYxP8p}|PHOP+nGcN1?kws`O*K*O$%p0Jmxcjiypu>&VkEb1f z8hRG`Z!AG^WA9@5vE%4={M=f6Vq@hVy+BV}>rRbjXF2YbkhSW>#=kvn$G>+|qW{UF z^Y6!`Ypp%8F=@|vlYV>(8X$#P86G*FgS{gMdq)mqswwp4bHvho8Ry!*d=B=H9PA%C z%#o_^EcRzn3c1)oa-8MZ2llYKE9!sf9AuPOLE8V&6{|4)`eu}ObNpJ;Z$FB27l>zI zBgt|5a=kw^823o}?W3UEpxdE4pd;z$qhZwu=q3n_$jl6nnHe54GdxN<2m4D7_Lm&& zFFDv>a@650%{4ZF$GGPS=t*ciVV{N=&8GBo)I{h-XcF`?^a}J3XbSWO^d|H+6mM0I z*#mN7R%7&$wHPBwNJ0*hP>4++r`jfv6K4}h!6uM`O&~>oNZ5}E6SE8C=&x{FyFecP z)B@}SIY><oQj=3{Db7J^uoM%f);^F!yZWJy5Izd+hbo~%&=1g0&@YgWq`8oW0wQ%e zrXHj9^`R6f1f@d_p$zEXTb6UME#+Wa;yd+XS<Z>KDbS{W2nw;Sf<@k>hL*u&f_1VW z@J_fvF|-aIt%GL~BrSwT3*lK5hm>B3W#J;|VyHKC8T2AF8TtZR0xgC1FwZH<%8N=g z??L{5?;mnmeZf<*T-MmRM?syC&n}$1p?!(Vy#yKz4Mpo>cT%@P*q#)&C+5;6tMSm& z(6i9<&_sx5t4Ywy&@0eCpefKB(3{ZP*mrJ$CP06O2&X@SK7+o3mP0F{Z=lUknSV&{ z=DgR*GKo$yYe|w#eJBMALFrIKC<8hHItgkAodON;50O)c$f+!5l*Ftl9&P^t+J2B8 zTES|xDC063`i)hEcD}}vVlC3YwWP$fP+dz3<%2G*YfbS)6WxSvO+o_|Vo@nX!xUnX zD8wRBh()3hi$oz>q!5chp`JyUAf@yLdTAA!^IJ-#KP57S9<=B72Wt=YFOj$^iOXuM zO5&;{u1eynBrdCwDv7I-xa@avFX7$$LH(gY{upP7KY@MQ>(eTYp#>PD?t|`!9)KQ% z@}MQqGN{0xpw>d`p$*U`e*!gl47GO*wRVhth5s8l7x`nT1!J(Rjlr@u#vBD5104so zhT8ModhT3Op9?L8@}ZS}uFJdzca^`yUCkW5HGIWH@oyjhDsfe7DOO4?1u^9F{ww`2 ztM8aYnDyN82_G6>$sMb}7zM<&2HUIk*@@3?!bI^Y6`u+TL(KT>v(KSb#X3qGKFoiI zxkL>~-+s~;txjK*SkB^Uo4M~&Vw%W(=dcQ*7rld_^qYpUhe(inOPx9Xa%TnelD;6u zx#;p-p3EE)Ym4PM%*?Sp1HularjPaCa27HHa5497^rs_*`K-L&LHoX#HLNMbeJ-_= zd3ns&NyT?LG43SBFfoRSF^m<G(vz@uu1`8)x7)crg#CoDn+Us!u$u_GiP^#_JQ;~} zt|bS%gDc`~+d0Tq%(mTtw0yuE-UiMt>;ilI+0H)X@Mrq$4py`T`t{AQl$_*maof>G zoWlPzpl+nBJNeVg|H{3TutP{qwsVZX&;i|%Gh3Zk$muz}>1WvU7IJl&zf^i(rHn6B z^5&iVH?SNGAf^Yg66F)y7OV#q^s4TrSCvn`^+VpD;hidZC#>2?$~TnIDn_eU6Lt+F zVu`lZq_#w<E&GWvN=?~MP1(tvYkA*Zq+uBSidBTdD$6|{W6X9A$tZMoJ<?=t{h#5p zi&(sBw7R?6Vzoy?x#aF{u!2Pe)_T8~dzRT&)n7`^M48uVunZ6O|HYG*IHRgQa~|^B zP}Y5%asG48c>hgu;R8mZA8{7=Bb+?{Nn*H>C%+D6xCPm{(^=_XO&PpP8HAjj^d)vN zy0pi?i*gu4%08kj9(JnyF_g#sl*hxQ^iiHXnbdBkT*gu^lPQ;ndH;_oo2lgJL*(eI z<mgCpw2U(PAKvH%@?|z<^&n*xB7Y`Yn+)&vA(Hbsx%@e~{5g{Ixx2!jOKwM{1{EMT ziqtIQiTmh*%)y%bHGZ)YE#@7<yhADPu#eJhK>Bx*<_)A}1L;^xItocg9_a|XeW)Y- zM5h$Wv+GLtPREt}wB?gqT|TAAQzdPowbgYchI5d#KG=HuA-h9()1k=L$>jYg^8OiT z)Gzbdum53ZY}H)yo|)i$nRAYREqNbu7F3m!_br{pRi)(p1<vxSz0QiNU!0Xyo5=ft z<b8m&e?{J3?ChzkBJUgW<eSL*RPw$dd7nt$r;_*Sq_Qh{|2}!2LEd*I?^8)3yM6l? z^Ulen@*KB&Rg`zmb$eAs$oo^s`@fL)N#woV7qkQKzaC4(F#l^(m`92};prQA;^#c! zBc8B^CoCmaTbefaN{D3zv8>?k<=h>i)XFKfvR~VVAo-txuFoK+O1P_(bd-==JIJl= zwl|GFNTR*4^8{1<RWetw7qUDU=^e`1&Ji4iq&~!KjIl`IIMOyAbUTN6ieGYl9<9`T z?*5t*UO)?xhXrY|{{?B^i4@pYa5GY{#J!tR|AMizxzy8K(z+DNhgMQES3?D~5A}G$ zR_7Bm<EPZfg~Yy*|E07mL!d9HsRdRGB-)h_PSVv4PNxrN_ZynzKjnYpGqUP0r2hUF zKju#V$)C?|8nGWOspD7rjFS5^{4f2taD!BwbS&Tv{O4;z{qdPv;*e(!;p_a!h5zsa zw;l11wkqx?&$RmntdDtOxv2j6%qyqle)FSdJC^u0s=37bmesib;M^eIzb3UvT<n*Q zE8V7qUwX`|hEwwYho4{OW6>eSzrGdjoyc?b&wiyM_Ct=Ve^oii`L92Je$`$--yh)L z;ivoS{0D!%a9D?b4`ohi9j3%W_}U#bHrX4in0sXN%<o(ijsH*od4G!kBJ>Qok%oU7 zt$mvRrvI70h}z@$kN6M4kGFUDS$>-D`5%k>U;Y}}Ty!xMCn-Mm1$({bN884a`Afh4 z{Pq4;n={q9lUj43x_oQ?I{p*Zi8ihClk_7?wD0yOceAsw&1qYP>9oAnKbx|eAGKnR zKi}U7Ek+K~X-66mzJb4qI=j6l6tT9WC2{-}{#4#GCWZFDeV(N_dGq&HOHS?0bzHRB zfA~W?|C?WpoE|O+<t+DNAOFqI`q$0*-vs!#e}5leZSeTgt@W*O`IBp0|Lxho?~m{B z=?mMdF&-aI+7aZGvb1f&p7?9xu3P6thT_85`ati>@;Ki*PV^l=pRZQ@{%4<em}mYz z;O~6woBaN5ei!UF9{$;WTfc|j32Kc*C32asNI8joFKV<u&VPY8Lw+(f`vH4n)ph(Y z0KGZ2?Mf`dD(WOS*8xS#4>^+hBT_9nZM|a}z<<}D=zm2!{1r8PC-o%ut3EUO?x1C; z8&#v^p7GV!t55$vhicov_`Cf3<NwulGYhi%7i+_6{*ekaG5fmM)rb!G*Up7V<4~ly z0ezz5SX*eEwyfr^2NpgXzn)konqZZ<m>z*$li1v`s}WnsYQ&?lrd@$u{Yv(MI9Apn zwq^z5$E;GE%hA@!<!I+D<~Ui_dbek-cOmN&H*s`iwf7d*joY<{r?d8O8#8uyaC8Q} zl`=DHH^-R{b2C`eb&#Vgs}O%;-v2L7m2);<qcBc)S%-L@tV29s)*<$A?Fz&T-41RC zr<bfi>@6!0FJT4ZXs3^Rk9)6ksjMy>EUOEL$m+t&Wp&{&Ru|skTq)}cA7fqN1lAtf z^@Fd<`oVW({opiNKR8|156+PFgEM9Q;4E1`_`a+koGt4IKall<AIkc{99cj3Pgy@W zPu364m-U0WvVQPuSwFZy)(<X}^@EFK{a~J~A6zW!2bakD!KJc(aG9(h%xC@JL1($F z8C+-A3_6=NYX%)wIO*FR);Q_W4l4lkJ<eXcX3*JZ*9<zIT{GzXXx9v~-tYxI+10XI zFiBPmCd+EU6j?2pDysz>$ZEkXSuNOv)q+dhX0lGOwX737LDmVjlXZgaWu0ILStodg ztP|`a>jbZpb%NK+I>9?+o#1F$CwQl<6TC~-2|gg}1Rs=jf)B|$!G~p?;G?om@G)5@ z__(YS94G4ppOkfiPsuvL@v=_vZ}iR?bLMbGj$P#VIAq%H)2Ep$-5Qy0!x2EbPeAhR z-UW%s<jM5q?fwz<7~SfCE#?%YG7*{VM95P)?7G~}pu#R3L8Q^{q<j`fD$>{$jo*zU zjaqUxTCpcb1J>_e03x}Nqmk5^45>4XsWSsvO*n`nliG7BVeD$&EU7<Ds6SV-PU$L+ zCe);>*|*cK>9xCC=1}YY$)VUk;UiM@F^7`c)kJDnW2s#YrFJ!!+Lb7^D@5%o;$60I zw2(TMD0M7R>R5BBW6h<GwUj#6RO(nmsbj6EW4}19sApAJBWz7;B{i*;)HFp+%XBjN z{%96Gz$VOdYeKC%iI8pGwobO&jvClfYG6I7f%T*Ywq%FlTj>*yrXIRd4_&E;M(SZe z>R~|YVKVh_fTP&IVW4B!!(p(Kzzz<>oJ4kSxW);vbHfczkbN6&WWK;~HInt6qp)c< zl2ySO)ZTko?Rl?y(8;6@k9C@`zr$aN?J@NjAs=V7R;ee{6S&7QYOB<f>Pg&Bsi%0> zc<i8!WG%5#Ph$^lBrA%IdKSBABUx8$)brR!8_DY80IkCdr0qp4r5WrQ@ps&lu$X4B zd&En)U&eBp!9Eg`ale8EHG>@`Ud8<n+LR31ly`WecNJ?-*<Ip2+;)9(qO>oG(!L~0 z`;sW_OHkUEdeXimN&Au{?MsrhFG;j7XgM`cv4WL7DdywORk^soR$t>@pcdj@q!y8T zc`A>bS*#Z0UZR%ZUaFSjUd9UNOlhIAq=m|o7Ai|xsAOrOlBI=8mKG`~EmTlisGzh^ zL203a(n1BLg-WG`VvdAjwlJl@>;c?S6?M`Tv*w&;vhq1y9Z&~w+x5@s>L4vzGg`EP zj$((5K~93*CBsQ%pNzpyfW0z?FstGUeFayC>0yp$*NiI(bCtfzNw>Ra5b_#*jZ=?3 zG_J#ay}q8iZqPR{Zg8W%5zF&%J)9Uu=n;&F-=z6c2K#H=jE`+M8%w*HDeYzxX*ca! z>-&lS0b0*&y8{Q|AJLCELAwtJPZ_JnIxX0Z1L<N%j>kyP<N9$zK0!O1Ks);s;m6b3 z254=cCJoQ%XW0DjS&faIy*i#F4bSW6S$#Z#wm5^f_ys3Zzo=hy8tT7ePjAFp?nzD) z{gQskX{ukwx}KpY>&Z?_+UwWxe}fgwskYUIv&I|#u6~zyc~8H`)%W%LJbkvF&3k>o z%mSr9)F1M!9GyejSOHFKpXyH;jhVwZjBVNHlD4m~+p`Lqb<k;gzMhYNuFfT%ubGb! z(hKwgQnFAl#Agw+6O_)=dBnMxSqe%o(MxdW>wMy0j_p4K4e<?p74sKDdbM87y&Lof za$}?3$eS|zAO4;Gj`!Wl{Du~~SQqoeZOn6Mp|>;A(?suJzC#OL!i>-+=#`zsvrF$H zo_)-BP&%R`Jkev`gVIqQ#a+St2c`Gx{kRV>4?^imU5Wc3^C6Tzqz~c#o_P^U|Db=s z{Uh@ul>SNog!^aaNhtk`{sngx^Cgt_weK{LtsD6Gph2$~#rz4y{*4+pKimNmz@1<~ zQzns7jSO~Q4C1cG=thP~GK>`PZSwlKlT9-26h=ETOsYx69b(iY!=#xs-06&dWS9n~ z0q%y3f@HAEc_Z8zjD}>G#-_28XtgQ4scGs2Of%EW$u!v}8+UWl9Cr)T0(VQkCYH(f zJ6hpB${dCJXmd2~W7y9#(;RD##eJMP4)^iqc-*Z`YuxQkdpK+OouJjt@b0EN<5TA{ zzSYE>$9niQbG|trcMsOZr<tD2p>1L{w^Pq*Zc@bxe@1Eg8s^BDex{$(6#advlg(a} zmpLujg=R4RL(CBTS^3Y(`YX+qPIGpqxr#8X|0f>S{}a!R=0-T{|9J}Q|Iv4f@za`} zGitDEW3+8Ln$jXxR^*GOw>mz^u0$untzK^`T0F>}M5p0%21hf|<@H3DCy6evFS<Ng zba|%e@)XhKS)$7|I{adALvIcv`a2-{+kOZ7Qc`vqhvCb{L(sC9bEJwc4~Z_%7F`|^ zU7qGV#u0R0;0Q9J_ab+_%n@W{Z!+#zIa1?ve6U)_+ub{iX!?+7`T!$<OYzC)NR{0? z>al~;8sb^Yk<P9G>%lP=S!bg8i}10!Kf@{JXds$CAeug#FGqT$Kg!Y2sc;V9w)onx z*T*5;-*Yr_eqh&+fZ%`t`+oS?ITfRf1~kA|lc^5u7{xy2>_b(J2^zbNaa&}NAjqJ; zAcK(G)NP7?wwn!a?lvce7H$jNt=v{{yK9K4MhU0!CE)=3J9Wmti`xbNGu<;8YwF?l zz~Am85^#Gnl4;xl%+X4BFLN&=<Y2}%jeE0u3n;|yGU5u(Xe@h;#Lx!&A%OZDgEme8 zH=Lx}!h0$tI1Xn71zQ9KTO<j#ND*wI!4`Lb3@oY$2&za>52;64t!}YJC=OfbIBcQg zu!R<E5fp4;1X~0JTNuF>LBSSAutiX?g;5h3eKmqA_%uCu!U&Quf+38c2gA-(ukjXB z)D*71u3pFehI#|{R5ca%o9a#6Z>hI%zpdWJZTC27D)=BE$RHq?ARw3^D3~BYFhNi- zL4sg{pkRUo_Ox1!hAvPAAc-|<4eqsSE$(${9q#pNJ?=tPh<k(DfP16bh<lUTgxl_q zQcuuBJwXrk1U)3FZE72NXm?3TQajWR+$E|6cd07HU8c%#hgBH2-8Usk?NrQm6Ks*B zcB|dE?H(%0f-q79VT1%>qzJ;u5`>W^2qQ}nMw%duEI}A)>Id}$T0Dj`EVc*=wn(YQ z78Xxr33>=>ix^V0MGTpO6;kvqjCsrMENHS@^{wb#+uusiw!an9ck8?HvAwPYeXqV3 zw?zz11uJA!V+D%|f`SHuf(Ggd8psqhpal&WJyB02ev1hb1QP@V6Bxk+A;ARMf(eXZ zf`EQSzk*htqNi||#Rnn52g!mDq*n*#u=pTF@IgpV)6>}rY!>q|TtNweIFz6T9~k|y z{+QS-N~kX=A*4UkpYiUW>(5EQMGQef3`P(`iXeuNV1-P<3fXZeLC2v4E%?9)J}`n0 zG6f%G>veh^Pb}1haEld!f)x_j&ukO!&CDV&`dj@iZi^lg1UF;|ZU_l($PnBR65Nm> zxFMuVbtxLXOqYRd%5^z0TO^SwNFrM^7l}CcFpn}_?`38}!#HfA<FJK}!xlOYTj)4! zq2sWHj>8r@4qNCrY@y?@g^t4(Iu2WCK@~>ugb^fR1Vb1>4@Pi<5yW5wD;U8CLBR(J zf)9d%4-y0)1O*=?2tEi3K1dLJ5EOinAow6C_#i>>K~V5Pf@x#gfC)}uR)#SrniFxK z#Ow@X+8WwY(~emh#++>EOAC@nFda+>+^3jR@VBTU$#gQEm`Q4}MUpwqoQC@ha|XPN z=>k8?(4#ipOgH#B<{Y@iA1Q)ALV`b11b>7Cf20Wh2$_ow8o~57z2O#r)D!%XDflDX z^f&!MW&_Lsr;!<G2I3xM2I01dBp`?+QxHkExz1dN&kg1V_;9{!889Q5_nK~QVzx;` z!6GT<Hgg+@$0CxTWA{sB7)vDt)13Hy9WRo79q*BS9p6El@?&2|YyV3^pSHmIa4Ms8 zy+I9sVPDKUS$X!PGm$UZzw3M$7uv<<kim+f6TmI!VLKS?T*KF??{Xe-o&rC-=DdeR zpf+y1>uO_q>L)s<v!7)ju*kLS>3O&Fs52g%F~yk%u4v;VoO?yjR?em854^OM^GKh5 zm$Y)G_dR!TD`(xnetlZG&ZU<PY(>xArnVv0k`(a6QQ)YKV5T1IkU5k+PDio^b_^DY zzdNt9gX>4tZ)U(DS&T!r1zGiEX3FL47&gke*BR?P?Mz}L=NTZGSRMqhl{CRl*bek{ z0rOX`U{|qQu|odUdB%Cknd;1RKB;~_dr*Mgjs?M;2^PB$+%=5(;J2}d>toKdpr$vS zS?nPhOKTz+ry1z4Jvi<h=1vU+dktp?&<C8yo#((-Z#nO?6Iv{6kdny88q@)_*Bx9p z2!u9*UGg7vo^YP$D~WGAv)Pw27PcPw&>TF;R(GJnUZB0JWxvyhoN>+s(AqoB2X+U` z>pR|gy%{R}YT-8szvYPd^`mY#w_pFK_zfd(9%1ei{)q6$h5zk{_^r2%G81mF{3YS9 z34iNI`0&x!UT>!VIZl$VH6IE8V&tuNk21N!7Ykn@e9aN@+pZsJHjcFXJK-fnHrnhG z?g>9A{O2R#w-G3yga?JE3U72I{C0b9Q{k<IA1}P^k?=c5U4MI^qwvnc&lcX}i1?j+ z?WxzDmiHGvSooDk$U6qEBV@<GO~P*#e%BH5PJssq*(oqa_&DLu93ek7@B$%E4NMmP zy6|_7ke?QqNl3o0DEw35bB~ap9#}xg(*sL|e<OU|5%Mzvn+bVFpjddB@I6Pu@3OK{ zA^dycRhB21BjM<aKia3)?krqSuG{fjJ8ok+V{`Bn;pYqQDZGd9^Wd7+u{*klk2}y} zT8(6_<d*Z13;5Z>y9qx_c#?2N$hcZx_=UnR7JiZN3xszN-ck4|!rKeCW92SwxaD1h zpCLRTJW+UpaI4K+nV;aI%d9&?cthb?!kY?jB0N)gw(u6hnM=Z5&4jlSezfqTgxisH z7mZ^1@xqT2evI%o!cP=_g7DVD(T9XTS$I3)Cka1Q`02t=6W$4(ZhP_^7B$%;u~A}f zYJZO5sZUiO^HNJf4XTghL$Tw`Q0(X%iXGR4V#foa*fBR0J2r=6$M+#Q(oU>Cu1t#^ z&!xSUwmEG@^|2W@N4ni@)V>3|QM-$rt!|i|H@|e}vh(IVcfOnJe(f%B7up>--No(_ z_TXG*ci?naumk5e?kab+Ti~v7*Sh8IPIbOI%iZPfcK5h@-F<Gv_1vgi;qG@2xRvff z_mKO&`-A(V`;+^#`-@wJiOe-cN-2%GET9tjxNT6?Q%S16YOg{nO{J?wDnm6^nJP;) zQO#7gYN48|pVZIl7geQv?O<Y1T4QDl=medpgSwth()D$+PSL44q|<b|ZlD|LMmj?` z)|om>H_=UXGo7uQ>lV7DZl#aXN9$wsvHCcDyl$=A=o9pb`Xt>}x6>!<_PT>UMR(+D z2B+%N^y&Hx-C1|hXX>+bSKUpYt<TZj^||^yeZKCgd*}=Fh590WvF@dN>q~SW-B<V1 z{q+Dd)66pOo7v_A^P$Nx|1=+&kIg6MU*=OY$9!f!H(!`9&0O=9nP=vkT=TVAU>2H1 zCeQWFVzb07HOoxCS#DOCmF63>%B(g8W{p{E)|vHYgV|^{tET2#m1+uALzQASsbtlF za@<Nu{@ES4p8z}l|2??bPw@ZY9^AFH@h)f1pQ(%LXWgEf_@kAcn%d_280D-Ktww$h zTkGO$X`LFFN$vZyHLmY}Rp<UMH7-`)mP&0|W$Ov8%eweFB{fRwjmoO7IX}hKoyOI* zXAV7-3+PW=1orPmi+u^brM~o8`io_E5E%b5`dUNi?OaapWEee(t3drv(m#38+3D=U ze!2(i={~WYMzNZ*i<DD|)$|b7Qfn*y$@v*;X_e!nyj^UijGDRuH-XX6Q`}D2GtY9n zx!v6hRWIy{Bh*dmW_64DA2kyD;;rg7b-TJljaGN6yVTv-8t+y2sr%If>OpLc535Ji zqt@EU2<8)vR*uJd_$-#fiC73HVHtb{i{KQje{W*xdsj_UGt?|KTYaQHQG7R3eWB)J z^~=TDmxpC<8RL5^8P_Yog0~(E-M4Cs+KMf12X?nGHn!brFSa!Hvrq@IMoqv9#je6w zo+e>&dKpX8EBaOa5B(Z;rq}hC*nZ|?!&!%2rr2CSZ@f1>?;+-LEc{oSTd>*N9j_bE zGd+*|98KR*i#D<?*#yx{z2GjTQ0sqRoPXaq|7&Xf)$BO`i)#J#t8xAv;{0EW^UtdF zH%-7oF8$+Kq$-9$f_$c`1^wvJ)&0AC=Vvz+TXrw^2KNzn0yTDzdk~$~QT3pVp2EJm zLVbreYKo>gUEhQS@FDi(pUN)$EA&BZCLI|Axz&t8H!L#W1%iR5fnx(F2RaAN3yciB z6vz$iN??SC9&{u6yRASbZB=j5G)-LspRW4CXJ|XWeWrN;KFf}I(Vyj84d%%j7o*mM zh1kQ!jJLk#Y1HpqzlnDcSEebu7x{EXq==U>DjV-Z@L7yq*?41d+{1Y~c4HfdebTdX zt!^rZ;5SVTm5}ejXD~WtV|xTX%VfddC(ncS&CK)sn{FmrKlazQu~uJE|B@>&%9S~C zMN+`HrM+X4^=JGc841e5c5<w_51(m_a@+I`gU>K8+c1oE|Necil(1Jx*uO~FZ1_ww z20qI)g~#&o6<pIP{UnfdV<%hX+y92~TtfW={=QmKC(Wzn`V_fRSes_^hWKngOiHfh z$~1MIy-yXxXJ7%dDR~?|3(J^INi65z<UGT?Ek4zG#0W2UGs0_A^{!lr%Mq-(Htrkc zY7h7f#_4R_-Qm@-GTLtMohCkYOK~`U)6@uiUD@wL%wPo7-u)na79*=Qd1NI_a*MeU zgoUiEG2aGRd*(22d@EO`v9`=Uw?2FZBcV3lhvBmrA+3q`UR>Cqk+J7~^|N)dR(2-X z5atEzr#`7u4xh@Ezsr@+YRiGqZhOZ|*1wMI+>g&RHP2pU9LJ_<vJInh50ieIu4&3j z+jM2?-3&%oZTiQ;XEEw(<F=`O6<56MEVuv7V-o5$8%nLLljZ`s{<>V*P@85mReZiZ zOiFC+oThBPO=q;krsOpEO!EYM7WPz|l2~a_U%C2@_|(Xbjdz;1SEd_VOY7taa|CSM zW8`X2_zXsOZQSR=Yh;J9bndk!9xMMt_P>31Mo(&7-~a0RQCxBIsYc^7P2Fkzm6gC5 zCKEo>JPMyxr+iMtXPRjPpN<vThHML;i52-b>Bj18L!JPi&X~0g*$zGvOY?6-cE)F# zIUPRTbcN3_XToQiv*C5}0t>Vac?Nts7HAvtEci_9(A95l#@TC7I{4f65l_O78Nlku zNICk#&Iap7ADaE(!4{3d7JcZ8_5)GaIg-QZd0HfKB399{SW4|!a69aX<LFzC=V%YY zcm}KF%h(l9aaM7hMjprdZ7y}qYAMB7o87Ohx;Mx3jM-woGh0oul*c%5!DMC_{i?^% zCVcG$d#A{UYg?6Gu6=`{HoQBd+J!HOr}i$}idb8<4P&LLkGQO?^oa}AA}*9|gZfJ- zTf)|5pY%58U*Eu;#6Oo@iT7(QeqYq_vr^`gpEco>O~1RtEs66%d%2}<89s`f>lb&W z1*3s&m`iqo9pP0iRV#Ir`++(}9jlHbR5I4wHk4Z@ayNzodt(8%n6LI}$&TimY^{|| zo2DdtyC1||9nM&4H`Pv^tU9PuR2Oxo>Kb>Iv2V&egVN7LUp2vcY;!T_&Q?d8+sz$j zw7JvVW$vzfhq=4<syo}<W$)m=+E|(qPi^|_GwNQGXVguT>h|j$NRN9n|M-Fdauh2M zzLSPVb+MG&{|@D^$kB&f)+)H`+%5RkJkNF7xVgXnQ(%-N)e*}&U;I*?)T!z;b-Fr3 z*;;08H!%xL>=|~}Wg4-qcMIJO?nZZ$yV?ELEpoT0?&@rHt~yVhW43WuTAg=oO8#XN O52#$t24}uzn*1+3HAyD` literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/ttf/Roboto-Medium.ttf b/js/assets/fonts/Roboto/ttf/Roboto-Medium.ttf new file mode 100755 index 0000000000000000000000000000000000000000..39c63d7461796094c0b8889ee8fe2706d344a99a GIT binary patch literal 162588 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 cASb?` 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≀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%0AHUW;|^l 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 XDz@2YO+x)8BOh4hv<Y_RT2A~YSkX%~ literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/ttf/Roboto-MediumItalic.ttf b/js/assets/fonts/Roboto/ttf/Roboto-MediumItalic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..dc743f0a66cf3741e90f712aba22a91197b7e59c GIT binary patch literal 165636 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 NB=zG+r1ji${|`g+Rr~+| literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/ttf/Roboto-Regular.ttf b/js/assets/fonts/Roboto/ttf/Roboto-Regular.ttf new file mode 100755 index 0000000000000000000000000000000000000000..8c082c8de090865264d37594e396c4d6c0099fe4 GIT binary patch literal 162876 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/ttf/Roboto-Thin.ttf b/js/assets/fonts/Roboto/ttf/Roboto-Thin.ttf new file mode 100755 index 0000000000000000000000000000000000000000..d69555029c3e184189c6cf9961c9cb21205bda96 GIT binary patch literal 163132 zcmcG%2V4|K8$Uj?yLU%ZkB*{vfPlt=3LN$pdy6d*J1X{uy+@4=iCtsw8Z~0{TonNk z5EZP54ZDaDQPb3@iOMa%@66sEkT-eX-{)V>eDB$v+ns&pnP;BonP+ARp@a};d`U## zrpp)I|2S-zMg-?OgmnGbru&yII<BjFj|hWr5>kHn7u|#F?r=WxH6e5Z?ur~dW?*!) zz_t?zsW6%lm-B<COfm%Zpce=U?u*}B4vii*rsu1OI6`WM;-2JT11ClkJK~D^FXMNo zVWX!HJ^$v#TSDp&C-l~g;Zb9z71=AV32~nbhJG17WMI@^{&9NTTM^eAhoit@y~CF{ z?}76w!^cdT)+*vrOPv2jh-=K~af1iG8#wbRp1*?-`;0LIr$y^rgb(<A8m>2t9XMu4 z!>3~fB9z57!ujZN6DJjoAyMGxAp1Rf!jR~`T|%P?sr3ryqX?6YK*)kTAHM<R8oeXl zb|@g^>?`M5jAq~OyyasR^DTSHZX!<Y*|q$G`*fofClm#KtfDltmv~K<9~qIJuo8T) zARgo^qOts5mOV~zAzGY^Qa|z$zYxtPO$b_0S*7ANGL${W`Y1vk6NjQM#CHw~eOcXY zzWAaIX+}tqSxXc`hUzv6#6akF_M6l|W5S7n2;x$-+w!3=Q9r{nvPQ5c>!g7s1emV* zlT46u$wWvyMi@ZW3gbvcF@pF=b4WWnhxA2RV|s$D5zCU#aQ$rHBrq8m26O}Bfw@2@ zAPN{pN0VtlSE&+ypF-AvP7r64e!8(_nv_X=r5ohDCYY?$G$QAv<-l5;e@*slwvqFK z2YDq8A-y$jDEB4jwGZ&y4?qvHP|8v%?mHu$B$3j260Z4@B%)4#T~pE+)X3{UPx^!B z<D!<-rzeX361$Q<VyB`ap*;Ccs!#fY#{*J1G7xlzWJh`m3rP!UFqw|?gLE(1N>3Gy z7ccPRL|qNCla))uNN;{0?h$?@2gOfhv=BoAQMO;aPO59mlJ214>=@`NtcCp6k>j95 zvw-Zt@p9=avPk-x4A4A+%ukR8bUEtHBooD0lA!&D%oM*N`@|(=mDGvM(8i*?I_WEx zBU_{}(pI=bz5=??BJwq!87InQFug;LqEEY`e7?AvtQF^xxtfz?mF6k#uS;f$E6He` z7pW^%B!js8&OoNy$sTPc=?D6ww3xI*T|I#VnlZ$U@hdeVaZ&)WqaTQ~<^Zn8Z@R7| zTDO4og=`LK4w5axf}*{eII>3?M0#@hk0JZ%-lD-wmSRP+K`10KocCU24er?@v?mkj zZPG@pLwch<tA%gKDMHL%Ksq6X7eQx&hJ(fk0=XmZAnB}asQ<KPK54*s*Z6WiqnVC? zr}~<B5~W#7wrHxM4`&0X$Y~~f-kw2Zl9<H%=Ag8dY!<@M-vdb#@i($WIzyV^_@LAr z_w+-ZB4khpy7whns`-kn)ovmiq-A8a)U7B}+mQrmUXT`=nq;M2S7Nl=NzQ2dky?1} z84TLfnpLE)_8M`O&Vd)EqiczuMkK!At+i$~Nx*$)bnQv9?n{!a?OJqS8%<85zfYrl zv2Hl|MKX~AXd~0Z<KkfO6hRtl1BtifNX9T8#lO%OgGdd{S@a9znU$rJs+!B-Jrd{D z$z*K<a!^~39Mn`oc^0m#2cT`*nV_A>x6;6(pKu<neM<ZQ)PZx<1HDev2^c%|ieBh^ z$*-E<An)_U4|P`2QBtI(Bu87H?1NtHvui_s(MhPUJlQBdCDB}$=0SGXh`*Ris`GQ` zk<LI8wY$j{Tiw5rm68{DJx8{ne;)zM(8u2Z2MGCCg@HX^Lm`(r=p*#EI37Gkg1!dL zBxj`{5~qzM{WXrHs$CbzJ&zo;t4xk+F$Oj7VG|CKIobr`qA5=*FnObngN$nOiGy^M zl;w4JkT}+7tldn1VRL413@TbJb|{L)_-d+oNt$Z!L2eyM9q3vOsVQuhnGDyRAkDO+ zNRVzbxvpJLwo1Q{O_D2Fq}fd>YdlDEJS$e{M7l_BgxFPs^|eqT5%${w_7+|eZ6iW$ z9PffLzNQ*vp$loups7K&Xv>o^;%3r`HX}oTPP7II292U`NhE!b^E?tP4JFN`$)uYw zlWc}9O_T~qBFQ1GbZ^K+p)YJvUosN5qd9CrbFm+p1v@iX^MO>=E+UuEe`j<nacs}W zL0h!1s(6Srf-cq9G=NQh58Zi)_U<8_?L0{u{J}U)8L~#}NhWIZz+WO+rX2~}zm|-| zwZ|a4`qB!r8~WMY?l4&@2t@;>Z^#gft?vkXKT>icE$JDu3BG1Fy+qbat6^iStAIRP zFrbbW7*B{Rxa_{N3xjQbO};@NMlpMW2qa$I1e@3o{$~jMRuSx`L?#G-7M&5UkPi55 z4P8lANPeWER26NTjDDR<4u~&-UvZuQo0~%p(97hKm`OTFeNny=w(dE8djxDieF2<~ zmu8Z^k~92OMN&&zgMK!UO3?pMsWQ$h!XH*5T_D^3z<hw)Vo)aU*}y2E1;DQ94BIyv zc0XMTh0j<+W@zBAm_K7ah10FjZ9Gf7NBpG<#78^|9`HQQ52&~e`g9V!UW0$@2_7#1 z4@rzB6nvnK7+?OnMrcP<@P_N8&wyWGJF3F|RVQCbPjMcK@wyH5+vA=$IIl(8p^pz} z-EjN|d{QmY^1xX1u{Y?KcxF}NrX7YlzQDcR$Z^;*f>>gL)Dm?JB(=19P}Bp&X$BHE zX$kBXdmiM-+JgS5s#}M;VxV8Q;EM;~I1n+x01_pB3tPl|C@aG`^A*hJYU+`1G_k;1 z3+)d%-6A`<OuixWr6^JkGG%iAM_EHQO{7s|h&Bm))*|iE{{!H^2Xp;_Kcnl43b|i{ zez5q5#WR}Tq!9zgWn~saa6iuCl79h<Rd}4jVigMzr!)Yb0<M5)jZwI-V*bhs#3%4A zHt=V#806o;;u0pC5<nY@(1ssC?*PpIsqqMtXGtIy!EZKLVv*{$XR`LO=UOOl7oPX8 zl*MO%a$9+x^TXQC`1%*hVmRKX|3+2ceNgZy%0W9egI)$*1^Ny&334=|-^`#7;J;qM zCvIi2AnQx(_(4pV#^Mkb8-h+_RA>Zy$mlnaGyE{O^M9l8d->c?L0<nsF+N#L$Hpn> z2n*fCVoVn2{ZDGup_0@@0$IPa{`kM8I>fLnj%5AAV;R;@h-Fzk`FG0VIu^(Awy+p( zZqZ8)X1|y{{5QaUaQnz?qy?~#Za@mXT=XmO&}JK%eJlxP7fXWK#gflq_O~Rgwz$Nz z*fY6ZX13W1ZljA#c=lf4DtOTY@g;2bPG+~Q;QTTBZMET69+?fdg4yztU~;jdWE)Bx zb9>L)WU=?m=5w%qcvF<16^hOZGm0K*hLeh#>P6i&jY(}GtSF9;C(LR1xIlkd=P^uY z|2}_V_J&`NxeBuz{FueBh*_E5B39kT;!z%lv$4%$eRWO|j%S_Zzp-*$!(&x877;fw z9YuYwc%7E{6MH_3M{WGE>u^0ABb+acM{cLsxXi*avvVqcMs6qAShw05%bdx|3$p_( zW@Y08<8UjpOMKphn3Y{))#bla#tZwM&o?m-6)Uhg0_-*79>x=&Z!vi@J7wXO+Z-0V zv3MUbx+U%`Z&#o6whu%Mi1?eu%vL*QeFl>Ui_ck1&5pSoO4vW^7_!<k9vfQhuJt}! z-G8$urECadVSdgiVtWbkH<LSS=YLQZqq4Xia{(T&Ll1CWIOIHo%^%R0HU7@$|L5mS zXa0*FhdkE(x8EVlbMQy8pxNmAb){tSPxh6~-T$fFI*0sU^q=e~=A7KF{ugT1ga4p& zFx~*}Q=qSwIpsm7`y%F7xSsb3`jYpRm9lZhbl$2PwmAkHBbk_QG7Lf<U@(z1Rf~QX zAEN)QdSmf@eB5C^SF*2}o>-rW`zImJ_GNPd=tSu}%VgwSkRP!5Sxeox*E(L(S--)b z4#s$_YU`Iq$V2>C^w#2sHcRnE0?Wam{sZuJjItP2r4~M|{?<w@{&tgfj9S~p?1rTt z<~zT&`AVxVL~h2?K2ELn!0OL5o0MDJhXfWK)wmR;3U);|rClUIiYV%bInE&d8)7%^ zH<&%P#Pckc*RVLA*?tzotG3;T#p~RM!G?4H#$s#u0r-<ktla8TcwB6mH?UZf*N?cF z*NJEFdRc7E>SjKT)z9VvEZ$|mt7Ses4rcK-;%pwP7xx7pV;CpvFukFe1wOTRkPv|4 zqtWOzf+$M(5=4#d!+y|6b{dUV%OGg98ao{FGYyK_<&wlM(r9p-AV>l$)rgX)k#v$I zp*GybD(B}K9exl+oCty_Nm`u_m7{8Y6T48r1MCE?h-a`{a1DEch_Ii1P(7Z_eq-Mn ziT{Vo*drN#Iy_0IwRh0rXVl9-c6K_Q250PA{4TM_N$Q2{8|8NR5wOECuGQMxX(V<H zIMLbJ;YfWpzmGi%SLp0<F&6~8pYg+Mx6^4g5`F~1qeYFq#$JR31p#?gQLB?EK3vwK zq^0(dHsr0-+1rCZ$O0GGYqWSIPEnnMDph_xuF~j;y**?CadQ!>LYKggAo2Eq1@>VK ziM9_e1uK#kmoV1ZH|l0GW`sWoXJ|A|aVP$>9N}CefgklIoT$=d&$Cp{JB_Ih8Yr^6 ztZKt<1)qYT%Ab9+65EI0Vmo6svJdZ6_Fdv)TN$s8-6!avp=b@BiRW=G!S$BwM5qna z&h`%%ST9kpfMoGBegPMN`egPEp+Y0Mwig$wN9-q+M|J@dw)On)S8~~-P^*JHm@?x~ z&@wf_hoAB<b-b{C!t*S`VOKF8Egw9P^CL-6LHy&xMW9Sk*+sZivUlKz7;idWEBg&U z;aaOWREoaGKc+xj^Q}+#AC$GUSo;6%$RcfMFrE&!c`Lv+Yaa?&v1&8;g*Fi}Uh&~i zK{w)Kc?i>0LG2yhnY=@p1aJ|PDSry2sn(CNkIT_1_%L(AsO4jor-0$h%m+h7e8cW> zicFX`hDchL>v>7$V)bJrjs#MMd`)(cgXBk&N;1e*@{IgW6k3it(*PPoYt!y@03AlZ zrgP{Dx|;5!Ci;pN3Eo1u&`U@bGKCAmL*WmRVwBj6<wSomR$MBs7I%s!F;ToAW{KCu z94SBwmRd<)NQ0zt(sXH&lqKDk@}zefs?lp)eW*`UpM^fJeg5$IP`Q)A(co-wH~1L* z3_*t4h7dyoLnA{=!z9BT!ydx{!$HFlLz3Z?ug2Ha*TdJ(H_*41Z+}0*PwQ9C&&98T zpO0U4zqWpnenSE-{wBOX^GQ;Qip)htXsOy(1KPS1Z9PQNNG8c91>_YeqI&8=18G%S zhxVY6bhxFhJLqAw^`qcrX=?`BdIxQVakI2_0ouA;TqEulkBCX)Me!QiN~A!kw$xhc zA`O<Jr5RF;bXB?|J(1p{6P<mCPZOWHK0AEg_`F41i9v60HFz2fh5)p+uA#oIt-B3- z4RL5|q9M6dTl-kr>Rh6&QD`egTPfOFh_<4~i{2MKrF)9f>4u`yaDCqbivZ+(>0E%V zElvTZ6}cB_izMYw<t0sGB2uE1&&luR+vXhedGk^8KJ#AlPV*M?64ZFH2rG`r8{6af zK%u$tBXY^euofNx_5wR__get#iiPb6$v>1oHotOy=ch;WJLdPz>yy`$kh~sw-SfKU zwfkvuUh|*E<kicwe~g}ad=I$wIP3A1$BQ0Me?0Z^=-f4r2R;tVUHvF7cTw)b+^=(I z=8ntlp4%w5{{367+Z}SXyM;J<m}@p;srZAM$WycnD}1zS2{27B@u4H>q!Op44(T9v ziYu7Bwy8hScpPJqPY49s0ujIy;0=bEw$$zXM8G=fe}07LxC8iq@)0@+9feLpXW<KE ztmg@Bgg!!Fp`XxS7$8Iv<miNf!XRO=5G4#D3&=uYs4z?zE{qUH3Zuv(vRIfROckaH z(}fwrOcFzu2(yIQ!q>taVJ>D6t)<rFTeNDaa9A)2M+8|oDjXxrgyTZIa6(8B5``q; zq>xOOlNG`#Aw@_P(uC7Ox^RZ9B&&q8!Z{%WR^YsFfviS;_>OQ_cmRv=NXQl13GIch z!f4@7;V<EX@KMMSZVUH>`)u@y-N<3FyVyhgl9<R5v9H)q>`!EIfEY=RiUY+#<QO9O z<6;yt5JSYF<b*hkB#=aLxHv)_DUK3Hi(|yG;y7|f94}5FXT@l84z??koF^B^MP!;M zlFQ@@EYNgvO`Jili!;Sp;%xD2a)aC?x5T*^t@B8Z_zk%&&KDP8wQC`{OYV{T;v#Vl zc_1zpW5gw}W8Y$QFC!1hBaHDC<OQte&*T?mKz=2^k>ABtupF<+8}bL%{ocX`tR?Tn z@5p;`ohXazDHS(RLEI>A5;u!ms7NKM5x0s*#cfneb<|GkD;^V%QxED%y=ZwcUOWM7 znE-oRRT>B@*@sr6pV8{H2CXUells$IG+6pd>IoZjQfe!;gH^604Ui&fT^b^_mpaf; z8b*yYoYtfD#boi6)KTgrriiK12x+9$S^9!DpbcS<y3$6pF>NCCrcG%xDMIQcrirJ; zblRM@kcLUa>F2a1Y*v)iP3kTUk%rP%;uY~SEcjJ18<y=lZB5%qJ)|$i0`WO*OWTPr z#Fx@2X*6vw{w$3Ve-VGBBj`w2__1`3)P^o3SeeK6gJ$d-;|GDa?ZbQ$^HWxo!7&5# zSq1?12|FbSY&D0_5_BhU5Eu;ns6uE3dI(4b#sO)-IaJ#LG{b^<pqao`ly?KoRw1+j zWh+5BDDMM$8@K~}1Kb53qI@9eBOn)806YfrQ9cy(nFWhL3xMBIJ_eNSX<%3kz!sAC zD2J^je*(-d!~h=vGs<Uy!me<{g2EcoawrGSRIfs44eG1{Bb87WAOP2_1`Sj}n0*gY z!R!;aeYJ7TUL4m^L6(Bn1;SB&7_^=WvJA97&<y3rL7M|Dz{_&b&jHwS0c*vyJ;3C; z60{@G73F6^Aye8N<&2*mzyOqA1dRkBKdc%MW>e`996taZ3Jk+B>ZQX0^tJF9bdCzL z7IcLQ@*OCv7hrQZx&zpW<Mp7d4JI6K1bwAKJOB#6#2|n_`bmW_8nh6Ad<FD_;02Ti zSl?FwyaD(Qfyo9Sn?ZZ2AX`9_Rfut*89*kk*$R3=1=$XYb_&oLvI7*WI}8N!XDTgH zeC-3p37^{i0BWy-fM=}8a}d-o`m12N4%<Xvo4CG<i*U>Ud5eox5XeA;K4JF)5zz-C z`k3P@Q1l-x6A^m?YXHa<wwAy~5pg}x7ucYJ$e@rTR*#5?{=-Tr2RRCg_KRq%h`z+C z7za59iZ*i$2Hl~8Kz~H^4@VT}ZWSaRbPw=7Fa%(70munZCKrZbz<vO-fvqR3FGa>L zbVNJ?B%(YC)QWL9KB<D70Yx8)&{J_dkfMT|1x>Xe8Z-^aKt1O`GcA}1dLBSu!fO!m zB9H}40<HnqQO?exD-6tjNFWT1KM8%y0AE8SK?Sob*ww%R|3k21%0W<<qyg-3{Y+5k z0J5e8eu-eUmP4Ei3R}p)+AWn;0gpu_=m`U}S(07_ycj`tg@f5J$pvu5z4JlcR4}_H zxvOCMBzXW{sOK(dc@<2zuoB7vFGwVB732YEMZgbrE(Y}ns^DJeIx;gHOxL79AQ<Jj zptV)NYZ7G1i4=<R7ocG(;6sUI1nQyuSJ3(@;8U@83TTY-SD;N)Fg?a@01omNv>DJG z{Hy_Op@O^v{agjpajckfF#9XDQX#GbZ4G>Z`u_y&qC%8GyQ*MgL+Yl2vcB!Ef{hia zhYHI2`AZ-IJZuE*1@wV^VSV0L1sgL`KNZMs5vjilHio1Dz(8ED1s!AoyKgWs4&_WQ zqJi<K{}|{5U^2>CzfA$AqC6gSnhG{Hr0FWe1W=}Pi*P;b&lq3{j)Op9C!}uyJX?aT z-~iv)Z9^o;o>l{8vSxB+ysrfyOIiz*$&Sh9D}c!Y?Pg<9+5~I{+5%euw42rjW$oM! zu(s|1cA~s4=q_M4&>q+W{DAUMP>gqp*}r7agTRkKN8k`}809ITCg2D#0+0bF*UkWw z(Q(w%0F=q)1i<>1$pSpmMxZAx=ncxAaSG*3r&ztIKm?Emq~lqPo&nC{n&zPAfDB+5 zkO{zEFyDxkZz927@P4}ldKu^jTmiCxA;4AOHtJ;c-BCfAKHgO!vTN_D5ZV3rfm~eA z?tcvA;aN;)p8)SregpJ9@F&m%_zU=e@&eG0z$aYK`l1jpqx=P^0u%wGu$zFWVE$Y~ zRfs=>3V<H>b^vu&A&mib0bEhfFNFBuULV|pohz8f0+6405OglE5Xaj=cL1+({2S;S z;13*s5Be4WpHeeIDtA)B`rbeQM?AL=D4uV?vsrv#z%vbQI7VL^+*Po#VekaN2t`{A zxY^)`<B6aFKoE|nfYw$)r-Rl7Lcqg5(E30FTr&d{I>EsFjRCfTfzAS*q=L={ouh)q zD2ClCuv>!|ptlSxW-;sqpu2P~Xq*bE4JhQofH;^KptB5g5ojWigyY4a$pF*CCD>G| zQNiZwzGyoGT?*=<f-VC^TN&tb&_ERg_4(FP!Qv)g$kDeyu31TlANrJmt_9VqAmGEV zoC=Du?FV`Lp^xc0&<ZN(22jYDfo=q?u7Yj?g>Es>&7hGg=oZi@U<k^$5)yzh!9bx8 zzd>JqV?69YD2y?{z;<DMLir~N$B?5^q=G_@MTG$Lmd2S#jSeRJE)hp4UEV8!7A-U_ zsC2|$9MHd}iPkU}T8(IFqLDRCLJbrB%(tdVtYK(v5(8Ryi}3Gdh&9Bvi;6Y0HVhva zWs(9o#ScSbdj%Uzq<h2&eD{d(H8tzyZ95#&t5<`XCW%#pJ8*SuFH|tnQUNG03O3g? zX=-#Zn8d&?5nUrpb6a|wnziiZ?dxl3WlHN3VM=T1?c1wYO_SEfBY2%X!b{~=SHq<J ztft9Mt)Y8_shPKl^oosT^>vT%_chIpjrER23#{j9rOy*6`FlaLk_C`Js{}f?3#tO~ z_w{B4{=WXc;ILQAnkM@i9lA%f0*k(2(V>RP(5j}%v4+VP#Hq%SAR1$c?H-ZX4B^e- z1UnMbBO;L)#OKkyyiNXK))14Rhukb>td(VIn3}~T7)bAkBfg}icOsTtpSMK0Q*{%m zPGqVPs*@A+THL|`^@v^d6T;7F>qhY-an;nm4g6V|G$pcwu@XDd4DHc8xFU{-tSzHM z4XWT|lLMV7cX6PT<hkrC+JR1%%Xy$|oClpu$Y;bzYLm_+lFtF%lt|(xY$p1m`lO7q zp16p<#1T=28@!xeW5WI_FXFCEBYMpGTyzpQhy<U3wtpMQ8QPKF5XK_QR|Q#$d6=C) z7K^0vQe&y7^rQ4h6RO#-d86&6J*$1Io2YxHd!tkA>e%(OTW$Bwez*M#hkgzTj&_bc z9alO2<<!6_!s%P5ET?y6T9o;^%-yp7WfzrwTCP{Qm~t8AKIpsax9hJvmvIht{=#{x z^G@ef=Z7vsT`sv+a-Hk?(ygi68FvTw7Vb;kFS$SU=;iUf$Df`9JuiCMd(HB?TE2Yw zcICI1|G7eFg>e;36)t)^cz5-V^?qBiU&V|{#!9^_75UWgxm>wp<%r5NkxOlCm|;ls zb@yHBd%%zQ)$r@!x7zQle;NPs{vrOI{D=A9sM4}ZOn?;7GvG|%cR?;egM)IbwyJup zYF0I`YD22+toGMuUwxKeeQEWS8Z~RItEsIyzGiwY|5{yZrPTU8*dy2{xNC59upFFQ z+oyKV+G}ectbMljl{!+LusU7qjH`2^PHLSObt~6hSvM`jF{E+Gf)I0PMCh5Y7GbBt z{xFU+-VbjS9uxkqUX^-N>-|>0dHt>R%?<iC*xBHxhCLgeXjHAy&PJaaPiy?3Nt-6g zO=~ut*YtEV&t?;w<u&iod}Z_dEetKzx48DX+vhz#-}d>tmS45p(aND!Osl7@BU+zn z{cD>RZA@(|x9!vR`?f!~3vV~QU0l0+?T5AB*}kAdP>1my&UdWVabm}uPG5A2>m1ZM zrt_ySMt^a=i%XZOU2b%(*Y$L_X5H3zd)<9l_s2bY^tkZlmtX$$)$E?mJs048i#icg zBl3Io?QQ6Nzt6xvd3{6se$)4M-`D*D`Zes=wZBjQ#r=O9@cDp~171YBM~;q6ALu=B z(!leBDh?VsC}FVI;Hgm_QG23Z4{1DP`H+W0D-Yc~%yroKVdsWd8a{b=!H9Mvc8@qR zB5kD8$gv|oj2buU@#ware;iYB%;GV>jqNe^$T-coUgP4TD@S+u*MHrk`$P|kj*eaw zy(>B;`eF3@@xu7B<6DehF#h=j#|fSjf+jSX=r*y=#4ZzuPMk6E?4)*+%#)W--ZW+D zly_67P4l0&bh`cYLDO%}m@wn!%waRLX4Rh6epb}1uV-zT?JzrJ_Jr9nvy;E>^!2Ja zPIG$988c_moYXm&=X{u3VQ%2uHFJNTx8xhQZ@!z~dw%bQ_6x@?ytt_Sq8W?UEY>X^ zy7+iZ-I!%D50=zeGJDB)OCH5`i`^Uh`r9Vo&iwY#Qp3_FOUExgw)Fn8YRiT!JF%QD z@4fu^3ZE67RxDeQw$gLu;FTL!-dyFos@tl)tKC-jTb;hfe@*u_SJsBE?Y!3XUF3IH z*414%Yu)Mf+Vx%5-`db@L*j;?HhOKGv+>Br!cDa{jo<WSbEC~aY;o8Uz2(W)?puG@ z`g~i9ZR@vdwolnEZ!g@@YR9r2nLEqu?6~v0oxkt=w5!7|)9$LfzuBF+r{$i_d;a*o z&G&b|&)-{b@BF>D_IdAHweQ3JzWdMq(EW#;1EUY*#W}}Kjk|EL=E1Oou?OG%*#F0j zL#+<&JWLLcJbcaMYwBkD+H~v4XGfYG>2@UQ$h0G|M|K`LE>n51{OeKAqf3siI=b=b z&Z7s99y{iZfBwg|9``&x`}n!|koflTed8y_FO1(BZ;DTjKOdhP|N4a83B!r-6YWk! zo|twb_QcK;M^9Wl@!-VU1jmF*384uc6Z$7iPFS3<Ey0wKnQ$-RS;Ct{`$X@=x{2)) zBNN9b#w6}YloKx`-cNj!Bqez#)lF)d)F)|T(!!)INr#fslCCE`J^97SKa=f~y_4%E zw@Z#po|?QQd2{lQ$%)CAk{>4jeu|#*Iu(3sUrPOy4k`UoCZ&9vvNh#!N=C}Vlou(V zQe9H3q#9G(ruI%9o%(g^%GAxNds9!PUP!%_`b(OaRxZsut!7%&v<_)K(?+MwN{dNb zo3=MCA?<8hc3MH&htrzVo~NswZg{%W>B!R)PcJ;Z{`BtChfkkAef{*))9=&Er2D4_ zr#DP*liodjWctkX#p!F(x2MOYpGv=wen0)!^rAD)XZ+8EooRcf&zZ4j=A9`x+w<($ zvkT8|IV+#NcsB3sALks-`JStHuHCsl=f<2{aBlOt)8`7#y~(i8@Xn~4(K4e?#@LJ* z8H+NuW*pAQ$at9XHdB*XF*7u?b!NZJahZ!UH)NVJGc)gIzB+GrzQXzH=Np|ra6b9` zjq@+h7hWiH!RJEoh1M66FJxWFzwqb9vKK2{taI`6i(g(GeR1l=Wf%8cG+jJ>@yf*~ z7k|4%E;(KDxm5d7i%VZ#8g^;orG=NaTsnFw^-|8ICzsw{CYN0<SGjDw-0pJU%V#g& zzx?`&-IWSg>RkE!O6M!RuME91;mX%nVy~>ba^y<lmD5))T)B4T?v=bNFRr}4@*#_6 z*=IRtmCy3cs-M+0YjD=&ti@RyvgE9!tn{plS=Y1fWxcs-f7SbH&8tnX_Pjdc>Z7aA zt}5Bu?6TR0?7G<vvRh=g&+e8Tl|4FpQueIu1=&lp*Jf|Y-jjVW`&f2Hc2;)IwW`-@ zU#oZRi)#a~jkq@c+LCLluI;{d?AoPkPp-YauD$Ma-FUsz^{DHkuTQ!@_xkGVo30<c zo^t)-^_=U!-jHs1->7?|!HpI-df%9E<Leu-H`d+Qb>q;Dq#NlsF5b9)<Hb#K)9z-4 zn>B8>yxHgG;G3gv&c3<g=DwSUZ)V(lbo2eKvbO?mh2Ls-Yv8SEw^rWTckA%26SuD3 zdUi|6anA|Lsh86wXIRdhob@?}b24(C<S4ftZhPGJx&7H~<Lwr=JKv7HJ>hoj?OnH% zZePFs@{Vw)!kxNzI^7w5XXc&dcXr-6b|>@By*t0&C3n5=8t=Ba+xc$f-3fOW++BC~ z(A|u?kM6#|SN2}uy(ag*x;Osb(tF$PneHXuJAd!yy~p?7+?VcGydQeM<Nc`nv+l3G zfAId<`?>c&K5%|e^+D4IUp*M}V8MgU599|a4=z5)dGO@H+lShRl^%vZ?C@~V!|4xK zKHT>(<>AGLIS-#a{OytEk>{goj~YBW_2|~4yhp!2`jD&1b<VAnTP-&%w|Q=-++Mju za-*>twm5f9?)Kcc+@p^xJf8RXY@RM}RNjTWr+GzB9G`eT@qZHhq~Vh`Pu4zp_EU?W zw*R#6r=vfm{FL!i)=xP<J^Ja{Prp4SPhFl?d)n-2#M9`fF;90qO?aC9^m#tX_sXxG z-!?xoe{}w|`~~?d^S9*h&p(!*mVY__QU0s^!e@5R+@2Yp)p%C#S<7c#o(+07>Dk<8 zOP_6cw&$7YS@N^2XSvUQe)ea9SWvFOyCA3_q@Za*hk~93gA2wL%q&=3u%cjn!S;fE z1&0ex6r>hp7F;d3U65N)Q1JV6-E*JkVb9w<|KfSi=i{DFeZJ)Rrsun!A9yZ5PkMg& z`OW7Ko<Dv5%k#I-3tvbtoL($@@!(~Pm+fDE^>X;j=`ZKKT=sI~%kN(vd5M`6qB+b% z#Hxt%M4~13Sc51>#>-B6XJ?oCCMUg#WV3HA|F-AfWwMEhw2CkZ!QMv%k0!nN3Bd`` zHt8iJrH4CZ%#In+sl<+xBM$Vf?4*{I;lw29kCdfvYuEAhb@mmVDb~<MUo6e|idD^x zgtJEFHzkQWJrzVnp@P}0F@4;l(V1rpQ$INi)6D&a{xL#-B9JvjAF04w;6xfC5-!Vl z*D~J!fm26t>c}|NY8<LZ_}=k;+sj0=O*FW69an$n5HZwP*TYTg7x>U<Y;UOL>s!k} zS4ovW&huo420U$@G>C4-<WNH#iN8#o%CM)|;ZahsOr0clMuSbdY?GunIb@?&(cdL3 z#8dQl4GX#MP*)Rv!J)3!s2Q)krcSF@@Nd+L8Mm|oZSW?Q$ribc!I#xjMsKQYX@e8k zcCt!aj}yK1g!cm)#QUKFeyPA(SIJ304YN#@g1uxyZ7r3uO_g|e;@dIX<QOd5760g{ zH<d-1-sF;PveTQ~__ZF{CZaca@e&_22c6^Z>Klgb1VD($5aRADB2X6nDN2QB%G&nz z+M`|N2PikGu|vI%bWF#39TnxTNLop`*P)*Bf{uz**3eDLP`W8pa5B;zN+g5P{5BM2 zS%MR$vt)WvZSjS64yi>J$yI`DqcsHl@>V*al@8YSm%&LH>xn;3{GBYq2*61I6Ncyz zfZJtfPD~DZ*{!(IqF(kcJ`2#B{Icb00S-+30eZQH?I*N6G%&DAU|?9NF+429-NVD( zKQz$aPwVdH;UW15?rvJ0yMGvd4{`GdscRIEw%VhlZfKWtFg)SB@$|l3XPU34E~_Jh zuO14&`P}$0W$R@c(PwJZxDiXEcAwLpJn4{^e&Fh%*g+He^=}tBrOWnn4#_9&^3EMO ze~jtcgrc7{3pMAk>gP?Wk#N$GERi*h8Z$OEdXsB5`>x2pKjYsGpf~k`O$}6miI9Y7 zl~Ev00-3^yOhHW!!LqZhl_-<Fiq8U>0-7oZn*#N6&En$9dO6f~1`Q82hSc?NhXnln z0>eCc^TWba;n4r`n<j{QPS`SO@}`ZGCT|U&8WlNZ>c9argj1U*P2RkD;v^Ie9yED! z)ZodAeN7>=rnF(+!5<g4opbQOV(svyvE$l~j*XpIcynG{TuhsJaR(M_M#X+RuHE<r zizhs)EKR5kvqmNs{URNN)bOSuM%Z_9jnFVAu^L?Y@ogPlT8Knzm5(b<T&)Aj6DOWb zhy1jzOoytg1SuYN=2YE}kuqvwIae(^b63w?%DA&LADf_LUw3XRw0gOYtq^L(Rf-AF zO{b$qsE^LmKZuJGn&w*97*4VM4q7I<d4?NRvC_Q}oqmX!y*_yhy+1L0Van%Q&;E4b z#rPHSxC<SXN}*FGUTwDS@T!>u$1f56Mj!lg*$-<b$84Ep&fk&q>(M)=vlrq9rA{|j z9S|Y-R~st#S#FZXZ9DSq^r?NPAZbQP407z}xrOtTsaA(paN~x3bvT6GN000LF$T_; zt!t0Bz25zSG#({umCuA$+MdLP=w&BYH_Kh7a_sU@7ng8PEq3R*yScb{>H-B}?Z`9Z zT?ZW+E=I{iTqmWD658LPyJ*KY)tf8XO7xk~3}u9J`t$1TumJx(tG%M~8NGtqol(2a zg>?lnl?{f?g#g`9agfo)B`j1Bg2FvqT<DcisgqoX%L9iViE<r(W~5-uQ~D@p+Es5& zThf)e7wLN1utoJY$}xo{{)mt8o!AVvw=4;goyzHX-OR&D=zEE4MRs`;3HCDCgW3ms z;gJF18W_F+PmQZi6ocpz<vSN_fvKmXk#5R{55aGq))YU?GA^XC%H$PcOO!Ldw1slg zfM>PCd%D5MxjPbHi|-()lDS!Xy{xsVg-PV5*4@|H-x-G1IYj78^OVZrN?n>2E~JDh z_Vmv%ic~fweTyjeS!^ddQeKwq>^b*#kPI9Uua`hXo<YX&@DO+HynwDyF{#KfeB8d( zNH$Wu(K$zO6^>)9z)wgTezzE0!eyYbU_fw%{BwjkMs^SPw`2sdBYv`I&rGH2XLXR5 zj*S(;=2~ml3AZ}bHL5qQV{xRY=d+^u!a44@E6CWQr`DqyENgH9*8OS7kcL8J!`a%J z@RPHPei5Hq>|krzp<*T61&eNShP`8bR?0PSv&Tj<O#Z*wIJ8eM`1=XY&U%-Sx-QN^ zrOw2sPqVH(&(FG=Z_GTAaPH#q_za<&a$iY>A_Y=A>PK5CCzX2=wWn2;+sYrxC*?0C z2YXS<pnWH?s=Y>Y3~^O6nd<Cpa?(If8mqM_j+`_sWMWZ-Xj20jd#zE30LkB36BZC6 ztT8J6=@m!K=&cP8;0Z|PAt85`R3Kl<_TCk3PjJB#T>j$;<!$wvglriLpX_-qdfDDq zE|(!LD3m?<Z!9juJ{gP6(Zb&uxuIuv%2y(V8|mvAQ<Huex_^LiblTMPJE?t?wxYo( zG+yzj-;N`LejGXZ{DiE;1HX<lvpsgh&~v|o*U!i}Sy#P=jn{JEwVah#Z=85D6{6+5 zam6fzQeLKV81ls|I_N0lo9g9i#f9$Gc%ipm_Af3p_*cV~=-?1*8;YBt)xm*thh=rx zu&hD;bmxq?8>jZ~xoM2fn0D&Xn%OIM{&sf3;|a!Jjvc*l`|1R2S2x9Mj!)Y%DPicX z_(}1BzVR!Q9!yA{x#LFS?wtoHG_)J~q&2kK0ruo8xh%IQrm}h%4^>0$(L{S|d%20> z?X|Z=j<R5D01LY*b5*jP;E0yUW%xy`LGJ$CFwhX{>#P&o7Zw`LO@tH8&3%QjJ?I&u zGLbIxku-&_;=x!pV&mZl*?X}*WQ=TA*?_uKUMP5>R$j{Dq%0dP5N!z+w4*$pwhNXu zcKoQUUUo0$(XM3tB)hn?Zj*hyneT()cV%&*MQfN#3kvaI!IA34bOkMi4D+alp>f^L zzPy=n@>#iXecBJl4qu8Jv84(2zr}}{6RI2ky8P>(Ij7>}yEo$R)oX+yMdm`2-a(Vx zi60pxd-zwuvrHa(D7D%uKBWGmRd5{C#<r{@ye+z5S<<m1*~9i5I!mr(JA<^{4TQJB z1q#C&5f~JvC$4^o_gJU{w-YF~RkD;rWg0w~pO!y7W%8msGXy%e&(aq@FOxQ3Jg>n_ zW}T8aY`XIC_P5XG&w94zC|y7gn$PT<J~vCDVsd&u`Uq=$7#}8Bi~9d=EqI5qKGKxx zBfQMZ<xMGK@GxKTck`TZVMgH=ahGQK#|fGlM%ec#=zs*Nc@lpTj5(fr?K(_u?s}7V zHv0~;NY5Q=;BJ*3S5~H<HQkwKnPsYp`9yKNEQ{VXnefWhWZlkOn6FK6s8bHIok5HU zkga2m#n9HUN3=%KENCuyd~f}<6$i}Mb3T2)V%nO5Qz<`}d3Nmh)7<2Q$JKJS?!0n& z&#tRdlNl$f1fHLpn3Iz@FEg;pi5bVP=M=`QOFzASQ_@Ls=<-wX-z`6K6gtDKPabc5 zAQ>W84ywxdt;`0Osxy3AXl*q&pRCoQ3mbPP<`6}G1Z!D(?oc9FcGSz2OSV_l6*Lt_ z)5X<YPc;7FAyr5KB05AWm^tvNgBTZ<yL4LG=&>2o@_wO8f^xdHP@PtxwUx-VPpe)# zGwRU5{(FU+6PL|<vUtVsG4MUV>{C`Kvn8WQ`!7DUvWb~GetmcP)JqevlX+UvNBoVB z>Lif3<P$^$E=4cJbd+~RjPNVUgHZCbm<}D&zhicx8{RTmFV)6*6PZ{%6mvj=b;5{t zt3h9OiNV8Wwwmk`(Fz7Sb;rEjeX~$lcv5U7Y*qF(q%-T%84cKYT|<wFx3C{a1V@l0 zk5Lex5R)$0BxZBz+T>=^>1D}w2CZSy4^!z|g(+eS2C;)t3E^?b1aKeExo>Xc9$h7s z;9e4W|1sO}-y1*~`!q}(Zgvn`7A6Z@Xs?FKqPoh$hO7nsiav_ITzd?pzl?qKtX5bY zZ;SSn@?n)RfGRWXsbC9(SbT@3W8WIP5&o=%%SFZog|ZtbXmAtBVjcaBMg#LvI<31c zD?z^%njdTHyJ_*t?**ffMH?jb{$@dEOP*q7^ospM$97t^_u%4P85#R09-T7mjIz@j zZwX|Y(ok#G%qL-_1(_u`_`D@!rh(p61+AzaYzk3BFRM%9;goIsm$MJytOv_Fd&Vyt z>-BB@Wb(*1h3Msq#Rb*%a+TsUw79A53~j_~FU%RRuW%#6E>BNU%S>sw3)br;L8o<* zU=1*3z!g;lR~MHmAqMQ`VXh<GH4v6pt9_}7+BGa{mgCsmn1wE0Z{j9)53S=kaL}Uf z9X*t_%Cg7G>g#2k_R}8EdYhVgHM`X3qq5<slhY%*@B@vZOFqqZ9M*02u8``jl+#uH z1jkK^GJnSCXCJP9qBUF8FrS#Ym<rG6X1eFG5?xrNjDJ);pw?%>d2}E3#s=j5`AV31 zz@&MbH`7nu&YLzsLww=&zlZhK!S8pM9UPsQj1ZSHH7`Avu%^zK6=%QjxhGQ>dx@oN zFdHZleajBKkc|VRS3;P1r(&i#d{;xkw}s%_uyDVyQ!&w_N+%@8y3iNcl_p|WH+Is1 zm$I<+mC4s~c{Q6<o{a(%zOAuxDerHKL%k?hQm<fnfEVp2uV7!n_&RpjE7eQrCzrEz zq-<Bti*XFks<#!g=%IMdTf0t(voD+4T5UhYDRcip0gUPce9zN4KfhiyBR1jnZDk<+ zKJmuoIHfi1mw8bcro?GXsqqUAdAVGgpLAQeY94lCSL{*IxN#>nvcFBX5*}?YMx_tw zEQ=+gno_wk>l{GVJ8@g!q?cWbnJtz5k$ptgZA?EUXr>Sp7U}}qEqVF}2KxIEXG~tX z21<L~mAB6}|Gt2J^LoouTGrj@`7-;a@@dlDrPqFTrzv@_w^HAvyd)a1<JIE}*OWBn zkDP<bpKG(Sm@Q$wa}2%Xh~8-}dwP{;BJ?cwME}?;OsY=BY(wH@Y-g&BB^OV3H$g&h z48giE4-*)4p04?Ux@-|PD!=`pY@_`)ep*hy{jgqR+M(ngJr%D!*h4ilJ|=%h9e1DH zO&!*=Z6}<+CY--f$Y-*Qg{r}&awJwGAv>x`0VEO!I5KTvU%~h~cGxl15!zBR_oy!w z+v-cC9+`eSBUDr&-Z2M?%?e}1DTQfx0phwj%BV3J&Dg}Fa@QH$*^@RhbznaEzl^Vc z98&OJrCb-Dj5#)Yw)ouaVH6h?nuM3aWpgNdCXb%?L(eWk&-_SV*@;J+>NEdE&$tpH zYyR(g=BKKnUvQ~_A>hAj9rJ?H#c<`9y}OhZLhQ#acd4_7(fgM(50p1^3cg$YF<AMW z{;{QF)HZ5}|9F&E-25o*P?C~SM4rbfZ`XX)nC=g^N-&4_@0b7Hzon+pR?|>y$hf&8 zZ00|UB}7W}E1#+|iDKM4he$cb!v031xXXxMtfeuTBZU2ohgbLt1P>yqV#_)(TWFp3 z^Cwv!%c~5bfktQn?(L08ZWoTq!J%sSI)&OBrJ{a5#b#U<4;tuLh_jlaR5P^U;%MWu zl*@OFCr<3RBx+2B4mUpCyCk2=NwDbIMLflcbd(+Vio!qWnH@a6oi%7Im4~;jGGLE0 zq$F#tW?aWb6An`jTVC+OXnZB~?QEVZoNO&9x6OCKMf}gg0Q1DchnBt)UxEt_i<>N& zxPSE~CB_=kE=;3CiiDpFABA(lscq7_@is-uv_zXqNv>2EScf_94{LgdpKt|X0;bqW z%^Ii@droTCu@^$nP&AQ!y9+&qUSAl^d#aoFp$|W9*9`pFMHBgPho;xZec(qO)p<Cw zhqQ$fqq<b4q?EL+%E6hj*?58HP-Gn^OmEopLnst6&sf+aJX}0z)b#jx5Ih{#bcHQm zh>?92BU=wY*;<xVKZ)qp&EmC7jc}VVFtkfd0$@&x;~prP8;fm-v+6rMT-<~7q}X{7 zXX)zVkGtP1*^58z+WjfUsJwler@Wp1c->R#AdEVtJlszE(`wg~X_f8UmHQ|0PA_e$ zoKb$ibx3))k~X3EE2TF7?m%2gCs}f1b8QxrJ6X6cmF>6A7-dJ1r$}I_OW0)iKbI1Y z#1-PQxNGj8F&*<&j5IU%&)1KX;dIrx`}fZ&<Ah=6jT%$l`HVY)G39{i9P?@ml@DB! zZkS!RmhGwpFrKi8<YnQh)RGnNNhps=Uuv}hsRTm_W*|u&-u?O?(%in5ItD3Edk^?G znO;^dw^u$v6MX)+WU<#$Is`prk<(CFqxxp7ta$v-D2}f}vGJf+qd0v@G0TpGWtC@P z{mP5EpW<8tcYI9d5(|;2JK{SvJK`(6QFKO{eV>YnE9k=dg$wAV{a5odm65_Y^D2$$ zN&0uW-sV+hh3_wKK5&-Vib&}4Fz9kMGFo={tU8{jTC7s0+%`86EAu5TECET`a#@GU zth<mUEmnrVtps^y%T?4{u=rDIT5nwytAZtr5^G|TCyV;fd3;5Th4WJFo+p(>ry{7+ z?WMUhjIUDDe$Ary#x9-pbosWzIYtzx{zd!sn>Tp)$fZ%+vEO9Y?pty5=I@x<b=Z$% zf9N|ReZkR;!>pxnV-iGwSi7D~Eg5fHB>f-e7|Sgs6dq}D4Nt8zO@~8WW&X`*{!QwQ zIA{^elTeZfIc`Di<wzsh@!$Llw}sY6Sq+2iSW<hP-H3q%!4JB57>r@g(iY{dg5ge$ zf6&!$VCMr16f+fn5+4;-z4*&7m&Dt6wm(|NW)XI*WhFA}rABnAXWJYdwWNRoJehOB zTtR44sS<tB(EPZC`EkSL5fK_c7+n*SUt^>OC=Ojnq-~|<KfG_Lr<5AK);S?Jz1F0m zOazu7!ooi%PMp-P6Tq0Ua1^9tY*G561&wG#ziQr+)@Z0qYpkpfsiUlItW0f0YxRC5 z4gIv~6}~@qky18o`qV;W`h-o?6gyUlv=Tf!lHRs;6UK9?Xt|WCTYIIH?}93*?n))t z^T3$4*Rm-O#-i$$!6w8vnC7%pka+!E@lf2F3yz9iOVL@_ZVoq>7fzW!7Ygt;8|Cx9 zot7RWC3>tBU!`Pe<;%i~`c&p7Lxh1;X<@!^G~aJ4^cKG=oNm4?RKq(&lwg@k8i}Xa zlMb?`gnukmu{8iGq3*JTKO&8hjiidkrkk?8hOOzTF#<MQg!#Jf7t=qz6?Yac7S9@u zH8fv@VY56X$CdLmTRRuyteS0{VND4+(~<+KWFiucfxl(3G|kS>SMsU1w*6nnj5-!k z)yHbj4YWZd6=Z5z?Ge<JgEas_9to;jzkv{mKM4Kd26!m?3p}`T9%>-}%yf$&N<_Dt zgpzGy^P}R`v)Xk;un>k2#EyC^`A?r}=l<2!sOtzW`rv)*d~l&9)onQ=rbpHhhSV#c zCQ{Z&e#FfM*Ia*WQh48xRu84s8*7G|CknUC)fkUOMHfY6Z_zTpQqim}EGZUOZTzKH zB(pjd%3^0Dvo_yJPv{!WFSyr0SgVL-sS$a9o*IiUCsr1NMX?_ftr$YrG(6J+w>U7L z+ZU1W_jsSj2Wu*8WIbO~flD<REZ&N*UAtJ)45b1lo7E6Bo)D?*#EHo%_*k%0QzxO{ zv2jjwKrk&WF|(Ilu`S4@elvR~*NUz+TpPJc{Y*$h7w0_LoTqsC1>sj<7<T|+p;f|t z)ufht5Z@2r>Fnm|&Jv-{{(eYrVQqVuTeC+?*PWnca;an7_O%(t=lc(5i4_%T!~O7& z&u2z$Yc+59gx&MMJ1T68S+^ltSdegdyZMvc%-%O<CZ&BlL=TRIL=HeA1z5RuhD@U5 zvOFii)?VBp5w^;Tj^+l-Dil6`SRi6k0p`NBW!d<U9XVmE0VS3@5HS5M+GB|<EXRa6 z^E|I}5KryuoLREUMJ%|NJR=POc>R+zQ|{GE+#7SMdi7JW`{D&xvywBUcbt}(CyyGd zJVf;Lg6fvWD*B1D(YcfiL`x2$Z@n?%%kouD)tmn#`z6MsEUL>HF8{zh%rQhB!umwO z{tV>ZJk->NfV~?og7=zKd!yZxeV2a!{ldY=I-@Ri{qZYT{kFtzO{IZ_Ro>IUthm)j zluyt7e^Sg$|7L*46I|Mr$Us^2;Xwo<3YHZ`YS$)HtF-^wacD*EF&tG=TGYiW4KNLC zeb&Phg7)WXB{+M!p#(Z4`1%Pm?xoB)*}!NFPn(f^uU`DVMJcuVDZlPb6sl5@`i~tW zEc-})>^lT2vy$$a@^0!x`iVL#AJK}QXhi}f?FCytLbmtwN8cm6X)13SMVxDE6Re|1 zu4K=%WR);tDmATyL`QKxhULSGQ%tgldL{Cu#p|yy11v7GtPQxk`?5_$YQ~cyyU7Mi zpipQ2{aMql&pQ6B@Yc996UJ<87&u)~wmona-t^n;w(R}7n(IC;Rg~-X8!pJ3+peSc zVX4N?@ny!I8UgKTf$rI;b;k<XP`voThPbLdJn;4^sqfZ?Ib$m8Y(25I(&Sun&5UIa z5u%r9sK9p~xgnlnoe~npMgVqquuV~DlCQIpoJ_x4*xqOt`uV7t)JJ(DiQ(JU?Q;$- z_wC$G;h)Tq{&b}ya`>IGL#G;<FFWzL6?Vk78pUm>l`lSAttWhLW@l-OZQq+#tibxO zRQ5&ISKxbhJk{SSlv<_2fG!!%TC@zlgQp6xorL$xKWN<adnwbC>xVx$HRgD;z^3bl z>`M~srA|-27oM<pNm|ti<;6aW@{Jpn@#${P>;4f{x_o&lac|$jTnV2mf6kdmf2QT3 zgy=E6`6eb|EV+_)vJ;=t5tGY5jG<B%i-%>*ViA#9EEckt%y+o5{y^{hJG1;H(g(0o zPr|ZhANm1*{9@^brB|vTHPhtl)#oy?czpKIzRa!W4qySjvK1^jVJ;ye|Iwtxj!J47 z6Qz2^rY#uy>Yl>lt(DLWJk+*)@w?I3O<k;z8qjXGm5HM9N(btK=anHIm^~6to>sP| zsd@d@UgyyhdcDL73dS1@yvaRS*4q|bU@mwEqW>_g!kld!yjr)oP93p!aP(A9D<hv; zt=r}n>auXUbh4NywMP;mjxwYLTmf72ASR94Bc)7&)ys2x$CZ-zh&>A)uvo$fe7CMt z;%A<))o7eUf9a%@6ZEa|hhG*e&9vmxr)e}(2{EsMKHx1y@;jdXZ_yH-p~@B_Wqn53 z-}}(6#7L?_rpm4Xft+7vf=i9;QXv7Kvswjf>qT~tHM_&xWZjd&tU-w=vaBbwfU+AW zh&gzgjwzZ>)imx8Jv?nX7#fHlv^r5X(q)_E@t=EyhlgLD74xHa?K_JO$5G>ojprt| z&<eMAZ{ON~g1Lv(polD3IW1=Lw;35w&lEXM5I6PeZW}9TsVi1mtYhUroDJW_XKmd7 z-=hYv%VE?YGbxn;UwXuHjbuq(B}87P5=KoKRdcxdGOo(}J%?0s#{o7}vXSe7jJ{TD zz<z^p?jBs&rb-A{aPK|!?vj{0)9IAE%5Qh4QRAr8nTan(r%q3NDb(HkXY8W)n`&=) z9~<*-qjquL*VN;F<%Lh?D9>`h;{hd7EC7!zLK^$G2#LwCRD8kJpp*=)_SUNOh?TgW zJ96@W6)Q0-<j&fMy;gsZm1d?HjmCN@(^Kw+C+>?$`RudQC3_QitP~YtPSD&tJ<Jv> zEnA>yqi0e(v}p#~bi&f6QI?e;*h1`wRlQy*YgNjJ@PTY?lWi)i75R=3N0pS0NJ<8O z#lFJdnFm$2h=lhNLXznz^^C>_sne_>NpQ-1TSzkO^v6J<ZJ&W9Lz2a@Hg6!TK#R)4 z8akBNk;u(UsSdH8SR;Do`ATeav3Ig;3<<K>e=d1XVM*)Qq)M3TnHC0Dl3cY%cbXeY z4f4h>aAf0aG$NweczOVtBHIN9*(?c<9;^?nh=8FYvvfj5wzExkvSZuNFgb9l=v2e0 zkrO5d2o{PL3)y_FSd_AX-*rqfxEV0ds91X9Ktlr%9jQBqOKh^X?H*A#5s7US)5UEU zb{@VNp0IZL-X=?_)0WoP55(sh?Gm@GI!^7+wW+>%%G6E!mXBFIt6#hBpEv0-vHRRD z-+wb<4x3X47X2bL()34+G(av}B1YmfcWWz4SrKcF50g!GL7&Y!i+4(~F<oLeJrvM6 z8(ZmN{GssvNCSn`#fmnYF0fz;e=hL-`wkH`n%etznKG1~Kd<SpJP0?FiDT_UoaQeR zb>XxMxWw8MqSFSjbzLl(-V%|VmCI5lzLX)iB^&T3kytMk2X8Rf>g<fAsMH__2jaZi z3CoTg!QO%mt2d`t2tV9=#MKNT(cJ3bk=4tD51%rae&FqP@dxmvMV89CYlPX3Qj+5e zX=Tu6E{I0;hXHDiioT=^8z_Ckl)eqV5}$s`V0M%e7<r8ehkE3vu)=54Kc3*QR>_wm zttWi{h4sXiU1mI4`wSZjxtdBUapVMD;|WH>S=NDC(o<s_(#GMmVdDo)m2*brT}Zg{ z!Kh?3q4n|Cy9zyCi1bs2STjAn@P^7Oa*^UD9R6co%F0nGJ8JC`?pv*nNyh*Bh4qhC zCI2NaMPJZfEtLgy<>$&OW%cKDrLv%<(3?Iszc$~Zg^DCp7s|0dQaXrChAyPNOf0*x znLJ9#u$10#R#;?3ocZ*(IFgk0I`%q{C7Y*%3I_$TuqvD-_x{w;DUFnhUY(CM@Suij zUq)AJp>%E7!%e*Y$)V9H#}NC$(MR$3Y$)joN$mnh|CqzFO6vbb4r_-f6do5cvBdZq zhE2R3jz4OF{nknwVV$-yW_LAY$MS4$fbkOywZINQz8fFetm4Fx?8+C}pcia*ruPr4 z>x@ZFxToaouGe|sOCx-<WBbRCbo=&l%JUmH@Ip(Qx=#{c(+Vx9*Pn?`>elR|n4T)H z>Vzq8^Ocj4jDzFK8}jqt@?PM;))~kmBU*)1{Ml$!-e^<UJp^2Lv~XR<!nId0dtJxb zi|<2o4la?Zmo+YG|2S814%3GR;wu327EgD5h`S$lEns1x;*A^1i?Tbm3Ligi-K9(( zNSnQ&PGQ*k{1ffgyJp?I;~$j#7Rpb*CgtHpB#Qs{*GcIS{!*hSX=zynA=t<-mn(<W zebI~W{}F@PKBm(44$(iRASKqu%IQs>%mA{vR4umUjcvdUsp})Kpj>*iW=5MCXQCQM zjSpWjyY1KMQT2yJ3$J41>KzLHX6}j~8va;o@eCGMEmt-YGyVqA-)AG%_q$3BFRnpl z5n*99LuZ>0sP>xW7oGiG+3Q_wSNc)gD_%mvr##IZ>wJWgMMaL{HBBHg0;4P$0X`eU zwtCiWrG||g{GgjveXYZpUuF%WOJ!#q*ozUemm6PwK|ozH!(qwJ@YjfVf<}GMsAP_& z8PCyN-yEL$_;G6Z?n@=IH0w^;J$d3l{oYl1MSUIa-gUgVyF|8zk^#se2Vjn6AR}dO z9-FG3gu6KFQig3aQd#~I%Pho$UL~9c6C>7BbhccwNz9f#UHMj8SG`=JxEx70{<fH_ zhtAg%saT^iNQBqJJPd)Y_01{l4yMB$q&C7kTG(V-?GVA?#x?tl{XbqX#(lTudwV)T z*sL5+k1!g`?i@us7-^HsFS3trKXm?tl5T`vOu+viB?|xdrAnj*X(~I{tOe0xl7ct5 zO2mB#QJ5cg##TeU>{rYnWdE7%45m#Br3lgmg(L0=4+{5WY<h-!>ad8V^VCsw=MQ_s zB+#H0q{UrtzPZ)aRQ2e}O{c0R$335NrAunH(;Jq>SNpVT&Bv81KCW5yNqJnjYD@Qi zeY+hCiZ}iGUOpX^wyS5SGgZ&Zf4n@LR8^R{NqM_*BX!!ek=k$Gto+Hw9o(NZ9k!x8 z-g)z?!1mOtE#W@h+DBaDtS2@l!^Sh#d|hySu&$}@3!T^xeS@_2F_u6^eyVs=C0h+B zF>al*QDDN0f0(K0*#Jh&B75@MFmkcMoTYM*%;D>0VaQ&i%rhih3U8r!()~&!dRA#< zRGQFq;CrQfb9&ZG<AwFDx8bkC@%m<K5Yfq8HzWi-b`ZAk3AcqhmMbsb32HHj);&g; zXNuL?96rREO&1PgR-n8QUYYgcdEq_knW#8pkNsH^N?MX{WY1QuS<|tHDhxeu$@BVS zT>3*w$iMlsUp<25Cbs^T@iH6=v7w&-hTL571~$32T39<+4lll;QaF19Q4aEF$x4%d zY2_)gwYf?d=4#BkVWt*Tg}*HL52385j}U<Ek9-3#X2|Sfsr8<v%cuNt^@(COKF>UH zv)!Kc%In*k7R-x&clGw~#(VJzIc>k+o_)NRV%M<FianiAecGDREr}i;vE0qLCVEFw zUY2kybNl>=QQfLGJGy+#a<`DRqqnByW$nAZDW=cp9yLSz&;PxQvu6INexrM~66Ov0 zGP*ajtqGd11ol3S9cF|Th)K`iT!l|8euW1)9rT3tEuH}DL4sw|=_!?JmZ{d$(_%zL zGPCGs{Jrh7&}H_%;&R!iUVSDyAHJ}G@0ylTS`!^r)2hy4I0<933NegrEN6Rz9cuD- z_8fwb5eK~kG`Xw;pK_Ldp~thhtICUfB!rdRhiIy)mji8=SUeI>z*@`^OIfmxa}IE0 zdrzydp<czG?L`fBsbY|@^<R(-RRk$&>#~(5dHIShp>uy*y=vO~!udyN@F5eeedv&K z_3)2M_K|ugX$Lx&b~qWY99O0&$K!?J8+P3`b@(yo`?d4uC2Vg0-3cm=PgYJPB-7?e zCu!59cqR4JMcO+vQ`vhlQ`vv@DvdzT?8Dy`eggSb!fx*6vR>V>j@2C>i`;lBhbg!w zh$VP=Zi??R{`;CvJX_3J;RJ*5kIOl(*5#azu6<ocyUuc5>T1syc8Yg#vPosJ>15Fn zbQcpDHbo18^4c7`hdUN__y%`>10=TJMGBhVX8PQH8x9PP8Z+0pYu=>T3QAh*@7(q& zZ-vvwW{uiT7%*mLtKpL)`V5`Fa)ENTZ_jG|8y-Eh4SUvCk=0@)aR~{eGXfrB!FmR5 zS@aM#at2*0t`S~iPgH>I?L-Y$>$Gg9%VImMNfp0C17^A564w~bmBjLNDXkp_Ba1gf zf7TR1x@92WI<UK&WWR=uSOtD;M+E!EOVIePZ;>{i!C1A_w!5qJc8Oy5Cs%f4I*K=E zWncBh0bi)Euih8xTemWQx4Uj|iEXlSpif<Xz1~zK+vKa48<fyhyggY$1H=EOpBiQ$ zA#CQUJl*}#CxJmhssRe}pZIrO3_nC`AF*nyNx6E6J_`Sx`fgm{+^}q?{&`m-Cl8yP zA>93&HfAO%sYvCk+M1-C{!Q5-HhHzONzf1D>gcO1?b}VLH>BI39s+u&uV$ujm0Ngc zww_tKC*VA=i+7nYQ8P0P8oos=5TelsY$t4R375^pTrQghoW<MZnfESEA8>=jMlMg% z+bk~ha7*l<$e5VOL9yXOzvvh>q(kRn(#?S@Rty~UZS3Gq!-sU~Hf$uG+_tDle1QL_ z;Q!(6yW^v%*7x_!%x*{m>4l!2&;x|*BB)4*3kqUGX-bvetD*NQA{_+jNL>b`N|T}# zAs|HrQS3;uB0{n!zvn%(XJ>|T@BQ9CejjC%-DI<;zV&&ZHxww3rhXJ5&W)G24gC5; zI*ybIdPH?5Is0LOP12oV1SG&=3usEf&S<(%uob+Go7ZQ1+-zL_UbU{8=B6S}H#?PA zSX42*tjt%YI(NcDK~P(ID6leZm<wS5gy6Ero5c-^5r74;DIFa^se;X)6&8RaJy!gT zhGo|A874TEE?h}cruwe2<YxbB|3>G2?s<a;jPF|~k6lsbS6~^>4#;}8)tfJMnK-C@ z+qW8sO4H`bbY(b3n(i2_2MKv(Y?=t1$-5ykF*H&~aWV^YMByxQs6po7LLB5^Zm${A zB&1ac#1islY35I3(!_j_rAahjES;7}Z>d(gUg;N0i)6U1rq4JEW_b|+o}_|PQdn4% zPJ_C)Yc(``UcbSUn>Ts6<?LZOE8JsF_4Pfe)nTvJfA-ZjO<x~2pz{+Q;$u2C>Nsp< zr{_Aietr#3@(85ahs(@7K@Nx{VtY7CV3`bqR!EN(gMy-R;4FaiYt}jRr1K{Ko9wvt zh)C{&uNy;I=-4<6-D1Z{XTcUu6D3D75-E*3;YI|)lBNZRU>m78JyLujJ1G#rNy%^} zi3n5V*Xn|~-mT&8EcJDMx8Kro)wCME?t71Z_=&PO@92rIJGSzD==>66?Et@=*fT<b zh)^wfZxI`nyDEc9fP0bwgy0b}_hi_lW@SYxCr8e`I*5gQzeOoD;QZ9{1^1id?`~D5 zvSj5xEQ_LnDq#g~cfcpJSQT3hBSQJuZ#^)_^ZZ$&szU_yHCs)#un^@snWGW_9_-IE zMV<r|U2E2Z<v`TC+6ZqYaEvHkS0wNZ`4bYFu9OU6u4Q;mhi;iaKB&{AXZsXu8nNJ| zu2q^nUA=nYp_t29Wj@>D+>D6Vf2!oAlMl*btkGjCd7+MiP|3@-xc^~k!MOWppU-}S zEV0?>BtTV-g<*$1<FDo=;S=H4K*F)be&9#4PQ)}?DY|N!Kw@Q4J7kE*2N)S<uVGPZ z*G!uHfqVSm0TU+o?>9*sICt01#eL@O*#4e#?3@K-`;J;Le<C#SDD=e(17B%6dn=A0 zV{ftQ;F=`O>~OZmYGknUjxc3DzUHtP^xqC*Unrmga6}k~T|@ve;L26-9ys#OKH@z& zU^Xs9?=85CRSiN_IZD;!d*q=L@5#Y?euliEzrS6)=L;3_HoWJeqXItH|2avp8I#24 zU=@4tv1(;>kuHho^&5I|5xw>nH!(57Es!@*Tsn#sz@ASGoJ-=-D2Xz%C<<s(eY6Sd z)5FAzdeM>;mBhslQ-V;7BrHcivO<{rh#7eTVFt9yiLPAzxn>QPOrNq;b1VCoulnfC zIaw7I<}ch*c64rBC#z|*m7V4+Uo~UR!DFk2o|sgoMa}xGo&P>44zRMie#R{gM?`Oy z?h+9_9Bx=C#$rp)Nr()2FT@iWZ`31=OM=jmX&%x2FnvK(bBL3RI1|-ySV}s~U?53r zQ}GeRmqOf0V1Pjk721y~exs96uH^dJ7ZK%~UV!G#ebqv~M#Yt;zU?KIz4zBE&u6d? z_$yRjG2iWbjjaV&G;_3vPWGzLKn~T{Lo9Mg8e1r!Cf)1=fD=wZFj;%JX#zXKMAXzP z{9QdrBiRUa8$*K!#CLIASbH{#FUnvYS*HxXh>gzRqxh&)HktLv;IqX8ADqS}@}Urg zz=VIOec`+an<NpQOJ`j(FbN`$M?P}8f5mP3Ik3pZBSaiGMSQ`zqT*VpW;44-hcT6$ z?Fal3LXBsDRs+#HQFRpWfpm&?M#M9i*N(`vY8edfi61|HXll1QV>SUo{?okPb*7DB zdAH^$JI7rCl3e|&yRT`^hXFKspEaL(S>0U1lfUP^vVs3|g@3<PYdnWA<w3XR<?ZVt zK;^hORF{;66IK`*kyrev5rp`F`mpFOsSl)vf<6$=7A(DR<2zVw=7ACdH((`^qDm4; zoFED(;E5r4IU9QF_KjnFq}$E<e|YgU5ZL?^<?4squ4r7x_wV@X9-hD8utu77Wx)+C z-C2MfL~FfF1@aLCS$W&37eNwoBtv4vNh#tKfj2YUrY9LcNEJWu!f7z+1Vm=th*ZVk zatm@F@^}1bknC!e6u3U*_#~=dx<7b-#IC_F9e?f3O|Q1vkzTCA^2QT)zi|4MzO&l# zpEPao{$ooAcf8QAX195hn!onW3!daEDOHyYsNHY=TMc`E+v>G(d?%f{HU&3bLy>c< z1Ye|%<C?A-)tQLKWQmx})Bar$=9QFRiI9AW@`-KwG6$loiFBj&@InF>6Arjic&%_` z++bc=F-qYCka?y^;kc4<72=+ZYZ})&&ecXQWxTnT_~NaFH`l6F3ocA*U`t6FnCqsO zH+~a|zfAL25GFR+g1pfY-kJ~?z&~Zg3MiTom=C}MMf%%-MTw-D3qB=)UP(gKN`#d5 z*Sp86vC2QpT)XG1<E-q=*-Q3jf4yb;=J@KT$L#(x|JIqkCr6cTwlTlW^Nah3@z2*B zS)lG*kQ=RhxhG~~|H9qJuAH`HxANNJ4fBTwy|Z=pw8`_XpKtc;m;a0@*Q{2xC)$={ zZPoY34H&2X^WEOWO=n3%Z$y4S(p46<B9%}>4q_Xu8Ql=7pQX6407^)7RbU6gOHks8 zyqPGGbn=3vqIkdv!TYVtiIpoKSUKny)Q>=k)7ir^3H%$vN))BUQABuB&7e%P2qRJT zteQM@P?vp!N1qw=?eV@Ro{Smr>Wz|Drd*H7pL@KN#wwi}zvXb3or4yCtT{^#=No@$ zzSQ^jh;JtT#MrAZuKnY+v6bH%`f}CQllxZA|K8Je(03>Lf7*wIUZm66*zq@5YkG?a ze5|8|?h^S@(mx^~3~$Xrp&AqC3U_TwD2m9xC~*aNN>jBuBDRFfmtz7i3kM|$R8a=? zTBQ6&%gisX{^<MGunzq;;-+fsB||Oxiulzd#`Q`;Z!H8I^u>UouSin6QYNiB<aMHm zY?kxykr34K%7{Qd35ik~B~bJX@x_}#K^BtGiGi)~f-kKMqR95RpMld5l3EyB*e4;v z1qqfA+)8X3{Be@pQQ5Bmv@zt(7i)EB*L~2X$$i?tSgU=PzU~gMFmKD=yM9p{wt9iL zc%jR#>jJ{z*>Ix4FLTQQ#Zh_VvHExBE8{LbqYlXih$Cd!xw`pN$^+FwXHwuf008<w zAzr2Z97xOlZzzt(AzuGIiX-TK-_S?EI53wO*n5qjfuf;%r(3FT2)#@9OPFg?1KCRM z<z*AUCZP~|Od*k}iUBYzoTNWo>TTf>2@w!~IJVHrrp4@q?GR&2Y#^Epax}!-3R42h zPq+fDMX7sH+eq%cwsFxSs&Je-m1-RG%c#rq+iFi_=jBtmqo!rE!F)0s>}#11&GjLy z+#B!-RYaV`IBls|DZLF)7gB-vP56<}$qe5WhPHdC3Q?Y7n;$6?sNxf(>7)l0B9|ct z*#RpXpl&$gm>#joU|NXm!-$)**5lFH_4>#q*KDXn`hL}F@WSjbAKKiJ1}+4FKr#Fx z;9g;VTpaC=tyV6OM`DF3FapnvmK^Sv#q`9I!}>J6T1q_>f{lkDrT`KO^2D@Qrzp-1 z%JxKN-DU0gGAe1@xznS@_kN<cuccc#Spx+FSSXaO<AKoMp{NaZ`Yp&13+{?;Iuq96 zW5<JBi1>I6q7d!7Czfz~;=@_#W5?VVFS^wh&1*K#2N2+;nlFilPL5A`6OC4cynWY$ z-o8AqLe|J9f#4D?oH)rCo7gfTpC}7&hQ9PLk*U_B#TN|9ifqhgv~?^}`*z+0ca0*I zvw9E7Zvj{*Y^Zy8*Xh7D&Y$tBzvgkH^98KZIv@jf!_p`PCW|nE**1=&O)`q(C=XZw z07#=1XNm^MG(q)a@j)Rm%^L+{Ph$TlNGE}qB3Mjo`lYM#?ipJ)EAuAQu2<xVTD^zN zT(solVmS8S^c{Qo7hh=_d-Q@C$`_|j?9+WMaS0$H`V`y<3Wkpy50v8?y|_R*l0hwT zsWzctJCIV;iA9!|jg+rBek`z%7t!#3qRIQAhqv*tZFBVgXqY{g#5T+xbE*`ZwD7<n zSZ<p8<QkFsRx%<Dvz`Kk;-9msClbnALC8EVE+{yE=O<(5-W;opzCCxwKD7~5zEc%^ zUN5~{_pN96z;m&4Sdq1?<^~oyF9yZ%ZePdPBF-0z@Jspp{E~Z<AXiWi5>yL2n*y%G znvVDMQU*UHR987c<>`5p4iuKW-05O4D2vIX7^oEt3L%aHy}I}UR>^Id)oWF!M2x8( zi&@kDdYtiwlExdLH*qp5o4;HQH_H!kG>%9B0Pn{~83xZos7Gn|wT2>HeJiulk8^kZ zkbl1G?w&vOE;Z`UcW+m!{Oi)mb~vOne90vM=1&Nnx^LC8kN-H??AZ}t<cux%_Q&t7 z+4&GclKpmlXVM2k&TYbhYXl5^5l7Vk{+BL*xF^!e3!Eg((7dq_;;>-?Sop|IbH+Ex zCJ_8E?cCy30{)&?fzI>df}74vah{W4QJS>}kF1)NpQSrRaF-H36!Z<OD_DDl_l~n^ zIgM~^te8b7EOaDsBfzubf*t8j!gI=PAqEzOnsFRO6rSGZA8Bp)HO}At?)lQSR-r3( z46FMtzqexEFXLI>rE&knAjMUDP!5Y`)nBexzRCdp0YAC?F#lwedofGe(r8IO8nLi~ z)x3!^A1jyuwkalRs|`sb7^dV33O8DwztT8=rR5W$$H`PFZL8qKghB#yCRKsdHL?X@ zn=<n+5Ryq&Dfw`9g7Q57cJ4$WG5ZX*mnmp!-b%mZ)LNVM3bbD<v0qzVPQ>an9IbS% zOj*)xurZ|vU=umwppec9H&}t;0hooqlu|SIg)WHcRAKb?B63O*XAy-;e9!~M<hKLG z<g>3e8Z*c}W=3P>-_?|l=%b8Xw`qOooPB7j`EX@9YGJeq=q45a!2BeV)}|u@F19O% zVjdu}u_8raO+9{oe#1F1E%I?5g>xp8`OLT;Z9QH3w^kklcAlelnf&(DBGV33c_ic+ z8V?n{&W~K-nANj-w5aJe&Y>-WBesr2A56Y@kVO?1Nmax(EYS??ndvlRmjI>}`|?n! z@321ZX|wJ1zPZi`D|f7Q`6@hA_KOh`!^jG4HLAVd)PpV6Ucye0_aP3KBThb%hfC-) z5jCZgRy0oR1h{)lSSp+~@ghJDX1bD&7{T-(hJezXv=x1adF(*Yb}wnGXHN^xANv3z zbYjq(<LIt;;7uIAK}i<@)2^vwZKJhYH53f88U`rL@ZUzQMqW>O|K6or_X;@6j0&v; zM}IxoU}->PytH4R*^HIIS`;zru8P3sFOpCMHI2=Rw8IyQSeTor#}%Q-2W9ij>MTUv zZ5o_WVY}ZA&(2Qr2oOG`ryKE3D(+@~3^_M!@af^Zeo)J?uDg2mS^IRU(aH#4_z70y zlJ?xxU#HiZ_s>+)JR>g-f2v`*nZ5zgG1sy0^R?fUna*3VscRC&E`poIAl8e*o+$<s zmAC@DN-ovA;u{#IL7C44hX*AD5yD3U5-*50md;@c+|F!ImNK*6o?XxUSVp@aa`<rA zuVfQX(k?4Qo!?UQT#)#NYYe$7`kULsl>{YIQNht;P!_=UE<|*?Ac_r2$;i%PV?NIQ zvgVa1oWYlh+|LiC$iF|ktGFC};LU&uR=c1aaGt`hR}%q%a20?3p@EWpWD(gw8x_d~ z0#lqpm_~lW>}=)0ypf~kx%>6*KG1op&!kCxT6OC3Dt*dg=hH0Ixe;>!(~Q5y+6GY( z=7bSDSnP+R3=Blh`)MDsPhBy<okk<C;xO1UDA9{Ba<~)Yg=6B#++NGk3=laa_Ml(v z(QezVp-;h>tGR=W6eGyUSgA%GIy9=^xl?AH&UNs=E2i_z_U-0&*i`MAXR5jD)WHlI z@{z!FfZ`2&H<GgkP#aKhn*}u_c%a9KFImL7Bw8GJH1<TFrfr_cj;P+CZu3u`?Ov^2 zdgTg@n+}|czx*1S-d}Paz}%h=;KKpUbiubG#2a~22%5vsGLhf39j4WbqwkF-S4Ygt zL~;;>K)KYZ$@4Rxu3p>IvFUU3YPjn<543o5c)cf@cgSfZc=2Xwxyq05xQN-Wk)M5- z&Z>&#rP^*<*=^x40C4ZjgefU)Cx!9pwZKS&aOUBkVkAIggIqa9ncJLy)0j2=v%bs0 zb3urh3t6z2Z(*MnyayjI)=>>GE+M5c&oF#qoS#l`n?sEN<jt5n;9S^aEG&MBDiz~p zTo=0t;DCrgC%g7O`$Y9;o4GyBYE*cp0{*{TxlyCaRqEEQQam}ic!`u02lExxzU6Tu z9~>(xwMDk!f%0q~C(E;$?_>P_LHYX+<&SBaY6>6ePa2~U{c)$OpfPqb$gwhC+%Df+ z+6lhYRST!a4Vjur&T*m4ZM6zDD@4Y(LxdH>&~(5ICL(-j=GpNP054ON+G8-V#roED zcx_aVpqynL-_TBUC{(q2R?R9eHfhiz2x!WDkM=#E>bx!X((_;~y0KkiueOJ~5?q-s z+!V0_w3!;VP7_-vIO^0a-@3;9LUTo{?`x_d6~X_enr7c5{;Th9L0jBoU_%ftG~<GZ z2g{hBZ<29?zm%~(=J>){j16#=!^lu0|IkWW4wkW~EW1{hY*#rB`KLNQ2EOgKYbd^> zyhdHoLckEIBA*X=DiZp&80u9lClp+sW}=!-54s|tA3_WXtt?1KIobdmj-72*zUDn+ z=**9aa}E7XGiKpO#X*Alv*M7TLxco9hzL&tVh2um8Io%~;AO~gK_I9DGtrE(VkneG zNzxMXzi_K<1%nCrJrqKbI-BBes#xhKQGzHkG?2OyFD>-tgMZr+hygU7!bLPymgGr7 zWrVW4w$k<f?G{>3-%q7W6V;$wyW6}uK0z`lsgQ0djt&;)A6)+b#Q&qK5p;-i2t{F; z7`ZhT4+e+Y48+o;vy+^5`}iS}CG~`Fi_(l~0qgi7s->;j!~YwyB}mv;utP_%nh#dH z*brf&^hG+(fdHgKP%dG}h^j%TDbu;LrV>|MiLdGGc7HA{BUTW1UA-rED+p5UbzKvY zE0UsEK|D&{Xc6XnXxGf+0D24~$Oi+$Qqq7;uqa=H^h2;RBM8w)ot!_ohw_2%l~+JX z0XV$!16XB&k24s#h$Suv$m+*(>`0H)j9k$YK-rj4J}5IBQE^NK7n~L*&nXx|u(HMQ z8R6hKa9NmkY+jTM+*tmm?o<T=0_M1>)%2hue)2}jLT7`|H7h<F-!WyT?~Xb<KT%2X zeU+xD!}B*Q=r!#_jR+`Q`c_cYY#%yofFBvRrUgb5i^|9haFja?@2)s>ScEqP>V>YQ z4SO9hH61Ym6%3NLLct=?j6wm_Lg0PT^k{KRX*bLqB>t?C4#p9wsu31NOQ9Yj0ymrr z^gp#6Nr^=6D-Di$d}NrS-0`xQ1@rigEuJm>*ZK2UwAZ7gPrbiv`TZ$*qbA;4vFzSt z?T<;n&z<w<lrv}8#6Rb}``2W)&zCjn%fb0ghFqRF3Gos2LpGF<KZ~*c_c7z5h%P%U z$TQ(v$dhJ^TT0BSSc^b(89lklhQ{<QRvt_|%s-AS3wJ7Fw-`Ky{n8CeBnNmLlpoHp zP}R-G{;|~a8~;Y}FxPnxyQmf9DlT8%qMM^tY766H#c!bjP|$gv=Ta|W)IgGG>k%_a zakSBc1kaeUHAUeb6_uk-#*<`uA7y}5FJkbO!s5ZzDryV&C)-E?A~5W<)M$eHQ}P{k zKR8lJen!wlk(5({aJZCvtdlb6+{Du$xbF$XQm@t9v@thXrCVb+Z(x1+bI)yM7jjlG z*DU@~fuk2Mv;8@DJJ#aLjNPpCqQ(5%orAvTD?0-PNL(5>G^)8Qj<c7e#~No3tlVk- zgC}Ap(w(w7Jht421dGu*v$%kvv7-2`sQ5xvx)y9N0w-yKcnWqa63Hq{98Sr|Fo-v@ zJ*a|!Rfwo1g)PC_FgUJ!XvvB%w{*G>4%_-g2)n#DXO9OS?uToq@6D)iVC<^hT8(`D zWJr~;UZeWI#e%QbW=>Xq(&)(VeW!omzU8x7yAO7uB0zB*<Q+5*_OvK+cRlp7M((aG zZIghc)6KIfE$OW56&!+Sw?d{h3+<{vaTx#-#Lsa5EP)8f3@b$qTsz#l0B|q^Cp5!@ z*qs|Uk8EKBSVx#z<b4vAhMO++>^f)NucrolUc;>@U3Ip5=Ykmr%A6m!=fv3qvpTYt z&cmnI^xje-;l#Y%S6V&iJFV<WX3E!t4)@@1PxXGjJpXdrf!kNF+0ClsB$wxJsB7Re zhoFu!STF_~C)u{WB9kIFUI;_sN4p4LjNL-$pQxk2v8DE`K}gd!HP~}*4}9noyfs^< zRnK3)Xc1PJB0C|j5~ygZg1k+9Rl(+r99O#ke2Kp-V{+n})9rz$V2Lk=#|uz1;#ide z2S!h*B!cFEmRs@l2=Gw&Geaz5Ok8{*kL?hoC!Xwd)l$-)fhhRJWAi^85!I-5&V<!V z-v9J2GNfnu-F90#{Q0kL2T<Jp=0{!k=Q&GtfA`rcNg2If>(D>B9RK=g;@n%~S@P}V zoX@9(g|_ug7>%0vkk1qP9vC0V^T4*t90O24`vdM(I?h#$1+!{Pnx#Toq+-5$Y@t+P zkHkWSnz1@v0j?ba4tL6|XVweHiixLMV+DF*95o~%e>A{vFN>XGl8{7{STPD4!2ua? zug9=2kL<kT{(R-8U99)}Tej^#wsrF*Pr-pBw^;I7cfz=rrY_qsw#W1_eXn_xJ~@LX z%<KP-mpXr>^C9YB$nFG3OFiBnTMajIUACJdf<{6R+Q!LB30Q~{CnCmiwrwuyAiyfl zRxA_4jgL1lI~l^6$N=PkT+*a$bucgcMw|Ec_UPH7-IHlqEuU(>{G)|C*+Czwchh|H z#(v$s<6D`fO21IM`P||O@ssLS^2C+Tey7hD1xmAQ%wPjBvXqA+76;YOctRIloJ4ux zZS~i(LRDxV5xk>4gR@7QgQIG??bv_-?}R`|km||$Hgo6OTQ{P%dFFzp2N6?MU+p{Y z__;i<_M)zTyvNsxa!jgY5pIeiI?Tjjbvx@JM!X4J-caUvl(A5eIFb4$V5NkM;*=b? z@kOZu(Tp@vuF0M<GNlsM+SYXj9AU<DXHu-ul}1x!ADaBrN*=YMQSyAw$F-yB*;n?X zS>D0Yk7ixLKkT2!#^?gpjG2+87#$&tW!d^Q*5nmguny7wS+DL!tvbMo%<*)=eXSP! z$70C7hRfPD<3viFh23nhl-(k6L3;>MZQeS3c-45p`7S;_BZFnYj8@ZA5P17*VSV;q za{bIw(ZNv}qie+TpMrUpnrzn_**z);M>%hQlsEsCx<OeXvz}B#;`8IRET)ceRV7}n z$$W;o44S4Qe3b;DXAGHJ9wMN;+)ZIh5H1uf_NFPT7b-7!Y0wG9A`}yg64j<R(Hc|H z(}GFgVp|RQ=furV2E!+8INM!H%}9l=k&+@_T{Pky{Zlq|Out)b*|2=o@UG2Yu9Ngs z!+-HVUgTHwRXLNtKRtV-^NmVxkK=0f(>uDn-8nP4bd#rQ4MW57&RJ#MjgkklqKnU$ zPnq3u$)+k|PyW%?VaH=(;T5rP90)U3-Z6QT#O_F7AE6;k--3>^B~k^$&PckTMn=Sr z?Cb_)?xz48(e0wiZva}uLs|t*^%eFL94L8tKF~pt?L(4)I7z~Q+I>-XlqyXND(Sau z%214sQbHssWU;LtEb0j?(QP_NW;hqy0Im@vxl$5Qg9^}!N@tqLRH!03NNN7j<x6`x z@4?{ycq{Ckux7{Z)oTwi?Kys)-wDs-S9kdKYRTvR$=}gqFk?3&Zm{s5bLqqn<Kxw% z7<V#_+QJKN8?snxI!iQUnMv2R5;9e1sig%l%uK1$sQrbqM9&5lDl8Sh5EiB={I#bx zU3Tx8zy17o7YDxHIx{7+alIbD-Bx>_(w;lzowtSm^JDUXzcY)!@M?`IF^O?KvuoEV zn$1E#%U<&LB)?722B#wmGia(O7=3im6Gaj)iEArQi4+fnfwCM7gvu>a4F@BEEPg_H z%A5|7oFRx{QTLSeMt*Tk&J=%2XYhpyN>+Yl!D7?xz_4AvXlkuL-Y@%}ps=Yt`}TO| zJLM;`8S%wi{4cTkjgb|Afr(gBW1aas!qFPr5{iN2jF5t5)Q>*SG;kYD2W)<IH*ebV zjdHbv%QYO?PvOJVzBt1%Im3dh7MV6jxr_5_aC9ugNMaCeiFgqIVOu}>L|!>d&_&AH zsO$(8{3di<5gL!Ys=PCP<FP(<YL@x-lU3_c!tvCaO{~yW1g)ai{5AV7|04GjWe4_h z8c)*BXf=^R%7D%)X7~^2^+4LHxFLmYmZWWO#eo$@0@lyO09f5?{2|(TYmyT6@xU}d zIHUJvRJ=%di*Zw4Df($3WDRVhGW{O^XWCoEx{tc~O{d2FcXu6gYpL5k<NTmD%iC9N z5EG0ZYN6{`VzUah`OSrY@`4bx^$T4m-Cgh==d+wVTXAUPuFn|#?dT?;t)(u5Z)j(+ z*2T$ZwRAkQ-8tJ#ZJv{G1*HIyyMT0rg);||2L~b29TizEBMT(P=-UH%mhMpD!^UBr z%AxDO&97VKHU4{n!~G}ESKR8)U%=k}*~v<>;QT+@dav@U{HT);VAFzGRlN8&*Eqi! zti@ye^MUhqV*J#FsFcMXwT<6q^+;+vAwUwLrV`2OF{LpQVnUVx(QAo@l!_+6FD9Zy z`n@({c}b+QR+?3$I9{TPQvqd!hjp6&!8<b+D;{+LOI+8WMV-p6j(jj`bxO+WQR_c` ztqKreSNWAQyx`geR+gVVbB#I9PG!ZH^*F=t-{#*<8#{IyOT59<&wG+Qp9Kr5uk#Xo zjS8s2C}-5=m!k}p0}{|KyVHV1=cu$yE4oI_)eDypjCLqhx1=i4NW2h!wrs%vzzkhD zZ~`%s5$Q4fHMpp$<Y!P>SS0#qLVEfs@U*@q`czgwIkxkH>Q+8n`Qb|KAAWn@fOnU7 zc-Gh8_wQKFnAU?8B{wuq;lG@}@bzidT;W@GAKdy8D;0e2QsmTamrwF7S}8W-<IjUx z%Prfd4n*$r6GS8yIQJlK)L1WW=|dv+RN55c7|JIBu>?isG{g51xq5L~c<(1tL_ZJs zcXX3r_Fz8o(eWPGwp!K`730$?)o)da-}3O^v)b0rOpCAVX*uwTPqN)dYYuSkDOonI z<r}`azIjS-rFpM*ab-((9>MF69Le^K?tneYz&Wf8c@c{mhdz3+QR5J7A{lHJf<*I) zt&_gD-9pfVV+7DoSOnBAxEM8yw!|6q<ieuUNe11nl=wI@aE&rzND7Y!_5zYNN#<!a zl(ehz(TpaCKNz$jBV)s$^&dA)-{T6NJUs88;UBy+bG}-gITuc!xlYqsALNPrhf&j~ zkHRs$b-1<1w+rxwLa=@Rp+kEH$)khEFEJ5uuTyZxIUSx;N${V=3R}al0EKRr8x-(> zNuva2jFV?75#3or)?M2IkzOPaZAdX%isC{m8kBe<lbns99;IfI$ul7&>0;lK7P-&g z{A=XN(L=X)`RcO`pMX?>c*%W>%4FUCZs4gdS?xD>K6;_GFUjC3m)&oYAxTt=_3`NF z>7%;e=tV^zk{oYQxVxskM6Q%c>Z>RJho(3PgF*hoqC(W+F^zGQalV{?(;TO+yN$m+ zjzT=&LDYAH*jNYXg$y=U<PoGfXp2Bf3s9WPK$OoBFGL3tW(Z1{mO43L7R~^hi3rt( zEkdmh&Ss!OB}r8j7xL<;G>t+d!$?`KqK#&w&fU3pg}>}uTA^su@%<}Q?%4gAm`vpu z>wD<yD|^*4+QnTvFQc`NuOr{Ze;lT|)uB+>#g!wzI=*`QmM_|`;07LYI0_ZVOrxN) z$LY-IWXj0PG|r<)`pENWi^9slt9{x`^oSH4GtmM~L}Y;|po+(UutYk+>X9PJWgb-6 zA7~ijug^&VMiJ){!6ko*&ON}JY1a3@;jKhRmoHe~gV!!^S8ghYeZ#biyLW!2Z1?>O z9bW4BYVTXQc&`RsR|yey)bBvX0ITqz_aSFy3tt8_vd#NIVq4@o(V5ON7ucH8{YZ)w zqLI|J<wi~N>DRq?e}sNMeevKIZeC8@rlGYiehvDpQ3v<b^3^qN(jmS=JA-kCI-2Rh ze%!F1>c=L+ZE<m%OqBB6;w^fqgD>cY#G=w2KSU65UewJakoZBbf&0z*3f6}7CFKBX z;qxg&*~*gBmbiDZ-*UYIb~tv=B8-$!k%B;ht!0T|oZB1<?5g2K;G4kKQu>e$KmYgL zEBqz3Exzx2^vjC}aCjH0r+04u9E}2em3%FCES<lTPHk(xLSXa>P1VYerlOi2%D)3~ zK;qI?4lZ#@ma!s1gvFukfPwY~=?n;Z5R|q8Ez&^LWSl`XcJ@#~A^I~ZN|2U2#FIDL z-Sl5mpAU{zzRxeEZuE_h3ZK=}&3m#oSkZUuv$AaDes&6LT#t7KmN8@+&SEs`C#maJ zESPne<t&Qjlxr*CR`QAM$^|m8G(p?e3q?s5Swygrev7c@GBr^|5SptO5?K;GTBC3k z=|D^{1rZGdZ>gfd0N-on*1I?Q_BT?R`#uNuevf;%64}7_x$=A?CD&J3{JRDUg_o6e z;$IbC0_N5cxr26yX;9~nR7>X%+qnq@0 EnSqQ@3ijoAGbm}8LGfLSjju<hX5bZc zI<zYC5~<{%V+KZu9E@JLeWHJf78yg0(*lSdBWw<9CF;jBJMOrLUmJIWDep~SHTaLe zy#31v&%IAB|9Rz?Bl|C2)oLx<bYRhd?Ojgq9=a{94!^wnt6uwtFFU())tZ$`b+!bv zr20hJBgonV!FEN3Mvyyb+q6JZ)@X@<paE?cW<duHn~@c%t#`ZgU!Z15Xq4ga5`@o9 z#^;iBh@@US7C+PWxwiao;EF=Wm`hElGP9BxA4~__red@+ZeLBSMiC=<Sc{M!l!QGe zo{dOHT|L|~Dlrhb079I~C-T(dCX%IQ9}5m)kV~TUiPsMeFn_P(TbDZU*b}A0OICSh z^3(NvE9$aC>aDyN>YXc+71DLscrAnCr40%Wqq6%J;(n=M@o1?#Dp#R1W8_UMK`a== zbq<5L4oSk2p(2ci5^IZcmgzzY-IzFDq`$l+i7JTpDb8TwNud;JN_r~H#;8<J7RqrV zVSA7<g(Qu?scJk(3GSq9Vo~!K@EhJzp2W?t^510<>&tmcFS|c=;=QE<SL9Eg`1kv% z&f;tq&s+LFzxVDBKd@O$TegI$bJWlI-MqZfx97ZbV;mcIYu39r#-Kqtt@}>C%-IC% zPF2d1E#W`vibtsj7nPa>G=z|LJ4r)~cjv9}D~JiaJ8Or}gry+5e?)=})@j*m+X=J@ zGI<;!{)JiqO2~8=jiZO%MsYkjg^2G)YTevleR%gLCUhlE`~Bw1>8CD!$2#)a2lqUw zY``c!f&`r*X5LI!EcMy8QHVIWJaM+mC@+Q8(*~-@MQh+!lB6vEROWe<dG7m_<QkBo z#HZr(`LdvJd>4*01{sPoCcr!-kpIge$f}!%hCoO$QEe0$h@pM_gBk6<_nl=pVp}i} zhf;tNJm*Y&OPaf_rDj@UHf#e6tbigoGz37-DiVM{`Zvm(I+{GJywjAPQg{1~;d?`O zdwm`Kx*Nhn>TZ?n3@7zlqrPGB=mZ{R^tXx<AUr%ud&72=gx;|2s0<VZG@m2bZ*W^= z3OMEL`Ix}qabNvLB}v`8a`<jz>}a&@R%0HrJbcL*w`nOEozIH+v7AO^fewOg<kCCP z|JU(7G`5Gwg>yL((T?|^eW`*&75<80zuO#sQP@CMLP#tr&m2HMi&|+EQQ}}~3XtlG zL@P4$run8vh7g|)ZVTO5QN)pyP1OK!QQXvfOZ5N5txnC@8++r-Sr+6Qp^V{q=W>6E zcgM1@?-%_#RvG*IqM!I3v?x7wiq&FKFSwh49pRZX$G-XPJ$`NH4<GR>OaJ%=>wFW@ zfvuQRJmOS?^^ykn7zD8s;+)pm=409jB&DbmzZNk5!V41yO=QKaczRGqTEH-HPHd@p ziSZJi2z=xS2hH-qetNF02FQ!=Lejn=tMvCnP_IB&y>7k~7_%M9vhu9WW18z>?!=P` z{zB0M?hQTGxFbMf6n@m)#RZoaB9H`(E-WH)C?vB`aXXnnnj=<Vb-KtB2lp`LRNYxg zkqA}c5w$t$H6FsjSlG%rd4Aq^Y<0eVWCh#Irysklbob3shB(W9I_>mN_nWKvOFmM* zIE-<lV~iH-ii9^=9*ouw!Hp0|R*F56>3!*Pff!i$RnW<i(KKQ`&Ou|;iwSJ06*hs? zw>9+3syZYfo_KN{9_U|Ww856=cE=l3dN`zR#Ng1!q{dkmJmk`($(NBm`F_dU?#<l$ zP1=*WlXv}sfd9^4x*bq|;dibk&HQo1sPAX?VGY>A#JJa<@0ydsfBUIZfA^hzNjawm z6dX$&c!Z#GR7b1cMg%on#0a|SiV-6KcoR`4JSO`0N$5ZsaF_dpFb7RE2T|^#mdK)B zC_)6MV0>6Y1n`{`1HLoWbopB&itxM(9R&?JmJ(={_#qo`<V^1_tk>MncJeW7>>}^h zMSK)%v2yLU4g6!R#@mx$n-E`kcIT-Jm0(^mr(frh?g9M<bR)Zh`hQT(?;~-bauxxD z_K`SH)$QBhR;HkQ$%j9L6HybNso~o&WF}haQ6e(|J{vFfq%LguYT|~<KQHgD%~vBc z1(7^bk${i_2@7`(A8#%bAcY<`#YX}j8xF9lj7@*HXslBIWq1C93R9G=JT<zcJL?!5 z!KUQp^J(m9{xKV%p5hBR^{XiX&6JOkKGHjr!?P8`*zy;Fb@?~mS>$89Gi<%MtPxam zj1tg)=bfns7rPhnu!gLFKU0@&TIpWHHrD4)DXgIq;rmVeE2BhFv9u_dzU})0bL&}f zOP!A_VFtW21J`B9P_f!_ZbDg*96@Hvq6pGM2zZj?O(*XxU3h1vh}0ue((zL-)Pz}Y zsuxc&5Gba1Mp1CWIN{-8=PXry?t|si4tl;@w)1$ejz3)9)ni{z&!_V@Y}vSR-g5S& zn$~~RjP7GMES>(+xP)rwW~^yG^YuOpCJq?hhk1lOOy_nxc8)r?KIE0j*$GW7pV&6b z^vZ&0fAnDS#p;!*BRw8p2dak$@%oqf>A)SNV^vY`t=`1v{(r5EUwhQ!$z>a#<JFYV z=Pi}-w9yz-1^-%vlc#9GvkKuOr!P%&p&+FsCa=fbb^;oiNXmex=#NEuqSfsl-~HH# zw<e}n?A$KAD6Nd9au@&lM<rW3^}9k9Cy<g(`~>Usy6&*_`n5?#5g?EQliEuROgf9= zNx*P*2v$qoX?!Upz5pocccICl%~Ec#o3%YWp&XBO|Eq=iGdAsPekG#L$6zond0s*t zF9rOkz^#=-v0V)*y6qN4aEKwt|6TWKS|^+w<vovouZplgtz#f;v-)8FP&tN2e(dA0 z&BiCGAyW1-RKXd20Up_-RDMR_DgZKV#_}MaVQ697$?%~R^g{j$qFZV|@z(*FP^sgI zvjysIDBD{Vcu{9oHIf8Q;=ZOw;@0&?<HWYg540_;u-|1aRLE0l$O!xkS*vCmfRX|x zOw?OG*9)LPWpdsKphR8S5Cjq?D53}$H$;s>1>A5hk&VL>C!sCS77xEQ?9}$07Vc)l zx1Lf@Zyolc`{iNlP6c~5F7EYQ>=SbrZqd4JUNYD7(y*l)l+q|Y&aBJs@WORa=boI; zuRhH^?AX&R_(r+w1@3UQ%}e~R+t*p-3;FNYW5hqYf$!HMan#5^m)+~F{<&O<M=L%P z>;uR2A^#lO^*v83cm5gNxO`269-GW+<1+_huSeoDW63|a#1<c3ZTac)aOn{-hVrrd z=SfCC85o7xS%exw1_B6bb)>t|hfgnG+ss|>-D%BtRC6mKDHWgHJpbm+@$>3v6-zRo zalf3~#QY!OrOS`Eoe7(84qSE9aK%}~V%WX(ZxxS6spP&7G?}pySPg34A=clOi0{Zt zS03S||K}n6pS^VdV0yUk!^8><M{EuT0y_wIQ3G`1AunCUEg{)slh1(__@BIVm_Y$Y z*9@_jVQW~2jVF(9=3V&P`2N+!TQ<%|PQ9c0;k>!qRZZg^eWw<T$yuNn_N_AoqkY&* zN8QqcUb<XPTWzp(e8uEUFFo#m_tJ03;k%8oD;FVFm-t6tgIDs8-iJwHy~#rV#6N>) zb<<0iEFEHr<;dk=|7S1#p|L$YE}Tp1RY_Q_QmC-DvYyyZe*is?;DsrV^%A0`W)83m zU@|p;TlS`)$P1hGN-(r3z6tpaM@Y20APz4GKYv&pGz(NppeXZpRsVMN$$$PizU5N& zT?@8dP<)4#CzW$r(dCmDAAz__xx+7=**I5c&ad2;7_2R<Ec|i}vxpOZxoY_3s+qO7 zNj2M<5DuV}@8%VYHlqKiHMUsvR1N)jzdSmr8ad)db22h0GlYZwAi(Pe>&$|4jV5K2 zCtMt+@r7{E7h5`&Rs4%p^mi&7`|AQ83~-Y~dHLIwVa8K&mKNhIQD?w6&}>eGj$;g_ z=7;XC&9(}dmQfDT_&&;36d$A#gD2TtCPde7X~7>C?zq5>7|!@&Hy^-%e}+X4oV0%> z|9tuoHjS^IwTdh+(f8n!=+z^pZ&3Ni1E(np<(mq=BbFU#=rqSf-Qn+{m2CK2Vqo(4 z%Qjl#u8Ob<!TWnBgL)>D9>VD%tz<F{79bhRsZ^YTpA_)~(-(v8x12=Gj)=^FnxXD| zFem(&Xz~Ld;^RS{8_Fh0sl>M#Eh6Vle5PIzckMnyrY@vTksv=}O|@J6dFmIL|AW6k zUya?mj@m|Qx7=TSMYdHR+_OF6p0&5#GjX-#q|G}YaIf`ZqG7G!n41Xz9sLh!>bCo) zM-?Nt2$m->2ajrJOQktzXj|^#hPGQjQ<VC?J)b?;)waNK)qR!c(;Y*;$2AKlj?mvj z^+E>v8wiAWzqYX9$>dDL_DS)fJHQ%6hbxnOGfR>Kv#{(H&YlH236W#U5ZbLkuve8R z1f)R&u~T(B>$u_Mu}#n%znQLp@)mn_$>t4nltJqH>C-l-cDI1Le1E?^r2ljkvxFTk zW=ZISF^@wZ$o;Z8+mA*cI22J0fl!hbN}e3C8DN5D{PMrX9)KIv5GXQC{4K1mz+}mu zKj)w15Zt{djfpCCeEXnK0~4eh2+2V=umo@<4nL;`Qc)x{Y&TFUeDM=OF-MkfW>LC) z^iU#7$ea=nTt1Ok!F99D5Z5h+;AuwHTj07Gs02bq3K|;QC6j$v#qDxB_ygTooeuZ$ z<HD+1F1&0)C=~MNUi=-FZN`huu#*B%Oia$w5|Q*O7OReu?X=L4(j2E>m{CXha@H0% zK`^Mex*{f;2yZgT(mP0exJ(Y%^8PlQj*J6~kqE1pmN>{k^c5EQi)bZ@U<1qNNAwv9 zDl&g1w9nO5`E>Kx9cgJhM{hiVVva5E%<=-dz4={yaeDLae0Fov(4mulIjx1}{k`?f zxow&&?{EDqeI@y{3tdTyVNRvNVj2G+R!^RHo3OH}Q8{?>(GaRJ5eo*w>*28{qWP>q zUgE2(7~8vM=*F}%oBOZYkCCrrF{_M6sJ_<@|1f;O&>`23pd7d5+GEGP%2N3iQmNoN z*;Fn?poO~o&$CF__=|o5`x_N5PA0USRaY1<Dw*4e@<WiIP=P9}N#tFTb~1G!WvQ+4 zX=sgrB!Y^-Tuif8sm6Cm!|>!uH*1Wi51O_$+{mx?^8F+2Tjsb`aLY9m^)=-jQ}r;> zv)-`6%L3Y3R-Pphe~?cy@RJN_yCg~kY*bmoCggw>vM7~v+9)pckSNjI4dmUHsU=#g z0`!u_L_8kYl{BFpv)xf}VKt-M7HU2%xV9|R<r0Nkwjr2O*fVVGZ;QTXVX^M`Uvkg! zJf)ED9|Pd#j^%&-xaik$jH8vQTD<Bmmb~P*Z;qYe2l$_5+(QhU+qK`{V@bP5`by$T z;Y@A?KT&7s%v7vMDNE;Gn>Ck;d8f()nuI4waz&&Gp@(bKS;VM461C%&e4Jh=TtLEX zjCaVbTbgR<MPo%J6(XSo;*U;p3&PnH!c?Irxq$f*%FocahLFC_s=96+@pp^gay*FT zap&m|1A3RAg1ByagT+(l_`ff>!_Yb2=qJxK-!Hg^hQ8HSVIe{t5va+579s5sZgTpG z7@0f@frv>UW+YcZ-b}rSD1)aCf93_ibp-`7=_O$Y5%5A(<TD~SP}lR%-2BqMno43F zC8=iq5#>#OBcU`kQ>1?)8D3TSv29x#Z7S~J9~d|?Jm{kqA+qtr+!Erq4#Yi_+w}O+ zN+qg?3DgiUQ`<7bYK4K<!#-#ORD?kbv=9c3nsCsps~C02H}2~jYO>F&vCq)hft}t0 zpz~Bdkp5}a6&R)m*=&@4V$225_1m$+(a4xg)?-AaH_*F~0LIM|!;~v*BU!ZxZZlXZ zGk|jKC2UWRRRq;kEYz%EWHU>=ut2z?fQg}liJ!HI8i}PKtu1x~rVXNpVn0|m%Vp2e zR_yn0%syTZ=P1<J7p1B?;(l|vJH`&>kCFRx0ddbQ*q<2SQD*9~q7DsKSRi|6(~vft z{Ug<-&{)!45>I5HOb0nTozyt&TwJX<lBu}_l(N+GK*EZYiC$FvDjhwse<(u2e`<=H zGj@{|W^-8>ZRIAht!w#ccuN<IT|KA_rv3D9uGrujzKL>o*I>r)V0WpucaWZFWWy3o z9H~u|3WY7V%{H$<oFLff0RYw@=s0Kti;jyEV%Dr%#E*rjK=2QZpfEf5g+{yi3^7G2 zpvJ4{7Pm${dTJTZ(8}@j)hCal=zrOclkSiAu2660zt85zhQ_j)8@<XQ-&315^FD0q z(rL`sSlKaSIUfoj;+*7UoMOyVqZm^uRQ?arlSJh|S|thOAxQ%v2IbAOZKiFWGSdQ^ zSL`1c-pp7#CAR><1$GIN(NZIi*OEv{(ENy?0Z1b<=Ll~^-5L>|!|a2^OjWhwXPBV6 zWNZ5%x2xrz6{<%)a-tf_4u^L0wPJOgaW19trcJkQ&zq`*`2JCXgQqUIeQV<;#(wwk z=R*r)rZ<6sUV<G>gqJ^8k2bt~=qcIP&~{%1OQ*cN(h3kKRo+VR#0F?D1@%!1rvSAF zh8ZjFtKFCdwl++3FMxTF6mZkvV1n#Woa9IDHp=Tf;wC%AVz6ZO_#<}Rqt5mrg5><r zzxm3oM{YfvdF};YV`>v&oB+g?T&-~ek`d9HtH+itNB0kRTe2^Tb&)4Ps7U$5wl4Ap zi*+%pop6K#jHk||$F2)3e5^|;VK$k$I9iu<p)~!sz;;Sdp+cv`x-vJ^Vss?<4C`s> zwgnY9&bN7Sq`S5U4h#F8huaQ}Hf6z$KR$cGhb*{pWN>B{@CoW4L0ysiujZJK?s;xn z8$^bxK*m?Lcs=r@h<VGh#K4N+2$*Roy{wax;yK>3hz^;>{d(c_vh>GM4Q8eX^zh1H z*{V#L2X94C%T-LMm{}3jauq6zHh$G|z14_134l-pzl?mO0E^-RQEg+8fqy{XJs<{% zY5~Ge($J|Z&mHEgS<~<DEu6@z^Dpl-YTvG3o$wbY<P3Z63RA9JpE&L8MZVeKs?%!C zUZuE?c!z9DugkBjzfiYH_1;m{ica}gn=V`C5tLM2qTDp-?7$|BHEZvxfYVgP@vdIc z;6$hx;dNonDq7Y|o+8_tNly_wZ(Xwt|C$k=)<jI`g$*Dr>`^mSi=Ko;%v%o2RW6}i zW;rZZ*^1&!SIPBOF_+5-1R#B@rC66M(IW~-uvn?)TE*;G!@p+92hR=YbD!s5NN(S* zf1QXICMv-_>z_U{Y&z@4mlzABR%zdxd6a1*U!0iY`E=r1EL5M!YDK3uKK#a0E#K-^ z-KA>AG9e-@Ii4Z}yFR$}4cQBBA}9nrO2mZ?6(mguJxZ{j8g@E@Rc3)V+z%_%6QF{` zfSkcuk?<cun+)6!6~zPY<cLI3yr?(v_d@xb=b{k`P(OLM)UWto--{+F`6)xcnfpBp zQ3Bwfv(y5GP(LkRl+34NTWsQYW*YrZsDl6)GGK*A2wVwjC=E@D8cOIvJW6z&%_<jD zCP`|YC1zroCFX3Yt+AZ|7})|m?GL632GpcV3P7w3h*nQhX@v+-jTkDwP0Yq>L)Lx& zAN#tql|%55zYEU<wXr{r3O?iPaaTu<_}bSc=j!-zSBJy9NP*rw3@ld>WT!$beC<L- zN^u}mq<j)Er5#Q|9flL`3KXd!>gHik_vm{R1XDCiDN&lW%b1+QYL0xG_pQy#)U5uh zR&(^=Of_O>9<bCHL3!BBchQq63L{{aUgTl~@^Xp$B%hd(G^gk-j1h#`Mi5P*Oo$Cq zz$_&jmgN5GHxt{`tCC!#bOq0o#re@{d_s-Ji<N!tnnYKOtkWRB8`GYEoE%@!M?39$ z8n$o-WuT2ZS;$El-FqZt+N%l>KYV3-(*W2Ba62v9QK-fUhv?u8h#r7Zh^c~OBLh{J z&;Tw4R6<elcn#I1+G+m%ZTC(7Eh~B3eT$WHgT?LA{rrpWFY=Y{{Aa#0Wcct9)`lgV zWkp%*khk6n;VbyJ!3FH8kTGLI_{Ti&JTKsfLPm`aVKrD0%<YweUO2%Ak%uhr=&EZ5 z0?cwhZ70{3_>i?zLL~+y8+=8}IYxleVi6^gvFj~MDv#>BX_`i>5;1oL?FOm99)^;b zHWjePVcxIwIXTvS{I5QrjdmZu!|tsAs-xb|z41zit^M6f)wzF84H__@Fu!mkb>5#- zT_Z;pX60{i6bMJ2OB(srn4rm%L;0<<31hB|3K{{aM3J1XL9swxJnd-c*sF&$YD{Vg z3>`HDPe%htak2}AVJnYzz!Zf01A842+9DAIZ~~oZNRXiJLgkU!XVRVt(Gy}sTo)^0 zNrl4zsQ_lc2(LTW>(2C6%Jo*t)GG!gnYU7ew`#5z?LN((o?dr^w@$9NPNuhEuD2mc zda|1ZJjZCP3bJ@Ndbh)TCVp88eu?sV#E^*15o8i{@UgN~;#yj9iuDJ?NBb2Ku@jre zY)?0WV<$Gx(sh=K@K}pk?eOiap^@W$X#P@1&zNr2+KundYc){ZPgZnp`X$%5>)h=L zZy{`!t28`!+kIiD@6h%O=eH^fcMRFq_QFo(sqGgoRoK(1V_fGk6}nfvRjEbyE?Mo0 z;$nlt{Dw2%dELJc8}zEiK2#;2*o(*7)_sr{{DFNCn}7}%kKO^(;m{LfL|iA0yi5PG zXXkpe|I201{x6q3NU#6^z8DBPV%eh~zwC1n&fC9c*oIUivbTTDlvQli)G4dn>WazY z+p+d_uOQZ4Ykchp|NGM)NA{zz9}D^PNB8k{{QicM$G!Rd?gxjDuVbzaCs~xa?Dyre zE5vE->gu`%AEAt6njU1>!tgdFUzoVj^3>acu_Aybe<DS_xG4dZ9TXxeTM^*2M9)9~ z0KTY<T$Bn?E1WW!mX^TYGW5wvP~j*)90R4Gkr}^D%SJ<Zk_!JOj+?J2dlbG6>f_(V zbMIBJ-lYrVo`~r})0Bq4gl^!5zl5=-_)nf#3wiQv;anTvd|)l0?@?+P6hgUCtAzrW z2r^I16UIJ3c@~4kn@*qSO?mVRSfjwq<DdUyqrv$ZDouYYFmL}ZEX>fIa{PGc*O`2o zwiprB;*NjmOmZR^_N%P~OopTMaHBjFm0%X<9)6x_r(ho`ZGn)dVSWXoq5xrMDW7@f z-x$Lt-CKUSAlw~){*$lxZ_N2cIlhejOWnfi<-YtGtG(&BYsb#=CHz7oevZ$=D2MT7 zA_HFxqYU)6H%2K|UT#oelwlzvk%UudNt$7lwlo<=sZgmu1fhj3B`Q8k>FGXtxA&<D zAV}G@aQpdFo1doPDJ<iDD%ej>dFSfHj&hmbb7E}7gxKCmRzV9tL$m`SIs2th!bG}4 zHNF%wz62Xz3L9UF7+<1{FVW%)R?-=ihG0*c$0`10sd%oGV@VnOtNop?@vqZa+6{iS z3`_a4Lmo>j&%a?SHq={(QpOqU>#b)i*Ed+t#_(s?*IkELasE~9693!z2Y5LnA85IS z55lcVf+qGAt--E&oGpfK?D0OmXSy@KpdtD&M8PgVT$BJk;9f37Y{J%XBeMQs79)%3 zXAJJLFeN3s>eC8u)pe|=<4YA^9ya8qCf&!kbH$E+Gqz)=avdsFsMx&%_<hGX>+=*> zH(;0x3;tm7IT#j(6d&Xp^Tso&&MPyfjwp#S`PSigo5<e<VYN`k_}vULC48q+pLxSs zzvPIiGf*UbKb0S52b`PnSBV|5nxnSkIY%o;S4V$`w;nj8GrcV`z3no+9^#YMgH`kw zOZuY3U$1)WMNmAaUWDGnd@VlL+d^c;TSVxunlIy0w~HWDTe}Fov-vU<w<kh>I`9Gp zNX);I(hW}n$IcZiIPb*IpqtGf8Bc6)vOV$t1^k-%2S~g7BKz+f&?l>Mr7U)JV4HRW z`({_FnAI5H4d|2II*T8d-}#!!-}5~?!2b?T?-0M29eAtu=ZkN?`C=tcc4dC!r7m4w zs!|Q#1;5ng%@?aw^HlQPli%_0jo<TBauyG~!}fc|dySpxz&bjQqMv#&Q05e0E`{h! z22c-_|4qsCmdZqa20ep_n>)$4P%@qm&gXbs3pE2=-vATGrr}y-JDDdf-pPWT8EI;U z>WOCY(LpND2p#r%gBpeLpp-7cp5?3a1{C32*=y=zh1IUdzs&zr;Rouo^zxCjYadl# zkDOEI$dh4wBYQ(z9>!Ym_jzRDoc0ZC(gWKRv7p|k`7<IH)c;iZUSSRD^Yi)NDSS^u z1~*0K*<KcTw!YRp8<~<eFG&PVq#g|fm~8Awx>7{Mk#Izj8x94I{{NP3!&Ue%vTcZv zrW#Nzl(Vm1oxfA&+KhUsw$O}Whz<jjY;X*~BZ%>9MiC8{bCBp6Jx<UTW6P}40r*dA zUND-%_Bh8eL11}wrKE{i1agH{JsF<6ZuZI7cbAVYJGt8e7B=hh5#F1<GrIMNvPu`< z0;l)dr$6<Wm-2qr(AST6kN8r`&Pjm|7k%smvZ)MsIid}F1~Jd#{*l^3^)`hrK{G;H z%N&IsDoR`Q2&2LUg+?Z(gy7Yt&xR`v%UMi<3L=q&KnDzfRLN%}@6src%<#m!Bh{ap zH0V*GTbmJ&XmHo-*}fHf4pX9Meb;DC(yRs@Tl#i7zdZP0pSzmxCC(qiVxe(Ri>D<7 zrQ+UH)zuJ6%^BW`Em|)PGV(G_XevewIZx{!nWZJTePM33jN3Vsq2S%i2H<ZK#=5$5 z6LdsX8+WtK|C4H#a2aOK34h!Fm(}XNb#CQlw*hGufA=8&MR1i<<$s93kBYy)ny{+m zL6WHiSWA{a4Ppaf-b2_!rJI$|ge*4A5HWx(Fd9+##~?{@q);+J(41dq#aPK9hlcmv z1YW~?KMB@z-(LPTzd4iVkINeQ!|1!9VB#X`u%Upda}h0$!)QYVZp?wIJ8?>E5S{=s z4p<#?A#^2Hq=#{JX|w^oNGirONBpDJV$lQ|{5)=tJKY#8)#9vS8fX|p54{)h?namM z&l||~qd14R`tHlp^FAwGuGE1AAD#4F#0Z(=Fiyh<7<CM42%{fl5R=Pl3$F#XkK~fH zTv5J4CR2_#8qr5B;DVx6o0tnUK5kSPeD+`k%mY|d`cIG#AoT`DwsJ~xL*MPr9+cAU z@(g0g8Tzt(rIa)LBUaCsiDxgfEdH6Y4kJeWh33H6X~f!tBbKI|7_ofvm=PEL-$$$- z;7i%E7CfhuXM+d-_hwJSVn#8B63MT#cz@%<!u&7x7e<Wqt?OkW3%lu#aLRN);>L-U zlnZVfvGiE=U_^0fjj8g$JTG)bEh}DFl=#w3rK5}6YS25VZ+`9Op-TDNO1Fl-97S)a zeByfoQrp*5+2$+fOD8k{p_Qq=Ee!ePhsG%v^N|*_INRnph57uyjZ;~7)WhFmAK8mt zG<Tq^3FAandQcwLvk3U+tbHKGs>vm^ompE^N#M*fh3E(bZw*~8a}kk=vlNRGAVD<F zBe{oD3q~6C^?bo8?^X*bYu)!JP}5Be2xEf;bS}agK5}ew4Q;3MF=G?mEC0`91CUB7 z$x9g3Ck@%3o;;sXfkI>3%I^hzf?*Z|5;@w>lj^Tfuu+%?!f<rMg?yzrGb<|a5$LB0 zEoOlhVy!GhY2Y@uDr@#gfl4P+J9x$>QcqJiQ!Pww@Ssfn)lb`xwJl(-H?X!vG5#n& zYrKE_BF-R}H;`1K@dvW5Ab!VgQ{aupZ;Dl51x;>cB5pDx54c5Hi4Tid8os)H$pb=m zF)g|pqO^TL${IzH6#xAN+43W>QL`Phbq#?Dj0P4_8NZz&A_9**y|&c3)Xch~3AR$G z3B>s=)H~3smM|h_mk|)hbjr;p&(z(nYT#$o7#rpk^q=r)<H3|^Bs)BCbHTO<!vrxw zB`7WnWbE;1*%wJxiW2L5=g6uVn-DeD`<)r9ZTewG!SczySMNEyZo{SdQ^sxZmHFs{ z8B3Mz3+8y^>egXnSlyrAE12cxSHJmrC%>?~{3|SLFDrV3CGji2@*79_rI#uxeRlJ& znlxc0cd@iHOyl=2!Actm){#yEsZ<p_I+{^+gw>N#CtE?8AXJm5;c=@c*#EG4h((z6 z&1939`%mjtCa^+8|7SKA_petn(TYb=#54%Yg_<KOoq?w&LegTf;^I-FjDR$GR$8Zp zqkBv|&F}7dx6caor#+os7&&bjU-4$!9z%WSr;lpaZ9?a6qYArgu^Rs%k`d<qZEg2& z_|3FNe=Y0r>EHbBnRYX8G)ZN57yj_n)8EbPviZh2bZ}>mD89@^%plQ@m-Qe&pLL{R zZ`eel&4~zHa?H_Ea)V-9B#JB-B2?tug?A4i7FmAy4;O&#<gc;SZg!4WklZ0d-Hf^K z@1^_d=MO24nkYg}go85^WZ5|Jf%;!DGPy^>c$QCO3WiqSqUI1AgIf<EvmM$a$7dVc z8+?~?82|i5QyS=Xss_rY3=JZ9P2z!S)hvDa#95Jd(58`v$R;tU85Q<$G7-GDpBC!f z5Dlw69xEi`jwq%gum*Awk@wiq)1DnW-0m~)d2W0KXcu36aKFa-^XV?PvVllXsylfB zW7@e3tdF5b1n#yNM(C29)(~exP|KAP8!Dd!oTw;fAP^BqG|w(pFN!jWm8mO=00j_R z65Kor@B7EAZg-CuU46AE^O{+GVJDP%JsEN06ItlRGWmtrEK%$AI9?br2DyH=iznSw zu)&DBGqgZ6@yk@<F3R})7#=FuJ4CcFKN=KjpoQ^Oc?#@l^H~p&!uVb!Y*`4fiyfSY z5PL1-=%a@lejCtxQX<&$X>u%js8MqricY(sfLL2}ehiW_)<C3Q!vCv+`V;9lGxLJG zPjV6qm<0%d5vX)T6HL*Ol?Yl|7dYyXfkMhSRvm<9j3?e+>_Lj-&b;4Qsx!Y3i@L{x z*OzYlgRist@!+p!Uf^hJTAf864SnzJ{$oSj>sjm~evtn<<m4Ux^StseH&q*CE#*`A ziF-8fFl3ACK@yh2y!+|##=H@8mh-kjhy(LZ2ouYm0L)lItpuR`Ovi_=6-p`*B*6U5 z5T{<kcnfY^YTz7^)T47FrVcGYT7l+G%ph*eTu$5-l%?z)dpW05AJ6il`I|ocG5>t; zL;ZR#sF^<0H(dF#&5BNouEd7MO#gds{m2RZx0gQ26wc2+QFGk2QH`6H*sM$~(ra(m zA9s*+!#&oBHM1CX{kB^zwglTFO&A@@Dq!RNJG+Guq(JC<y8|dJKC+>eQZ;S%3Sa4V zf2q`IsG|DW<^&q<3S1S8eLeqK-7hSb=L3Ci{OEaGSmBZ8i*8sfIWSp@S}qF(bi`1B z&WJOezaYOyg@p9A>wl<iSM-XU4d?IgAJ}Ie&o*}KIi+FfcW2t|>K|LK)W`Goon*pE z31ffII1izZI4&9Tx9B>6ODH`Qn>@6IYy!S3*;qn+Q}vJ{SUhqN87)dymc=T8EVnwZ z(L#|}%YkU2iR*Fh1W%2yitb)RU=HHiKcyTBbQ4!22$MzQ-GCaW?O0bDZ|H;Ll>+f$ zz$N6j8LJWFRmna5pT|pO3-hRXXhnCQ!La^N2ZBQHKo3!+8?7<jS!=iDuDZj(cgR-D zwnYwvkqV<%9Sp?6=wetnp|AkXTUJnyF`DpUk<A-RhM<|T#9@YzLj9j6j5@-wfZc^U zF9YHsJ1&30VvPRE4|QHHAv-QR4+nZIKhS&mep^e=W$GiO-o^Hm1Oh;{u-n?EC)EIn z8Z$1YGf``$7c&~C7DG5a7x-kc0KkEo2M1^vOXU(~7|;BaC?u62jEVXMrWSA+=o0dm z$`dMGI{VwlBhCz{eo5bYY|oKS43fy{t%vqF-+#X6O1FKZm!H|S^4MXIQr(SnHH;4g zUZe(MmTmM<f8`EB$aKb~y<#y*Kz2$))Jqt3N2t@WOvzb-%E$DGP*Ft&Bhxf1F>W~K z@s#FxkQf6aSNG(fQ#+}=^v{3%dPt7^Om022EU4!@_0!p1Uv=9zYT21xD-NElj?SnB zvv7CO$4^N|P{H9yXIG~;a=6&$O#0ar+!LHiWG8RnXBq5j!JL8|`YHJH6h|#Y>-J&C zLJ)Iqu4@7xLmmmWD5WXew7IxVWB@sspooGWh47grn1&rS?PyF98a)Y>r|2@lh*l^f zE?%AF<}I(}-Mh$uK0NsKxjkwbWzzlTmv`;{Lh*$uAMNKy_k$ym#^v0KamAw!?lnEg zsDnd>SzZ`%M;^2?beC~qh<w0yDME7f2;;IKP-4w9`bS3=t%m|=88}Larln-~hpWUH zV|6c?@{Xp}u3EgTqU~OK(iplJG)6y`Dc<=T_qE*7dh=<woC4-Btl%eCMORT|$tyYD z(o1Akrpt^1tt9{23J{E>MY2gMNr51?Ab^*3siGDP?zOq(dX#ukFK+w{+hHndxHW+I z!5%eQXkm^KS-AD?bd+Dl1u063%b;M-5Dedv{5oUU<-NmpJ>mIo`F2eyTdI2T@``qG z=jYj3$H$`0ma3N9J$cpc57$oJUseM{0$OVI?5ez<*O(trn0lk*@s6zh@h+gg{#Lv8 z=0J4aVr3>y<A3l1wA>m!v=Z)Dm4cs~d$6<RA-5w1O2{~ALM+G~O#?<aO+*|jh#UqY z4iEwsTNV)q(~H$3%8Me~G%I8X#VqtzOdq|ofLtN$rytB14PzziX@yn-Z1h3MFuKw+ zvLllCe)i6l&-pAi==xu4r(Xyf-lglR_KH%z^b_%wRkg>#A>-e6VV);EtoggM0f*Dq z&pH80-M_nxn4^sNWkSaj9b4`hwK#u<wtP)9))aHCQ1FwMi@R42m1`v|)kaBFK_hjP zgg;q<oQ1-vm_{#_B-*<av-NII0`xTyy3otS5lj}iI84cUf@wyCX3g-6!=wy3`*`Jp zR&UH$rfDr|mnf%bN8TSYNSiwT8|9m^D|Rm8+{KD+Io6@=YS;M=&nrjvtXTZ~(q<=b zYW;@4+@Y76^;Y|CGpedfCciK-vGRJ%upd99?nQPq4bn2wUuo>`_+ay$0u*#CU7-2^ ze7E>@2y&Z^&h<!#*v--rTjG&T{i4K`SH&h8l;we4)DWtUhwp;OHwfItY*W75a`c-s z7l1)6_sw7Lk7FeZu{d|PwC97E)`*?lqpWu;o93_B=vEFN7;&_8Wqxy6v#R4h=$rUv z@A|LI9zSmt=JO`Mrgp}TQGdS_e}6xJ-KH(-87O;VssHVKN=9snHRqFo-J%Ubi&LQk zf`IKeX5-HG&*r4^&x(ahSMiM+YYesZ`T?a{x3r2CQp1!vGuUmn(tl{q0OpzdZkLHA zD;}Lg6RFYn#nhJXbQ?_e(K7`%f+!%F44c{7A4d2F@}AiOj}m}R4z^`;ATlkXz67fl zL)|omPf3}niejZJkBRe;sF9KeN<bU!>u;r(RqhPyN+PB~^|B?Hc7FGiw;w@Sp7+7B z`HTe1^558kO-(sCSat%4&(J~OhVw`4QxeTi*iwcRv4vG_br|vll7(cM9l)Iyv4U`z zX=#9=o{BV#*#-EIs7Z^^6^0l!Dn->dc(kPu`jtNI=5HYB>8TXYwBuVwj%W5_XkP-& z>)erc``fWqbL(EY^Px_&Itz_)1$$P~(M6Aboc&~Ta%5;$XbM?#VR32o5YbOfFCo4d zEE2ZhEM*vtoq{AJoq$VhI6O&_S_d|uH|<fw>hYPXc5%nV>8||Cs4PqaG-}1{CA2Y1 z|75T37%K$+&fToF4?!qjP2~v9<~>My+M|+`OR&twmI<_leT0D}Ep%BNp$GX}%c4KG zb?0CQn#P76Z7r~a*<olqsPw=#VP@(ZzJ93Xn&CdZV7;c4D^;Dg=j7&`u`VUZcMqn! z!niM;A5<<J^6$(yziT`8U@i+0dz^sCZ8G|cS#Og~Ye`R=bd?#|AX~&lvSKF;wFD<x z0n(DnJ_VGR>~u6T2*_}>Tiv$c?<s8Z-GzsS#ZFj$f&Vf1>e~m;Yif3ln39Sz`19Ds ztoUXY>SZOD)PABKKgv1427H!sYUiwrZS>bB9q&QAFab9C$A}dqIO^%q!j3X-ip}{9 zR0Ntg14LW?5><<P0X>5OqBV`Ml9DC(NlZXAii%U3E?l9M^ps@U;f*KncRxC6SJR@c z-`Q}w<Mt$F^5`+$=Dxh(1D16sVgB9eHLJM!A3v6yaBUQgGXc8t4$gj2U<KkV{a|h3 zOBu<3WL(fjcL11~LDN8XHUfh#dCdK$PkM&Zz;{U-<@;J0(APNQWa*sWHQ{X+a$@eh zujj1rpKmf~Ab7N0yJ(!XG0wMes%e~s9vr9C>HqsUr5Yy_4YCD?mR&=KvZ=i3pkDJf z(p9WTBE^egYR>Fz-;0YEE9XC%^9x%xxAE1#{bQVh_|S2jR^nujvv9K8tY%r*tj8BJ zYMJA4zf4b3SBeT8CfrLix1$${7gf3$w(^_g1cP%XIwB1&ST*8<B_vWRg}V_P^LL)q zsK5q1oi4D%PGQf_`hb<XH~sc_H!nDL{qC(Fjvpzw&4O>8XTk2_`HOt~3=#!tb<(#E z-TPVRodXsf+_H4h61BRra?Pq8r&kQ!*Y`3k?B?1ShDL<Id=bWkkUj{=BDlg(NJmk9 zuK-g*fJbM=swpa9;y9`4*{t0BnoFyFSwrhoyykP-JM4*A{yD4DYv7Y*i@wziK9l1q zWuy|Ve2A{wk&Z__U#y(bCaOV>25jCXN7K)qq2KALoN=zkYYo}Fg02on=g#8QXJJpE z3>F!mx{l`x;+e})_c;gt>NBAZB|=G5Dl5+@&Nh{+(8=ng&2;?biUM*XT2~}9oF6a; z3n<>G<2s%8GW<DLRAP@2Lk2CS_dTnPbX)<yfc1SufI$dzypQaotXNk+vV+{3HWKE} zlz~g}zRZGuIrcfe$NP%un*Z~VOA~7*-yQFN_lw56x8uz#W{6Mih)?}fd@AsESabhU zN5|6|XJjvALC>dk2JOL=-ft%MTsjad^tv{at;PJ(S&ux7mi2I;^)+6{_}MJ{rF4b{ zPI$eiV>`YoG(Of<j4#|#9!!}ccLy#MC;X=fIZl9@z$Pl-gb$ASfw9-OO`)ebliGxa zf#eAV{!+542SQplOG#dDn<*GjTCieG@k#4p<<TQoSWDnpZl1<2yV+-&BOe%s8f*}s zLVMVPzpeq}fc(u^#4Aa1S?n1(2HVHlV!UDul1(q5hG-IjT%jdp0{hN1w~1R7K*dN= zAq|i*wNy+Z3jlJ{01t@7caoOL6Fj^oJ3{|F5K0LonArPn^)nC6!jqqcc`Q<r*mZR{ z(2{X_u%G!+$=nib8omO;Xaqen7PXq&rfuU!ZJF{_!&h52Dbetimm1QE*i~>}SqqG1 zx+4mxgdj&0TP;osUe}5RUe7RIr=P3wI5EsoUm4(-sq9BxK%DN-$ar%gXtRYv*M2tw z1#2^#G*JdL!QJi;3waQvWHEeBHAfvsbH|I0ox1YU%Xptx5g~s(0)>f3;QaB}NIbrP z^Y?tF_XS)rEU<9T<qieRG1Tm+nYv3Q6gRCf3Yvl5#yUr2>d|o`dQysNN4=@^1HD`z zx=s<5D(16t5#H*k$BXdR!mmc?4a}dEiqM}8JcEc6Xi(%C3DN0aUSXSN`@x`i4OTc& zJR8)=B%GbLXZD{(XRvs+^P>K*j47Eo;gx}l7WIF5Qc|fgFZO@WS7hP90gD&@{GM8F zaQim~5A4)_Ap3b>#}57bck0+bFKuv#_5%mEe|^Y56_rmavQDGdw}0-r_Uk7#9KHVa z=FhiVH&M+QwQ<9QMk6<@o0xyJ`;;kt8uywwvERSCO`X=Oai8&%`YOM4n=-XmqaIVH z_RIStLF<=5JKMwYA-kk*z^*|y1`%<zgJ8r8HiTpxYQa#3wUwne;FnlN1En$_&-z8P zet2g$$9i_b|4yg>ofNpD4Wf6(;=Rnv()pJSSQ@{qZs6mh`3&|Jn?Rpi+c8$ncE;dD z0R$H~Q9`hKut2?Nj$>(%IJLEv`N|gOMm30mkX4zFyDSb!z(g#9n?-*!N13X8=iCh~ z@WSJJdWd@~kCg}!gjhR|;t7CNg7pXqNE0DOdID!4F_LnQ*kZ~(t_?0bxiw48c3tl{ zqqxWEUHt5;{8J9<hg$=?`o2-qXiOa-1Jh8aSH|&<o+$E3#^7zvhV&NoGA<E`LKTK3 zZ45ur890!1=8;c9(He>~aP09Y4*T}-)P&T`R8*UqHN7NzQi(D^FIkk_NiQN?W^pgM zUvN!Owm^ls8C0Ju{@KvasOi8jC>QuVr`Axp!}6aVQaMX;p2>9`|1{|6+KtED>*u_? zDv0&tGhM73`+oMvE#2<0W!-0cj#dBj<n`RGOE-PG<In2HU`YT0<)l1F30TZ2kPKxV zm-G~)LtTns`Nks(u<@8C9?SZpc{UKDXqzZ^Psa1bX$T~dopFNx9EVs~E8D`+qzgGY z6KUzC%13iSC4~iErUivGg0RLCBWH<6u#e+)RLS6Vu&&|zMDcyH_-Sgco-RI4&oDmK zMVJ$;EKD;*9gsE>z)LJ`HvSP42K~!OLe*>1|0D0c!>cN~zTrK4pOOM8q|uWQlF%eb z$PT>-B1MV~6opt26$`z0qzfX5fJj2`s9_68QA7}>SP(@~Q4#E7S5T6(^ZwSF-A;_} zeLv6jet&&>aguW~XZFmRwbrb@GSdZ&xBkeZ_)j+%hK}UZZ~0=jnyHu8R+G1yOVmE1 zk15QX#C7Ig(9cP2oPJ3UeW#|-Km4lZqdi1^Y2l?ymvr$-NwnC5+x-N5x90)pR6u;K zks*DUfU4d9^`G#xZ{M)I87JJ6crjm)q(4HB_guxem_3*Y-&xGb;@Fc$dTkB~P0#T< zLTmHsB61vD*^Qb3sKUDpqnA2Lh2fG!?i@L;0WNks0A{aVavKltRZGs8CAw&FtR#Ma z{-u)kLOXcwy?qE})k2EZi&zW3_Js(c?aJ%LqON(?yzSVQO~?G;Cx^=}29E(kS=5&f zw_IP}_52eU8oZw&mjSu5q0$7mR|^quG;i68sHZt&0A6wSc+KWlBp2ZKtN4|&@(EgD znpGIa{xc5AR>~a{L!?@XuQp3Q-5Kjo^~*9O;b;q0*i+#GfRAFtMePnCF3>QUk<~$8 zd=A9L=U6;`2hYIoS^RrF{vA2%n4!^0BS$U(Z>~OR<jOZd`@EAzbACg71Ht{kZmJ#x z>7W1Qr4#eeaue`30o$9O|7D}Y7x*S#P~}d`4)~^tuV=TKd-Q{jqMG^9>NY#f21c7T z<|iVh<NL4AZ9PYP^Gxf|V$rI**<9NoT6Hj6n0JWXUCmDst@`B+9XgesH@}>F%^yPR zm3y_ei^>uaK|HJ8ME~$BeIiOqKLSBqx`Yg+%fI|0BF*40>VqP3#R`&r;X3vgK+CKQ zJ~YgTkg@X-MEUaUSjMvnf=R`GW2^Ff#C9Bw$Ero<2-lux_~Y5Yj#!MiNEWc;D2dFj zq=Hs_=ubtmtIVPU)~k2!Sm)EV8HMI_U2M|Dq@o$<X1b=>*YfaN=2mg@uFWMSRGL!# zI@D|PE_HM0u2V+^ZkR5xphVz?$yOE^RXOun?u5-eHmkG=*vPKNX4UNSX5xR)aW->9 zye1(lGpBuIY*K1cPEtFxc=l2?Y(<{*VPtOty$}l{i-}OkM$`Nx=%onguy|lz6?~SG zgez1HBDjGtsEXM_h;yR{Juu>L^ZZ-*PZibwzH{=>N51-7h&S-ZH`Fdoe>ShwX_1O% z@xh$@SDH6K1?h~`mKmn`WBul@P|z~nE*jr1l&R84IchYN9cmkLxf8si$1Gm6taA=a zp|it#NVCOt5QXh3QE^deQB9(J{fh&jkDQ%KAT9tp1er9*F`6_$e2a$>hJ^`(j=ZK% z5K;!E5P~xnqpVwySAr`B^aqMe14BdtBD5~byQZe1aA$_`M<9v~J7$VW8I+$vx_`Q8 zmJI;vndw>SAhe|PG?As#B_iI~{^?aqXT-$JcxnLh<2F_){X$ENFMUUg8eo26j?<z_ zFNs+qn-Vv)z95^+Ge+nwuW8>>|3wsC)A~}2-(L-Vx{sun*6?Bu2UKe+Lk!`uG=_Cm zwQpXE;q$-*4mm$~5QKI2t_2^FqPmB50S*bwtAJ>@LI45TRu!>cxj|e98AyObvKh={ zU@2MfyyT~A1I%#)M+f&MZjAhPzxcj|8MyJ8H=;xP64j<r=U&*7sMYb0zxw%!`t}b) zTVm9Eb?wC`^;P>c@<O*LGc`1{#Ew=N)jT_5NzkSiN4JZQ<;qv_DEY}$5UnJ|C8Z@b zNot?u@9!}_qR;@LNf3jW|3XNE=8UW%Pb3gF3EV;?P&@;nGUp9J#`IW*YO>%7Hj#vy z7}@c`y!<@;1DD883MS!SJaq`tx|#1?)?dVb`gi#6f{4~4rkfv{YgF~muC2Om!#}aY zoY22j|84jeYCtW49>vbbf=p0K8=hbE*!INbg)upM=gj16ronHV3rb05n4l)8%k7FQ z@!3%boIqg&WGu$P28&=glt#esR4_r^{i~><hd$Czm*$HaKkC{;QLw6h{q1+?Rn$7F z^th%+!P0v9yRSuUF(B$~;?)#0Pti$KvvsPWNME(>sAjCQ56m_d7|EP?P%g>I2Lg+u z^T8|NADz>_a%^;JbWU`;=w8tU(SiP6tsTb%E`aldJHusd*cWkZix6dw6j#r4y2Plv z&7l_YeSZ1Z&&>P96R3H$=*TBBQHqkKbm;U6UmSh?jJo=R16zw>%l9e6;cuA<UAYG2 z;e4ePv;?Jf8xjB@a)KJbZt&V1OsjcLaZ9Nf^Rd`F&w|G@i-ZWU8I5)0m?+kQ!Gv6o z3n{-IJgcGcC6L9eC^ZLJ&fd}n@I*CpNERFCI0_29^<+hoqZe|Ss{*5VL0(Fj*6W8F zr%s&z(9pGOhCK9m{zH9lpFC;6%@2$8XGW6JJF+mJ6k4daqs$;_d)lSjCO!XX=ZQNe z-qHE?MGtiz_(Z>JLqn!*V-0ufZ2yDv9vjki*o@i3Ka;wv3cKGA8sY(AF|LDHhDzKm z8OH_|!U?e?irFR`BUqUuUQiLj!;WNFq6-*e&fq^tnN9Nm01kz`JW5+aShi&az}<zt zTGcQz>cp!?(YEPNKQndspguzmuU|CX{Bho<-tE>V{cyH(>%8{rO*`J)y0qqT^XWV9 zJ#bRZxlMH2Q+?J{b0^OKAY{(z{)40kbF}3eOG_+HizEF7ufSfs+R}SnoOfOO@Y&LA zzhNcPe&e_t2?%xYojQagV6|X7$Q72D;$ha<vg^IVI8UW;6lF^VLK<28g9srH7muE1 zTSLknJG6cf3VICZ2B(EyQagoKZxU5DZ<;fAi#~JA$XRno44-3O)Jwn5&)1T5aYR=~ zFWtLm<<Mm>?k@B{`qa~p4x9S)^4TR%`MX^~qSBSU{_BVn4AGYPT7eT(LT1twLz6v^ zG}?`nb;9=U*ac|s?2RF)K<HIY8UnqvKwL0lgRB4rXn24xUcs*M3hsctdqV3VSL0*c z+%a?n&<wGEh`hAJgapKDLwg~vknZ!XZ?-=F+T!AC^Fx=nHs31d`>!{<i^FImRL#s2 zCqmzdb7q=2*MfHQB)kZZ!*i5`Tj*{><y(mK%VcXeOyIWI>9DqHGI1U;3$Z@f-DEN} zLjMw+cSe$vTc7NF2+tA(FytA?lz(``)2UrYzCavsdVH2I{>A-^{+Rv5Uo&Q2m;v2s z%!=2xn@=nouhtwfV0fVrPc9VNs>gnRqOG~-k?~rC@#YVr_AuyBBe>ssA>y7+m;Iv7 z!q15cwP6X0vswV!RGd5*yBtxItMQ$cWq$@*`*&jOhsyQp68etVV0{P9XZt(0Bb~pq z0N+XS@4(oPlsI)Ie}@c6^c<v-+uyOnsrWmSu(qTA7clk{rIlL5-$}E+1Dmw{9d~Uw zlfjUpoBFSS4>v@Qi<(xSHA#1{F%l{{sV`8yJoVH9EZ!T{q`Z&gal-^j0&v5IfI9F4 zQ<xyQ2tt}E7m`BjC?_N>ITL0>Fcln46+}O0XK7brzJIs>>}zXHdFv+;rA<D+aQ2z; zV?P#E&Y8>hTpWC0{NYPAyUo(#MK3WhzhnK`CS;=9_nD_RPW<+XhUmIB_8Rj<>V%Uc z#myo%<Cd-@0qit?@pbSQL*s4eW{}Fg*#zV@lYl~egzr$sf#m7F4tnY5y0*alB{1*r z(Sd^isM5mx%{L!2#wx9ifR%$lY5#zh;}XNw<F&m&G76(GYL_ZVc+C@#@>0mBDAYGY zdws!@XVsfS+cQ<|x6-C+7qwIAmwH1jS8LWt)ACBcz|+^M?`mJeGo-=d2c_F%GsBeN zQrg$0FKZpucS-KUxocao(kP`lYMGOYt&r`QRvM<RI|2}xFV5LD=Yx(A5Q!XJ4MKoe zm?yTkH1nGMG;!U}tNeGOa;Z8G#sp27U-m;p0%)7?s5P=EgKgRp!@<Rp0r@blxS2)c z&T}9WB7YV705a;Ktye{6fsc%U=uyaW7BWU!IF}J=47k{vxF4{!N&5bvUPIGjbfSvK z)IJh@6**QO_f-m`7EG@EGe18sJBxFSA`(WPoW8;Q>xNs*(E8WSvXSphUoWD1_ZHC` zj+E*5?i^M4_jSI`msc2{{q@zLonuz~)yXG1|5f<>In}?U<gvfLx%j(i`bXU*S020a z)t4paTfbGBc7Cd9e%YYXr>3a-QRNxuCkyRN<@(y^$Ts@!6I5`&%j~Y+h`JRiN}Dh_ zlqK-6s6C1zb`Jp6gFSatldDs_5zcfmv$H&q^wUy`8g7z1bj(vTyXQqT>-gaK+pN9@ z{;O7Qh;J7A*i_=e_lhaLD%vNoCTA;SjcT%H7}td(WGW7_!xLN?vOG#dxe*cI)LzL7 z@&-gk=H8^n)j+9uc1ggL34O?wBOrWwvK;72&j#iv=(&1I3i0C<FoW#utYDp>R>5aO z2F<#$+tZzUOuauiXjac_R(I_+_5OJ0vw-uNcI{#{qgS1!*DOxGsgAnTd`Z4-FW-U= zo>Z1=r+q82>kdYQ<qr#Z`xN1p#2qNrV6TJ^`4X2QZc*EzMKp#o54ijiKx+vp8YmaG zpwppW*5o|-r${_%))iOqtB5u~I4XV<JIybv3ZE|S(nXD`W=J<zkw@x!MaA8|P#J`1 z&VKEc_8r05mz8Y^U2R+W9V4#>aM3pg;~TsA8<6^(Z@f{#H;8-DNp}Ka9t7?Ck(b}x z2yk9L?a}UB!$P7hIXSVo0fppfBZ7Zmv$-%iMEb;cxnjMEN*%Y01LkZoPK-xfPIjoi z`k}f!bbshR^=Vq;3T2~+@qGx)BCqpy@}w!1e2-u)lhjuQ<*;h_teK&(cNluIM~n%( z`0)mVSZ0B5g*KExq6hx%%+LP@Avdog-WSWj$u29)6IGOvn78)7c%3N}3NCTmefv^o z+knu;iL^fbhV)v9RbK;zWFsguOX-GNGN^P@E90k1pKBxWc`_=s%rYXl77@6(6EhqZ zVjEWRk8M!)hWI3H0=ETo=D<!FTQED1<3r`U!V~ZVDuc*QS|&s<*wo1>hZ+wsCgJV` z`o*UMFy>1yiLJ{QO^9f9)2K;{L~ZlD+8&ixwfs42j26wRranDq1~PYX1b~^nGwPe1 z;L(ZsI<(gv<`8Ci(%wXvg3Nj}N!ch%;koc2PkMM5^kni@33tg-spOrYdUV?ZgC3kf zYu2%gr)Ew#r~7v{d~E6pTCtX2v~*LOEA`}w_;=z&>cP@w7*(XD3wE~#79xe62+J+@ zX40Swq}gv8;!Q*Q&A%TH>m0VBx<0;BpWZ;W`Nvs#Bxm3U3|p0L-wEu3xB#<IXRO@m zS&;bWS(4acpXXCEyXnNqC#X^7&Q=dy@=fLA1#p<RuLwV9t8XfwHN&jFvdXC9iQV~k zScOFs|2uf>csfR9JHYzC1`qBDpfzAqmte!*BQJ7?fd^uk7je?#3D>=_VT^H52%uq{ zkzkR?<3Xnq>MVB+bdios^NS3XYph9D#P(4eHNryLc!&01*eYa`1IOLlc;aZF$nJBc zW!P4{mkO+EKoS@n+~f{2(l9iLO0u&-*{oq%#Ev>H<@`mkEd6=S$gBs)gJRSrGv>{^ z<Z%-nJ?h_{6|FutwWJY1vF7PD*P4U#Jr1ILK;R)%oQ(IssdQBi8Y$hnvt)?UgCrR? z2Cg@@x7r+Un%i%>;7u3%jUBVh-|2|IbR;0;dD(zbsWJC;YV6JbHR{)FOu}J(Z&taH zCO<@}a!(=Z=5gLalO0jL$`t`y#uax)!AW8(al{D|YpW?K88Rsv(w>il^T|GwOQIiw zqdAz2SSPoqPK#$xWuhg6K)21y^&PrYFr<3VcumdUv*huOZRd+hD?6Xsy8ClIVsFu+ zU1ss|qGM~8-P2(4aM9?}rFD(kMP+yYFmUv!Z>>q@dj$D_Yg9_3+|}{kz`OvF*(x zZkoDs!}Q@(X5V?_x`wkyk6F?7-djd2G&i@*4<%lTygEiyQ_J!d+%A30;lb}v;ifX~ znR>8>wLxrGSEZNIN9l(;A9q7W7_2;^j8?`gla=YpEM=bZxOmx!TlfS4F^=?mdW8gr z*CzbhnqS-UD`14ryYXvpe(lSzxAW^={CW?+-p8*G^XpK49mB5^_;m`u&fwQM{5l_8 zw~fS@&N%(f5G9OBowSC=#Bq2TI}I;WTH+<DO=nsu#C?q{btF%r932EJ_6!(9xQy?_ z;vonZ?ClgMGm?4_;cvkl>3m4`yiE69Ec*`XW5zhEQfV{yk8R?LA3Rx%Jz;ZgPa5qU z%RuqHCyO6AS&V%GOhBRzCyP7B8P~agFF08Y-~dVhTIaapJ5LthakBW<lf~Vs{918O zGKv^CxDSGSKH7aZHm(>j8W&eQ^JMYFxMDzRQe5%elf_fwiszp!o)%ZUfDo2#i%6&d zHYTSe#FK?FF-QoTVRbsT4UMRk8ekj-p2F@3K7cA()Z7eSG}N6;Lj6e~u1Lyln%68l zfwV~LpYZ&iKz~IB8?-p-kjKwV&+l5ZX#)pMRVUwn?^LzpOLq^yxoNYL=E80r+IQ=A zP5Z9ezB?Yc@z#g?-(O$<`?X=O`Rlzg<gbTC-fRAgLLX9k$K?C&J|U7(-#saG2g+PW zxxc^Ee{{>%{Y!rx#{UKD4B`L8`*)8UJ7847#IXa+7u3wIJ#J2`-1(|!M3-xO_Pll| zy@+1ste*XExaoGiQRy+!>iDo>$IT;wR8ec>mMtUA3tLKeZ@KA4pVn<8|Mz!uIluN= z@A|dP_ev*UDNXu&vit$(m~uzxbnwH75s*A<Le{Pe3hS&;^)~dM^VQNC7H2X6LCQ>z zli@#PB9rDq2wjP!my%oGsFuijDK4!va$lkBkmg4sn#>}BbpxInd5nQTQVOCV$Wu)J zd{wnqN;{Nx^2OG!+wG1`Pd%|(J)yR2*rIv=+jEW|Ki=KvQ+>X`jipzYUah_JYs;2Z zvuAgky6mwjxy{-)D`?%}j_YsV8oJ&WRYX~A(_yU{;#&i~zYeNTSC*Dv$Qrf<jg$8i z!Gwv6JE}H}oNl~09B$#kFwz|3)W$@#C9BTx%vxrdJl~K>-z<9k>*?y0Z=P82)pSiC z@%GdyCq}BnPfk5@MQyO%EM54RP&RhnE_@5;lx^@o{mq2&=NA_&|9Xl@`T?sRXkM@F zf^DECZ2c3BN;38Z`eRl_QX5~U_6@_%4m%9dmNyUu$DsmnRJd*?gm|<0AC6g%?g@6` zh6O=~ppqlWDft#rA(;e3m7hmpZEAc9mD)gw1vR~nnl$i-SI6&f8PWLc%RQfO8$YjT z(>|@`fw2cJ=AYO!`_=lln%`|Zrq(MH*+U*aTJq5czh<W8v^%kPW5Hb_M<~Is%-<)C z7C*q%|J%2aw#)7@yDPtde^*u-8_`zHa&J9O()T?+B``BaKeVDxqNT}Y=H>k&md=8P zpW9^Un9=WVDo$*c@bu&FkTk#BT#YUp1;FrXh~bh^iip>R8UcM?z>-UGY0wZZ>bkjF zyn++i<U6Xq5SWh@WhxW6@@A}tjt4=~{oy1ErUr9@?Sj361;Idn;<;|Qa<b(};=nIZ ziQ_Fl?(W#+)a0CGtv>`n@+BbO7K(o@C$Eg;!aDA|S`_VM^FcewHlJ8sV=@)Od;?;t ztrE{uUwC}%`1$%n0}F;UzqMmp;~sUAuWH-mwrkRIx@ROeYUeL37(He{?_2uz{HpDZ zRREsGk!^Y;wuouj1p9o__occ!@D27^Q@NM+`9I#GysOv?isA(nM+-X#aseDmG?E08 zop<GT6ohzBoHw8Ody=|)$)w3k@<t54Z^X}c_8B)gIBgMfWp5ug?Difv+|o7vwm`$& zM$H=bXgf6~hwbIQbL#7Xd$Ia><<9@bDH(AZSNKM3Gj9VY8<QGCotb*Y6vW_UAs57- ztcEkJT7Kc#a6zlDFPr}8GJW(T4~?GKp%`&~{YQ-G-}C0a-FKa))eQ%1jld#AP}Wk4 zxI(IexlmVtJO}InZy!xTJURY${$75#ja5IV;o+}R3;>(;;Tt}D!*3a0+9$M&>J?QG zH6&_E)WWD$QO`%c5*68B$_bb)HZ?XUwq0zmSbu*KAEfb+>bg4zKvu#U?mNiTwFu2J zvV$3!xfS78o@(6u)`^>i+WM<*&FeL5bX8hr{oEeSvh_w+rS|fDxo_X+FSqHHUN5af zlZf{H>tv_jC3mh(2`s_R6O|$5cOHNlDF<r}qy};V?E<|5v~wZ7FBR+@&|s>QMCB=2 zYb0==UN~}$2xmjqR`OvlCd6{^iudqW@8A2i+UI{@?s{JLgZ%>;_4?*_X*VIJ5zedZ zu<v!8R}-u{O0F6ec|h}?L;IgEJpz^rqN!@&8&sV^MkWK#B2y!CBHKmwiY$l>!1Tfg zke};E_9)=}=9@SF)!Y1`-MX&6*8$)TZvv*>eXnaR-PIx1nK=@3FF+Hqj5%=V_YydH z_`g&<5%nMppRDbPPZ;4yqYU6r0W1ce!GZ}>H-q;dObrITD2$9^)Xz;J1QEb_(Xsbm zv_5rX*LCgu8$RE+PYiyuJT2byzo13x;1(~*5iGM}as=m$!<yp$NsgIVp@$sJp&d4s zqer1E^qo~MAv-)s^@<S%3ax<CHLNs`<Bf9Aq%lx6uAt2mkKF)>qj0g$?_0p*Z!)4e zw!S!;ASpFr79VU`!uH0oV8K=*sCq`Ek84^-dV{KrX#Nmqj`%oo9H50zc2K(}R5Z7h zINeU1ZW(Hz=9?wS$%ygX>RV7ULd;hmZ{Gp87h=@3V^~oPY~-~O`A~~HS{CE3z*UA< z+ZW7EFMDOSK@EO>_H@IMP=H3KI~P`6RaNc3Gqq|Cei-j?15`(MME^hzI7aB2n~Ma# z<>_Zbwl>5aA<CWQa)jeh%o=6bW~Qe>mrUO(dLDiE!9gRIp4x+0qk+%teC|nvdDlmU z-eU8#Z^4Qu?|Ce_%9{I@ZBtu?O6E@<@|e(nyBMVVdVJY0kogMXE9q%yRz(OB*x2@9 z?~Bbd1mxIg7HnWZaHSn!x2NoYQA4AWs{lDmGL|PKSynk`F)lYP!KWsC^ZJ{m!%xmW z^j)H!_}Y#a&iX#vDelP@gI+i+s{g!Z*~O`ccCK9a=ds=ImI}CyIA+jS3Fi?F9ksJn zb(An9#=?*a&w-%maT)-^u5rwQDSOb->4X4EWz3X}t>X5letvY?#YN^RQFq4aacK7A zTQKwDlQWlmH&gZXDLFUl{TZ{53Lim_uw)~z>V895-D3%QjFmR@Y}wa{4zSdY+Drwg z&9sxEUw{=0qgUaFH);z~@xK`_36*8a3RzmUo}tC+>mi?7g0$2})Q+Lwb>D(~Gs9Zh z4y-H^=PEo^a4V!FBSI2SM9$8I5vwBpu^KmAgP#wpAV2-K&}>}`hH}(#YF_9BJvkXq zejFH;3XDoaSMg|1N8A53Mx{xlO9LBDL&%@o=84?ukkV{-n~h{t*N>%VsGq*nhCeU< z$oymUhjaE_Ow^N)ZruOXPlv|7*ANE#=cl#4MWkNbw&bhHFRYxk`10G^-bJ3n)uJo; zDsi&DhJ3QO{QJqW?b$wNoA|@@9V3E!{!PTyRMm5+T&0XWx}a;68g8hU{(#KmBwfu4 zee7F+;w_v@aRMkNum(-3>ty^8b}<7i|5%<9{t?(=7hwI}%YM=7;I~-Bi1{tAFnyO- zX@8f!??l%wk>G$`HJ?<HJoShCL#vI$`ub;P0@X_o6}?)#X5Qirb1nS$)x}dPDc7UN z2sIR{fM2uK)_!Cd^JbKw=PQhVM!;s*l-YrZJNEa8b%%BRs4%Y&omKmEQ45|kdjUj) z_K9<$zeD3~D!db`@MEtEvO+3ch5cX;p+Tu3M9w{@P7QU_8F2FC{cU(pcN)U8r!dHc z9f3{YeDYxiSlc;)0zgFiMnL|E<R4Ik1c04E2|iGX{uCi$_Rxi?G(@U4PO;>OuT{wi z-!&x%d~Hh(VMP)vo8h-ez}rjJe2_MX!{8l;l@1?Q{an~5$Ug{k?06wxGrjaYP_ee| z%Pn~eYdGm6-DNmvIukS<i<`PLOch+2(??!cdETrW+s}8v0j1b23PifTw>k~XPDHz8 zcY=DQkdvHUNYs`m&zCvs%>4IE(~lpgg+K4Yp@SFBiy7y|rKf+IBC32@{Pa&#&98oo zc(3H|j|<-ml~4su;>B1oB+3M2FGsOol_c{@)*5;9_8R%RAk2%FQX6=(ClU)cntQ+D zn1GG)`pvLH4YSkFp}+Wnk50W|ZWnzv?t5{)xj}qmR`V^`y=GN${^FUlpB8j$4J&KH za7#cfht5WXtcwNFw6?V-Hr?B6;&a2ApbB}4KtYlXkAZY*synbFD~Sa=B3NJMoN-@d z{n_mn3xKDfhwB#(y>j8);X{DnmOok@%lt6KhT>0O#V{04nGD5^;Cn$pk>sAcjAZu5 zkvrf&OJYuW<T!bmAQ{jFsevBEAOJ!F*ZgB&CQ`DY5Mw*fM4fHkqKhZ?ez|Il=++_> zBc?sR<E3?|NzE|czk0NhY$ivkwN{RszFGxc+z4)W4ER}>`W$=uJcp422TaqMYc)7K z38(Cdw*#2ns-Q-tL{2|L^gta~P)pV7U=LVzv#h$=WVc8BonzzonD{vaQ(L^sy!F;` zUyI@2>&MrvIkrKJ+1%%+{U^=5^Dl0EQ&hWe%HWp0=1yOIc-fToGw!`-eE-`f+%jwZ z-qmxTnMXXWF|heZoI?=aa$)C7mzOMTo(4y{2iDMJaa=ZV5rXrh*;+SSp-^9+lC8cz z<Zmeiye?z*Du@}9b+IHJhw->D;Mqj&sr`T_$c{vL;MGWlPa%tyc3FIP_{g_;`&QT9 z{FaLQ;@drMy|Y(KD*a)}u1K--X{`qBt`@LN!}B9(caanbE1w@mqs&Qd;&84ip~<=> znJIKVkW_!UT6Iy>%52ouY}9)04L6_;>Ih7Yr!+%davy$$#lnc@e$w(OVaz-1DIEV| zKayh@i5}_Rbg*0D#;#U>S0pFOf*0uAmn%~8k$01U;0dfML2SquSuI4J=FO2nW3)2Y z)i;l|G>cn>Za$=qDV=-dm^K3IY&pHO3xKr5I`Lnz+GxblDjr!fOtKA=IP5bCyLW&H z@~V+PG=<cClvXE(j}wzuDprV!k1^u$PUa2b;5BA}c~=K<(Cpn&ovg-&UJE_1W`sUf zZ%|ufUA2LUrC1k5Z3!!Ciy#tqRtzf}aE?wUG<rCm%4Y>Gil>*vR}qCB%tra<RUJeK z_RWQ%dWh0|QT+hV>Wyc;iDyMB-3`A-Y7ILi8|ytNZ@?gpCsB})n?z$o`bid$w>%Zh zOHW#<H7T8;RSCsv?R34dufE=Zxb%RsKh?2XnnL+Voh>a0T8$H1!9b6*5W&7f$+{Eo z7(+-2s_MMMj-{tWI#oP(8w*rp=RP|1@%huHKbAN2{`-cF7<B&-aoxJ-pI<kdUi`D4 zS~73poTr|e2Y5URG~R*y?|{<Y5O#hqV9(TGugJdQ0R$oq7_kh^S&E@r^a3}2FfTJ# z?9l%bnUU(L8}jZV8tDT7JchkjRiHw9Dt_?I^p7W`c;-!E5kiwiWN~G=CC80Q{GpM| zJRjl(;tFlo1Q;f+d#JLpYP$MZ=nGM&SGT+G8Z=yAHfH3^Vb_$1vyDV{kCC}OZomJQ z`(}^6d%%Rwf6+R7<BTR@omt3&33`0w92jD+lk@zD!z<NE7UjyK<RA;W%Z^gm3<*^* z%l$Ahi}q4n9rk+n!`fMCj6DL*6tbJb5^S&CR>R4ko0v?RIQ&^L-R~X!V8QL<@|F!B zGq-p5KDRCzKXIKt{q13))?%x;?b;r<^}qhk@goPdxF;oXV3&d8r`+3f&>c5y0{)SL zyF*I?g~g!4bqse<AU9&9B_%L%*?Y8!9(<FvNfaAXokhdq1f3Tl)J6o?Y&0tKASg<3 z{vZn^JsT959v@U|Klx;yd7BVxTAL4uyBmeBe)G*VwSMSZ@iAh(g@Wi^bskn!3o$v> zYg6dChjZF1VbBwQL@=HQ;UZLmJro|pAHl!j0FvAl;-0PUyfdmKaTUp0)nz@KgaioW zn&rF-z}HAM3#G%bPB6GAN4#P_l9_U6+i^?gPrmQTNIf{T&*>3^?`~N~EEAJ+&97op z=MI}Pd(6Nd13tKYNZk~`_Cf6AQLPqky4n=yEv+~(&DoMG6OX+kCyNT`A>2j6ibXp@ z-h!_ZVULmE{EaeH-0gtwsZctv-(dg=_(Xb8n`NoV+h2`H8`WdPf<;3nt~`_9c}mih zfqh2~(`q#}iW;|l{NnP}Q+vGqqq(<xo7N9an{<$R&LBQYorbdrC@sQx0CQP;<+eOa zl7Qzd6q^Bq;e-FF)6A*O#pF<l+D`p56s=xp3f+<@Yc?n=85(;7<YPv1EkBAftPPu` zThWn|k?rT%ccYONNe;=0XxUfQsOEsh(5ht-pklMAfFEWtYCC@`Mjz00=N+?3%c=!( zf)kUf?C4FCwPsm$0#cHqcnVM%z>kPCf5hG4;_EclGRa<AU!O)}D5J>V$_LnDBMK z5hHgGAFX!lP>`HFxYNKfV+M8^l$<i4!(F3Bni<{ix^ww}0qR5jx^?M$+x!8*ik@YE zsSjb#N$_3XYt)jyOIY<Pq&Pd~+|XorIqboT#)+lyBUN#BLRWyt_>Voi9w+RQv>lH1 z0P`b5UPeA;{FBR1@|MJ8RZkn+W5g57N6lF9<|`?p`r2nd>pebs)V=-3jSwT7b$DjT znAIDXbbs>$(L~*P$4%E{O`kTi;PxrNkcZTF)fYJi8#Tl%pBpXGkzDb3I{g<zyVUL! zij7l0<a<hO99WCrV!-={OY(NqIJUkUs{*jev*)gTY&*4=TA&U=?VyF~Dm6&9de{=$ z$HpQrEC&@$d%@>7M8W5vEe(ca4Q6l9hUbO^W~O*o1PgbN>!mQI<V!w^GZ&xr-gC|H z8%Fl()v{IZ+-6;xHto_Zu=bVLTHf5JdHzi|HqUC>G^<{2E>_;p?52GRUoK^BU8_7} z1Up|x*al}{6N(ouZe{V$EChsP*=}5}UPW%)EGuBc11BSxL}*Kt9us8$T1<|S?=0G= zkxvZGNDcBRc-uTd;1E4pIU^~X>l)`Bz>j=Uu3M4~RL<r5&&G#*AO&z<#$TkQ15YHg zVDoNx)e`Of6LZh5y{^N6DSMwgHtqcUy`PL9)}vp)f#Q?(T{{Rp^xp7wdpArxI%@4A z^Ol2;%{jP#;ewZZzPq1~owYx)<IRsOn{{(xzrtz#3$M<)@1AZAm)ufq$-%_ZYvR`4 z{othTGde#wURCdZXjRe3*fE<nP9eDn6_0)KfNvF?@q<Q`%>9E#UCV+i%SAR^!y+_o zl3~fzmY57BijuI6%JPS+2a+h|wdzUJadx&W?TS42gbb89CzBrPvco;DEv<d#3Dj#9 zpS(Q(t@<rn-&)YR^wV9N=N_(+{_^Y%`^3V%KcF~k2ddxt<q`2z=zQo)H4-&ie|c@} z=}YEs*xBK-GN0jp9+;mFE!QXYa@aHMe(StsI~v*Htt9o@J2R?D!vS(lTslKRLgshi z1ZkerckKsYbSX)RDM?llOeb;iZ(W@H{*QIjA77|mmv@~we89X`Jn`n&r#>(TsoO#~ z`-_jgJmvLTRo6VZ_=yhH`Yf6A<R<;O6>FaZ?H`3EbpmnKm5@>T4-1^V1J>m1H@5i9 zXX9Alf~>SpB;Q&1hNK8BD94H_K~My?`1EsK|0%4|Qn9zs(snSIy+}Z+gql<Kny6+M zz{e}GQKsUR1gwgPaGZs&#L^|gRx)~tu1^scuQQ|68l54)d>Bwl3&ba8Lg)pOV+cAE z7&<pOE1_ku5M=}8zkp7deG)YvDq2c(WnHhN{&quYiI#f<cc0>7k)ej6Oss@p@&G(y z6`qqFy!qciM<v_EL~<*7LVy2dNlI;9PgG;OLYHgXMNJC*5U5(3D}ILE^euwUjb#bi zG5-i;$;>k%t!l*xj6*s+!6;0nb8ZIuixXB#Z|Z=#QevZ_*0CaC;5ghJ9akf+VH_eb za1DBFfRGej8(?uAu6}{Y)A}A_af~a}u9QpdvFM#>#ZYn+bh{L~Wn($LLx1j!Yh*e1 zg8s%gVOEw2s{<c?7;$isYiXIb-uKyO5xZAd)|L#M&N|qS(os{emZ#z>Ul#vRYtv-{ zV|vcc)byNm6eNf{>9HNr&4|0s)kBNnnZ{k=rlc9w(kT#?Zsn9JcJUu110f17JBzg= zX;n%=)t@tFKVQ^L^&3&TJ*vy?KHo<l`Xip(u%<|#xM0!z2*22@=HF|c8L8_j#~0VX zSD*0qH+zq7Uvuc?2{>O{bFZc>cl!e4$il2VEY{gubnMkZ@M?Jx#s(n-aF9g%8nIfc zmZP=PdT9mP5N(RKP+O%vuf3wZqg4)THG;b^Jl-CcG2F~xuyF{w<X{QBrjU&a>PQm* zPd3&({vV&E<mPMpJHRZ^-<%;Pnltj{4>7>(-a)La6jd1>fZO!jb@L06iXZBx(9o2s z*fH6F$H0Ezr~Zup$rC`vNSAlhY0w(9F`)-^^)0rQ!HT3hwki$Qs@8^|tyRSc5>c&N zkhz!*Kt~t%%hLI7`CU?j;nmL$igce=T3x)~)?dAvIY#T`TQIkG?^2S)Z7aJ53w9bT znGx(gg8{f0p$B+Pv7T6=)fiP3$->IL9z5Inr!hI~rUk%}!v)dQF(!MA6)?nWGeSGm zUTZ40#;Z;Aq5o!&54Z6JJvP1y;l&)sQEh_^Ja}lO(>^<RTWi2eyx+>ayE<&_u$%dM zlc|X9MLluel*tnfE1#e3W^_6rLcB&;5DPP#IcMZLS<#Z5ECBNQ^Eupz1QQpL*^q(s zDw%8r->a&ceM7s|Zhh%DU9GH(&mdb%FHJmF6;#?8+P~Ru?Nx;BoEV3@Dss$Nd7trm z$ggYn`TCY@!Nhn5g0;05@N2Bn(aHKGcFb3Zjg5}v<<42`FQ3p;Ve)4sR48d&Izy~9 z2O{~iS}0b`Qd@>f^+vGTBqI4!H>(i*hvR<z%J(=dtW_Z+4zcS)$SNW=D?(S>J!U9z z(h!4U06}&Qps@jhWE76XhW_p8@dluHgvFX%;DbY{;5JHB$gYv4pfW2i41v0=@lESy zCi+t1;Y>VIilS2=pgIvcf7d~!s_)Ixug{B!lD~!j{CTs)*Q`uA^O^bc!w;(>`rJol zYQNCiM?NcE_w%u1KdM@P^*rEAJM0TMSA~2P?XizBuG(-8BS=o9vj5^RRK>>(wW5k0 z$;1a?V}g8zQqAB&)Q~PWJ{iSE<8#%i$Ij^LFJI+f_(NA8d<eD4Mg;!)T(mLwL6Qxa zheex!h&Azk|3?!h1hnde8*{McTX36YgCZh5)rh#7qrEbxKN?{TYe;m7$5*LEd>_$2 zARts>^n`*UFU;dEse6)xCNtYonPisAIddAB?Rn{_{R|bJy?RKnrV3T+>G9(`4B9{W zr7t>6o@h=HEtfCUMxCB}QuyZ;iq_`To^9s7F~9zdkH?vp&(xa#+Jd${^&3UZD=n7& zHp@KoTlJ&nPq#5;)kdbw4>*k)&__}{(JEm)#kK-6WwAxyGE%wBUb;wNvgGC^2+Ts@ zo+tPQLW_%VbTLr;dc0$nLi1dywBxYE4)bAcxY@Vk%YEPb_?6917QM9p)>BvMzP^ZW zRT^Af{L;D?^`#5fENN3Gbb-#sj<-ogk4Mc@vAW{uh-40Zn24m-st9)RI3<nPWbRgp zxK>Z;4Coy$cQ;b2(ph5p#NX{|)^?CYkdB2k%?hG%p8X_BsO>`sD+<Z^=GEKuHXM|r zqJp3jxWKfL4!e=7MN#b!!YWQ#vhmI4Mf?|A?Vvn8kD!Dtx&b;yQUV7XCFOW!Mg*8w zM^-P94D1FJ1EV5^ACeRG{GmRkO_MY2;Hbcb6MM}8p_k*M+l+o7wQip~awFr_XT^hi z-wefxA%)LvT`q1a+U4tO=9?k&*NOT>kzk7BW>sTi=#6D_rY%!(`$M7#{Ej_V0nW`Z zgsfEt6KjIC$1u!e<<Q=+vqu7jjfRGzQh1c?dFA8Zp^Sj*c{WaRiAQDzP+Yo$Ga3O4 zwl^BvCACc08$PH0sMGd%+X-;vXUJ`;cc@omTdRw9Spg>J?F|AW;c4`h@G15)5<MI) zY-f(Gmp0?1ib9;PfTq~!i#R-Y58)(~oJ2g1q<W&CR~`D<XxyS}o8Dsb>64#tiUwEr zE`G|qAg<cAg2@LrtN9`<667Q6<wWHmuACOd=1?2<72fwe%#ktNdmYyfUF{_N5oi&Q z6K~$9oA>K#iEh3qx<cUC;_EAMK|6`3SAyN}UNqh265<eK?FuMiG;CW)iEdpW8Co=3 z4mIcw5T&6zfY-P<Pd3DGuz8MJFx$yakJs)AO|p+!-D_SXOg85Lk9*P)({dSmLvLWs zt;}7%aaeN<;)8F8xt(kFB1_c={Iz<^hFxXuh2=^?um&P<6#{4_Hmf013SvBv)U9m< zA6vc-<2~RfC6-*K%tteqB_*j(P0&jl>+>`%^nR6OJ?8`xw!bXdf?J@wc}R@(rJH@s zyMc!dksuSoN|TV^EId8W!t~Ivq>?alV{|1(?;wNy#;&4?B7m~LG=f?^M?!Z&ob;La zh&GLcXmYFoXUWolJSFm($}*T_{Lo%qtS>R+yQ_Y)WjC>@NG}pwuQOYyf$oT{Ji`Ba zs_kHLs>%Q0OU2&$z~6oVH*!75NLii=v|)Ja)YXU7>1JyhnNehkoQNEuszxA_^Wo#T zc?&6(9(G^7E??c~6XfPBViW)HT(KPzMs{yEF_@yYkq5Rd{XqY9$B~am4FCK4qody( zseig|*BdXsQM7i)F73`q^Old8ziY$tLG#mc&oAF`%hUHwUbAq<w6VIFY|FeYae5S) zq<B2HEauu|S)m)356p4zOGmB|$^Kj{pAZTMksI%$CZ}g9NDJbBehFf8OO6Aws9EES zWSXqN{$)QmOehXR6q`vSu}b2`e`Wt#wq4f^@%?q7D{2QmcBrFt;BSOr<`Hx+YIJAB zBM!;ui8}~`MVM95VHUUu+@mMn;C90TFo?Lq?mO*wJ^XrO=#;zAu%g<i()A~=sGAY% zSy32|50heDIUOP?h{BB!G-6qD$8sp<Aqd&R%3VT4LCpt6!;WT`jDqcLYsc2Sy5}R! z%+yXI_G@){Y42;Ft(+UxeUL^SN4A11J&yH6E7uy4R;<H+<l_$OcG)SJR)~9NO1@)p z?@4;;jl{fl;xWVy!Mz2tSQYJ2JTnnKen0a;DW!zbV3^2at7t|nYlpbRJ;DkrXS92e z63~;=dQm1&dsJ`y_%qg3cH_xBUCpa{4X!a!%Y1Lwiso4=j54et`g3{zy)2#8<6pJ0 z_CMcfo?bXMByf*06zCrF=a!7o#qYZKgQx~jupj~G`-}1PSX5bxwqis7BlKAUu$T6) zM?qHv6<6>ch+N7fy`+h?7|*#_H!Dh9_z-_@-K?@hCzNmJW({K;jwBf#?GY7ZaWM)v zYgA4YZdTl-o|_d+HSA`U(qkS=jLyyK+e)I7IZ^DR`_-HxZ&oQK>X4w!j@HeJN*$04 zeKWA;EH#2Eb%;aSqg<(jY)~X6P#j`ktG)|ep3#=X7#6E(@5PAl^Xd_Sof?sY2y9xt zOZ)hK*ljCiUzP)%wQDD7?JWO=EqsA@-N3yOxQj|~7o|alL4F~KTjE}rt<&kt7m-A_ zii}@&!@x;3bZrU<y5;B_+(&Mq5F?(w{}5QKP*fkA_GB_=FoQHHZXizNlf5NV+`IF$ z&_T8Rz&&GjyoQ8;?+(3PGVJ8+*S|>+gUnY-&mcB;_Nn3PR_;7xe)-dyW#3Ob4C_8* z^Ri$3o3WE*aNNm8n!FU#+*rjhVh)oWY$+#PB#eoo#?lj!5MI?|_8}d`EsbE*PGChI z;!m0*A%Pd#Ml=@4VaaTU61(MsTK$_XGn$EDZ<OZOKBy?PwQJ~I+$Lul{3dFak8mZE z7g0%N?D#Gtn8IlzFs&w9m=#7PHuK^w+V_i5CCHI3RdPJYg{UspB|%PJ3du$1M2cTx z!B`|9zz?)iC(v75HSy8cUJ~1Nv!!`1>zVapnmKRF8a1=ZiYbMwOGc<wL*HsQ%$%sI zk&}UKiCFVRUh_?cV&$8XgjV5|Y*b?351O8olh0tZLXIxvP|$%}wiaOL#SsxhKTlT+ z%uBlYr-)YH3OyjA)SS?}YL2ef%Qs`Ol7{B40L2_uL)F;`tIx7kCoSye3p0pwivXMJ z*+NPfNcoKu9heeFAy^ZkB31R&A2yUA>k6nI?kU%TlS80RYzo`KQphTf4Y9yul{5?! zJrP*>VV+*YjIBWYRBs4<MR#3A5-4`Q3%4!FNO6ef!SOT2TRRU^S;C?pE8MIR6D{{g zB;wk(u|HP&!uA)w8R<Jbs#eO=lR_U^@)K&yowwI5MJQS=_-Zy*n+X0C;kl>7uEQ|W zwy~R!!g0|0Q52Al!VlXCTZ6qQAHn-5js?h3Leg<;k}Z+_i$C<sZ)Xd5p^sYR_d}Vd zVM3T?Qpy9ML!l#BB-V@nd}r`$3_8I@a_pAmr(x?26EeaiPzQA)nTbw>-z`i#f$`Hd zNE?-`25YRFz$|5XWYs|+N8DQBLTO*!l}c5va@*Lq4O!N?%5=lmEDz9u7KaM+a=lzZ z#YXio?%~|_s*ek(Kvt;9${^^}bHjoqx`qmBAOZ7$>)FFs3^!bY`mARMGN{WuSqf8- z=AINsmCEbl1GxI>c2I*T@0wTzUD)jy8Gqx$D<`ipe>6`IJvqx~oEPzzN8Mw-^3wL_ z4?Qt$(%Mk3ZR_SO5$l&NDN1bKLi7{Y#jf}jJ-9A?5NBR6_olBAOZD$j0`Ky-ZT6by zdS$6S517Ap>MW9tPVavG&1u}}w#O_>oWijN#b?R{^EA%5vAIhl-82@RGc`+MqDH)6 zWMSdCVL}qKI9myI6b(gi@HrTnYxn|BqYs&4Y!1N0Z-?kE%hRj=BS=@0yd9{ERn~@F z_Y|-44kI#Lt_x$gVXJfw*DF<*Z_W|ThWT*WP8vl?%&bZRw>0B8Qa9|MC7*}M-PK^T z@mYMA02k&`4&$>n@)?Ph__jjb3zr1Q6p={zmn?uIv@RpBG3s2C1P*gKjI>e+U;JYJ z;?=#8Wx8~C{tYLtf*9V%cj1D+_m<h>D)Yl<R|Q24^DDJw9Vw4*!!7j{AXi>D;FZ`k z5hgS+1H$1Ne(5PijdeGDfSC%Li^FVP+jLloy;iOTq2uLkT&j|Y-XS$0)zm~b!x$rm zvl)sJ4Ql6%gmGyHRMD{vs%XfMoL0ywhF-9tKq8b&*H~;+m*0Tp+chG<ScMoEB2FaL zNgF{*TU0&(IkK_1DM};?bPa%flcn|k!u)e}asGn&+PDvAd{I_9<>K*A=ht3pUfKJl zPwW19qDcAUc6HVA3A5C~KW3OEU)^=j$<U|<(|i-mKi_Y1{40{+3SiGqW(lq~xMzfn z&h&UX!{BezlTlf=yG9msY-P$C4>OFrjpN;DGn7E{h;Se?h-NT@K>CDPoc5BHQ3n-a zMN`=}UTtt*M2$N$>x(jN+5<=C(56IS&zHW^-Jkmk&2N5vblsKN!jJvTe19Z1R5DXU zen1-{JI~Ls^GN?hvd2FWwh#BZ@<u}#q8go`QI$FTL=+*d3Kuh(09-R0aa1?N(1?jA zYaX_fA`m89&aM-OqB?L~X!A9*Yp1tP|N1H!bUxnr+}q}&nc`sRD&K-mW(RHk(v^p9 zS#jUQ^+oeURNyM{mhSOG$07%a{Lnt>hsIrjA~bll<G;cv*x@5peG~`68}Ry6!fywJ z2D(^>9oXWt<u-zIg7d&K>2N6Wx_m-d=^jc4E8U}Yq13Q)X<>J^q?E9Sno?eqZI7Yo zj(W<*FzXw4g0ZQaH$wy+sLgRKD99O0@sDu5i=6h+cFunRvi>2QA`jKof5>a=3PTk3 z=*p<YG3YqKW>eX20uV%mWD19AqcjP6`D8k31agfs<$*$+g(od39p&w1Yp8sxko3<0 z5pk8+X7&w=wPt~Tj1?r(&;RMC!4KY7Jz*m1I{g`;mp*_fkz+G;@r-`09VP;ttq0rC z?SM{(QfNe3U7?9Tb1g+1IyTN48If#3&H!{Wki#68k(LpjE)0bAFl&Y7gba4-;x!e8 z<_MUnIjQYZd!-hn5-?K%Ojnm8+j1)TSBl}=s^P!}ID#JE5D=1BXS51N5syttA`D@7 zR=WDB*(!GbriTVS@W8&a@%#4d*<0!Cfj*Om4&1gcTD(qeOvK*TPoas)Pv`WN`h~yI zzU2K=`byM*ht?i!jcP`A4fxIfp$2@IbeD}7sB9ZlnRt_Fzo}zIN3p1ohBs*>5CrVH zH6U;mZB5WE6F~H+2H;m7Q3~kg0>VhoOd~##m1g70|Fsl6TtKiIaw+)i&`)ZW(9VC9 zg8$S``4p{nagHj%H&|v@f^SHb;7fOUl0m_>>p|j82A4~Qyfg>rN9%EtWx|+(E$RNZ zJt303Jt2lfPl=}F_^5yF4H3pdNENiu!f~1;p~F{GJr147)e+_kvNgnp;&)HJU_L2& zm@kMSD|T#NhIV?@&96mueR#gQ<kj`-4iDdg%CVa?&;~NWwUvk;EFXK%%8?yE=vZ>0 z{<y|l#E6rs1iXbL2U$s58G0gLeW3J=Hpu_@l@b1NI$JP)&`J;~84pMfG-4zqan~n7 zCbueMv#@4IOxjjiMkmL16o_FHZ8ZOYsNjvAfEmdRJR?Snl15o5Fv6k|F828BX7~i2 zI3lhpTFJ!&6A$JGuhLuWpYZAr&5v!J^K!#R2WM?QrY8JtzB}lSX9G%T)Ps+hADN~8 z^CD*cJTq?e1QA1Ab|Co3VXnH}-H7qreHCuNqu(1EE00E%3YHH;BBFkCIY0?<22czv z|26evuA(+wasW9X=QqDyrkHPUKNr-4uPod9>1XLhbDudR8eGZvRWy8i+u|MOpBL(U zYF+}oX^p!qc;97c65blsE95q>#P%4fHoR@N$MEKj@D0Jy|41Ds1+yHmT|$KrC>IP+ zXJoUmQBhqly_wqlz=Q)An;+dW^OeT^%^$ZN<!WA!JghFbqC7ibAeZqvZ~iiNgeVd5 z=5OCYPk9W&(>;FlLsEb#*jGP9YF7sA<8WVhG-}EF8u<*BEZr__Q_fB239$j1c!?<i z_i!4=D$}|l2qHY6@WYAq=r{fo5piasI{u@XvpyNGKm6*L7k+-^;ArDlwdvD;JvRG~ zrFl>P{n-4=Pm38Bri$ukQm3DvZhm>1FdqG$OR!SH_(#fNJb^z9TUg?@&w_E^uD|Bu zzQ!T>{{!47c9_Bz$baJgq=U`$2GPy-%y{*O{A1hZ9B9zs)!Ca)Fz(;iC$z`^@u53M z+ql1Ah8Y+-QB)@Q55%shsvPa=K@VQpAy8rP=Z)CAVhpo)^$!e-VRv8nIeE$1Eh2|L zKR78hJ6{IMvwvMh<+yP#xA0%Bw>&WJ!1rqNBin&uIR_pEiq$R?S3mr~p(|Nxm)q|a z8Gi&nH!l;0&7Nm|M?2~ZO4)-QRRu;pU_?rcLN<^c+rjI$H{oa@wIW#ysg<)cr&haK zxYIo50f_0YdC^FgBOxug0l}nq$V>=a>qwX&ArM%nL+Q}yhKDSuUOny1WNqBL6Zc#w zJw4>mi2f_O*P8X?s!tNs-`+@?`Q7|p%l@AC>s!5gOgS^L&2<f)@Ll!&i|L!FI>0#8 z{o9TG)Wq$Dx_`1G<Nx!zf3g_h|Gn;?%xb8x?w@mdRQGS(CofxN|E}NKDb6nYhqMR% zMXT=L#(ipSN^-CY|D~qtR^h+M?;3q$mf3axz?-R7<NN4vRGX^&FxQhdA7%yiJ?79< zTqX8JK#p|}jQkNU=AjHK3CXxmsNX?d3NEUGRtG+-%n!BZsluT}@7FYcJ-gNXbLk3E zdHqKsuC|``)8Xa6%@cF}cv>uJBMyA=+aA&V?G|r|8;oDi9e;PTd2-)1`^`7Ei9*6c ztlJ-fb;}x)KAEQl4J53_q`iJy10ikC4d0?bg|Hq{iE7xAsXc>A5~N&onqDQ(AF;%| zw0^Dm=dz_Da@~3n{ggiI*JVq7nyt?IRW$l#mb(9hxoh7Zas7!_C&cx8_nW(qi~XYM zwoT@#J=eX2n`o<OdccDEIdlcgPzsDn9?805sAov1L$Z#`up;UI75>E;;qHgbijRRV zNpz-%Ndy9j?_93=N6~KcqxDaT${RlyHLK~hFCSa-$GoMY(v~^DH!?el-&b}Y^s2b| zWY$s9?WK=j+wtON^Uaqt51NOKzHP*2gq+feROS;&gdGtTEwZvn_JhW5^944g+b3dc z>=cCTk~tai)4hT{EPY6t2m7)RDa}^}B`yAOD4U-W4YSSH?|MX@OqA#(B9{w&-p^0b z(aiWwH2!sly8n#1p|4q%AtD>n0bPAU+;CvOX`JvK6#3h>n{VxDv)_E@x$WZW1GF2; z4>=3@E*hF{XCqctyNIO>Hc1~W+S$9Yx!ixQD&=GIr4OQadegdOy;SRF9~D#fi6+~& znkV;DP|+5VRHQv){<y_oY?ud+wmNDae8E5d%1diS9pn04B6FikGSzA<vNI&@3iH2h z9m8IiH~-rKuQ&hOkNj`7vu-{iW~chD+nY!66XdNN0~`$^V*X!al^x20CgMuCpnh^S zQ%ph!or30<`Cl^^qr?PNs(~-mm*!gyZwvCuJyyT4m>p;39<!8MmCYbpJl`b9uyjLE zVg2R=GGv}J^GPq4SI)NvQY#T*pH}*W+UdrdpI!U>1%2$P$uGV=@J=&At5iq)*?sZN z3!gk%IP{f=UMRe4>uqK?f^)37PWue&u7-@IXlu2Vq<z;8k?=~aR*;I{YRsC$nT`&~ zi=hX&iSmFFSxQB+4+a`=9uAg3xH3v0=V|ws{-X6VTm1w{x=h)0{8aoahyD-=m%r|Y z_|ev8w)*>ftA3tx-&J=A<@DkAYEf5<0qO#EtbY&saK8`SaQbkwq(q2Hc2OGlU-j$8 zxJj6A9{2VBi06w7M||$(^dQDO>feQD!kpqhlTVMHnP5Hh8uSRC#&dn*oy%61c&^@< zYc{X{ERU%spT|x&nhU|5u<oW?Gxk)UP#@yapL(Cn!Uv6}C~*8iX>0EGt;YFL2K^o7 zGU%<$GyaZEGPYjIay_f^B-eW^;IR6@Hy062iC&PRkw;G+Zkb0<7>|bR@I3~#PmUbX zOP|(mxW06kmef9v;|1&b2A6F1W#0k3y4PH-{o$LBd-qPGx^?fO|0oH%w%@=*P;feP z)frBm=igwQ_1FQxH$9H%Dv6vrU%NUbU_;q(Qs=8k)254Pke!0dZ&rT`wd~&I(5Qpo zPWxfWx#z1d`|OwyZ*L#5yjeSRcRiwqp1ZkSneyR^lE;QO9xRgH+y8A-y(3_YtdziL z*oP9ai>*eo)R~egCq*7zm<#dW{aiM!Q#_<A6&i8TOy_a1TgT<ZL1HY3qk@TXtLS%+ z<rC7Q2NJM@dW2%c1jC?)01uaqP(UY)*fI{?&)#A35c@OZtsY;2(V^<*OIC#>F#z4J zP(hEX>6LsS8k_H;+*F)ZAt??8_4Ls1ak0KSv0QBm=i1HOt^LM)xsj8TPyOt0u8i%# zGw->UHwF9_da|85tn^83v+vd`1N>_c+YVbec+eNVwMs4Y6S>t8vY!YdjWYq~s&a0} zPmLz>F0vXCRXKrz(T0BW$UAiNx&}t@B7{ljagk|u?t^0@8Z42Tpk?Q$Bqu;rz-0wt zh?0<##oO~g8moW)*qFn^M;sgb*^k=H-&W3<7vJKx?MuF_ck0mKXYaXVv-#0VQFGVe z(Q_w%J!`@5v(3-VU(7Sd%oCfh$*rELR(@_#+mNU<@#6`jkB=%Vlhvou_9dV^qkv1< z?^WwP`F@ojd@b>QKL5ScoGU8heHOjPx7O{70?!H?h11wtb`g2tWWg*jVmxwISSChT zzC$`Jap^?zt`XO$k-||BsHp4-4NgHwi<99G@+Wl!yc?ESL`SgQBtzx}qzJBJ1vrYS z1;aM(*kg1P?Q@s+UA0Kf6UNSmxA!pjz5UsH`(_O4o40Dw^x0}N(f!(P&mTbQ(B-qo z``v54u<_|_`&(jnZIEN1pzZ<;;<0Cy`v3Y)K}LxM{mn7rB>f>^HP)g(o4qpj*;Hou zxU?J9f+_HUpq}@=;zO;;&wW4Rhp`YJ89DTMEJ`)1!@Q<Pm|w#jD#f_XT%(3G|69F( zAl*PxgQM0LMCfliHO7V1h5+UCueWX$Pi_%aR;o{%KW&LLpAt7+7W!j<FEgJJ530v> zb;oM+^A}#;ZJu2()MKHC#r4Af>^c#(ObyNa|L2|s@~0H-3~W<1l#zyF+0QJx=Oeb2 zZNA9JicH+b#%d#ni^|eVjVc@$1U&Yz2-VMF=Qv9@LJQ|i4juG}<_sh&!6gOPn}gb9 zPeqRhb+EZK@9jy?Z9%K5`OD|ORaf7(O&5dx!fZ2n@sT$|ZPnMF+w?|ZsJmb2$Buy_ zp(^+mG0yfegs1wXBc{;W?MoQpl^i~X@Je^Z6qOA@93em8>mGu%e9%t(gY-h@YGeP_ z%`ZjG&`-X8p`ZTNdX?_bdg<a%#DGR)Jy~TJ)sg-I;H^`QDxP{ad<olt<@#{;8#|1I z%IP3_1T7g*OV*WrjX(`<C=V}@$MXYe)s2&-3KU3$gRLKz6Kss|_Ha{eZl6Op5*0V$ zmUB>|0BHUvGA~_1%ZVM`Z*9~rGQIc6LE4ccXrME|JezMmtDAF2JQA5(Y4RK~M;ABc zi@GG~r32O*f(^kVGa<?b(P^zzw6i<6vE)vYQl+y}E-XKKlsJIVkqTv@R1O={$eFQF zIaR@ov0<ZQoYCu*_e4)?#+a}%K4;8eWi4h*mI8#c#wuqyvB%ldP0skWqASLumNZrw zcNSn}SyJw0svL!Ajn73@<uiQy3A2-LqyII0o(&EfRK|(l%P!+{()QXir0PpZ3C-OX zOMwI_8w%w|j}k{P8jwQZhrKU3h9D(pEL1+KV8%EL3UV|-L5?1*Y{6&?3eNKr&Z6%$ z@2@3R*__vVm0WMx26uL*9$K&8n*B?Rx!@T+N*N^Ai*TKQH6{VfH9AP^l`|HWO{ieT z2y3*4(K!f=w?_{y>+Y`Cd4BX+a1mZF?eB{qVM0@0?|N~q!~|3Tx1l-{9{+cO?J*`- z?n$&3H{00i7)H{q6_g)6N|+dpGk|hdCu|JuNzPa(s<?Y{W~>`FI>Q;gUL=TntQj-H z##D303|7wLsn$6;GiIMfnHk>qUhHWlLmsV#i2}t9?h4ojLgy53&0c==C^Z42u_y4D zDq&-2PjbdWk?qdN0U$JE_-HyOIeM^i8KbTBI?qoz%b^_>b*%}eVSF22?<j;jH=`9m zgpIaVa0g_n4gQN5bFJKy0{zfFCl;)TQ#SgS(W3<9JDM>ir}(O{F+Vyp7AntIFk?>G z=(nBG>j9q_YsSW5V~$v30?J@it+96Ptgz`>lmX&X;vEGNof+4PEIc1P1#4__wm8o_ zs)HOwJVp7lY!zU3m)S|%?(2!qQ6P<Z%24JheF3LE{vYspR|`(>V041yY>tuK#;o$A zM~Ouk4LHHsXJe=wLvWHa7AhNDI5{(BSul{JiPzC+z+hCF4FhLv{j<eQd3Si0qJ;dX zF&gqTVQSgnvhVEGGDXv=+8kvI#%y**2b56_zoWIf{G{v*Mx6B1TIGC&W$oRyI`dil zqzwE){NaDj89lfx4o|mE%o*+SlkJd*_W9q$_#1h(>y;fiFRTE;t0~t0`+@c<`@hGS zn|Mqo<()Fq-Vxs{v?H5Wlpjs-H)%%PEA|=5F|;Q+V;KCM88gG4PivH;*DD+48Zo1N zqH@N=))+b?)84f+U%j&k#AH0(%os(Kcbl~%SW4_2IcJ(=J-__uQKAT=u_Gk+C5Mfn z9myFB6{CU~tA>pxs*<AzqtBZ|SI+ZmoJF%lUT;IQyH?DcqCc;9l(<W-0C-}rQjVcH zX$&9$redAD)2p=lS@ay_8TnohT)}85(F|4I5Z$a(3g=JzFh=sHp~`w#f3R;*b3<z< zQa-5S%(GhAD>_;8*f+T3bElknRx3*p4I<}ZJ_8Lb-5lk64bp59ykTREs+=QRT$SWP zN#>3rjHFsNhr|Hq=nc!4wybW443Y)JlS%;r6FL{FC8sFdlO_etIUHLe!olc6DDGSs z%oZ3?G7N2gk(r1--80nmq1X3skr&szbI0C0SBLV~wo=p0lj<6?*k635ci#t_6=XGO z)b;v@7m8=i9{%Fe7TPS*vF<QOX|KT})<|itJZr?YXo=^*T!7|va#s!urH#~s!d%bZ z6{{omt~iK_-;k7Ss3{cnfCdfp1Hjms6WtE&4T_;iy9xG4u_QZ1`^ZWOH4_>ov`+B# zFRtg!TO_6PDhCJzu&bSS(89B%1%qln*a2ePqzMtAD6U1u3l~rnKoF1cKC)<NgA&?* zHh<}hqVne=dfTccuj}7#e*SH(rVBsw((+I8uY5aUV3DuO`1^;id-SOn)S@{{mk(8E z?0J4wsKjU==>T-t#yJy&xTE{fd*+cG{scJDMwV<Kb%M8!LSbrKR<Y%oyFlC9nOjkr zO^gwfB>zDRuG$vX%6aGplJgXb#0n%Nn_I~l>Hd*37AnNitoz4trl*C?Eu6X6h>t6n z+rC@m+}oVF*NDCq%x$kkuDg{pcM;-VZX-&9tY(jqGk)pJSfs25CSnZsZ?BQ0$eqC~ zjH$;kDpF2Js)ck?)7r;)z#5?_s0P~wyaw@a+B5$7I0O1_Tjm_~`MX1vw<YI*%x-Hy z^2XeY`Q`mO6rG|YX$`o8?R$df2@>a!^Q=}5$~9mfTknzcyz9)f8h4;(&12sVay`V$ z<veS|Dp!v4Nc>ValQV92W?Um4#GcB_67>lN&}ol?E42kzs-Y}3;yv*;9Jfc}A<-?% ziZ<QyWn<H=lNDVfnd`{HUQkd2=7WXwl7p9>&)0aR28=}>og9@rU4vOMibBCY?Fn@Z zD@H+n59$gTPL28W8UAT!LRnh-RxaT^8;a6KmmX9<R!@Zn>JE)PGRI%6haM+>)z^HU zBN7@w&VS5^l=%yYNN8yBE9YvWeb)uQs%!7tF^c8Lpo1K6rJQy-*qdvJCZm_@?Y6=b zjOrYWTU^)MrjSB%8+y2rpW<U=y%Q@;nv8@{?1L%g_U=S6AdKPBPbQ8%HF4M1h+;TA z{Nbltp#Y@Mg~omDZ!J2Dn1=rA5*J)rdezb^^G)+qi&itfnA-LF8qKp+2R=967w>EI z!|uwDy!-(1Ac?m`I}+cDly4opwY5-*WnVd1R;287@Ybe$NEN>0LE=Hk$_Jk+M4;(E zwKN;cIktkO!0vLiS7LQSUu>ye&YkVdy&C+@<`eew<%}mWM$SmI#e4#ipRG^Gd5D+E zHLelASFpwg7RQh?5-*c85^Xtr(plrx*67V<f$un55HL6K7jdDi0pQEC1kk2M&LZ{- z^6h|kU|sh9=nOt!9lMbQyOu7^bL<Zhr+peM<Ff8}y#>4LL|d9MA*a}q$jUwd`rpEO zwba_zmray<H6*N{TyYunEw#FT4^}px=UHFYq3kc3$1~<ljA_T*QO+~8Y^dap7~`|% zS%fh@|9WShp=Ehxe^~R_WB$aLI?NsAJgdv@mRRO_);_G_8~;nrJgdvH%YF)9k3xCC z*ZGSv2J?`0|7YNESqPuTFzkECPj?e$Lk1Sz1H?(?GuJ5XU8s6&5t5Vsf*guH;Ei(T zpwd`PCVzrbXm(fk_+P{4G<Q(xDK_%wB%#mXGeb2L#`izm*&XpN(Si|rXj)nipiZN` zS`UvVox?uiql`<mOEgksTpGu?wB0PADw+7am-TrZe|`{J&-c93COrEn<r={fJv0j2 zGV>h%@@(*ad>1*PSivZziI`|XH(=o~o~wP&(8WCb+zCAYShGO+ou7;E(&uGg@aMo= zcRb=T){2?_R!W={25rMF%jbJ>{x~i`k)JNsDnI$>;{)g%{P(b#0Od8}aA+!^Pv3)E zLw=7wS1yM(;d7#xFPH|T-Ds5B1keZW!fs^W+Ds=bIZ0h`lvpVxCs3ZP=Mbd7;2mQg z-tjpH()(C<$9MVj>+K!mxx_8ybBn}Hz+>yab#7<-zLzT?*+s6PNTKeflJ;#%{fabJ zhOPCavYsrLNIO<6zAJ51Ljm6c`YvQ6TkersB2lo^BuOrbpfNaiTYi-D5bu=ptXBSZ zc&9C6$$5x(%6S~#>Cs5#JU2V@Y(TQy&14H<yPB=p$(c-NrVYxEfVs57W}M~vUpT$P zIKAii^r%D^$+Uaq>EU_REnEcb)P;O{eJp&vEKd*5v+ZJsaeB}3>0ur|rTh7m9xw~k zg?xJWF5~Md{#-tnPES6!Nclu^Aw1WX6W8LoPx|T1=(z!<s5+k*o|<5->`qYreJr)Z zXThsK1xNtuD1>TTw;qDjK8aV~*BaALt{ysey|8&2;Yo6yLgj0hgV@wlZbs6`X~uw3 z_=uz7v%QY^hch#*+4nI&#LR4YI>MHxhs>_pB!&y-;Lm%MmEt_^1ROo%LC4b>UJrpE zc*f)NDE?eRfaG?$@*?F=;FLuL&dTlEO~Qg8Dpy`Ki6II|*f(uHo)6y-Ml`q1@ezJb z7S6G?e*iweRer8);?MKV9^Ub=*6(1RoMrY<3*7O_IOTi(9INy#3f7kM<HU-T&qQlF zF^`N-{+_m|w(C4gH1e+}4usQQ$v0^WKFRf>p1et6d$ln_T2$V_{L=ohUU>n&SImz+ z+Eyo?hi_6j&rnfQ-lUkv=KFG<{mwi?l}(5<lk-?NiM1ZmGvqw0MU2GZf2`*{XP(u{ z)2MG+!Fqz^FOl=C6-B^4P%7q0I?H}1?4DP|7ErmfwE|Kijl#~VokfD7<n9ckcFtTI z#1LmLcxWtJKh1THIh~wqgL1{0EBP$4L2wZZWv{u^NBI*}Wjo1JSJ$~xNml1x+P1>N zDyuEH+ZB-vUlK=&Ahp4b1}hFLe*|>{-RXnnC2lHgiuij@CX4s2oH@jmv8QzE{FV8K z(0><;e}h#dbN$Dz+R<-RjL<G<pOw}-e(~Z7?L#1ovKjW04-mUh2R5Jtjzq1%PLf6` zK198=F(w{+FT7=2`EpD_aBjM3z~qoct{D8FaY&4Y`2>|G+?ZR0w3OSOw1UXoSB~<` zjn`guH~3PMJqvd1Knm>g#m^k7p6}=kLl>>@_rN=^t9wJ&Zr`zZf%<pJ>m(bsA?C_5 zP%Ea5Lba01!B|43GqNpuxLf?iEc4$kM~jDX{ubA8<Y}9x$P%}P=f+b&vxU&h9UrCR zp|E{K(ppH|QCbTNM>#V))<T;SdFH_17%OKUtQ5hQVc8bh{3fMsxL+B&2Vf<G`L=4y zD;b5zU1ueZbZ$!>;Bneowr%2jd^-^D0__D|$%JQQc}>o^Mm$x)jP@-jXM7gxl{2nE zE~>LTCo{kv&2zJaBIhPv=SV2dYHbNc&i#!wH*UKL%qOtc80(h8vjX4p?x)H9Xqi|m z_5<E&pKSlKi-B?M(U>L2sJnn27*jo`_*!e8nPt0tXMzvlNr>|#xTtl+B>VK85McZM z>{~X(7v=vBqvzUCEDPDA9Se99Id>VjJau|iv&73ZT6|VEx$Iu$YGvm;)jzKeo&EXh zV%YB3>Z#Rps%!m?&+*PEs}7q*Ed92Sek;HW>jD2S=dwGpVO?+G#L%YVk@o<Xnpmwr z5X7gX@sRg@D=ab=9q`^L=Fo<J`O%}qLl_O%LT0f~QI3glW-L^uRxqQDAv~I76YKfw zm1*eWB4@O3B01)qH3ruA-Zg9raaNdkmV+ss9pyMPu2nAM`BLfw|EH?m&Zz!!6d1?n z%IjtO@%ebOGxZb3=Pv<D<a=LI_BTGKIOB~Brvnz8w!6DxS)1TwbAa-rM~O!yoPeh` zEae!2lbo>-ehLTj&Wtt;c(k8jK%)VJ8yy%pV_nZXs@8}qyxK!@wPjP>xmnw!)%q=J zpc!9wM#E3mp3fB8u%(NY{fH4?p|L@hkn<Im-BQ7Pwx8@%NUf2)RylfbStdq%{bclX z*H4DM`I<2fyuqtouY4|Xz~gu4+Ty%MXj_b@pSvqypEk{D+n~#j9wpXbG_VSibE>s# zIfnKmXDmcqo&$epMq6{?(Y!`EdcCq+t`RfZ8ju`AXC%iAR%W{Uc4n-5w)iTEgWScC z_w=^4r=Q#vusM+SWXoFRM~@O@JH?(@Mv`^|IfnKmXDn1+t6)a^?%~mVPIB~MWr@39 z=lQN*t2St$l-GNT*E>qwD^~y=*2a8Es~=zm#7_ds&{0_yHHVM*$r-WwzBDhrLno~X z%P{r+O~&kFjOuI~Msu@pe-(j-gcOFWEu@6`t85D~MYnr`oZzpDKZ!mlmTL;JsouK8 z)g6CTdCM<5tTbxC4)y-D>dGlE&XWDuOJyr|Dq-l#Dhm(|g^YsIGV04t{Du0JGYr9B z_(rxcGuri_$T4(^a!eRzI^oJT*70cnQD^iTF~L1^XSA(d%ehr&bP+Iw;g9FrGZH;k z3eXt3!Eg_c;}P&*)Uaqraw9rr$&H4N;Zyc#FmeQ)vK+Dc0iFXR?0Z6vpmoy-va)n> z*X`kHz-&mbTOqwtr}7%glmGM<*tqaN_7?0+MbI4eFt4%d|2tO!H#u+O;>)w4ah`_f z4yrsdhkKtpcMZW`LZ(PrB+m%Yv+o1$QqCOtAVaSZRw##iIj3%0xOudnPD74fjo20Y z)NL=n97E?J$E*>LS1_Zk)jtj`8C}xlXts7pt03V{LtfXb*1Ar+v#`WRhh^=etQa>% z4s%s`Q>-uRBe|-_61x#&s`&}m<d~sl-JlnP?|H1g@8DUbygxZ+by;id&yr%C`_8g8 zD{-*Urn7{G(PXzhM*72U%#q1-L~{g`HPsz>Iy2bbdvqrU6%&QRiUZs&6vN$JvZmza z+*<)FbQ#C!*YG^DOx9t`!5Z+>JDC?8;U|vDuw^OhCI!|PXy^=%Z(;<0GlRcLwBvlv zw$6NCRom8SpFYbuVI#?ADIO`kC~?f!jGry<+)?5<b^xe)Y?iccbnC{`F{a!ZH)H-F zzgwjID6t9OwWS+*7t*Q8yKpEZC_XjZm$ke%FrS(nvszgx=P7@u25LC-Y*0d2C!{&P z$vM#my8({)g1nm(d>*3^6KBKHw&88WZqOMTGhqzxCV^oozf066zgwitlB@98;ci6D z$zwb}d=SjF$GPXt`X8NlwzV%gny^ETE>wtbS=i`|W<My_exuoidOyq2EO9<uRzjci zGihCNmLi5u`B`kMRbyZZ`YmHLN%w?fRe5)ffhj-oS>bc6ya+ms&53O-v9a01`(4Pq z(221EDIbt*F6D#u$`MJOkT`6cwH!m|EXNFmm7LGnV*!$5i2KMftCekX4dv$vkkl^6 ztQD;QGid>;>d5vy6JvuMwLw&JM!`-*vOVsKLUS&6hptN<z&+ix9l|8Jfx9eJcyX`; z8kP>jm&{g-e>jQLJl<2b+MvLLH)JCp=_p)O*KI02;XdJB0FO1v^LCj2er|CC=N2fK z7#ZGf8t1@$pqbm8<TET3b6tFLc$0l1wf_%$Zvq}gu?7BCSJfl|0tx#nq9TYaVbQ3# zE3TjdDxl&DxNs2_6%{vB#0~eW;tndJfEptLauHAg5sk8oF|3A3fPqX1K~$K2zdAiL znIPWlz5n;V_kHhsGvBH1uCA`GI(6#QsZ(`Mi<IW5&q-<MX75VUo+xx&ofBiQq!kG; zNIUeLq@12iTeYj1)e`fa^nw-fUT`htfM=v=6C{mr(ICx4@06;tCi#D2_7~*nXgo-r zq|TH%{~`44NonnveIE{Gr>PHqW|7UGMeJK??V+`HgQ0izL2QHah=;?5x=VbAczi_S z*HPlf)7p@}V-WABiMF`~+QMJb+7aK4NfY__JzVyFU-Ah_{E6{=M!9I!nfK0<_|M|$ z2e^2Ds=vqElXeZI3`U?2V_Vo8*dkD|iH}65RYOb3Ua6+pd4~ow0I3_g<}_C~a)%Gv zA#&X&dCeXP?xX4C{uSIGD%U3^@2{5Y4sso(mTly^WAgqIxn}Jy$Um)tTq9J)-{)4G z(%cFX*RrmHu0GAJ&&2Ns<$(sdK8E)@-FTYQjdShFKT)pHUUAJzhJ8k^PmpWl#`km! zRwxhL=RfVhmi+!o8<y0wv4cLY4Rc?3yf?Il`~&U92i^$(Lr0MftMvJ|q3PWm`jIqq zr3@c<NBAGOG-!<zJa`)ZFJ?<V^W$kw5AsP_oqNNzaLDa~4CI3k7QO6pfrlkzGN)6X zC^WEyT+-BsM<gjgSdXKCR*p;MwaU&rBA|e&V9XPXu_py%vS!7qNSa&y0;5wY*=KTp zq+GYB556zgm&!FQVqTH!f$ka|hAZWV@lraBo2oskNjijA#<k^AW=S8EdFW}$9j(bS zw@9v)1uJR}-;|E_{J=Xlz!PI-Vulgq=<wunbZJ6<0#k{Z=Xi8<A;D!ZDt(}@OQuP* ziR%j|3GD=XLH?7q!55@ISagGV^4{CMIe~7FvWYy!$RKM)p#}7&Vfi(WY>$pQ=%C4E zA~!N5J`aee32~K-?TcNSU#F(~jI^`nsh4E`&Z$I|%_a?--#U1NZvwVWrb4xkhrZU% zU=be^)jkQ>*m=EkqlNpNf%9}=JNN%rZ0zR)yv!fRtsj*eoi~5`_g>-farYEI^~T=& zbBUg}$GiOU2L@d~bll)K7v8w=p0`&`ec+)9clWvOgW>NFyy43+pDg;w(arvx;J@vO zv^1Jy*V8)*ow?TFJDobs`z3k3M6eBKp_Om<rYEtT7+nsbcm5#zEYJv%W<p|xlbK{f zTl=3lptP!#gI1+pLKSiya71^#QQq-$@DA_j<O)<m<3O4}alKToc_6MA+{aQg{?1e` zC_4p(OSYB!`*X$pxuERPl|Frjq?a8`a(#|mPooddki8~laXgI<_L{(35_Q<0FE~F$ zC6dQQjEbI;or&y*ZLa<w@m?h!Qugy+)%^K+HF7gHP5!p5?3=jrs!t1kIP|s0U!Ui- z+1q-z*G8OI{ZV?@FR^_NkFqWzyz24<-corNK6{)k!U8x4c!7WZTU!A6B5AJd?%yU@ zyWLZ8IyiEozw<^}?G-Gsw!ro4q|B6-JI`JJw>$d%Ti7{MPo6(t@`HPuNN6P`cKyxu zg4_Mlco`DCAXp7@>z~w`T1^-zs~XH+6B65rPGFb56s%nJ(79DBFe2Z%HK2qZ5YEfW zmD@=atX%c*UV;Kr=elm3N!ZrxpZD#0PtZ?!f1(fWpX2SCHBna!(j->Ef_&Ua9+YvY zS42LkI$c-BDqUfar`s_flyay?4%O1TQX<(qR|&L?jQr`XNKZO2*+cDN9V~UW<MOW= zpJ4?!bvU>@p8Cxy93<D+5*T~bUZWPX)|<xqwWER;?KR%3a-AmE&-=f#yTk3a3Xw~? z3VAXXJL_(5vGmJV<t=ac7x;zoF+YLd^X&bq$mQkM56N42jkKjxTe+2`l>xr#%L$5@ z2tRtpX+2b*c$yu-evG;~$vNa9u~~K!d@hiB)786Pca={517owyBq&<!1}N*hYNo^s zUzGO-qh*i(Xd4*pSo%4@pLb^!#U<segtjB-mw(qrDBxz!MknBAJ@{I6(nd$}b}gUC z`!)FY@50ZK=&9d7V^`bd!XudVa(x*07o@TFhHa$7=Tv)|`XfO{BF{Lw$SM*i9;9zd zkNh?CCFwbH>CGm8Wg>kFWylIY=`W4-%xDbX6p03WUT&|G_dXo!S;HbJ$WA2}AA--4 zesHXhy;68op`#Tq&ztCfO#F?pzGl3%%Z_+_TR)%pXGou7%SrlGlK$#gpHzD+;`>Ux z^aH^M{eb7&$F4S$1s~{wx!!+VuMaIvm+|i>sqX}KFC|x4llW;G?>Eii9eahMx5rZt zWTc7rvZQpFNWK5NT-hecyO^zj+yBWPg*pWJI9?Lu^Pj9~0~;5|OU~fEj0^wPPL7#O zTB%_00l}E82g?{RR<47d@_)WJ{x$Y!=A=2zhbtA5wyN;zCMZp0XGfVy+qHy8I=B!t z4;I8jolp|ju2xl+Z%N6!%0@G2XNR+(orii8tN3rSoewI?YZLI(przeBAZY2K-Wdm& z2UMlUv!uN;-Pw#n*HW82_L0T;yJ!?$ZMqcYbr15t(cf;yyMCsicUSt{eTmc}OuIgw zQ<QgXklNvVqwF^d_|47U>B;>@37#JCjd#c~;2Srqr-GfkaLz;;$w%e{K|VvhmQ`3t z@~yhb9YaB$4ht?%N_j(ac9Y~pRjGqrg@4~}Hkb|lUAwrXl<75!w|~Uebad%8mTS46 z=0i{1cP-#qcz(PEWR=UcK>MP+qXL}5mD!cBj`Te5>ULw(MC#<8gevNLgw(I6Hv<#l zAa}LXyEu_v_9<1T)=|h}i)4lt3v$0YY4exd<#Bis##X`T?Ie9^-?fta&1y@~zDW9s zkun&w-F`ARX0tLlRCbf4$QZ$V!O?h-%TTqTs&&Pofh!|Al(_aJ$nkGm<;iTs?F$QX zpM>RhQi4hDv|%5C+xsP)7rQ`4_JoWvNqr7yPnCEajWd&u>mt5_#)k@RZir)eM^*mG z31(I4*%V~%mznpT0K+*++LZq0a<A&2U%<I1r(4xVZKf1$RYwbV6Dmou!B4*B;G%?n zff-Ebu+WD*w@;oMXVKiqbJtYygJh4bdM-EC)4nM3#|b=_?tNt56)HW(SxYh=wNV3u zcs*a@9lgvHnd)r0J~Y-dlrGN~1?g-+<sEq5dB|y_%Hz-fA?Xi^l~t2>rdc#Pw8Fqx zSv7fQnmr~+FJsYU@(IR}DfTVz`ncqskS%1~NV|?S0f(M~tagM;^Cuh2TN3$rGub_Q zYNC~su4(Ed_YIOKYolEfd6IrPv#&T+Bux%GC3|Tw)>Y*{Lw$FE{4<mCOHk&j{AZ~5 z51fCuc+V3&lqSpnDc&oRd^=fw@;^98@5-N(_Fl65pP~S1@Tc;3D9SrIHUF=Z`A=6r zc)5x6srko!S_I{PG@1W&HO>Dukv@qZ@{ilAOS{X?I@%Gs7GE9Er?h`UG7)~}`hG%! z7OIfld$g=P^^s7uP)Fja<l8#NrJtZJoaLO*jQ5H9FxWNDjFA?0ALVrv2PIERyDM3P zPw-aUz^z0;HMHw-sd%Z%YgYBV;yhvhyk`A%UKyQ}<;qw2-Z}9dOO&fxUeRQ^^3~JO z@`1~>HksGQ<kjad@?y;?=o#!-ej0C0f6B}C$%MQImPOwC%eG0Z`~__jw@8+!ut=7t z=(&Gtn@;hzSseS#Sp!lc<}b+G)9hsBd}Z~IRXD3T;?W66{4L57A4qYo{|ED(Dfa!K z|EKIhka<hmwZXHLV2Zt+^3ebPWGPuEna?|_FxXL@vQr_L{}d$iaW?X`<M||3*n{%8 zelF#KFYK-A=dzo@(J!(_yq~zyTc^1;r(Ue!&U7_O^pm71AR}!1fZkrDpP!UomH!O- zd6G{h^Jg9u-`^b6y(<41%FU4Dd@7kgRuD%9`MdI8lJ59OQ2tNBLz0iA=I@*(x^|)b zho?FG2j%}1oYX&1{<&58pOo(SNRa<@wc1Pak<|PfCG$74(jH0XKV7}$?><oe9pd>r z`Vl@t{<N}qvZ2j|juKRtd{07SFVrP`gj&c`lj3{?DoZ?-#8$$(Zy{;6q`SIzl+;tq zxdH7V%fxNW)Z^UwFs(Of#>La{xf(|^DQT9*%Dj_>=E=v=wmDnIwijc+iIys1<u%RJ zk-qS7Y=`|pW(?he^tQw;Ju!z3JMZbd3$2Uvkz2*WB9LdD4IAmf#T2`VU9OZNWqn;_ z*t8+Rvy$d^WChZ|6BB#if_%m%^6_S(W9^q{i=<=<Ewu~UBFNLx9_87ewv)0c`{3fV zw}1XKyvzgVA73-sKmTg9otl5VJVE~ZlI8ytpE)=Dsr-i&<+ZIU|KVxxCd=<=yIvxF zGXF!9GFFg(Q8NGOUY6H0kv@qZ@{iXyD8IvJfFDQOm5KDJ`N#Xdw7bwY?dYh~c?hDd zrn&Y{P-*f#iTyl66++v*#XaS$TIDIIBk@%7ZHd*JcbL_Fl72L0dr49|Tefo&sgv(W z>^g8<V614e#s{gr323t7`h;ZOiPZb&-NPGxfV>myKl|t11K(JG&O4Dh$ou1Dxu=90 zuqP*8l4Q9PyO$(yq57cQQ|uV1e*bbOQU`fAN#^bRLJdfyPUhV{K9U9H{*Kf^-tVxl zG&7MpiIYU?cVcCsPtrm`-qLr`x;XwypB`(c1-VH4gVLuzV@$>(h4|wVJV4UFhnzf1 z<myY}@xcmlU@_!)73pdHDfZWZSM9fMIV<gY((tULc@QoQ4`78fp+hB~&>Yb(z8r7q z3T8KPj3sx>C-&N~258?F-TW)@)NfSj0Fz!F61#Qx&%1}$<p6mnv{L)$-9r@}An(K; zqabfr|DfDc?2puc|8l4Jj<IhG*AB`(#Xbnvj;BtRJ7Jv{<n3gKAn$j)3}lCRYLPzO zn4j1)8I;@EM+SLgmxYD%{&^>MC)3WMIcd(~lDwt;*=q$|(9ZU4>v$8nNPN)FhcN!R zm3YygOZ)^GGh~h|ba8o*K2*aWL_SUyo|yhxkY3vS4e#<qX_A_h8gZJIT!cc%MN*#; zP)O?RU2-(Z9N%H4aJr)+bO4E+M!}5T*`~RC($qU6#WIatWG#ffzoVd>{;1`fBBPJX zuM_xZ=Zi9j;U%F_;6*ms4sNklmPZn1Nurr>J9ly#IfDupG}ZFGr>3dC8S`x&=ddxq zt{nJosoRl(CrLgaTlEnU_Z^zUQrB?Z*Lma{6?KmeK7rtz(&JsyedAHAm)u7WZ2t+l z$IKr!r?7A?A3uma;oY7)Vee%#CXb!#K8^D3XCd!*|AT=;ydyn}g_d{N@Eg6Sa5=fR zC>*Q2Bltkd@3hV+zms4g@DI|~Tjx!H52vfsp_#$Rp7~jaP`4a{VBh!R*nQ5&D!L$6 zXPs8sgnj2pa4P<rBhvbC6&J730uaAAHX)QL)Y2h{x2+_88tJ!6`igjZv_GUjCN?3} z#u07xHxhpY>D}&wHmWj6?^bz8pG*2w?LnTIlE|l;_8?C$kod1i|E82@Ly(X8MB;BJ z|LKzdo_KkXQ_0_@cl%)4s6_g+lIicSmi`Kf|AO=fOZq(WN%QhfbGf+M=1OW-5M6A0 z7h69zA#J{-{fSs`7FsEJGzVvUB{dpViLWE^HDfuUK~7T!&kArn$$y%B>clRyJ)BhL zof5=*8^yxJ=_H+vb(-o$yk^`{7AX)3qq({zzhSW3y<s-rg%9>7B;DmXau-?DQFy&9 zafr%?kgNQg<m(`k?t~>C-@L3R-|52Hbd_fi=l!F~5q03?M83V3jwk%UTdIdETyYYt zZ;6fd?p?L}*P__PufCe=jpFi_MTI}kxA(_hFh9(ivBI<W=l=0Wtlho=Gv6FPOaFhY zHlCBu9Np04djI+B&yKmLvY`Ch!PlSpu47f3I6tuX_r?z_-p{Li%?RS<dtdQSKfe*X zBzO35bH&~@-emprzQgs;x%$oAeNG5tCZZgj9=H@vP56IXDK3aTpZnf>`tg0!yc>0$ zeLHoXTyOU=u~R99j|SbY2Nw<0z4^6LzH6KuEL<s)l0a&aq<jgJ(flmI(mj}orhX?l zKRrvnE1O>ZTdCQ3HRY3ynM?EQDd$oi#JLX~JAbo$ya87{-SA|Or>64tx!bqrdPl_8 z?9fBc+INr6KTChT?>O5h*J~I1F*i0<Pv3XszBXX9J=iQ@glV8|&94`)2ZBzr^!p>U zdg<$AyP+fa#(GsN=clKO3-f<hdiR~Ds?s~R#8st#{GYimypZdSj*Y(Gi<}j!shgjv z+wJ?&Mso`bbNAik{T!>m?-O{+;@Fl@qr`3(g+|8hc41t|w(Z$>5SJyA4U*V9GA*_R z&lqkVNE^DR6#GluQ`+C}DOdNzQ|?{0gb&IX!8=;{rNTA0m@UEwWsD$~n8cGl?HozZ z$~O{7cIXO;|CD^rm-IV>csoeq4<$ZL(u;<e{F_UB2Ul82FB)R<cct_adkvAtF3hiu z*Z0KUEfEJ2eKEOG<(gB>cpbCMFtteT#M!z_Q~PH6()>)h<+@`!WYv}d9eR?#c_0=u zxh7T-+2^0_?acJ{oVL&3s5^!B{ixf8a!s$j(;Ya93f5>T*}(kFl#(SC2d*&Hq!wA= zOGqsu!pJAIvhzYXp{w@AR98e1Q*aySzEu)0VdG<5Ax+KL@3}fwu_tz0ckle%W4!aa z$3~Q=#V+$ET1vim>Z`Asi}z~BL*jdqDC5w4n^MMV2&;z5YLZpLWnO;WS^@pnt=4-T zmt)9D$F53xEMaZt()3Gw{1FINrNm>(y?v+08pRr%>h1eI8f(?VTkWmx5o=YVSM2Mk zKi_w{UXiOO@4H&Rx$hEJZghrD!l2y4s<nD@iR4eX{flx767Rw8s~Xn{B*A#WYw(?n zIIa&+^7^~Idryx&8+-0_@1AYjV&i+@bL5g9v6pu1?0r#hZ_MiKTyIybmA4_5>EsC6 zck0&n+`dz;oy2{<(EE|DA7B^!Y3zF9Z`8{|@0xUVmiLl>gHqRCdx}fV>X22k(<oRi zybi5&nOrxP+}NLN&m^}rd^)=HGmx9v7sPc_xpwI{vVS2BpW*KQvs~}tOH^s9K?8T~ zW+O|)ZwUMlUU0i^ioP$<4JCA%fzK(oPo-y&CgE+AU9kz<Xs0(!^?l>!^vQW)k`pCX zWJLB6eF5d?tvys>)to+Qb)VRm6zJ<a^8Ujm^;A2CyyH4dnMu2D&)P<IptliiyR#>W zulG!~SA*&O*JfCIi2FTeA1^vXmp?i~N;B0yQI&sES6I79K1u`5nAx*GZ9D1F7E1d5 z#2!GW8t9SyL8O`~`3HK!sis3!{z9g%{GlR5J*QLkk0AX$vQv3nkiRakTBDQnjz1^U z2fMY?Poq5D;^kRTrL#@yCD1z^UZvNnEj!1MYvSckuIeT=6X><#dk9!N#50b=58Ol2 z-&a-sB>q{^bf2-I{JRimpO*al1?kP_v~C<fQXW@+c5laZ)XbmpX5#WcE}p;hJ|0h> zq@60A`Ky9|*S?N5xb_-c)xJq)n_Q9gVSIL<?A8B)gw93)A853gTWfIpIh{3ti=SqP z$y|9#ENn_-#rMp3{20->xb)K{JuM{ZAD8r_(7CuZ&$t&y@_APJn)Bn7k{(-}0b+|Y z3LBl2^u%8&@h*S2-?R<BOeOzNhU7mj_FLQ=Q?K}Y@057g=a!_o9fdi92ln2olDN(` zu|np0+GnD#xgefq6u6~-W22SOelPYf$4i`hFZoElrmErKXPSR?s%J0ibsAsM5xiA- z*pl=gNO@jCUtL4+&^yS-)C<ZP`%U)Uw!!;BP_L;HKau!nL|@$}9=|-1KGpw~nidN3 z5j;qGxQ4v<z92n#7$S8%DqhFOgF2?{+LwK@&ca2pe+!zy5<J*dg2&E7;@XX`z<-M8 zChGf&<o|@PQ$07KpEs&Lc(@APT#APx(oYvU85Y}?>Y<4E6U4^k7<4wyY9j7Yi1-OY zCv9S7sUC&M|0jt*jCxHHFF)O-%<u610{J2V^-5||Xy5l`|IMYOL6dU1_%TA)lGrPA z7_|y^5R!{v?JcQQd#K7;5VTP|De;F({E4yO(mg5V@j-m3P~tC){T2#V{4a~gpD6KH zkbf`-M*}7K%#-;3<o}lB&)i$$`@8tqDl~`<Lrds$-RNHF-legJrM4}oEv7cilV?l% z5Bz_{is+`FP{U238VW1e6I?zY#D0#gCw?C3uao#M;_)RC&n(?LF~klD@5^}n-dG{6 zbvU+~IiWP-7uS@0{PQG#G*I?fiC-R1|FDZ!*ARbYC`9^-c>2d<m>dP3GO(~qbLHe3 zjRtmm?)qQJYb=zx4#s=>g85FaS0wJ+_HzA&Tz^Y>J-KEa3i1;x(KKfz8eE4?l>3Y1 zS}ZED6HId!mGSo%$o)VU(~0*v3&1pI0m%K9T<?|Z<#O%rm&^4sckQo*TmLs+8YI8J zZ7b%m^RA=@8_?&!_gCRk-yxP|TS@JDsq-%Zw@TT|E%uO7|L>$e`{D1ut`9c61}_8P z>nq8RGT7Eq2JkOsxGGtO1XpdzS7j@mgrPmD)r8?<ONqiIA+xj~myqQ8*Hm(c+^44T zR!pTDSBmap6C0CKOi=Tcyd%XHfHc)8!#$HqSqGpLTUXv$mV9R_<%mxJ!R#Elzdt2a zqa0-NezD$Wu6>=E^w|7%9XcjwVzP}WVNxkpl!*@mCmdnPT)GK9rkc3P54JQZU!*yr zW<zqi2Up!q^3#rx4+pnN>R<D-+Z^GhaQMusvcAkes7)&(nP>1d!b8&<9(EMp19KKN z=@Kwo>ZGx&iGTBo?-h2-%{8~po%-VH-13hX7T!AIx5CeJM|?gkckSDsem(Q+H{SaA zQ*+h5kB`4~+^3VqUpuZ<w@uIGrNyrFCWiXGbj^JepC0qTow?q9Gz)gw6YSOYN&Kn} z&Nqqg0|hz+ky{c-5TPe=QEg%(;-#CL){Lt|YEo^RtZ$yq{<u!f_5;>5FS;bIG;p&& z_q|FKANK0p+`ZeVOhdj8G{L({x7k-{pWOF@?(&D*jWjCO*ZHu416-fqBIRqjGQCTb zM&!3d`y^({(mu(e)vF_)53K${c0Qq5<<l#_Wm;UVk;W(3`S6mn6LH_Bj(_GnjSuO{ zcXV~#RkL#!>=?21kuSG2$ZfFT<4=n0y6N7aw%)Z<zRHMQ?Y)`dH7<SYrO4<nr@!`g z<u@~yx$P4N;9?D8eL~HhwX|j)<g~E*ZrL{-^c%MuH|RHb&Ss>6gQV;p4SFwW;=T9g zdn5(DH?c=?1U+f9eF~mXE<NFp*!|UZrM>N4CGi7e_gCAM_O{zoNNE?x9;>#C<!$f0 z_?Y-mwOuT4vuD%oVsR_|AsH*j1!JXK>E}#AS+ntK?AaQeUjYQ?Zl~E5@pH}hL~e_p zo0NE)avnmWd@!CSjrb4a=jrMc{C)&^vWLjC@$*`$ftMXW&twE_9Y3$F2C|<sNMA=? zgxA^NJey~KkDu378O%OUS2wAf@pU*t-Jq^h*Hgk)*p_xi0_?)sS=_ye_+e@YSLdkV zY7q8it<<T+4CB~0`P8j)HALM?$`NWL;b2ns<>_mH+kjR`bk~!9II%;>^LBE$nza4o ziCejI6ZhQPJMsRY1V=MdI$q-3^-<OG>zI;X>RWE046Vqy6>lBEaWMJcC~x`)aW|=J z2~+FUsoGWbJA+7nBRINV@N+9U-at;SltIm0U2o%kuH?PAH;8u)7aR;G&F!4Kw~yfb zHu7*dJQZwTO}gN!`ZFE4e_(95cDaowyCeDMs5|7}iF~T^>O>hvfYltZnp%!qiRnel zoz5KleDvdIum>i<aBABmTE;k1re_SL+z0x3tQce{6nxOTM}nH{DxIcmk28B+q?!%7 zYs4^h#C0Qv{6pmqyZW}_XbY^%gw&dYO}X;0+^M?focmT?8Dz(dK{wxev+640u@asn zVUK?d88KX)`{$7SJt>g~b-Q!-Mpr@?qG(}7U;f^@c&ZGJHHmMn&gN_#wK^RB)0X|F z?eLk<o_^R7I?NF|><SegrH*D+eGGQg$I%MM^OeLC)k(DIb?P~I7Q6QF+Buz_12eGi znT1b<W$ZIup;oF@YPI@Nt-%VQQ2mTo>9xFTJ*!|F)h6|eDrR?Zn7Lr7*TL)Tb@h(* zy0gpqBzB9O;hpK-?>+22?mel`)Mx2)bWhz&pQq2)7wF!)kM654)EDWCbwAx-573wB zOZ8=XpuSvRp|8|e>8tfMdXOHhhv*0SUdLGdsD50J(@*hr+voH@^^1Hr_Z9t`enU^t zZ|QgRyZSvnMNiWo>W}p&d<k-<{!IT%f3D~0FZ2SvNH5k)^mqDuy;LvPEA<+D<`?O8 zdV}7ii*;C+>a9AWcj%}t*A=?b^fecni_FEQpXqM~m`lxNW}vy;Tw$&>SDCBLAT!tu zG1r>w%=P95bC(%q?l$+Bd(D03elyxUU>-CNnK9;JGuAv}9yO1d$ITOFoO#kbWoDZ> zX0BObelqLr+4fv}zU^lR*vst=($-qlJnB8=nVTIYd7q@^<-C^jT3TUx=g!@8&dgbS z)SaD|q~~^9+--4}>~5nvmAbQ|?#$_3^X8g6yByUeJLj#OkzHGN+nUq5*1*owatb?d zsP#tIahZ#|j_W$E^VXcgoJO_hc4<_nMc1)}xjBV(?(90Jb9Zv>UT0@kBztS!#r3Z3 z(x~3BdLz4zYj|wqdX4uq+1WIsX`QAGn%8OGp!vDY?`i&f*B86K*fO)*;+Ah6{Likf z5833(kP~&`q0`*G)~6kA4}b3PXqzQno3-uTb!^Ai+KxJ6Lr!7)q3z%4II82QoWc&@ zckJ!XI*#hxol?EkrBTP%atgc7>DsK@sBWXWHp_Xf<04n@oYy+_?liK~=uVG!dau*$ zPTzG}=P(fbyBx){DgT_sotFfESCZhLNPE<sU9y9Jx2>J0Rr_z~EPscc#J@|UE{(`} zS^{zw2Y-iqQtt=dz-{7viB{=U>i)qUch_N`r?(~`r;+>9UhW?+nLFl;?6$Q_BiDNF z&-<6SoR7MbQq%gKm*ljTH;oEnb9#3<s@qmtdody9r_@_JFX=kR-F4K_ZB$OwJx2@2 z^U3L*v$)GqU0YMP4UQVRH0nCG^M<a?x-`le>HhBR0p4AirT)~`wNDQ3pk#}?w(dH% z+u{Uf1Q+1X#k#r)g+)mn2N$1An}X4Q8@C^R|BP>kkt$s7e-0kNWPnG9O8|ViT6Z1m zC`^vypwl@n-r?@3JL!3k)88ELPUG)kubD|)ef}1HdL;a{16;EfT+`_Z&roL~<DR3= zWt{89|4=;9Ux3A6A4c-ljC}pzz61ETL(_3NPhZKu6K{ANKKvU0&T!i4$N@9pu(`-v zv*E>au=41RXY~1S<S&ttPEw0h0i*0P{^!7f*YdXY{4a*%{=yqJWB+ssR(Vmz;7UAA z4#to0A8>IDp4APWMzR{_)$nSlo7mHssc!Zfdrj3X-XY#0>Nc;v*O8fSXRoum6JFgF zzdPr6=crNMFl<Th#%u8{>R!HVH(QPNKKDLX4|of_h3Y|XG4ua1-V(eOJ?s@Q*MCH} z(?_aDbw}M%J??nBdIIi#j(QRfKTJKPhwEF|bvjbtt)}bI`cX9--u<}x3jRG#Er5qV zr53`+pHYk8<*%x*9sgF#;Nb76m2mMXY89M(npzDv|4{u1NB>x@fvbO_euA^JOBn7x zQ~eBw|4bFZ<^QGD!s)+J>-4w!TeVFW=mHhdKj<IScKCdu+5xXGQf2V_bt($a-=NCj z`<v8Gcz>~~fd7ZpF2;aTRmnK8RqbXhh^Su~56aaZ#)AsAS6AvvwU2S3zlt#)+~8R= z%nb7yn48VbUPCj&jPM$nk!GaV*o_BX6UKvwy=L(L$Gp~X|7X0m<~j4c*U`LS#(O#D z4f7@|X%o#v?`ZS3dE3i1lgxYGF=ndC^Nu(9Cf_^N%rG;((-<%2cs&?1zV^;AOU$?4 z1*X6(_4=3}%^L4wQ)G&~{$`yi_68VMFug0y4%^7P+BUIGyvJ=b+tz!+=GYwXW!u$u z^<KfV)=}Q8_7r=D_Zs8R+1^`>LFamJ+g`Sp_YR}c1>Pikk?rqIwwKyVy{UGfz1*8- zue4WsAKF27koS=tVuyHn_6B={_pyDS{qOlmAjk4eyJf&Ce~s4_=<YMV0!6?&e~o$4 zUt@c5zadoK0J)<caz`U<Ya8exsu7s3r+09SszzX!?@a;hlr?XvdS)W<HZY0n8LEMq zs~Xu;fYX2;fZI{)p&xC<%q!b(r0M~O<Ik;AY!CglfjYxqr_S=Xsk4D|fS$mGz{Nm6 zKddgn+wG;S^j;1;PuzIm72-Z7k57QvT+iX&*BloEOSrd;d{+Ux{cWBGGW~vDV~$Pz zQtu#+Sd`JP8hFQXq`n^S^m+mPfZ={4yu~!~Mgn&Lv;FzHr{7Qa0?q@@2QC151ATyN z{dIULS*NcDZUBY?{{V&oH~QQ3aNs83X5bd!4&YAUE&x9@%u~1Nd;G2XUf@39eqgj; zsviIzB>#uVXAH-OIgaJ{2*<~G<_X|Q;A!Al0Nm&ofR})mfmeaofj5DPz}vvbu|0Yr zM{uRT0Sal~B48b`k@x-rYz9hzEx<OQ%r7;4{eI?BU?_U7;r>=bUCapLZ|8g@=XY?t zFSf@}Uh^b0@U*|qJVX3*z(0W(NK3iQ8yw#SJ|x{oq{%04CfBn#eh$pzd;#|sa&HmG zuQ`58d;#!1um&guihvEI-2@Z^+qm9A`ZCf-IhJ$W$+3dtE{>HPcXRxe;~tK`ar~X* z9~}2`+{ZD-(f8L`<@d85N6pc2v>Zbm)3Fn*0n`F&16e>_pgzzLXbwPI_F%wSEFK0N z4zvZ@0quc~Kn~Ca=;m*=M+3(I#{tI!Cjut}r~0M#bl?o27j)c;{<}(b_lwo>eng#! zPIDR8tNc}Xb1SAlucAM%VnnE;hxlvh*Q@B)tLWFObc8Pk>>w`cuQmOFYk?bpC;e6C zP1emO0&fG8h@0UTo4Nj4dkSzG&;#h@ud<|9%_u=0CD_i}m-6;J-k!(XxAXQq-k!&s zm-6O3-kisq^LXo0-nx{xF6FIDdFxW%n#Y@#@}}*)X(?}7%A1z*rlq_Io<-i-suQ;7 z$N4+-)xb5tAYd@?F|YyH1QY{dpcL5Z?=biIJ8W0rD4snR86g{KAe)_04H%>A!Cy+@ zFQxF8Qus?Lyrq;`ZGHGjDg2}q9^&{%Dg2`po>2<VaD1W^K2ZvfD1|?i!XHZE52fBP zmCZPu?cD_24BVo!>F1^N^HTbGDgC^ZeqKr+Ev1i^(nm|_qowrGQu=5qeYBK5T1p=+ zrH_`<M@#9WrS#EK`e-SAtdzb}O22V^rqoPU+2%c9Dv;0hEZ}qCTc7~=9w-F1K`ZG% z4WJfK8^{9c0`-B0Ks%s4&=KfDT~7ov5ik=0GZ8Qo0W%S>5&<g_uo3|)5wH>gD-o~~ z0V@%(5&<g_uo3|)5wH>g0}(I~0Rs^*5CH=bFc1L)5ik$|0}(I~0Rs^*5CH=bFc1L) z5ik$|0}(I~0Rs^*5CH=bFc1L)5o*o)I`BF0El>b_4-^91SSwBkY5=u>+CUai7pM<3 z1lj@ZfsQ~I>e86;CBk?Rffq;goxoiHJB;DQ5%^;S{uqHjM&NT1_*(=%7J>If;5!le zd4zr*p`S<S=Mnlj7EeH1Acx$cJ%0?N+!#iZF^nW*7)i!3l8h0`jzHNFC_4gWN1*Ho zlpTSxBT#k(%8o$U5hyzXWk;aw2$UUxvLjG-1gSR7->GT=m--cqh!u={6@1CJ(rfBh zc*Fdi-i^Rbz|Fud{!T`c3PzF&xOfE|y8=#J0T-@-3s;!Q{!a5AFcp}|^*mq$un8#k zE8s#EaG?sgPzCaCTf+80H{fXCA>cXSB_JR8ir%)IQltZofM!4ope4`>I2O2=lC%Sk z1jtKw0Qv$00cxYK0ImeC0v-h(2gU(U0j~j+Tu%Vr0u}&^fW^RXl(-)-2zU(O8S@zc zcFd2!Pr%RAgfdymWGNH7)++3wKx?24a0EcPEM>BtfX=}C)aztw9;W7DY96NMVQL<x z=3#0crsiQa)Blp%XH)wywGUJKFtra;`!KZ+Q~NNr4^#UvwGUJKFtra;`!KZ+Q~NNr z4^#UvwGUJKFtra;`!KZ+Q~NNr4^#UvwGUJKFtra;`!KZ+Q~NNr4^#UvwGUJKFtra; z`!KZ+Q~NNr4^#UvwGUJKFtra;`!KZ+Q~NNr4^#UvwGUJKFtra;`>;9&S*=)|;4g>o zuR!K1M&>G3U-_HVPyTY`s$yiLVq~LYWTRqaqhe&EVq~LYWTRrngcZmz#mFzk$S%ct z2iH-51@c5O<H8DaDaUI$Ugs}od{}|}P;8#!d=lp$%4oF0e8Kes&KChcaJ~iD!Fd$e z3G4!P1ABnqfxSS?FJ>GsW(+T8{4QpkS;087f^lYrJ>Oq$`vJTUJzTcmlD^uKS{6{d z0%}*F7SVSy{Q~-LOZsn1`fp46Z%b-gKurs%X#q7Ypr!@Xw1AoxP|E^pSwJlds9gay zE1)(7)S`gW7f|{FN?kyy3n+B~r7ob<1(dpgQWsF_0!m##sS7A|0i`ZLYW@mczE<Bb z>Q?&mnU$X97s0KI;MPTO>mt<$`lSEB&sM98I9^QLC5+aW`WxX68{y<daPlJc3URYJ z&LQq|M##Ce?0nLHfxP@Bdx;kKQMJ%7f!i0s?TdKhFUZkr)wlll>O1`86!<@@ZKQ{b zs3@=#r~q~WyGj2mNBW@p9oPr>^mXkQd6r{ie>L1`BO^x<BS(=3?_l&O@_KMQ2cRB| zB1McMMT{avj3PyhB1McMMT{avdL;e(4u3U#dNq7{wH^iB4cvoNb1!foa6d4bO_&b= zkMYbCz>~n!z_S2&VALsM)G1=rDPq(qV$>;O)G1=rDPq(q(sOwaIMH7MUjYkw$Jf9& zz((@_1=tLf09$}<K$*Xh(W=M{gTD+%g1XsX4VT@BT)dWXV>NQ|T1K)W^DOtD<NA4y z|K$1w(ohyNp6l0vH@JQm_<-|#;y>Xylj~WWe-6y!{9BF%!1usP?ym;ckY^#+MI1Mf zW)n~hlyYyIU&P2*#K>60$XLY4Sj5O!#K>60$XLY4Sj1Sinz3v(W7%rPvek@bs~O8y zGnTDp)GT7uEMn9wVq9Cz$XSHUx)zyrEi&s`dmL~)fHaECx|Y#mBcsJeMvIM>cC|eL z_`SUb7z|tsU5sS>DrEdBgp#9BauiCALdj7mHwxvJLAgaxZV{9lg>s`%ZW)vtg>s9a z)(AZ!3rgJzrADFDD3rPYN-cv@OQ6IkR2PNXilDYA)E0%(qEJ{A3X4KvQO3wZ#>hg( z$U?@*LdM8Ks4fcCMWMPVR2PNnqEJ^E)Kvy`l|fx)P*)MuRRncKp{^*@6@|K@P*)V{ zib7pcs4EI}MWL=J)D?xgqEJ^9>WV@^Wl&HV6jTNUl|eyeP*52ZR0IV@p`J1*rwGa^ zgKEm4nkbYKg;I*3lqeKZ1cekaW*3_GfT=(}@iU2=#qo1s9_Qb3EC9X-3V{v8Z32pc zZR~hS2WkMdfZ9M7P#35VGz8iK?SYO!7oeM8MvIrx;$^gW87*E$i<i;jWwdw^EnY;6 z7oj0b^C!@<6V$ozlS}+^T5=&RxsVntr}Y-ndOKv4M82ZcTG49dwA4acWCATRffkuS zi%g(JCV>5NuwM@L%fWs**k1_t7lOrduviWj%fVtfSS$yN<zR6k7%T^a3&CJH7%T^K z3&Gk#u(lAaO#o{Xz}f^bwh&A$1Tzc4%tA1;kXn{g%W`U2PA$u+WjVDhr<Uc^av`-` zNG%s41)T+*oei7=^aL&jo(IMQvjIn+Uvpdx?Dk8b#}a6<1X?VC7E7ST5@@jmS}cL? zN}#(E=&l61D}nAxpsy0>s|5Ngfxb$huM+611o|q0zDl6466mW0`YM6GN}#V2=&J-8 zDuHH7pqUcrr3Bh2fi6m*ixOy}1ez#;CQ6`*66l}=Iw*k-N}z)h=%55TD1i=2po0?V zpaeQ7feuQbgA(YV1P$vq^tuRbSm{sox*<OgpdCG~RuO)~Z0kNG-%QcWrp~s`C9Wqk zjSG3&&AKin#pOWi%xezUpEJfS<d~R+eZzB!nOI|gE85Xo;PJ0!WSPv!GMSNOG9$}m zMwaQ#_UCzXux6M~Nf$FqUBdA@<m3WX$NNFm#s_w7@c-vo8=4G8nyrj9TN!D#GSZ-p zQML2~!2dX-V<g$iNV1iY1Z|3{MO&3JQfxINI3LN;&Gw$-=w^H`5a(unZ*Y7Un5;6H z{be%y%cM<9%}nAFGr)PAe@k3q7Py8y+)S{D;|A_+0*Zlc%=Z4%%&<9Hhl7BFfkS}9 zfWv{dK<cb9hihhz_Ec5No(`Nrn>i|2gY-X;HoOAZF7nD0z0=>WcLBSZ?Y{_o2`mM+ z`rGXVK!4I@^3+bA+R0Npd15C|?Bt1^Jh77}cJjndp4iC~J9%QKIvCEfOP;!%BQplL z%P#jc++-J=Vi%lZ7aU<1xmA!`1-ZGo&n`H^F3I%`j_(39fq6jUEgLxB1QY}Aji>s% z==r<o`MZ*D9|NCT0-sx=jzuQ!j%;)SZ+EhBAAcFL*fQj>Wt1>X3CrMrVM^y@E!GK0 zzY6$?^lPa(<F(q%^V_($owQ{fqrgs}0@wvq`roKuIsOLx4(tPbe;IPsGB3m5>^1RM zQtPmHu>XtK6?wdyzX17a8Ty#z-U-NDJvcuHIFEGaL;V-PdHQp2fd37AcL{uV34C`6 ze0K?acZtaBBmHGyF$@;N$VAJKiI(Xvfv<o<f4MFK)&WkIFC&eU=bbDc$nm>GjvwYP z1LI-y0ImHb@;V;dkb#yV|16^w!n8sevd=PPpJnjquyOMKyBsI`OW@N>;L}Txg_a=) zEkjqdl9mdiFIqush0Pb_^(D{$z;P+Zm84k>tmj=DxWAF(CXT;wEatdb<e_C|i?nK) zb#sAJnccYg!08;_oZt+O;K}v`dNDURUs}A(_C}WJ3tUWmKjQi`>RrS6VBlK7%^?nl z66Vt4uC>c(?J`<=E-gKm*8PSSTu)1Fr<KZRCA7}|Tv};8Ei~6V+210qGQi&e#>>EX z85o`mhUbFexnS4H1Z7}wE?6rAQ)OU@z2(3>U<0rTD3-CfjM|h@lQL>BmsKieoX}?p z^tluIEP)=&DOs43g`vTn(BKYeu#{4Up}%rUx)gdUp@d;d_&p^ILqny|P6>3g9l8la zH%p<B5=t4SlwnF4h7L-gff8t-1R5w|F1HgJD533lQ1UQs@A`5%ZCpZIme7tRw4v+U z<+P#e-{rL34%%%8ZMK8<Dy6MlpD(AaN@%AN+NgwDg=rVZ2g+%eQre}IHgP<moOWOo zrX{kOtCuoYFJ-P?%3Qq^ENlP^8^FMN^$^$30q|FLQe-oCFJ(7HHdxu9mUF&>^HrR$ zL2FpVdC)^Qs0f<Ea<2FI8$5%?4_?ZeT{iRlQZTl`YsRq!&=SBF4h(K!zF!IkH%Ko$ zk>e@!Mm#No&Gle&9ln>c(Fc@*)%D&ba6EV{dVx~(0;T8$N_9`PioJmIfb)S1fZhPl zX=;wnpcI`!DLR8vbOxp93`%L4_4+~XqiND(fk%mZ92f^Y1-u5Jf!7m&w}1t}A^@!? zExLgg-9U?OphefyqU-f<v_xODj%Yn;-Sy^D&au&>mDkh4>kaQh-%yIap_G>1Knt%o z9}+i%^UsKz1I#6E0db3fAG!Vs_!)4$GEBM%@!NqNKor;s>;iTJdw}18y+8~*Km};P z0^r<&a|_PVWt7@Of!079;0OR*qRS|?oq*23DgJsWX+4y*9!lCEJ-ZJ_*Sjy|cpZ6O z4^S`k9;NJEYEB<HmVVJ4ejV`mD3nsJR^XFm6-UR%i#T7)2!uQeCG4W*%W3s;T6rg} zywmFg&t=S_WujoX91NF(;c_q>1;bIW8U>qC`i$e7QTj{;m@F55If?5T#LwmEc%I{T z>$$%X_yutMEaF#EvnVx-QnM&ED;M77c-3{>BTx1Y9ga*IaDy;>p$>f^4E<-x_kSHn zSV5fQ3TvSApExf9)-tYd@HY#02vbv50O<o+aETK7K`H$pi$0J=t;2DSQ4;4Eo4pgc ze;)A{0DX|R0?ttaO=m&VS<rNrJ|DOM=neD%hQLW4<TwTx3smPYZj=c_i&<bS3>{{H zwXnHP)d6daGRQbQ8*m%qCK2}`*E2Yx=`ddqw}9(Kzz>|SC;dj?7hto$89IdH5FY`y zlV%4H1$F|vfZf0z;CEmz5K~#uVivTR1ubUL0&X;MBS|>mQmPL0wb}N8?)q}PkYhjM zC@(aYMXQ9_V{j}wmJ`76iRjaoalV4{RUFrdZf!HPwHeylqRNqe4bYV_zB|x|algOl z){4Q>FVNI4(9|!`R54g`dNrq0D~6^vgPme%Y73b81)ACnX50!-G4!+<dfE&<ZGoP) zKu_52avcG-BjKHb&g?Xx2hhv^1)ACnuiXqyZMN5QpM2R*aV#Z0K}x@g(ic<uO_Y8k zJ)@Y?7fb0Q9LpK^jEsGosKF*`;7Y!Ul5e8qn<#0bl$$7}E1lEy74KKNVoFy`>9$d# zO_ZpZ5*1UTVoJ0Po&K?eC(;*}aa<*DV{Ml;&LK#EtQqpQZM<z8c&Y$T72v4?JXL@r z*XOo@n+kAKLES5;dj)l`;7!}8YX!SN`Y^8d1ug;x(yQikWd1HQqU~HWRwKQYA-$C$ zy_F%omC;vrAib3#y_F%ol_9;AA-$C$y_F#o>_Q$WXQVAdVk<*ZD??H%V}vb3<5h;_ zRfgnMhU8VIzhaCZ20RNq54;FR7|-!_-~-?j;7j6`0xLOR4U_^~;Rxi3R8z*N8MPO4 zgySH=lp(>CA;FYkeOk4mP>BRni3C$g$#+pgx2jM{2`ed8<zK8WR3f!h>N3C5i~wE$ z-T>YOs;@3oBC%8=u~Z_lR3fodB7;>Tu~gbKcwbHUO9S4z9p18C{Q-@1L*h6Q7=RQP zX0Ff&xR867{7G{Z>=lSIqYN}gPFs}F4ka`~Ztb7-S?{m3LUXt`pV6891I!e+9Z(~5 zpmqDl;NwpKPXhmqHYjBcUbH`MJ>9LNJFQQ!W*%i07&T7AlhE#b%XtCdG&{jMc+|Lc z@NKl{f70sw`?cvRjZd&P9aV2Jm#@tTP@CNuQ81o|&La<<M;>ddwVBW7iN^V2j#cyd zJaiy==s@z=E9K_%d1{eAm6n)~E+kKVi=H6jPk|SFq;|7ntO4VH<cW5exqWlm{2<~E zX6}9n$KwFrgRUgcJD>Z#fqtA1WA1(<a1(Gda0~Ev=K74X`a0lxfKicM8c}v>MA@Yg zrM2_W!{nid$wLp5haM(RA4ubz&;vZgGY<og0FROO34oPtC?HQi3p@|J0K5de47>`w z4!j9W1l|TxwabA{ATQ7!GbTCBG1LS#<UtLq(F^3o^#XY*dV$*L1!|)gsBJzXZ9ZuN z-9VlJ_r~c477|ZSKu3@V<>Wy*d2x+#9+ZQ|m^4*7f;@QZN2ZMQ<v;~c3H%ED2K)i+ z1AM5>0}K!n%FDAgSh=qS)CRJEx<GxPA@J`t%z5aT^3XA1&m|h>yi~mceElON5yu&v z^i65t4pBB+XNnZwjdLU!I7Ac<5p_}|Tp|jWh&o9QN<9nh!r6fHnc5S$7<e8S56lL> z1{MPm_B@qiFJH;%yPNAh{;!^vw>0q%a`XsvgFcVrcp@V(d3n8ne!u`mUUW}-IDr01 zqkm#wU8a5vcmjA5cp7*X;NAKK;3eQ?;8oyt;7wp6@HRT0p};f1KLOI2d|(#vIq)q| z0DKP=0%8AGvyJ0+)x@T&Ol(3jZ7rZSkOknm)z$|Z0_}kIKu4ep(8vE3O#KR`ny|Yh z(5OV=|GVJ-NPCP7Zd5C0eZ~O$X;$F%32lngOz*Ev2}Yvo+7#M{@wB=|B`TxQ^^C7I z8HHA(Rawm_vl^|$YP1ro(MqgFE3ul9WHnlW)n+PbGH9jQj7>i<dj3qS^rl5#XBHjx zdLwTS@Ow#KmE`3{tV;5#B(F;Hsw6KrDpitKC3#h{FSHkRzX0eBT<DL+lK&aLOHvE2 zG#U;tTHguW1&jjj1{MNe1K$A4{ActEU={Eq@RR=xJ$N*|cQn0rw0W89H5`ll(e#4R zXxB!gT^nr=0S*HW2igKTytjrohtkgn76VIw0)M{89tZCS|7&k4`}LM%->SLV!Br(^ z@sSEkr^QGOOQ?T=|F8HHGfA_GC#K_Hw}2;pK+af3Udz$Jx|l7*Y$HuMF`Ff3r=%fg zVs^Oqz*W(Z!pAT3-(g=-eacrs`O4$vD<_xZd0QdRT|`dL^4!T-M4ZbEVE}Wd%kayQ z!LysyO#fT;9eb2!lj9u5^ZC4){UlBw%X`?R<7NlgV-29EKj6Q~xKXLTVn^U2o?YX= z2PH1?&ZW=I_7{<=Hu;}Q4`rVo`*-RP`z^U{A=eUeEg{zuw2`!+q;-3L>XLSo+v`Kx z>7@OMv_FydC({1J?%~?J9jfFzNoCB@w^!41=RseAp1U4p`H(%m_0(4M0};Lxw*y+- z%iLX|O-o~b-yDredw;Fh5kAp{>tlcuDcLFD=v@DE?;_Inr!+0pVg6SNDG%(dS1*I@ znbdR^dcCi>`wd?na<j0_tTj|p^KSl|Xb}34)7@x`mXO<8v<N$yUER*?Y6-Zz0Gc01 zohqpl+HI)ids^uSR<D<mb~&qK>5g;KW6J3<735e>Z>gZSY~jfj)c0J<a2fN9A4r9E zmS>`@IlDb2H!^P5piEBhKZ}^H<Pwcbt=r<7tB9oX!0tBQ<fH@Ff=-jai08g>+|^$U zcFI{HvS^9>`JeK(ulX*@EOif_EgtaCQ)B(7)MNfcF!3Qzf5YnZed<g9I<?S$gj|MD zf;W&KhC)ZTssjHC+F}xIk)^gUx7f;xQ^dcG_83hG^J$ZNRm>kvyWB;)+)Ih?=k4Pu zbs_EZ0PQoL_PG~4d_o&d0JHai*;l~qFfbdYt^PsHo&!H0&}MhjW?A6rS*N3+jvqlm zpMmYq!1iZQ&}ZIv{v5DgF1=|P^rI=wH@tBNe03(;UDoB)7sLmxyMcO?P>;>jV+So= zk2-9j+&@yDA1TWU%CefWETk+Y*a+74E|4*1wY<MNrEkGZ+~L)=)%<u{ZHBfg;f+pz zcLF(_4Aq^7{`UgtxIeWW0G;K~1~<|M<J67&=BayP_o@eCb7+J1v_VhGd^Kf$nl{K% zU&cylgM-zg*k;<`O!aMSyZSD+PZh*|q7C}e1|iD-Ic;!`io{~HL4DqSJ#A2jHmFY< zq|*j<XoI?x^aR>q8g0;!HaLMcs6#1-(gx>H?@UU1vUf_XoO;jq&c*-n`F<DL;7Zz{ zCT$R+<ekC6D*DD{{uh*TAtjp5+kfPZpYeu#-msiEEGAdist$w2<nkT4e8<z@@^l%k zS4!)Jle{8>HfYHB-w<pS^VDX_Q4Gd@0b`roESp(wP56h~M_9-ILG}`!3tjhvk_T{f zdkAlYYVTpU#sg5|SjzSo67Nj*G5(AD!Cs3+*bUT%3bsJitHEd~R6U#WZ-E*dcPxY& zzV>dX^=GrTHiy1DpYkpSmH-9x)}_EQct#E0vR+MR#GC<LeZ?EraJ?B`(;t{k?_K6b zhjeExp=w@H?*!&|&d<*a{-gf)J}a;OSM=%s;>Z5#|MBNPns^ZIs{BfyRdoM-JRRcG zm|Z2AsxCdf9+dVUfAkgw&J^jZ{lLP1_#w~z?H~Lr<tOjl$~#vDk!UsIKcBtlwA_9_ zdbo1HuR-D#^$jP^|KeCLH9k>Vs4n=`<*cqN3BS5QR3fD1{||nC*hkw#iIcVBd<!%k z|M_nx&*mr2VtLSd^5@TsZTFY>ef(Sey8cT4?&OUFp7<kab6V>FEtW;B^HYI`6QyG8 zPjWc(k4<EQ4foUj>;Ch=IIxjTd^Vgv+n?yq@)yv1lz*Rp4`Cbkgx|!^_M^^22<M;r z%i+I_&p-;L_~;(o{lpLc#*h6?$)CT<U+*vz$4;HZjd=SeE|veVJ9S?cPW?&wp(Xgd z`^nS(Hp$DiVO=<I{O3xR_|Yq7`t$rXz#{0NF1(~3ZC=m+i9Wk2k&0Y9!bz0>oj-wk z22|*--TNG*(3`(KPB~Q%S384m|K*QS<=^}gbb6p9w6i>m?tH(Wi?5FP{Sy4!%RlE= zl{~d|t6~#p{`kb%e|z-r{Oc!t=E&}D5T>RRJ_4Q6mX0SxQt!!m^*%2&l#<5v2WDL^ zOo^>_%9zK`f1z4r{KCEO0Pj3d(*5FGP5xY){Sy7@(m%=Xz?ZSR0d1kEbQ18LM3wIM z^hfw({pZLt%g>}|k8+R3uHkwalAL0UtoDo1C*4;!k*wth9ZCNYsuoPU=wJl!C;89% zpTmbgr-yH$p9H`7k(GJHC_~?f-6+pI7QY`q{Cf;l@xaul{JT=Gs-Lq<GX4vASmKIO zFcPaf(WIpjSBt*~@5&~w9)H8COgl#D4p@BGzz*sp;?6*0(G+dPIm{BA-Qq#YSuC~` zi^W6Hv|WlcG7vuxt;JTcE&D+~!IE(f{|;(C|Bh-A|4yvutVGIN&A$ulIX^KU`<eBe zZepL9i+$oocJ=<k|5zlr&B*23_;*+A+raK?H~$l`RQv<mfPE^aPQn|tRi}up;%Q>5 zc)Hjs_VApQ;#pp2ud_N=tQ32Sm0~Zf6i2A@ypi4=>LRf~>?an81H=OH60tzM3=70t z)IhO4d<fgaXVhb2WB7{L7``JmhLgp{@IA3Hd|zw~r-+T=RIxFfCN_p2h>hWgVq^G` z*cj%Cjp4^)V>nlA4CjfB;e4?%{6cIDzZ4t8uf)c1f!G)>6dS`uVq^HV*cdJr8^dqJ z#&8KXhP&0bVpq7**%hingI%G*3d-E9u!Axq6jlOeq}uN63e^s0SE!=Su2B8%><Y0- ze9nybj93)b6pO-4u_&x97KL@hqOhJ=6gCly!lqahe(g0ETf(+tOW00q2|J1{VUE}m zb{1R0W5ky5II$(XMr;WOi7nwRVoNweYzc1_Tf*DKmT;8V65cJgg!hOo;k{x@c)!>Z zJ|wn;W5kwltk@DhBDRE&iY?(|VoUfqvv$^^`Fldg9&~&-H0^xm8TM1Rg{F_-AA-8u zLHW+VK{_<q34MU`DN%!!ug>Ubx<Hlb&}27K9>w3;?jDO&cpU!>sL^>fKAwLasPP0w z{1f?S(@RcbR6K)!J#2i>L?Sthe*@_=4W-XCqR;fj;_yQLjp;oXk;Ym4Hj)0*l>Rdi zTc*qTH>D?CfhQ+t_gkO7lt-`on7_uyLO!MXguj;F)l_;{Bk5iBrFR`9y(?XMR~Egi zh`Oxh-%|Qmy7aMh>0<{;A3I3;*um1rnn@q4FMX^PeQY1Prx^eG($iW=PirMTP1DmF ztHxdvuL(23re0IklwQ}KlpVYds)g5)9(b_yz#7s6Ye)|~7*CtSnH!FvA9~UcJ^CTM zMjweia7cP%NP1&PdSfQNv5(Stdgx1<3w1x0hOdXqR62eht|I-_dN3YbhUg*eD7aP+ z!xHpHG@cE_ez+lhcqDeAcj&uSV|wxfswtiz9wfJi^h2Z^!+NgP59^0HAIrL~){p2% zIDb?>%DWyzOWHuJj;($IZD|9sJ+}Huw5AQj0@>=P(VjLCJLC{N;yKFpJbKiIc$fGm z=P#g7ZHS+V7dd|ky=p@|PK@XLW%R2J@jdYh=dYq?Z3t(1hZ;@NSgGQN;$6<2C3CuP znRMYY>B42wh0A0Jm#HCKrlxS2n!;sj3YVz~mtm~ab2YZEc(0hp`FuT}^Dp!loPVjm z;(UQ#0QMH@g<xipUc~v=`fJV?>&2XZgDrGp;Zse7Pc;!f)kOGIrtqmu;ZvEyr!s_3 zWeA_j5I&V5d@4iuREF@WI`AoWQE2uQ(+cb_;JjRytGb$fb*j18NY~Z7^e)bwrF31r z8@|>YzSdW1d}&;$(wsjHm5xV^ekz1ljsEPrxYS(A-OJ2n%HUsPAZac)m#ezY&ju;4 zGFPb@c-y#!^Fd}1PYpJMSydQfhM<?e)?7;t*O}{BGr!(kPnsLxp4q}Z8wvMpEZnoH za8GBIeHZzUf`_(nzB)*MpSe$EIFB8?<pJ}6YKh+ts0-g64^f^mW(+AGhTEpWZ6785 zWANM%JogF8FwTrq7LOii;PLA56lHkYJdK_5GjQaFaOCGyWAnUuUe!1MMBCl~tM3<7 zQ}d#EQ8hC!p?hy=#+&i#V7T@h#J`EHa~;RK39$wzoMa|Zmv_y(+?{5o@%9hQ2iQP= z$le2OJ~AKit~`@R*{~HSw;5&zYc(@jrE&ay4rTistv>eBSWIV|d92tpHS^7U^7(=t z3t8q%^Cczu%6vu40`@Oxv(PLg&qeHG(B^CNHRnsr67v6+m4Swg6W<g5zz&Bjv(zl* z*&of1U}KG0Lrt*}AY5nGQQ!6KfM{tpm<_yfBRe5lnoX<&H8sDmBci1#X3uC-Mwcz* zv(;=RpB?Oo(5B3k@x~}SBeW?u<(%(ihlDm2rh@Zb?3B=^(o}N3n;jF{{AzyXd=EP( zwE4~a#`*8;pwQ+I^9Sd9*-4?zKC_SW7&|Jo@r|$QiIWFy`NS#bnjIF}8f!S`$9c$x zI8U?4R5qP8kA^nGW^i7EwU35;HI;P)TZ=W2hBnh?a$cLYkcPI7t;2a1Ya$J8w$0|e zE^8wVZ9Q9$^ZKljG_(zD1I`<=R?^TmvW--_8&e6J*=8zao7?89v29^naDI?Ii1U`V zCFcj*gE?<yTXBAfJ%sZ^?V+3>W)I`MwQbEg&Q>^YWBH1>ZEM?do?~+evG!LPZiFU0 z#h$|I)v2t0HMOT<IiGD$x2JR70}J|Wdj`8~o4WB^)o|lCrNS2gYdGgycG1`i>;<YB zqxeOtg}vBbtPaLsO+VuM+y2DkBLExxfp(xe2p=|=lLk)#<b$UG@)=@>5aKC-x8Ny& zQBQlr7_|c*8wrWE5o2y$#!Dx+V!JQny&LH>@L$xP(2efRWGv6Xd(qLv9K*l4jOaCF zM6W3$dMz2zGi5|?EF*et8PS`_h;A6k&p~?V$=}K-9+FW!O-At$t9KU@-=BXvy8tdh zGH?=cmW=2vWJJ%B5j|Ty#6Lql$3KJhzUO)BCH@(#`;F)P75;TnM*58SNbmf7SQ+oL zWV{ctKDd~eCH(7%pN|^&T3Sv%EBM#NzrZS_87E&iX8bQA#z_DT)dv3cWV{c_c;5o= z`cW`j&cD9esdjPhq-={<kY739!@q(04gVk^kp@C|2=UQ)YSthvG6BA2=??go;)`i` ztcptpjl4#jJNY0@<bzrwA7pvWyk^9=@LCWa<Q+r~ExneUxAIyMI{zXzE-M`E9ZjCc zddCufoQHNEpHSUdiR$6?Al`W#33)wP=d@lQc5&79F2?s}hS!f(PwU;_4Mi4l{zyEL zHX4anl0fFba{{t|BV>*a$PH&`Xg5W|$PlR_L!^qDB30BDslp&t@NGSjCqg1mr0IL~ z{aCa+sUj;ysxT>1g-MYrj7Sw3B2`$CDl$Z>up(7th*V)ks>l$j!s=&Pm9-*ISdk>G z$PiYf2P<-e#e3Cj)Z%shIw{}KZ*cymev|VFdIIMY^+e9!(r<D8wtky)=Le;kNCqL1 z2|^+bghU$15NRMyq=5{P2GT?t$Pj5D4Zl}Q8Jm~sWylcA^>WTv=oOr=)GIk(rB`vj zTCe8(NBtw`YxEk<f6_m3?tG}!5V@g-$PG0_Zm6j@>W$#gc~YsVf6>2iUaX5b->f%t z9@b&bOLPh6&bLZUy+yMVPNa&OdYj(Hx%0D<DY8Xvku9=Bwx}(#MH7)NvPHINBC<uc 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 B#Bu-t literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/ttf/Roboto-ThinItalic.ttf b/js/assets/fonts/Roboto/ttf/Roboto-ThinItalic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..07172ff666ad2d590e29324165b6c7b8e2be72ee GIT binary patch literal 168276 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/v15/-L14Jk06m6pUHB-5mXQQnYX0hVgzZQUfRDuZrPvH3D8.woff2 b/js/assets/fonts/Roboto/v15/-L14Jk06m6pUHB-5mXQQnYX0hVgzZQUfRDuZrPvH3D8.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..58fd4bcd24711c74b7c0ecf045cef580471f02f1 GIT binary patch literal 788 zcmV+v1MB>EPew8T0RR9100R^N4gdfE00nRW00P1Q0ssI200000000000000000000 z0000RfhHUb24DbK5ey1~7=d;Y6ah8@Bm*1^5C8-q1%em{ARA2t$Sxr#8(u&JfTZb4 z?+pOR&V+UHN$|kuW$))F<C0id(=Nmled}qDq$W_4yN5VVttA{s7<o?Rg7Y(i+s5G> z-VDuPvK4E1ZuSEdm7`2Bh^rj-`M;)KlppZnfq%uzSkT^ZREcRf8({%Omd=N;2kgQk z{vH8X=%|@mS>4zX{{fTjBZ(ejA2fpWk^P!SQ;Z6r>j-pEfC?l#7%|8`8vif?2nwqx z)Xju~FDel1QVNQb6bK9~5Dk_?K&s<JA{uDxwG0p;adUZ@!2#31@Cb{Zgv|uP0BT;F z8cL!64+jR<dWBHL763J0Yax`93LyPtAQHjdEkGeEp@0g70zz8pdf4aDApo#}8+d-c zNAkrxJg;Cv(H{rE2!JzS28w`zWoZRmGnDauRXUrvIvdPx&Qo0`O&vPiG@_@=a518^ z!K_=4EK6QUG5hY*<&ST7YVIBJ^S2b{+_o;gE2s9b(zUx=x!%beH$?0)w3cIXP){_Y z+nlQTXr1_Un-skkdA})X{TH8Jk|K8O({=WqT$V0&wq@JW80E+mjPK(<`{~-&%8$ui zejN|5Yis5g&GI^sS@XZ{eqw5m8c`onbK62RYBd<q9OoxW9HX~%?b6Q=vzZMlC<bYu zHb;T&9v^S?q3}Cl(vLp&X(a<(y4(6c`~P+RrY6ArwaWz<M>=d^&iNDSsN(<jRSwH2 zmod;D;tRClOppEa$ri^Tuy`fjbfeA7cLoK;{!7cjNOuyUni2Ry9#U|YCG^TRuZoOD zBGI}5@%B+?IvQ?nGe&=7G#ew7M#Bs-6gccY$PnX=)Q??foNm`-m@!5RC7onaT{un8 z^38&}P_EBh4NMX^yV+Rzq`2tBXfpkb#cKu_YLH~cup1(Uk%k#ykkOh#4!ft&s7{3{ St#v><Y4@PSY0!tiYYhTLZdtPc literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/v15/0eC6fl06luXEYWpBSJvXCIX0hVgzZQUfRDuZrPvH3D8.woff2 b/js/assets/fonts/Roboto/v15/0eC6fl06luXEYWpBSJvXCIX0hVgzZQUfRDuZrPvH3D8.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..eacda321c795555dcaf46c05373bff8ddd7b11a8 GIT binary patch literal 10824 zcmV-OD!0{lPew8T0RR9104hiT4gdfE08#t^04ebR0ssI200000000000000000000 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%0Ay~d>kv<q8t>f8cPe?;(_E`Q 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 So1iOIkNm^w@it-9wIBd%&fygR literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/v15/Fl4y0QdOxyyTHEGMXX8kcYX0hVgzZQUfRDuZrPvH3D8.woff2 b/js/assets/fonts/Roboto/v15/Fl4y0QdOxyyTHEGMXX8kcYX0hVgzZQUfRDuZrPvH3D8.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..cc16b36c5848dbd0175f6fa5b4d57966f9b61a39 GIT binary patch literal 6832 zcmV;h8c*eSPew8T0RR9102;6W4gdfE05rq^02)~U0ssI200000000000000000000 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/v15/Hgo13k-tfSpn0qi1SFdUfZBw1xU1rKptJj_0jans920.woff2 b/js/assets/fonts/Roboto/v15/Hgo13k-tfSpn0qi1SFdUfZBw1xU1rKptJj_0jans920.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..4411cbc8754cf7ec78501ba711efabe15b936675 GIT binary patch literal 10324 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/v15/I3S1wsgSg9YCurV6PUkTOYX0hVgzZQUfRDuZrPvH3D8.woff2 b/js/assets/fonts/Roboto/v15/I3S1wsgSg9YCurV6PUkTOYX0hVgzZQUfRDuZrPvH3D8.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0028bd81e9db90411095790d72c9568f1778bd66 GIT binary patch literal 5176 zcmV-86vyj#Pew8T0RR9102DX?4gdfE03+-G02AT>0ssI200000000000000000000 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/v15/NYDWBdD4gIq26G5XYbHsFIX0hVgzZQUfRDuZrPvH3D8.woff2 b/js/assets/fonts/Roboto/v15/NYDWBdD4gIq26G5XYbHsFIX0hVgzZQUfRDuZrPvH3D8.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a5cefc9c67e2f5e20dccc3408988f16cbd6336ea GIT binary patch literal 3036 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/v15/Pru33qjShpZSmG3z6VYwnYX0hVgzZQUfRDuZrPvH3D8.woff2 b/js/assets/fonts/Roboto/v15/Pru33qjShpZSmG3z6VYwnYX0hVgzZQUfRDuZrPvH3D8.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..feec9f1e6a187f63cbb826958bbc01c050b5b9c8 GIT binary patch literal 8040 zcmV-uAD7^FPew8T0RR9103T=o4gdfE078%e03Qzk0ssI200000000000000000000 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/LICENSE.txt b/js/assets/fonts/RobotoMono/LICENSE.txt new file mode 100755 index 00000000000..75b52484ea4 --- /dev/null +++ b/js/assets/fonts/RobotoMono/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/js/assets/fonts/RobotoMono/font.css b/js/assets/fonts/RobotoMono/font.css new file mode 100644 index 00000000000..6a86af729e4 --- /dev/null +++ b/js/assets/fonts/RobotoMono/font.css @@ -0,0 +1,56 @@ +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 300; + src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(./v4/N4duVc9C58uwPiY8_59Fz0ExlR2MysFCBK8OirNw2kM.woff2) format('woff2'); + unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 300; + src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(./v4/N4duVc9C58uwPiY8_59Fz2dsm03krrxlabhmVQFB99s.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 300; + src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(./v4/N4duVc9C58uwPiY8_59FzyJ0caWjaSBdV-xZbEgst_k.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 300; + src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(./v4/N4duVc9C58uwPiY8_59Fz2MSHb9EAJwuSzGfuRChQzQ.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 300; + src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(./v4/N4duVc9C58uwPiY8_59Fz-pRBTtN4E2_qSPBnw6AgMc.woff2) format('woff2'); + unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 300; + src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(./v4/N4duVc9C58uwPiY8_59Fz9Dnm4qiMZlH5rhYv_7LI2Y.woff2) format('woff2'); + unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 300; + src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(./v4/N4duVc9C58uwPiY8_59Fz9TIkQYohD4BpHvJ3NvbHoA.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; +} diff --git a/js/assets/fonts/RobotoMono/ttf/RobotoMono-Bold.ttf b/js/assets/fonts/RobotoMono/ttf/RobotoMono-Bold.ttf new file mode 100755 index 0000000000000000000000000000000000000000..07ef607d50c2e0b48d251910fc75c7eb83a41b34 GIT binary patch literal 114752 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/ttf/RobotoMono-BoldItalic.ttf b/js/assets/fonts/RobotoMono/ttf/RobotoMono-BoldItalic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..1cca0bf456a3b6b42b3c92e81b4f4ebfa7d41f95 GIT binary patch literal 122808 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/ttf/RobotoMono-Italic.ttf b/js/assets/fonts/RobotoMono/ttf/RobotoMono-Italic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..ef92c372cf47ec6ac92644bdc52ef131867037b3 GIT binary patch literal 120832 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 ^<8Tpf9A?3V!vp;Iw4({x>wwGt-<{c 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/ttf/RobotoMono-Light.ttf b/js/assets/fonts/RobotoMono/ttf/RobotoMono-Light.ttf new file mode 100755 index 0000000000000000000000000000000000000000..63229b2805b102f626c06e29752fe28e1ce9471f GIT binary patch literal 118976 zcmbTf2Vh&(`96HcmE@6O*_It|%Ua$`mgQ}E@4aI?Uh#@!$C<XX2T2G?fP|SqLP*$6 zAne@&WwbykP})*PDJ`o7x_)#KOa7j7B_$37+W+SpNmsh(o_of7-ub*Igc3r0@Fo#b zR$Nl*o#LHJ2wi|*ZDma@g`cQD@Wc0NLRfiSQ&Q>^tN+wQ2)`EBdk4n*CYwGznS}3O z5#q68V8gn|-mCpMp+9~P*KZ!093KDB|J}b5`usE@-Zu>Qt(_E4!}YiD=`p-=X6S+I zroJF#K`)_G6C;Ct%m01753cWe9oN%G@PqdV|2?6XdEmQ#WPIJUI%Mh(_#TgHqE@aN z==&Lq4I=c~dQ_($@0*@fytOcl(3{txeB?ym_+WkG=8y3m?d2;cSFK(5ap9eRB=iI> z>)x1LGdO8opZz03U-!We_YyG{qUYj|5fAbz4obDug!gtjfcI%SjrT2dE8e%$?RY;- zuf_YT6eZ>Ry+}BTC$zY<x*0WKR0)}zldsUV;{%iU4Z|tFB-f`0Vf2UOJ$j5Dr?=1( z^j3P3o}#zW+vy$jPI?!;o8CizKz~h7(=+s5dLKPY@23yY2kArf;s0Ove8`TnBY53} z<7Re@9cQ<&6YN%YlAU6=vD?`l>`rzUyPMs^e!xz%Gwfb=A3MwLXAiIk*+cAM_Q?Ow zyFO=+;&=?l<2atc@g$C?ar_X+k8nJL<5?Wf;rKC*=W)D%<0TwF!SPcZFXMOx$E!Gg z#$Lnma~!YZcmv0qIDUcSEgZkZ@hcp^#_=|e-{5!$$GbS*!|^_j-{SZH$M0}##PNF^ zf57n(j*oGCg5y&hpW*l;jz8h}oPB}gOB{d3aRijIkmyJb=Cp`(kzle5M;h6U!$Lo% zpOAF=8H*(uEP>^bO{{?Rkb|s`ts$q`dbWZ5kj=0e@(kO=t|ia%Kkz@0cL|qXq47jP zh~lWi404HZe)2cS5W{0G{QZuwIUf?)iC-ecuah%t){4(LyGOtMmsk`1EH0AJTk6CD z&r+PlC49v@cfCU8Z$#OPU&QaBL{b*x^LJ!BQIcMqG2)5-X~|Y{f}AF2$dAa2<mcoQ z@)zQui>aC#sEH=iCfY-X=~lW8>)}>V=wIm^3t?8)!Jfk0{S+hpf1Gm8J^5m;<5%zl z{4l?jpXHD9pYqrEoBUUjK}wQJq&lfzS|v?Md!*N-UrQfK|4>kckHRmUhUbUx4*y&D z|Aqf2q9)QiQWF^-85L=aOpY{1W<};i7Duj&+!lFT<eibHwF<4DHb5JtHEI*J%c5A6 zGHP*@Z&YwpcvM_ec~o!IpyB0z{@5`$XUDn}f6g98k|^}>R`l>*@(g*2yiPtPe<gF& zhx$?@jixEInfB5VxrZmP3ja#KW=mW>d=Wi-8$BfFdw3aocqPAvpW^rPC-}?!4fK#m zMk!e;mFlGdX;PY&E|-2Ty)FG-`lo^^)ZrvNFMNCWiSWONe}x{BNWaLy$jC?odYBrS zdA^6I(8C{G)Wc3!57qN}xZKslS;2Xv1(I^^AE1ff)1tX&sCDi~pr}~940vhrioh!j zFTv*n<}`EM@lVGeX}cI2$AF`d9JK$+e!Kle`~7&o&3=phsC_SL8=e~yCG0Akm(8A= z{Wl@AkKlDLUZ?Q71$Q69>q?xL5%O{M#|u7s`lHW3YWV1nAJGp{`-gQO)_z$1VbLG_ zKFt1u_lKz;^56Xjg!c=)rhd2LcO$>+{@~E>8h>Z}VApT&{$T2Z4IixfVC4tB9~6I( z@ImamFM7SkuAw(LsaLdvye+>w--Psd2fYFJrQ!2lz4OWt+D})`|33emE*0NUVk_RS zcV40B8T}{71vN4oUe$R03a?M_`r29M!aMu(h4Tw%?6)Y3*Z;#Gmwf1-=;!nc`X&7{ z{R`PfKcQdKb99#4se{g8o$g=|AdE52B(jt2VhW~YD(1mFnHRZ?>}DDkzyd+5K`fZ; zA$zedLs=LLXA$Ib`Z4&;KKd!Sg6t;;SS_n#^{fH>sgX6YX4b-5SsQC-9pp-K6<f+W zSr_YO%UBQVC0CO};9~u3fGuZ(Y=|5t*9d+FZnlYSW?SfI^pEtf%$r@uu4gx}8`)a6 zj!m&?@&oX_zmPNRuk3H^?^tX1vH!5I**S8S%`!W=pE=kZc>wI`K~Bj-oN-Pb<`Q{? zJjxYZ$yM9~Jj9E8^9A6Ri}+&l9A8L&Or9q%fG@p7enNiAeaOq?6<)^!$j^Bod7Ure zK|Gj;kT=Mi<QF`Q*Yj}l7LOpm<dIxUe#N86uR%S(0bdFw?{Gaga3eSIXdc63$-6v` z$MXd6yHCky<c~a&{E2){zTipZOY&#%z`ycj@;9EsQ_0`CnfxD5;|<(G96X)OaVyW@ znLG<>0i}#*^G2RSIhCk_f6beCGxekXR6_%J3vUI7G4VNx@c;0CgV)5+SQ^LA@mU&A z6Zrq}uXr18=O6P=Xd+GGcJ2VjP2r#N&uA(&(==+K>D0<Q_)`8y{wLnayCjw5!9V9; z&<vW%zvO?WSu~sG@PE-<n#cda|H-@gGTuY;sZCNyN?Je*B`Pug7yeg?OA;;OEBGiM z<16_%pWv%#F)iVL<A3Lu@!hnPmhnA&ujDCt(Q<yd<jwc-E9i1MC@qv0&>8*_-9(h2 zJp4hR2$?efkAmAe|J<MRug*Vr-U;f54yAxBQbBX_BwoZD8rnj#h%AO4sV2U}kN6V} z2_S)F2?>Jq4S@^`gANu!A|bV+Aer^VK#ashqDc&iC2`Qs5=bIRBFQ9$q!Ke^wS}Y; zE6E_4B#UH2lIM~<l22@;fD}Te7n2fFO3Fw%sUVf4id2&tQcLPcJ!v3~q=__>7Sc-E zNIU5uOGzhmfNrvk^a$xGRxJG+{XeYOIjm15)}{*U(t~-i1#A&p$QCmn=F8N~kNIPr z24bZyVZm6bp;)C@qjZ9-BK>554AV)n9(u(%8Kv9ES~5Zpl5J!My@E{AE9q5akgTJ- z>0Y{r{Fv@1E65Ca6l;Gkq;?-!N%xWK=mByc86z9%8p6R(zN8MZV#U1CF}f16dxY$v zSF=cVCEY+b(RFmam<+m#Y@nlboUR4``3hX<AN23^U-aMfKlGo11EIt@nfDNIkekU# zGC_`$TOdcL$SKIuW2l1B!%`tnR6?1-+@)2W4XbarEo6c=IyhEF9;pto`QZ#dw1^)_ z2QE@l)A5L}udiD2SQ1CM&d+34$nVtd(<z}zi9VeQI;z;|c!s85zEyt5voLc+Is!c> z1oOYH>TDpMWm@FT_yWcV<)qJpDwR1^i@lg6DLOn=OrglHT8M|{QnbP#eh}BVLhAqa zU9NH+w%~~Hu+Wg;pe2C;8h<}uwd>Ev$0IC`YSB!c1u6($W-eZ4jgD(I_#NN0>^F`V zYX)kdS2RJ$#?%ee(QLeZ^6w@}9DlAEc#mc`IbNVg9YgeJH+{U9o^Z&oUPoCse)|`F zTuckOe=b?dR2~F%ZnAm%E=KQCD3@4e)!9Ypax|f!G^&^+3Xq&~0t%(Xhvms2Y=9`0 zQYVq1ZK2OFZN6EQ3l$P`a8bz)o7$F_m1#*cr-p|v2~_*2JpAKmS|T$ga!Xnsvs%oW za2}{j<hrOuOywWW0>in+AEz3fC6SxV;oO><$N00U?Nh}~*Q_eY7`VJ{sCDl$Gn=BZ zwW~_=#~Tu9O503X^EKnP?4kV)!!0+gDQ43&t7lWOZCzU$9k%sVW-JLQ?cdYYvbQ%= z_3|qo#cPlERc&2r)|U<z7WGwFgF;LCcXzh#?a5I6@M&e{*exsDw>BE7zH|uG7eDv8 zbX@TQxJ4XRb{ke|t}Uw*ths|KRjd-!10Dz~Pa-O%q#A%Sha!X&S7E>uokXE1QB=n` z|MVUnp>clbHb#SKL^pL&iOga~x6SCK#e#tm<Ddb%6-5Fyi!d%2tZ$c4m}p?UHoqq? zzb9X-&0mI3o3_{2loK19W%Ttm;xpUmi<%;B%kuM=*|b!g$)#u?F2}`Y8+?5YIdO5> zMzv$0hBekmC#<7QspiH}Yfbt{V`^%{Xu7^4OK-?3*Vh;-vJHmpO8x9p>7%&RIGSE- z6=fPnthl7tXIB_%4JfS7sxUmADA^J*0<aDC&V3=Bz}O{#KUR|$Y(Dws1Pw%4N@Q37 z1co3yFA!c7M#(*B5PF>)dP#1Tl1h^6oK=TZo%Kb@$csyM5O+b|iGeTSqMZN#SmS@M ztfQmDwm2!VqAW2xDO=|s9-|U$#YwsH6beFB(e!ky*<Yy&)R~k@c|rwY`vs(1sY#_& z24Z%(G9b{3Vy^k6w`#31feFpimA28Um`F>haRXf!pUftT3m>{_b<LCGT}M~t$5#$y zT(j)vT*n?S!_q#QP&YA53(c416wsiAd{au5IfMtswYGOAS8QxcPN*HpPHCws3SaJs zEkE5g^UI}wxU#Z6efhz*qV>aFarOdQT}VGz5Lt73P5wwlj1*saRq1%*s(eGCIoy!f z2;KnJR>;=L{5HYKZM`vtv;%60%xmFZ!Pgdig}jm(?L)q5<`E#XS&Nyi^IfJGQ>=CT zoJI@H7v2s>EMKPVg@jc;=&PW~SoXfY>DItSOpv~BKtQ0%Xk^Snx0KG@-W%4kr#mI3 zdrwPP-|aIctok&x2miNn8ghSPcf5Dh|A^yV`^)(?xxaw=Q*=hIzZLacFRI_4F{R3s z$9%Dnn9*pm1_b!}YPhvz=Jr0he)F<DjbXjF&y=#<GmfVnU;ZMuCii6rH6HOlN{x=6 z=GNrA<@mz!)M-&ad5r#4s#fGdX9%_hE?T(2+so5KrQ{4wE*K_c)Sr52;;6x@;AU<J zR8SS?CYI&cs;8U1H~7-^M#mPqp#Q7SdwI*M)mPFR97BiKtaCh5Mq3?cic$X*IV^Qc zk3hN^Z94E7rf88Uq$~wP=>wTVeFlrIk)?!>(jyo$LZemd)Q}KrGrN^O<tUzZ)Y1p0 z*+=UgI{N;4`ldWCI~>2ktxrMc@v$vbDwwmiL87$=L9eEC3#O~XPnQ-|-M(EH-`-lM zP2O_!X3^)5SqFca{SYg6iA{s=7fra@N1kpxpTBGmftRCW5CvHH+*j;#@&x+fXA}M~ z+KI_8q1E~*QQVN0Zcc@~!@@AKaBEVs)ta1SZHdj!j*YciQJMzM?c$$8_HyU_6lw~k zIkejOIE4<X>fTA#JGn)ffZ91Z4xVC``LPa~7{<;N1RaTj5i|MGV7x9CTtcej<74!) zF5u#|Cbg5ZYN&r87P8E2wP_|A4t@&;ESb|MPfu+)v)W2&`s&jgrp`=SXaB(2p+%{6 zE6cif)a%*p+`eXUTJ4IG?j3b{X509ilRZ5rf3uM$ZT!t`Jw2!1+35IDjDa=TCh8Mw zFFU<V8)?5cZ$(Xf9nR5wjOn|OlAoZzO5$%*D<ollmE%G#srC_bq}8bv7K536GVK_r zU#k^CXI8_u#eMzIQT!CoLoZFV#X-(WqRX%gm^6t2lldRIE=gi}irRwp{&7AEkDxfM z)&hCrmMtosYXk%>P_5)QyNbSV=_t_0H%yk)OgAOKS!r8$YN+?vWUjek*z6c(jxH9K zGcmR@vv8s=K5glyilrx}OEX8W=_tQ^=f*6D1<ynK`sTjie@FZBNQtd5lB$T@J`f0j zKA}>o6v|1IQz-~!<c0QLP%83r(oz!>VoZAf=tvL2XU*Ty=m3zDQ*sLRK%O_DQ0VC4 znbOVO>GAceOG?(Yq|j+rwC+St_sy&Gb%o2aF2A~D=G3y@yS7%so=orFQc*V3mXf`E zPt^<$qQ>%(;<8oM(Q&n_id(N)nQI-szBhfKrAT9Ze0%@V6`7f1NBhdxHO5ERuB)zJ zT^=Ruk!H+C7v|9m93svZy%00v0p`dm6&F^qB;`~I5yh(2Lf>;PV<>j=G6rF5)ha&y z(MMDECU)yC`$`s;Nq;%$xSCED^VwMgFCN6Wz5#l-;W_an$Cjy}N)}HgCG-wSsZdJL z)fiDqOew}xo_Rb_p>RvXXbh%KtyX!2#8E$?Or~QsLiM=B_{sVgmCD%L_A67<57ZBw zn9NBVJGH9wru7wG>pat%*Ob+7s5K<CZmLbJDas9pNAtyXjvzx^$(A!igJ*YDr;l9U zQ#M%}lQq1*q587^j0GX45TRRNhxUgmo+LV0N>*E143uR-x)kDFL8SrEgxp%W-K-O% z1@3RqCnxGN3>hKO(OOyNYIKXZ>H^`)N)hx&$;yS=sDX$TYNDWV-s5}t%`3`Pp|#yB zGDeS$rdh{tU9slA={y=)yz=O)J3q}F?<!HJb?>ODUSAgz(=erYa-8<w`qtX$;^dHq z-DkRbAH1Tu^SWn-c8t98$jz$@sQswk)@kiocFP(YEgU~sRkd$4U(ov&mv2-_B5d%7 zQo(}oE>sfqMP7oKa_$irN2!j2Yf4%6!&}&j+2{Gwim|V+Q<RK}zC$PfLaM{MF_COo zhZb9Ekb*G<DuYPi3TV?%lmtt?h_6*w7TPk>6XW$!iAo`c#A0?T&gT`73u+2?tCcQ2 z^PAtLSc9#@k~3TtTe<D7?qzpxtBk1}%(1lDbOmdUF6}tBuBa)aXG?L(mTs%HdrMi# z=4DnxYRhC^{zOw!O4F*myj9JqQfBr@OMymH+_k1~;Km_K+VG77g=;!XG@62zk?iin zL+R;5hi5-8UsoR&SHG^ja!rjXx@I-!1uJV}W2(lBibg9;rivAymz(DPAw^+41id`@ zNQ{DkOk8?mgo=vjhXidK@=?%AF|<S%0p-fd-vTIq-&@S7BMNipdy9$MzP|)268d4F zK~IU3TB9O0e%_u$M|B>satwLg>QvulL&v4@ODdh!52R{!^J77~bnB5fcIEKkimnOU z$jzgc%vHCo+<M<Cb4cFc^{-wQLO;t{)m`En-@3iIcDgApx_(0+?LPkIRD4Bxc*_;{ zE$x5ws#ZF1+Z*HSmOppjb>n$3%>Q62>&wdRyJuTP$>gD$@&gma@VCyf=DDx9Rx&ap z@ku9O(LN-duOy!LQ~DTRdDa{!%J?{b!^2R<gsZ81B}y$KSAkMJ?<ek3_(sVc<P-Rw zvLVNm55j7Meh0Ud1+PT*#_XNEgI(=-Yb)K<OE+SrU|#Q~hoo43Jt$s9qHGbU0m=^i z3>+@V7Km)Ia=5JT_{b7l=s9B5#LiyEH;WgKUtvGDLVot6<TFVt<<5V$c(R3GZ`bk_ zv)8k0Y2qfwo?gf9P4ctfoBKE1LC?dJV<8zf3!cqk*H0>8{KCkc5M`XygvBP?Y`F@! zX(5l|aZ8NeKT#!?F(&joMA9Oz;qw)pP^#AFCYUO+qKsujw(Q~BBsR@$<JYuy9v;ew zEA2|w#s+&`m1r_0C!0)(^xFLH+Oil!O-pZP?(!02l&vSXarZK_rGH;b$;?=HOn6p7 zd7R@RT}ld8cOu3z8*Ai{;xYJ)R@3;Zv$3FN^$LB|0*QMTQw1rZN(HYBasB2o@3#)8 z!DT`no}76Oc)+ztiGssdBuT1HqEg9xSlJ2VHCHLDDY2mbr{X1Yaj~%er{d1qMa%!E z;-Yq2yl6H&)C0tW6OT5bEPqGaQ5=i2!?tK*Wo&#*bZl&Fw9!lWSr#c|*X3DYT? z*($D-EpW-2E(~xb9O2F%7|a!6fup2ClvF7Fof?PL&uA19Q#!~N1evmGQw<rWAf<1- zB~KTV6C1pUaSwCLOig53oK8)XnNnj6*P2biJ|0w&ICRU(;m5CRS14k~pEwXvQkc6W zB&4LOI%?tvTUt{6IFBwL*?U{>{vWPOwns44;vi$NE-TrzINmotys$GTlB*I{tmv;! z2uaA%YI71oblJ77?a>4G?x^w!id0jFM^vFD(vaKG)^6JS{;`(svyQn_8{fO5&)YA= zr@=2m;|<w&^uDg)=g%A(&6;@X+$SNnf}EsKU1pVuKDNlOcw#@60|pw(y|e>*hYA{w z!4~Buyd2Ovu=FM9qC&`F_=N{dSSYfhDV$hPY9Q=5-)H~Tjv4ySO8Tp5`!xOJ@AP`d z3dPy4>*4lui26Bs4)r&o{s3_LWRhpgUVzmoo}i-8iMe3$vQGd6DKvYf^I?I31l-oB z57Y%l1uwzP8m$KepjoXA=PH*J3=o>FTI*b^CWHG#`y9Qp{mz|r)L77N&L68ypp{#1 zU+TD*wiHfxTFf2mZH|-FkiVfbBdd3#%>kQ)CUjplkT+11>9;tqb6rv24Wk*9J!L;l zp(mD=j8#UnVH#CDR9Z1y5Fv~uvIVld3Vg;)(rsoTzByBX%RtLlfXi_17Ua;<g^vgZ z3f|4coS^ql(5s-UQzyBZEKYiJImRRy%;A#Ibgfd=g366|j<g*duTKl2G$^fp{9xOP zJ2zH%Pc5*tZ*D4^Xv)&7)%vWaiL&M`Z5D6(ME~7eN-bTRuR2=&i|V6SZSJ;|Zn<Z9 z)nx;j$@OE?Te5$dy>)u5A=%o0nP?0n_hViLFfR*92#L4FC=h?0KM#^~9u_SkWKqbX zVD(}YT%Z+7h&%_vWu@Y3=<ZhGzq_CI9(eD@ddBK+eDA<#pRK=tLoR4$!~N?OXW5De zzT9)wo-ZF5Ws1skA*}1jOXG)EzIbDo?Bb{7r)Y;B?eHcsHY1cF0>;({F2y@AkRS?| zt|fG9nF5_AvRW9)@{2!b-^xCky`8t&BiT;&g#F$T#o19i%rA<F4v~^jH-xn<(nZsd zM6wJL+S@njTIlPdUjCYW^EB^<^?Mn+%ib>Pds)=C9`jy-dAE{GTRJ9Qs4SR%cne_k zC<%fk3Q_&Hr(dmcO?^n50aKr-_~y*3G~tTC0O3y(valj<Wc~KSwnOV$Gs7tju{KT~ zZ0oyybB))AMVakW)uodyxh7x8;aFS8n(~C+&blz_xRbte#$1^M>DayH>SML9f(ABq zS@KsO?=78fO-ZU7o!XN9TJH9ll?_RhdWWSN>GX)`6C$xvf;|3OTR6r@=v{q+8gi;& zeF_Wn!nng|6|M<TfZ8l2thP6=Ud>Lg#+a8X&f3?oD@A?JqP_)keHe2EsK{lmz=DM@ z6{7={>q3pfS`lL|lz?Y>mE#&ZKKn53cN|xoU3t#9Vud6EwPY2>ouJM@A~XsHuEMym zGBJg&(H4#fe}hw_FstR&1$U~8iSs=hS@Fyr0|Tcvl&UuJ)VArW>WytlOmTMBtN*Ue z<+-bm_m|JKCS~>S6ec=FoRCPz@Vo^==l6p807|K3=!;;6@|gJgseNVjMJ11i75oqk zarViXnFr|?*V*4@^@rITFWLWzNBrY8mTRAx{Wa<Z?n%l-y$TX!3ve3{vhPjiuRg+x zFo+Q`(`NSZ?5XJy&@%436Zd7~Y?1H@cnQWSTiv+A=%hlzN;=P_(f&nbksq3;gmLZ3 z%xIq<n&yX3S^zvo#<BIDj;CuKZ+T&H&i;gFfLZTm`)BXq)%IQXP4e?@#q;8E=1IbB zAu5CqAQFVLHm3^HDM-Rs?JJM9R!2GLf%=)H_$m8xIyJ>^rc=_-&Y2Zw&sn5bFjt#h zc25}W9$`UU%6*fNkYJQYQx@BjYjH?{rbLMGMUq$?;EIw}s-sKHwPOd`S`UoZnFU{j zzh-}1+kx>~^Abd+eDs-(6Q!l&jhT8M3f)Y6E5kS4V#=l}Z#uNC$7=1_e&}fBGx)N- zSN?KS70cQ>J>Hm{(l|c7HS@WwEi>bdDflw8B}?#0AP1xgdF(@k{ZF_8t`2^|UIPuv zLqbSM5V+(bvQVp53V$gE9KuQta$Jy2w0@et+<WJi^71Wr^*|;ymT&H|q;+ksaNNt< z?RSA)=BzrteEG5QEILRN8#h!{ZEQ)x{4%m)j!DDdJzB&b(GCxI{5Y*tDTU+jJH|BD zIi_3{s6t>%=r`XzvcohyuczSaCdU`rikOZ=tDDk8C=E_;T77i~zBO8d=@eC)a@y8b zRIF~x5!}bul-r7LYugZ6plo~7-8bz@_`DjtWr4M4$Km5O_tqT0RvzOW*W6OWa(8aT z7$-MQY}}E1Hh0IS@h0(Q(+-5>7;tn%8p0U+A}*I;i(L%89rFht3syQ5cv&9En!B54 zM<;0Ay2!j?rW)uZE_Fc5?s43>f!@>$+bFJjG@n*)v3Jni;tg#n>D}8Z9PhC{`z;vm ztnuSR71Mo{!S<^cvKLu$(>mcDix<L)l6|1vr5N)fS<b@+2S?l_k%X-}fkAi2GA=k` z<RF+iA}nZ$Kh~cd0+T?*!ZMUKP*(s<7=wY~if{U7_-`Yu<&CY;=Fx$+0z<>jQ%&7> zZL8)p9_dSGDsrcKvP)KM%e1T<Y%ef0U3OP%??VUM`HW}5(4HFGrv4l{WNxsf7{eF( zn9K!@gL$0?dQ);Ij`fzUZ%)z{4Hj1nl_sfuV$zFRM{T`V_9SJjyk)3%rXeP>2(dqk zm^6{rVh&U!#I{6m{tE)wsr<RjHMLF_QEMH^>!~A2(kRNleq2#DDv#GOj8`)12qKUr zaCr)b=^iJi5)?#&3>t$%m|1=<F70Rbb1U0Y5@iJ&?iv}rYeOMrt2s?<-P+Kwr6mEL zlC!ghfd_Wi)$Vy<fWJFysM<efvyJVq;_ssEzza#^c&?IYY`&uHZaRUWk$I}Du9{gN zJ-E%0u*#9J?P2NM*Y&uAB05i`qd4;sZC(IgFL*12m6NBsoqGO$!o^Aht!S-yL%0_I z%(Tm6!CND5E%3Z<@@G@O{b1^6t7+xXkTi7e=;)|4^mV=T!*hkGTZ}KfK(e0gEx4ek z5^@XA5z<7+Sy>S|AJBFR6EJORX6xzdgN_RN!U4xl$Bu*a1xLj}UdSfwsrGQT6PnNO z*=wjC^@9ybgLsw)3AF`@_yww;KNN_TJDpT!uxyT++v)Dh9SLlbITH4>>v{0(I{SM} z&kvxk?WjxWWS&AN^F$03+MrmCE(tEPyz^qqS1nV9kXt6<{|cmDsB9Tyc6$h)q$4BU z(w{~#Ly)1*JAT5$mD^pO0r%R5V37k(!ZSeUc?KX@WMwS;(@!0D(51@Y|M(B79uxHt z#1h^>`<$@^^i;&8bD*g>Ll?p}A*)&MYQ@?Az^P8@y?Cz2`R9VP!8`l#Fv?m4??mv6 zQ4xW0lepFbu?aNoQpX*ie4^a`@A4t#7pRB)gWbe`EsrtQ2s~1<R)F8#p$xSw!SQso zfSWXQbR8|}pvCL#6gO&SKWA&eG*JG`+)YwAn*2TS7lqIR!)LGJs|R7B;Ylw@uXB~+ z9ao=S56yGOPw+f5SB<=Lwe&g_=o&`u!CH)wYJp|RC&jjcG?*yL1lZAnsbZKpAS0A0 z;b<Pf5Xce#vMLpI8Dm(i2;W$e@{{wSRz;gUM0^3EHs_L+*_j!7zc7sviE~=lYX5-1 zK!ea>E#h~<<M`d)3s^*B-(+s}u0CtyfyV~_L=)@AZCRrYsqmB(t+}DK^@ddiU<K6v zkNma0m6~_z4o?<E7k6nJVvV+>5IFfuyLUDiH|2KcM}}uKm?>QT$?@%%wcEc+pGaNM zN+UDtlD=GG?J7yBwT6j)za)4N;+rCl|GLdn8@bQ}C?>aSF$A5>6X6rt8C@ov=%f<_ zC2TZT>=_E?#YM0<o#imD&SE0;{9kGkIF|oflPJM~^}W!XZ#+wOZg|GTK!?-IhL7yg zH=0yJ33oa9buPEBO6_E$7Ae_0dSYVa?o7qxwDtDURVPQxGf~ysy3?1{Wcm5$)^(dZ zx76sE@90ZMx?AcGDT)15!_v+pFRg4iv8^sLqb|{*imxz-)^0n|01~+s<EaH5#gS}V z24o+sT$ywb{+MuwAj)L-tSq77)u$vXGBhMmv%pKKAaOKKU_lJRs5QID=Ud`X&<dN* z8E>{oYo+pa*Eda_U7wx3{_KXOM^+a~Yk6wps)A*^n@y(X-3_|J?(CYK%PdQ;|M6(- z=#Q^onmK&1Id`NwwtDlihS<jAn}m4_IuNo*`UV|ba50BqMS%`n<PJLcHU<H%%ZrN$ z41#;AE<h0eOHEEX_%Ahq4!}&-%xlg!p7l*SaDqz$0zn1m(Fktvh*j-en3`khW4DeE zpR!I(Dl+dF8oPBYeMVQiwbR^LldJL1uI@_f+FGY$rj;)p>1?lK9bc1!wN2eeUK#}% z)CQ-N#IXelmFeMif($U8BEDk<9Yi8RWwYgmhB%|K&gexSJoe7;1%^^M5`?=RYb8oc ziOHyqkBScp^i?nLB9Rn9KmRy|K)YC6j6<UZHpmPd1)OkPa1<?A3%hFd6T2%Yt=f5Z zaOEAVv+3-wXvWah?aNPQR);qZPA{$4*p=gr{DXw1Y5(S{pB;}|_mgW|YWF@gToKrE z(}pryU7i_RmKw@ut^K>}78Y&m7Z7|5^TUvBeaZ+DLQ-srKA>hbMfgQ{ycAqg3^+9( zr~y3R<sZ-(3_>)>!8NU)to_I>mw^p32h?aK$<e?zQ^#)r&n#Mdq%Cu0#^Tui^n%r` zsg&Nw-=2-;Z}+#Zy0Ir_(ZV6`MWID&T3a!uw>TOkCC1bU;q{ztQEEy!c$G3h1A*(t z%tXRN>*P=}vvNYS#2Cw~t>QdlMh|L5i$!5{^SjFm*7e`(wEa)j3D2unOpM8B@Pk(? z#07Z*1m?U2ZViyVSr!*y=369sOWN426C<}<6_Ye)^@-)lBg;FZigui-nQn-qnYRzF zymf_TTBg~qnp}VXtm-by1)A+>xc=O42JV<D3`i_VF26aob6fSM>IOFfhoqLpGoDaw zjgSf0>6ZuwKL{cfk7$IVAw+^$odH<WU<EF9zRd0J3=tQIwB}nEIv!PP44Noe9|YD% z1bkqFoM*zq9L~)A;l_@A-6_*iB_pMoBkd&t)6;x(WHYsn9_hE&um{W6)Wzy;ZE1E- zw1|=SL6b#_r=f3Yg#F`2lwFAP=gX}U3X%vi>k;d9QKa8_?+Kk3n0O!f%gNcJbgN@0 z?Tk%Hj*Cl9iIuWulUJ<ZgY+6hdb&Ypk>mM{{Mb>&3-Rngq7zX`Z>R=dP>ir56bhNz zoB>IJHUNFOEX@kITXdQdgA1^tc8MjcO9H92^IJm`sKYvXV_#;E)x+0fO<kO`vLV^A zk@m!-B*(`mr^HBE=UyB-xjIMXH2_yCjjG$$&3{g>HCQZiGpTHYH)Et0ko-qwcg*?8 zQ#+Y7V`7A4I~?H<q0WhUJO3NNqL=j7{OQQd%nthK5l0x)9A&zFjv*zP)o%lcC&PXv zc!fMKc&;b9ex6oje^%Z_6B1(c$M68wBlQVqxqF^KDPo=krCgY&_koX{z}#$iY*&)6 zSFBi}h?Dse23T4z>uWdJJmbPW1>#zesED)#IK8tT@cf9i4IqF_2QGyr*n_H6`Bly` zLYKLyM9BBtZ~LBG#o`t?pG1-fayMv<I#0301Dz!A`q03X0OhNMGkD&a`US3C+n!jK zruUAT>L^{76+|cLB3*t;YDq$nQa;a1PA*Ca@t~`vteN~8sxew3avNxJ<I0@b_qbkH znh`~5cyf05>~lORsxU2*($J(_?d<bX7Utzyj8!1UN<;QN;)}_a$w3U1pS)USkJyEU z?1U5ox+O_61-m$;m?;75tvV})=#qEZzUwA2I14d28luqv&?{VRR2~wDWS!b*R0%PL zGn(X?`NNq9o&wlr&%vzGwj#~6l=aHs4E^Qv_A2(^b+=Gs;ZloTja~^punRJ_Lhe_b zuo7iSiVNW8u5|}DCm^OW)XC2+J)KI`C9tErXyK*@SFd?+b0MV#n;%#spG_xs?d@pa z+nJo)b$Pq^WC;^5Uf14!-HQ`ioV2y!r1iw6%F0bATD2`FHdR$^Isp@zk>?$~QoP)@ z7;@Jo^lG;Pg&}qu5ki0hkvLDU#>ES|?zf9M_3H1bNmi-9uM#mao~Cc<%a{r?=0^s_ zT+o*TWa(s);)T9EcvmL!Lo@Ff5&H79zJ6O*T4z<Zf9%bJo!fu_leOjAO8a|?cdo5( zcWcXGmWp`$XU+Zf+iq>Z7#+tLDK3mrL^y1Z`8ucD*uaFkhM`1EZNYgdE_BWd19-_| z&N2F)nuId>y_I}pjNG~;q_$3dk)TdLuSy;l5TU_S8Oq7&tlRo0POh-b=<Bw24%`&4 z$*EeJ+9gIvRwP?$ulm}^qAF@+IehE3`u;{16<cNwlSfF{v2Zp?sTd<)@~SgPy#Nc5 z_;?9-5vz33iujGs`%QHE;&SrW^F`1lXJx*40_lYM<XSb5maZxTu$nNm;xZVub4@v~ zipno_9~6K~-Xg{iE=qwF^-vOD>Z=f*zEqb!s8sn0V$-Cj^MeUX!xzUk$KUu?9NoOu zqwpQ6*4t~Xr`Ofj*{h|jrvk<{ftNjvH6MrZ$R%c5G9=ffe2lU>CtIwrJF+s;%t;6* z0TBc*8n~|uV}Fr@5piu7!d{MpyCNa{q13iDw%WsMic8lVu4zBAwwO<|wAS&g^x=jS zn$o=5)_C2T!iuRQ4V|}cs^rtkf}Y8A>v)@$`lVJ{^b36wN(U=TC#p?xP17}LO&Q^V zNoC3AlB9@*>XeEVmDQ`O4Dn6V)wWi%CNQZ2oD2QC8~t0PsDr+ZnAt+G>P2v|u}XNP ziE@pIGLjCMl1|;i-9_9OLPDTsLG$(ykXSh^CzJ~q2~H9<$pBeaPY*d(A)4EgnmTIm zjoWN1-?%i5I(|VD6m^cz`|WM{P3C|_s!p|9SF@>u-PKP8-t|SaX(4#7hHQI8EqJTj zJ>V;Z0;ohNgMvyfcm)DnS0o8Wpi5W0;0(CbeYWqo1?2On+E3@yAPues2SZM9qjW3B zD&#k$-#@by`r{PazGv@US~@d%cgOOq$&(}OsD1gVyEd=j^xTW+hwv$Op&uS@zo$&# zvb)w#_In13z!cn3tXH9=>$W&D`yCluPHHs##&a*qGKT`kNu--`?koJC3+MYkh597x z8ESv^CH$WzA@a?%I5PUt=0~G-*RJ|&-;W|ApYHqXD%$hRGwfZv;e{92yXRhHADua4 z55*HG@(-aQ;p|&J(ERW9flku;LyqP2^p%cV9JgFWPdk=h#kSKY>|fe{Lx1KlGZXW3 z(pt5nO4@?@mk^UpAFxpPau>+Dtk4bRX_Z5>&|U)!204Cb2*dyh2`a<LWn%?H#@Yku z-plQ81mrZ1l`P5fUxevNtj<nYT<Hkj`(8FbaxN%kSyiH^VmVXjGs~h*$lg3ku#bRL ziRXWZ-xMvtiV#qHF-7zIrdHuMRUv6FXtt8F-`Ugo7#$pJ=bMIw+70S-tmMB}<|020 zIB2cxcMPPoJeDH%gPzegnXQS{R;O7aqqh^e$pU|!1!}$(8XF8&VO^^<N~H>je36U8 zU+cWQGm+8*`zXEqAf@pzSo|uN=Y~+We(l=zj7Am?6ggHdZrOBG^Xmup@Q{#zP`-Qr zo6R?EX<b~msBCz9>6@GH((CWu^m^IW!BXG^C`)rZ#6*6T(=UtWxE-TTzbyD7J2E)v zct|-b&)4~W#gS;FSAiAKN<T`<0Wm8R-9{D;J~~kkt<y!p;~@B~Kpdb)qI2jZEDnuE z^vI074ADC|-bO2n1_~o7-LQ7;2E@;Emsj|9?^_yA4_=PtEqa^Sxv$gl)S}YCZKbbo zx?8WmYxA3>+lR{*)h%w_a#Qo0`*-uupd}%E@BY`DZ`#zdSd45oy;HiH`vEA17;KC% zAT|CX5D2e0LR2C%2)a23SV@Laa8ef?6Ya#LyA-s<i`}J8Q^_h_O-&V}MTrenW%`ix z%p7fEX;Ki<<xPMpCpK1>=|e3U+4wOzh_XNBuU~4>m@JWjF%bZs)yI3-*0rYvm@MH- zV#9rnd5r*0vBi#S*ppHnTC-S00>lUs+KmfNkEd)sI{n<>G=4H*-y)liEOC1JV3Ns{ zlw>j{vnyv6iqWX#B%LlfS+3)bId93RFanETWh)O2VhWBNI7EiwIl0&;$bp04iUD|l zaJfx5f`mOpSPdo7#wcw_@WKV~3qst?_X|4nz>v@(+{g2C#RMdVu`Mp&U{3$eikab~ zLuT{P(czieUA>w7+up&_>8@<gk3aVAJN)QCY~N#t`xd<So~Ld3W!2yC5>n(li@4GA z@NEK@M3gECsa=yERPyp<oJhP6I5`<6SS&*!+$$Hu5l7-QaEz-1)M|fkfj9FDP^tus z0e~12*ICT`n-M<%9q8kpG}Oqxm<{WTF!?K~=aY|lW{h6Htn<+FbQlP+6+?N2!)1C; z+RpYmJ}W<H85~@YTid9mO9rW~`<4wwnZsAM6pd9F(>gbnI^Gvy0gUV5+{e;2(hacQ zt)$-;8SDeIQ5&+vcd;kZ)_9Z$MxIv&sTnQTsSqo6W<6>^rZOv(O$*r|62c5t5JInv zauE}7{|X;ZT54=`fPa((^p7mC;D9z^1%hs@CabJh!|4+U&VmFG5p2ek30CUHzVfH? zPxkel%-`0$*KEm3zp8nE-c8-zH|HH}Ic&*DOSz(D_ObLq#F?)eOiv%YN_<+^<yVyF z9caC_=8@ikr)qC$JCa#gly!6a$=WCSmpxp4V;ie&xqDA@^Pam~n(x}v)U*c(2{aup z4e3Vkp8%mtfuDGYI0x&8*(^}#T<Y@zH6nVYPyqNTvNMH!F8|4s2vLAJ6bCe6aAa{n z7!1)n_dBxa8b=qs&CxaO=%>f=nsj7efsHGEVOO`k*6MhImbSjuhSYU2CoID8cXor! z2USFG)1p;^x5<l8Ml~_`s8vb@K&gbQ6$01|0V8Y_7BM|N?f5(Avv&RyCbknGqYkyy z2O4dFw1)=O-;xLiybPdoFFT;f8N$(`a1XjBuk&I>b#Y-{Zl=|(Cti#k7ktw_L+%vK z3qW#ro~AQQ%?;qSK)wo<5}X$N7wAc;PoLM48e5tgQoa2L%LX34q8WJ@w$Xi6C0l#5 ztOJ+Vcm7~cy*9fsCAu&%xO&GuJ!AK7Dq_>j+_j^wd|OXOdjGzr&L3P>Xa9%3Br>@< zPfzp54>w2ThNX0r#86r|c@4eK+FqQrI54xkBV*~F_W0BlCs(u9&5fqW{AKyJ_JX9q zCAnRf^`^I%q%IE3C~r@1-@P;;YvROkITAi1kS<x&S(p?Ul-;r86)%5prPflNQnsux zIndMBOBtC~nOd~02wNF3ny%3EL&!7oh6gOr<}cJd(kZ;a#qe?I^&ooK_Vave^D~`j zdc4sH?20j-KH@%8tkWhZYa^4AB3z%C<Tm7%?vd)jHu4c~uC+mfbYcd*+?YZ4vIFi? zDFLOcQh9U|4-YI)rP8yLczTw2f@bP#ON(=|Qj-P$0bDso?=6DTz(EQnUuK@d2vE6E z2J-xgz>DD<3sU9cPA&j~#9L@+c4ux;PhMD9UQbbOXLcB^V?KtQgp`74U*G70l!P3; z53}ExH+5#!s?$?>_?%dEW-70&;)<8HZhdKAMa90Cwl*J{>dM#BXOmhA4C$?7X+>$H z%@%!Lb5cY`Y*37?MqjM2D~O}P@mUdlo%bIAZ0CWc9rx~QY1wyg$LLRv_4Xe7$>`WC zC;AfV#<uPk>j)6@2l)xmel*D>XC6UNK&cX%y71SS+)+$VsuWllC1~Fj$ArTY*_u!r zXqie_e>xO5xQl~JsFYMSaEaSsD%#@R<$&OYfucZC(}f!_H}jst06n$^#KsVkk`$8} zn~7E;4@Vbm@Dh`PH3Mx#Op6$6vrxu_Pv}ChG*AwST?myXdn{o3jSZIWVw0tFy66_x z*kmfRXxU1h(lnlD8!R`{5XUVM#komd$7AdBO~LUw?Ac&zn5C44S{p2R?beXohCb?} zOE)U5Z8;If@*$h!#qRb7|ER=}Lq0ldv^F^cS{ktb<STL+{{=tDOmy8`>)iWPMc0wr z=iVp20{cJrJ~9MEs(^fg8(=Tdo!H^Q1GqKd!Nd=1F*)A|p1VTdf^YJ_P1&n?9NkGn z1&&`L&7l8XQYGxI7)U7_skT+5QI!X+1Y1@ymBf%b2E?~QAiljQcBfGFx%8-ueP6M$ z0N7;2T4SvNT1|9xEa=}IbqJT-Xd3G`h+QEVD?}5f!w*q;b9%ZZ-DuJ^3({>qw4pms zD~NaNOIK8s=1tEhZ{!j+*Z+KUik21J*u3Z3{rTAFqG}rp8T;wYJ#jUoTdpV@`{}Ws zo?|~9>%8xZW|5)MdEdU~=6(0=cg(Q~*3+I<>*x4HU<9%ftm)7aX`rHxKYT$ycG?0L za0_DS9=7+h<BGaInf}-Cw|EEW-;bE)`vXDX7=4k+09aFWv`fvrculi!4g+0dDq5PF z(q3o;E;==JX_0B^lGsdbBr=o(qpezPX6zE_W%JUK=;)HpRC7m>$yB)1tj&mBvLrS` ztIdiF3W}5Qa5vA*VV|P^1HW7>aA>fS!7|agK1?A~DVR{2lpSDOK>oXgtB=TspP$w$ z%pG<&-RqcHC8X&pIyn0@FXFj_K)O6SNFO=3U`Ws%tpaS~sNzWyMXrAsEctvCKN#fa z%!mZPl(3<OE71_?q*(7FmEpTefT^Q|a20=72~o#)Uc~Lfd=J+9I&&`35f~&+Jx6&_ z%B4!nkJ?|L+R#)(z>>JEsHPsi0y!MRd71s?(Gh8d`d`wA*-ce6B*bD#57DOS{o1Om zU4@45tmgFCs<NUe*!Q%7UB$0cJb~ySBCg@|lDU>jWC%(<=SM*BKBt3QRSkBO=uET3 z@Vmvm9I<pKhsx%ld*Qh8vT}EHOjD~bG)Dv_<mz?E8(^a>p{n1Sxx6ZlHWyTN0#KZ3 z9d0nQ6)eJBWHc0{ghpkQ8*8OzA8o2mYmV|&Yf~fB8Z*K}Gn%Xg?E!wBwHeKsVWF9= z**c5f&sT5J#aJT+L!$IKU|YP;V_Tpq2|N$d(cO3+u45YyeKMeU#{rcH?B_K{FLIKy zND#T@(EuNB8J_F(|1Ci#wCurw_;Bqn09R`P_OftB0Ycr^<p4VjHhDh*;f{5d5x&6h zuEX}dw+p|Z=npV%Z~<xzGSJ@z%CNd3^(r_Tz>kpi9%<_@E+4B-UN}9jO1yFP(tQaV zkU6-wZQrs~ePO4S{q5X~C!70dNv{3x7#T|bh{iqw-mysL1Q-P&-~{YfcG2Lmfc-{m zB_L0sy}INMT)I4O#j1yQl$P#zc-8NjNAaf9qa&v`71OWlQ3Ljq*~FgZkyy(j4;=N) zx44~&-Sbr+7JyVHn1`lB_Oqyzl&C1#G{kN1Icm5knh+@b69Mq?As~Z>Q9xTzXBVzi z$SDxeu++hF6J1%1DwE4hFj?8;0&R9;NOHqimP%WmWeQEPMTOcFOQLgP(<)Pz(Aotd ziMq(>KyPUq>Z9~}>{9rt;y#FEU)$mf`PHLxb~V+hRU*6k)6vgp@j{fmp>!#nWkRRW zu?P6w;Hd&1B<y3bE=GIY;-;9N53o=-Lv^nYiyKewMm|v;zz0>;Q%wm8jZ;<C)6EGh zX-IlQdRn~z&xWSgTP)&CT3@=cGffz6I9ZyOwsd1@D)5~~TU+Y-l(qu!<F*tuO_s|i z`TP7V<nsEtR{W&GK0Eh`X5(5qINeUgBP5AF3+v)9nMa9{Zup}IcG-KL0@{G@Y9YPZ zU!2nWtcNqt4{0YvI-q!fq4bYD<h%dEKF>Ug`>qG-&V8R;TnK&kx$C|ZBmf;(JSOf- z;kfU4?D<CJ`+hvPh<%3V1>t#Tx%@bGmWoe~`#%%+V^lwLY~>$GHIVogGU!sm;9Z2# z;)I^L@Ix--8Tu#-G!Y81MSZKBsE`Tc##vlZEypImnYafB7wi<5_&<*}!ZeC}zKas~ z9;II4X>q2iES;{nFE68~BnH{ynalS#cN`qB#Fcj?hwFV6k%H0%#k12nEv2^T=%%ir zoV<Y&qpomScEj#vY3Y6Yn#;GZULFr0jV+qi&RY`<dJd7U!FpW`&nl2pz5+KTl6|4A zD*NEE75dNoJQuKSv9;0pgbT<{A5XXzv|6s^z%^^IJ&<@I>q@%D;i+`ob6^XLW&w_! z9<<u=hzGp_2$^_qy4wK^|B(HIA^S;s2z!}ftziGN<x(Pl4eMO_peIKTC-yzSKll(; z0A<o4$K7?bmA2J6?xw?ajw6nn9>k_j%j%IQCEgs@)X|lWYhlMs%$=6DC_aR*Aq|*l zWLRcq#KuI1E%fq`J0~-4&SiX^JeyEd+(AB4osi&{;AfOkYy##FAA-&bn^R7Kg8RVC zVO%OOd4bTKA*3Xg7CJMPV{`x>mAH`qomW|hhp*PBfrmQ5{}Z=mPYfSVOJ=jDyfhJk zEHQp}k1GR!eM*;v+TV>`TlI}3fNb-<UnQ^ExHZ?62hdvfgySFGZ?AYJe%Z3lX#QYv zi!&LZ>`3`+XQI`W48X9vB|#3izzT<v(^Y3ZAuJ-Ge;{Z>;qMYDGv^VMvSY;=UlLp2 z0GfzPz!)I`bAEZ~a2JA5|Fy3FQjHKm{%SQL>M(Vvzb~5UqmD-29Ku8p#=xlvn1=9e z_?^$1!`5)cBd0f)lx#jd;&^ImiWb*y?>48xN>`k9yq-OFq^IY|ShnLSd>gZ0iHroX z=|WQ?=v2_vv(W3alwP2PHk%hxL8K^Q$HGDrJ8K0)sLDbL^Z>Fxk68jj5a?OlEn&O6 zfp1>wuzBa_#+brG4Zux6mH}Dg#LkPxV~?HlYW_SIh9qn(S!*%E#G)Bf$(?)KOEz|< z8xo8(sieL*(bB!S%+%6Q7NiZ#DJs>awdF-6meiLd8551Vtm^23WqA=)>gqnWwjj24 zO-1pF?ymHdy7IE-;i8(UrZ_K6nE#+pSir)_tcKL|=E}0hep^=mvcAlu+KdRA(mqp$ zwULCF(h0=z3P>Z2#C}_kiAuaIH;2QT5l&KURtP%>@ERC69!xcWG)S%hPEMgHt6GFj z-#mcwS_mf&{BT8ua6xo5H&vDwHWoEzqyxYcW6(u}2QTqcd#XqQEm$ltbXXov*RspR zbU}~;O-3<d0q%G={E}{#h!B8mb#iR8AbzA;IDdpfsNq{Du8Q`vmbRoI&rzS$wYzQC zVnbnCyzo1(qjB}CiU&7`n>M#MZ>Z8y`=6I&FRwNgSYmw*zUHE4`>F8kG-Pe;%<9aG z42Ua4>dHyV{1dCJ1<ffMf7(-{%TEeTYFuTj+1_Qo$53X~g{GFoNCnsxslLG0kUx5P z#gn_U*LG+6hU$IW0%9WlmitG=L*~<%(yp}V@{C9pKOVQVGTGL*J`JLvRm2pPi-;bY zF;IK~!v9{W*F{A}h>h1gX*sA%c>d1s(uF}4+bBdw3+00b_y(Sr=`wW%1Y#^@mnJq7 zf+v%w8QlZp8afLPUAvVQZh3g^;60m5i?`fAzWi)X;L7@Q=1+4D)S6y7{QI;HO8v{a zCbC*~cO{!Ux7T)FzBEy>aI@pVUzV-^`ORHbmpw2z{^;(?x{}LYtKVO_Ex96eq-e{Q zirK#`4qp^qkQ9_Rc6DRT{?WYJop*PEp4O7Lqz>t7oGm7Dh9>%rF7W~MO+bwxJ0K3* zu*igqT2j=(S*3GrJtF*;^ITT*MW56$8_YkkKj(H=QTGYEY#l9gxvcDp$mHZmZBi1R zzH4qBFeyJITI`9KBmCsv9!x>f%+V%18F2vQ@M1#@fnEiLuXXc#us;Fg0DHr7k4yB6 zbK;j}(28L8(Epsfo?+Z&F<=mZZ0ZDLXn`bm3IV2Zf>_df<0`wCr8QW?oKTkhiR9+) zv81w;U|#EQu<9L~s|Ey^#U7iVLw7`0#9TnOX#8$`Mn5=xdASU42?;v=j-h|ej$*B4 zWLaax>?er==(7BweD3R`c0ye+&N9{od`<W(dN0Dd2*&m;Shriox$!Qd#Ko}gZ<P2> zjLNq$-RChXDML4njozCxJ)L!WY~``Rlxbb{ruOunx?D~CsnPb0)lp7}N<+2%*Q$H$ zH#MBcsDxW86YO8M47e~VdQi_pkYRq%)|XeE4MK->#0!(>#rr$~B+IGt7A6$w@IY!A zf~F#GQ-~;=R{S8Yc?o0xqB~q=I&8k**z<6Kh>f^5!hzgDU<7uMNN)s%O3?=nh!oNd z8$=T6>>t=^d$Tmqcg`X5NhQ`tYa9>K8vB~xK}3MSWGtQ>Tb1)vo%<hMjEfZRhHs(m z&Lbh+_(#m|6?0!oWf%jFF*xFO2VlQC1PLb5cagOuX3UK!befJxj=iXaEYmKee!;*L zeo08Zi%QL}N95ODbnzQi2>I<9<qveHjH`s~Gi%Li5u$?|(d_SB9F$E@v!6}heSg)K zj@0S3BSr0Ie<WMpe8=N4&D-0ytT7aI2~z=agBs-ZJ_T!3hn0&xXKd9#UnrgN@CDS% z%d^v)dU_UDVQ&adIt1DwUshk7&Km)8kfk?*<v^TZi;QTa?9S1YT6`9YY1KMWpIEl; zV1im_z}z~MdFS(=`7U#~eZ~O>?F}=hriOX~4w|w!XS^Z#pZ4eI%-i-elso450yi+! z{;Swz0bWf8c=g<igSW2EVMwtaltH33Tf6wr$6S!s!!Af`lpESg$uBVogP@mh<?x<I zg<cvH`t_OV>1*gS*EoV$&{6vJF~=#G<@el3f9O!#9|j#}qF$i`E)=$|*enjR2kJZo z5Jv2x%qWf8U(UEPXcRJjMP-2(fUdw6bnl4d-p3!G=GLz9F8lEjc6-)%7CU}{&Ve~q zBTleTY)9v;U&ewu;mVv#9pJ8c7X>8+1XaY75Vb^m&Z7(jSQ#-&8LVtj$?ZU@wZdu; zep>cR+AcXxyWpr-a=OZ~o&KBeUNgSN-ne1~+p}q6Bg>HOX6%y(Yy}7nvIx671^fGf z+Y6kqCs;qP1maRo)|b61U>*X4?lk!YjwjGykP(u8ZkVu(saZshtXV_Vk{^vM94QY? z4qoV+u8z;v``8a{*uYjHf9qex2q<}b45&O4O55YQrKiqelPu|6DI^jlucA#HI#&XD z)V4SlYB<;6%^%I;P(p>??Zi;R=_4b)T;LryUAufjkwOUrHp3aY7ar$tmlJ-W@2|`D zU#oHZhZ0DFCdL%w^baAPCZiI+1)+9nb25t5>J?PnI-0la^7dF$_3G-#?8t=+!oown zlS>l<!t#eI3x;Z~>M1GfN69rA;kNas2JHS-+qx}Yp2HkiVPj!iD*L=*OQ%`H?Cczi z0z9yK?yu6FiXUM<6X=aqXSL{{S0q5k*x>^DDuzacO<cbS4K_sn;u%537dPAvJ9;8) z4uckOW!EO2IaOXzZ{dRk83<z*H3^68B}x{5yQFZ;UZUhB>J;t0M9E9kDf$un?RLsh zBIhQ0RbJG?LnaE~Yti0#+>z$K1F<)!ClNQe`}m#r+EOpN4IDwfi@Wx+5H>zmM(#xq z1X&2m@Cy&sYeN&l6J#!%8Rg>*r@2<EREqelFoLY<0f8bkEx!~20B6EZh90kmiYndd zNY9?hpE$NWDQV#5iTq93$P_Kd-kiJW)Ak}=iB4ClYn?0(4J%%)#H#JN`K1v$HS*HU zJ&2L3hU~u{vfqOgc`khoW>d4}WSe7e+o`QJXeuWm(6yh$8cW0O)@>q_5QC+PjnX0m zg;nAls*VSfH3xT^im-$w?7uAUAzWS6)KJw{-4+vLj4^1U5wW?jHLjcXFSby07wj5$ zzQ~0gbCDJ)@7)8FCB)dUZE0F-iN)V9t*|z!X<bDWb9e@%Hs%;@mU!P7O<I0U!r(rW zzon!F`gntJ+CR0~mfx7F(WEx#=QpKjSQ6bueX+e(W_6-J+t7OVo~BT9X>4q%IkaT$ zb@eAZbG8l_`UGix8a2`3zI3E9rX)3_anD_C`MXvYmyGSoe=u*?%94_myYg65!ca?Q z@z{2eWJIa()!LC`q!u_dfot-Dj}b;7uEE_naKUG*CTfF0c8I!BxY#UJ2d}&u`{P>& z54IW04U0pvB6l8U(($gV`qR8TdlB2be)qY4p%a|||Et7v5LdS4Xt5hq6!r|nvk0Ea z5O2fcL_QIo2bt9&QnW6@z-jabwZ>?0MQ6CMCEcRjDpa-eSx$1uAW+L6b^Mmnl&&2O zHDwDI>W#XEmX@4I`sOca=Fq{`_~tktTV4Kec{CKLDE{`j58EzZmJ&Lk^i*+uNnf56 z(Z8*2PiNxd1p@(ETTk9L@SthX)+>;8F~G4kJYoz119xZTAUq?oFkLVec@?<<DbDZ= ze9M=**zssWQc!|X7I+u!Cc!{$*uNJJ0{EG}wXsB%%e~aLfBwc2d1Ff}!(*-5MQl9K zT$dgVUnusN$Y}b1*<&Ists>4Np|~}*V6r1`am$aEecyHy7?X7vlhe`<NCf<**q2A` zA+oPs7M5#2AxJ1!{uhj^n3%Xgy_{kqB#DgAFw0?`@7Yy)otzmkd|Pf@4)$(XMVAl9 zCpZnO@5>P=%ae4O^{HEr2bbL0^*zY~RODVNDipKCfLUDtz5?aQDNnGg6UnQBwjirY zuK5#8*M=*Mtoim8XP$+D7z~=&09lLBxaaYb8wi*SjXrcDqIj&De)m=aKUT$;c4yXa z@6J@&OTS}R0kOV-6IKLC$1oSS+B|~;m0W<-U77{*zwtk_0KqKsjAY&6g1{47SchJ8 zUDovH_1C$5^>^3t{kIEwAtFr?BmzKUoxdDu5?teaGAPU}H=bCGmm-L5+drxNCagFf zs17O}yYY@iv-f=qVZ2|Z&u)Y%fpK^kIbvaQybb#Sz>45bD?;>I$g_*N3hV<JGjj?1 zKubND|9tH~-IWZs+?@g@^!s^9V4#Udu^#GyXACE?A_@u=C_Fm?bO~BfIAH<;V<?i> zUH(SUQzWz)gFYfQGS-!MivJ==<egG@K`;1zfbSCSFD3R$PWKZy8Ig#}23I}2y_A-3 zyLWi(_SHE&ikf@&wU6DKXD)o<aK-e}OmBN9jc=ZoYFiFHv(h^L<7-+=H{Crj6xMvx zR9SXjQ$f`%%j(}%5mr3C6gv=N>)k)`YQ>i@5rCb*z6|(D?8_hkuJG|7F_>2S`pcMI zjSjvL3moCqtM0yY<)5pibLxBV_5TaX)Jh-l&5BP^N0==bJEQ?8>j9iBYH&wNU3+v} z%^H=?gngd}&#d^O^@}k@;^T||^KYbaVXJ28M|`j18OS7o;eb92w3u^?4)Nc&;b(P} zKlliI#ZIT93782PkiM72RgdK7kJiMoA>P;C(kCgN$?hrA>x+7_>pQ#ZAk!8reAttU zhY?@!v-#jzGN(o${SqO>#R)OdiHXrM35x!xlw_R_J|;%*m9FGr3Wtny$g4UVf#u_i z_CaW#56tC>jXIa0p<?d_z!M?h+8`o?*2ZXE$0PqU4C3Cflp>R{C?yP^MiV}()nTT< zKvSrXPbfa4!+aFQ#$t0=n7P<!DohCtO(`@5Lj3!NM+XMRM)>+h#ELaRPdWzJpTOaQ z#CT#oU`~R(nY_odtV$yB$zT%ms)ddQkpqRzmAW8<T-i%eMQK`^5Eq%D2@I<;8}gHa zP5F&+n$)a9Lo~Rt|DtBUpn&+inArOAJOSgyY+oaN#iJB&Bl-XgGTOiv$^P~*%F3}X zvG79UpTGjho;QFMbSB+=46@KHTnHoq2f(hnEF`5kE~zLdFUFj~>u3nlzGI8>3!;Of zLl-l}Ph%=Gv{A89v^aHPG){FfQU2O^(HKTG(%bw|#lP@CmH2-<qA_O+W$>IF#R63W zO$s{4z_d6GQd}ey|8IwI(#Q-#Y?2{1QVBci_{EIj%70BL{^j_PMmRo{>wnd8Gy7of zHqb-_5xahU$IR=EPWX#rUYJ1mORy=tpx!j2&ZwlX1{zaCLx98xFr<crn2mwuQdC$l z{#TvgFx~G%Q}h~*9uu7$<?p9U3JccjgF_9}Na*Zi(yR8j;0NTy=!|K2&s()2Hcznt z*Pvyi9S^yn3h0sjt%1jPO0QBRR-m-KPWqW+snUCX9k|N{a1eE%5)mf9PzT1u{^866 z9ZGM<bEsl&Zg#cw)f~aRtH{Z7zZKP@-bU$7$2RzC0tE^OF?TE%5pyRDOa<5Hr39e( z`M^8H^vjVF0h|}gkjB2AM&u-g#pINRtI}6AnIls3Bc(UDa8Ey7Xt+V6s-b={1xe8v z20sZsV&~RNA2}8){w&Ws@RH}}7X1}?ALrB}<wQ)bJ#@zL<`G86zrIrXi2i@9eFuD8 z)s_C-_h!_48x^aJM$$+cX*AME8g-3&?_IKbw~AG)=H44_xPgrU(+MWD&{;wV1ky=D z>V_rBF3GZ+vYWEm0Gh}DJNM1VawBYhe-hi$%qzE^d&+md<0AbPzC*Na)hd14`q-zl zkQcYa9jIc`*9hfTC5BKe=TQAuz|pmK+<{Q2auS0b8qgMRIuC6FiK%demmk9@+_CRu zg+qh%0zBuns!;Jwhr4hs`P0dVh#P<$>8HF|0ogu+U=#`QNltV}<Q$nCwW@Va^lO}0 zJCE1*Nq<h@@!^<6_Fel=4tK2@DGIDfPS)7|#rz2d;4FS7MhFgyMTjt__%ihISol(8 z9yp9D0P;d?6;?qU@oaj5u}csC8bHX(SgXgfxJgy{F=0PQXk!wTSMak4<O4iV4iJAd z@r>bqECM=@;|OeFLl=WQ4e1mb`oHiT`|BrX1ZU~2Xp-PtAp)e2pHotq1w75p(<Um2 zVT`yKv5XL;=P_zR$r#Bg$^}cZfM9N-&NfbPB&n~_v~T2X6C0&K_M!D3CvSUj`1C(S z--bTaV!V!Fyf`-$MmUzc%`ik*tbCj)KZ<FENvV4q`}fW4!)+?zV~Ivb9+wNaKZ%dG zBi1X83l1O{y}-MvxE~JVjya{Q9zJ=r2Wb63ncxw7D(-VZJiofBPx!VqwMCp+JvBTm zdX0z<9OH%>X9{H)p3ix=@DT1RSl>u5rDGt)LFM%jwrJhHD9+dy1XHZweqsr9QzTgu zh#Jt%0qq0M0!Kq7rp>;#*0m8aVtOXl1bnrOrQshYd?W>k9jo4g(z+_XxcY1MZ^FM@ zca3zT66nV65$o%Gjnv^?JMpd{MBY##%aRDMF@Us=3I{L@J7N(c`bvbZd@05W)d~7Q zxE}+(y#u{m9N{vy%N(lt!%x99)F*=j8PysHqO1mSqj2Bole^2xc0W0~IQHbuva+2| zjxDm0l<otKjR(3@R$oimxWB1s|Hc&Mf2x{pdv$vAtH+yF-~6Vk>Da5Ar(ZqZq<YJm z&~fKXp=$MtvUu)7d*_|AMM|+*RWy4i*1|TlzZdOC^)E|ksFyp%(Xe^2Z4~z1r&g;2 z_~1ZJg6j*A5^O_*sPi`Y@)nweN2(SZ6JZFlyt(^_m*AAn1vOqm<3i;U`)B8psWWXt zvh|&rmku{NOUK!~bJO7$XXul*(^DnRBD~UQ$0XV@01T2z5pU5E5hPkc11xVd5=9J2 zk@A8Hj`t3Urv(L~@vD9i4(%pSI|h=6e<{4r1v(~Ec)n()BFfl%qObROk1@Jxu2yPd z$(1uzx`LfAZQc6vu7a4V%@r(FYCagT<?c5&4{!R)?JcdhzqV<3=8e1OBMuH5PdxT& z@8I?io*W;4@`LSzy{|rY!Z?g|e-QEhL+}L=U&-SZ_mpHL(J9EGgft-8-x>tqr`QEV zuPB<pNPx})OAn_3_p6av6iRBko?z{~w>Mryp4QKJ%HMeaSw;XrWTYqR(aIQoOpL!1 zEp>8|kv?G09<`-iV(7rPi-4p(Wo0enS^SAhfG*4{)ZIHUDOhhYggIt>Ve{A>gGPUS zLFZiA%p>U$*5&ZBEiLArnjBD*)byBJ7s|pBWO^sEAURAWcDuU-Cl$rD^mUy5%BX+E z@m&+O3B&DQuzs!X;@0Yj%o+pxWl~dabo0SSnlSZ(;w#duvL0(9LSdl{D;MS<CLzlT zB_I%>0TNvVQ5V_&ju=!fin*4VOhP|V;6yw5xoM{OSdAsp5)$n1tB7C`&W^Il!xx6U z`A9b+1Y(}(o1U(-Ihp<K)KRn<wP`|M=lQAJ(6nkp!9;a@$<_yZl6pJpBbHhI<~v)C z-Np3P6PCis+5~l3+hAJd4nh^Ll%G_+nK694C9S6}Kft%RZ)?TyJyV%p5y=`!sd}#Q z{9LhhUO2uld$=mz)H0jD`mLCpxPSz}=E^}&$Ve1oUvx_SSYKHPF2c@nR>9E2#vly? z3x<J4q}s<vJ{wIGIe^$!o0ZNxCEZpjW+$68B*BXOl~l@JQbw$P`@{))rl8mf`?23) z1M=3&6seYEs@;*`48RWDaY_aRia0~B1}KNX0`}vrs4ycvG9o%kMT!Jzmhip8Ge@)z zJP*bmy~c1+Y9(+?qAj0~k`g%z#mO>uu&nXks?eM>4GA6P24<)o%NluTu>hvn?ic3g zU))oQ;xl~*8^B;>iSc2k{$rh;xAlQ92o%k=9VbUJn98|iv^bK*$F>K@lNOekP?)Oo z4jnvvWh7$ywd0MA$6uR{XuD@;o2M&a7)@49>&5xv;w=|iBg#)~sdH8qF5HFcB^cL> z7=spI@hp^kLJoe28<hhxkQ}M52zD<Ry#Pl8ejBMLwo)x78gjlzlSNQ^(c(%nP#Tz* zCyF0fn1wGc8W6s<U`^QRy~tNB%lB(i(&;jjzpzladnh+=cu$dK=a7Z1DBBJ`(%gCF zP*ZeaXS%T|S6jXNq0Z*ZyX#deLT=wuR^is}jEs%T1wUqg^)}R7G8;{Sp_#3j?K|qD zqiU9$(_8ZO?w$$RRfeX8ipZGSh1&GG)F5?AO?pOEg6|Oewj}M~T((AHH^<~dTMAUm z)sh%Y6(|H8nrc)SlMJ91*E4?@z?2}Xww+csjTyS0sH3hScCAd1ax(`j<5_CsaLQ#v zd#OG=B`=~lBq`E26f7mjYi`?=$Mg;JrEJ^kuT@XgN>15ZwjHR-Y0A*JM!5zi6sN~F zROI?)`WsE=(2$r7zK)?@DfL?#i;tZ=RmL91ZeWU+u^0RyYZ0M--p}qsqxguL&WkR1 zKR_u?j;A==-mpcpLdfxs{X!RE@~^*yV$`>Mg5|SrCeccqC$J^_qrrJXVig!8GsGu0 z<N9z_oMYOv`(F7cVL7sNqM~@BDcc9ECtn*_WIz4RCod|?sur6PqVn2IRwYHENcVgb z>(iardWwWz(NOi27o8MXnnblqJ{~UXxYXmFN~T=J8@^9jLmT3IMAC`1CN7HW@;vZ} zAo?1Z3~>az>{G4bqtcY_Nkf-sX6_wHHV)rAGjn+)$!ZX~!b<1cTDO#h30>BQ!b`Wb zw$9^c%i>QS8W?!!CyOj;@uv?B4nFkL#i8ZSE2O4e>3n~w<MD%yjRzkmZ5(s?4*I7< zXMrcN#NfCT0RtleWb>bK>1G!_AU)t3pRdN37bm!SW{H}2*w-1;<}@V6*G2}V4y2ZE zX*Pgp|4TS^KD0C>`S`lF1$#$SEO!WB;P1^v{fK7RYO(A-IjZGJjyoNB(1gk`cnm@; zUe|uYDr`g=0oW+KNf>nsj1oQoO0zARxArZ@{Mv76g|2;j!@ZvCzrEpJn)O@XOWMQQ zw>R8NYQx&MH@r7s{kJ#VOQ4=x-%ALYwQp~@mtuu}Bt+pEmf>dhk%G6%{xOD*#)*TM zla;(=1$Gnt_d-liOn{flF-ULHGLAXp-bgMud9|{2)9?8De)dqVyCxx9=N{pv^3wZR zdI}T0*qm!fbW*s7kEiGs;gMdSo8<ekr!wrawmd6ZDfFtGQfj;PtI^@P$>E|ntaOYj zXipU`!?6qQ5ow<?5IRRWMH<RsFl6&}851oCL@a<c+DrSBtEGzS(qc_)q>@Zi4$zea zKfpb<GvH<dlPmf5vmii?0My>1`eUQn1)I+{9X>q#^uDUnxs#Ox39ZHP5yqU*!oUO# zBxrV6*~m+`HKz6LtIZj!($^n-VWi?zwkplfKP0m~r?@LaJsR73sIO_MDb-8u8W>lY z8dFu6;g{tfn~)M792Mm4=p9fvc5!p#zM)b-@6__njE>!nx<G%vCwe~pv+@z_MYUq0 z>Zusao(ri2Ai2esK#W`dh13IV1o}D<#T}6NM;T4FeM<T{OyCg9hHJi3D!C-K?_;D* z!xZ$5)_OTQqAZsd{&=-r0Ywf7S#u}^tL%JI$Sey^@ehhFjalBrq{5}k;;Q(rHLInY zxjJ<Ex}LpFczrcde0LP9=~eIxnfRHIKr<HQ!~<qnS^T9C^|k;Jv_h^f#m4D;p~D~@ z(T2RhOHDQhp#K^V5`_wQSuLo-BbO#7pUYduu~@kHz~KDD6Q*TN)z*%dt#z>iOMGBU z`?hK=`*i#(XWANStv?d~*Lm~vd&~On`OfB+M-McX&EH-jz1lv`DpxKx(E8dh%_xaG zG>tqJng{{34j5-758`ZsZl^F2StzFoO=D?Fo3d)pJ_hT%h%=bD#pnn|*q2UVs9VBB z&plg;#CgHcyjTHV2RKW!CogncHaDWOfi|-|DkCsCE`)_=ROuJLe5jHFThA(M(}qrV zQ5nw4ZTB?Ax1F4<@IeuTnk++OQJPP+o7Rx2)g*>`JNmcne|mHL#GB{ZG2Zi#+k3HA z0>F6*j}h%`KGIkSwlfKaO<Z(bEZ@OQgDJL`az#5$8oq<`t`>ZCRPL4DngO?lW##F) zxu>^T(6(()Z5B+cC|TTjpaUt)24mNOw$=lkNlbjV^w-BV!(TqrPMlnti7%gOw*Fv^ znycx~h0@Z6JIQu{t^m6%7VY#UU*Of{Ohe3F6xSRud`<F2p#kLHZWJNtPLLpFEQtA7 ze@Aq2Xpo`ZaO#*K-7Zdx-?wgD81{1M2=WpxJt|xtC)t6qiNrg@`N%-}F}%e#KG+@j z5z(nQb+n2EhHQReBv5Y(Su}R^t<IaJMVD_X>Dbp2#|q8+;b-?sn|)$=_|DN(2H4e9 z{jT<;`n?af9AjR4vv(dmSv&QuOFg-B4~+}AlWu=jid1%@HdUM=TLIogoT`d=oj>$? z4o#o{iG8)9IeMYmoE8_mA(*s0l`NDvDGImiNwZ6r(dDrCfm2O0s5pz8kUD$MP-1Xq zM}B@vQM@k;FPm))Os+I#_1EU;{8Gjr0Duu@OcZlfN1KZD{-M6k%*Soy;_IW;cO75R zx5c6ON>=T~o$c<TTWn2k3^r!%`10<&q1W#kbCpts6t}M37pwFG1D(Y><`<6UgO@@o zQ4V5kwTc1&0{wlE><B}s>ZvHmBM(B7U$uxr;P}Ls^R`b(@o__EwF<2|C`cZA^aZm^ zDX`@5g$O|3?d}ZW{*60pH7qN6Pf}{q#Fg!fllP997Fl%VTrHG}V7H#54>#|#E|0IC zp8D>C6E0FKyW%=@`A0k0e@OnrPabG-6Mv1@6CQgX+G`;TE1B!q<Xgr1n?ZpBQPgvv zn~Vv;`G@vd6qeXHP{GGJk*gJjm~4e_$mb&46H2~T0({VDB{y1mSPD>oA2XVp%^W;} zbm`IN(pXQpUp!+=%+Y3DkcR`yG43>(T!P~Z+OtyXa`YY^@i}!VS?vX=#APxmvkpqX zJ82jh>?(;Xn>$g;qNMjqPt29Ym2?e`7)~<3gY(jFE@toAHr<r0%>}7cORhG#X?okP z?29azeD(tJq<^P8r}`fBR0}&LYgMkGt#?S<0N*<uAs+lU1cx_(ZCj*cgz!&cR5pTw zS8E0qS5jmno_j|~`?>Kdu5hfoinO2`ue$zOr0?8#)%DLJz30ZOu74I;3^!hN{j&&~ zc;i*qKZ~@b8?U<dS(a#pfSQ-6s09Bw9GO=~?3(Mi`h>qME(!igQ1yNIF^d3~T>^WX z?NW!AC?bJOPBL%QYnFGs0kjDog1_>du368_o9>d!ZY-l-VO7;kMKqgy@lZ8m@im)E znzq*I>T0Z0z_~R0C)H*p6eR`<4|w<rKOB8{A+KoZ!2wnwNY7R8>Pj(m>~8ppOU=$N zPWYCtbf#LSPSr~fD}&fr)4_pU7uJ?FQJ<vEZA!*kLWmmj`DxWZA+o*O;u-D)Pe)vs zzYiQAP(N&ZcI4TYwQsvq)uw`T$}#yHjItoW-HLBW{a*LY+CA$(v|rBEPlUu|4Ixh? zb`OFdarXtp1PbRm%E56+MnR3b2Vzx#DYwcHVhRdy5BCX6)`huAzg?0(bPLlN!+gWs z)xjwn3{|<NfS03Vls`!&bP#j(=z(h?FfKL3dd~W&&?$@ur^ca7v15;iD`OEkEvZuL zJZ&xPtw`*x2O&oy6{S>h!warucq-stRyaD$aAnJOoH;QEhc(Y)v^vhuJ192J%b9%4 z+M9|Ds9GY<9?hDhQLd9T$_Ed}#JL2;<+o;->>|UI(V7<@=o%NZqTKs5GsamD#2J~& zJuo^oD%u<u?CA&(uxD&(hBh@i&|M|IJ1c#1Bz0zTpfbTOHxeobCTCKQFxBj+_0GLa z*s(*B_Qtff*5*cOGHcp<lbE~oXA(Y9Idv_Z=}KXQy@tRHr1vi@E|lUPikvF@QUI-^ zoH9jl2geTNc?XahA^>S82x>n2BxpYKvaq#9@|l;(PovHHnU~SiEZUnjOQllFZNtLE zRkT+vuF!^Ky#uvgP7cHdU{7_RGszy5#A?I3gBl|KQSvd4q>o=3O*QqO=wd~K1>uq9 zGqsuhDGSp5;_IqP>+k%62zSwS=X5^nXQsCK!pc2;8KFMbbXDaD+H?kMsRy=A63);( z#A|Rs61Nk;s;E+oA}%OatmOC+E?h&&Bh7saVcZ>*q(}ldjwn`~9iY9-kcc(+fn7!Q z=WIdpd4-y7J<erYuS{)yVQXF<{+hb7QtrIumfE(frT@0h1QdaKBcb!Q{?=V>si@XA z{Do~LqgUQvW=_lRUl}dj`uKR`!M@av+h6Rh9O>+P@%GM?o`X>C1Vsd7#9deu<Qd7b zAgdHf8cGF<E2Ab#2Uto}0U+Ne<O@j(HA4Pcoc>8#)Xu{#ks2K`09_nl0eIW=E=M3p zMa1g>@S~DSzW4$P0y%z#AD?PmsM2by78)h1wCci~19W+9IiZ13X;Er-6*7iDJY}xb z`v5U%M!m0lSjFO<b#-?xRxnJ*yUou(eR-u~xM=F+#k-1yGuBM&c9zpKpPoL`odZ)+ zaRmK1jDAoZKp@B!K#n^p1*bu5e5E630Rd}aSkR7+A{Mj=e!6P4nyUXr!itJTwI3I( z8n7rMfyCyQlOtmA1l!xc$~Mh+_wB8XjI7<;_dV(S{5<=Y?y}Y-FK=UOiRdldYdy@$ zww$i6KD$uPDBA>`h_v3xvOA|triqR$Y%8prBD7}|?d1IMpu&Pb5CAp;;6cX~2Pvk( zjllq(8H1fdMxH;cJX$BTs?~JL0M<bMrI@t^{efgm88Ho=={K?k7FIA;nLdc6{GfOr z#_m0LKbA9n_kc9W?ygvBF)$wwYd)=FYR?nWy*xhXs?b^@AOMu}<PgV5QK-;1QWzqN zIywaFeR+C~94mZcQP{sI9a@xjQJhy*^>Mv)FYBi@^)&jp0ez%ARzwY{NHY?6k(-M1 zmY~Xbx-EN)_m9#^BQXi+BNh_Yk4=NePi!rdR2gFRVEWNVmkSD(A03st#ZB~k?e?~$ zq_!P3v|(As_#J&nC(XjRM_A9X#HRVul9{>$bO&wfM?c$mn}W!S!D?2p1}q0v2Lg&% z<K*w;u}o@G0EpMnW0EA%i1Sl_MN^*OgYtRUt9*(7cG7ur^)F-Yc^TEo!N9-uN~o)@ z%QFh;(xG9{dEtHRt>{ZXXYS_(H|t+U{^MW2QKI}cnu0M;!1&yQw)j(ap)V-ZQ0EWn zyBK(e;)KY9QYr(gP*|03IDdpwz2&;!E)H}6L4;`$R7QA$vYqfZtWx23Ra@$$_fN4> z>1T%->)6tQ>QX2dP<l#u!rI9H{Il?5>yU7X|B1K8P&@iz*Ns7j+5Gl5<Ntuy{@P;e zT#|85Q<(DRetQQB3c(h$yKL=bAS8*`*=9Dj1AZCBgzAorWM_{YYbe_{oC_we#sg3E zj=p%fF0Ona%Q9J`Z#(tnF;t{#!&iCZx79YD*<4_my1ns5F<4VPQB|?IDkiRGb7{}H zQL}OA&e7b_#ymft?AH16u}fpAX`Akys9bI~=xVprw#=1=kD~8aFb5jU0k1*l3|3r< z)bf>2PJ0MCPN3-kCp7UGV$@Bdcx7>sSr_mZh3}PL`y?BQQ8{=Pv@LKKQvE>Sv9WQK z*f=zWSn4v@mzoQGc(x%g!GTNxLoBNGVp18iC^>lv?qSK5Lq)Ms`a+||&zT`11}KV3 z>%$FCJaT@vXgF{9z^T&(!dLLl5X{}Hc;`*INbzc0dR3T>i<I7Zb1u@pDE9bq>s!J3 zEwfdLRe^qLOQ@+f&)}18{n1gOr9*u7lk&9wssvA`UX@#<xio4*30^a%_^NcD@+rLE zU6vavyWF5-g6}D{iXafaSLFsz&f~l3tBb;Jwz$W6Y84Xu<L3lb#m6sT%fJ~3Of1Hd z>O1<9<nV#p6AvW$2q+B<zCn)QMfWI9K!%>L0wptuS6UuZio3?>VC2E`5P%d0rQ2fV zxsBiahCl)J!{=HqRMUtG=K~}D?LBrzntJ?;OcN+Pi)SCgdr@W*7!1U55Dvv_17x$3 zlA+Yxs&rLA$-sXkr;y_==NjVQRhGO3|6eVj-ars?VTfl@e~w_B=zR4i4+1O>RfChG z{BWR@ZL(hNKwSYulKxBf_9mUc_WY}Z<}J}%{5NcAa^AGsZ+{cc#*d$uvKhe+@SmVC zpdS#(iW_7v)*^)qK1=q}`L|y7+D|?M`{4V77skyfFEJ>+EZvS@E2k^8Q5Dk_khKR{ z?&SH7jytAtrdSU`@TRoPS@JhG8nK&1#iM9X8rtK56EB>f1_%!-kw`WOXpzA82*ZiY zx16VEcv$EL&k)aG90w6jeDlfefyf1ep}jq{8(HXup5xsHL-+9>=}!w6O8Rp`Hstmd z3%eE;#B^qvKHJ)QesckKDnAQS+h%ifrkhik)yM}*t_hfKYZswzAcJ|UuyJgS!bXM| z@bt8|hp(}#XA|0EF9yhp)}2f}OIMF2wB*)@5>xDf4p{{GYvwv6xmb|G4;>P+$PvtN zaPK<`I8iB)ABPkqFV+i{)DGk8#jG%crd#K&<~pP=4-hNO038E%3<3;DTUqidk-}s1 zas01ia_i1!%cjQMSYKxS6Y!nBvAK<#EKNJxk{uV7CCiUZG#r^~G;i2oZk#&OFmYwM zSjpaQIx=XEE9;xxk>54koWEnXuPn|yc(ifoiQN^3ruoBn)=7V;yYui|Q&Q>9C&p<F zQk{W5^h<*TtruiNlXFivD$yH4W{_TiQKmF52wq^X$+jfdgAR%_^iSStT;Skf?>S76 zHR>t(a*D|O-KT!;2XYG{Q4jG9wVYcJ+@+0}UK$;^IA>)n2V8hIR09nwucoX_Q})HQ z+%__JxGC!5!oo$*NOSF2QSn4WMwIumUwU6va(Sx85Ag8F)biw%>U6EYlaMj~gGa~5 zAN|4jqO}oAba1Hj#J<@Uqp@Xn--%M8>B_P8xYC}9d9(Cd#@u9YX<S@s@8nztjV&aF z(go`l?7PH53Vo52bwboA6@(e%4rJ&vHthj)QR)CcT<sZ4a!U>NCJmGaB3Fe+Qsd2i z75L0U6i-WAq__95rX%M|c717*J+k_HL+iF0RwsSG`A`oa-`2Z?gT~iy8@YEn3;a$> z;Gf_S7j_a@9ql@RIWKhZhHg_x%q{WQO&mrq%%O=$*+TLt0Zh0xghR=IT5*}?#6m-1 zSSac?C9niXt~WrpUGv`N3aLKn>1F^ROdcxo(?j{CWo<_UqyY>eY#D!SrLbt*)6>&W z?<iu~%g^sf?ypS|Muo7{;+p2T=7WP4&%!rGn)Y{t61eMNYs>zPMwYVifcU4%y-$y7 zCSN&PUw`zKNsY4P4(9ajLjlhIF}cYZ4OzNiZ%2=+Eq8Xdjtu9H9jnzepPMZ#oIT&9 zsk?0~mt?J|cnNbs%;SDo=?3C1a6v!O>+5Te2g=7WnIMoT{s<Hq5~3nu+(iTi;AUT> zzT4_v6N{it0z>t+Yf;f_KWScK7n<*wD`cY`>8*K@IpZfAq>F4MW1u2Fp<*B%KPP05 z)+B=EDqH%6GK+;3PuKU%ZE!Xewx-n0R%qFuq&anRb$V)Ll6uH5u_8UAQtyqvFvZu< z7s|o71~ZC=%eoLSqgXr8&7rm^L#^6vV!Qb6Y9g+uHQ6J5Rk;N}djYwJH3|PX6G*q_ z2TouWD2eD0C(R#b7gl7TIsn&t(P<apjI)%cn9d%XrfpNPpGz)IP&@btyJnoHSKl3X zX2%_Tv>AFKUz!|_TR8jd7(2A8m%3S=^i}qNP}}|3`Q6FlF!cpJLXH!~!*8iy2mT-R z>)*F5v`RlX!Mdb(4l{?&g)ZiBMEVZvKE?hbxzQgXLGX~G+0W^Z^-tCxQakPf4?rbw zF~tgwi}_sobvQ}AtNL|OL8jT1k`Qmh#T2t*=fA68lRsN|wO|YB;ZU%*XU}&6>aviN zu`rO&wyGL;-`muD-;OG6cD*4LC0}C-JH}=+%rm1KOZ4K_!jYZ1x!VTwatBs&zbkC? zPN>W@*Cq!9rPig_E!4zBR4z0ds<IP2-Q)9H%$c2~CXJ_;Cat13JF7KwgWA-PZK+T6 z8p9a8in;K@TwJeb2ST}$*A@}g^P?V%i%xcL@s5=h>)lI8IR4}<apx)`WUG7l8vPEQ zMffc@(zC&}OcF-KK#Pigipc~55y&6uLo18htK3>zGm>21Tv_=ld**@^A^2Tp|1F_i zQUv>@_0QIK`ST0#d`CS0T0I_{;B)BlW`sE5?oc|eNJ&o2B{;Es6cxf^l1mIBo+{?b z`|_@Ir1H$c`Ih7frZ4ZCUd&|g^Y@;|dxLqufExwdEZHIy3=FIScGNaV=#vUtC7R3; z3=<g;CZUTZom!NB)hzw<!X5Wh(FM`G`VFyu^(j1T-PpS-IHv_Z!O2QzFAYA|plP7w zk<!@w9i-MOz4-VGgDbW{3SqEZug>K)SmO21;uC3ml7^mg&$8HL7Zj+Oihh!uxV8rH zRUu<r2wch_R=7nntw?~^ia%UU5PwMS3e5IC#HcGA6woGhz_((&42hAN0AD8+ELAKA zw34zNf?0KFfZ!0I_l0P|l0v8#etS7M#dii_f&De)mI72UZ6C{=x-_&rbZIJ+vCPT4 zZ9gu@R?k*e&Q`|?KZe)7g8!5_^2+I6SN6PA>DGJu%cGjnmrwV&N;B+~ThHm2M(fTj zHMoh#-5Qt9)YhC?Y;<3p$IoX05~r5^OnObZ3;nnGT9~qdrUA2zWxLL1y4KgirQ*+) zg|d}t$ieSpGw8)1LGX1lELWzuj4`GC#j!uWFqN=i*4az)zQEgIE>SL@7cC;p5Y8E5 z{XjVo1m|(c(xfj}-q$jQI%yz_fAFrlM=F=u*Mm2(q``|5%t!je{kMxu9V{UKN^unL zEaLrGvz6pkz}@GcZ7Y4s42w*^uv%vCi1?$mS|R%}KIie=>usgLs?TF9nbz4#AK@)l z!$ODi#Oi?kMU2*w)WHhy2071R20z`(PQt3ZrH=|{)m1y-s*g&W$DU`b<=9Yq`p~f! z>9F)V{hr%bq>U=-%Ym#JX2v#DyxQKLBK}YsmJ*mYx7C!=niqw2{UF9vkM`W$PU14? zAG4E!o~hf`tk*YhtCN1V@N_!r+6Sf9rVITG3&OoDwR5GkWb4K>iiUrR2E|yKlM<T? zbj<oT+CpdhKcQU-wsu`-C)pbHx$Pt^OJ%)n=ce=Xr_Q%Yam%bXcT;Tw!qvHGNn*?P zy87*H23teIb6PXZtvMRLZ%#tDOasm%QBiIw!TQ5N3S=o#Igx%2WGS-H9Uc0~Q^l2E zoS-(^oG?O`#>MJl))kCRWQqI)y=ot=(>QHDDKl&+sFnpev+ZWKAXYA2Y$jBD!OmA! zHr@?r$O21goiFS;)@@W;|A_3wl%AvFhmnQ7xpn(`)7s9xIT=6o=GnH4;S+5I<CSqG z^XD6e>rZbk<m0&meOW<Y!htDRvyC9wkX6wSl}Vmst^~+QLvlz(wvFtUsZ<zxx)wu^ zOW~d%rGa-|zFfAA?3dr-sj!XgSA6yZW!ng~k^=Nm+$ZV_Lma_QrCn85>bQ+$1Gy_H zjQ~1`htmH~uZsGX{oMtl^_fxLx|T!zd4si?I)CBSg$0(XPTyFXgc^SSE-nF4Y2^k( zS(-M$MX2e1@pLB^#nycmP5)Of^~aU<&uq_=g0L`tP;qH*v#zjxaMY+Vjt;aJ>2yWy z1EWS-r#K$O|H3*&{we98AfA-%B7Wxa1wp(KYljsMkRT}E-dqbMyNG+_aIV^b8+N-0 z%S8OIW$A$QUk6xlMu#ObZ}N1r^r5z(GlOlH9?l-E!lwP?E%vNb&ED|Ls2j|#UT#ca z(ksdJnGuY=9G;0N3*_{te*u?57|yL!MTMm_9>Eo*KiEnMd5bg}Cr76_#9a`1V~()m zY-SQ)$X5eh8lgHBP6uy)eUx5{cm?N3g6QT^XSpOQ=;eU8fnf)u)$V?UqCjK|;7t<R zr4MYCLy`MYw@_V}>!B`ECzl%o8M|6a^n2f1W*e06O6P3_MWs)z|5LNOE7f<v(Fx@Q zQ#;nz7gfGH^7h+w4&9G+9l5qgK?|W$A`FJ^z?(5c5mp3S$v)+1zi_ZZ*>)=y?5*}F z=MuD|zR6zYuti(-0V;=rZ0eQIuIk*mr&%wu|B+lpee<4M*LE(QJ5w`Udv?Br=1Rcc zR4AXrTDoOS3^vXGH6{jfBBfSqHsz_(*2lztexYW$F+RR=xkmbv^sh|iqs?l`i59}5 zO%XmoS_w`UQmaw|15>JjEs^S2O4~wl@nX9P=q>3;(eZ;zooS;isdjktYzlkd`k#`8 z#pE|8=<9N#DJFIh{WyhwP)rP#5R?sPK>833gYS(oE<-+VGz=#mX`F1$2lokUTew&` zTcgv}%vMT&l)iv1{q2j%C5it2iKRy27<&TEHMK7k7A|(A0u*fh88$FAP-j7ZYXMZ^ z`vPOEQ2JnBXec7D25|!^^^OjXbBMvibHE(1AK)*QMIC7~a>$5k<Z8W~uiXSUUGxW~ zD>s(Qz2lB$)}s8Cboi!4bCtgudFdsr=~odmBHc>P%Y%Dvp3{3{;IK+SX~r9apV#|^ zVYWlx<SH!CXTrdWbbeVnDeEAgyhRZ*JP^;`jQz45ejFqDg<YYtAq3<A7a+Wkq@l}X zH*&BTxdVhXkBxRh1dhopS5RDSLE|+<lW-MsfFG4x1x@i}m7y{V7$tpXrJ-uFSR-sf z)s1{(N@1+Gu*|$;3sa1FF<t_~7;jgc*jy5tO6)YLp(UG7R46k)c{^#WEhD3CEa}>x z<#}sF{NW(Fazp#c3i}7!FQdjtfTejW53s26=_+GQZi1(0Vops`^>ld@y!bwGMaGm; zz26G+)0dizg>k-ES1DD;Hd*Z4I+jhxs)X-aQ&NT-O(rBzT>CTaZ)g?D2nV;dSTX1= z=dhtgEH`qZF@%mC8A8X7j{Ho;ic_z}iYZP>vEpmuln}5q>6m*t)~yvDlwM)!t+$V7 zXOG|BDmA|K)-o%hk8+1AVq+_YbCqUkjKRNFiwLGsX&y$spHtSmp@C^~TGP{7bFnR$ z;w1bB$B?&>&pc%4O&Wj(1oDE?BjXHUB|0;eqXI|+SJ$h4YaXO?>LT8$FekfjHS_b| z?Bc>T3SJ{degL7g{=v6f{_z)+=HZi{mz$HFC40L4bY5<>=k4BD!3LFpDuVL>jzM6I zas0`L1{4ulFHt_@6O+|6QPj4lElD-$9GcNqm|UF^t#)Dg((5kjXoPT!+RUNOld2?K zQZ&(&731>^;s^<4WvBMfH7A#Cy|1HiTW@B3dEe9)bH(tHjQQ!la=p1{TVcyR+bWWq z=k}c}KVr?qcE*29@g(;4Zo(xq2ig0btZ;U5baB3#4&_QtZpw%1SGc%1bP?VNQU#V9 zca1}DwfVy{KjTJzi;D}NB)h6WPk^|TA3$2*Kk#PE*R5Oo*)Qeum6mEW#K%QJQ;9+i zGkLz&a$wf7xa@9q8*FavR2QF?9tueBDl?X+geqs5v3b6@|8R@$<;BI9S!~OpzKVs$ zgjq2pxx!S^l@5mSF7{{V(%YA+VhUQ43Rk)_I!?XN<1C^2rWC&M*%NKK!w1Tf`zj5U z^CyZiH!^SfBbX>xSX!`WJeULNi4Np*p`(Vvwm^c}yq?@U!jTuWkhCIC<z^aDJo3TP zPafPZ2s2FDX02x*{#kbXNzpvKSR%a1-!%a_LpG)>tW3Pi^M-dpR{q_0=^VwLXO>?% zy`6n$oV~Nd`ZPOvIW`uK$cN|;S3X~7i`%!OZ>R9S7tuFgNH*xe0i;oaLk;P&6iQMI z&@uzCfCo3p5$)&8J!QO?u4~u=kpimZhtv2Xah-bm-6I407ngVZ2ab5<zf7>vWhs;8 zUSc0o*1h~k_0;P9Vh<v#jl$iu2V^|XOX#~VBGfl&3(PfIO8@7!U^L#@Gj?!s>+*jf z4)5{vQMPGCDrT`Kp*M6$kJ$g<OgJJeK`(!UJ?G{{?V&t&!reqb7fP`tVZKS?Llr_9 zES_DDfpNsh$S!JaBrc55_(a3h*Sa7aYZ9SpgIAUT=d1?$#vtmn<W3@nJh*Q(K(#;o zXpZ!VxKnyA>#+wJP&iC&YRsMx7N)ZsO<1Ua=vn{3?s)PQLHMGzNqFT+X`J0*=`W0A zD(jeVH;XLnw@Bk+fRM_^?*Q7Hh4I^fhM+E6fG>iBJX!U+W@8MmHaj95*KhFk(V`r^ zFK;%ehj_CobwH~FPMfz{M@%h_%;c*%$k>-2QA$4*>!hDP{G_l5GL3~SrzPZePC-Q+ zbo!N)_Wmm`2sF>a3$MKY{;@sGLyBa-c4T{wy)QJfJv6r9C{b?0*v29H1B5olmM|=Q za9v$l2QtzSOJ8edf}TurKmTN(XwVIE`QWQT5dsQ5%eW?cBWY{_bV@h#^~iiR@3XId zB;5D6h?3sy5MfAg4bL)^upw4z$c%8s??D^ho17GapONl@9tGSBGj%K$OC{_TeM4Rh z6Ro4d1(C(%HR$QH!ns825Mpmf;nG4Mme2>{bEQ6j2TBu45}^{Rj5Ep_GEp&z16J1g z0;}9yoFFwQmZMN4=y6M2lolW@+DG1g?$}5gS}nFsgr2Q+OsjRIPjws^ETTi~xWIx# z-=CglPyA9i{mY{MyfE~`Guo1@aTbPE@yYp+8qDP(={e?DJgX-wSn_4Rmwd$Jmc>%( zBj#vq%!%}q64`sMkvWY<=_8???WX>GLmE|T9j6g{s8O_78mk}+)Ib*rl{L(vJTXBK z%fPJZFb6VDQnfjs2LM{Oq&#R6wgTb^*f2$9MOi5V5$W0p4>u&|ULS;jw}foab@(3Y zAIS6twIlWk(ZzF}P7Xx)u8~NE)Eynk&gk1)A$^$@_CCI^Ccb<qyI`tT-+JP?-lFJy zLokapWd|q5x0HZPBC&2$ZhraE$wJH2>4yFH$OKekXhhMbs?yOC?TE4WWPjdBW3I1v zcH4Z#=$%6;p5eww)R@z_w0W6I+fs8{(u1QbW@}pJ%fd&+J8jHWG*-WtM#WDYqW`h6 z!nytbZ>-43z3Eu#@)tYJ>8+Dy={*)zd&hF6CbQ09YRivm*mGZfqHU~lFjlP?D-2am zT;@VwZtmcY{Cy9|LnU<hCRS&rl<0j&H6>FuhN>I`qBptqsZER3Q8ZLB*@g%VRceVm zQ~@b<nYlFyUZbL~JX9j*Q>;Q<AN)`@4wvgvXrXu7sK{Zt=+ruOVho`M*>(Ia$d2U* z1*IdBW5ZPFFe-4|oFcL9*i@}4kgYy|VjI^`BZ598h<Qh4HcppbSAE0WyZiQwmA29w z^vhjU24mLF<*7!aTz2DJV%Cn8sm5em-3?K(0DUbR`kFsvt)8PtRnW3kVn2~daMW%% z4F0Q#sz{AGKo_IYN9s3(1VpGKkSQmJ8n}bPo*+OVI5T_{zT|3zKXHMxB60>qq>Mc? zC;#+8^WH9#%9@}|?b_eiw0EOPCHzp8*0oPaoPO(Edpo6O;fFTL(UMAv=FT=WoSQ8Y z?<kr*Q(u2(7HCrFn>aC)AFAF!D0$^M>|msz%jSYN_OqM`hl%0Fs!gq=`mEUF^erB+ z?n_ehZ*rIA<~Kmyd*0h$qoeR$G)OL>%YoI1x(mI*BxHm~uw?(V($1_6%q=#@5a}sx zU69lVKb@WypD!FLj+zWM7VAG5z{vp?FZ7|4&%rBl<6UjUridjIT`+k-=_9a0V<PxR z)YxmTy5<5j?)p)HmVEsvaIM=m#cN+)I|^%e@lm+(26+^sqInQgZ3gd!oarDZI*`iv z$2k2DBWLP@lhodUQGu}$LC(@^{nF$P=6URxFgLgfEV=HzZp=@k4_rNiGYGCsMY&X~ zd>DI;>PQt6KBy4!&P?d2;B9b#%h0wOLpd)Y8bu~IZVX!k&1g`9HpX8a7e}iT_NpDv zvX-N6XXkLVvva7_Q25BJ5VPh-M7?-nv!-NIdD%!|L`30m8M5gjm*7J%7;>X=GI>Sk z8Vq?jqaI`zW~4v5N2OP!_!vByht4D15E<kg{pw~Rde6I9wP)Ym!-n^~dk*XO2Ydax z?%P@htEx*{=z4&DdZ6noUc&!=5@_tMFgU6D<+A7Z@v`R_ivk)8zBUXPi?=Nv35+>t z;oyw~-oj4Bt%13&=ukn`MMMqma2aW`CY&{EHdQnwG~g0KA7R8Wy|=iS?5EH1RLkdk zAlXK)anXEE_>9Puyz2ljX)6DlO@Pg<el^Y0zd%#AxwdX|StS0gtDPy06ua))OrxJx zk>Z;O6lv_*=vyE1(iNqp73n-Zb;W6^MLI9RF#GnImX<Sb&1q-f;y=v3=p%e|-Pk{% z++h8F!#z7{Yj@n!5LGY#P!Dw0_D^S(bq-mW6-Pxh(CiCUPf<3Q0nlX?@vJx?k};+b zfwLb`0LLthVsz~wE=Nb@MjVy^4u|j?h}@2@7iVyTg9vR!Pzv)my#Zs#Il*kGY{c~` z4vystq#M8vyvkG9jm%&IU<9Z-^vpj@4W|4h>-@-!g6WU^Lj++;VBtDY-{ePpyh0JN z{*^4sFkbNTW4s(iM;b4n;xJx-Z;fJIa`*>dm#U38P{UN@4xrVTc=Nk3X1BPBriN~! zk)}7%NZVd@tD9(MuD#w-bimB0ZgGRWuH)hmACeLCYjY!;_G>B2H?nOD51<_Nvh|lY zI~bRZ8xM6*nHA&4!|n91IKei3yr0dp{u>U)wXEfq%LuP-yWE1&u7`hew_^(A#eia3 zF=iQVV$L4Zu)w`!`RU>A?C#-=$b=Gs3Pcgz6fW*=E`y%T9c3#N?#^HwqqARxY8=4p zR>=8afUcF4jE$BIl=N@xY-z5mDKDioQ=T8@MJ6<K{k6gs>(Y8C6PQz}bM0=O&z9me zI$y9H@Q@jp?X|=LL(w%gLn&FaNlkjSSkSmq8>6k5sRimr@9C)rBTem0g*K*kxrt>| zC;9ut6`M@OaX#cBjW13y703GoBvqSFgvFQUrKhEC2-k;rFxUpcs8b!8ZBEZBij~G9 zLWCaXy&+budO|4Oa%YourRMgzl28-j4NajXbGO$Bhnnu(QYs7!SzWVP))l0&WM;IE z8<|xSjpMBunH>`*;ZW9WR~B;bn*+76$O?{2+u#$P)R3bM)W$~zGU?sOQeFQ@aC%A{ z*j<1@#=IO-eW0+QZsVBZ8H-O1b9S$T8*>bE<AJ$RLU|#E)*OYqo3oqy)hY5|Za@*a zp@^@Gi)$Cmu~0;j>~j=;?Hq+zvaY`!UKkgYyBJ)1%q?&3uml$r4D=UlEa+-&t|%)m zlxH|9&dc+f8Kx4<m^V192}=pJZ*77Ja$-x{!k6*{8*s2<Ca=z~$u_?pqN7+_zkum2 zpRVp+3JY86uG(CVsa>c~t1w_@3ymoy3BGK}PhXN^EQ<B@PpU|}5MD6UR-YJ=80Lj^ z50q%GOVQ?KX6BZ}OSPI%$SdX@8mm@T3Avk2HcJoH92w2&udVIR89h?Nx|&aJ$`wWg zWBsNq=^@i#tud*pFPZsEzfJC|N;1|CnpjuXrh22mx?5Oswox6M7UmOfY|M_NDGido z6<HG7KN6CjOfyRM(<1ceeGY%ZiIAb#@|-VsJIREm$hAfCk1&RrhhnN={jM%f5J2z- zpcIgtu+2{cupZKNh!}q6g{VL0<m8m$lwnGyfCyELvH2HKx<H$zRejFj2x}7hm?Ta7 zMKpZ=D2c<L8s_Hy_<xI(2nrr2frd+Cv%EGoB+PZTu_5%24Vo{H4qQ6dj!vw7bpGC@ ze`kC&pA|e>AADhn!ahOz-IVl+*ztM8Fsi2-_U@H_{(p<bFvUaCY2`-5I1&_>)@m?Q z;X}|b$vKtw=pU>UY<5av2<C8cD!&32f7?Y$m=7q_Y>O0za%GPO`R_dDvz~y1?F9hr zlQ?7whnhh}REP*Lz^@^@s|f%BIc*aDd#QfkSdA$t#N04_v}x0$TP)&|gQ0P2W8p+o zj?ULNHotAAtV%k~Hag|^?>u!^?d691&+O_>F9QpB-I1Zpq=u;-2MX>lIJ9#HISS|^ zQ+x;Gk_??U>hFyU^n}knF5$Nxmunw$%W=UIXk6l={7|79P%;{qs}zw}6IaRkV-kM7 zG;(P?J!i|~vmIwAa)o(8U$e>5vAZcQws}uSC5?wm@9CF^<Hz1O-<36Xyg7HgT3@sM z?)vzqOWUfU$YUJNU}E>H^591X<`e#EFREGO>;!dDV4kpGZKVr1z%9s+Ab*I5MZ<?3 zZC3F=CK0~_WS~ix{^jLEzmk5D#-iVo-ZwMtxAy;$MQ2IBWKTWb`<V1JJ8`Aw3OjnG z?+P1}I<NFR#^3*<@+)GL>aW<p$7D?xv`Y|W(A;2gje_D2erGfzfR8LO9)SJK_Pt{M zy06Ku1RW>UEyhWB?Y9<?rrW=OzfnZ-To}8Z#33lwl8)tu<^W9rk*6ZK3dEfTpbi#` z5X7`9d)qfBU*YZjvq~*~)4?A|Y@T_E_b{GS3cIKc@pM3>5VuwcIB^35e7!x~og5TF zEXY9y70ZhokB*7qhm|&sc^aFlN=qx_QPWb(HnPUTw82eVtHV_DK~eGAz_6?)oDC&4 z#_VLO_KPNORT+dr2OvEZa@}NXOK{OE#=RLZ?hGwfJF=}u^D<TM9XPgvWF@-i7r5sU zeh+w-0e=<cTYUK~Ix}t()ET+AsSJjdV+RyY(!Wb@I_y(DNozupsi?xfpH=Kr+`)2X z&0!=0YXg=9Q_e)I{WXp%m4lOm%4sGhBq-8V<?Q0-;_NmP<tre=Z{Ck70{}EoIt&If zr(lMa<uV9wMHusNck>ujcqy>rd?*>3+lm2Iy6{k~r^?-3?G77e{PVoXc87<Thr8E5 z_*P`NTl)6zpPTFHsjkk-ijDR2Qz-V|vHy;9XHK3tdU$T%+`c`#wryQr?3wME-8?lu zHZ)M(UEST)(bn2npH-DrRZ&({XvvGsjLkHsB^wP1emXy$T=5fQ=o{r16-!IXrmu6^ z24;k7e+7`1m`vAydF^i`6=~Vra3_Dz+O_;Sb_t4Wf5;-ztCI}X<_KX%a0`qIG9?J? zeHLM^HW;ciB7|ANO&uMSk|0#@&${Q7xQsqY6r^w7@R7A{-Qz?<3a+x&2=c?$zd?E* zA66Oo(_90if>RR2H2%r8?^OO-Uy>X`to8m;8@zJjq~FGuUh}&%{XWtve{20{{cq9- z`qJd!;N(($e0FxcD)_o5-Q>=z??EMoT4~Vngz7D9A7?}=DT)>ftc*@EWeL|r1b~-8 z7a1C;hCuYhN_BB(Vodag5F}5LJH$X@h)@_jp_wwtZ5jrhobX}^_zu9c{`H?D&<@wF zLglQ2aK&2z%E5+(Fwy#oNT?K<S>+G1rRX#jGe_g$jw)TWs6*ZcQ~NrK$_Cf1eWh7$ z_)7?LM`^`}KiT4r`ih<6C4m(bOaHw3XF>W(35(HtpDlPx?DIZX__Z7l>5D+a-0#5} zrOT4H+xCI7Z2F5m;dP<->#HZcFO+;;_&{K#CDM;jzEOImjOj^Uh>D-$OqhmFC8G9q zIN^p6?m=`60d-0gg?k6y+qGmP_&NFEpj3v3`ui$<l&Ek84OEXbJ2MCU!D1s5D_SFC zH*^{$Yn8s*Dji>D-|Ty2M|t^<M|-6wSY!G2jcKVHw^!ijk5bt~snW~VM^#S=Ih*g1 znO%lazId^!YHLdpF?jPDpE$ooNa94r6Bf_tC~r3r%rkt@?W7waIJ@QYUvNm-UFYPO z1%Tb=^rUj2_|g_*z%hN}Wu)kQ=94Uc?;&)+IP2n2x;d5{_9~1`G<O(+whL|+@Nkma zbCuH#sBvz{ihrw<-l=25rt!<u!;fYz&!{pV9@~8Xm}xnxe%Hp-uBvRm_)EiGyXvCC z^VwM5H^<+;&|M2g0@XjCtzWAk8k$y-VEwRpfL9QuGye_DZ-Ju^j=OLRs^SSE&PzEt zpF6D)cO%80`&(t8l}TB!`th>puq^YIvjJKsG7o-~>I|NPsvlIR&F03oJq)ADgLt$h z*1yF5xviE2<)+wQ6J_<^Cj4%zoYFuCzv4&I@4*A|6m};V^YFV8d8C7wb&xs`xuK2A z0h7k_p+QhWGzXl@fsZJyJUcxJg$6ase5=PhhktyoE@#VQn_2trCSC5rm8o|)Nx${u zy0h;dn0w<?vp67>FW=iS`S@~yl`_wn;#<<6m4s{$Re;^V!=2)L*bms|#Ja$7`REpp zZiiA4W3>kA8#V#JYNXHFnqj8mXL2*NR_zZqzkO#X%NRS`sVSXn01aNn$~}!g;Hh8I zJ?5DwmMV@fwD@#;<+N@t?mgHNYyF7(u9@Or@y6HDDnCW8B@40#C<KK2$pUm>{VvXM zb739@fs@Pt+YhZoPUiMgaIOPPuD1{25u61O9bi!Ce+00iL>}c~X(xN-oHSH9e0XW; z@NgqTF0{44>M48)_{lJ94SpMA!P0MpJNX(wW{+|d?ebG(TQaV13s#1J2&mkqzuOYB zFy)p&BSA~jq(|A&yQOEVhWD<l>>aLQpy#&!)%rd5-+%anoLltAKeAt98Zyy_OBfFi z!uq)pA{jY?SfB(pgXH2g8$`3hSECHckQWKP4$)O~o0B~3-L)WHVc*=#CJsp}?D10s zBmj?xbwIesnqm#({cXp)?n8e+>s<t2{d@0v{M@4S0(<Q|OFb){XXh_cCJ<O6dA`*D zSijHT)rogKgnqe`ZcfV#A%E%->!9b$Kt=?RX+E)EY1vce1cLsyT%+%@9}7&Ho0sCZ zY!Q8hyGK5Lo_C4X^DrKF8U48Vvt^LsXFdBp_8veBCzqtCr6r+-{d#mYQBG#Uv&W_1 z@%hjysLl;e6rP+4_XHILQmJg@M*vz--aoZH!8;J?=m?_N(&MpZRRnV9xOd(i;pgV5 z^WE{0wYxU5ghFGOkE3f)Ty9gkd5g3#FU*NWY~b>DCi-8y&?gSCxT5y{;UuKmbr!}j ztIk$zfq~ERFB~t#^W@!Ji6s@Q1nq)A5qW|Ttx+DrqC|OY<3P241fA3C8YYwN@RdX3 zEWD83dukvhqHLx<Jgd$afFMpu`hxVrf?yJ6S=qKn`*V(L>-E{_Q?hZwT)Df?%&Z^T zGqxZn6_cO-Mp*^>yin0jIG)n{Xjt6vih?%^)gWy2P@x<Ty@pvegeB^|L*-lnDkIO` zWJ+?ADeZnxSQ<p)O&>u3@f3BcoM&RF&5d)|hF%9lbyfYbyyUsU#>1QHOu;_U=9>N- zA-^?U?Gu$%KUz?lg(Q)1&#)xm_sng@#&A!yp*T_Bn=W~e4aMcg`gzBffw?a>#M2RA zf{3sPbKjnG_t!IJ(V-nvjY-0|(7ONrTIu70gF81j8G{WAM=v$8^o*t1;p&8hs-fBC zOzE|%Gl!OwynTht3xBKDZQ6RUh!y1@U#^SEYwXw<iwOe$1wPH~IO|ivEA|bGTLzeL zf#l_5WGh>6b*LzkOioK^D<t)B$P=qp(9JK9Gu?@F?G_ivPe{4-1@r`q_Qt29-C?{X z_JnL`0En?91joadEpuq8?EXz1&lM;Crkr`5ZpNJ2`R*uVndS`uBVb-Qn+x2W{>tqS z9Wd`IpM7R~A=9_+YRzg&4>5KfYL6+6nA*;mwsNkne!e1#HP;x1%+^1#`JoC_0@9bJ zrj^F~xCt2%+U|SanXPI6!u}?4TqqjfYpL7#g*`RyZdJcIy{Y!nj@p*}57drr|7op< z7yJJHH?#BKn3*td8!OK3UjT;{_IN&cH=c!T;+&-vW#YMZ45)3pWa8Ug?PwEE4L05| zZdH?vA{aN%y<?ryuUW_f+aP_w{<g5}JYfx1Rg5q;^2r8peaOTm3^B^rlv^RMJn8(s z?tQYfy7qmxSP7*2HSa2xtisk$73`NwW6o1n3(_7(R&T$W?<cJBqfl+}ix!sv6#T~Q zs_Y7-2GR@|;W60XBIqH9z>mq9XgJ*89{eUU#Yp)=fmjf4b)_X5XB06vky{o|z42oH zL@XRnCCN%Pkb|(7IZT~`bC5sR6S4@~hlkmz>q%MIknkmT;bz1ve1B06G3A<*E<Is! z0geeOh1_S_8`^7Ixz=~uXi$3OUgLneMPJrm2D(SelC+&x(bS2X<w^=qjg7G#H{?tH zn~=QvyPGFX(wbyW=m+!@tV#H0;MZY3*KmK~8l0H`Yf_E_ep$zDLyM7gaKavX!^)1K z60S~*73Vg7>l+L)A5hy|tb*n<PQ*6SG&@biHbGXNcM8&4$fv!)hZvA^R%t2owvAtW z96)-25?}!+0d_&$mBZcPXyvPgq!f~Oh@FEe%xT7?Xl+<%V1S#e0>vhr;4o5A?1M_} z;8axG^K<;Kt+vZFc9?;`=&<d%<?Ouf{O}>sCn`NAXa3R2&6frZ%o-Hic689xT2mAr zy`i*qRB9FGSZMJ~bK8yvoqzAWKU{dyC98eDB&jYx!6jtr{VO9a=fAu1?3L~(4mS7# zGtm*86cr%W%{5(Gu4p;=A}PEA=X#uiOr|X1MoXPLRt(k*;x%%g5op39qQoRo=^z4) zYGclj-Jte<$Hg**Au-kzXNm|53iS1MaaQP<j`9bo?>ZarEe<TM%X0v_Tm}Yo8WilI z0+7P*rypO+XDho9MXRoMtC&64K5}6s)v8Nu+tWOF%AB#GtYf^jc&aYNS?Ffb<&%Ex zXWy6%_r7Oe`;=$*!#gXg_dMR$<=b@6wyM&cs>sYZwYZu+w6Dz9vaK&0U4^Xs59u4q zJy=($VQJAJiR>DM2E<~dZm;PwFhOKdXR~{4)`yPN7*eoJ!jWyS?kY&1dSHsRE>~+) zM=y>_e_ULAl>Oki7_MqN_nqyVzk0e&7!azq-Q6;JWot3BR$}SR2&bqm@4^m&9t<2R z5YMh)ndD^y;nEu<&Bbn7$+`;|gMC!wdBpnR76?udy9FXQWxD&G`9hZ5bGS`&@RY#v zr%pG1cX|0dd+-jS#U+30?$MGXTbg~kHIMD?+|#79C-hT0zJh!^PmD<j>HQv%7F1Uh z?g4B;6|_{yMLGw_E+eyuFMK4};cKcWk0J@)-dv2)F(3z()<7|7gbDU$=>jTFL==ve zha}s|%4<ED^`1oxMYHhu`oi*MZF=E<tpsyIyS{;T0oe;X?bhwWDBakuP(`S>zixfI zZm8+b+f^WxE$gc1s>0GYphQqeu#2%IF~Ir~N@Pe#<NstzuG~JT1mj(7QAdhUL8C_N z2s|E$<23+t6osrFU|=J{<!r3$YoW@RBfH`d6U`L*_-JE{F(k;(*TYQ_#Q<+14mdar z;8`Iy3PFdIT6;nw7Mw4K#t}kPDB1t!zJjo<)|n#>yI$Ru51;q8#DNP_8NJO_kul*l zJu~e?r+N%*^%IuZds_A8*pt86^+wYJXLoj|_B{0d&QnvPub=IN5D01yNsbEm`1sJ} zw+8FGzqlWz#F*j{$h|xadz2!_k_j`DMM0Uy8n9;$3yA&;sC$HKxeuR)-JU-Y6Xh3+ zvrM+tQG$*F``jaf&e+m~(^6wl%}Bg#)rkXwR6O;?r94oE4s<=Vvr1TDsU6!Ys!_b? z*(bKbM(akRaL()lqx}~rGczXd87*CEO-^W-FZ<$?1Oh=@FG>r_R7^w+op99F7~a;Z zr;Iq^qHon?zEXITgAsthp?-bWAlp?UIU;xu1Bt)eCHC`ljgy9m$E*f%Sdc2lzp!j6 z-3~g`hjvyAD}t#LecRb-O6@z^x(QZcxAni2d8lX7e{q6(H&VLTYScH(m9_6}OBlt= zKmAluiFH2%cUg?$iE;&`=r=!gL0*$1`<?`Efx_u&#-7T5$^>f+*S6!@S!EWk{jgcS zw&2qte(itbT4!AQ;-^FWVnMMD8`=qTOnLLD7{{G|C=W)HYG*FRaR!%>r>8<eR9-$_ zxYk_*G9<V^An`PGictWc5epJ&xN7nCC8>Dq%C@4St&fjU-d64I&SYcf?mDqj82Pw9 zXZliq|HY{+W(^T`!Rfc9w0yBO31XM_5N1=kjP^vp>xZi8u=U{(f&xWk-9&*&34TDw z6I_oDS19lr4O3_mHDCk^R3k`02<r$IPKOLYqr7F1h2F%Glg??@dBp;rctCAs-|IZo zWiWId>U?pb2CxrbCWNVHLn2V{5gBt|eKCJyR_KQ8E(<G~ztGl3)IsRNmza>XaZAp| zSGwB2ys_=Bg<>|0o}_^!EpJPw8O@^F1iw|@<`4**rh&XTU^a3{L)tQlP%KUqM|Thq zg2MqS)7ldLLJ-y>`ic4&T~M@d3>nS9xxvN@0JzXjy-poLrZRPeWP{B-MCvtyPI63@ zoQq^-%)4z!ENss#8jVImg>$emCMGjB*bCl;@PN4u;Y^4upKpjSN{x1lS!&2^D@fen z&i>b3o0u7?&r8?<1{kl9guM8uY-6-LY*ryDd)M-0gVACZ3O-4SYO73%E9o2>Ng8>3 znDu{mX!y-beN2s-)m7~Y)k8CjW;Pa)5g!;|(m5~?U#08pXv~iZ)Msh@^(fb($oTX> zIp1s{$#K-YqDUk{S8%P<Tw~f5G}nA<^3&H&+?JP<ma31_#A>1($+1Y_5M&R+<R$Tl zpKPZx{*jF>n9NtF-2qn%u|cT~=3`5xqeU8B#dv|$+Ie<7D<rKh)mRYc>!C^0#TTY% z)hJdF8MGxtD+md#ds>V7^1}tTBWF{6k}$&JYp08g#!90`SaR=)p7hQAHNJj@tz%jJ zkrg?**rN8K@#K-O5BGm(c<gHzdl*Y<o+-fEW{Rdy{~g=~SzvX8JVgvaiNpcEAdo<b zU>kf|Z~$TJA>c+dbr4QiNnIEQBzdF9x;QmhzTo?$vmRXFVNjbe&D1?!hePWCv(kXX z8l7!C=qKcOzqY|tp71;j5cg1Hl)1(jAPCxs6?e4{`iK&5HQSa{EHbA#<x9eo=1xmg zY*~NS2M+()d}1U^R3?{a=zUXOX$&((`DOQQEoiu}Mpswg5WDg6a;dPg*Z^-q05V8| zjb(<EI&&x+WU;mLwEmx!?ogT$V@w2Y17~3nQ({+=&5>#%-zsGfL62CUF@dvVjp8c9 zj2jaoHRv_+E-3D4o8fi25|om|({ixOsoQ*5bm?g*S{d>{!_kq<w7!G&(!aBy@uzo} z#}xPF?Aj-=(Acg1At*y&YF{i8%6zq{k=5<Hg)_q}vV3z*^=w7-uyOE?(Y%SaLjQ<I zj~&UGj1LOTDaZ>xP(E26&8)Qv?X7hh<Bp4$sE;2?M>*%0UXf0+N{v2-@jj*`->i@F zVYAl9^fW+|<HLCuv66K>AV8~FW0vzl$T5Iw=#+VMV;A$-FDTltuO82pzAb=I<Lp%4 zXje}^^9<hUjt;WeqOMf-OIr`w4~GMiYBDnFQv!#htGCp5?h6mzK0FZ96z=Dfn3U+# zXQ~2;fuva1J*?M2?9sa+i_<7831$uy8AvRs$2JmT8-^Mhpi*hypQsuEmR8%jPf7cz zna-2;H8)5vm6q?vi_#AS2fx_jp|a==$whiK{B{BX5#qEkasoZTNfqoh7Z?P%LYTqQ zoSNU93In#%`h3$fk6oCD<Yl>|2hZM7B0TlUfw210<oMFAq2a{guXCAHuz%~OIs?n< zSt6d<H1uaX_Fpn*>c&jrL;;{vbm#!P0&O>xjO`*#fBnWof0Gr-8lAsRZBHN%gOMU{ zJew4zexM*2@2%NP6a~Wj47J6z@WyyEAwoSD5-AALNcYcgO$~(4_76<utuZ%d#<TD! zW4Jf5ZDd)Mnx^uUvdxDJ`d{s38^7Au`{aRo#<KdhT7+}bU4<u)?C8m06R6f%KR!2S zV&CR6<rMm~A9EBZ_vxxx1|LellcO9fxUoyfxq@HTAG5^?)Ne62JP)4|83ik_1hJ7( zsnNtVE`<BdZU_^YM`&VxQ)*rl((|MpTeh%$pbP!v4oz!ys=jpN;BW#>Lf<<>mVH|% z>XI0eX)LVOItT^7N%$hk!y{-r<#$H&^@T$nM<V6}QB={+NJhE`&5L6fAi80WNQxnx ztljy;O)jKa+M3U0;kqdih9nS5vJsqpPJxNhrUFU^+u%K?-XJh-*<@uwdwLLKzm@!< z+xxTMVgec~Qpz_Uw$KE0z0ubL1DPgZTRw&w?Y)dMeFDDRB$D4=@OFDMcpIP(qvcen zaxJF-YYHU*ag1@>KUNnJ=1-b^5=$bW2)FyWGZ&{iRdgVSAICec*HMIfS6<y$8lKZW zd$ghNzLMC&+Zy`L446^|Pxse>wHt?m-=ZHZjIyl{`;T1t#a8CfaPi1I3eH9AdLp9Q zPrfuD{cYgo+uK=6*Up-*XFEHd>l%A#K9BnGMf9T#wtXV?BOGa*5m<kun830kwvn}1 zDRseq05L^WWN3(wm$Q=s96;0$RJ^@<wsI>4PED#eXzvp$L<wKahm;bStLK6%yfwv} z&or#Oy1#_6f*mg`bX?4g%sgD#ecMI@L%-@-NJeXR=6puxTxJVg7aeE81T_A}xlR@w z-5VNGz3uMC_-2^#d@j1Nc8ITDLpHnZ<eY)ec+C{CvAzQQ&DV@fXUE-zw^%LguSjEi z9=u>)F$Ko5-pn9q0Kr>AqEWzg<B{$vByNZ>L`GIU4Lvo+rahNyM!r782EH{i@zw=+ zqcaB&*3j5Cp<O*#(>HGyWX!GGWrw`3Q}0Nyuvew?;wEX?7x2}>?%Yr&M29Q{#|c78 z@8PzZ%@xt2_@m)r>;B~4Dnstz?vnN|wXwEmI{P2lR*GV!{fFxLcoD{Q6l>R_KrRfl z4WbDli=JWK+A-YFJ{&}x$%2g5fg|hc#)HkHf#Czk71v1Dmk_1niLYVk(<mXj_9Mwi z8~w~;T+OC}tikfwy2H<pZT!OC+C?#|cSmW%v5~B-kt20aKG}F`GT$<Ny0K>eV79o( znhrnNJ@)F!7Is_td~3FkUtZHl?#P|P$r+>PdP+9e#>b!nOw~lOW;DEXz8S3KF^1-) z%1!rfN=qHP3*ChcR4qKAyiN2|l(EC8WUpv4S>(@~@%b6s=g4VZ`}}3;k`mUFpi>km z+&@LkRZ#$RuJh9h*h-AsN=)zs;oL7A)Rd2IaR-$NDp&!T70jFvKq3oB4PU;$R`B$J zT2Ydi$QG2}(Ra4gX-t-bwYwn6ey=PRzU<(F`@^55+sin}_c=Ty4`GHc(Zf2vBtOpX z&Pg)~U#2sh9=E7Ek<fw1rRE>3+ljTt-uu*3coNa#wf1nN7=Hkv4;+!a3~fkwk{(c& zXjpF7+itHtMq|YO3+;Iw?I~kpN(khyU~%xzr<4t#YEfh9jegpLj~v;k;w=89d#07e z;(~*V5W~jy&^Kd>7x0C^+CK$aU-2unMXm6&02&6Q1|EzJIUW)$;4HMa2ynDDXB8S3 zPlHv4-YtE!_EVeOPRoJXV@I$4NDV-}Sl9+F*!MOLKxGc6Vw7XR`Q&-c<>&?+5e`ns zoFtbHHa*#?$`+|^S*l{sEwiV^@2@6_-ydg-(osBf2RIQs@l0R&9CFCvz<3q30+lKs zU}8vfl%iEAa_RX6ta@GAzl#&HmF+LFy@&!5%1)_xS!!cnpg+s(pO9n!Pf{PdJS<L+ z(pyJYPxJn;$At}IxOfG5YJq@J;Q5L+>L>Vm6s#^Tibl?kBwI_2e4K?Ci{s*olSA0m zpM<~Z3XQ?R#zLK5SCAAOoK&F0d<prV{zdt=;$`>(yfg%W^kVPvc~s)_JMg(q;U)bB zZ^ZZTcGLHd<2MIICeDbvAulvw*RFvrwxZZUb+3197hGJo1p$Qahy%j~N}-Et5RC@n z8XQ%W<jpmxVvHcU!(lWEB|`PW{HC$qZluy7nJz9W$_<0Y%QoYzupwh)-;h0GmL`8I zJHP~<BXDCDmx{y<WX#p7>o;EGtAp#}u|QLOMoxWDaAS66y(v&lzcmI2HDqNrm;$Af z^eufJm_q-i28zL8AC1x`1i82bCq!uzgIuH+@rhQO5bW&CzxjXEy?1;R$N4|Lv%7aE z2@n#JP%o$6+o|{7k&uuOLPAtEiYTI*V!$@IPz>0nN?>qoj2rF*_uyV|NgO+I$tQ`E zIPP&`r=Z*Wy`P!ALj{t2KEJ=d@OrejJI_A*%ri63%slhVGk(t6o(Xso8t*$nr1(xK z$ddcASxfT5#<a}%_{_A%g~?6HiyAGNadDZJ#zo1>y~zuk($es&DG4|hqz~U4RF)GN znNt?j6jaK81U8L(q8I{sT4`WYU|CL7R8Cpo@X9ph+B8&^A?Y3^Q8|m!3M%r)nzHcb zmALCGd3rNxnuj~DLD)~44$HJ3^X$W^7Eyh2oVJN=^kA_5a5^V-IyeWCEI=Rx^DdHF zaN*ANAjPYN(L*6^hf`O=;Ev+NBDG&HW}ezt%2{ozhjs(Io*}p;(M*%>Q}(NW#c0m> zC<rFUMNm=P&?rxsabL3PlT13pS6-sJ8_uH|xgx?ZobX_Z!slo$ZW63^<m$`h9t=Xr z^+jR}FfhrZy>IZqWAeb*=kUN1$9(XHkA8?;e52s`0b7-_?5?}|VZUXcu0@QX?il5U z)(aO3<a+BH?AZ#=Z<BnB@*;TglA52uKn4H7MJ%|0k370VEGtP;9*;C?zk!EYkvOUu z1VoZJxFV0iN{G$_w7k5qq-S)(^o~|{QQe`A#5v^@{DPhKinylby1i_<Jg+mZEIoX} z3c~}t%bVHI?V8HIU9pn+B@~8RKT<+L45fK3bl)P_mo3y1?LlS`3TGlba81VfljxKf zegq13`0%hcWt?HT4Oz&S>ny1$I7B-J(GzG4jU!q--CU_9VmG#t!ol%LHd#|Rh+R~6 zSAE$FJ4DRhX2nB0sj`4b`K#f;`N5H%CiS_e4NpF1%IdqLvwh#947N^=sp&2#fpx^l z`m`fPHjjPMU$r~Et7~F@eUrI=)|s{s=A2kln%%RfrF2PkWZLYF6(6*buedDj#~9@y z=;0VCgQ0Jv9SSZ8exZuvn00?X{RyfmZEGgiy^%Qf8%oBCydaW_cp4LoP7_w3rm4&Y zBb*5n_<WU04N9+#_KWb&L!8zHjirAq<G*~<VBmcNA1jNuiLw97cZ>dypCtE#DH&<; zu`$u^o@V!OI;WcJ*)TEO&7jeV*lmTFD?E$_Y(w4_oJfQ<D`8!U3R4fBV=lh2AzpFr z?%qY_%=%QHenVQvb<I204mWOX&v077)}9+)xuc*XFDNjtqi~1vp*1hEJUzroZJ*#8 z->|G$zR<jXNj|eaX*kPr7TwrD+oH5JEVF%mamo5QWE*ADHRxN?c|D#{G(8+WM+Ej9 zcwntdqLNl?yikj)v83pXVX8r$58El;!juqGKwfNR)DPQbO|?3l)|<SM;|aVz+ubbm z97m<2PIC}G*pBH5YP6SGY0>87EIu+XyFcAIb5-7kmu{(J&*LAfz2(IXc`I|A)0gMW zKeRZTokFbiQ*xU7(g!vaySw*JcB?<|^XuJb-PNXC|K5QHch|*k9);`gUuI~#3(Zt2 zLmm&J|BS<UvK7wnlZsqs&uXm5O~z7xvST;7!wtkfgw~Cgawe?4=-o#4fR=InodGIU zjt(uDnU>d4WM<4<*pZvwnjbb-_6)O_BeNqsJR-BB%&DQC@^3>>WGJwZkb?HSyg3Et zc~c^?qocCIr?`j1As$za>t@v@d1hfmTFa8mX_-q~(j!V{r-$XndPf!1MNEsR&5!bl z&Iq)&XDw|`OKV=5Rd4?hS(hIfSx_5U&wu3CMV{Any!4&zOXYtIf5aM6y5#hDQp6NV zPUgqErem<24y8z&|3pSnE&1{R#ygk$bfv3nZ%16trn2(QSwV$eRe7^=f>_$Z-EDq( z3u`oM;r!Atbj6_*!NyCjzUEX%oTnFC$$X~D{^dKDmS(oC%86)y;wQUO7nE=A%#r2X zxaHgT)<i|r=0#bi&!-I(s&qa6^c$Xsr+6^9%%-x+%18?Lb%lj88PT2@0y-gNq{Z98 zs=ktyo;j{e7zTmzQ~la0W%)AJsVwhwk1kG5DaPp$7@j2~aNsn9M`TEFgr~va8G)+@ z&i2xtVWn!{rGv1Z45<r-V>+j&r%&&UIT15wdRkgTXN>A!mKPJ7SLS!fuPiT?epnA6 zf`Qbl98~EHmWlArbb8!lGIju>Y9Ztg*+o3ivUT@Q9N72up|pe5?Z;2FS8MX|njyB+ zkcr{wJzAUWt2MC)t$$*_K*#uta;}FDLl55u`#`W14Z7hWZZhab=*tZDEnFDo!f$CR zj_bsh1sIAVBUSH~^9yTsuIVg|h^m;s=DLa{k6&NItWx&P_49u^Q@geP=4?42b7yB- zL2PaBrrovGyEgaM#kJn{(y}D&oF$hP<|(md8QPaD$O1D3=5TqoAJyAnLr!8ZX#bEu z&pskWvb7&dIO*<HTJ^&{pP$K})BFthMZkX!eRvYPU<;JL5cr{g=lJ_L{uG+e$zK4U zFM|CYKk#0*?O*739>IGr*(S(eiubTNioUZ=QgQFj-}{o@la;fo{=H0mZ!drE6<dJ) zz30Vy^GEPU?@|A@1v;U^@K;E+2y(T=1iDjsVN^iTT#PhbLoixez;P90URu2JCgYHO zDTANb(Y)%#QbRyu>Fkvi&9{_#7ar?dG`ObG;$5)u$&LLFZ!9gj=D{^BH*};VcU<36 z+(-N8+=}LIP_(Z0%H7wkoRORq-<h1jO4l4e_u8W3jbA*ueEKa<FERH%zGGT<(bByQ z<{3CCE3USC?Y83Vl-U)r(ATfqCaDN=iP?eiQ6r7z48j4`tjcSxkF8a*{%Xws=LO>_ z((Re>UpT<)r14QF1-MX47+Nq!j#^Cdu%1(1y>yp6+lo_Hhp&;V<r1rRcZUL(i#gp^ zcT_*nxL1Bq`3iG%MWQ(oABRHW>myosH$I|8GgH1Aenu&kA4FAP(rUC}nisl&N7!}o zT?ABt_mKkKFHeYwWY=%hCeHiok#AY>?%nD>_)2ZXdkXeVE>usc-mvjDNXsObC%a}= zX9XJ-yl-E6$GjGs%P;R;<lZVO`SN3F9`<dDz%#W#O*dmNBR|AI56<JIo|=T^vl;2x z9aU-WQ_?Eiv(sl3#`{m4s6VYto8q2UH3v@%;`}GI8QuNka-+j>_DhgEwjT$@rWb}s z=f(NE8;5gDZUJ$5(cy(@qtapn+)Q$0eD|V`%GliYl^Gc;+jC<p=D_@&7~j=J4?E~# zM{aCoM^{&T$n?f(x#6+JO-(hv;l4FZO(iibJa<~-bhDYKun|ecSoK3n2rm!BURFLZ z2E$HkeAGv!^5-=ai;(&fl+fX1_~XVOcX@wg-O9Q^-Gjmz9u!_IrhcF{tR&PeIm<H5 z;@76TQ7Ev3kQ;>|yl!(_s*CeH*NCE4%fB#3MSIzWV;qW<uOzcniuO{PYIZ|=L3|i~ z-Yq_jUu1HjHPA!^z%ZI9Y#5z|d!@8H64zIS=OH=3V#yAzTASdUxV|zpD=jr3C^IuZ zylP#-l(8623G1suvn-Z?pp2}%2)v@qENsG&xt;-&UHv>Ku;#)wxS!zR>pD5WYa+wF z_GuyfBqw_MPoC`OF_E=gMhFCg+)RdKCY_b;MojqSus0YVohVaXHJix8!|Vab^ro@6 zVpij=A6-}2uUT2a83d0D+fcX&J;n29*cWWymk}>7W+{t*74g_&?QM{R4trOMS7X&% zq#oFu<D{pHpdGQ|f1?y@-NLok*{4Z)VddYtg=-^v=VK`r=c}B+J0TczzwLO(V%;R( zdE5TZCh-o+1m-n0746Ib&vK{7Cpy8a5&V;TJu|Z?EM$0R${F+6F|BK!wn*{P&Z&y_ zG^>P%+*xasHAenG?r?Fj-etYZ#f4<SPT9)kPDsQVvf%mx{S4QHXttd!Gp{l%oDFo> z9m!40Tv<x~MbcD6K5)S~CPr`&AjL{_u6YH{b!x&WYc4DmJ<<|sxikRJhHJ5_ai?^P zv=_Tz5x;r=t$TLeeB+Mmw{P9DX~XK3E0!(o>+M=Jf8LyqSu>{BS5=l3=jCRnMF#u2 zI?Gd$sWjAPBXlpe>SUyQ1K_U$iy9sy1f3@a(~(dL<W%To5O-k$H64>}Y;d3n6|VF< z%qxQarbE|z0ToU!xaBd$arGGao2Yq)g&Cl=DC{@^8~OXYitOx)%Ixg&<Cg4z0B`St z%$`}%Vc{_`VPP?{Ymm2Juq7`!At!ZsU%^uOgJt=b-aoTcDLs>~l?VF!2Udh1E<J2L zd#F@gdMxIUVvE*T!2c;<=ktGZL`F$TMgjd<7Z>Lp<%A>d<D#{9*G0y~MHbMX7M~y= zzr=*pgm<iqA6#Boxcot7?qJcJIYonWv=qOoUOsc!+eQ4}a9JV$CwIGf$2Z-q-E$M0 zdXsjK{sRj=(q!xV>O)Qg(8MuVk4VAzYjV-Vv{Y=ejGclxw;?&sSuvm=g#U)a0}2hF z%Lyh<c$|2Ld07-lmjGUM)2xqLACS)*C%R9Vnh@?CQQlpYHNQHJy&=c=M1;8e_`3w+ z1hLm&e|;&oj$z%hX*gv#MS1&@FE*OG1!ra##T4~aM+FskRb(a?rTJNsq9%n$N2VsX zpRvwVU4~S&fuGyH!%E2@=J#=E0}+0cRcZsgpMX;%?;m7us3cN`=pMu}J@yvDF>C44 zBMXukON1X2ekHOEEU;u*W8<=tK*j<~`x_gVmIN^N`Mf7~x3uhjV&1d!p4ipWvg`5r zlgn@JFDqYmbNNT*w=A!ySaCDXabTtB!1gO4QYh`6!t9Cm#bEw~y}PuE2J1efU3`4c zf4)@b7d{1h&Yf_43A$suG>!TpcOv|t$*k<RzQoJ{sS#7*su4P4uCkcL*Y*@-FQ|$R zPAdt2pFLj7{Qc9@GyKhI;U2BEnH?n&K{?GCv9*<@p)cd>`RZrNo5ts0lZu3FBBx^2 z7_teAGKEE0GKGjtBo=tF(Wsv<q$+Q2eeIQNnMdzCvR7nUNSGxdDcB<r3bu%OMWmU{ zsY%InKar`QJ^uLjzYflh^9wKsz}gq?J}D?KImq7};O1|h0^NW`V)Zk1xA9@JiQ)Sm zrjg(GM%lnqAPn6Wjj>E#%EQ~<eR~_5bfeYRf<w>4EV;hM#5pyI{_$A>>SyQAf4_Q# zY;^Va_6>G3)G)WuteCLm5H}U4BTG%l=d(sQ{bI!7^f-cZj>xA0eizEKyPkS#7n`(N zd#3w|o7B(lzyJG=KY>3B_&Yx0Jvh{n{=_RLggP^Y$;AWAb@%zFcFUjL_(Zqim*3xi zKim8#(t9#1QO_$!jr(!xf)~E&IR$m`a=k-fRp_Zq^7&AX%1P6g;+T-eB-UkE+%~Jv zuxa4w!-liD?S*D@VS8>vV^h5gc7dXf1gTHRZy94?Pd7g5VxYc=8XI-1XiY&=0>Y-$ z`3JCdhK#WCg3PHYsT~<udO-eRHAB45-53+PNI1pD1q+B&`&8`B7hAIyz-VVT#`9{& z%nAi_LqDM?%dHnTZeky<V()LnIn=-Xj%C6HclV_MHYk&`9cu3<pq~Qz6nj6J)+r~# zUj|>WN7{6p5l4%zaCe|jd3#GzGEUZ}bE*A&@T!;D3D!#3{vBRHeCYw6YNGx}UEZ|% z3ENP6WaG5Z+-dP?ot3eyYR&D_v=>=k`r>9wN@GtNf{**BbTwMCXD>_BZ0c?nRJnF` zdShPfB$vdBxjC(y>LU=PUn^if87&2Q&FOwHe0e3+;~cLfcbGGzt<V|a&>2yDjX{R* zfoxbo=Q_i}(T{XmiQ}!c9a$`=V+w&96%&dh&P`~uW3>ymit}bf+GT1+rW!u6e#215 z$_LlO1GMOxv#UCet*e{3-uuj+_8Zy|?JaKR^|Nn%(3>rvvu8nS>%Qj~?_Bc2zSgvb zdpmC4&#KlPZMw1X==y55dk;P<OK(B;(;@pwl0RQv#o3++nhy3z*0ccxvUYWqBv*e| zKljN%n`k!L<;>5CQs|h2OmfP3i*>Dj`PLa28y$Fc%^&|bZ*WB+bj0$bbJg8)!|n@f z7OuOnYZ_A{hYMNJ%AvVkor5b2Wf~*B3m*Ky!vu-;#$jdBpr{lTLD)B8{?Uz^<PG3h z>%qW@?~gMpPh0oOZx27IR9Mrn1wKa0LtX9BaJnYZ{s6S&LEBlPbG?u=Ea1=AtL=Q~ zRecFbueG#-M0Ayl*6TMaE!IeRlk8>vlIT&$2GF|!WgCOCO_FeOdK?-7&ZEZOQTX@4 zL*8DrMu`Gt;WHv4CW;vD7j%NX$;m%1Voc|un}Zyk2d!bLF_Aq3>$6usxee>O#Ty?P zXgRd5!F8=`Zp*U5j-9iyzcgjuo;gu7XVeD5pm6?{#Jn)qmVFnNU$^XqTbtwCu5T@z zQxIIS=1B7mGY8jKnY<zbS>OWB|2Z_cZ@H`?5AsV>s1Z|tGM_JdfmMf;&0^|@Hig|i z-ws$G8W@lp2k3}yb+`2ovOme=Gtm3Hx(j7T@<r_->pgbM(_T%if9LC48u<#HhhAps zknm@)E<eC#41dk4FmBwnWVm|qV&zF8<0oz3DZc}c-V*I;Mxm{uEyD1l6lYtMvpNcv zu9B(UqUh3ufm8G^JsX)^xO7iL%l_qM#*Hj#`r_Q|1=Vq~x_kKj)|)#mv28o&lr1O> zj4WSN0RA!iz&T^PVOPPoT(Io{b%HO5uvKI)MqfGw0iyZ0$czu?QZWFw-M4=IPuNQb ztu{ICHaY#cwiq%wau0jX`cLaMp!)^rR)VfLBNCdQ_GNR&VqW9i6esVv2$F||^~%2) zKDDKbG%S-~9moD1;wQYwjPvav%^FzxxeO5V#I9(k&>456D@L7hx0Hnq4QQXXXulq~ zQ_hx~FAb<})@$S~m;S+NUqo5`h+q7CK@&(rjbqggykW-8v+6#Di}kV@O!;xS^$BIw z3K?F;w2%rZVlfr$+>UmTiFV+Pkz61aPQW5a(dJ7G&AC>KiHQs6a^oe0NwpXSj2|pz zvfR}V4AgDytxpSJxoaL6SoPqVTx`^dZoaO){krC8__wuO*WQ8SjF>#J@4_9kV`{qA z@2D8)yKu05_Q4nX<i=wgYwI>1o4#iH;HJ8|O~)F+-%6WBZ3ch-7-wR41tclK4FX#k z5HICQyvD@pyqdgC!u<7bhIh>@q@XS5_f48+u8drLZYz9T%C<haX3e>+Wo#Ww?%dPa zxvMjo;n(iYxw|`Y^y|dB-5VE$K2iOSv&+l_FZB=fzjRyc%-ddCF1HS?tE^f-ICIU+ zp$%1)8-`lJ`%|a`IVdNJ*nk~!lc81+xs1H=5kna6N02h=5*f+4{)$dOXmDN`_~NwQ z{~_uPvv+-FIF${pXM?2pqbufQu#BzN4J<dKXL@S-%oRD>M`RI1KNmam`u3tlb(x-; zkBf{GQS;jJN;>m{s86Hvwm_bhyie0Z#z0d;0rsQ3p*v9c`j&ulrLL@`AU`|P9PIBm z)zj#N9S#}T0gR|nc8j9j22L@df(&*mn0>c^@)Qe6FR!f&iC-|UwKyuOq;+0bV$;!$ z^@a^{&g@mWN&THgq1n~bYJw6LbT$`8v|Kk>*>ZYkn_<0D+H-9|^2+(e%p6;i67J{W zG$A0;Qa&pyYZi9Ay2iI&KdZPiKhPtoJ}0IiDa_ZyG%+wbqhfZ}%r#ZPQ8RbUt(u?b z>yaq@XcnRzx={`$$rlTh=(R@(oq8f(V|0fAwOh;GpyjHH8hPp0Y9u`Qne;qlHWlyt zO3;n8%T<OmIGUZ_Kp-|>3GwnG4A2D(hb(fxDp+%MRpx<kJEg0R&Tc;nPjtk{Pi$OS zR=Tn=5vydohrj7K(4CRdy?>4}W%!%2Wpyzzb<4^W8W%HZ5%^w<?>b5TML4bsY(t~r zIi2>%wGS3{p?!qW3`@mL81*gLuBEQiEZaYwKTkOey+OJt7Ie<y*A(J^B6OorMo<_M z6cJx%boX@k^x$>RI}^Tn^anQSC=>ozSpCFF?{~j9Y0@JrepvjeqI}l(<4P7Xy+T<x zytA@dS$b(exyQ|IxQ%~{+w|}Y{xU@Y&PJ$ua7}-tRkSV*wx>Ynafu5BjKL*XU%;C8 zYTfM29_^TRd=ERVE!r!eVZXP&V10zPu*>zb?$1Yi{nvoLlN3<oO98RQ2nEDRD4@w` zwblaH@9S^T;x}l?x5yLaZB}16i`_5(mdh93J6uO&hg(s&Gv;1Ao(i3>3MC`YCmh-% zL!!pE7~+{UeL5`{c%dkMKfFVJ#age_c6Bu?@AWhSUuGTZ@05MUzhS%|gYkaQ703HD zk-}6niXUS}lN#*4kQ3^<;8#_bATLzA8tNCRzf}Tr5;4P!$}J5rSulzXPRR>`Mb|Pd z&Cf4wnx&$&tQ?-DCbuA8zaTdQ%Xc+rM298@xha|8n@vO?p{loHt^?aD*?%zzFr-IV z6m`9}mHlywa%uh2J5ee>gADwj55j@x&GAOeG{KrUPhCtknOXH4ewp2Gt}Tj<t(=oq z&{v<RtXIlc-qu)s)8azQw2l~UNWObEJ7cbG>9k}vX9t87&ns-%(UBb6v|)O|nk93i zwMQT(eD`IvDI>mHgzv_9(HzF^E>1JekzW;hkhdv)a6m?ds4({N^3=Z8toYjbX=(GP zrGk;l<-2NXcP%ZBC}>Ksw3kO$uHIi)fBV`Rb-kL=vN$uNr!h5m&Op|3`8qb$(wLV$ zBg4-xqbaLlePc{?<26m`Gl~)>Pf94Ali$3hDJG_AOLJapc7T6YYhLLr*o260VM{AO z{UiSer^hEvaOQRdm@#O`Y4==M^V(|z)*~42ZnHkYKFDO(cT=2>Y9(^`@A5X%8cg~F z@~?nSEb<T2G4fBNDi}lgx|+V4VArF<ih{^dYK45n`g&5<mg44pOY(D<+&-&z=i+jg z)y^r^of##It0R*emljlQ%#o+d`AfAuAwd}nZ<#rJZ&!N!j1AK=nzI9AYL}E0byq}0 zV#q7~2|P?u?~u$A7O)?W4~35g`0%2&X3@tx^f@_+DkCf-#E{bMw&daM4Nm@*O>Obb zH!sZ0?Y*^S&XHvWm^cjm@wWF8+w1e(SWI1iMSgcxbWBaJdPgrS82Cv~XhygvBHztu z-oLn@bj?uv;#<GH51}a)-^8-GlH&CpnF!LER{$4OUQbXzV<0D9kGY&^HcBIF>n}FT z(bgbkp;~$Ar(9E`%1alyt{z0|%f~JrmnZ8=vJ%7H#M*!?&KbuNfWG|+F8Y``lf)Hr z;ztJUYq{g@e+bQ)7MIdi8XcO~IHxPM_Kpp;QDw7I<Lh$FB};Fqs@k;-;TT$%q@^vH znUT@DB%QA2<Y{x0$;C4X*W|f%NlK@sxg^=m%~I8#o!wEL9_k)3edEmRj!KK0TT00c z%k=dP(a{a-t-Eq(!BUvrnwQ_2>F1Z#D$h-C%nb0)Xv)ZFO!xCor)~}9_qOdv#fml* zj2%l(kH?1awJGxO)x8Gvyz%K>Sf&U0c9JPY&n7#u<e@Fqs^#u^Gj?@l=P$jjmG<Z| z)^Oyv`+eB^DRZd!;BsAC*jpPDUDMUUa#oyLQZqe&@t&rccPuZe-Fjwj=iWcvH5<;_ z+XK?76EaFSFUYYp_vhs;X-pzrSZDh|*{Xz$vANmnwmy#Za%`5i%RXJ%8eY*`QPGFP z&scaxAAVJa_j$#ZCMA``dU?f_CMA}}da{a|O>L>EZJTOttl2a>HFfr;8kf}8;)sai z*3_dG9PS-aJj+6IVhmGA`Mff9lrA(u7s}`RK4)c<<bxHnmk__x)ZZv~7}x!KTMg_z z${li2LvLPQUqh1IqxLmU?^XMkovDXzZb<X@PiwGLl~q){f>AoYT?QH42pQy|oks{g zNB(bmb#o{>*lwo6iYyipM>YE}*{MFf#1ibAkRKkFmlS~b9SOAyGP4)e#<Aw&+V-S| zzU<7NMvJ^y4z`p=Mii$6gl1Jm*0b|&=F~8=C3K3rIW;7$DJv)-Yer`Atf?OD^;ysa z0ogNi!_pC6GCVyjCNsnp`A1|A<&@&ZbsNU3mwmeo7`ciGA*RBPSv*DU5gwaRe<K~Y z!mquyPg|+7-OIJL%pA--W<B*(iR@$5*w$2%$#lqM6TTBUO81$@>OQ_y&1**_RNtZ$ zc2T=2D0oI<-onc0h|0dwjJY+*hTaM76*Ffu|J1UWjG9oko88#{nY&k5NhfBD7120~ zG_9n9Eo_V~jQ3#yK2#qtS;F_XDcD>LD;4aWLGHTVLm`aef$FG&WnSGN%+;Rr!~^$E z3|&%`*I5!4Rn=8cva~Liv8-h$diNGA@`S~yEGDWj!N)hDSP5*C_uUX{iLRKJm4&%0 zd~Hg~7M@yNq}`sMoRC<X5g3?S5)oCL=tq1pmJ9jc3b~Bcb;_;UzU2(QaB_?Mp*325 znj*rYMC^6T3=4d<bn*!=1!t_14;*=6`J<DeEovCeV@hYhs9vAaVJfUgV7V#^3>`qB zI1^VzAu3l-1p#tya;+%K%Sla+jtmNjC2JG>OKE?UUd{PF&&bICS_Q9SwYjBjEO~lg zR#snQicf5gIkz^pW`0J-{F=BK=CqQ~uo6p1NLoo)Xh~Yg)PRKC;E<dIfB(dskl@?| zf4QQ#&D&>wRd#cxzh7o^PI!KD_(bov;tZ(PfXqg1PIx*FaKoR7^e{Ip;;`Kzsc1Z* zspgOrv%9-F1u`d{_D|HE5J%ndpNu{;0&AF8(z)p#u<qL1I;l7I>HZ<7(C)(Ad1c`- zH9dvpiz_3r%-%cL>vntLd{6I$QaA!9`uZdkHLxAm#U^84Uv_raw1niAHRXj12m5o_ zOr{oKrDa-nNN{?2WMpwF3@cQ3O0fQZH(!6(eK)C-RPMGOlNa&TcB(JmsY{gGj5ni~ z^oF6bMeMW2`+P=0a~f=BRIzhfj|-8982m+{Ba*SS1D^s|JQYQ4g(je#o~qISC(f9u z(GhlCU<xzo9gkg~VS5jE`sGT`s5sy9#@uUs<B$VvHT8+bkttd6zGa5Q$SJ|zuCCs} zQ=$@$H$QdJoE1Z<At9O3-rmufSYn{GDP~_+9LmV7>UL$5;T2kqLK}8<hNX(eP!^n? zMLrp142NNUaQTX%;uD7SjO6eT_`9pOv1Bjp7we0bhImJIW)6VPPW2t-G2;W!`3azt z5PT*3yuJp){XN9Mh^+R?V{%+|S8i@sO`P1V%xP?xqb`t9DMQ24lTw0XQ`8dKH#R#g zBrVkv9FwXTeqw1rgU4ay<<&K1e-F)#!?@iqEoQPAzx;#!vSX+m<tS}X9ztx_tNBsT z4sMvQ<e_!zv_bX@UiQ1SZSo&5lJtc>b>@D%7&Fr}ly5oCr1eh>nB~IA{CIB`kWvzr zQ6K2zl@pen>K&0dHP$z;q#`W3FwWa=%8Us(jy66jC@VD)j_p*hdf`XlByGaFH>@vk z?3A4`<C4kTM3H+jC#B)6ncKcSB##K32!m|{mp{(SJzas*aqTKN7X-R`=6F(YhE4Aa zXM!FR&R1?teIG;==@zX<Ert(MzSJx&#@KC9TXj)(5RKi!XjdiW2pgxV9eIx&C6CY} zjwnsuW)>PHwzfN}9>N*WZ~GX?q!vFAp8~Tiwy@Nc2PSxiCi*|#h%oW9_MM*(b540^ zc5Q4(xO+gPXJePlik98hTvNtctdIImjVRABr?sxiuh_k+GNx)#4xFfyr}t!K_SC~z zl-SUdlhae5$dnHfR+mq$g^z^i)Pe-RaPJAsT(PXKcGIksh^oFaOKU}jhgWfeIWsBJ zJ^n!F)cS25sh-3B%7o~gnz*#uWbfd-)~wWugsJk5v{{8=VTH5Oa7tuJcz8*B29=HU z2z<CdR!Y&DjgL;Ca`&){<#K$*M?N1HSn+eE^a?Q*F`mTwjr@(_8MG;PYEw=y5P&8( zj4-ii&ezO8VLz_dwzKxwl;pU$<dj%Ck5PG>9e@^$2un`~Yp55G*uKK~Vm=uA86R~e z-k4*n6xt>qfxF8wz8NzM%mtarUY->@D%#dn1si=XEtt8o)PI8e6w|zrprnOIm#PQI z@8Kix_D950Frp^X{R*19^LyXFB1!rj_sN(iP)r2WRO<W`9+i@O<0&*MH;f|Gi7!?^ zcrXMbZPTDxn{H^kyspGL*Rs2t4z4aQUwyDidxs_GESZs-GGl2De!s0@g^R_{x}mLo zdrLHiz7%MnXl^04!&APc0j)({t(Iez+4v~@pddfYF1$Tpj(|A`4hf{0_*_=OJO&>8 zT&ZMaT+E+clIVVvWp2@K_|2rCh@>EQA9uwy(k)|pev;Q?+L^8F=u58V_^imu5pD*L z6tz6Hwk=vaE!SGpG>^cN>_{x;^%zVEHFHzhF6#!gxJN_FGDB5)A&$z0d>(^*THu#Q z=X*oXg`ojcnOx5P*nP`(afF#!>{@oL7tt`nO6KHl*}(iGH+cEDsw{r`@>2MT_)Op4 zo|@RYxk3B2yx-byc!*iL?pT=9H>=#seE*HK9oxq{zX;p0%a>F~L15w4{WaAqYNLd_ z-UD9`bKf)AU|eXNN%j|RprgeH3aAMG6j+VKY6hLGMpJF>0nJ#LtUN`hr2cc4^>=dB zZ6cB)j}4h-rH)aS&cZJ;+wdgnp&9uO@|mR9Y3>9%qBP7SYxr6ACS00QQ+p!Z<2Dvn zT{9b}d20``%!J6u#Kg!*#N`_Pp|B;*+udoFyJy(6jcxLAcF>%h6lzYyNix!V_-28T zyk1cE$ydn3oT(UT;r#LkJ<RX1#*Kjt)0LFezHoe}h=0ddd&FR4my$-2S78YR-FKiQ zzt#QaoN3)R)68u;wAS?@LbeUD*W6k8@Shi}4_&|V%)ibrM*i=x9a3kgU&0%!8Tqd% z%SxbfN0<rHreYdwu~0R{>4oHjMG6w<w(u&-k1-^FW_Q}q&X1;dx6dAx&zvX89;ta1 zQN@eO!g6|cHLW)!)-NgPKH6hJ*HAWav@NJ0$Ko00TUcHZviWB_s}a_{WXH?fn)WR% zaC6s&qAIgvoO?@_O^chFP|l1~a)PJEgm}c&b>}v2Y>q2mRu|o{@9nL5yDsi1c6Rfg zJj)}%!+F*{e>sx5_b+D`Q0!f8cVc&>Yb&}iZx%~dnwYBeU|#0EkpE%$s;5XL$a8+G zzlrkf9j2RRd4F+v>hB2PPgR1PQ|LMsVsKXvv0q2eU%DoL_RyNr(9(s)sg2n|Ma%Y0 zpMBfn9GP}a^cH1dbe7oAm*-x(8Wm>NhRUeMx-uWdr`!6Au<RJGjNUuumJZA*^O#yT zt0#NTfko;0OApK}TV5X*S+lsja#?M3w;WkJ&{)%76Tv3?hI=xbXczY(539Jpz46hc zV3c*lh(Qzvr}iz#IR9N(FuWO+6dzhgMzJp=mz7klZi<g;+&b$zmXo}vbH<9&z;*Ep zj;*M?rVn<yb1TlQ$|+cRVqwXqk{dijVrOh<sNd9*(8F#hXiD!oFlRVk`32TNO2Z0U z)3xP!%a1SYKCvv@8#5IqeF@(3V0TE7&K6CKaGQ+TMGAw_RG)bSU>qr9q)0Olgn)rV z3+gS_`}r!OzDXlw91c=zfyg%tlpAUOLEAC@J*}euNQP!1E|EAmB|JKmFWUY`DcYyu z5aRct^KuJ&s-hz5uW6}fQzO>aS1v3JSR31ZYj?roIZYAT`_I0T)q7xe-atA;7*@KV zC}T!WP$$cY%ZqQmrXKNm|I&55KL;_+W3|Vf?%vya)0`APe`FGSGRxKHl%0m>(Vq?R z{tQp)AMT<3(7*jbZc|>DpT#|5_(-zt=g^be(DvP>Fj}#u=mR8MtQ{Fe2)jHH$;nBG zS(3s+&B0S~+A-d6!}P@&MseYuhW?IQgvdc2wjx^b$FH}ChuOScA0L`7%hL~iyvymk z&(}P>HXp|CwGXfP{5$#KZuzjh_>r%7?A`J8BYm>`u=O#y<M1oX_Ah<;P={=V_rd=Y zJTi=xBsB}V*(@!10%Kh)cB0l&aL5qseuO-k5h6923To}E)RjE^EVg3#qqdohbaJc% zPhZG(py0#`>ZVZL!m#I_wrL@PA-D3Q%d(q%@DtvFa3D0x8?}$KpS`9H)na{Ud2dB_ z@2v8v>tB6!JquU=tZnVx#4`I1FF-K=N2^vf#D*8OrdgfUKX*S2$9Aa``4~Wbm`tM` zM8nh<wGg63<xz7{9mL87F$6n}lM_PuawD~HS)~<g<<_s)Xc|WHT9WFeC4a4y3_q)s zbhG1qecF6{<6g9LS3?78Tvbsy;wC6l;QJ!iOkggO%PPb^LX##h4DA1dqc`RS682-^ z^X-^GmK(?$CX8w!$%6-g;9Hx7Uk1KTea+?WkVL{a{mRqXK5aR?W-qab!j{z3zKAJt zn?%?6hd*dPX9<P|?aKw)-@CP!3ujoSx|-VE-Khs=+1<=}0rR4^LvfV1nWC_NHVo>@ zB$e3iXVb9nKxXIIH1djd;6ylZ2BfvDR>!Fwg+np91f642@m1&~IdD!&hgqvmr*#ya zDGr=oX`-MbkL72%1LuU~%2pB`;H(@)=XE;{d&Bl6D<T}_94pdsHfz<0UHl?&B9M2Z zv@T*87!*Bhm@v3*c@6Rj=kmcIjLT;==Lc90`3M}6kH8s_3b=d-$1Wd%L-G+g$FQZC z<UF1Z<z3+P+TIs9Bl7+N_?gK0A(KCq*WPh-1P<{da0aBdar_7z;z!^dLtMVG{0JQ4 zN8t3@z8lBSo!}?lL}i-H`8g@=<Yh|vvX|*5w2cN+9&lh6;yj;W3#crBvp_EkfkXTV zoB?Syo2TQ<8->&0z&VBpaaX2O=D<0Lb6=L~be4{yLv>z!t5<RnbRcItKZD>o*<=O| zEfJEOA7zz#c~$Ck1WvF6XF%G_%5|LbQ8;N1oMTeeRp?A~;Pgr!0tfuqzf}u4cbS5K z1Is7)8IWePGW}a+`nS%2=NQ8ufl~?`qg3+nL`2S$+1ZIeKsy%cpE=S8Ho~`)(p^TT z|I?9vtl~=Vf1{_Hq?726rwR&Fi3QRX;v4TeX!N>s8uBO}5cb2);|UMgmC<s~CXe93 zc(X`H6s<SD6YcO$v{kcOkLTFKMQt^6d|SO8`OoC}uN3(|J(_=!PWcz<1FJ^oU!+t1 zMf$P)E4@#76Y0H9qw_{Sou!8FkbblH{zZ}wA{UZ$ARCcR@}qPr!$Y*QjW9gz^5ZyI ztGClQw(v?cK60e@Ch~OI{targ-iEJ{KAnH#q_my9Y3UnY_HSGVIaM3}0Gvj_=g<Ty z19o<T;8Udk-jP1g>nzfpN2dS7k$%i_rT2*kqEGeY7S02{FouVB95i}uoQ7=Y;brhR z$?yr%TLq816_E=?@F3Dj4kCS^m5Fo;W&&A@bSevxek}A#@4xCu@BN0S%V%}^b%-&! z*+BGRv_pLxSU;M+NT>Hjdavu~_j$i+{1?(if7p+`zcsoZssW3a+saRYBid`f+h{q9 zzB$1`V+j4+GM&b<Q8d1C&=~TF7iASs2(r|rEmU`5>=Ob$%8H7^Fd*}X<zNzqAvo|8 zn~|}Cf*1zM0tyC_#}C`Myw$r{#>gbpjF&^){UV~=ow)ZM*1Rb&-BibjgijI`a(~7j z`9AhbpU~1YGfRjI$@20JthGcGCiw-YS43{K{&L#}_UmWaAHO%8{nvD_)SQxtX!vz{ zx;A_GPK_^!iL5Hg^<g`;#fG!Pjj~2Ii8J6o0d~$xoG&oDsCAkmo17AuWXfR%DHoYR z2FS@s;b9e>Ow5VAczKMDN`6eDa6F>%KA$ZW8|$j8uo-4n^{m4DEG(`^L`S(GR}o`o z`TE+g-HqRyX7%1z%y<M%f72aP{kxo8<lv_HEAs2Eo1fXV>s;3tFmf&{%IRxNmEozi z>fp?o2bUK!4_6j^B_Wk-CkhAV)p-57VgHKK=(3K<AypBPMM?hg(^po^+1?nrF@H{B zNKjUzg_W;vNsga&{VeO>GWt^|UQw1g^H@lBL(<ninH}XR^_hWG=Qg8V)tacEr7;ib zpzXY$rT*I9&)x|fvw_+_=~}|s2LDN}Lr4Q~Jum1`Uo7Yxlcw=Ll<3&|P(g?E1ko`{ z$Lgq!LlfzGM$qtf&^RvnU4_Q;4jRXOuSBEKK?B~8Y_Z-iF4o(K;Dg$t;A7CwL-64N z1jyuJ=*)$Dd=km?J7{~Gwdn1vMW=zj-mur`EJaG#8GxN<z4E(wlaFC+HXVnL@pzk$ z;&l3Lzu;}2WMXggqK~0AFZz&v)95xY#);JC1&txw2fWP_4SSmxG^ouB8bdB4+B~=t zG-L;j<DfBiY$s^E;Gl8bWkg?x`OIr*cj3?*5fb8Qxna&ka~gPKIw5CHeA>s4F5*)s z87I`hGmfT#yyX@1Q&D`OFx>4^I~>1yMXh1?XaAXXi~QM=@h!qXF+a?@OKG)+$lK-f z)(3mXSM;#bf-E1y**@z>q%UsQZh((&J)&}!NjDWu4)BK;bu3dQ9Q(+Rf~PYUW8mE= zD<*lqGZtAX6cM6v@D*RgE0xL}^Ri-E(~Gp@!U%&frgN|O3WZJf&&kHA5(U|1Ib}%+ z(UHF1Q`{%INLehy1+JhX9K2W$!;ypft_E6o8!r`F9#zPHh)0LtyYl=E)r{3{KijqR z?v=T0_?IlJ`_@^DPG;AI%*r$uqy~-FvpI<qy~C=n>ByTPKOiT}Snt_<>kG@`R=;{% zOa0ErdaAu!j;^g_bye93)qY;d+1P<QQvasU$LhQ?oVnnJhDoK@F35A#B^tYn`Z#F& zkhcx0kM_19>e3}gT^gJ~qZ;(~G^zoOH8kEZk*<j0?c$hJKCYb~*BY^XfOJJQaG)!) zM~^84jS>fqA!!QRuDA2;dixVJzI4zSGR6r$;zsg8`bO|^95iVDFj8j;8l-OoAIFVj z_|Qr*cA_~Wr@{6i8nq^9Xxd0Vj0^2F*s=5+!AFkZ<2dw90@uOtHidpYhKPe>+vhIe z_?hZJqekG^maw@xuXFY9&{%IGpL>b<*-2^BxVe`YbCO)enDZn&twV(N3n4PpCvZAk zZwWg6wr|JjEkWmkPRA(qCydsif)~<Tg2s^T`*C_p(D>0oV<<U8aFRisFzE&8oQYiL zAZGFu=o=4iLlHI;Oat<G5NQRcM{xtFZazUXb$92=Mra%Rj*Iav3mr8U`rXYhD7D%F zwoLoz%KAo|$rflshO<jAMJ~RIx>>CL8oK5a@LP&Cz%Z;6RTPzu(2~y1dVC_7$N2ul zLL8=p1>y0EGBF;fi3n9mvDU-^SXXC#<jM=y7TF5z)~jS<2ir1w;c+<ms<~0RF0V-1 z>w}5<4^fuKQI=!t=W?{^4@}{}i5K;g-NG{U`kATM&&RPI{)5pAI7jq)elJDbpb<c{ zz3#oL?W7pIz)2t+w5J?fiJ)UE(dm4MIK<6H2{_XPj_pUAKF_w<=h?KUCENG|a1!~q z25kP!U+2ePr^D-?X$f%Z1rEkO`*fUrI?l(?L)n}kP6z2(Hk>O@I>JWNXlgH?XiaJ< z=ZDh)&L-O=9cPlA4)HUBPA_K0Khbf1Vy6R~>x>G<6oO7K;&c2{$NA@#=}5<=MC(a` zV?8;74*0Rtk&d%Q>o0YjU+Oq_;#=`1vIz-0&49G%iZ&r{KJKHrBj!AFM~wQA?>ixz zc%COt1Nkl+Cz}_5<IU&keEtcX;&C{F7wS_4FM~F1T%SVv#M?k)Ho?o_KS%2u1Eo`( zMoOnRjT#)*z@xAuO~!L!+v$g$jr1njn(TU0%x}*DN6dfwH7B8;oggd+4eDzIjUm_| zsjnd#_P$2YpuR@X7(!d&eV*Re2tL{zG)}=bM12j}C>Q8u!f6<(oe3JJR`R~aF$aDV zdF(ckeJM?^ul3x%M11J=p7j7Hm6utwD6^{3W%ee@qnno*r-AYa<mCYx_WI0Xu@0Zg z%ZzBC4cd0v+(iAcx#_$LUNRiK4B9?t4Z2Jk1P()Kf)^??!OP(9Mwi)5&>6FNzX!($ zKCf6eZtn36aN>A=T6CPP<K`ZM4vi-SonunTxPDyFp?;6(U_4Pvvb{X_xJfHROib#> zi3aRRC4bj*OhI#m&FLAfQjOzs5j57N|4YaDmjmY}Eq??Z(q9X;e+Vq?AG++G(TYaU zA)J}oB^~FIjwA9!^B9q*K}4z?JC6~0BKZn_27O1%w-fwgodfCcdEvTrnoZU@mi6!4 z3mmLd0B5F-^Wiw0PHoy{I<OC{gNmoNwNR_4y+MeL`jC)W*l3%`y?D<-8{_766gw5~ z@%0x|s+})sP;wflduaV64ri^{`Rc{!p-q%n8y7a{U=9YGYz*jR67R4ponVb3f2>i@ zpRoIoZA;jFPF{mJ9#rn6nC&!-e{<02#~5&|9aYdEIf4fA-~YA9zxY1cjm7teBrmi- zF@EeB^?jN<i|-G87bd<RHsbrHJ_n5xps|E#KrbvANyA9GTF^N0T@=xf&qiIQk#8z+ z&^RUS7-ui0JP7?MXq=ii!ajwu)}VHanvAiQMVeFOf*suQ6j+34RhrJI4?xr!MZw&T zP9KIn1#=<@oF+<$4(ng!OLr2RI~I%1A$LWZMY2SARYoN6jolvDAu)bDlaU!}<bD&_ zK&5+9c&G>*5nkGvM-Hf?Cp8(d#!05W(`!qZyi#F_Gq*H0Zf;3{1Mk`4i0YjK9YLN+ z8Tp~3rZSc}F|2;aBMX&}h9hckSyEKA<d#|mGeqM2WsKXB5W^bhofT!p`60G>qA!d_ z6CeOYxslWw>=9P@`rP>3<M_Auh$srdNvFY#H-m}OO5}8S-O%zmTpum&>csJ5G<Y+I z8!{f=FdGY+>*TFFcAhq~4dX|f;T6R>J}251<*Yc_i|s6nPMzMgSYel5=IshvKt00s zX*O>U$FS}+cAQoKoMYT3O#xG(2XlBmV0JqvN*3!17SyF&okj$!(Cc)CULS?6lWeKN z)_JV-N;D=oX!P3tB50sa+i7gYcfxsJmdC#{Agvg;R&pC~YPij{L&w>P(&DXGgs4XQ z<#de0_?Dn^9J*xex{RPh{X5YyO2>mo^DB6vzD&><#2A74GMWeKeHq1r1~1<`Xbgso z?mwUb)B}7xb*;|p16-$3-(0K9EeUP#gn`x@uIGFVtf2J<#j)PfZ@XXJY@&JMHl4-| z>?ZJ`fW}Qajq7ZyG2i?haCQnBjWkvP4KY@+!AMH644{)w5DoUa_OuOS9vZ9I`UQ>u z21i;5IwN#Dd;RlY35nQ#MO1iwgXK%@qO}P&$ayK*69Zl_&yN8L%0{F!NBY1l(pyN^ z^_EDV>PSBpcBS`Gk97JcH(JE|mJ##~SU=Izd%xxH%cH+v>qtNGmud9Ae0JK1_l<Yk z)7cwu1yH(jHbA6r)v73l1=2A?r!j%I-b>qfFU@7}E@a@xWq?sEaD)udzvwa$=_CV@ zE@XgoT?QhZWFXRo492|A^C;3q9-;en`k%o+=<hVfVm}ezKRseLk1`PH829Mu1FH}x zhWfuCkw>0xoa9J9mVc%9(SPdi_d4-(`7BurK>s4X|D%!0=nTG3eek2u_xuY~N?b;K zpFEe*eS*h_N0+lmCmD(KfsLc<iAX0IiS%O?S9+g#pmgG4i1UD&Hkt=6M?s_4eRN&n z`;<A4X9bTBQ2OO^5b4CDNFP|o`(Q^oige;pq#rA}!u$ODBE5GKPj{3f-<ykomXYi+ z{{4ZD(e!y+G5iwgqOJ9RgLp&KmLf$th_>YHNFVx3wMeg~Qb7C~^l`MK`Ks$aSnn|! zR@qm7RHlc2=RMy4Y2D{m_P*EnelEyT7O_@D!#RgQI1~hDd@mPKS&Vg`IEs;Dbwh+4 z((~Axh!D%jpJ<B%Ge*ltq?7zb`mvzV^5^M>PaWyUzq&%Y(Z`WK_;rdX{}dr#cxkEA zc{=G;qcr#ir9=LDI&a6kd_+4H<%9a8myc-YR6ZhIln>IWe2_o!KJh2gkN;%^f9Unz zMfp*Dm<S0cFO9G)Aqu^d(KO#-hrgmx2~JG^E9*OtCbM&V;c@Hx`4K^8#upv8zT0EZ z*z?8ZCh|4-{b;%JSTaT`w^LlM$HGVC8}EyBlAA~$`o3C}i!L{w&dXJ#AOC*L`&v20 zs?p!4xmKP{(t9$Ang+gc4m#{x&cj`ThpN#ugpS0#oa;c+FSldI2-gm=M1p7tJ^Pl9 zgE@jJP+$a#@)a~-v(okGkV}zBFCq$vA)_tiF=Qg7?4pdzwoVDd893py`E*>~|9?xT z9&twd?#gAWZMYnX<|;+Y1JpS3`@SPT$6ZGE8;D<nxL;JRcSEMIX|oxykUKOgm)Xad zA0qAyaPA=-l#QFsNiQ23&X8QmMpwz({b^1Ic06fB%ja~y&>ASt4Crti(8<ARk-|pj zqSN_;=#0SW#R-#S!@(F&v)gdS;7G@9?;u1g$FaKWbVPqgdPwwl1JbSI__?S}qZl)G z9PqPrT)qSy(l<m0`Xpv_yWo8u*C(RC>USHh??s<T?Lwpvc~HB6KGNF-rRN$$^mLPS z3S&-^KSn<>logWgQ;<mxm+b?bhk-<rENJLslcyk8#9#ppN=NzFG%i;fOWNfsXiz=` zjlow(>qX+j!oTsL_(s==(gP17o$855KbAbAmQXtUE)a9Yk-jcbUtO{B)fJu(L4$Y@ zGzM*>Ww{XJxXWW%s%K?3MXw*^-a)e9<6W+&ge_xmcr*>sztb3l`ft(!N5+kFI1Vo} z(Z}~sq%ynQ2M8KeW+HuPGL_loK0u_?cvYmIm`vkUjP>;KDy3)gG8H_WlD3LAWiM0c zk>|BLc)XPqicy28IkJeFLsN4Ka|PZpQFqMa$)5v8%@mrR$MNYoPGG;{^jzP0Gb%ER zyn236W}NTnxp`{z1kVXq4%f2z;Uv$bv|RJ3iFtB6f*V~ShzrUj7WMNi*C7aeK{^DH zO-IxYUiM<#MD<6En~p_|zyJ-N&c|IMz4xy?-7)TZ6yHeT_49H5jRCZj5jB*5gX8c% zhHx-{%pLs=L4)d_NFU4_U3a?hjcrD<<%L1qCh0!y9ZuJR=QkRgB&?+_qWs-w{R@hR z*9gb_HUv2Pj5B}}tK)o%(HzI&COoRUZopZ=apH8Gi{o(oF!x+&Yy_PYPtJq&L*l_k z<Br$(^V~(^`CiVO7oM->&!5!sf6kx34LVWAe&pqOE{pr0|2efJ<(%#3T&)m4Jio9z z8Y#cH{~2h_;P>JD{x#ggmjLNlLq_^m$35oXxW@=i-=BsWfcqD4k99!c3%&I!?rDw4 zNNYq$NAIEL^7|xykC6snmoU<L0@Atd9kyK~+3#_WoFo1{y^k&Rxaamreh)h-?rV|W z#qVJQ!Tl24WB&l~aqu<nIX|X<?+43in4m9oJIa-8AUhBreWx)NIOn)5@B5zS*rZ)A z&#{j{-Yv!$;5;pGCV!}Ft`8mZKCjJJy*Qm`1&(R_TwRnKt-XnIyYDYA>U3Uo&>?$r zC@)(`81?-A2gaA}`y?BjwQQ7jb6M~;3)sYsv}OU>T-4?%HlDuPA-fKKkCuq^?RbAa zzn{(TIbVjS9enkE!|m?!Iok-kJMqPF1Yf-$jmHsdCnQVo0p9Op<7FxGM=}s}?)!AS z3})h6*YP#VHw2wY<8gTX<>in1i*|b@zigC*8qMuN)F+Y8RQG5bH(ENk@nfG-sgzM< z!OmcW6s1#fMLaQi#G!NwHj67kN?lPwPIkH_IMCO}a|)eEh~t3uh+;et%gEhWSBfb1 zX>ev$)68f~-$KOtXxx5k#+=jF)+rmDGG=e6&R;h-w|w!n+38EW5dUMw^`~dfdu;bC zWrK5Z_l{{r8yDoUZcAfPN@UO^w<t?-Q&&Ozu6Zf>{e$x=*EA=YOS{UdyDO61-C{CI zXZ97%+cP&QYw7Xs`VEaSA*DTzHpAOc9546(rVTAeSxEdHEI6R<==&Y9cjDLlp6dbQ zw<u5O0WRZKY+~T!HO3uF@s2;**fXXC;C#e!hH$3BG971`-uM3}eZ|X?^MSGi&9VCH zK9n^gn&TV465p`>IBp$atd1J1<HqVJd`S)B-$d_%Z;sVjn;{$8t6(I5JEV`*VGVeH z3x6Md64IC8exwfLe%ZX;mhyD&v%~Kz`TaA%ccZb4^cC`iomSdtzvHp({zaTA7th~s zlJJ7WeeB?O6-PF83Z{Xxn)s>aOzOAC$P0!O1bnpg6Q7wB8WP~|?KRQGXn=cGoQaOy zq%D>DnTm8G!RTsEyA9>_dCQv9VcMu#eaDP-XV>KBt~tAQ_TiN!>VT5kw7j_UhUTcK z<{KJm|LwHxo$0ghxX_0~Ht(37-Ltznzqc;7Zqs06Y}3$28VNy8+_ug2Q#-#OtFMG_ z)4Pxh<OI2l_4$4Yatk!Pjr7lX`as$bx}N=El%Az^L?f-+;hQwaf!_%3Ye(E)-KYBk z{3uE|KA6V)Z{hu&hKu;-*W#P<-}G<(&GAiPv!`_^<crGFEli9e^mQn3g0%yx!(#2A z#CGph)(*%ATdW<F{A9EpUC^L)DnVmF8W^qfz-s}%bBx>c1&x8_BSt((7c{7E6*PM7 z`(m(mK*M0lub@G`)`CW_f%D<;)rJ(YhJm?{-uIT+Ze>?q!=Stfd6YajDldqXULvoC zPlpk!&G;tUua+o@{9dJdS+@Pdv=QrNkt#-Cl1X(_Q3~LVd|dvDvm}L&3+8p}Xg>qS z_+meU{Y*^guwIVO^#boFFm~ZOY}q)OA(!eJz6Op~jj|iq<Sb}9Lm>EOmv)@DZQ)yP zl<sn)ykMrM`>vlsdJO8D-LL$vi=)zQ_du64aQ`%nk1)@B(|QJDZBF4BuR!>Q=<}$4 zL~%Y#Y~%Mm2|Z{A&aZTw1LM|WMEjvVDWd(9jM<YR^bWNzp?6A-j$eo02zkuqy6p)r z!yT~kEaYwWb$*|Q^v_M`=g}LGOz%~{Vo}s0P={!0OXU;~oY{O{FqO&=I8X9-=WE4k zFZTn0#$`r!@gH~TZRsv93VQb_*34_vY2fiof#ZHg$2sG`*{oHJ+)KtTO84qG_d0Oy z1kQ*(EbQWx@i@FL^StJA{$^vWx0C1fJiq7tC{K^$_mr<8-rs$|^FD;A0Au?*ci`O5 zb^8~@zclpjXx%=RChs3PO^oLu&;Rwl1FEC=<~BZN5;U%~kMBS272<1bJg?XCye6UE zp5S`)dVVkJDE0NCj{aYKr8_~h(TFuVhJF!wMJr{&C^_=e3D)b*lfap-Hb6HV<=^G^ z2CB2Tr#>Ne^gbX_CZy9une<}eoUhA{&}pJfXdEocr1$OdW8C=|%k**`O?8vTox{S< z1$68_L`Q93W1W)vA6_@5URPRUgbjfVHYkVtP!4A9?;zS}zwNK%{2fFaybCl$8|=R{ zzCYn~OteQ$(CM}PZJf`6phI~Qbb5!!=SlcQkzV1t2l5`j_l}P>4DSG^QOI}9-k|j; z4?Y%R9=trrH#nE-1;f-8dFJV+NhnjK^D=c}I8X9n1#+v>%ap%kfDb*rLuL3mSpgJ> zkHt37EHy=ghu`b6|A8%}77ZE;bsBqtlg|0Pq|@MQ#18*0J{IMEwI6XB{ZiOCzgp2x zldnlT^b+jIlf<}0jAN+|iFbSL`!h$>A@T0j_aF%xWeysruorS{Jrp#^rwHGNtWHVW zupfxmAZ{undA^J~G?BMuj9hp<{LMHzCxGL|=WIU+S(J`1`_sTl=X8Fn(-D59R4(?u z{x0CeaXSALbXF1_V2qd_E`g2k73hUXnxDh>?;Z9WFZb<uz6rWAQo>x5KNoXS^4r02 zI%vNY94`fU!sit83XXR>e_o8|Tlo9m=+D>k=Uv*Hm-}1v9cK(?{`?G{JNj9Au6`=; zk%w)jC&7o%eW%r5uujq`Sl92=>kij_#<jo^dgrwIE5u3T)>v9WaL_qmdeBaX9YLF; z@*~}3mlx4FWL&1xF|s579IcC{b6&9KEqGyv;cH30vqZ!0JKGEzF~%+jjl;4^oXGqj zI9-<?G5zSEaY&jpjt22@-1xYI#vw%W9ZO@I=?4dmgSKy2hRz3f|HgNOOfJ(n_}3o= zhV4f#5~_>5EV$1LWGh8s+=6}PsFS=*2pckX$cD<tK>Il%V<}R?epbSyQWBEZ_r;37 z>J0~PKg0O1S?8^JRC($9QZY{WnL@sIkdX%vbQx`PBK^qAoE?SEzecBV%_ti59V&Ap zJ8H}pG_pt1$am0q0=l|dr$J_Z%D<2i`M(GnPyB=XuFASUh~DpN4jOOS-r+uSRNi(U zIYHwY2aUJhcN2V&v!_GG)UP5hkTLK7$H;h@ogXe^=uut9*nc=$#<UL+G+)zx$!&o4 zzWR*%1!8CNkuqOepuF9#U8KD`phaUvD$@jR*Tf2i!}clqd}>>w&p)jm<86z4ckFG8 zk2!hU5_C?h?~H3(f=-fy&Pi$hxV;l%?D~y^A6f^bkrVitO4%o#iB3CjqnsbK(Wl4h zMxwKqw^8B;ZS=d*ZPW)e!cEjh1&zbDmwEf5zQ*20>p&xuw^2dk@V`d4FXCe%Z=-_7 zA=@v<(I7tV;B8dUIOIH@MmTSyg2qAH6TFQQANDpXWJ_&S&^Y+T_%_PRnzvEVL7sT5 z11e8m=I*ox$J;0g(!Q?5%bvGY(51GT&)X`m0d9myZI%3<s3t(}e9X#qEXo12PpeOk zs|V<<)KcSC@Orb3^CP(7b&gL9sQg|)y(C++eXqkA1CD$jQ!hUO4$apiX}(VRFyJIb zQ4bt-ca!$2+Q8=#Vq9~^5NM+v>SW#J(IoJ#>$D4MHLu?^t|2;}HtO97hg&~^BgRK> z;#-2wY4treAaK|KRXU=Ba;!G40gj+^T74NO#qoMco=m)65}kdf3wAoFm)~E}|NI8y zQk@R!<sV1;pVxy%gXt*;jl&p!&erwOY@L@9&dVYPjl<uKnrrg>9C9MNIL{9|gniIs zX;6N48y|DfIK)RFm*=xwCfHYNr*Y8s6`wPcPP6;k37K4`aqxf04g(C^WjhQnBfbv} zyr3rV_z}DusH~<?Iq-2cIpFa^vzHm)mj+o=y|my!a=ql-sa{TiAovTH?bkH^e8WVx z={tBiW1l~pu9x9-U2dy^b3dQsAJlPf=6>#=NV9xihJsGKgHDO<B5Ts=G>xJIe=UjV zz#r{-UWSf6wt@zY$ptT`)gKv+V=1rpaV+PB*C)ZtY4!7Q^-0j7I2M8q_K~p;oleIn zUcT0Op*7P7#_juGuf3_hfw35;!^cu$4QMsm#{KGjj(5)(T*kGHLA(o}W#D9@ET|M< zi$NK^jOUa1xUE$@SO37D)3`6$^svB3shw6oVza<A>7Q9T&)nCW>t?*maULHRlL2%L z)!b%tNH42d<7_sdWANqku*19@2HM8k0R<hJ`v^KEwmqV+06+FIi=abuOF^e(FCRzS zHH1B1;D`D^LFcsk#5mo@=@{qfbhv(m#JKJ=+3T0!hx$N4=cKf8TpuX-`B2co{N&^& zh!`>-)Lt`G8)zIN-aTWOVzUa_+N^fjYHu2RX)T}f!pFxL_v77K=u=v6v)k*=Anf8; zom+=EOPhI_ih0Qy!^bv0|AHj!^%mL~cE8JXPOFGHqnB^1&I6y{@bVROPOHBhSH6M{ z&GmA5`JTjH9cr&sPweeg%#)~{2|6b+_aCvd0Qr;o{)7ug31bZlGa=A#w3n(nIopFw zN5JDwMd$?sc266P2%6>W%-4Ca_t?pawd*H-=rP}7u8xdQRrH2%O-HCL5&Z4HrcUv@ z{uk7XVkD!%hzM2=-Y>H~h7-h(ga3b00tK-0hzWCdqYaG|N6YRLFAVxqy(xGV9SVvQ z4q@Pj#ot{7RrFFXJh#G-eRubgJC|f+EV*-8r9J(jrcx#1aM^;_C4?bGtTJag+h z(mJ*@gsFeN<h{Fo#+<{i^m#3P<#79~23CT2U&9v~Ph4B?mr@=lPfV!E2x_?YL?hK# z+hmo>hVS2(qS)&!P|ihrFGh`AEp)$}i#o$q`D*;YJMU>H)aR+5()ttZq!;B-F*g?8 z^Smy<r5#WY@p?+Oc;K*q*=R(Bx+7*SpmSUsRM+wP9!u>2IKSfWK7;4W_`Bcf&)??H zJMrAHj|VYuE-pYa=&Z!^)g1qOJizmA@q7uMKfvjW`S3+~GRNPJ=L<N#m=9lMFY@Ov z<9Q#)#|Vk@^9Fx@0?!3Mn8Wkuf*-;cV<bDiy93{i)3@VK;m@B1el(|#RV|{U{m7rc zgy(@AA8RH2`Jedncs&1v<9{HY(*ZWfuRES!;P|kS5xyM3pT}aJzTJSa4a*lYmxgQ) zLgqA%dQflop;{gCg1H34>H(FDw9EF8j`NU?Lt{ukZWpKleT2TneLVJs(3y;g8;JOD z3cP1jv{&ZLL~Id*!KW5`dU@mXmT@8@oy8bRQRAY`ZZ1Z|jYE7<5hOPZ!GJ~VI%YqQ zF--2!-ePlGZ|}$9m3OpiF+ct3dS;<V`HSo06YBf&mEw~up=DFU^i8daN^$pr1KNI^ zTOXV^Gb?juo*8iit>7^O>k$8z$Ep8`M|&XOEASX4&&L5QaXqKk7Z<NT-J^BB{q{N* zM33q>wI(ICZl0$0Xm7KuzJv4T9$u28_H_UL_nKn8oh8f|s3>325YI@K|BvvAAUKdG z>MC?OV(J<lu>rAUskXsw3X<d@b*Y3A&BA2#M+u9lgd#ehyh?j<{n@k1Vyi35lP_5F z<qO^N&Ti{(BxXY^r}}<1+Neq6Xj9Zd9^Q{)4$Aq~jbDAG%(8}A*^inF`>~sS+N0eB z`7+4|v|j?>p5#j~1p#pw?OK9klZj4aGEtqE5N(ih;4Gp7dwPgWAR8`5p_uIzls?8! zn3BDpT6^*0S{9=H&!|AbYDf1s-*jtF$U{~hESS*>yxI$W>M7ym=_#%ZF@#{-RAglp zLJ=blu~BB!&G}%<zJx%MbfO^ro8m-m#B@2XBR;L4E~p*e@Z577SiJU&ZS2XzTA=K8 zL=L-2>sCMP{@KsEt##M3gIbn#5A?!)+IjV`ef?d6eS+5CkzZH2$o5<4a_YBxNSBjB z_^r_8&)}UK?d#j<1+c!&-$=q6G$Z9RddCY8G1uGY)%{#AL2q;HY+wuBPGkv()8#q} zI^02VG|oNv_E}CRNylj&N9PXU+{WpAtK;O3!$|=S;u2sC!uuoSw|pE<F>tQsbYR2e z{6vn%LEYiw9n>9HiN~p@b7wEtd;_mDdd(D(q<O6m!|`V5wW*rmkFxnod4;T9`nfju z7Pg(;aHBT&r*g3Mw{mc|5;y!u#c%k1$PnMs*RLcu38$n?KoCr-r>g1$R{%wk+7OCU z@}_p+hl9gBsfO@2W)RUg>1+JNHj8rTi)(Ds|7aCk*wVx#*1JWkd|lPL*wJp~!{Img z>`~H&qxtuipk9jDuSrGmlbDKO3+-#faZtK0HzLl})LI&CAyPKZDnp$_#80Y~Vfasf zE@$%a1$N&qZM(K@H@ok*ztsA7v*m2%Zf)65<#X05c{^g(oa;s$@BMPWmCm@;eFqRl z_TPNl=fC{+txvKW_h`qp<9pf8Pd?E0?qv;Z`aW&X!|WfL6MIXuuzz&3kF^SRUJFM( z<bGpVqcoD=82tSH2XaW_bp>)k|M$8!q>&u~Z9}u$5t`)()dM&Oqmtcd+aO6ZEJY9@ zwtHf&TYeDrLqWt;ej2Gb+YS3c;ge3TNjTv&9OFBFG9BXKDkB2k%X`+Z-<22@os=9E zmB=1dtp7R`mXd<4o{2=8_YG3<?{Av>{M^ZTKS&dt=&AJLckVp--R+OIUs_{*-?RrO zro(F=eX{t6_na13QKg)ZTw3#wRi-_hlAcHxoL7$Zc>W7l`mMf&HT<`ve89tic)(8e zEv)mu#Wn+G;{F_99e!_9FG_zvS`dDF<Jl14BftW{d_XhcUBK-Cyvykw1wNk3<Ogs! z;6cEXfR6#WfG)t#0CxP>@cTW$8o+VD3xMT-R{`|SJ%Bp_n*bjI76aY{+yv+Z3<72W zS^!G`wScYQ_eB8ZmA?N2-~s%83D+}#R{%tl-n|`pd>mK%w?Dz}3jq2S{cZygPuBrJ zlVrepaD4`FFW_YWeYXIx9Z(0j4LCKBL7KQyzU9eyPV(3RAQ`0NSun1Bz{$Y171u;u z{{|qMkRi#Ot-|kPxFTPy5kRuL2>3JJpNf0Ph}{7Q!!vr9XjuR$fX@M$0OGqJ@Em~h zk_4Cu7y#Jw6^`GO-<tv8NqQfU4WMUKA4ukuH-CH!-<D1Q)&o`p1_8t~$q{9ZBmUlE z^?-7bZz=<J5@`o;^#Z&p#|)p7W2_Ch;*e%*lN@tt4SrjJUxIYJD<=Z~SpdnE${x?8 z!vN5dHUJs`8v#oJB-7^svjJNGM*!;p=K+-Ww*mQpX8@i0^?F<>|Aa%&Zvzk=lFLs3 z5r9xYG5~x_A%L3zr2yiA+Rl7Hynek8SCTp8!|ON61MP~xLwPw3AQ^50kjzPzHvoPL zcnLs!xdV;@h@ZCr#Q>Bozo%y_0rc*#03?4ZE6NAS=q|w1fW3gtfNu3I8`TGrJJmDF z8|8=SEC)0JP);2GAzZ1RP(8jCK=~vY6Mt0yNS3bwz6Ma4uK}b1S^!l5;*-jVc$*Gr z1FQwmH+}-3yc~cIItTbGl-)Ie-$;^%Sq?8(YHL(Z7XZ%!-Uqw^_#NQqfNa1l0F`eS zpbtR#rm`pg3IW6e$sGA(PPoPbD8GLO5Dlsyln0VC=@hCXXrr7i)g#D@*M}@zX8;}p zQ2X%#qyy}7A-O}BNOJ&$NBNZgmq2CT3_#r@y#QY*(T=~xbs3-^K=~!Pqb%9|z(XD} zJm9imL-<XAGGM*{lJm8I{eWu#Wq|JhB%@xyVL%?B2tcx=vfcuCUH^SAuB!p@fWHBD z0nP&61$+!Zon)tQrF?b(z%$8|l>+hsbPpbw1yBNBgK%E~_yn*O@D_k*eE^_3bq??u z;7I_{{{nCZa1n4jfa>{E`tOCfJ`Y#~hy@UzB%4R^E%3r7;`h%0RQA+%{s8!seoyq? z22LFSbp~hiy~Q9K77ai>B^}Lj0rZS;z&p;jdW%^BXuEP0uDbyw!&?B40FWm}*N*@z z08~c?0FMFQ1CZS4`i^>mw_SRdbi<c;uN+s2_o-jney(zmyz#6PKxII6`)aTmX;gnl z!V9<`33uXt(-mM4&qhKm?n&NP1ENFaFcOe&UY_<VefPR60F}c?fLyt*qkPf##$Gq$ z8GY|+*N1Ud*dWp=-^9;<x~>7valqBCl(q{%{8L{3-E}$A9|yb&_z*yKmELh&!5hCf z+{>?&5282rYQQrp7n0Z5>zk+-J$O#nSpAxe>rH@X{)?-<?$DLm%DsS2^#^_(#BVB# z|MuDf+yVgA4=OjhQv1E_3Rlu0NdV|7%9l+Oz<H>^v#SBoBV8~ONEeI*yB@e5&qo63 zfssIZVB~j*_DHbnosr+7-#3f_yFMDp1O2w^Co1DFMgZ|=hmrh|&a%VE=k%M(hF~QB zBY#ubQ+^1b+Z@nkNRcdn5P+NdTglImVtW@?FW^A8@%BXekJ<(0o$5E$L8`O&0H`if zo%;|#b%e@v34n0u_YMH{h3JboJ*so>15l<skA%A&K;NP?dQMjwC($>b1yEfjdIZ#F zNdM9I{Q=b8i9f<4{QCgJ*Z<eqw*W+STn*ou*<D`CLquc5nAKHda3RaG%fk>O`#?m3 zsGvZMVTBb|mxs%uNQ_Zqj3LG-;u{qe0TJ;oq9}RPrpDSdO|7-oTAQXeO|7-oTAQZU z+V9L`VNH{-|Nn`1&zYGs=QU@}y?6HBS*j=1s|yaQ+sklJ{iee~Wzt+h{pOQ-25@Q% zjZ3NzZTk=o+WsqXd=DTUb4rs3$E0t7)MjXB_d5+iJ7IepHpl5XnCVpjkm?Nb|4sGu z>Fm?xC8(o5Gs2;R!w$zTIH>+qKgz!l4(bcqK1kq#r;j%~2R{XElt1N7ZKv@@4_`kY zZ|XB@rw{saNG;UWz~O_d0Dl_}>UXg5Kj2xYYlfp8juto;!9jhw8;*E5(%|^Ip1yJp zwB`OU?LNBy27UH^8yp5QsP5m^PW?*9+XsEV_&Ur68Z#VUulJRy&pdGaH%NU${r3M0 zX&g{H9)^DeKJ?&ogvKhJ2k*f_$A2*#zA^EQl@GoTZ6Ctniw&ADM#Dk<Kp<BC#SbYA z;4dIQ41*&U+73(a!Fz=7!MlN5;YouuSmP>`7Qu?lPFM-arRxIlewF{fM5zN=(KUP$ ze?}t6WKu<%NFTXK?kdy@mtvjbvNA`xM)|oaN99r759kPZH{g80^}w*eae*6xP6yo% zE)0G*L<)%unH_RE<hnXiovB`;Zcu-uz8#tq+8Bnzvct}VeGxu7d~&!aye0gj@Gm2V zM;IbzN7O|$MsyAuKj?g<F7o2w<iRVVj8UtjP7jG3l09V2(BVVZ4!!uuf=9j@wsP3* zM<+hI=h4%TemQ*H@CCyghJP{qL3D0(d-TN-lSVW@Htw;7k8K<|d8GUCu*drzzwr1S z%@WN9&E-*Hqc)7jqlb@f9R2?2YuXXoWbImQqgK{_ti3tLHKu#arLnWeembt?iQ!MI zf8zZ3%<(6mjCyk7lbtcTnEaS^F&8I{obayheC)#5J+Tks*2Ud;D*LGm`UriMzCquk zzZQ?<=f-c1ziLn$vJF*+21AqKvf*CB$OL18JE1ONd%_u`-k4)tX>2xLG9{YoOqUYZ zB&m}0N!`i%<n<{y#hubM@%^WhpWgcPt<>z){i#=<8Tm~8GuI~NKf7YGYVz7NUE0R9 zyXFk@MsuG<Vac>?u&S*FtIOJHy=;rJO}5qAPN%EWv(x*gluhZ$h|6fq=+3w|b<)(+ zQ@_X@nmIFbMP_T}+05(H(x+8T>zH;aOP!UQ)tq(hxs2!TW?Qp+rVpRKV*2@<kvUm8 zoil=G%$qrJR^Y5jvzE+yH&>B6H@7=4DsTDh$l0xPBImg0T+E-Ff32XsaB|`O=g-aU zeqr(p=jY9x_t}e@7i(WU`Qn8aZ`kMBZ_H1fe`WrIVtuivxUWPiF_+Yqbd_9n1UqIs znim)r+%GkjmX%&BOD|hpcHilCo^;+{n6Yr{!Uv0T7oAyjWzlU{va6|FSKeANqGChE zgUSV!=d0qX)>hqEoV9rS;?Lc4zxA)o?QySlx4J)Z-*Vrp4y=x<&Zu@*%hjJ%->kmx z`NVUlW<*U~ji=`9lEkGkOPgvnweH$aYVR$Zv~2b=_p%MkTI+D#u)2wLxph@9;g=@8 z)bY~Amu@W&T&`c9xjge_{mb<)f3jlOiu@JpSG2D<yW;jM>Q_=<X?f+|%G8w$S2nD? zvugM%>#Dj{t*bs*b$j*D)eBaic{S|Sb+5L+`uUo`HIvp<tZ7{H{%iQPp|8z+t?RW5 zYopdKSi55F-Pf(JuY0}e^|R|ntjk%qaoyE*ci-rG<6gbG-d(@7{?q!e-W>Pl+&Ay8 zAF<xNe&Kre`nvV+zZLw}?6=mwb^5KF8&n%sZn*Zg{_P8IUwQl5+c!3*Zrrf(&ZaS& zR&Hw8)UxTsrgNLFY`VGWK|@5t=muj$dP9E0!iMDy8ycD$x*N_kTxz)9aBs7E^T^Hm z&F0Oyn-^?evU%<1t()67pWJ+I^To|yZ2q!Q)i|_qTw`KmMq_?sSz}#eedEr?j>dNz zKW@C*c(d{T7WI}9TXb6{ZOPtJw54jx`K`5E>$f&-?b`bO*7I9G+j?gk-WIiO+_vOx z8QTiCE!?(z+xl(Sw{P6Oe|z`#Gutn2|6==>I|6qM+Yz&4;*P8x^LAA2SiPfhN6U^A zJI?MLxwC#})6TA)r*~f1`T5Q-cLnYmzDu`j(yp9c^LKf6t=+YCSNpEMT_5kdy6gI` zdriSjBbszglbW)dikhmLRyQ>^wKkn-I@ffi>1NaY-C?^myA8XoyJzoSu)B75{qC*1 zTX%QwKC}DM?(4h1+7rBI=$`R=lJ{ipDcs}QvwY9Jz4P`~?OnOIVekIEJ$ujYy}b9v z-h0jJ<`K<t&6ApQnv0s<&1;&sHn%pPXg=F~srifMFZZeT4cj+<U-G_;efj&!_SNoN zw{QEtj(vUmKH7I>-_3pZ_pA4h*st54x<70G-2JZoAMd}q|K|St2h;~f9MBy|J&<*v z{lLis=MG#xaQ(o&mf)5VExMM}md2KrmJ==KTCTL*Y<X}n;^63m#)H;_xd%%QE;+dN z;P!*<2TvY6cks%=8wc;Vs#{04#<fmr&2BAfJ==P@^?K`9ZNY8B+hW=h+cMe;+gxq6 zZEM;#w(W20XzOn4Yx|(>qqYleSK6+%-DtbhcCQ_`2e(JIk7-YA&uA}fceSr*-`Kvr zy}7-;U2Z?w{!#nY_FIRfLy?EZ97;UYd8p^m*+ZWkx^(FJp?e*;Be)~7V|a(I!`PA9 zVeQE3$nBWhQPSb+@N_KiSkuwi(bUm$SUMbdIO4G8u;K8;!{);?4;LPG9bSHT!{I%L z<-?~BUpRd2@ZC;Dr@Aw$Q`4#MOzzC=EbLs^S=YI~b5Ez-dAjpL=atTDop+B&M<S1m zIg)rJ<4Det{3At2+(%X)sXx+mr1Qx8M?N`n>By%?Zg)vtkzK>PV!Behvb&19s=8Kp zHFmXjo$UIk>q^(Pt{YwVkE)N3JQ{a&^3klL^Nv;=U3s+OXv@(PN6#I-a`cO%caGkZ zRdOV34i+P)%Gq*}TqUoT8{`(bM?NcGmT!5nH_AK4o9IpV=6lP$b>4b!v$w~4)_d7| z!+XCwtXtD<=r(ufc9(Q7>0aBty}P6PO!w99TgRkhk;ldyOFWiwtnirY*otEtjx`^X zk9~0L!m-bfec2Py6VsF0ligF)Q`NJ&r?IEC=VZ^Bo=ZK~dTt$;jz=CJb3E~Q#__`A zuH!3?Z#>>~yz6-1@sE#xdi?eYd?M<^xD$7K!+JHnhTciNnZ2`n=l53h*7dIKZRp+8 z+tGWX_k-R~dav}}?0s-jbu#~C=PBt_+^M;znoeCgb+<39Pt#}Uv-ZvIE9<N4ll!i} zGwz*|cU<qRc&DEI_0n$^6ocTYrlHcC^ylDVf8io&DO@`IDr6gcBSOEy2$%XOrU(Lj z9vmEp_gSIDaSY$BtrR$ceI_>uTmdxi3S0@-C7%jhC25dB-~m!5Jmtsv1i{Y3O#%;* zqF}!pUaywMAs?SmX)d}Z>cga5JW1dY(oozW@Ig{AZigqdE8(|*mq~8PDV4&THy%j? zJ0j@eddURX6lkr4dY9yY(o}eDw-_|nz_pYM{xs6e{$ACr<bZeF9l&b|e3k&^Oz1ry z4i6j}={fkUU|3dvznMT;D%AitJM{CHH}P9~Pwdz4zjL3>w5bMZR5G<J4s4@;De!9$ zCU~}Mz*>rX;BNtFQo}SZgMJl&X<&!)CE$@bDFOB#@t5keC>DOe+vh+3c7L0l;2RC_ zrc&GhOF*}BX7wVds|2|Z`#bI-Z}@vA4o0C8`dVPT=(xe}qQR$~S;(c+G4Mb=wVG;H z46-WN*pz^j8o;S^H`ApIFgl`Dz@Zp8($d3ybWrono}}^Ofu0j#xBI7HM$o@F;4{E0 z4s>wC2tNfQ?5{^P)MP<KS>X3qvZYz@87oHToBcQ7UvbU;?}cE)H~fQn3fm~KCwG+a zY$8102;Uh7OCgdPp1BBvc^U!V#YV!fU`N4os6*i~gkkWz@57~Nc)Im5X{7Wx*g6Vk zq*fXOZ`ISM@5jTK$G|)6I?yl<w5D^z0FhvX_(_DPPLm;)CPE~o!tbt6lAe_&gD=fs zmlbSEhcV0mD>LEVBMag`Tbd5JV+O>~ESTwe;MF;>J52%Hmpl*qlD+`B;zh_Tc6j4z zjr1Daxom|u$k#%qcoX(VJ|wkB_3%u^tMGlo9r!NcEqJ<j9XyHjsq`0k8>2(|n{-$D z5}vQ!DBYGe!CT;ONX_sb;Yn$qbPFk^pTj!_@JmS2HR-qT;8L(8OI{QrwIVeNMPVo$ zMW8{jzrb(c&9bZTF8XKiM&GYdBpQsO&=52fz7`*b9)<7YqtOWT7#fKlM;bH=jfQW= z$H30=W6?PD1R9T?L@{Ur(xF%shn|vlAw7ym2Kc((h)gIEC81=Lf+nJ;Q7U={O+wG2 z$*^^>8Cl?-%ZAd?6qJFcqD(XmWx?A!+4QSzGy}~<vrsO|L$lEwl#dEfA$lIoMK7Rv z=tWe7>}WnJMkUCB7QoXUWypyZqD9Ds%25S;EnkHeBR8r>9#n&tprxo5EkkwaCA1v9 zj8>pm&`Pulo>O=gtwFD$wdi%U4!wcu;WrD`qqooo^fuavHlYTz88xCUXe-)=wxb<r zC)$OY&~CH`?M2OKAKH%&pcZrxwW2oEjt-#?bQpD_Bd7}<MKbcDZgdRwpyTKS>V+pz zPN6>Z4tf{8hu%luL8sAo(Ff>z=nVQ0okibA=g<$}8N?r=kI|3ddB7h_-O@31UOE9g zW}iVnfnOj$E`11huOGm#DPDkk+q2U9(s!hH(NEDu^fPn`{Ty9JzksI_*P~yetLRtg zQ}~`~JM2)kL;ACHP-=iD+uLC8q(*pO<rMl1{RUk_zeS&;-=Qzi@6mPi2Xq7d5#2<8 zLbuSL(QWh>bO-$v-9>+cAC&kz`U?F6-9!IG_tC%50|c9c!_RBM_x`Y3i4v=D01m`K zI2eauH4epLI2=ddK{yf*#!+|(9*Q5q!|<bcIF806@MCx+ejID?C_EZ#@fbW7kHb&k z@%Tv`gC}4ej>U2KDXhowQYSXx1nCdhh)p;Vo*Msw^nIxd&L+h;31<EeAy1u?K9YVc zeGGdad;;0?r||pUKaq|?uDK*#lzs-8?2pny$T^E3Q@W%IoD7+0F=Qq;<UyL>mq4zn zmFnQ!_mcFov|M^cS^?+hRq&o_A5Os&@zXdJKLcmZe@PGUvv@L2!)EE<@Z5+6Td@tN z<0&`;PsN#d8qUJc;cPq|=SW{k|G+cwOgszc;ygSX&%yb)02kut@m%}@o`+w=Mc9t# z<6>Nb9e4pQ#bwxu7ve?Oh0AdTu7n3@7GpQA#vWXQm%wji*WzWk4!?w#<CpOY{0d%) zSK-ytKc)NlRlEjv9Q+-A4X?$o<8}BAT#w(x>+xH71AZHC#G7yf-i#aZ7Q7X2!`tEa zhj-##(mS{b@5X!ZUg-<z_qZAF!~5|8+=36{R@{c$@gdxS593bwp`b2&6wBC)yYVsH zgOB4AxEEGNPT@ZM4t^KE2fwZS9ef&p7k_}ihtJ>-@mc(Rd=CEre}sRCKgK`8pWq+k z^Y|zD0{$t!h<}DJ;h*En_!syJ{w2POe}zBAzs8^8-{5QbxA=4XJNyOyJ-&|rfN$VG z;+yzS_!j;%zK#Ea@8G}UyZCSTOZ<2I75)dlhyRK1<A31?7&dSt@N^y_u&tSrs7L?_ zBtayYgb+0eC1E5SR&fTANHUm2ks)L#d4vojkCNdenv5Wi!CpF#6Ak=0-DsjEW5`%C zjyyrelP5_GnLu<Tmc)^#h@Qj~1A&KGh>0YUB$7;0$VBoqNrlH<CXr`hjVO(niG^5+ zjii$)B!f&PnPeKtBF~X*GM(g*8Du7zMRG|VnN8-9d{RIP$@63`d4bF$FOni+C-X@$ zDIpHBfRvIl;v@^nBH|+Dq=Hn!3e;laCe_44YRD3@l+==Cq>j8qmXnvs3i1kBNmh~7 z<W;hUyhhfN*U38a2B{}+lJ(>*vVpu!Hj+)Gfovv?WDD6!wvp{*2iZw>!MfINvWM&? z&14_hPY#e4a*(u=HquTGkq&a0bdn>aiyS2~@se(GjP#J><OJy@C&?*T5qpQcOWq^z zlkbqz<h$ep@;!2fd`Qlc?~`-n2jnC2L-H~C5&4Atn4Bj+As5I`VGZqP<P!NgxlDdR zu8?1ntK?VYQ}S!_8Tk#lMt(~^C%+?Kkl&N*<PYQq`6IbW{zPt(Ka<<!FXRsSE4fSl zM!qC}Cts0&kbC5x<UaWqc|iWHkQ7LP6-1#>C>1J2fFe*4qzG1oz<OP%B1{nuJ8}$C zL@EX=q7*|EL#4mNuaFE=JPMC+X6I#Psmkre?#ha=Du>%ySyJq%@HpI#5=F**yBkl< z#Lk84MWt?sqrzpcC~+1OTSX~xRFo=Rl@+Dc%IRg5?h0ik`^;mXHS{x}royQ=BqS-T zi_4bUc_}?1sMKv=;wY{xpC4o|uJLfp<8+lUOi@-@xrmV_=+gsBDn0WZuF9oKPh~}A zb!dqbl&W@Cvr>?~qSE7VIh=Oo6nlBOU1@c=Ja%PnnZsjOW!cN;m)LQ>6X!UUvz(>n zc9K)(BstYirQKCkW>?GyDrG6_S3>&*II60hV2z><8VGIlP(})8C2(_bZnaM0E~`{k zQ+Dx628hRA6Hvpuk}8k@sIs!$QOeCtu*P#+tOfxS88qs785RRYIYq!U0nGxYa~RM0 z7~=(fyx<d`B-)b&6#WbdylfD320>>KbOs^MAmkZ*{VbxNRY047LXQNYM}p8lLC8rE zdL;;X2|`|ike49jBnUYPLQaB^lOXsT1z)4!XB7O5f}c_FGYb8Ug0E5VH445)!PhAC zHwykH!QUkKn*<+|;A0YeOoBd9&+ShXb|(sZ6Gi_-lV}%uCJH?hg`SCmf1==@DEKD| zJrjkVi9*jrAva0rnIz;T33*9EUXtLSB={!@{z-y=lHi{t_$LYeNrHc}uq#>El`P~X z3wg;xUb2vvEbL1ba+8JJWWhIC@J$hXQv}}>!6!xVNfCOb2))t-eVU+86ZC0<K269? z6Mjt-^3#NTv!FK%db4OZ``U$H%tEeN$h8PNEuz0g@VAKmRsn57Kbz1mUGPiiem3cO zyGhJvlb-W6iFs|(bG=M@Zih+F<(TxGze&&aH0e2ClitUd>ub_;eNB4qXOo`$*%Z&@ z8uVN~K&Br+HjV(99srqr0GS>DnH~U{9srph0GS>DnH~Vmp*0mH4tI5NC7cH4yFwS& zK(ci^mOz!GgvPu<ZxB3_j6oIEHSEOUR=AvQyQ<1jO>?KM#$Cxs<AwP6c&=7_d}5HJ z+T$#@dmJS}l@$($v$V`pruLM<DTd?KAq$*Ke7L$A1XuVP;M7rWw-?iM6y=_7OJ`0= zPfuq~185DZbGR$xs>_S30z69rsi_)V>~t5`lrL~OYWvSMkpp$~tV2&peq{ZpDZje@ z6IR%K>WhAoL4G>9;f&#NsM45tm6-zz2UZSj9HetFg@X(ZrgD(U!88uCICzeOY!0S# zFoT1c9L(Y%mxDYGW^*uygM1DOI4EQwl-c9+LLdwYs}5w|12+b<p<#7F3o2{e0)rvq zbk)vUh6J;b;wT$0PFUgeG2{bNQx(8O)Kqat_WLzR$f>Cc<YFkoq(B!Yq^2rJ$N)@; z03t2{5V(q|u7<0YAh)xkl<^HJu~$3om9<Vg7uG-iA;rtwPM6DB>~R)H_;Bh2mt%oP z?O&lRjkCKvVJ^G76t0hGtOAwNNh_5u`pG=zs;DU!4xp$ihZ!GGT*e7!GV*EkQ{jwr zdK51BV19ramEA)dLha=+k*eV$i<W|?INarc&v#Xa51@=|s82mMaO@<cPqV75V7}d> zC<6y5a_NT$K7!NweGzQ$M+4IMC0~G@Lsc4MrLuF5X_cigM2iCK9EMm1CQC^10L~=G zi}V$*H-iRtxQ<knFc4r9G8{sNjmvN_5Nw0%J3f(v9sOv4O-OcdsIqa64hBM|49E^C z9l*IB2A+=N4e{zJep6Ci>Q@NK80ZyJHh`<9vcOO|83>pvG>0TbFN{@Fx#mvpovA`c zCx^jP`_&K09AFu;Z~#|N^V301lZ`Kl!Nn@Q4u-2t3e;JCO=_24L6yZF;bK6M1tJwL z_)ul@{uR7`wqF-@g<nCH&HGnyM^@OYDyu#2%BnI)z;t13r7(6nH@1?2(CKA0FqPaj z<t}@TC$!SPq?*ZPySeO{e&W<_zk+Hem+j_Y7VlNfK*+2CFNIVO;A}_@@%&6_i05ZY zLp(oI8shnxGCt9urneaY`E28b1XV7V<l!KXk8KSf+dN@zjW9Qln_I(xGLKFXWexod z&GR=lw8p;_kSAiGhQp9K1FDBC^}`GN@MQzIs*pROj)CC9{s;=L>qi69Y^*iF?%=MP zUhT41mvOw(59jlqc_7f{DPu?wO#loFNn>X!fwSHWk4PI(M>H}AF+42Ice}-kJc%$g zd?25&a;T-)Q38q7&PpLRKVe*bRv%&eny@h2Ljppk`t_UYr{vVH_nZ1~zw7~>L#F%j znC{18`qy}bOdseJHvM6Kd44?d{CMPjjYnAC!~F^dXw@ROa)<E5%5b$vtGvN7&?CYx zzj8_z$a;Pm0oj*kRo;tdSWYDJD{tV*mEqw7sZ|j2AQglI+#>w)DQ}#@W&!WTbTH^y zVUT}DWi=6gnUweCDU|mW2~;%rF%`L!HG~f&PF9Za%bu)akbm0bym-3gt^UbUv<}!7 zL{lWM<tdW)@lTMVb)b)0q(a`n^B}_`AIgHfnI}Jn5AsiaqIH042v2ydKEf~Ev5L@H z4^5w01KkGY`lV3Ll&3Y0^Q6XbwMc2AVZhtLESs_F$cK`d=;jv|5q=4bwMO`5E>;m% z@NmTQ491$m2l5vyhZGK&5u8SsT-c(G+Q!#PSOGE>uML_?ubJr*54hh+Pq(~~=SLho zovx~|`ayJ2#-|CZQ8Eb%Gu(9q2nmWpC=igKpv;xi>{V5E{9Fyru7R^1lR;*dRgzp- zzY$`HrOc_O#6H&HqQO@VW=lt0HL+a83V|SrAwg6zhDC`rAzxQksa!;r2&m-Z+3798 zY{3;Z1TGQP{zip=t-D(EVQkc*krjg3ViQ9dLnFTv)EmW}s8QU38pR!`QQUzV#T}?o zoKKB<afdAKG>!ZYQ*VqHD+B!24a(w9Tbz%L@uFY6xU-HID+2LiML=AV84cnN+93ED z#GN<4i_{wv#GQ76;GZDw;1dKtqi8n@K1Oi|Zxr+<QEw9UCSSc+K`@Cse3Q7dHwnE> zHq{)K@KsAWn8T8?YAFLjb9^HhwA6>G3OM014$7Ss^y;k|mM<$xf*iHQuv!RL?EHc> zooj92>ksiZZVf=@op>9+e+S64k5BilTZwfAqqzS!nuPTx;pHSzP7+op2`iI?l_|o? z6ye1*v2Kwj)`!xBSJT8OSp+|e;Aat|WD)IF(Jt0Ajbc61XcgYJiqW(RuUmyaR-uno z$hQi8tU?c~7zL}a%PRD;3b{6+hfT<_2{|?)$0p?1gdCf&+a~1Lgj}1DXA|;lLY_^? zvk7@(yo~9>59vaFx{#kP<fjYy=|Wz*kjIxG^u~0~-y~+ENz5V>pGEODzU~E(kGn06 z$$>JH1CYr9$m9TIb^>H}0%URlGPwYmodB7g0GXWtnH~U{odB7g@isFXPk=(cS;#jF z`Fvds+J$_xkZ%_9`8pf43;AXt-z?<&;+?Oz0iBR<7V>$##oKti0TlB2x*U{+{T3nL zBINURI%pU6TZDXzkZ%$4Ey8|_u-_u&^LUQ8@puL(?C0?eWnn*$XDAE#Jf5K}?C0x) zP!{red_!5t=Wz{XA)m)Jl!g6#T`}Iq*A)Q@`+1y0S=i6x9LmCe9_LUN_VYN0vap}W zIh2L{JkFsk?B{VFZ{u+eP}tAo8p^`nbRjQY*vsP_+Ed`po-Q%a^k&fe(n$&vuQ#SJ z^Yum^&H%-<;o%5nJ}rzq-1J5sZUC7$fJ~g;$cGW2n66wMm{y`aMbM{+G7m54FQzdM zL%lIs$V(P{5}BJpPahQer7-tEz387T>`4~(@Gt{?L_H5HD2skPOrh+vL!?VSy+Ch4 z$5$%#CjNDfK`&0GV%Zi}b5rOuJg}t>>{kFg6#YN^qt6&QB-kqqp2>r~jUE)yT>zA4 zU|%=boAALjwkLoejZ#)jgnGM=O8Ft9V`bpf&rA8~!`z@ez|SBVWJ#xyrM!Gwfkrd! zq!cz|nyi{tm@gZn<?#hY3pDk4`7$1BKLuN_O2x(6`O%|B$x?wVS+v$}u+LItj+K#4 z))Xy>m9b7!qLEMM$ck}=-Q!WP#a3*a`F#E;?WpMbe2tuwlRrwHToA31lPQ*5P@wU0 zB72EE9;!r1BkO6qo>HF9$=84q^>&RMoReP!H5%F$OtD0YB^E^&!Dd|1GMZ3Opp~VZ zd`Ce+tW0zon?_cQwSz)ROHRJ5)S6|L)(q+w$fzh*R_L^#m!`z4oNw097A~BA%8DXe zu}oq{LA^y&uc-&#UcGWGm^CB6C@0!Jvmjqv0Iic}<wH|6HA+a1m6bX<z%rp59@Jv4 zQ9)5_)`E+*X1k2%FOXp?LR2IxV`Ak1orWq2w}dAZ(tIERH76GpP?91mQ!-H39S|Z} zZ049z{mu^3J?#8o&IL^X6+rc|MH*YZ)=me4c}j|=-jp@bprlVrnT*xitz1ONw{(}s zKriUrZ<>E6HH{gqxjQ77*z!k3YeyBtjEa>*b+8GgO)jxpW92X%7@*O}YD*@y3lOcj zKn|s)nNSLaQmh;fY$BLTG~j_^P+JbO6lv;<G;$a?Emn@uP0P*qDoU&cW8_eWwl-EC zq?<M)f7&cw89fT>2ebM}omUFC<mG$A!!0tho8|BcG)N(I&0aPA2!#(B4TX^)V{`Jo zG;+aN=6V=jDmG@67P|THXx>h{K<v}j0<dHX=s%?h2JxYx`j!FoO4490xY!~~le%FC z78VVIb&^-Yw%mL<Tx-_Y<PZqTU@gR(SyKe!k4Hq%U7F11`XX<nYJyxdA$l~pDGF>G zJRw#dqVpmOhk~Ced_?CZ6b{pQ6%;<I^C~GEuJfuWjMjMrC>){l22%K#&KpGGlR8bD zj9!S9V;HhHR-V8RcdR^8C&{4`{tr4n4myqm-Wt%6!cm|jg`+`73bmjkg=0WR3de$u z6pjNODSQHSq;NdwNTE)rNo7+YRtK($DAHJ9e2VCJ+5yTs8gFqrId*~^3p42{2;wOa zZQnSRwDx2zO=JHn1%y(ptnVKlG*o^n#;Zg_Z26Fe=pe-Vd*(lz4LXg9>6-v_$o8Kz z8WP1fsz>Xkp*`#bVV$H+_8QO-u*eAZgTmj~r3eDso*XNiba9WQ#>$ERjTC~g7|4@g zNTi`-HF26Lbn=2Lr`Fd`(N2M6kq>Dd(jv_0M1+P!f&661GDBg4z<)*}2U#XK>f^K; zO=>;xN*QR@#Bm<70(b(IMlPcBee#U_V^~8p(Z}#OGQ7Y{b6_B3Q;-J|wdpYXU^E|| zN-*!y1fJ}%rKm(J6N|kB(h#=TqX91}fVuniK6X$E60<hlo*b<O3F%-L044?aeS;8C zgeFS`BmnTe5&{ZR``0u9j&|rgmMH<BaHgSIZa@}9#6;=?4M<mx6F$(Uf@_{;)p8(A zaE&HiJB13Pqm{~BMhy@im2&grG^ucIq#BD#U^d`#)mSJ^g{J<qFCVD?46Y)r7#Ywp zR(?ikVDSx25j{PB-9+C|PSR;Lanx(+keE{o;=FMv3MSyQ{nap<1J#rJs~NSg>q9hY zIyrfQujL`8W}Tcep&nw021`9m%l{Az!xAUQfqV;d7Y#t4cWH2GVOGS!B;h(*A!$Gk z?~hcUz5hKFr+iaj{9mGv`i<t7RBdwfD8KO@RUmY<QD^v^nojK>MLkbd6n6BRJOxZ1 z!Y3!3?O`4cj+2cr7c;)4ek$Z#6g5~j0Zpb(P69BEdd&uY)uh8|&F7~q9Sui$8o2d2 zUAH7z0m%jgQDnNV8?l-kKv>NTN@IhjnUsbivnUNkaw!c(@+eIjAhRhAMdnZ%isVxo ziWE>93m}D*h9b{X8j8%NG!%J((xd}2kJ3=&MM^`FB1%IMJEbuLGM~~=q?poBq=eE? z#G#WX_PcojEy$Cgx|Cth0#?T2392VU!Kss<?x$Wz3ygXZ!zi_jVU)C7C#Uw4R?q?? ztz;M_tzsA@U96Lz=_hs50wb+v7$x;EjFQ&qjs+>O@8ZckK@N1tWK2%2@01fONpLZK zZYEr)pbe0j`Q>+&S5ldeOH&daS4c4wpB(%gnh5XdM!_S3q9R+es`RSIl&m7y{NCV| zVW)#mD<{LYVL?C=W_}M&HIvyNt09urI|i+r0hgZZ^1Y<Q>K#W*eSs_Ct)I#3isAYT kNZ5Y2!P!!3;P}9y0Sa}@N%Zg6WW`%>MzMO8C00rLAIn4BrT_o{ literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/ttf/RobotoMono-LightItalic.ttf b/js/assets/fonts/RobotoMono/ttf/RobotoMono-LightItalic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..f25bed56adba942784c953710324ef0bba7577fa GIT binary patch literal 127568 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 S@U+vk1U*V}wK+H0F#aDz?)hl| literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/ttf/RobotoMono-Medium.ttf b/js/assets/fonts/RobotoMono/ttf/RobotoMono-Medium.ttf new file mode 100755 index 0000000000000000000000000000000000000000..88ff0c15a56bd3275b7938d7e7bedc56f71ccb8f GIT binary patch literal 114696 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 X>Nnjgo_>|>cs*v6Xwf+lwXFXI7~z9_ literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/ttf/RobotoMono-MediumItalic.ttf b/js/assets/fonts/RobotoMono/ttf/RobotoMono-MediumItalic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..307efad8fcaa533cdc695b8f1aae696ba662431e GIT binary patch literal 123640 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/ttf/RobotoMono-Regular.ttf b/js/assets/fonts/RobotoMono/ttf/RobotoMono-Regular.ttf new file mode 100755 index 0000000000000000000000000000000000000000..b158a334eb372a9ab2ecd4f2566e60d561e71a9f GIT binary patch literal 114624 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%0Do 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 XTlKno*elmsw(D_33Fqx&VZ-=8+OJe% literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/ttf/RobotoMono-Thin.ttf b/js/assets/fonts/RobotoMono/ttf/RobotoMono-Thin.ttf new file mode 100755 index 0000000000000000000000000000000000000000..309484d3239a307904ad64f95d87c38fb6d24b7b GIT binary patch literal 118132 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%0DETOW7eIAsjJ*VFhlN<7=Qp<lrajxL6H!A`C%F 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/ttf/RobotoMono-ThinItalic.ttf b/js/assets/fonts/RobotoMono/ttf/RobotoMono-ThinItalic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..e1bb9121ec6568d6b8772d121eafeaa5da0db928 GIT binary patch literal 121456 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz-pRBTtN4E2_qSPBnw6AgMc.woff2 b/js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz-pRBTtN4E2_qSPBnw6AgMc.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..f1fdb93524e7a84934cc4f6d4b731006059705f1 GIT binary patch literal 3516 zcmV;t4MXyGPew8T0RR9101dnV3;+NC03LJz01avY0suh(00000000000000000000 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz0ExlR2MysFCBK8OirNw2kM.woff2 b/js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz0ExlR2MysFCBK8OirNw2kM.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..501a4d77720aec360723de2ad0292c49eb10caf9 GIT binary patch literal 12108 zcmV-SFSF2hPew8T0RR910541c4FCWD09l{_0513d0suh(00000000000000000000 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 C6V#>v literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz2MSHb9EAJwuSzGfuRChQzQ.woff2 b/js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz2MSHb9EAJwuSzGfuRChQzQ.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..54484b1e3edcbac1fc80f13cfa4a03cb29c84bf1 GIT binary patch literal 5264 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 Wh%U=Qt3PV)+7=UD5`Wp30RRB)5A{y~ literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz2dsm03krrxlabhmVQFB99s.woff2 b/js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz2dsm03krrxlabhmVQFB99s.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c3f35ca2911c1db7e8afb85f28e23f7db0ae986c GIT binary patch literal 6712 zcmV-88pq{#Pew8T0RR9102(*|4FCWD053!U02$%{0suh(00000000000000000000 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 OhebSMXU4q%0002*V&)J4 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz9Dnm4qiMZlH5rhYv_7LI2Y.woff2 b/js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz9Dnm4qiMZlH5rhYv_7LI2Y.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..72a43ab3c0332b0539f230c402090fdbab079956 GIT binary patch literal 8136 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz9TIkQYohD4BpHvJ3NvbHoA.woff2 b/js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz9TIkQYohD4BpHvJ3NvbHoA.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..62b3a15f698a5e966f5f6b4a5b6d5081e340c654 GIT binary patch literal 11032 zcmV+zE9caAPew8T0RR9104o>(3;+NC083B+04l}+0suh(00000000000000000000 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 Scv!ceo=>Nzrn}1J^(g>##wLjX literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59FzyJ0caWjaSBdV-xZbEgst_k.woff2 b/js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59FzyJ0caWjaSBdV-xZbEgst_k.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2d4fda538a22e1046718d4d158e7512eae086f69 GIT binary patch literal 740 zcmV<A0vr8zPew8T0RR9100QIy3;+NC00h(k00NW%0suh(00000000000000000000 z0000S3<h8TG!Y02fp~%;0X7080~8Ao00bZfg8&Cd8yy75o|-&?0t#${1X6FxHbC)s z;Mw1MA3m6-W<{t|rHFN<IJAY#3RR`D^L(Ch`H!BO#k1qw$hx<tv?`V&w0lbr0Py^x zRGt5G@!o*S#))&QrqSPYeUydM6TEkHfE8E`a%MM-U0g<)0D1iwqWC<B0EN^!B_0TB z-3igVp%B{De;_9Od^P}ez~+%s1(3MteXd8a_YlK<K)9(UKs-n}sH6Tb<q;~7;<GA{ z)qz+Hg4(J71aUqB0gNDB&I1`}mFreB3C`j}McTYjnEXR!njQekoOr^T2+t^M^3iW> z+RAd76BT?PY(kec3BTZPYG+|J-?aT)o_hM=)4(kF(kZQ8ikqvnj&)5YH8+`?#a&gl zxH+#yl-?<=S&E&DmW+2#BsDi@LzUNfE}?9Xz~EW@bt&T7T1j+KkvOKdHbv~OOPABn za(uJDUczIFiht*)=b9O4|4JGycV7+9UDs77jCcPfdUtw2xe8(n$jC_jZ-oew{p5vQ zP3_;>&n9le6JPK$ezPn(;ORpU1@P{?V%0++CqvtDb;ZxgK5JaP<pUZK#g`NpoCdC1 zuMm(ijA#;BXjTs$_-4%?tCz9vcf||@8h{0%GAlze(jz7xmy;=ry2!LThliIfx<ehA zJ~C=DJ}Svb{pJdzhK*25#vuGJ8e+Yaipj_f6C0G)a$1@=F=8cZVhTzsqq&9;BhF9M z%TuLDl%AIBiJ_s!g(1B(y@3&<3|q}d2<>Q;c%kE|Og?h1qFJmamnK?=b!n7da(GL> z5rd-0C=H7yHmctsDV5E`>Cq~b%2%jLJ#->xtGv~*$(RA!RT+X1p~yf$B9O^djTIG) WfnL>UuS{>Y&@|G~*rJ320000!p+^V+ literal 0 HcmV?d00001 From 55be649f230d802e826f4e356d54325069eb175b Mon Sep 17 00:00:00 2001 From: Jaco Greeff <jaco@ethcore.io> Date: Wed, 12 Oct 2016 14:00:55 +0200 Subject: [PATCH 1029/1062] import fonts as part of build --- js/assets/fonts/Roboto/font.css | 14 +++++++------- js/assets/fonts/RobotoMono/font.css | 14 +++++++------- js/src/dapps/basiccoin.html | 2 -- js/src/dapps/basiccoin.js | 2 ++ js/src/dapps/gavcoin.html | 2 -- js/src/dapps/gavcoin.js | 2 ++ js/src/dapps/githubhint.html | 2 -- js/src/dapps/githubhint.js | 2 ++ js/src/dapps/registry.html | 2 -- js/src/dapps/registry.js | 2 ++ js/src/dapps/signaturereg.html | 2 -- js/src/dapps/signaturereg.js | 2 ++ js/src/dapps/style.css | 21 +++++++++++++++++++++ js/src/dapps/tokenreg.html | 2 -- js/src/dapps/tokenreg.js | 2 ++ js/src/index.html | 2 -- js/src/index.js | 2 ++ js/src/reset.css | 6 ++++++ js/src/views/Dapps/Summary/summary.css | 1 + 19 files changed, 56 insertions(+), 28 deletions(-) diff --git a/js/assets/fonts/Roboto/font.css b/js/assets/fonts/Roboto/font.css index 75226e62185..5eea2bfd1fe 100644 --- a/js/assets/fonts/Roboto/font.css +++ b/js/assets/fonts/Roboto/font.css @@ -3,7 +3,7 @@ font-family: 'Roboto'; font-style: normal; font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url(./v15/0eC6fl06luXEYWpBSJvXCIX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2'); + src: local('Roboto Light'), local('Roboto-Light'), url(v15/0eC6fl06luXEYWpBSJvXCIX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2'); unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; } /* cyrillic */ @@ -11,7 +11,7 @@ font-family: 'Roboto'; font-style: normal; font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url(./v15/Fl4y0QdOxyyTHEGMXX8kcYX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2'); + src: local('Roboto Light'), local('Roboto-Light'), url(v15/Fl4y0QdOxyyTHEGMXX8kcYX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2'); unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* greek-ext */ @@ -19,7 +19,7 @@ font-family: 'Roboto'; font-style: normal; font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url(./v15/-L14Jk06m6pUHB-5mXQQnYX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2'); + src: local('Roboto Light'), local('Roboto-Light'), url(v15/-L14Jk06m6pUHB-5mXQQnYX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2'); unicode-range: U+1F00-1FFF; } /* greek */ @@ -27,7 +27,7 @@ font-family: 'Roboto'; font-style: normal; font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url(./v15/I3S1wsgSg9YCurV6PUkTOYX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2'); + src: local('Roboto Light'), local('Roboto-Light'), url(v15/I3S1wsgSg9YCurV6PUkTOYX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2'); unicode-range: U+0370-03FF; } /* vietnamese */ @@ -35,7 +35,7 @@ font-family: 'Roboto'; font-style: normal; font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url(./v15/NYDWBdD4gIq26G5XYbHsFIX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2'); + src: local('Roboto Light'), local('Roboto-Light'), url(v15/NYDWBdD4gIq26G5XYbHsFIX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2'); unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; } /* latin-ext */ @@ -43,7 +43,7 @@ font-family: 'Roboto'; font-style: normal; font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url(./v15/Pru33qjShpZSmG3z6VYwnYX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2'); + src: local('Roboto Light'), local('Roboto-Light'), url(v15/Pru33qjShpZSmG3z6VYwnYX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2'); unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; } /* latin */ @@ -51,6 +51,6 @@ font-family: 'Roboto'; font-style: normal; font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url(./v15/Hgo13k-tfSpn0qi1SFdUfZBw1xU1rKptJj_0jans920.woff2) format('woff2'); + src: local('Roboto Light'), local('Roboto-Light'), url(v15/Hgo13k-tfSpn0qi1SFdUfZBw1xU1rKptJj_0jans920.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; } diff --git a/js/assets/fonts/RobotoMono/font.css b/js/assets/fonts/RobotoMono/font.css index 6a86af729e4..5e9ab5721c1 100644 --- a/js/assets/fonts/RobotoMono/font.css +++ b/js/assets/fonts/RobotoMono/font.css @@ -3,7 +3,7 @@ font-family: 'Roboto Mono'; font-style: normal; font-weight: 300; - src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(./v4/N4duVc9C58uwPiY8_59Fz0ExlR2MysFCBK8OirNw2kM.woff2) format('woff2'); + src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(v4/N4duVc9C58uwPiY8_59Fz0ExlR2MysFCBK8OirNw2kM.woff2) format('woff2'); unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; } /* cyrillic */ @@ -11,7 +11,7 @@ font-family: 'Roboto Mono'; font-style: normal; font-weight: 300; - src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(./v4/N4duVc9C58uwPiY8_59Fz2dsm03krrxlabhmVQFB99s.woff2) format('woff2'); + src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(v4/N4duVc9C58uwPiY8_59Fz2dsm03krrxlabhmVQFB99s.woff2) format('woff2'); unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* greek-ext */ @@ -19,7 +19,7 @@ font-family: 'Roboto Mono'; font-style: normal; font-weight: 300; - src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(./v4/N4duVc9C58uwPiY8_59FzyJ0caWjaSBdV-xZbEgst_k.woff2) format('woff2'); + src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(v4/N4duVc9C58uwPiY8_59FzyJ0caWjaSBdV-xZbEgst_k.woff2) format('woff2'); unicode-range: U+1F00-1FFF; } /* greek */ @@ -27,7 +27,7 @@ font-family: 'Roboto Mono'; font-style: normal; font-weight: 300; - src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(./v4/N4duVc9C58uwPiY8_59Fz2MSHb9EAJwuSzGfuRChQzQ.woff2) format('woff2'); + src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(v4/N4duVc9C58uwPiY8_59Fz2MSHb9EAJwuSzGfuRChQzQ.woff2) format('woff2'); unicode-range: U+0370-03FF; } /* vietnamese */ @@ -35,7 +35,7 @@ font-family: 'Roboto Mono'; font-style: normal; font-weight: 300; - src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(./v4/N4duVc9C58uwPiY8_59Fz-pRBTtN4E2_qSPBnw6AgMc.woff2) format('woff2'); + src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(v4/N4duVc9C58uwPiY8_59Fz-pRBTtN4E2_qSPBnw6AgMc.woff2) format('woff2'); unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; } /* latin-ext */ @@ -43,7 +43,7 @@ font-family: 'Roboto Mono'; font-style: normal; font-weight: 300; - src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(./v4/N4duVc9C58uwPiY8_59Fz9Dnm4qiMZlH5rhYv_7LI2Y.woff2) format('woff2'); + src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(v4/N4duVc9C58uwPiY8_59Fz9Dnm4qiMZlH5rhYv_7LI2Y.woff2) format('woff2'); unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; } /* latin */ @@ -51,6 +51,6 @@ font-family: 'Roboto Mono'; font-style: normal; font-weight: 300; - src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(./v4/N4duVc9C58uwPiY8_59Fz9TIkQYohD4BpHvJ3NvbHoA.woff2) format('woff2'); + src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(v4/N4duVc9C58uwPiY8_59Fz9TIkQYohD4BpHvJ3NvbHoA.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; } diff --git a/js/src/dapps/basiccoin.html b/js/src/dapps/basiccoin.html index e451b5125c3..9bcc368f388 100644 --- a/js/src/dapps/basiccoin.html +++ b/js/src/dapps/basiccoin.html @@ -5,8 +5,6 @@ <meta name="viewport" content="width=device-width"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Basic Token Deployment - -
      diff --git a/js/src/dapps/basiccoin.js b/js/src/dapps/basiccoin.js index 58fb37cf635..e02990d14eb 100644 --- a/js/src/dapps/basiccoin.js +++ b/js/src/dapps/basiccoin.js @@ -29,6 +29,8 @@ import Transfer from './basiccoin/Transfer'; const routerHistory = useRouterHistory(createHashHistory)({}); +import '../../assets/fonts/Roboto/font.css'; +import '../../assets/fonts/RobotoMono/font.css'; import './style.css'; import './basiccoin.html'; diff --git a/js/src/dapps/gavcoin.html b/js/src/dapps/gavcoin.html index 6f4b951c7b5..928310a5262 100644 --- a/js/src/dapps/gavcoin.html +++ b/js/src/dapps/gavcoin.html @@ -5,8 +5,6 @@ GAVcoin - -
      diff --git a/js/src/dapps/gavcoin.js b/js/src/dapps/gavcoin.js index f250388e48f..fae095ef257 100644 --- a/js/src/dapps/gavcoin.js +++ b/js/src/dapps/gavcoin.js @@ -22,6 +22,8 @@ injectTapEventPlugin(); import Application from './gavcoin/Application'; +import '../../assets/fonts/Roboto/font.css'; +import '../../assets/fonts/RobotoMono/font.css'; import './style.css'; import './gavcoin.html'; diff --git a/js/src/dapps/githubhint.html b/js/src/dapps/githubhint.html index 5776cbde5dd..0084dd051c1 100644 --- a/js/src/dapps/githubhint.html +++ b/js/src/dapps/githubhint.html @@ -5,8 +5,6 @@ GitHub Hint - -
      diff --git a/js/src/dapps/githubhint.js b/js/src/dapps/githubhint.js index fdbd13a6dee..b7370299062 100644 --- a/js/src/dapps/githubhint.js +++ b/js/src/dapps/githubhint.js @@ -22,6 +22,8 @@ injectTapEventPlugin(); import Application from './githubhint/Application'; +import '../../assets/fonts/Roboto/font.css'; +import '../../assets/fonts/RobotoMono/font.css'; import './style.css'; import './githubhint.html'; diff --git a/js/src/dapps/registry.html b/js/src/dapps/registry.html index f579031f238..21b09dc12f3 100644 --- a/js/src/dapps/registry.html +++ b/js/src/dapps/registry.html @@ -5,8 +5,6 @@ Token Registry - -
      diff --git a/js/src/dapps/registry.js b/js/src/dapps/registry.js index 9f59ba80f2b..ebcff155a1f 100644 --- a/js/src/dapps/registry.js +++ b/js/src/dapps/registry.js @@ -24,6 +24,8 @@ injectTapEventPlugin(); import store from './registry/store'; import Container from './registry/Container'; +import '../../assets/fonts/Roboto/font.css'; +import '../../assets/fonts/RobotoMono/font.css'; import './style.css'; import './registry.html'; diff --git a/js/src/dapps/signaturereg.html b/js/src/dapps/signaturereg.html index 8245032f193..3f74be28ab3 100644 --- a/js/src/dapps/signaturereg.html +++ b/js/src/dapps/signaturereg.html @@ -5,8 +5,6 @@ Method Signature Registry - -
      diff --git a/js/src/dapps/signaturereg.js b/js/src/dapps/signaturereg.js index c59aee6ce85..72ddd0ca792 100644 --- a/js/src/dapps/signaturereg.js +++ b/js/src/dapps/signaturereg.js @@ -22,6 +22,8 @@ injectTapEventPlugin(); import Application from './signaturereg/Application'; +import '../../assets/fonts/Roboto/font.css'; +import '../../assets/fonts/RobotoMono/font.css'; import './style.css'; import './signaturereg.html'; diff --git a/js/src/dapps/style.css b/js/src/dapps/style.css index c159f6500c4..b177a15f926 100644 --- a/js/src/dapps/style.css +++ b/js/src/dapps/style.css @@ -1,3 +1,20 @@ +/* Copyright 2015, 2016 Ethcore (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + :root, :root body { background: #fff; @@ -5,6 +22,7 @@ color: #333; font-size: 16px; font-family: 'Roboto', sans-serif; + font-weight: 300 !important; margin: 0; padding: 0; vertical-align: top; @@ -19,6 +37,9 @@ flex: 1; } +:root * { + font-weight: 300 !important; +} :root :global(#container) > div { flex: 1; diff --git a/js/src/dapps/tokenreg.html b/js/src/dapps/tokenreg.html index ec4b1aa0360..ecb03d0055b 100644 --- a/js/src/dapps/tokenreg.html +++ b/js/src/dapps/tokenreg.html @@ -5,8 +5,6 @@ Token Registry - -
      diff --git a/js/src/dapps/tokenreg.js b/js/src/dapps/tokenreg.js index e9c0d4d6182..8ca70e114f0 100644 --- a/js/src/dapps/tokenreg.js +++ b/js/src/dapps/tokenreg.js @@ -24,6 +24,8 @@ injectTapEventPlugin(); import store from './tokenreg/store'; import Container from './tokenreg/Container'; +import '../../assets/fonts/Roboto/font.css'; +import '../../assets/fonts/RobotoMono/font.css'; import './style.css'; import './tokenreg.html'; diff --git a/js/src/index.html b/js/src/index.html index 19e5c70a905..4ca2e7c1a01 100644 --- a/js/src/index.html +++ b/js/src/index.html @@ -5,8 +5,6 @@ Parity - -

    uEk$7h;(7^{$52`9R> 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�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⩾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