import bytomWrap from './layout/bytomWrap'
-import { assetDeposited, assetBill } from "./constants";
+import GetContractArgs from "./constants";
const App = () => (
<div>
<td>
<span className="mr-5">Deposit Asset ID: </span>
</td>
- <td>{assetDeposited}</td>
+ <td>{GetContractArgs().assetDeposited}</td>
</tr>
<tr>
<td>
<span className="mr-5">Bill Asset ID: </span>
</td>
- <td>{assetBill}</td>
+ <td>{GetContractArgs().assetBill}</td>
</tr>
</tbody>
</table>
export function listDappUTXO(params)
{
- const url = "/dapp/list-utxos"
- return axios({
- method: 'post',
- url,
- data: params
- }).then(response => {
- if(response.data.code === 200){
- return response.data.result.data[0];
- }
- else {
- throw response.data.msg
- }
- })
+ let url
+ switch (window.bytom.defaultAccount.net){
+ case "testnet":
+ url = "/dapptestnet/list-utxos"
+ break
+ default:
+ url = "/dapp/list-utxos"
+ }
+ return post(url, params).then(resp => resp.data[0])
}
export function updateUtxo(params)
{
- const url = "/dapp/update-utxo"
- return axios({
- method: 'post',
- url,
- data: params
- }).then(response => {
- if(response.data.code === 200){
- return response.data.result;
- }else{
- throw response.data.msg
- }
- })
+ let url
+ switch (window.bytom.defaultAccount.net) {
+ case "testnet":
+ url = "/dapptestnet/update-utxo"
+ break
+ default:
+ url = "/dapp/update-utxo"
+ }
+ return post(url, params)
}
export function updateBalances(params)
{
- const url = "/dapp/update-balance"
- return axios({
- method: 'post',
- url,
- data: params
- }).then(response => {
- if(response.data.code === 200){
- return response.data.result;
- }else{
- throw response.data.msg
- }
- })
+ let url
+ switch (window.bytom.defaultAccount.net) {
+ case "testnet":
+ url = "/dapptestnet/update-balance"
+ break
+ default:
+ url = "/dapp/update-balance"
+ }
+ return post(url, params)
}
export function listBalances(params)
{
- const url = "/dapp/list-balances"
+ let url
+ switch (window.bytom.defaultAccount.net) {
+ case "testnet":
+ url = "/dapptestnet/list-balances"
+ break
+ default:
+ url = "/dapp/list-balances"
+ }
+ return post(url, params)
+}
+
+function post(url, params){
return axios({
method: 'post',
url,
-export const depositProgram = "207d4b5c1f33bbd758ddc74e32c044bbd455b67f8ce90ce4add22def142bb2c5d8160014ed6c9062d3174230d53e916d616f132932c635fd02260202f40102f4010600204aa9d101050010a5d4e8200bb838d531a29dc96114cad8b86aa577fc1b22a683745eba53cde03c6850fba84d4302597a64370200005479cda069c35b790400e1f5059600a05c797ba19a53795579a19a695a790400e1f5059653790400e1f505967800a07800a09a6955797b957c9600a069c35b797c9f9161645b010000005b79c2547951005e79895d79895c79895b7989597989587989537a894ca4587a64980000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c967600a069c3787c9f91616481000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696393000000005b795479515b79c16951c3c2515d79c16963a4000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec1696332020000005b79c2547951005e79895d79895c79895b7989597989587989537a894ca4587a64980000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c967600a069c3787c9f91616481000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696393000000005b795479515b79c16951c3c2515d79c16963a4000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c1696343020000547acd9f69587a587aae7cac747800c0"
-export const profitProgram = "207d4b5c1f33bbd758ddc74e32c044bbd455b67f8ce90ce4add22def142bb2c5d8160014ed6c9062d3174230d53e916d616f132932c635fd02260202f4010600204aa9d101050010a5d4e8200d8848b58ba5f5e0143c96af8c83e109fc31cafd1cc5d687fde3f55e68aa89e64ca4587a64980000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c967600a069c3787c9f91616481000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696393000000005b795479515b79c16951c3c2515d79c16963a4000000557acd9f69577a577aae7cac747800c0"
+let depositProgram
+let profitProgram
+let assetDeposited
+let assetBill
+let totalAmountBill
+let totalAmountCapital
+let dueBlockHeight
+let expireBlockHeight
+let banker
-export const assetDeposited = "0bb838d531a29dc96114cad8b86aa577fc1b22a683745eba53cde03c6850fba8"
-export const assetBill = "0d8848b58ba5f5e0143c96af8c83e109fc31cafd1cc5d687fde3f55e68aa89e6"
+const btm = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+const gas = 0.4
-export const totalAmountBill = 10000000000
-export const totalAmountCapital = 20000000000
-export const dueBlockHeight = 500
-export const expireBlockHeight = 550
+const GetContractArgs = function() {
+ let network = window.bytom.defaultAccount.net
-export const banker = "0014ed6c9062d3174230d53e916d616f132932c635fd"
+ switch (network) {
+ case 'mainnet':
+ break
+ case 'testnet':
+ depositProgram = "20f39af759065598406ca988f0dd79af9175dd7adcbe019317a2d605578b1597ac1600147211ec12410ce8bd0d71cab0a29be3ea61c71eb103c8260203da240203da2402060080f420e6b50600407a10f35a2000d38a1c946e8cba1a69493240f281cd925002a43b81f516c4391b5fb2ffdacd4d4302597a64370200005479cda069c35b790400e1f5059600a05c797ba19a53795579a19a695a790400e1f5059653790400e1f505967800a07800a09a6955797b957c9600a069c35b797c9f9161645b010000005b79c2547951005e79895d79895c79895b7989597989587989537a894ca4587a64980000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c967600a069c3787c9f91616481000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696393000000005b795479515b79c16951c3c2515d79c16963a4000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec1696332020000005b79c2547951005e79895d79895c79895b7989597989587989537a894ca4587a64980000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c967600a069c3787c9f91616481000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696393000000005b795479515b79c16951c3c2515d79c16963a4000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c1696343020000547acd9f69587a587aae7cac747800c0"
+ profitProgram = "20f39af759065598406ca988f0dd79af9175dd7adcbe019317a2d605578b1597ac1600147211ec12410ce8bd0d71cab0a29be3ea61c71eb103c8260203da2402060080f420e6b50600407a10f35a20f855baf98778a892bad0371f5afca845191824dc8584585d566fbbc8ef1f304c4ca4587a64980000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c967600a069c3787c9f91616481000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696393000000005b795479515b79c16951c3c2515d79c16963a4000000557acd9f69577a577aae7cac747800c0"
+ assetDeposited = "00d38a1c946e8cba1a69493240f281cd925002a43b81f516c4391b5fb2ffdacd"
+ assetBill = "f855baf98778a892bad0371f5afca845191824dc8584585d566fbbc8ef1f304c"
+ totalAmountBill = 100000000000000
+ totalAmountCapital = 200000000000000
+ dueBlockHeight = 140506
+ expireBlockHeight = 140506
+ banker = "00147211ec12410ce8bd0d71cab0a29be3ea61c71eb1"
+ break
+ default:
+ depositProgram = "207d4b5c1f33bbd758ddc74e32c044bbd455b67f8ce90ce4add22def142bb2c5d8160014ed6c9062d3174230d53e916d616f132932c635fd02260202f40102f4010600204aa9d101050010a5d4e8200bb838d531a29dc96114cad8b86aa577fc1b22a683745eba53cde03c6850fba84d4302597a64370200005479cda069c35b790400e1f5059600a05c797ba19a53795579a19a695a790400e1f5059653790400e1f505967800a07800a09a6955797b957c9600a069c35b797c9f9161645b010000005b79c2547951005e79895d79895c79895b7989597989587989537a894ca4587a64980000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c967600a069c3787c9f91616481000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696393000000005b795479515b79c16951c3c2515d79c16963a4000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec1696332020000005b79c2547951005e79895d79895c79895b7989597989587989537a894ca4587a64980000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c967600a069c3787c9f91616481000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696393000000005b795479515b79c16951c3c2515d79c16963a4000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c1696343020000547acd9f69587a587aae7cac747800c0"
+ profitProgram = "207d4b5c1f33bbd758ddc74e32c044bbd455b67f8ce90ce4add22def142bb2c5d8160014ed6c9062d3174230d53e916d616f132932c635fd02260202f4010600204aa9d101050010a5d4e8200d8848b58ba5f5e0143c96af8c83e109fc31cafd1cc5d687fde3f55e68aa89e64ca4587a64980000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c967600a069c3787c9f91616481000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696393000000005b795479515b79c16951c3c2515d79c16963a4000000557acd9f69577a577aae7cac747800c0"
+ assetDeposited = "0bb838d531a29dc96114cad8b86aa577fc1b22a683745eba53cde03c6850fba8"
+ assetBill = "0d8848b58ba5f5e0143c96af8c83e109fc31cafd1cc5d687fde3f55e68aa89e6"
+ totalAmountBill = 10000000000
+ totalAmountCapital = 20000000000
+ dueBlockHeight = 500
+ expireBlockHeight = 550
+ banker = "0014ed6c9062d3174230d53e916d616f132932c635fd"
+ }
+ return {
+ depositProgram,
+ profitProgram,
+ assetDeposited,
+ assetBill,
+ totalAmountBill,
+ totalAmountCapital,
+ dueBlockHeight,
+ expireBlockHeight,
+ banker,
+ btm,
+ gas
+ };
+}
-export const btm = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
-export const gas = 0.4
-
+export default GetContractArgs;
\ No newline at end of file
import { listAddress } from '../../bytom'
-import { assetDeposited, assetBill } from "../../constants";
+import GetContractArgs from "../../constants";
const updateBalances = (guid = '') => {
return (dispatch) => {
return listAddress(guid)
.then((resp)=>{
const balances = resp.balances
- const billBalance = balances.filter(balance => balance.asset === assetBill)
- const depositBalance = balances.filter(balance => balance.asset === assetDeposited)
+ const billBalance = balances.filter(balance => balance.asset === GetContractArgs().assetBill)
+ const depositBalance = balances.filter(balance => balance.asset === GetContractArgs().assetDeposited)
if(billBalance.length === 1){
dispatch({
type: "UPDATE_BILL_ASSET_BALANCES",
import { connect } from "react-redux"
import jdenticon from "jdenticon"
import action from "./action";
-import {assetDeposited, assetBill} from "../../constants";
+import GetContractArgs from "../../constants";
import { listBalances } from '../../bytom'
class Account extends Component {
this.setState({ account })
if(account){
this.props.updateBalances(account.guid)
- this.listBalance(account, assetDeposited)
+ this.listBalance(account, GetContractArgs().assetDeposited)
}
}
}
<ul className="nav nav-pills mb-3" id="pills-tab" role="tablist">
<li className="nav-item">
<a className="nav-link active" id="pills-home-tab" data-toggle="pill"
- href="#pills-deposit" onClick={() => this.listBalance(account, assetDeposited)} role="tab" aria-controls="pills-deposit" aria-selected="true">Deposit Asset Record</a>
+ href="#pills-deposit" onClick={() => this.listBalance(account, GetContractArgs().assetDeposited)} role="tab" aria-controls="pills-deposit" aria-selected="true">Deposit Asset Record</a>
</li>
<li className="nav-item">
<a className="nav-link" id="pills-profile-tab" data-toggle="pill"
- href="#pills-profit" onClick={() => this.listBalance(account, assetBill)} role="tab" aria-controls="pills-profit" aria-selected="false">Bill Asset Record</a>
+ href="#pills-profit" onClick={() => this.listBalance(account, GetContractArgs().assetBill)} role="tab" aria-controls="pills-profit" aria-selected="false">Bill Asset Record</a>
</li>
</ul>
<div className="tab-content" id="pills-tabContent">
spendUTXOAction, spendWalletAction, controlProgramAction, controlAddressAction,
updateBalances, updateUtxo, listDappUTXO, contractArguments
} from '../../bytom'
-import {profitProgram, assetDeposited, assetBill, gas, banker, totalAmountBill, totalAmountCapital} from "../../constants";
+import GetContractArgs from "../../constants";
export function FixedLimitProfit(account, amountBill, saver) {
- return new Promise((resolve, reject) => {
return listDappUTXO({
- "program": profitProgram,
- "asset": assetDeposited
+ "program": GetContractArgs().profitProgram,
+ "asset": GetContractArgs().assetDeposited
}).then(resp => {
+ if(resp.length === 0) {
+ throw 'cannot load UTXO info.'
+ return
+ }
+
const capitalAmount = resp.amount
const capitalAsset = resp.asset
const utxo = resp.hash
const args = contractArguments(amountBill, saver)
input.push(spendUTXOAction(utxo))
- input.push(spendWalletAction(amountBill, assetBill))
+ input.push(spendWalletAction(amountBill, GetContractArgs().assetBill))
if(amountBill < capitalAmount){
- output.push(controlProgramAction(amountBill, assetBill, banker ))
+ output.push(controlProgramAction(amountBill, GetContractArgs().assetBill, GetContractArgs().banker ))
output.push(controlAddressAction(gain, capitalAsset, saver))
- output.push(controlProgramAction((capitalAmount - gain), capitalAsset, profitProgram))
+ output.push(controlProgramAction((capitalAmount - gain), capitalAsset, GetContractArgs().profitProgram))
}else{
- output.push(controlProgramAction(amountBill, assetBill, banker ))
+ output.push(controlProgramAction(amountBill, GetContractArgs().assetBill, GetContractArgs().banker ))
output.push(controlAddressAction(capitalAmount, capitalAsset, saver))
}
- window.bytom.advancedTransfer(account, input, output, gas*10000000, args)
+ window.bytom.advancedTransfer(account, input, output, GetContractArgs().gas*10000000, args, 1)
.then((resp) => {
if(resp.action === 'reject'){
reject('user reject the request')
.then(()=>{
updateBalances({
"address": saver,
- "asset": assetDeposited,
- "amount": amountBill*totalAmountCapital/totalAmountBill
+ "asset": GetContractArgs().assetDeposited,
+ "amount": amountBill*GetContractArgs().totalAmountCapital/GetContractArgs().totalAmountBill
}).then(()=>{
updateBalances({
"address": account.address,
- "asset": assetBill,
+ "asset": GetContractArgs().assetBill,
"amount": -amountBill
}).then(()=>{
resolve()
}).catch(err => {
throw err
})
- })
+ })
.catch(err => {
throw err
})
}).catch(err => {
reject(err)
})
- })
}
+
+
import React from 'react'
import { FixedLimitProfit } from './action'
-import {dueBlockHeight, gas, totalAmountBill, totalAmountCapital} from "../../constants";
+import GetContractArgs from "../../constants";
class Profit extends React.Component {
.then(()=> {
this.setState({
error:'',
- msg:`Submit success!!! you spent ${amount} bill asset, and gain ${amount*totalAmountCapital/totalAmountBill} deposit asset.`
+ msg:`Submit success!!! you spent ${amount} bill asset, and gain ${amount*GetContractArgs().totalAmountCapital/GetContractArgs().totalAmountBill} deposit asset.`
})
}).catch(err => {
this.setState({
<div>
<h2>Profit</h2>
<div className="mt-3 mb-4">
- <p className='lead'>Profit should get above the block height {dueBlockHeight}.</p>
- <p className='lead'>Send {this.state.amount} Bill Asset from your chrome extension account <b className="font-weight-bolder text-uppercase">{this.state.account && this.state.account.alias}</b>, and the address {this.state.address} will gain {this.state.amount*totalAmountCapital/totalAmountBill || ''} Deposit Asset.</p>
+ <p className='lead'>Profit should get above the block height {GetContractArgs().dueBlockHeight}.</p>
+ <p className='lead'>Send {this.state.amount} Bill Asset from your chrome extension account <b className="font-weight-bolder text-uppercase">{this.state.account && this.state.account.alias}</b>, and the address {this.state.address} will gain {this.state.amount*GetContractArgs().totalAmountCapital/GetContractArgs().totalAmountBill || ''} Deposit Asset.</p>
</div>
<form onSubmit={this.handleSubmit}>
<div className="form-group">
value={this.state.address}
onChange={this.handleInputChange} />
</div>
- <p>Fee: {gas} BTM</p>
+ <p>Fee: {GetContractArgs().gas} BTM</p>
<button type="submit" className="btn btn-primary">Profit to address</button>
{this.state.msg && <div className="alert alert-success mt-4" role="alert">
{this.state.msg}
import {
spendUTXOAction, spendWalletAction, controlProgramAction,
- controlAddressAction, listDappUTXO, updateUtxo ,updateBalances,
+ controlAddressAction, listDappUTXO, updateUtxo, updateBalances,
contractArguments
} from '../../bytom'
-import {
- depositProgram, profitProgram, assetDeposited, assetBill, gas
-} from "../../constants";
+import GetContractArgs from "../../constants";
export function FixedLimitDeposit(account, amount, address) {
return new Promise((resolve, reject) => {
return listDappUTXO({
- "program": depositProgram,
- "asset": assetBill
+ "program": GetContractArgs().depositProgram,
+ "asset": GetContractArgs().assetBill
}).then(resp => {
const billAmount = resp.amount
const billAsset = resp.asset
const args = contractArguments(amount, address)
input.push(spendUTXOAction(utxo))
- input.push(spendWalletAction(amount, assetDeposited))
+ input.push(spendWalletAction(amount, GetContractArgs().assetDeposited))
if(amount < billAmount){
- output.push(controlProgramAction(amount, assetDeposited, profitProgram))
+ output.push(controlProgramAction(amount, GetContractArgs().assetDeposited, GetContractArgs().profitProgram))
output.push(controlAddressAction(amount, billAsset, address))
- output.push(controlProgramAction((billAmount-amount), billAsset, depositProgram))
+ output.push(controlProgramAction((billAmount-amount), billAsset, GetContractArgs().depositProgram))
}else{
- output.push(controlProgramAction(amount, assetDeposited, profitProgram))
+ output.push(controlProgramAction(amount, GetContractArgs().assetDeposited, GetContractArgs().profitProgram))
output.push(controlAddressAction(billAmount, billAsset, address))
}
- window.bytom.advancedTransfer(account, input, output, gas*10000000, args)
+ window.bytom.advancedTransfer(account, input, output, GetContractArgs().gas*10000000, args, 1)
.then((resp) => {
if(resp.action === 'reject'){
reject('user reject the request')
.then(()=>{
updateBalances({
address,
- "asset": assetDeposited,
+ "asset": GetContractArgs().assetDeposited,
"amount": -amount
}).then(()=>{
updateBalances({
address,
- "asset": assetBill,
+ "asset": GetContractArgs().assetBill,
"amount": amount
}).then(()=>{
resolve()
import React from 'react'
import { FixedLimitDeposit} from './action'
-import { dueBlockHeight, gas } from '../../constants'
+import GetContractArgs from '../../constants'
+import {transactionOnChain} from '../../bytom'
class Save extends React.Component {
<div>
<h2>Deposit</h2>
<div className="mt-3 mb-4">
- <p className='lead'>Deposit should happen under the block height {dueBlockHeight}.</p>
+ <p className='lead'>Deposit should happen under the block height {GetContractArgs().dueBlockHeight}.</p>
<p className='lead' >Spend {this.state.amount} Deposit Asset from your current chrome extension account <b className="font-weight-bolder text-uppercase">{this.state.account&&this.state.account.alias}</b> and you will get the relevant {this.state.amount} Bill Asset.</p>
<p>Please make sure that your account has enough Deposit Asset.</p>
</div>
value={this.state.amount}
onChange={this.handleInputChange} />
</div>
- <p>Fee: {gas} BTM</p>
+ <p>Fee: {GetContractArgs().gas} BTM</p>
<button type="submit" className="btn btn-primary">Spend Asset</button>
{this.state.msg && <div className="alert alert-success mt-4" role="alert">