Commit 7a0b3402 authored by vipwzw's avatar vipwzw

add account support

parent fe6fb747
......@@ -25,16 +25,33 @@ genesis_init(obj, addr string, amount int64)
genesis_init_exec(obj, execer, addr string, amount int64)
load_account(obj, addr) Account
get_balance(obj, addr, execer) Account
get_balance(obj, execer, addr) Account
transfer(obj, from, to, amount) Receipt
transfer_to_exec(obj, execer, addr, amount) Receipt
withdraw(obj, execer, addr, amount) Receipt
exec_frozen(obj, addr) Receipt
exec_active(obj, addr) Receipt
exec_transfer(obj, from, to, amount) Receipt
exec_deposit(obj, addr, amount) Receipt
exec_withdraw(obj, addr, amount) Receipt
exec_frozen(obj, execer, addr, amount) Receipt
exec_active(obj, execer, addr, amount) Receipt
exec_deposit(obj, execer, addr, amount) Receipt
exec_withdraw(obj, execer, addr, amount) Receipt
exec_transfer(obj, execer, from, to, amount) Receipt
*/
func (u *js) registerAccountFunc(vm *otto.Otto) {
u.genesisInitExecFunc(vm)
u.genesisInitFunc(vm)
u.loadAccountFunc(vm)
u.getBalanceFunc(vm)
u.transferFunc(vm)
u.transferToExecFunc(vm)
u.withdrawFunc(vm)
u.execActiveFunc(vm)
u.execDepositFunc(vm)
u.execFrozenFunc(vm)
u.execTransferFunc(vm)
u.execWithdrawFunc(vm)
}
func (u *js) getAccount(args otto.Value) (*account.DB, error) {
if !args.IsObject() {
return nil, types.ErrInvalidParam
......@@ -104,3 +121,294 @@ func (u *js) genesisInitFunc(vm *otto.Otto) {
return receiptReturn(vm, receipt)
})
}
func (u *js) loadAccountFunc(vm *otto.Otto) {
vm.Set("load_account", func(call otto.FunctionCall) otto.Value {
acc, err := u.getAccount(call.Argument(0))
if err != nil {
return errReturn(vm, err)
}
addr, err := call.Argument(1).ToString()
if err != nil {
return errReturn(vm, err)
}
if err := address.CheckAddress(addr); err != nil {
return errReturn(vm, err)
}
account := acc.LoadAccount(addr)
return accountReturn(vm, account)
})
}
func (u *js) getBalanceFunc(vm *otto.Otto) {
vm.Set("get_balance", func(call otto.FunctionCall) otto.Value {
acc, err := u.getAccount(call.Argument(0))
if err != nil {
return errReturn(vm, err)
}
execer, err := call.Argument(1).ToString()
if err != nil {
return errReturn(vm, err)
}
addr, err := call.Argument(2).ToString()
if err != nil {
return errReturn(vm, err)
}
if err := address.CheckAddress(addr); err != nil {
return errReturn(vm, err)
}
account, err := acc.GetBalance(u.GetAPI(), &types.ReqBalance{
Addresses: []string{addr},
Execer: execer,
})
if err != nil {
return errReturn(vm, err)
}
if len(account) == 0 {
return accountReturn(vm, &types.Account{})
}
return accountReturn(vm, account[0])
})
}
func (u *js) transferFunc(vm *otto.Otto) {
vm.Set("transfer", func(call otto.FunctionCall) otto.Value {
acc, err := u.getAccount(call.Argument(0))
if err != nil {
return errReturn(vm, err)
}
from, err := call.Argument(1).ToString()
if err != nil {
return errReturn(vm, err)
}
if err := address.CheckAddress(from); err != nil {
return errReturn(vm, err)
}
to, err := call.Argument(2).ToString()
if err != nil {
return errReturn(vm, err)
}
if err := address.CheckAddress(to); err != nil {
return errReturn(vm, err)
}
amount, err := call.Argument(3).ToInteger()
if err != nil {
return errReturn(vm, err)
}
receipt, err := acc.Transfer(from, to, amount)
if err != nil {
return errReturn(vm, err)
}
return receiptReturn(vm, receipt)
})
}
func (u *js) transferToExecFunc(vm *otto.Otto) {
vm.Set("transfer_to_exec", func(call otto.FunctionCall) otto.Value {
acc, err := u.getAccount(call.Argument(0))
if err != nil {
return errReturn(vm, err)
}
execer, err := call.Argument(1).ToString()
if err != nil {
return errReturn(vm, err)
}
from, err := call.Argument(2).ToString()
if err != nil {
return errReturn(vm, err)
}
if err := address.CheckAddress(from); err != nil {
return errReturn(vm, err)
}
amount, err := call.Argument(3).ToInteger()
if err != nil {
return errReturn(vm, err)
}
receipt, err := acc.TransferToExec(from, address.ExecAddress(execer), amount)
if err != nil {
return errReturn(vm, err)
}
return receiptReturn(vm, receipt)
})
}
func (u *js) withdrawFunc(vm *otto.Otto) {
vm.Set("withdraw", func(call otto.FunctionCall) otto.Value {
acc, err := u.getAccount(call.Argument(0))
if err != nil {
return errReturn(vm, err)
}
execer, err := call.Argument(1).ToString()
if err != nil {
return errReturn(vm, err)
}
addr, err := call.Argument(2).ToString()
if err != nil {
return errReturn(vm, err)
}
if err := address.CheckAddress(addr); err != nil {
return errReturn(vm, err)
}
amount, err := call.Argument(3).ToInteger()
if err != nil {
return errReturn(vm, err)
}
receipt, err := acc.TransferWithdraw(address.ExecAddress(execer), addr, amount)
if err != nil {
return errReturn(vm, err)
}
return receiptReturn(vm, receipt)
})
}
func (u *js) execFrozenFunc(vm *otto.Otto) {
vm.Set("exec_frozen", func(call otto.FunctionCall) otto.Value {
acc, err := u.getAccount(call.Argument(0))
if err != nil {
return errReturn(vm, err)
}
execer, err := call.Argument(1).ToString()
if err != nil {
return errReturn(vm, err)
}
addr, err := call.Argument(2).ToString()
if err != nil {
return errReturn(vm, err)
}
if err := address.CheckAddress(addr); err != nil {
return errReturn(vm, err)
}
amount, err := call.Argument(3).ToInteger()
if err != nil {
return errReturn(vm, err)
}
receipt, err := acc.ExecFrozen(address.ExecAddress(execer), addr, amount)
if err != nil {
return errReturn(vm, err)
}
return receiptReturn(vm, receipt)
})
}
func (u *js) execActiveFunc(vm *otto.Otto) {
vm.Set("exec_active", func(call otto.FunctionCall) otto.Value {
acc, err := u.getAccount(call.Argument(0))
if err != nil {
return errReturn(vm, err)
}
execer, err := call.Argument(1).ToString()
if err != nil {
return errReturn(vm, err)
}
addr, err := call.Argument(2).ToString()
if err != nil {
return errReturn(vm, err)
}
if err := address.CheckAddress(addr); err != nil {
return errReturn(vm, err)
}
amount, err := call.Argument(3).ToInteger()
if err != nil {
return errReturn(vm, err)
}
receipt, err := acc.ExecActive(address.ExecAddress(execer), addr, amount)
if err != nil {
return errReturn(vm, err)
}
return receiptReturn(vm, receipt)
})
}
func (u *js) execDepositFunc(vm *otto.Otto) {
vm.Set("exec_deposit", func(call otto.FunctionCall) otto.Value {
acc, err := u.getAccount(call.Argument(0))
if err != nil {
return errReturn(vm, err)
}
execer, err := call.Argument(1).ToString()
if err != nil {
return errReturn(vm, err)
}
addr, err := call.Argument(2).ToString()
if err != nil {
return errReturn(vm, err)
}
if err := address.CheckAddress(addr); err != nil {
return errReturn(vm, err)
}
amount, err := call.Argument(3).ToInteger()
if err != nil {
return errReturn(vm, err)
}
receipt, err := acc.ExecDeposit(address.ExecAddress(execer), addr, amount)
if err != nil {
return errReturn(vm, err)
}
return receiptReturn(vm, receipt)
})
}
func (u *js) execWithdrawFunc(vm *otto.Otto) {
vm.Set("exec_withdraw", func(call otto.FunctionCall) otto.Value {
acc, err := u.getAccount(call.Argument(0))
if err != nil {
return errReturn(vm, err)
}
execer, err := call.Argument(1).ToString()
if err != nil {
return errReturn(vm, err)
}
addr, err := call.Argument(2).ToString()
if err != nil {
return errReturn(vm, err)
}
if err := address.CheckAddress(addr); err != nil {
return errReturn(vm, err)
}
amount, err := call.Argument(3).ToInteger()
if err != nil {
return errReturn(vm, err)
}
receipt, err := acc.ExecWithdraw(address.ExecAddress(execer), addr, amount)
if err != nil {
return errReturn(vm, err)
}
return receiptReturn(vm, receipt)
})
}
func (u *js) execTransferFunc(vm *otto.Otto) {
vm.Set("exec_transfer", func(call otto.FunctionCall) otto.Value {
acc, err := u.getAccount(call.Argument(0))
if err != nil {
return errReturn(vm, err)
}
execer, err := call.Argument(1).ToString()
if err != nil {
return errReturn(vm, err)
}
from, err := call.Argument(2).ToString()
if err != nil {
return errReturn(vm, err)
}
if err := address.CheckAddress(from); err != nil {
return errReturn(vm, err)
}
to, err := call.Argument(3).ToString()
if err != nil {
return errReturn(vm, err)
}
if err := address.CheckAddress(to); err != nil {
return errReturn(vm, err)
}
amount, err := call.Argument(4).ToInteger()
if err != nil {
return errReturn(vm, err)
}
receipt, err := acc.ExecTransfer(from, to, address.ExecAddress(execer), amount)
if err != nil {
return errReturn(vm, err)
}
return receiptReturn(vm, receipt)
})
}
......@@ -230,6 +230,7 @@ func (u *js) createVM(name string, tx *types.Transaction, index int) (*otto.Otto
u.getlocaldbFunc(vm, name)
u.listdbFunc(vm, name)
u.execnameFunc(vm, name)
u.registerAccountFunc(vm)
return vm, nil
}
......@@ -314,6 +315,15 @@ func createLogsObject(vm *otto.Otto, logs []*types.ReceiptLog) otto.Value {
return obj.value()
}
func accountReturn(vm *otto.Otto, acc *types.Account) otto.Value {
obj := newObject(vm)
obj.setValue("currency", acc.Currency)
obj.setValue("balance", acc.Balance)
obj.setValue("frozen", acc.Frozen)
obj.setValue("addr", acc.Addr)
return obj.value()
}
func (u *js) getstatedb(key string) (value string, err error) {
s, err := u.GetStateDB().Get([]byte(key))
value = string(s)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment