e7fa188797
This stores the GitHub username and UID in IPFS, and stores the resulting IPFS hash in the contract. Now we can remove the GitHub profile data from the contract entirely.
169 lines
5.3 KiB
JavaScript
169 lines
5.3 KiB
JavaScript
import Ember from 'ember';
|
|
import Web3 from 'npm:web3';
|
|
import config from 'kredits-web/config/environment';
|
|
import Contributor from 'kredits-web/models/contributor';
|
|
import Proposal from 'kredits-web/models/proposal';
|
|
import kreditsContracts from 'npm:kredits-contracts';
|
|
|
|
export default Ember.Service.extend({
|
|
|
|
ipfs: Ember.inject.service(),
|
|
|
|
web3Instance: null,
|
|
web3Provided: false, // Web3 provided (using Mist Browser, Metamask et al.)
|
|
|
|
web3: function() {
|
|
if (this.get('web3Instance')) {
|
|
return this.get('web3Instance');
|
|
}
|
|
|
|
let web3Instance;
|
|
|
|
if (typeof window.web3 !== 'undefined') {
|
|
Ember.Logger.debug('[kredits] Using user-provided instance, e.g. from Mist browser or Metamask');
|
|
web3Instance = window.web3;
|
|
this.set('web3Provided', true);
|
|
} else {
|
|
Ember.Logger.debug('[kredits] Creating new instance from npm module class');
|
|
let provider = new Web3.providers.HttpProvider(config.web3ProviderUrl);
|
|
web3Instance = new Web3(provider);
|
|
}
|
|
|
|
this.set('web3Instance', web3Instance);
|
|
window.web3 = web3Instance;
|
|
|
|
return web3Instance;
|
|
}.property('web3Instance'),
|
|
|
|
currentUserAccounts: function() {
|
|
return (this.get('web3Provided') && this.get('web3').eth.accounts) || [];
|
|
}.property('web3', 'web3Provided'),
|
|
|
|
kreditsContract: function() {
|
|
if (this.get('kreditsContractInstance')) {
|
|
return this.get('kreditsContractInstance');
|
|
}
|
|
|
|
console.log(config.ethereumChain);
|
|
let contract = kreditsContracts(this.get('web3'), config.ethereumChain)['Kredits'];
|
|
|
|
this.set('kreditsContractInstance', contract);
|
|
return contract;
|
|
}.property('web3'),
|
|
|
|
getValueFromContract(contractMethod, ...args) {
|
|
return new Ember.RSVP.Promise((resolve, reject) => {
|
|
this.get('kreditsContract')[contractMethod](...args, (err, data) => {
|
|
if (err) { reject(err); }
|
|
resolve(data);
|
|
});
|
|
});
|
|
},
|
|
|
|
getContributorData(i) {
|
|
let promise = new Ember.RSVP.Promise((resolve, reject) => {
|
|
this.getValueFromContract('contributorAddresses', i).then(address => {
|
|
this.getValueFromContract('contributors', address).then(person => {
|
|
this.getValueFromContract('balanceOf', address).then(balance => {
|
|
let contributor = Contributor.create({
|
|
address: address,
|
|
github_username: person[1],
|
|
github_uid: person[0],
|
|
ipfsHash: person[3],
|
|
kredits: balance.toNumber(),
|
|
isCurrentUser: this.get('currentUserAccounts').includes(address)
|
|
});
|
|
Ember.Logger.debug('[kredits] contributor', contributor);
|
|
resolve(contributor);
|
|
});
|
|
});
|
|
}).catch(err => reject(err));
|
|
});
|
|
return promise;
|
|
},
|
|
|
|
getContributors() {
|
|
return this.getValueFromContract('contributorsCount').then(contributorsCount => {
|
|
let contributors = [];
|
|
|
|
for(var i = 0; i < contributorsCount.toNumber(); i++) {
|
|
contributors.push(this.getContributorData(i));
|
|
}
|
|
|
|
return Ember.RSVP.all(contributors);
|
|
});
|
|
},
|
|
|
|
getProposalData(i) {
|
|
let promise = new Ember.RSVP.Promise((resolve, reject) => {
|
|
this.getValueFromContract('proposals', i).then(p => {
|
|
let proposal = Proposal.create({
|
|
id : i,
|
|
creatorAddress : p[0],
|
|
recipientAddress : p[1],
|
|
votesCount : p[2].toNumber(),
|
|
votesNeeded : p[3].toNumber(),
|
|
amount : p[4].toNumber(),
|
|
executed : p[5],
|
|
url : p[6],
|
|
ipfsHash : p[7]
|
|
});
|
|
Ember.Logger.debug('[kredits] proposal', proposal);
|
|
resolve(proposal);
|
|
}).catch(err => reject(err));
|
|
});
|
|
return promise;
|
|
},
|
|
|
|
getProposals() {
|
|
return this.getValueFromContract('proposalsCount').then(proposalsCount => {
|
|
let proposals = [];
|
|
|
|
for(var i = 0; i < proposalsCount.toNumber(); i++) {
|
|
proposals.push(this.getProposalData(i));
|
|
}
|
|
|
|
return Ember.RSVP.all(proposals);
|
|
});
|
|
},
|
|
|
|
vote(proposalId) {
|
|
Ember.Logger.debug('[kredits] vote for', proposalId);
|
|
return new Ember.RSVP.Promise((resolve, reject) => {
|
|
this.get('kreditsContract').vote(proposalId, (err, data) => {
|
|
if (err) { reject(err); }
|
|
Ember.Logger.debug('[kredits] vote response', data);
|
|
resolve(data);
|
|
});
|
|
});
|
|
},
|
|
|
|
addContributor(address, name, ipfsHash, isCore, id) {
|
|
Ember.Logger.debug('[kredits] add contributor', name, address);
|
|
|
|
let contributor = Contributor.create({
|
|
address: address,
|
|
github_username: name,
|
|
github_uid: id,
|
|
kredits: 0,
|
|
isCurrentUser: this.get('currentUserAccounts').includes(address)
|
|
});
|
|
|
|
return new Ember.RSVP.Promise((resolve, reject) => {
|
|
this.get('ipfs').storeFile(contributor.serialize()).then(ipfsHash => {
|
|
contributor.set('ipfsHash', ipfsHash);
|
|
this.get('kreditsContract').addContributor(address, name, ipfsHash, isCore, id, (err, data) => {
|
|
if (err) { reject(err); }
|
|
Ember.Logger.debug('[kredits] add contributor response', data);
|
|
resolve(contributor);
|
|
});
|
|
});
|
|
});
|
|
},
|
|
|
|
logKreditsContract: function() {
|
|
Ember.Logger.debug('[kredits] kreditsContract', this.get('kreditsContract'));
|
|
}.on('init')
|
|
|
|
});
|