1 import {getDB} from '../db/db';
2 import {createAccount, createAccountReceiver, signTransaction} from '../wasm/func';
3 import {handleApiError, handleAxiosError} from '../utils/http';
6 function accountsSDK(bytom){
7 this.http = bytom.serverHttp;
12 * List of the account.
14 * @returns {Promise} List of Accounts
16 accountsSDK.prototype.listAccountUseServer = function() {
17 let net = this.bytom.net;
18 let retPromise = new Promise((resolve, reject) => {
20 let transaction = db.transaction(['accounts-server'], 'readonly');
21 let objectStore = transaction.objectStore('accounts-server').index('net');
22 let keyRange = IDBKeyRange.only(net);
23 let oc = objectStore.openCursor(keyRange);
26 oc.onsuccess = function (event) {
27 var cursor = event.target.result;
29 ret.push(cursor.value);
35 oc.onerror = function(e){
47 * List all addresses and the corresponding balances of a wallet.
49 * @see https://gist.github.com/HAOYUatHZ/0c7446b8f33e7cddd590256b3824b08f#apiv1btmaccountlist-addresses
50 * @param {String} guid
51 * @returns {Promise} list of all addresses
53 accountsSDK.prototype.listAddressUseServer = function(address) {
54 let net = this.bytom.net;
55 return this.http.request(`account/address?address=${address}`, '', net, 'GET');
58 * Create a new address for a wallet.
60 * @see https://gist.github.com/HAOYUatHZ/0c7446b8f33e7cddd590256b3824b08f#apiv1btmaccountnew-address
61 * @param {String} guid unique id for each wallet
62 * @param {String} label alias for the address to be created
65 accountsSDK.prototype.createAccountReceiverUseServer = function(guid, label) {
66 let net = this.bytom.net;
67 let retPromise = new Promise((resolve, reject) => {
68 let pm = {guid: guid};
72 this.http.request('account/new-address', pm, net).then(resp => {
77 let transaction = db.transaction(['addresses-server'], 'readwrite');
78 let objectStore = transaction.objectStore('addresses-server');
79 delete dbData.rootXPub;
80 let request = objectStore.add(dbData);
81 request.onsuccess = function() {
84 request.onerror = function() {
85 reject(request.error);
89 reject(handleAxiosError(error));
96 * Create a wallet using a public key. Each wallet is identified by a guid. (by server)
98 * @see https://gist.github.com/HAOYUatHZ/0c7446b8f33e7cddd590256b3824b08f#endpoints
99 * @param {String} rootXPub
100 * @param {String} alias alias for the account
101 * @param {String} label alias for the first address
104 accountsSDK.prototype.createNewAccount = function(rootXPub, label) {
105 let net = this.bytom.net;
106 let pm = {pubkey: rootXPub};
110 return this.http.request('account/create', pm, net);
115 * Create a wallet using a public key. Each wallet is identified by a guid. (by server)
117 * @see https://gist.github.com/HAOYUatHZ/0c7446b8f33e7cddd590256b3824b08f#endpoints
118 * @param {String} rootXPub
119 * @param {String} alias alias for the account
120 * @param {String} label alias for the first address
123 accountsSDK.prototype.createAccountUseServer = function(rootXPub, alias, label) {
124 let net = this.bytom.net;
126 let retPromise = new Promise((resolve, reject) => {
128 let getRequest = db.transaction(['accounts-server'], 'readonly')
129 .objectStore('accounts-server')
132 getRequest.onsuccess = function(e) {
133 if (e.target.result) {
134 reject(new Error('duplicate account alias'));
137 let pm = {pubkey: rootXPub};
141 that.http.request('account/create', pm, net).then(resp => {
143 dbData.rootXPub = rootXPub;
144 dbData.alias = alias;
147 let transaction = db.transaction(['accounts-server'], 'readwrite');
148 let objectStore = transaction.objectStore('accounts-server');
149 let request = objectStore.add(dbData);
150 request.onsuccess = function() {
151 let transaction = db.transaction(['addresses-server'], 'readwrite');
152 let objectStore = transaction.objectStore('addresses-server');
153 delete dbData.rootXPub;
154 let request = objectStore.add(dbData);
155 request.onsuccess = function() {
158 request.onerror = function() {
159 reject(request.error);
162 request.onerror = function() {
163 reject(request.error);
167 reject(handleAxiosError(error));
170 getRequest.onerror = function() {
171 reject(getRequest.error);
181 * Create a wallet using a public key. Each wallet is identified by a guid. (by server)
183 * @param {String} guid
184 * @param {String} coin type of coin
187 accountsSDK.prototype.copyAccountUseServer = function(guid, coin) {
188 let net = this.bytom.net;
190 let retPromise = new Promise((resolve, reject) => {
196 that.http.request('account/copy', pm, net).then(resp => {
198 let objectStore = db.transaction(['accounts-server'], 'readwrite').objectStore('accounts-server');
199 let index = objectStore.index('guid');
200 let keyRange = IDBKeyRange.only(guid);
201 let getRequest = index.openCursor(keyRange);
203 getRequest.onsuccess = function(e) {
204 const cursor = e.target.result;
206 const accountObject = cursor.value;
208 accountObject.vpAddress = resp.address;
209 const request = cursor.update(accountObject);
210 request.onsuccess = function () {
211 resolve(accountObject);
213 request.onerror = function () {
214 reject(request.error);
218 getRequest.onerror = function() {
219 reject(getRequest.error);
232 * list a wallet using a guid. Each wallet is identified by a guid. (by server)
234 * @param {String} guid
235 * @param {String} coin type of coin
238 accountsSDK.prototype.listVaporAccountUseServer = function(guid) {
239 let net = this.bytom.net;
241 let retPromise = new Promise((resolve, reject) => {
242 that.http.request('account/addresses', {address:address}, net).then(resp => {
244 let objectStore = db.transaction(['accounts-server'], 'readwrite').objectStore('accounts-server');
245 let index = objectStore.index('guid');
246 let keyRange = IDBKeyRange.only(guid);
247 let getRequest = index.openCursor(keyRange);
249 getRequest.onsuccess = function(e) {
250 const cursor = e.target.result;
252 const accountObject = cursor.value;
254 accountObject.vpAddress = resp[0].address;
255 const request = cursor.update(accountObject);
256 request.onsuccess = function () {
257 resolve(accountObject);
259 request.onerror = function () {
260 reject(request.error);
264 getRequest.onerror = function() {
265 reject(getRequest.error);
280 * @param {String} alias
281 * @param {Int} quorum
282 * @param {String} rootXPub
285 accountsSDK.prototype.createAccount = function(alias, quorum, rootXPub) {
286 let retPromise = new Promise((resolve, reject) => {
288 let transaction = db.transaction(['accounts'], 'readwrite');
289 let objectStore = transaction.objectStore('accounts');
290 let request = objectStore.add({
293 request.onsuccess = function () {
294 let data = {alias:alias, quorum:quorum, rootXPub:rootXPub, nextIndex:request.result};
295 createAccount(data).then(res => {
296 let jsonData = JSON.parse(res.data);
297 let putTransaction = db.transaction(['accounts'], 'readwrite');
298 let putObjectStore = putTransaction.objectStore('accounts');
299 let putRequest = putObjectStore.put(jsonData, request.result);
300 putRequest.onsuccess = function() {
303 putRequest.onerror = function() {
304 reject(putRequest.error);
310 request.onerror = function() {
311 reject(request.error);
321 * create account address
323 * @param {Object} account createAccount return account Object val
324 * @param {Int} nextIndex
327 accountsSDK.prototype.createAccountReceiver = function(account) {
328 let retPromise = new Promise((resolve, reject) => {
330 let transaction = db.transaction(['addresses'], 'readwrite');
331 let objectStore = transaction.objectStore('addresses');
332 let request = objectStore.add({
333 account_id:account.id,
334 account_alias:account.alias,
336 request.onsuccess = function() {
337 let data = {account:JSON.stringify(account), nextIndex: request.result};
338 createAccountReceiver(data).then(res => {
339 let jsonData = JSON.parse(res.data);
340 let jsonDB = JSON.parse(res.db);
341 let putTransaction = db.transaction(['addresses'], 'readwrite');
342 let putObjectStore = putTransaction.objectStore('addresses');
343 let putRequest = null;
344 for (let key in jsonDB) {
345 if(!jsonDB.hasOwnProperty(key)) continue;
346 let putData = JSON.parse(jsonDB[key]);
347 putRequest = putObjectStore.put(putData, request.result);
349 putRequest.onsuccess = function() {
352 putRequest.onerror = function() {
353 reject(putRequest.error);
359 request.onerror = function() {
360 reject(request.error);
370 * create account address
372 * @param {Object} account createAccount return account Object val
373 * @param {Int} nextIndex
376 accountsSDK.prototype.getAccountXpubById = function(guid) {
377 let retPromise = new Promise((resolve, reject) => {
379 let getRequest = db.transaction(['accounts-server'], 'readonly')
380 .objectStore('accounts-server')
383 getRequest.onsuccess = function(e) {
384 if (!e.target.result) {
385 reject(new Error('not found guid'));
388 resolve(e.target.result.rootXPub);
390 getRequest.onerror = function() {
391 reject(getRequest.error);
402 * create account address
404 * @param {Object} account createAccount return account Object val
405 * @param {Int} nextIndex
408 accountsSDK.prototype.getAccountXpubByAddress = function(guid) {
409 let retPromise = new Promise((resolve, reject) => {
411 let getRequest = db.transaction(['accounts-server'], 'readonly')
412 .objectStore('accounts-server')
415 getRequest.onsuccess = function(e) {
416 if (!e.target.result) {
417 reject(new Error('not found guid'));
420 resolve(e.target.result.rootXPub);
422 getRequest.onerror = function() {
423 reject(getRequest.error);
432 export default accountsSDK;