Compare commits

..

2 Commits

Author SHA1 Message Date
bumi a75bcc6a59 Add configurable network name
This is required for the infura provider
2018-04-22 20:25:58 +02:00
bumi f5dc8f86cf Use infura hosted provider if web3 is not available
If the user does not have metamask or similar (no web3 provider is
availale) we will load data from the infura node.

No signer is available for the infura node but the ethers provider would
throw an error if we try to access it - so this moves the decision of
choosing the provider to the ethProvider function.
2018-04-22 18:41:51 +02:00
27 changed files with 4399 additions and 4835 deletions
+8 -9
View File
@@ -22,8 +22,7 @@ You will need the following things properly installed on your computer.
## Running / Development ## Running / Development
* `ember serve`
* `ember serve` - by default kredits-web connects to the Ethreum Kovan network
* Visit your app at [http://localhost:4200](http://localhost:4200). * Visit your app at [http://localhost:4200](http://localhost:4200).
* Visit your tests at [http://localhost:4200/tests](http://localhost:4200/tests). * Visit your tests at [http://localhost:4200/tests](http://localhost:4200/tests).
@@ -57,13 +56,13 @@ _(You need collaborator permissions on the 5apps Deploy project.)_
## Working with locally deployed contracts ## Working with locally deployed contracts
The smart contracts and their JavaScript wrapper library are developed in the The smart contracts and their JavaScript wrapper library are developed in the
[kredits-contracts](https://github.com/67P/kredits-contracts) repo/package. [truffle-kredits](https://github.com/67P/truffle-kredits) repo/package.
You can run `kredits-web` on your machine, against a local, simulated Ethereum You can run `kredits-web` on your machine, against a local, simulated Ethereum
network, provided e.g. by [ganache](http://truffleframework.com/ganache/) or network, provided e.g. by [ganache](http://truffleframework.com/ganache/) or
[ganache-cli](https://github.com/trufflesuite/ganache-cli). [ganache-cli](https://github.com/trufflesuite/ganache-cli).
[kredits-contracts](https://github.com/67P/kredits-contracts) holds all the tools [truffle-kredits](https://github.com/67P/truffle-kredits) holds all the tools
to start and set up such a simulated network, as well as to deploy smart to start and set up such a simulated network, as well as to deploy smart
contracts to it. contracts to it.
@@ -76,22 +75,22 @@ Run a local IPFS deamon in offline mode.
* Make sure CORS headers are configured. See [IPFS](#ipfs) for more info. * Make sure CORS headers are configured. See [IPFS](#ipfs) for more info.
* `ipfs daemon --offline` * `ipfs daemon --offline`
#### 2. kredits-contracts #### 2. truffle-kredits
Get your local Ethereum development node running. Get your local Ethereum development node running.
* Clone [kredits-contracts](https://github.com/67P/kredits-contracts) * Clone [truffle-kredits](https://github.com/67P/truffle-kredits)
* `npm install` * `npm install`
* `npm run ganache` - which is basically: `ganache-cli -p 7545 -i 100` (we use the non-default port for local networks and a fixed network id) * `npm run ganache` - which is basically: `ganache-cli -p 7545 -i 100` (we use the non-default port for local networks and a fixed network id)
* `npm run bootstrap` - bootstrap runs fresh migrations, adds some seed data and writes the address/abi information to JSON that will be used by kredits-web * `npm run bootstrap` - bootstrap runs fresh migrations, adds some seed data and writes the address/abi information to JSON that will be used by kredits-web
* `npm link` - make the `kredits-contracts` module linkable as `kredits-contracts` on your machine * `npm link` - make the `truffle-kredits` module linkable as `kredits-contracts` on your machine
#### 3. kredits-web #### 3. kredits-web
With IPFS and Ethereum/ganache running, you can now start this Ember app. With IPFS and Ethereum/ganache running, you can now start this Ember app.
* `npm link kredits-contracts` - link the local `kredits-contracts` package * `npm link kredits-contracts` - link the local `truffle-kredits` package (it will become `kredits-contracts` soon)
* `npm run start:local` - NETWORK_ID=100 and WEB3_PROVIDER_URL=http://localhost:7545 must be set for local settings * `npm start`
#### IPFS #### IPFS
@@ -1,59 +0,0 @@
import Component from '@ember/component';
import { computed } from '@ember/object';
let categoryColors = {
community: "#fb6868",
design: "#fbe468",
dev: "#e068fb",
docs: "#97fb68",
ops: "#8f68fb",
}
export default Component.extend({
contributions: null,
chartData: computed('contributions', function() {
let kredits = this.get('contributions')
.map(c => {
return { kind: c.kind, amount: c.amount }
}).reduce(function (kinds, c) {
kinds[c.kind] = (kinds[c.kind] || 0) + c.amount;
return kinds;
}, {});
return {
datasets: [{
data: [
kredits['community'],
kredits['design'],
kredits['dev'],
kredits['ops'],
kredits['docs'],
],
borderColor: [
categoryColors.community,
categoryColors.design,
categoryColors.dev,
categoryColors.ops,
categoryColors.docs,
],
borderWidth: 1
}],
labels: [
'Community',
'Design',
'Development',
'Operations & Infrastructure',
'Documentation'
],
}
}),
chartOptions: {
legend: {
display: false
}
}
});
@@ -1,7 +0,0 @@
<div class="chart">
{{ember-chart type='doughnut'
data=chartData
options=chartOptions
width=200
height=200}}
</div>
+9 -17
View File
@@ -1,20 +1,12 @@
{{#each proposals as |proposal|}} {{#each proposals as |proposal|}}
<li data-proposal-id={{proposal.id}} class={{if proposal.isExecuted "confirmed" "unconfirmed"}}> <li data-proposal-id={{proposal.id}} title="({{proposal.kind}}) {{proposal.description}}">
<p class="meta"> <span class="category {{proposal.kind}}">♥</span>
<span class="category {{proposal.kind}}">♥ ({{proposal.kind}})</span> <span class="amount">{{proposal.amount}}</span><span class="symbol">₭S</span>
<span class="recipient">{{proposal.contributor.name}}:</span> for <span class="recipient">{{proposal.contributor.name}}</span>
</p> <span class="votes">({{proposal.votesCount}}/{{proposal.votesNeeded}} votes)</span>
<p class="kredits-amount">
<span class="amount">{{proposal.amount}}</span><span class="symbol">₭S</span> {{#unless proposal.isExecuted}}
</p> <button {{action "confirm" proposal.id}}>+1</button>
<p class="description"> {{/unless}}
<span class="description">{{proposal.description}}</span>
</p>
<p class="voting">
{{#unless proposal.isExecuted}}
<span class="votes">({{proposal.votesCount}}/{{proposal.votesNeeded}} votes)</span>
<button {{action "confirm" proposal.id}}>+1</button>
{{/unless}}
</p>
</li> </li>
{{/each}} {{/each}}
-2
View File
@@ -1,6 +1,4 @@
import Controller from '@ember/controller'; import Controller from '@ember/controller';
import { inject as injectService } from '@ember/service';
export default Controller.extend({ export default Controller.extend({
kredits: injectService(),
}); });
+1
View File
@@ -7,6 +7,7 @@ const Router = EmberRouter.extend({
}); });
Router.map(function() { Router.map(function() {
this.route('spinner');
this.route('proposals', function() { this.route('proposals', function() {
this.route('new'); this.route('new');
}); });
+4
View File
@@ -0,0 +1,4 @@
import Route from '@ember/routing/route';
export default Route.extend({
});
+9 -19
View File
@@ -29,6 +29,7 @@ export default Service.extend({
return new RSVP.Promise((resolve) => { return new RSVP.Promise((resolve) => {
let ethProvider; let ethProvider;
let networkId; let networkId;
let networkName;
if (typeof window.web3 !== 'undefined') { if (typeof window.web3 !== 'undefined') {
console.debug('[kredits] Using user-provided instance, e.g. from Mist browser or Metamask'); console.debug('[kredits] Using user-provided instance, e.g. from Mist browser or Metamask');
networkId = parseInt(window.web3.version.network); networkId = parseInt(window.web3.version.network);
@@ -38,38 +39,27 @@ export default Service.extend({
); );
ethProvider.listAccounts().then((accounts) => { ethProvider.listAccounts().then((accounts) => {
this.set('currentUserAccounts', accounts); this.set('currentUserAccounts', accounts);
const ethSigner = accounts.length === 0 ? null : ethProvider.getSigner(); resolve(ethProvider, ethProvider.getSigner());
resolve({
ethProvider,
ethSigner
});
}); });
} else { } else {
console.debug('[kredits] Creating new instance from npm module class'); console.debug('[kredits] Creating new instance from npm module class');
networkId = parseInt(config.contractMetadata.networkId); networkId = parseInt(config.contractMetadata.networkId);
console.debug(`[kredits] networkId=${networkId} providerURL: ${config.web3ProviderUrl}`); networkName = config.contractMetadata.networkName;
ethProvider = new ethers.providers.JsonRpcProvider( console.log(networkName);
config.web3ProviderUrl, ethProvider = new ethers.providers.InfuraProvider({ chainId: networkId, name: networkName });
{ chainId: networkId } resolve(ethProvider, null);
);
resolve({
ethProvider: ethProvider,
ethSigner: null
});
} }
}); });
}, },
setup() { setup() {
return this.getEthProvider().then((providerAndSigner) => { return this.getEthProvider().then((ethProvider, ethSigner) => {
let kredits = new Kredits(ethProvider, ethSigner);
let kredits = new Kredits(providerAndSigner.ethProvider, providerAndSigner.ethSigner, {
ipfsConfig: config.ipfs
});
return kredits return kredits
.init() .init()
.then((kredits) => { .then((kredits) => {
this.set('kredits', kredits); this.set('kredits', kredits);
if (this.currentUserAccounts && this.currentUserAccounts.length > 0) { if (this.currentUserAccounts && this.currentUserAccounts.length > 0) {
this.getCurrentUser.then((contributorData) => { this.getCurrentUser.then((contributorData) => {
this.set('currentUser', contributorData); this.set('currentUser', contributorData);
+1 -14
View File
@@ -5,17 +5,4 @@ $green: #97fb68;
$yellow: #fbe468; $yellow: #fbe468;
$red: #fb6868; $red: #fb6868;
$primary-color: $blue; $primaryColor: $blue;
$body-text-color: #fff;
@mixin body-background {
background-image: linear-gradient(to bottom, rgba(22, 21, 40, .4), rgba(0, 0, 0, .75)), url('/img/bg.jpg');
background-repeat: none;
background-attachment: fixed;
}
#topbar {
background-color: rgba(255, 0, 255, .2);
}
+14 -36
View File
@@ -1,53 +1,31 @@
#topbar { section {
height: 3rem; @include outer-container;
} margin-bottom: 8rem;
main {
padding: 1rem;
&#index {
width: 100%;
display: grid;
grid-row-gap: 2rem;
grid-template-areas:
"stats"
"contributions";
}
}
@media (min-width: 550px) {
main {
&#index {
grid-column-gap: 4rem;
grid-row-gap: 2rem;
grid-template-columns: 2fr 4fr;
grid-template-areas:
"stats contributions";
}
}
}
main section {
margin-bottom: 5rem;
&:first-of-type { &:first-of-type {
margin-top: 2rem; margin-top: 6rem;
} }
@include media($mobile) { @include media($mobile) {
margin-bottom: 5rem; margin-bottom: 5rem;
&:first-of-type {
&#proposals-open, &#proposals-closed { margin-top: 2rem;
margin-top: 0;
} }
} }
header { header {
@include span-columns(12);
padding-bottom: 3rem; padding-bottom: 3rem;
text-align: center; text-align: center;
// background-color: purple;
@include media($mobile) { @include media($mobile) {
@include span-columns(10);
@include shift(1);
padding-bottom: 2rem; padding-bottom: 2rem;
} }
div.content {
@include span-columns(12);
}
} }
} }
+14 -30
View File
@@ -2,7 +2,6 @@
margin: 0; margin: 0;
padding: 0; padding: 0;
box-sizing: border-box; box-sizing: border-box;
font-size: 14px;
} }
*:hover, *:active, *:focus { *:hover, *:active, *:focus {
@@ -21,10 +20,13 @@
$font-family-sans: 'Open Sans', sans-serif; $font-family-sans: 'Open Sans', sans-serif;
body { body {
@include body-background; background-image: url('/img/bg.jpg');
background-repeat: none;
background-attachment: fixed;
font-family: $font-family-sans; font-family: $font-family-sans;
font-size: 14px;
font-weight: 300; font-weight: 300;
color: $body-text-color; color: #fff;
} }
@media screen and (min-width: 900px) { @media screen and (min-width: 900px) {
@@ -41,11 +43,14 @@ h1, h2, h3, h4, h5, input, button {
section { section {
h2 { h2 {
font-size: 1.4rem; font-size: 2.8rem;
color: $primary-color; color: $primaryColor;
@include media($mobile) {
font-size: 2rem;
}
} }
&#people { &#contributors {
.content { .content {
p.stats { p.stats {
padding-top: 3rem; padding-top: 3rem;
@@ -62,30 +67,18 @@ section {
} }
} }
&#contributions-by-type {
.chart {
width: 50%;
margin-left: auto;
margin-right: auto;
}
@include media($mobile) {
width: 90%;
}
}
&#proposals-open, &#proposals-closed { &#proposals-open, &#proposals-closed {
.actions { .actions {
padding-top: 3rem; padding-top: 3rem;
font-size: 1rem; font-size: 1rem;
color: $primary-color; color: $primaryColor;
text-align: center; text-align: center;
@include media($mobile) { @include media($mobile) {
padding-top: 2rem; padding-top: 2rem;
} }
a { a {
color: $primary-color; color: $primaryColor;
} }
} }
} }
@@ -95,7 +88,7 @@ button, input[type=submit] {
display: inline-block; display: inline-block;
border: 1px solid rgba(22, 21, 40, 1); border: 1px solid rgba(22, 21, 40, 1);
background-color: rgba(22, 21, 40, 0.6); background-color: rgba(22, 21, 40, 0.6);
color: $primary-color; color: $primaryColor;
border-radius: 3px; border-radius: 3px;
font-weight: 500; font-weight: 500;
text-transform: uppercase; text-transform: uppercase;
@@ -107,15 +100,6 @@ button, input[type=submit] {
} }
} }
@media (min-width: 550px) {
section {
h2 {
font-size: 2rem;
}
}
}
@import "components/topbar";
@import "components/loading-spinner"; @import "components/loading-spinner";
@import "components/contributor-list"; @import "components/contributor-list";
@import "components/add-contributor"; @import "components/add-contributor";
+1 -1
View File
@@ -9,7 +9,7 @@ section#add-contributor, section#add-proposal {
padding-top: 1rem; padding-top: 1rem;
text-align: center; text-align: center;
a { a {
color: $primary-color; color: $primaryColor;
margin-left: 1rem; margin-left: 1rem;
} }
} }
+1 -1
View File
@@ -22,7 +22,7 @@ table.contributor-list {
} }
a { a {
color: $primary-color; color: $primaryColor;
&:hover, &:active { &:hover, &:active {
color: #fff; color: #fff;
} }
+2 -2
View File
@@ -11,7 +11,7 @@
margin-top: 12rem; margin-top: 12rem;
text-align: center; text-align: center;
font-size: 1.4rem; font-size: 1.4rem;
color: $primary-color; color: $primaryColor;
@include media($mobile) { @include media($mobile) {
margin-top: 6rem; margin-top: 6rem;
@@ -23,7 +23,7 @@
margin-bottom: 2rem; margin-bottom: 2rem;
#path-comet { #path-comet {
fill: $primary-color; fill: $primaryColor;
opacity: 0.1; opacity: 0.1;
animation-name: pulse; animation-name: pulse;
+8 -76
View File
@@ -4,46 +4,16 @@ ul.proposal-list {
list-style: none; list-style: none;
li { li {
display: grid; // display: block;
grid-template-columns: auto 5rem; padding: 0 1.2rem;
grid-row-gap: 0.5rem; line-height: 4.2rem;
padding: 1rem 1.2rem;
background-color: rgba(255,255,255,0.1); background-color: rgba(255,255,255,0.1);
font-size: 1.2rem; font-size: 1.4rem;
border-bottom: 1px solid rgba(255,255,255,0.2); border-bottom: 1px solid rgba(255,255,255,0.2);
&:first-of-type { &:first-of-type {
border-top: 1px solid rgba(255,255,255,0.2); border-top: 1px solid rgba(255,255,255,0.2);
} }
p {
align-self: center;
margin: 0;
font-size: inherit;
line-height: 2rem;
&.kredits-amount, &.voting {
text-align: right;
}
&.description {
grid-column-start: span 2;
}
&.voting {
grid-column-start: span 2;
}
}
span {
font-size: inherit;
}
.description {
line-height: 1.4em;
font-size: 1rem;
}
.category { .category {
color: $blue; color: $blue;
padding-right: 0.2rem; padding-right: 0.2rem;
@@ -53,28 +23,26 @@ ul.proposal-list {
&.docs { color: $green; } &.docs { color: $green; }
&.ops { color: $purple; } &.ops { color: $purple; }
} }
.amount { .amount {
font-weight: 500; font-weight: 500;
} }
.symbol { .symbol {
font-size: 1rem; font-size: 1rem;
font-weight: 500; font-weight: 500;
padding-left: 0.2rem; padding-left: 0.2rem;
} }
.recipient { .recipient {
font-weight: 500; font-weight: 500;
} }
.votes { .votes {
font-size: 1rem; font-size: 1rem;
color: $primary-color; color: $primaryColor;
margin-right: 0.5rem; padding-left: 0.5rem;
} }
button { button {
float: right;
margin-top: 1.1rem;
height: 2rem; height: 2rem;
line-height: 2rem; line-height: 2rem;
padding: 0 0.6rem; padding: 0 0.6rem;
@@ -82,39 +50,3 @@ ul.proposal-list {
} }
} }
@media (min-width: 550px) {
ul.proposal-list {
li {
grid-template-columns: auto 10rem;
grid-row-gap: 0.5rem;
p {
&.kredits-amount, &.voting {
text-align: right;
}
}
&.unconfirmed {
p {
&.kredits-amount, &.voting {
text-align: right;
}
&.description {
grid-column-start: span 1;
}
&.voting {
grid-column-start: span 1;
}
}
}
.description {
font-size: inherit;
}
}
}
}
-15
View File
@@ -1,15 +0,0 @@
#topbar {
padding: 0 1rem;
line-height: 3rem;
background-color: rgba(0,0,0,.3);
h1 {
display: inline-block;
text-transform: uppercase;
}
section#user-account {
display: inline-block;
float: right;
}
}
+1 -1
View File
@@ -2,4 +2,4 @@
// $visual-grid-color: red; // $visual-grid-color: red;
// $visual-grid-index: front; // $visual-grid-index: front;
// $visual-grid-opacity: 0.5; // $visual-grid-opacity: 0.5;
$max-width: em(1200, 12); $max-width: em(500, 12);
+3 -16
View File
@@ -1,16 +1,3 @@
<header id="topbar"> <main>
<h1>Kosmos Kredits</h1> {{outlet}}
</main>
<section id="user-account">
{{#if kredits.hasAccounts }}
{{#if kredits.currentUser}}
{{kredits.currentUser.name}}
{{#if kredits.currentUserIsCore}}(core){{/if}}
{{/if}}
{{else}}
Anonymous
{{/if}}
</section>
</header>
{{outlet}}
+65 -65
View File
@@ -1,53 +1,39 @@
<main id="index"> {{#if kredits.hasAccounts }}
<section id="user-account">
<div id="stats"> {{#if kredits.currentUser }}
<section id="people"> {{ kredits.currentUser.name }}
<header> {{#if kredits.currentUserIsCore }}
<h2>Contributors</h2> (core)
</header> {{/if}}
<div class="content"> Account: {{kredits.currentUser.account}}
{{contributor-list contributors=contributorsSorted}}
<p class="stats">
<span class="number">{{await kredits.totalSupply}}</span> kredits issued and distributed among
<span class="number">{{contributorsWithKredits.length}}</span> contributors.
</p>
</div>
</section>
<section id="contributions-by-type">
<header>
<h2>Contributions by type</h2>
</header>
<div class="content">
{{chart-contributions-by-type contributions=proposals}}
</div>
</section>
</div>
<div id="contributions">
{{#if proposalsOpen}}
<section id="proposals-open">
<header>
<h2>Unconfirmed Contributions</h2>
</header>
<div class="content">
{{!-- TODO: We need a better naming for kredits.hasAccounts --}}
{{proposal-list proposals=proposalsOpenSorted
confirmProposal=(action "confirmProposal")
contractInteractionEnabled=kredits.hasAccounts}}
</div>
</section>
{{/if}} {{/if}}
</section>
{{/if}}
<section id="proposals-closed"> <section id="contributors">
<header> <header>
<h2>Confirmed Contributions</h2> <h2>Kosmos Contributors</h2>
</header> </header>
<div class="content"> <div class="content">
{{proposal-list proposals=proposalsClosedSorted {{contributor-list contributors=contributorsSorted}}
confirmProposal=(action "confirmProposal")}}
</div> <p class="stats">
<span class="number">{{await kredits.totalSupply}}</span> kredits issued and distributed among
<span class="number">{{contributorsWithKredits.length}}</span> contributors.
</p>
</div>
</section>
{{#if proposalsOpen}}
<section id="proposals-open">
<header>
<h2>Open Proposals</h2>
</header>
<div class="content">
{{!-- TODO: We need a better naming for kredits.hasAccounts --}}
{{proposal-list proposals=proposalsOpenSorted
confirmProposal=(action "confirmProposal")
contractInteractionEnabled=kredits.hasAccounts}}
{{!-- TODO: We need a better naming --}} {{!-- TODO: We need a better naming --}}
{{#if kredits.hasAccounts}} {{#if kredits.hasAccounts}}
@@ -55,23 +41,37 @@
{{#link-to 'proposals.new'}}Create new proposal{{/link-to}} {{#link-to 'proposals.new'}}Create new proposal{{/link-to}}
</p> </p>
{{/if}} {{/if}}
</section> </div>
</section>
{{/if}}
<section id="proposals-closed">
<header>
<h2>Closed Proposals</h2>
</header>
<div class="content">
{{proposal-list proposals=proposalsClosedSorted
confirmProposal=(action "confirmProposal")}}
{{!-- TODO: We need a better naming --}}
{{#if kredits.hasAccounts}}
<p class="actions">
{{#link-to 'proposals.new'}}Create new proposal{{/link-to}}
</p>
{{/if}}
</div> </div>
</section>
{{#if kredits.hasAccounts}} <section id="add-contributor">
<section id="add-contributor"> <header>
<header> <h2>Add Contributor</h2>
<h2>Add Contributor</h2> </header>
</header>
<div class="content"> <div class="content">
{{#if kredits.currentUser.isCore}} {{#if kredits.currentUser.isCore}}
{{add-contributor contributors=contributors save=(action 'save')}} {{add-contributor contributors=contributors save=(action 'save')}}
{{else}} {{else}}
Only core team members can add new contributors. Please ask someone to set you up. Only core team members can add new contributors. Please ask someone to set you up.
{{/if}} {{/if}}
</div> </div>
</section> </section>
{{/if}}
</main>
+1
View File
@@ -0,0 +1 @@
{{loading-spinner}}
+7 -4
View File
@@ -35,9 +35,9 @@ module.exports = function(environment) {
] ]
}, },
contractMetadata: { networkId: '42' }, contractMetadata: { networkId: '42', networkName: 'kovan' },
web3ProviderUrl: 'https://kovan.infura.io/keUVk6OMaAvpmRF3m57n', web3ProviderUrl: 'https://parity.kosmos.org:8545',
ipfs: { ipfs: {
host: 'ipfs.kosmos.org', host: 'ipfs.kosmos.org',
@@ -52,8 +52,8 @@ module.exports = function(environment) {
// ENV.APP.LOG_TRANSITIONS = true; // ENV.APP.LOG_TRANSITIONS = true;
// ENV.APP.LOG_TRANSITIONS_INTERNAL = true; // ENV.APP.LOG_TRANSITIONS_INTERNAL = true;
// ENV.APP.LOG_VIEW_LOOKUPS = true; // ENV.APP.LOG_VIEW_LOOKUPS = true;
ENV.contractMetadata['networkId'] = '42'; ENV.contractMetadata['networkId'] = '100';
ENV.web3ProviderUrl = 'https://kovan.infura.io/keUVk6OMaAvpmRF3m57n'; ENV.web3ProviderUrl = 'http://localhost:7545';
ENV.ipfs = { ENV.ipfs = {
host: 'localhost', host: 'localhost',
@@ -81,6 +81,9 @@ module.exports = function(environment) {
if (process.env.NETWORK_ID) { if (process.env.NETWORK_ID) {
ENV.contractMetadata['networkId'] = process.env.NETWORK_ID; ENV.contractMetadata['networkId'] = process.env.NETWORK_ID;
} }
if (process.env.NETWORK_NAME) {
ENV.contractMetadata['networkName'] = process.env.NETWORK_NAME;
}
if (process.env.WEB3_PROVIDER_URL) { if (process.env.WEB3_PROVIDER_URL) {
ENV.web3ProviderUrl = process.env.WEB3_PROVIDER_URL; ENV.web3ProviderUrl = process.env.WEB3_PROVIDER_URL;
} }
+4237 -4392
View File
File diff suppressed because it is too large Load Diff
+2 -3
View File
@@ -13,7 +13,7 @@
"scripts": { "scripts": {
"lint:js": "eslint ./*.js app config lib server tests", "lint:js": "eslint ./*.js app config lib server tests",
"start": "ember serve", "start": "ember serve",
"start:local": "NETWORK_ID=100 WEB3_PROVIDER_URL=http://localhost:7545 ember s", "kovan": "NETWORK_ID=42 ember serve",
"test": "ember test", "test": "ember test",
"build": "ember build", "build": "ember build",
"build-prod": "ember build --environment production", "build-prod": "ember build --environment production",
@@ -30,7 +30,6 @@
"ember-cli": "~3.1.2", "ember-cli": "~3.1.2",
"ember-cli-app-version": "^3.0.0", "ember-cli-app-version": "^3.0.0",
"ember-cli-babel": "^6.6.0", "ember-cli-babel": "^6.6.0",
"ember-cli-chart": "^3.4.0",
"ember-cli-dependency-checker": "^2.0.0", "ember-cli-dependency-checker": "^2.0.0",
"ember-cli-eslint": "^4.2.1", "ember-cli-eslint": "^4.2.1",
"ember-cli-htmlbars": "^2.0.1", "ember-cli-htmlbars": "^2.0.1",
@@ -52,7 +51,7 @@
"eslint-plugin-ember": "^5.0.0", "eslint-plugin-ember": "^5.0.0",
"ethers": "3.0.15", "ethers": "3.0.15",
"kosmos-schemas": "^1.1.2", "kosmos-schemas": "^1.1.2",
"kredits-contracts": "^3.x", "kredits-contracts": "github:67P/truffle-kredits",
"loader.js": "^4.2.3", "loader.js": "^4.2.3",
"tv4": "^1.3.0" "tv4": "^1.3.0"
}, },
@@ -1,29 +0,0 @@
import { module, test } from 'qunit';
import { setupRenderingTest } from 'ember-qunit';
import { render } from '@ember/test-helpers';
import hbs from 'htmlbars-inline-precompile';
module('Integration | Component | chart-contributions-by-type', function(hooks) {
setupRenderingTest(hooks);
let proposals = [
{ kind: 'dev', amount: 500 },
{ kind: 'dev', amount: 1500 },
{ kind: 'ops', amount: 1500 },
{ kind: 'design', amount: 5000 },
{ kind: 'ops', amount: 1500 },
{ kind: 'dev', amount: 5000 },
{ kind: 'community', amount: 5000 },
{ kind: 'docs', amount: 500 },
{ kind: 'docs', amount: 500 },
{ kind: 'docs', amount: 500 },
];
test('it renders', async function(assert) {
this.set('proposals', proposals);
await render(hbs`{{chart-contributions-by-type contributions=proposals}}`);
assert.equal(this.element.textContent.trim(), '');
});
});
@@ -1,37 +0,0 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Component | chart-contributions-by-type', function(hooks) {
setupTest(hooks);
let proposals = [
{ kind: 'dev', amount: 500 },
{ kind: 'dev', amount: 1500 },
{ kind: 'ops', amount: 1500 },
{ kind: 'design', amount: 5000 },
{ kind: 'ops', amount: 1500 },
{ kind: 'dev', amount: 5000 },
{ kind: 'community', amount: 5000 },
{ kind: 'docs', amount: 500 },
{ kind: 'docs', amount: 500 },
{ kind: 'docs', amount: 500 },
];
test('#chartData', function(assert) {
let component = this.owner.factoryFor('component:chart-contributions-by-type').create();
component.set('contributions', proposals);
let data = component.get('chartData');
assert.deepEqual(
data.labels,
['Community', 'Design', 'Development', 'Operations & Infrastructure', 'Documentation'],
'returns the correct labels'
);
assert.deepEqual(
data.datasets[0].data,
[5000, 5000, 7000, 3000, 1500],
'returns the correct kredit sums'
);
});
});
+11
View File
@@ -0,0 +1,11 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Route | spinner', function(hooks) {
setupTest(hooks);
test('it exists', function(assert) {
let route = this.owner.lookup('route:spinner');
assert.ok(route);
});
});