From 3f61eaae0c4d97a74a6a08a88c6b8ec5b82b8618 Mon Sep 17 00:00:00 2001 From: victor Date: Wed, 4 Oct 2017 11:13:34 +0200 Subject: [PATCH 01/38] add iexec-oracle-contract to deps --- package-lock.json | 11 +++++++++++ package.json | 22 ++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 package-lock.json create mode 100644 package.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..daa1bed --- /dev/null +++ b/package-lock.json @@ -0,0 +1,11 @@ +{ + "name": "iexec-dapp-init", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "iexec-oracle-contract": { + "version": "github:iExecBlockchainComputing/iexec-oracle-contract#64d31fa289acdd1a1f4a4c1d9426b9f610134a94" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..3c82fbc --- /dev/null +++ b/package.json @@ -0,0 +1,22 @@ +{ + "name": "iexec-dapp-init", + "version": "1.0.0", + "description": "This is the registry for sample iexec dapps, used by the iexec-sdk cli.", + "main": "iexec.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/iExecBlockchainComputing/iexec-dapp-samples.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/iExecBlockchainComputing/iexec-dapp-samples/issues" + }, + "homepage": "https://github.com/iExecBlockchainComputing/iexec-dapp-samples#readme", + "dependencies": { + "iexec-oracle-contract": "github:iExecBlockchainComputing/iexec-oracle-contract#v1.0.0" + } +} From e44acc061f32b5e99515c82b0b336ec0160287a7 Mon Sep 17 00:00:00 2001 From: victor Date: Wed, 4 Oct 2017 11:13:39 +0200 Subject: [PATCH 02/38] add gitignore --- .gitignore | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fd4eb98 --- /dev/null +++ b/.gitignore @@ -0,0 +1,28 @@ +# Logs +logs +*.log +npm-debug.log* + +# Runtime data +pids +*.pid +*.seed + +# Coverage directory used by tools like istanbul +coverage + +# node-waf configuration +.lock-wscript + +# Dependency directory +node_modules + +# Compiled JS directory +/dist/* +!/dist/iexec.js + +# Optional npm cache directory +.npm + +# Optional REPL history +.node_repl_history From 104105ef454b5a7173d4e7316f1ee541c1491f74 Mon Sep 17 00:00:00 2001 From: victor Date: Wed, 4 Oct 2017 11:20:12 +0200 Subject: [PATCH 03/38] use IexecOracleAPI from npm instead of local --- contracts/MyContract.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/MyContract.sol b/contracts/MyContract.sol index 5382017..f64a050 100644 --- a/contracts/MyContract.sol +++ b/contracts/MyContract.sol @@ -1,9 +1,9 @@ pragma solidity ^0.4.11; -import "./IexecOracleAPI.sol"; +import "iexec-oracle-contract/contracts/IexecOracleAPI.sol"; contract MyContract is IexecOracleAPI{ function MyContract (address _iexecOracleAddress) IexecOracleAPI(_iexecOracleAddress){ } -} \ No newline at end of file +} From 0334db32ae97e1371819b4d925e068c3b4a35fd1 Mon Sep 17 00:00:00 2001 From: fbranciard Date: Tue, 17 Oct 2017 12:46:55 +0200 Subject: [PATCH 04/38] add DAPP_PRICE --- contracts/MyContract.sol | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/contracts/MyContract.sol b/contracts/MyContract.sol index f64a050..c244a7b 100644 --- a/contracts/MyContract.sol +++ b/contracts/MyContract.sol @@ -2,7 +2,9 @@ pragma solidity ^0.4.11; import "iexec-oracle-contract/contracts/IexecOracleAPI.sol"; contract MyContract is IexecOracleAPI{ - function MyContract (address _iexecOracleAddress) IexecOracleAPI(_iexecOracleAddress){ + uint public constant DAPP_PRICE = 0; + + function MyContract (address _iexecOracleAddress) IexecOracleAPI(_iexecOracleAddress,DAPP_PRICE){ } From d80832b956ad28123777063b0a45b34523d549d2 Mon Sep 17 00:00:00 2001 From: fbranciard Date: Wed, 18 Oct 2017 11:52:02 +0200 Subject: [PATCH 05/38] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3c82fbc..f91886d 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,6 @@ }, "homepage": "https://github.com/iExecBlockchainComputing/iexec-dapp-samples#readme", "dependencies": { - "iexec-oracle-contract": "github:iExecBlockchainComputing/iexec-oracle-contract#v1.0.0" + "iexec-oracle-contract": "github:iExecBlockchainComputing/iexec-oracle-contract#v1.0.4" } } From bf373ca75f7eaa53f43ba2ed63ce65689a7c600d Mon Sep 17 00:00:00 2001 From: fbranciard Date: Wed, 18 Oct 2017 15:26:00 +0200 Subject: [PATCH 06/38] Update truffle.js --- truffle.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/truffle.js b/truffle.js index 87b347c..47c2e49 100644 --- a/truffle.js +++ b/truffle.js @@ -1,3 +1,9 @@ +const oracleJSON = require('iexec-oracle-contract/build/contracts/IexecOracle.json'); + +const ROPSTEN_ORACLE_ADDRESS = oracleJSON.networks['3'].address; +const RINKEBY_ORACLE_ADDRESS = oracleJSON.networks['4'].address; +const KOVAN_ORACLE_ADDRESS = oracleJSON.networks['42'].address; + module.exports = { networks: { development: { From 7485cf80dcc6a47baa2fc1971bf7f34011e58a59 Mon Sep 17 00:00:00 2001 From: fbranciard Date: Wed, 18 Oct 2017 15:27:45 +0200 Subject: [PATCH 07/38] Update truffle.js --- truffle.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/truffle.js b/truffle.js index 47c2e49..6a8eab3 100644 --- a/truffle.js +++ b/truffle.js @@ -15,7 +15,7 @@ module.exports = { host: "https://ropsten.infura.io/berv5GTB5cSdOJPPnqOq", port: 8545, network_id: "3", - iexecOracleAddress: "0xb34406538112bd2b3036b2c417c7cff827777a11", // oracle v0.1.2 ropsten + constructorArgs: [ROPSTEN_ORACLE_ADDRESS], // gasPriceMultiplier: 2, // use factor 2 of the network estimated gasPrice // gasLimitMultiplier: 4, // use factor 4 of the network estimated gasLimit // gasPrice: 21000000000 // manually set the gasPrice in gwei. Prefer "gasPriceMultiplier" @@ -25,13 +25,13 @@ module.exports = { host: "https://rinkeby.infura.io/berv5GTB5cSdOJPPnqOq", port: 8545, network_id: "4", - iexecOracleAddress: "0x98275d4b6511ef05ed063d127dd82b72588326c9",// oracle v0.1.2 rinkeby + constructorArgs: [RINKEBY_ORACLE_ADDRESS], }, kovan: { host: "https://kovan.infura.io/berv5GTB5cSdOJPPnqOq", port: 8545, network_id: "42", - iexecOracleAddress: "0xb81d38d843cb526a3d0c3130d568fe09799135aa",// oracle v0.1.2 kovan + constructorArgs: [KOVAN_ORACLE_ADDRESS], }, } }; From a8d115ed9c2c8bef20d2d7d1724da5295dd3098d Mon Sep 17 00:00:00 2001 From: fbranciard Date: Wed, 18 Oct 2017 15:28:35 +0200 Subject: [PATCH 08/38] Update truffle.js --- truffle.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/truffle.js b/truffle.js index 6a8eab3..f6e5b60 100644 --- a/truffle.js +++ b/truffle.js @@ -3,13 +3,15 @@ const oracleJSON = require('iexec-oracle-contract/build/contracts/IexecOracle.js const ROPSTEN_ORACLE_ADDRESS = oracleJSON.networks['3'].address; const RINKEBY_ORACLE_ADDRESS = oracleJSON.networks['4'].address; const KOVAN_ORACLE_ADDRESS = oracleJSON.networks['42'].address; +const LOCAL_ORACLE_ADDRESS = 'LOCAL_ORACLE_ADDRESS_VALUE'; module.exports = { networks: { development: { host: "http://localhost:8545", port: 8545, - network_id: "*" // Match any network id + network_id: "*" // Match any network id, + constructorArgs: [LOCAL_ORACLE_ADDRESS], }, ropsten: { host: "https://ropsten.infura.io/berv5GTB5cSdOJPPnqOq", From be235cbd6feb075b6109d9654ea38fb72c477b5c Mon Sep 17 00:00:00 2001 From: fbranciard Date: Wed, 25 Oct 2017 18:01:26 +0200 Subject: [PATCH 09/38] Update MyContract.sol --- contracts/MyContract.sol | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/MyContract.sol b/contracts/MyContract.sol index c244a7b..ab269b8 100644 --- a/contracts/MyContract.sol +++ b/contracts/MyContract.sol @@ -3,8 +3,9 @@ import "iexec-oracle-contract/contracts/IexecOracleAPI.sol"; contract MyContract is IexecOracleAPI{ uint public constant DAPP_PRICE = 0; + string public constant DAPP_NAME = "init"; - function MyContract (address _iexecOracleAddress) IexecOracleAPI(_iexecOracleAddress,DAPP_PRICE){ + function MyContract (address _iexecOracleAddress) IexecOracleAPI(_iexecOracleAddress,DAPP_PRICE,DAPP_NAME){ } From 8534944e16c71e531807d194eb2f93df9c8771c5 Mon Sep 17 00:00:00 2001 From: fbranciard Date: Thu, 9 Nov 2017 19:49:43 -0500 Subject: [PATCH 10/38] Update iexec.js --- iexec.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/iexec.js b/iexec.js index ddb3c67..589dc09 100644 --- a/iexec.js +++ b/iexec.js @@ -1,6 +1,3 @@ module.exports = { - name: 'MyContract', - constructorArgs: ['0xb34406538112bd2b3036b2c417c7cff827777a11'], // oracle v0.1.2 ropsten - // constructorArgs: ['0x98275d4b6511ef05ed063d127dd82b72588326c9'], // oracle v0.1.2 rinkeby - // constructorArgs: ['0xb81d38d843cb526a3d0c3130d568fe09799135aa'], // oracle v0.1.2 kovan -}; \ No newline at end of file + name: 'MyContract' +}; From 188f445a3fe3db5df42ad30da144103c9cbf81e5 Mon Sep 17 00:00:00 2001 From: fbranciard Date: Thu, 9 Nov 2017 19:50:29 -0500 Subject: [PATCH 11/38] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f91886d..4686bee 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,6 @@ }, "homepage": "https://github.com/iExecBlockchainComputing/iexec-dapp-samples#readme", "dependencies": { - "iexec-oracle-contract": "github:iExecBlockchainComputing/iexec-oracle-contract#v1.0.4" + "iexec-oracle-contract": "github:iExecBlockchainComputing/iexec-oracle-contract#v1.0.9" } } From d0627ab20c8c118df0e5b2dced85e685ea769904 Mon Sep 17 00:00:00 2001 From: fbranciard Date: Fri, 10 Nov 2017 15:24:41 -0500 Subject: [PATCH 12/38] missing coma --- iexec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iexec.js b/iexec.js index 589dc09..57dee80 100644 --- a/iexec.js +++ b/iexec.js @@ -1,3 +1,3 @@ module.exports = { - name: 'MyContract' + name: 'MyContract', }; From b1c5568f984782c853453660998d18ea28e17e76 Mon Sep 17 00:00:00 2001 From: Andy92Pac Date: Sat, 11 Nov 2017 17:00:44 +0100 Subject: [PATCH 13/38] Adding missing comma to truffle.js This missing comma raise an exception when calling iexec commands --- truffle.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/truffle.js b/truffle.js index f6e5b60..7444b21 100644 --- a/truffle.js +++ b/truffle.js @@ -10,7 +10,7 @@ module.exports = { development: { host: "http://localhost:8545", port: 8545, - network_id: "*" // Match any network id, + network_id: "*", // Match any network id, constructorArgs: [LOCAL_ORACLE_ADDRESS], }, ropsten: { From 5830dc270cf186ef81998142ebe2d1c9f9e0127c Mon Sep 17 00:00:00 2001 From: francois branciard Date: Fri, 8 Dec 2017 16:33:49 +0100 Subject: [PATCH 14/38] add README --- apps/README.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 apps/README.md diff --git a/apps/README.md b/apps/README.md new file mode 100644 index 0000000..3a425c0 --- /dev/null +++ b/apps/README.md @@ -0,0 +1,7 @@ +Your iexec Dapp is composed of : + +* under apps directory : +the offchain app, which can be any kind of legacy application. The offchain app will be executed by the iexec decentralized cloud. + +* under contracts directory : +a smart contract that interfaces your iExec Dapp from Ethereum to the offchain app. From 3c54f1d6270b882d5cbb50b588940b6f796832d9 Mon Sep 17 00:00:00 2001 From: victor Date: Wed, 13 Dec 2017 12:08:14 +0100 Subject: [PATCH 15/38] update oracle to v1.1.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4686bee..d4bfaa0 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,6 @@ }, "homepage": "https://github.com/iExecBlockchainComputing/iexec-dapp-samples#readme", "dependencies": { - "iexec-oracle-contract": "github:iExecBlockchainComputing/iexec-oracle-contract#v1.0.9" + "iexec-oracle-contract": "github:iExecBlockchainComputing/iexec-oracle-contract#v1.1.1" } } From 5ac27924dbb289ca520a5f3f3d4621c3fe146a2e Mon Sep 17 00:00:00 2001 From: victor Date: Tue, 19 Dec 2017 00:36:40 +0100 Subject: [PATCH 16/38] immprove readme --- README.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index fecb605..cafe4bf 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,14 @@ -# iexec dapps samples +# iExec dapp samples -This is the registry for sample iexec dapps, used by the iexec-sdk cli. +Each branch of this repo is a sample iExec dapp, and can be easily played with by using the [iexec sdk cli](https://github.com/iExecBlockchainComputing/iexec-sdk) like this: +```iexec init branchName``` -Each branch name of this repo can be used as an argument to iexec init command. - -ex: +# Example ```bash -iexec init -iexec init factorial -iexec init echo +iexec init # current branch containing minimum working config +iexec init factorial # download and init factorial dapp +iexec init echo # download and init echo dapp ``` + +You are warmly welcome to push your dapp on a new branch in this repo. You may even request to be listed on the [iExec dapp store](https://iex.ec) From 01729054a51eba78a937be76be3948d951e9840d Mon Sep 17 00:00:00 2001 From: victor Date: Tue, 19 Dec 2017 00:37:33 +0100 Subject: [PATCH 17/38] remove truffle.js --- truffle.js | 39 --------------------------------------- 1 file changed, 39 deletions(-) delete mode 100644 truffle.js diff --git a/truffle.js b/truffle.js deleted file mode 100644 index 7444b21..0000000 --- a/truffle.js +++ /dev/null @@ -1,39 +0,0 @@ -const oracleJSON = require('iexec-oracle-contract/build/contracts/IexecOracle.json'); - -const ROPSTEN_ORACLE_ADDRESS = oracleJSON.networks['3'].address; -const RINKEBY_ORACLE_ADDRESS = oracleJSON.networks['4'].address; -const KOVAN_ORACLE_ADDRESS = oracleJSON.networks['42'].address; -const LOCAL_ORACLE_ADDRESS = 'LOCAL_ORACLE_ADDRESS_VALUE'; - -module.exports = { - networks: { - development: { - host: "http://localhost:8545", - port: 8545, - network_id: "*", // Match any network id, - constructorArgs: [LOCAL_ORACLE_ADDRESS], - }, - ropsten: { - host: "https://ropsten.infura.io/berv5GTB5cSdOJPPnqOq", - port: 8545, - network_id: "3", - constructorArgs: [ROPSTEN_ORACLE_ADDRESS], - // gasPriceMultiplier: 2, // use factor 2 of the network estimated gasPrice - // gasLimitMultiplier: 4, // use factor 4 of the network estimated gasLimit - // gasPrice: 21000000000 // manually set the gasPrice in gwei. Prefer "gasPriceMultiplier" - // gas: 400000 // manually set the gas limit in gwei. Prefer "gasLimitMultiplier" - }, - rinkeby: { - host: "https://rinkeby.infura.io/berv5GTB5cSdOJPPnqOq", - port: 8545, - network_id: "4", - constructorArgs: [RINKEBY_ORACLE_ADDRESS], - }, - kovan: { - host: "https://kovan.infura.io/berv5GTB5cSdOJPPnqOq", - port: 8545, - network_id: "42", - constructorArgs: [KOVAN_ORACLE_ADDRESS], - }, - } -}; From 19b5781f34a156fb7a3d429f001b002964217a0e Mon Sep 17 00:00:00 2001 From: victor Date: Tue, 19 Dec 2017 00:38:48 +0100 Subject: [PATCH 18/38] add example fields --- iexec.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/iexec.js b/iexec.js index 57dee80..7d6b547 100644 --- a/iexec.js +++ b/iexec.js @@ -1,3 +1,11 @@ module.exports = { - name: 'MyContract', + name: 'MyContract', + data: { + type: 'BINARY', + cpu: 'AMD64', + os: 'LINUX', + }, + work: { + cmdline: '10', + } }; From bdaaf5e5e5ecb72dd0e6ce99e096aa38af8ec1b6 Mon Sep 17 00:00:00 2001 From: victor Date: Tue, 19 Dec 2017 11:12:48 +0100 Subject: [PATCH 19/38] improve description --- apps/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/README.md b/apps/README.md index 3a425c0..bc23275 100644 --- a/apps/README.md +++ b/apps/README.md @@ -1,7 +1,7 @@ -Your iexec Dapp is composed of : +Your iExec Dapp is composed of two parts: -* under apps directory : -the offchain app, which can be any kind of legacy application. The offchain app will be executed by the iexec decentralized cloud. +* under the ```apps``` directory : +Put the offchain app (any kind of legacy application). The offchain app will be executed by the iExec decentralized cloud. -* under contracts directory : -a smart contract that interfaces your iExec Dapp from Ethereum to the offchain app. +* under the ```contracts``` directory : +A smart contract that interfaces with your iExec Dapp, it will serve as a gateway from Ethereum to your offchain app. From 527791dbdd8a306bb25fdf2ba2071557463b6dc7 Mon Sep 17 00:00:00 2001 From: victor Date: Tue, 19 Dec 2017 11:20:11 +0100 Subject: [PATCH 20/38] improve desc --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index cafe4bf..edb7f00 100644 --- a/README.md +++ b/README.md @@ -11,4 +11,6 @@ iexec init factorial # download and init factorial dapp iexec init echo # download and init echo dapp ``` -You are warmly welcome to push your dapp on a new branch in this repo. You may even request to be listed on the [iExec dapp store](https://iex.ec) +Start a Pull Request with your code onto a new branch of this repo to let other developers discover it by running ```iexec init yourDappName```. + +Finally, you should checkout the [iExec Dapp Challenge](https://medium.com/iex-ec/the-iexec-%C3%B0app-challenge-150k-of-grants-to-win-abf6798b31ee) as well as submit us a request to be listed on the [iExec dapp store](https://dapps.iex.ec/) From 58c6f39eb9b5f870554c505ef2f257a30cf55cde Mon Sep 17 00:00:00 2001 From: victor Date: Tue, 19 Dec 2017 14:23:02 +0100 Subject: [PATCH 21/38] improve readme --- README.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index edb7f00..70b615d 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,6 @@ Each branch of this repo is a sample iExec dapp, and can be easily played with by using the [iexec sdk cli](https://github.com/iExecBlockchainComputing/iexec-sdk) like this: ```iexec init branchName``` -# Example ```bash iexec init # current branch containing minimum working config @@ -14,3 +13,16 @@ iexec init echo # download and init echo dapp Start a Pull Request with your code onto a new branch of this repo to let other developers discover it by running ```iexec init yourDappName```. Finally, you should checkout the [iExec Dapp Challenge](https://medium.com/iex-ec/the-iexec-%C3%B0app-challenge-150k-of-grants-to-win-abf6798b31ee) as well as submit us a request to be listed on the [iExec dapp store](https://dapps.iex.ec/) + +--------------- +# My Dapp name +## Description +My Dapp description here... +## Howto +```bash +# ... +# ... +``` +## Checklist + * add license + * author name From 55a95af1f12cd582e9ab35828f9a4e8756ba9f12 Mon Sep 17 00:00:00 2001 From: victor Date: Tue, 19 Dec 2017 14:23:14 +0100 Subject: [PATCH 22/38] add License --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b372aef --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2017 iExec Blockchain Tech, https://iex.ec + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. From 63b924ef2b16b70a42f9db9b674399834aa88540 Mon Sep 17 00:00:00 2001 From: victor Date: Tue, 19 Dec 2017 14:48:29 +0100 Subject: [PATCH 23/38] remove deps --- package.json | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/package.json b/package.json index d4bfaa0..7f3d9c3 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,5 @@ "bugs": { "url": "https://github.com/iExecBlockchainComputing/iexec-dapp-samples/issues" }, - "homepage": "https://github.com/iExecBlockchainComputing/iexec-dapp-samples#readme", - "dependencies": { - "iexec-oracle-contract": "github:iExecBlockchainComputing/iexec-oracle-contract#v1.1.1" - } + "homepage": "https://github.com/iExecBlockchainComputing/iexec-dapp-samples#readme" } From fadd08b5e466a9a83c63fb62ddc7e26b34e1841b Mon Sep 17 00:00:00 2001 From: victor Date: Tue, 19 Dec 2017 14:54:12 +0100 Subject: [PATCH 24/38] Improve readme --- README.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 70b615d..eff9ac8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # iExec dapp samples +## 1 branch = 1 dapp Each branch of this repo is a sample iExec dapp, and can be easily played with by using the [iexec sdk cli](https://github.com/iExecBlockchainComputing/iexec-sdk) like this: ```iexec init branchName``` @@ -10,15 +11,20 @@ iexec init factorial # download and init factorial dapp iexec init echo # download and init echo dapp ``` -Start a Pull Request with your code onto a new branch of this repo to let other developers discover it by running ```iexec init yourDappName```. +Start a [Pull Request](https://github.com/iExecBlockchainComputing/iexec-dapp-samples/pulls) to add you dapp to this repo. -Finally, you should checkout the [iExec Dapp Challenge](https://medium.com/iex-ec/the-iexec-%C3%B0app-challenge-150k-of-grants-to-win-abf6798b31ee) as well as submit us a request to be listed on the [iExec dapp store](https://dapps.iex.ec/) +## [iExec Dapp Challenge](https://medium.com/iex-ec/the-iexec-%C3%B0app-challenge-150k-of-grants-to-win-abf6798b31ee) ---------------- + * Go checkout the [iExec Dapp Challenge](https://medium.com/iex-ec/the-iexec-%C3%B0app-challenge-150k-of-grants-to-win-abf6798b31ee) + * Go submit a request to be listed on the [iExec dapp store](https://dapps.iex.ec/) + +--- # My Dapp name ## Description My Dapp description here... ## Howto +How it works... +## Example ```bash # ... # ... From 4b16baa7867e9ab4b4e11c451465bb9f376531ba Mon Sep 17 00:00:00 2001 From: francois branciard Date: Wed, 20 Dec 2017 17:18:11 +0100 Subject: [PATCH 25/38] update init dapp readme --- README.md | 14 +- build/contracts/MyContract.json | 436 ++++++++++++++++++++++++++++++++ 2 files changed, 440 insertions(+), 10 deletions(-) create mode 100644 build/contracts/MyContract.json diff --git a/README.md b/README.md index eff9ac8..e89b76d 100644 --- a/README.md +++ b/README.md @@ -22,13 +22,7 @@ Start a [Pull Request](https://github.com/iExecBlockchainComputing/iexec-dapp-sa # My Dapp name ## Description My Dapp description here... -## Howto -How it works... -## Example -```bash -# ... -# ... -``` -## Checklist - * add license - * author name +## Dapp params +An examples of a iexec.js conf +## [Examples](./examples) +A like to all iexec.js conf examples for the dapp. diff --git a/build/contracts/MyContract.json b/build/contracts/MyContract.json new file mode 100644 index 0000000..eda0a85 --- /dev/null +++ b/build/contracts/MyContract.json @@ -0,0 +1,436 @@ +{ + "contractName": "MyContract", + "abi": [ + { + "constant": false, + "inputs": [ + { + "name": "submitTxHash", + "type": "bytes32" + }, + { + "name": "user", + "type": "address" + }, + { + "name": "stdout", + "type": "string" + }, + { + "name": "uri", + "type": "string" + } + ], + "name": "iexecSubmitCallback", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "DAPP_PRICE", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "param", + "type": "string" + } + ], + "name": "iexecSubmit", + "outputs": [], + "payable": true, + "stateMutability": "payable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "DAPP_NAME", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "name": "_iexecOracleAddress", + "type": "address" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "submitTxHash", + "type": "bytes32" + }, + { + "indexed": true, + "name": "user", + "type": "address" + }, + { + "indexed": false, + "name": "stdout", + "type": "string" + }, + { + "indexed": false, + "name": "uri", + "type": "string" + } + ], + "name": "IexecSubmitCallback", + "type": "event" + } + ], + "bytecode": "0x6060604052341561000f57600080fd5b60405160208061076c833981016040528080519060200190919050508060006040805190810160405280600481526020017f696e6974000000000000000000000000000000000000000000000000000000008152506000836000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff16635993ef5384846000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610162578082015181840152602081019050610147565b50505050905090810190601f16801561018f5780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b15156101ae57600080fd5b6102c65a03f115156101bf57600080fd5b5050506040518051905015156101d457600080fd5b5050505050610584806101e86000396000f300606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806310a9f201146100675780633c0aef301461014b5780638cd213b914610174578063c878f958146101c6575b600080fd5b341561007257600080fd5b61013160048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610254565b604051808215151515815260200191505060405180910390f35b341561015657600080fd5b61015e6103ed565b6040518082815260200191505060405180910390f35b6101c4600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506103f2565b005b34156101d157600080fd5b6101d961051f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102195780820151818401526020810190506101fe565b50505050905090810190601f1680156102465780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156102b157600080fd5b8373ffffffffffffffffffffffffffffffffffffffff167f68d2eaa37ea3e53bbe55f11eb038084f280086b8f4c4552dbca1b5692efeb9138685856040518084600019166000191681526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561033e578082015181840152602081019050610323565b50505050905090810190601f16801561036b5780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b838110156103a4578082015181840152602081019050610389565b50505050905090810190601f1680156103d15780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a260019050949350505050565b600081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663d99a8dc334846000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825283818151815260200191508051906020019080838360005b838110156104aa57808201518184015260208101905061048f565b50505050905090810190601f1680156104d75780820380516001836020036101000a031916815260200191505b50925050506020604051808303818588803b15156104f457600080fd5b6125ee5a03f1151561050557600080fd5b5050505060405180519050151561051b57600080fd5b5050565b6040805190810160405280600481526020017f696e697400000000000000000000000000000000000000000000000000000000815250815600a165627a7a723058203ad58bfd842836fbab63e8da1c58eacc04f060ed5ec703ac1d057a1a060c776e0029", + "deployedBytecode": "0x606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806310a9f201146100675780633c0aef301461014b5780638cd213b914610174578063c878f958146101c6575b600080fd5b341561007257600080fd5b61013160048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610254565b604051808215151515815260200191505060405180910390f35b341561015657600080fd5b61015e6103ed565b6040518082815260200191505060405180910390f35b6101c4600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506103f2565b005b34156101d157600080fd5b6101d961051f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102195780820151818401526020810190506101fe565b50505050905090810190601f1680156102465780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156102b157600080fd5b8373ffffffffffffffffffffffffffffffffffffffff167f68d2eaa37ea3e53bbe55f11eb038084f280086b8f4c4552dbca1b5692efeb9138685856040518084600019166000191681526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561033e578082015181840152602081019050610323565b50505050905090810190601f16801561036b5780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b838110156103a4578082015181840152602081019050610389565b50505050905090810190601f1680156103d15780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a260019050949350505050565b600081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663d99a8dc334846000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825283818151815260200191508051906020019080838360005b838110156104aa57808201518184015260208101905061048f565b50505050905090810190601f1680156104d75780820380516001836020036101000a031916815260200191505b50925050506020604051808303818588803b15156104f457600080fd5b6125ee5a03f1151561050557600080fd5b5050505060405180519050151561051b57600080fd5b5050565b6040805190810160405280600481526020017f696e697400000000000000000000000000000000000000000000000000000000815250815600a165627a7a723058203ad58bfd842836fbab63e8da1c58eacc04f060ed5ec703ac1d057a1a060c776e0029", + "sourceMap": "86:254:0:-;;;223:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;288:19;164:1;319:9;;;;;;;;;;;;;;;;;;426:23:3;397:19;378:18;;:38;;;;;;;;;;;;;;;;;;464:18;;;;;;;;;;;426:57;;501:11;:35;;;537:9;547:8;501:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;493:64:3;;;;;;;;272:292;;;;223:114:0;86:254;;;;;;", + "deployedSourceMap": "86:254:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;761:252:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;130:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;570:185:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;171:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;761:252:3;870:4;907:18;;;;;;;;;;;893:32;;:10;:32;;;885:41;;;;;;;;969:4;936:49;;;956:12;974:6;981:3;936:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1002:4:3;995:11;;761:252;;;;;;:::o;130:35:0:-;164:1;130:35;:::o;570:185:3:-;630:23;668:18;;;;;;;;;;;630:57;;705:11;:18;;;730:9;741:5;705:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;697:51:3;;;;;;;;570:185;;:::o;171:41:0:-;;;;;;;;;;;;;;;;;;;;:::o", + "source": "pragma solidity ^0.4.11;\nimport \"iexec-oracle-contract/contracts/IexecOracleAPI.sol\";\ncontract MyContract is IexecOracleAPI{\n\n uint public constant DAPP_PRICE = 0;\n string public constant DAPP_NAME = \"init\";\n \n function MyContract (address _iexecOracleAddress) IexecOracleAPI(_iexecOracleAddress,DAPP_PRICE,DAPP_NAME){\n\n }\n\n}\n", + "sourcePath": "/home/vagrant/iexecdev/iexec-init/contracts/MyContract.sol", + "ast": { + "attributes": { + "absolutePath": "/home/vagrant/iexecdev/iexec-init/contracts/MyContract.sol", + "exportedSymbols": { + "MyContract": [ + 22 + ] + } + }, + "children": [ + { + "attributes": { + "literals": [ + "solidity", + "^", + "0.4", + ".11" + ] + }, + "id": 1, + "name": "PragmaDirective", + "src": "0:24:0" + }, + { + "attributes": { + "SourceUnit": 795, + "absolutePath": "iexec-oracle-contract/contracts/IexecOracleAPI.sol", + "file": "iexec-oracle-contract/contracts/IexecOracleAPI.sol", + "scope": 23, + "symbolAliases": [ + null + ], + "unitAlias": "" + }, + "id": 2, + "name": "ImportDirective", + "src": "25:60:0" + }, + { + "attributes": { + "contractDependencies": [ + 794 + ], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": true, + "linearizedBaseContracts": [ + 22, + 794 + ], + "name": "MyContract", + "scope": 23 + }, + "children": [ + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "contractScope": null, + "name": "IexecOracleAPI", + "referencedDeclaration": 794, + "type": "contract IexecOracleAPI" + }, + "id": 3, + "name": "UserDefinedTypeName", + "src": "109:14:0" + } + ], + "id": 4, + "name": "InheritanceSpecifier", + "src": "109:14:0" + }, + { + "attributes": { + "constant": true, + "name": "DAPP_PRICE", + "scope": 22, + "stateVariable": true, + "storageLocation": "default", + "type": "uint256", + "visibility": "public" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 5, + "name": "ElementaryTypeName", + "src": "130:4:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "30", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 0", + "value": "0" + }, + "id": 6, + "name": "Literal", + "src": "164:1:0" + } + ], + "id": 7, + "name": "VariableDeclaration", + "src": "130:35:0" + }, + { + "attributes": { + "constant": true, + "name": "DAPP_NAME", + "scope": 22, + "stateVariable": true, + "storageLocation": "default", + "type": "string memory", + "visibility": "public" + }, + "children": [ + { + "attributes": { + "name": "string", + "type": "string storage pointer" + }, + "id": 8, + "name": "ElementaryTypeName", + "src": "171:6:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "696e6974", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "string", + "type": "literal_string \"init\"", + "value": "init" + }, + "id": 9, + "name": "Literal", + "src": "206:6:0" + } + ], + "id": 10, + "name": "VariableDeclaration", + "src": "171:41:0" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": true, + "name": "MyContract", + "payable": false, + "scope": 22, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "_iexecOracleAddress", + "scope": 21, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 11, + "name": "ElementaryTypeName", + "src": "244:7:0" + } + ], + "id": 12, + "name": "VariableDeclaration", + "src": "244:27:0" + } + ], + "id": 13, + "name": "ParameterList", + "src": "243:29:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 19, + "name": "ParameterList", + "src": "329:0:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 794, + "type": "type(contract IexecOracleAPI)", + "value": "IexecOracleAPI" + }, + "id": 14, + "name": "Identifier", + "src": "273:14:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 12, + "type": "address", + "value": "_iexecOracleAddress" + }, + "id": 15, + "name": "Identifier", + "src": "288:19:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 7, + "type": "uint256", + "value": "DAPP_PRICE" + }, + "id": 16, + "name": "Identifier", + "src": "308:10:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 10, + "type": "string memory", + "value": "DAPP_NAME" + }, + "id": 17, + "name": "Identifier", + "src": "319:9:0" + } + ], + "id": 18, + "name": "ModifierInvocation", + "src": "273:56:0" + }, + { + "attributes": { + "statements": [ + null + ] + }, + "children": [], + "id": 20, + "name": "Block", + "src": "329:8:0" + } + ], + "id": 21, + "name": "FunctionDefinition", + "src": "223:114:0" + } + ], + "id": 22, + "name": "ContractDefinition", + "src": "86:254:0" + } + ], + "id": 23, + "name": "SourceUnit", + "src": "0:341:0" + }, + "compiler": { + "name": "solc", + "version": "0.4.18+commit.9cf6e910.Emscripten.clang" + }, + "networks": {}, + "schemaVersion": "1.0.1", + "updatedAt": "2017-12-20T16:10:37.901Z" +} \ No newline at end of file From 2d2e8613f16ee07417cdac77d7bec6c4d4688cff Mon Sep 17 00:00:00 2001 From: francois branciard Date: Wed, 20 Dec 2017 17:19:49 +0100 Subject: [PATCH 26/38] update init dapp readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e89b76d..0b0e6dc 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,6 @@ Start a [Pull Request](https://github.com/iExecBlockchainComputing/iexec-dapp-sa ## Description My Dapp description here... ## Dapp params -An examples of a iexec.js conf +An example of a iexec.js conf ## [Examples](./examples) -A like to all iexec.js conf examples for the dapp. +A link to all iexec.js conf examples for the dapp. From 11fc1141a5b6e4e3ba27f58fc4841a02ce0a4a14 Mon Sep 17 00:00:00 2001 From: francois branciard Date: Wed, 20 Dec 2017 17:20:27 +0100 Subject: [PATCH 27/38] update init dapp readme --- examples/iexec-cmdline-10.js | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 examples/iexec-cmdline-10.js diff --git a/examples/iexec-cmdline-10.js b/examples/iexec-cmdline-10.js new file mode 100644 index 0000000..7d6b547 --- /dev/null +++ b/examples/iexec-cmdline-10.js @@ -0,0 +1,11 @@ +module.exports = { + name: 'MyContract', + data: { + type: 'BINARY', + cpu: 'AMD64', + os: 'LINUX', + }, + work: { + cmdline: '10', + } +}; From 0a8fa65caa17dcc69c93a759a1a03874d5f7b9e5 Mon Sep 17 00:00:00 2001 From: victor Date: Thu, 25 Jan 2018 11:52:41 +0100 Subject: [PATCH 28/38] remove lock --- package-lock.json | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index daa1bed..0000000 --- a/package-lock.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "iexec-dapp-init", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "iexec-oracle-contract": { - "version": "github:iExecBlockchainComputing/iexec-oracle-contract#64d31fa289acdd1a1f4a4c1d9426b9f610134a94" - } - } -} From af5bc629254993d823dc41ebf858ea67f3ad6b68 Mon Sep 17 00:00:00 2001 From: setzeus Date: Wed, 31 Jan 2018 20:32:10 -0500 Subject: [PATCH 29/38] Initial Commit EthScholar pre PR 0 --- README.md | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0b0e6dc..3dbe965 100644 --- a/README.md +++ b/README.md @@ -20,8 +20,38 @@ Start a [Pull Request](https://github.com/iExecBlockchainComputing/iexec-dapp-sa --- # My Dapp name +EthScholar + ## Description -My Dapp description here... +EthScholar is a continuous scholarship & grant contest ran on the Ethereum blockchain & powered by iExec. + +## Intro & High-Level Summary +The purpose of the dapp is to periodically host & award decentralized scholarships & grants to applicants anywhere in the world through Ether donations. When the scholarship or grant smart contract conditions are met, funds are automatically released to the winning applicant. EthScholar initially aims to impact the following five global issues: + + - Environmental Studies + - Underdeveloped Countries + - Art & Culture Studies + - Underrepresented Communities + - Philanthropic Efforts + +By creating a customizable, social, & transparent way to donate directly to an individual’s education, EthScholar hopes to provide a much-needed facelift to the current education charity space. + +This application is submitted by the SetOcean team, a blockchain & mixed realities agency-incubator based in sunny Fort Lauderdale, Florida. The following five team members could be involved in wide-ranging capacities from technical adviser to full-time: + +Jesus Najera - Product designer & learning blockchain engineer: https://github.com/setzeus +Oscar Lafarga - Product manager, lead tech, & full-stack dev: https://github.com/otech47 +Balin Sinnott - Swift & kotlin senior engineer: https://github.com/bsin1 +Bernardo Garciarivas - Senior frontend-engineer: https://github.com/brgarciarivas +Jordan Bruner - Web backend & API engineer: https://github.com/jordanbruner13 + +## Detailed Overview +The standard smart contract in EthScholar dapp is the Scholarship contract. But our dapp exists as a chain of less common EthScholar contracts. An EthScholar contract, or block, in simple terms, is a block of x batched Scholarship contracts. At the beginning, this x is represented by the initial themes within EthScholar, which is a total of five referenced in the previous paragraph but is likely to change. + +A Scholarship contract, on the other hand, is quite in-depth. A scholarship contract has three significantly different states: upcoming, live & historical. An upcoming Scholarship contract accepts donations from donors who are particularly interested in crafting the conditions for future applicants such as application essay length; at this point in time scholars cannot submit applications. A live Scholarship is open for scholars to submit applications & is going to be a part of the next EthScholar block committed to our dapp; additionally, a live Scholarship is open to donations from donors at a lower donor fee than an upcoming Scholarship. Lastly, after a Scholarship contract is finally committed within an EthScholar contract to our dapp’s blockchain, its state is changed to historical. A historical Scholarship contract is a contract that has released all donations & accompanying bonus pool to applicants. + +Additionally, both the EthScholar contract & each individual Scholarship contract have a built-in bonus pool fund. Once the team’s breakeven donation revenue is met, all additional donations for the current upcoming and/or live state Scholarship contracts are programmatically distributed to both the EthScholar contract & the underlying Scholarship contracts. 50% of additional donations are locked into the EthScholar contract; 50% of additional donations are distributed equally & locked into the underlying Scholarship contracts. The EthScholar bonus pool fund, once the block is committed, is distributed to all applicants in the most popular underlying Scholarship contract (by theme); the Scholarship contract bonus pools are distributed to the winning applications in each respective theme. + + ## Dapp params An example of a iexec.js conf ## [Examples](./examples) From 31201a0c77169760249ca2b82d714fbc36ab218b Mon Sep 17 00:00:00 2001 From: setzeus Date: Wed, 31 Jan 2018 20:33:20 -0500 Subject: [PATCH 30/38] Updated list pre PR 1 --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 3dbe965..3ab2f86 100644 --- a/README.md +++ b/README.md @@ -38,11 +38,11 @@ By creating a customizable, social, & transparent way to donate directly to an i This application is submitted by the SetOcean team, a blockchain & mixed realities agency-incubator based in sunny Fort Lauderdale, Florida. The following five team members could be involved in wide-ranging capacities from technical adviser to full-time: -Jesus Najera - Product designer & learning blockchain engineer: https://github.com/setzeus -Oscar Lafarga - Product manager, lead tech, & full-stack dev: https://github.com/otech47 -Balin Sinnott - Swift & kotlin senior engineer: https://github.com/bsin1 -Bernardo Garciarivas - Senior frontend-engineer: https://github.com/brgarciarivas -Jordan Bruner - Web backend & API engineer: https://github.com/jordanbruner13 + - Jesus Najera: product designer & learning blockchain engineer: https://github.com/setzeus + - Oscar Lafarga: product manager, lead tech, & full-stack dev: https://github.com/otech47 + - Balin Sinnott: swift & kotlin senior engineer: https://github.com/bsin1 + - Bernardo Garciarivas: senior frontend-engineer: https://github.com/brgarciarivas + - Jordan Bruner: web backend & API engineer: https://github.com/jordanbruner13 ## Detailed Overview The standard smart contract in EthScholar dapp is the Scholarship contract. But our dapp exists as a chain of less common EthScholar contracts. An EthScholar contract, or block, in simple terms, is a block of x batched Scholarship contracts. At the beginning, this x is represented by the initial themes within EthScholar, which is a total of five referenced in the previous paragraph but is likely to change. From 4dee3814ec543171208f03a9598b93bf4e92010a Mon Sep 17 00:00:00 2001 From: setzeus Date: Wed, 31 Jan 2018 20:41:56 -0500 Subject: [PATCH 31/38] Adding text content pre PR 2 --- README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/README.md b/README.md index 3ab2f86..d1bc7c4 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,24 @@ A Scholarship contract, on the other hand, is quite in-depth. A scholarship cont Additionally, both the EthScholar contract & each individual Scholarship contract have a built-in bonus pool fund. Once the team’s breakeven donation revenue is met, all additional donations for the current upcoming and/or live state Scholarship contracts are programmatically distributed to both the EthScholar contract & the underlying Scholarship contracts. 50% of additional donations are locked into the EthScholar contract; 50% of additional donations are distributed equally & locked into the underlying Scholarship contracts. The EthScholar bonus pool fund, once the block is committed, is distributed to all applicants in the most popular underlying Scholarship contract (by theme); the Scholarship contract bonus pools are distributed to the winning applications in each respective theme. +## Example Walkthrough +In order to forego additional complexity associated with origin blocks, our following example will be for the second EthScholar smart contract recorded in our dapp. At the beginning, Scholarships will change states & automatically commit to the EthScholar dapp every 60,000 Ethereum network blocks. We chose 60,000 blocks as an initial condition because given an average Ethereum block confirmation time of ~20 seconds 60,000 blocks is approximately two weeks (24*60*60*14/20). +Before second block is committed (~ two weeks) + +Let’s say the EthScholar dapp origin block (EthScholar smart contract #0) was committed alongside Ethereum block #4984541. At the beginning, by default, we’re assigning an EthScholar smart contract a block time of 60,000 Ethereum blocks. Meaning EthScholar smart contract #1 will automatically be committed when the Ethereum block #5044541 is committed. +During these two weeks, a batch of five Scholarship smart contracts that initially differentiate only by their theme go through two separate states respectively: upcoming & live. The first state for our five Scholarship contracts, upcoming, changes happen halfway through the two weeks -- one week, or, 30,000 blocks after the previous EtherScholar contract was last committed to be exact. + +Upcoming State +In the Upcoming State, the five Scholarship smart contracts accept Donor ether, accept an input from Donors for Scholarship conditions (such as voting via web-ui radio buttons), & update accordingly. +For our example, let’s say Donor Alice, a big climate change activist, wants to contribute to the Environmental Studies (ES) Scholarship contract both financially & by deciding the criteria for future applicants. Alice, through the EthScholar web app, goes to the ES Scholarship #1 contract, which is in an upcoming state & selects a button that says “Donate & Shape.” She sends 100 ether to an address along with a vote on the Scholarship condition minimal length of main application essay paying a fee of 10%; her “weight” towards her vote in the Scholarship condition is tied to the amount of ether she sent out of the total amount the ES Scholarship currently holds. The ether she sent now lives in the ES Scholarship contract, let’s also assume that her donation fee alone covers our burn rate, so any additional donations now go into the bonus pool funds. Approximately a week later, the state for the ES Scholarship #1 changes from “upcoming” to “live.” + +Live State + In the later Live State, the five Scholarship smart contracts accepts Donor ether, accepts Scholar applications, & updates accordingly. There are now only 30K Ethereum blocks remaining until the next EthScholar contract is submitted. + Continuing our last example, in it’s live state the ES Scholarship #1 now has some level funding, has a fixed set of conditions for applicants, & now accepts applications for potential scholars. For this example, let’s say we have a second Donor Bob & Scholar Carl. First, let’s say Scholar Carl applies to the ES Scholarship #1 contract by signing the contract with multiple inputs at a single; he does this by sending ether with the inputs packed in the message. The EthScholar fee covers his ether sent since we do not want applicants to pay for applying to scholarships. Next, Donor Bob checks the EthScholar web app, clicks on “live EthScholar Scholarships,” clicks into the “Environmental Studies” Scholarship & see Scholar Carls application. Donor Bob then donates to Scholar Carl by sending 10 ether attached with a message conveying the scholar of choice to the ES Scholarship #1; he pays a lower donation fee of 5%. Since Donor Alice’s donor fees covered the teams burn-rate, all of Donor Bob’s donor fee, .5 ether, is split with .25 ether going to the general EthScholar #1 contract bonus pool fund, & .25 ether distributed among the five underlying Scholarship contracts. This means our ES Scholarship #1 contract ends up receiving .05 ether into its bonus pool fund. + + Historical State +Exactly 60,000 Ethereum blocks after the EthScholarship Contract #0 (origin block) was committed, the second block, our example EthScholarship Contract #1 is committed to our EthScholarship dapp. The five Scholarship smart contracts are now changed to a state of historical. When a Scholarship contracts’ state is changed to historical, both the total donations & the bonus pool funds are released; the total donations are released to their respective applicants, & the bonus pool funds are released to the single “popular” winner per Scholarship theme. Accordingly, all five bonus pool funds are also released to all applicants within those Scholarship themes. + ## Dapp params An example of a iexec.js conf From c2dcd1d901eecf4aff400b8bc87a9509cb02ab1a Mon Sep 17 00:00:00 2001 From: setzeus Date: Wed, 31 Jan 2018 20:43:11 -0500 Subject: [PATCH 32/38] Fixing text --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d1bc7c4..81e4181 100644 --- a/README.md +++ b/README.md @@ -53,8 +53,8 @@ Additionally, both the EthScholar contract & each individual Scholarship contrac ## Example Walkthrough In order to forego additional complexity associated with origin blocks, our following example will be for the second EthScholar smart contract recorded in our dapp. At the beginning, Scholarships will change states & automatically commit to the EthScholar dapp every 60,000 Ethereum network blocks. We chose 60,000 blocks as an initial condition because given an average Ethereum block confirmation time of ~20 seconds 60,000 blocks is approximately two weeks (24*60*60*14/20). -Before second block is committed (~ two weeks) +Before second block is committed (~ two weeks) Let’s say the EthScholar dapp origin block (EthScholar smart contract #0) was committed alongside Ethereum block #4984541. At the beginning, by default, we’re assigning an EthScholar smart contract a block time of 60,000 Ethereum blocks. Meaning EthScholar smart contract #1 will automatically be committed when the Ethereum block #5044541 is committed. During these two weeks, a batch of five Scholarship smart contracts that initially differentiate only by their theme go through two separate states respectively: upcoming & live. The first state for our five Scholarship contracts, upcoming, changes happen halfway through the two weeks -- one week, or, 30,000 blocks after the previous EtherScholar contract was last committed to be exact. @@ -66,7 +66,7 @@ Live State In the later Live State, the five Scholarship smart contracts accepts Donor ether, accepts Scholar applications, & updates accordingly. There are now only 30K Ethereum blocks remaining until the next EthScholar contract is submitted. Continuing our last example, in it’s live state the ES Scholarship #1 now has some level funding, has a fixed set of conditions for applicants, & now accepts applications for potential scholars. For this example, let’s say we have a second Donor Bob & Scholar Carl. First, let’s say Scholar Carl applies to the ES Scholarship #1 contract by signing the contract with multiple inputs at a single; he does this by sending ether with the inputs packed in the message. The EthScholar fee covers his ether sent since we do not want applicants to pay for applying to scholarships. Next, Donor Bob checks the EthScholar web app, clicks on “live EthScholar Scholarships,” clicks into the “Environmental Studies” Scholarship & see Scholar Carls application. Donor Bob then donates to Scholar Carl by sending 10 ether attached with a message conveying the scholar of choice to the ES Scholarship #1; he pays a lower donation fee of 5%. Since Donor Alice’s donor fees covered the teams burn-rate, all of Donor Bob’s donor fee, .5 ether, is split with .25 ether going to the general EthScholar #1 contract bonus pool fund, & .25 ether distributed among the five underlying Scholarship contracts. This means our ES Scholarship #1 contract ends up receiving .05 ether into its bonus pool fund. - Historical State +Historical State Exactly 60,000 Ethereum blocks after the EthScholarship Contract #0 (origin block) was committed, the second block, our example EthScholarship Contract #1 is committed to our EthScholarship dapp. The five Scholarship smart contracts are now changed to a state of historical. When a Scholarship contracts’ state is changed to historical, both the total donations & the bonus pool funds are released; the total donations are released to their respective applicants, & the bonus pool funds are released to the single “popular” winner per Scholarship theme. Accordingly, all five bonus pool funds are also released to all applicants within those Scholarship themes. From cd622f4196f54e821b16d3c1d828e06edb959621 Mon Sep 17 00:00:00 2001 From: setzeus Date: Wed, 31 Jan 2018 20:44:17 -0500 Subject: [PATCH 33/38] Text fixes --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 81e4181..309f0d7 100644 --- a/README.md +++ b/README.md @@ -55,18 +55,22 @@ Additionally, both the EthScholar contract & each individual Scholarship contrac In order to forego additional complexity associated with origin blocks, our following example will be for the second EthScholar smart contract recorded in our dapp. At the beginning, Scholarships will change states & automatically commit to the EthScholar dapp every 60,000 Ethereum network blocks. We chose 60,000 blocks as an initial condition because given an average Ethereum block confirmation time of ~20 seconds 60,000 blocks is approximately two weeks (24*60*60*14/20). Before second block is committed (~ two weeks) + Let’s say the EthScholar dapp origin block (EthScholar smart contract #0) was committed alongside Ethereum block #4984541. At the beginning, by default, we’re assigning an EthScholar smart contract a block time of 60,000 Ethereum blocks. Meaning EthScholar smart contract #1 will automatically be committed when the Ethereum block #5044541 is committed. During these two weeks, a batch of five Scholarship smart contracts that initially differentiate only by their theme go through two separate states respectively: upcoming & live. The first state for our five Scholarship contracts, upcoming, changes happen halfway through the two weeks -- one week, or, 30,000 blocks after the previous EtherScholar contract was last committed to be exact. Upcoming State + In the Upcoming State, the five Scholarship smart contracts accept Donor ether, accept an input from Donors for Scholarship conditions (such as voting via web-ui radio buttons), & update accordingly. For our example, let’s say Donor Alice, a big climate change activist, wants to contribute to the Environmental Studies (ES) Scholarship contract both financially & by deciding the criteria for future applicants. Alice, through the EthScholar web app, goes to the ES Scholarship #1 contract, which is in an upcoming state & selects a button that says “Donate & Shape.” She sends 100 ether to an address along with a vote on the Scholarship condition minimal length of main application essay paying a fee of 10%; her “weight” towards her vote in the Scholarship condition is tied to the amount of ether she sent out of the total amount the ES Scholarship currently holds. The ether she sent now lives in the ES Scholarship contract, let’s also assume that her donation fee alone covers our burn rate, so any additional donations now go into the bonus pool funds. Approximately a week later, the state for the ES Scholarship #1 changes from “upcoming” to “live.” Live State + In the later Live State, the five Scholarship smart contracts accepts Donor ether, accepts Scholar applications, & updates accordingly. There are now only 30K Ethereum blocks remaining until the next EthScholar contract is submitted. Continuing our last example, in it’s live state the ES Scholarship #1 now has some level funding, has a fixed set of conditions for applicants, & now accepts applications for potential scholars. For this example, let’s say we have a second Donor Bob & Scholar Carl. First, let’s say Scholar Carl applies to the ES Scholarship #1 contract by signing the contract with multiple inputs at a single; he does this by sending ether with the inputs packed in the message. The EthScholar fee covers his ether sent since we do not want applicants to pay for applying to scholarships. Next, Donor Bob checks the EthScholar web app, clicks on “live EthScholar Scholarships,” clicks into the “Environmental Studies” Scholarship & see Scholar Carls application. Donor Bob then donates to Scholar Carl by sending 10 ether attached with a message conveying the scholar of choice to the ES Scholarship #1; he pays a lower donation fee of 5%. Since Donor Alice’s donor fees covered the teams burn-rate, all of Donor Bob’s donor fee, .5 ether, is split with .25 ether going to the general EthScholar #1 contract bonus pool fund, & .25 ether distributed among the five underlying Scholarship contracts. This means our ES Scholarship #1 contract ends up receiving .05 ether into its bonus pool fund. Historical State + Exactly 60,000 Ethereum blocks after the EthScholarship Contract #0 (origin block) was committed, the second block, our example EthScholarship Contract #1 is committed to our EthScholarship dapp. The five Scholarship smart contracts are now changed to a state of historical. When a Scholarship contracts’ state is changed to historical, both the total donations & the bonus pool funds are released; the total donations are released to their respective applicants, & the bonus pool funds are released to the single “popular” winner per Scholarship theme. Accordingly, all five bonus pool funds are also released to all applicants within those Scholarship themes. From 92f5d89d6ea4c27e899b9ec4a2c906922c6cf7ad Mon Sep 17 00:00:00 2001 From: setzeus Date: Wed, 31 Jan 2018 20:44:48 -0500 Subject: [PATCH 34/38] More text fixes --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 309f0d7..33f92bc 100644 --- a/README.md +++ b/README.md @@ -66,8 +66,8 @@ For our example, let’s say Donor Alice, a big climate change activist, wants t Live State - In the later Live State, the five Scholarship smart contracts accepts Donor ether, accepts Scholar applications, & updates accordingly. There are now only 30K Ethereum blocks remaining until the next EthScholar contract is submitted. - Continuing our last example, in it’s live state the ES Scholarship #1 now has some level funding, has a fixed set of conditions for applicants, & now accepts applications for potential scholars. For this example, let’s say we have a second Donor Bob & Scholar Carl. First, let’s say Scholar Carl applies to the ES Scholarship #1 contract by signing the contract with multiple inputs at a single; he does this by sending ether with the inputs packed in the message. The EthScholar fee covers his ether sent since we do not want applicants to pay for applying to scholarships. Next, Donor Bob checks the EthScholar web app, clicks on “live EthScholar Scholarships,” clicks into the “Environmental Studies” Scholarship & see Scholar Carls application. Donor Bob then donates to Scholar Carl by sending 10 ether attached with a message conveying the scholar of choice to the ES Scholarship #1; he pays a lower donation fee of 5%. Since Donor Alice’s donor fees covered the teams burn-rate, all of Donor Bob’s donor fee, .5 ether, is split with .25 ether going to the general EthScholar #1 contract bonus pool fund, & .25 ether distributed among the five underlying Scholarship contracts. This means our ES Scholarship #1 contract ends up receiving .05 ether into its bonus pool fund. +In the later Live State, the five Scholarship smart contracts accepts Donor ether, accepts Scholar applications, & updates accordingly. There are now only 30K Ethereum blocks remaining until the next EthScholar contract is submitted. +Continuing our last example, in it’s live state the ES Scholarship #1 now has some level funding, has a fixed set of conditions for applicants, & now accepts applications for potential scholars. For this example, let’s say we have a second Donor Bob & Scholar Carl. First, let’s say Scholar Carl applies to the ES Scholarship #1 contract by signing the contract with multiple inputs at a single; he does this by sending ether with the inputs packed in the message. The EthScholar fee covers his ether sent since we do not want applicants to pay for applying to scholarships. Next, Donor Bob checks the EthScholar web app, clicks on “live EthScholar Scholarships,” clicks into the “Environmental Studies” Scholarship & see Scholar Carls application. Donor Bob then donates to Scholar Carl by sending 10 ether attached with a message conveying the scholar of choice to the ES Scholarship #1; he pays a lower donation fee of 5%. Since Donor Alice’s donor fees covered the teams burn-rate, all of Donor Bob’s donor fee, .5 ether, is split with .25 ether going to the general EthScholar #1 contract bonus pool fund, & .25 ether distributed among the five underlying Scholarship contracts. This means our ES Scholarship #1 contract ends up receiving .05 ether into its bonus pool fund. Historical State From 8930e7cc92dcc44b1f0db31a51c2713398807bab Mon Sep 17 00:00:00 2001 From: setzeus Date: Wed, 31 Jan 2018 20:47:43 -0500 Subject: [PATCH 35/38] Added text content --- README.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/README.md b/README.md index 33f92bc..8accc7e 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,50 @@ Historical State Exactly 60,000 Ethereum blocks after the EthScholarship Contract #0 (origin block) was committed, the second block, our example EthScholarship Contract #1 is committed to our EthScholarship dapp. The five Scholarship smart contracts are now changed to a state of historical. When a Scholarship contracts’ state is changed to historical, both the total donations & the bonus pool funds are released; the total donations are released to their respective applicants, & the bonus pool funds are released to the single “popular” winner per Scholarship theme. Accordingly, all five bonus pool funds are also released to all applicants within those Scholarship themes. +## Roadmap +EthScholar Goal +The goal of the iExec grant is to provide enough runway to allow the SetOcean team to allocate two full-time (40 hr / week) contractors to build EthScholar to the point that it’s self-funded. We do not plan on scaling or selling this as a business - this is merely an idea we’d be privileged to work on simply covering our expenses. + +To that end, this means that by the end of month nine of kickoff, EthScholar must bring in enough revenue to cover our staffing & operational costs. Let’s approximate this monthly as two full-time employees (2 * $3.25K) & one part-time contractor ($1.5K), plus splitting our current office lease ($1K), plus a couple grand of operational expenses such as hosting, utilities & equipment ($1K). This roughly equals $10K. + +Therefore the goal of the iExec grant is to build & scale EthScholar, a scholarship charity dapp, to the point that monthly revenues are approximately ~$12.5K ($2.5K buffer). Since we’re essentially not looking to increase monthly margins, it might make sense to scale this number only as the team scales. Once our monthly burn is reached, the rest of the “donor fee” is added to the EthScholar & Scholarship bonus pool fund. + +We propose an initial donation % fee of 10% which means that in order to hit our goal of self-sustaining dapp we’d need monthly donations of approximately $100K. We will decrease this team % as demand increases but for this roadmap the goal is to reach a self-sustaining model first without seeking additional financing. The goal is to hit this monthly donation figure of $100K in the month of May. The $100K in monthly donations will be a direct function of (donors) * (avg. donation). We propose the timeline listed below: + +Feb. 1st - Mar. 31st Design, Engineer, Test & Deploy on Testnet Alpha (v0.0 - v0.9) +Apr 1st - Apr 30th EthScholarhips live & committed every 1000 Eth blocks (~2 weeks). Beta (v1.0 - 1.9) +May 1st - May 31st Marketable MVP & Product/Market Fit MVP (v2.0 - 2.9) +June 1st - Sept 30th Multi-lingual support, video applications, & donor-to-scholar messaging (3.0 - 3.9) +Oct 1st - Dec 31st Auto-generated tax donor Form 8283s for donor’s benefit. (4.0 - 4.9) +Alpha (February 1st - March 31st) + +Two Months to Design, Engineer, Test & Deploy on Testnet + +The goal of this phase to successfully deploy (on a testnet) the EthScholar dapp that passes all user-tests & Truffletests. + +The resources allocated for this phase will be one full-time blockchain engineer/product designer ($3250/M) & one part-time full-stack engineer/PM ($1500/M). In addition to shared office space, operations & shared technical resources ($500/M). + +$5.25K / Month * 2 ~ $10.5K for Alpha Phase + +Beta (April 16th - May 30th) +One Month Polishing & Deploying on Ethereum Network + +The goal of this phase is to successfully deploy the EthScholar origin block with an additional block committed with some ether donations released to at least five applications. The main EthScholar smart contract is live. EthScholarhips live & committed every 1000 Eth blocks + +The resources allocated for this phase will be one part-time blockchain engineer/product designer ($1625/M) & one part-time marketer/customer service rep ($1500/M). In addition to shared office space, operations & shared technical resources ($500/M). + +$3.625K / Month * 1 ~ $3.625K for MVP Phase + +3 Months Alpha & Beta MVP ~Total $14,125 + + +The goal is hit a breakeven total donation fee of $10K (Two full-time employees @ $3.5/M + One part-time @ $1.5/M + Operations & Marketing @ $1K + a $1K buffer). This donation fee is ideally as low as possible, however, in the beginning, it follows that in order to guarantee continued operations, we’ll need to err on the side of caution (possibly going up to 10%). Once the team’s breakeven number is met, the rest of EthScholar fees from incoming donations for the current round are added to the EthScholar bonus pool as well as the corresponding Scholarship contract bonus pool. + +For example, let’s say May, our first full, unassisted month in operations, goes way better than expected with $200K in total monthly donations. Since we were reasonably uncertain about covering our breakeven, we set a relatively high donation fee of 10%. With a monthly breakeven goal of 10K, this required a total monthly donations of only $100K. Does it make sense to only charge a donation fee to those who donate early? No. So what happens to the rest of the donation fees stemming from the additional $200K? Since the EthScholar team no longer needs those funds to operate, the extra $10K ($200K in donations * 10% donation fee - $10K) in donation fees are split in half & allocated to the current EthScholar contract bonus pool as well as their respective Scholarship contracts. $5K goes to the EthScholar contract & is awarded to the one of the five Scholarships that “wins” the current round; the second $5K is distributed evenly among all five Scholarships. + + + + ## Dapp params An example of a iexec.js conf From db8a4d5dc8794fa476b0bbb7ad7b1335c2cd8d32 Mon Sep 17 00:00:00 2001 From: setzeus Date: Wed, 31 Jan 2018 20:50:53 -0500 Subject: [PATCH 36/38] Formatting --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 8accc7e..89f5f08 100644 --- a/README.md +++ b/README.md @@ -83,12 +83,12 @@ Therefore the goal of the iExec grant is to build & scale EthScholar, a scholars We propose an initial donation % fee of 10% which means that in order to hit our goal of self-sustaining dapp we’d need monthly donations of approximately $100K. We will decrease this team % as demand increases but for this roadmap the goal is to reach a self-sustaining model first without seeking additional financing. The goal is to hit this monthly donation figure of $100K in the month of May. The $100K in monthly donations will be a direct function of (donors) * (avg. donation). We propose the timeline listed below: -Feb. 1st - Mar. 31st Design, Engineer, Test & Deploy on Testnet Alpha (v0.0 - v0.9) -Apr 1st - Apr 30th EthScholarhips live & committed every 1000 Eth blocks (~2 weeks). Beta (v1.0 - 1.9) -May 1st - May 31st Marketable MVP & Product/Market Fit MVP (v2.0 - 2.9) -June 1st - Sept 30th Multi-lingual support, video applications, & donor-to-scholar messaging (3.0 - 3.9) -Oct 1st - Dec 31st Auto-generated tax donor Form 8283s for donor’s benefit. (4.0 - 4.9) -Alpha (February 1st - March 31st) + - Feb. 1st - Mar. 31st Design, Engineer, Test & Deploy on Testnet Alpha (v0.0 - v0.9) + - Apr 1st - Apr 30th EthScholarhips live & committed every 1000 Eth blocks (~2 weeks). Beta (v1.0 - 1.9) + - May 1st - May 31st Marketable MVP & Product/Market Fit MVP (v2.0 - 2.9) + - June 1st - Sept 30th Multi-lingual support, video applications, & donor-to-scholar messaging (3.0 - 3.9) + - Oct 1st - Dec 31st Auto-generated tax donor Form 8283s for donor’s benefit. (4.0 - 4.9) + - Alpha (February 1st - March 31st) Two Months to Design, Engineer, Test & Deploy on Testnet From fbfc7a2cb2cf212c2f9106b6cdd3df713491c695 Mon Sep 17 00:00:00 2001 From: setzeus Date: Wed, 31 Jan 2018 20:53:53 -0500 Subject: [PATCH 37/38] Added image --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 89f5f08..1ea7385 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,7 @@ The goal is hit a breakeven total donation fee of $10K (Two full-time employees For example, let’s say May, our first full, unassisted month in operations, goes way better than expected with $200K in total monthly donations. Since we were reasonably uncertain about covering our breakeven, we set a relatively high donation fee of 10%. With a monthly breakeven goal of 10K, this required a total monthly donations of only $100K. Does it make sense to only charge a donation fee to those who donate early? No. So what happens to the rest of the donation fees stemming from the additional $200K? Since the EthScholar team no longer needs those funds to operate, the extra $10K ($200K in donations * 10% donation fee - $10K) in donation fees are split in half & allocated to the current EthScholar contract bonus pool as well as their respective Scholarship contracts. $5K goes to the EthScholar contract & is awarded to the one of the five Scholarships that “wins” the current round; the second $5K is distributed evenly among all five Scholarships. - +![alt tag](https://i.imgur.com/aPwGPgK.png) ## Dapp params From bca5a2d7844f712bd917474e9944bf4dd49a3560 Mon Sep 17 00:00:00 2001 From: setzeus Date: Wed, 31 Jan 2018 20:56:21 -0500 Subject: [PATCH 38/38] Add more images --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 1ea7385..81f7efb 100644 --- a/README.md +++ b/README.md @@ -117,6 +117,10 @@ For example, let’s say May, our first full, unassisted month in operations, go ![alt tag](https://i.imgur.com/aPwGPgK.png) +## Frontend Preview +![alt tag](https://i.imgur.com/PRP8Eiv.png) +![alt tag](https://i.imgur.com/CIQlGxp.png) + ## Dapp params An example of a iexec.js conf