godprotocol
Version:
A distributed computing environment for Web 4.0 — integrating AI, decentralisation, and virtual computation.
49 lines (40 loc) • 1.96 kB
JavaScript
class Wallet{
constructor(instance){
this.instance = instance;
}
transfer = async(price, recipient)=>{
let {vm} = this.instance.account
let folder = await this.instance._folder()
let wallet_folder = await folder.child('wallet')
let tok = await (await wallet_folder.readone({_id: price.token})).literal()
if (!tok) return {successful: false, message:"Doesn't have token"}
if(tok.value< price.value) return {successful: false, message:"Insufficient balance"}
await wallet_folder.update({_id: tok._id}, {value: {$dec: price.value}})
let transactions = await wallet_folder.child(price.token)
let recent_tx = await (await transactions.readone()).literal()
let tx = {value: price.value, previous: await vm.hash(recent_tx), recipient: recipient.ref(), timestamp: Date.now()}
tx.hash = await vm.hash(tx)
let res = await transactions.write(tx)
await wallet_folder.child('transactions').write(await res.to_address())
let recipient_folder = await recipient._folder()
let recipient_wallet = await recipient_folder.child('wallet'), sender_ref = `${res.ref()}:${tx.hash}`;
let rec_tok = await recipient_wallet.readone({_id: price.token})
let rec_txs = await recipient_wallet.child(price.token), rec_tx;
if(!rec_tok){
await recipient_wallet.write({_id: price.token, value: price.value})
rec_tx = {
value: price.value, previous: 'genesis', sender_ref
}
rec_tx.hash = await vm.hash(rec_tx)
await rec_txs.write(rec_tx)
}else {
await recipient_wallet.update({_id: price.token}, {value: {$inc: price.value}})
let rec_prev_tx = await (await rec_txs.readone()).literal()
rec_tx = {value: price.value, previous: await vm.hash(rec_prev_tx), sender_ref}
rec_tx.hash = await vm.hash(rec_tx)
await rec_txs.write(rec_tx)
}
return {successful: true, message: 'Transfer completed.'}
}
}
export default Wallet;