-
Notifications
You must be signed in to change notification settings - Fork 3
/
index.js
127 lines (115 loc) · 3.36 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import Web3 from 'web3'
import Signer from 'ethjs-signer'
import BN from 'bignumber.js'
import axios from 'axios'
const getWallet = function (endpoint) {
var remoteEndpoint = endpoint ? endpoint : '/_loom/accounts'
return axios.post(remoteEndpoint)
.then(function (res) {
return res.data.private_keys
})
.catch(function (error) {
console.log(error)
})
}
const getContracts = function (endpoint) {
var remoteEndpoint = endpoint ? endpoint : '/_loom/contracts'
return axios.post(remoteEndpoint)
.then(function (res) {
return res.data
})
.catch(function (error) {
console.log(error)
})
}
const getProvider = function (keys) {
var LoomProviderInstance = function () {}
var remoteLoomProvider = new Web3.providers.HttpProvider('/')
var web3Remote = new Web3(remoteLoomProvider)
var wallet = Object.keys(keys)[0]
var privateKey = `0x${keys[wallet]}`
LoomProviderInstance.prototype.prepareRequest = function (async) {
return remoteLoomProvider.prepareRequest(async)
}
LoomProviderInstance.prototype.send = function (payload) {
console.log(JSON.stringify(payload))
var method = payload.method
if (method === 'eth_accounts') {
var res = payload
delete res.params
res.result = [wallet]
console.log(res)
return res
} else {
console.log(JSON.stringify(payload))
return remoteLoomProvider.send(payload)
}
}
LoomProviderInstance.prototype.sendAsync = function (payload, callback) {
console.log(JSON.stringify(payload))
console.log(callback)
var method = payload.method
if (method === 'eth_accounts') {
var res = payload
delete res.params
res.result = [wallet]
console.log(res)
callback(null, res)
} else if (method === 'eth_sendTransaction') {
const sign = Signer.sign
const eth = web3Remote.eth
let [rawTx, tag] = payload.params
console.log(rawTx)
console.log(tag)
eth.getTransactionCount(wallet, (err, res) => {
console.log(err)
var nonce = res
var completeTx = {
to: rawTx.to,
value: rawTx.value,
gas: new BN('100000'),
data: rawTx.data,
gasPrice: new BN('1000000000000'),
nonce: nonce
}
console.log('complete tx', completeTx)
console.log('signedtx', sign(completeTx, privateKey))
eth.sendRawTransaction(sign(completeTx, privateKey), (error, txHash) => {
callback(error, {
'id': payload.id,
'jsonrpc': '2.0',
'result': txHash
})
})
})
} else {
remoteLoomProvider.sendAsync(payload, function (err, res) {
console.log(JSON.stringify(payload))
callback(err, res)
})
}
}
LoomProviderInstance.prototype.isConnected = function () {
return true
}
return new LoomProviderInstance()
}
export default {
init: function (providerHandler, api, callback) {
if (typeof window !== 'undefined' && !window.loomLoaded) {
getWallet(api).then(function (keys) {
var provider = getProvider(keys)
window.web3 = new Web3(provider)
window.loomLoaded = true
providerHandler(provider)
callback()
})
}
},
getContracts: function (api) {
return getContracts(api)
},
getWallet: function (api) {
return getWallet(api)
},
}