Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions src/App.js
Original file line number Diff line number Diff line change
Expand Up @@ -120,9 +120,9 @@ export default class App extends Component {
};

refreshWeb3State = async () => {
const { from, isListening, provider, networkName } = await getWeb3State(this.storage);
const { from, isListening, provider, networkName, explorerDomain } = await getWeb3State(this.storage);
if (this.state.from !== from) this.refreshMyEntities();
this.setState({ from, isListening, provider, networkName });
this.setState({ from, isListening, provider, networkName, explorerDomain });
};

getEntityLabels = async (entityId) => {
Expand Down Expand Up @@ -352,6 +352,7 @@ export default class App extends Component {
provider,
from,
networkName,
explorerDomain,
boosts,
supportings,
http,
Expand Down Expand Up @@ -400,6 +401,7 @@ export default class App extends Component {
provider,
from,
networkName,
explorerDomain,
waitingForConfirm,
exportWallet,
},
Expand Down
179 changes: 179 additions & 0 deletions src/CreateTokens.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
import React, { Component } from 'react';
import styled from 'styled-components';

import { deployERC20 } from './api';
import Link, { A } from './Link';
import Context from './Context';
import { ChangellyFastBuy } from './Changelly';
import { CoinbaseWidget } from './CoinbaseWidget';
import { Container, FlatContainer, H3, H4, StyledInput, StyledButton } from './Components';
import { IfActiveEntity } from './Entity';
import { ERC20Code } from './contract';

const Input = styled.div.attrs({
children: (props) => <input {...props} />,
})`
flex-grown: 0;
postion: relative;

& > input {
height: 100%;
width: 200px;
font-size: 1rem;
font-weight: 600;
color: #264dd9;
background-color: #f3f6ff;
border-radius: 12px;
padding: 10px;
margin: 4px 0px 20px 0px;
}
`;

const Form = styled.div`
display: flex;
flex-direction: column;
`;

class ERC20 extends Component {
state = {
name: 'Your Token Name',
symbol: 'YOUR TOKEN SYMBOL',
totalSupply: 21000000,
decimals: 8,
feeAddress: '0x6Be450972b30891B16c8588DcBc10c8c2aEf04da',
feeDivider: 1000,
error: null,
loading: false,
};

async createToken() {
this.setState({ loading: true });
try {
const contract = await deployERC20({
...this.state,
onTransactionHash: (t) => this.setState({ transaction: t }),
onReceipt: (r) => this.setState({ receipt: r, loading: false }),
});
console.log(contract);
} catch (e) {
this.setState({ loading: false, error: e });
console.error(e);
return;
}
}

render() {
return (
<IfActiveEntity other={<div>Unlock your Wallet to create tokens</div>}>
{(entityId) => (
<React.Fragment>
<Form>
<div>
Name{' '}
<Input
value={this.state.name}
disabled={this.state.loading}
onChange={(e) => this.setState({ name: e.target.value })}
/>
</div>
<div>
Symbol (eg. MKR, ZRX, CK, MOKEN)
<Input
value={this.state.symbol}
disabled={this.state.loading}
onChange={(e) => this.setState({ symbol: e.target.value })}
/>
</div>
<div>
Total supply (min: 1, max: 2^
{256 - this.state.decimals}
-1), default: 21000000)
<Input
value={this.state.totalSupply}
disabled={this.state.loading}
onChange={(e) => this.setState({ totalSupply: parseInt(e.target.value || 0) })}
/>
</div>
<b>Advanced:</b>
<div>
Decimals (min: 0, max: 18, default: 8)
<Input
value={this.state.decimals}
disabled={this.state.loading}
onChange={(e) =>
this.setState({ decimals: parseInt(e.target.value || 0) > 18 ? 18 : parseInt(e.target.value || 0) })
}
/>
</div>
<StyledButton onClick={this.createToken.bind(this)} disabled={this.state.loading}>
{this.state.loading ? 'Creating...' : 'Create Token'}
</StyledButton>
<Context.Consumer>
{({ web3Store: { networkName, explorerDomain } }) => (
<div>
<br />
{this.state.transaction &&
!this.state.receipt && (
<span>
Check progress:{' '}
<A href={`https://${explorerDomain}/tx/${this.state.transaction}`} target="_blank">
{this.state.transaction}
</A>
</span>
)}
{this.state.receipt && (
<div>
<div>Success!</div>
<b>
Your new token address is{' '}
<A
href={`https://${explorerDomain}/token/${this.state.receipt.contractAddress}`}
target="_blank"
>
{this.state.receipt.contractAddress}
</A>
</b>
<br />
Go to your token{' '}
<Link to={`/clubs/${networkName}:${this.state.receipt.contractAddress}`}>club page</Link>
</div>
)}
</div>
)}
</Context.Consumer>
</Form>
</React.Fragment>
)}
</IfActiveEntity>
);
}
}

const CreateTokens = () => {
return (
<React.Fragment>
<div className="columns ordered-mobile">
<div className="column is-8 fl-1 is-offset-1">
<Container>
<H3>Create ERC20 Token</H3>
<div>
<ERC20 />
</div>
</Container>

{/*<CoinbaseWidget />*/}
</div>
<div className="column is-3 is-hidden-mobile">
<FlatContainer>
Here you can create different types of tokens.
<br />
<br />
We support only ERC20 tokens for now. ERC721 are in the works.
</FlatContainer>
</div>
</div>
</React.Fragment>
);
};

export default CreateTokens;
5 changes: 4 additions & 1 deletion src/Sidebar.js
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,10 @@ export const SidebarLeft = () => (
</IfActiveEntity>
<Header>Tools</Header>
<LinkItem to="/how-to-get-tokens" icon={<span>🛠</span>} toggle={toggle}>
How to get tokens?
How To Get ETH?
</LinkItem>
<LinkItem to="/create-tokens" icon={<span>🛠</span>} toggle={toggle}>
Create Tokens
</LinkItem>
<Header>Feeds</Header>
<LinkItem to="/" icon={<img alt="" style={{ width: '16px' }} src={feedIcon} />} toggle={toggle}>
Expand Down
27 changes: 27 additions & 0 deletions src/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
claimContractAddressesForNetworkId,
claimContractAbi,
networkNameForNetworkId,
networkExplorerForNetworkId,
claimWithValueTransferContractAddressesForNetworkId,
claimWithTokenValueTransferContractAddressesForNetworkId,
claimWithConfigurableValueMultiTransferContractAddressesForNetworkId,
Expand All @@ -19,6 +20,7 @@ import {
erc20ContractAbi,
erc721ContractAbi,
mintTokensContractAbi,
ERC20Bytecode,
} from './contract';
import { getEntityData, getEntityId, getEntityPrefix } from './entityApi';
import { findClub } from './clubs';
Expand Down Expand Up @@ -350,6 +352,7 @@ export const getWeb3State = async (storage) => {
web3.eth.getBlockNumber(),
]);
const networkName = networkNameForNetworkId[networkId];
const explorerDomain = networkExplorerForNetworkId[networkId];
const provider = getCurrentProviderName();
return {
from,
Expand All @@ -358,6 +361,7 @@ export const getWeb3State = async (storage) => {
blockNumber,
web3,
networkName,
explorerDomain,
provider,
};
} catch (e) {
Expand All @@ -368,6 +372,7 @@ export const getWeb3State = async (storage) => {
blockNumber: undefined,
web3: undefined,
networkName: undefined,
explorerDomain: undefined,
provider: false,
};
}
Expand Down Expand Up @@ -542,6 +547,28 @@ export const transferErc721 = async (erc721, to, value) => {
});
};

export const deployERC20 = async ({ name, symbol, decimals, totalSupply, onTransactionHash, onReceipt }) => {
const web3 = await getWeb3();
const { from, networkName } = await getWeb3State();
const newContract = new web3.eth.Contract(erc20ContractAbi);
const args = [
web3.utils.asciiToHex(name),
web3.utils.asciiToHex(symbol),
decimals,
totalSupply,
'0x6be450972b30891b16c8588dcbc10c8c2aef04da',
100,
];

return new Promise((resolve, reject) => {
const promiEvent = newContract.deploy({ data: `0x${ERC20Bytecode.object}`, arguments: args }).send({ from });
promiEvent.on('error', reject);
promiEvent.on('transactionHash', onTransactionHash);
promiEvent.on('receipt', onReceipt);
promiEvent.on('confirmation', resolve);
});
};

const claimWithTokenValueTransfer = async (data, value, ownerAddress, erc20) => {
const { from } = await getWeb3State();
const contract = await getClaimWithTokenValueTransferContract();
Expand Down
19 changes: 19 additions & 0 deletions src/app/CreateTokens.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import React from 'react';

import Header from '../Header';
import CreateTokens from '../CreateTokens';
import { SidebarProvider, SidebarContainer, SidebarLeft, SidebarRight } from '../Sidebar';

const CreateTokensApp = (props) => (
<SidebarProvider overlay>
<Header />
<SidebarContainer>
<SidebarLeft />
<SidebarRight>
<CreateTokens {...props} />
</SidebarRight>
</SidebarContainer>
</SidebarProvider>
);

export default CreateTokensApp;
Loading