|
|
@ -2,13 +2,18 @@ package ethui |
|
|
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
import ( |
|
|
|
"bitbucket.org/kardianos/osext" |
|
|
|
"bitbucket.org/kardianos/osext" |
|
|
|
|
|
|
|
"fmt" |
|
|
|
"github.com/ethereum/eth-go" |
|
|
|
"github.com/ethereum/eth-go" |
|
|
|
|
|
|
|
"github.com/ethereum/eth-go/ethchain" |
|
|
|
"github.com/ethereum/eth-go/ethutil" |
|
|
|
"github.com/ethereum/eth-go/ethutil" |
|
|
|
"github.com/niemeyer/qml" |
|
|
|
"github.com/niemeyer/qml" |
|
|
|
|
|
|
|
"github.com/obscuren/mutan" |
|
|
|
|
|
|
|
"math/big" |
|
|
|
"os" |
|
|
|
"os" |
|
|
|
"path" |
|
|
|
"path" |
|
|
|
"path/filepath" |
|
|
|
"path/filepath" |
|
|
|
"runtime" |
|
|
|
"runtime" |
|
|
|
|
|
|
|
"strings" |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
// UI Library that has some basic functionality exposed
|
|
|
|
// UI Library that has some basic functionality exposed
|
|
|
@ -17,6 +22,8 @@ type UiLib struct { |
|
|
|
eth *eth.Ethereum |
|
|
|
eth *eth.Ethereum |
|
|
|
connected bool |
|
|
|
connected bool |
|
|
|
assetPath string |
|
|
|
assetPath string |
|
|
|
|
|
|
|
// The main application window
|
|
|
|
|
|
|
|
win *qml.Window |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func NewUiLib(engine *qml.Engine, eth *eth.Ethereum, assetPath string) *UiLib { |
|
|
|
func NewUiLib(engine *qml.Engine, eth *eth.Ethereum, assetPath string) *UiLib { |
|
|
@ -81,3 +88,59 @@ func DefaultAssetPath() string { |
|
|
|
|
|
|
|
|
|
|
|
return base |
|
|
|
return base |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
type memAddr struct { |
|
|
|
|
|
|
|
Num string |
|
|
|
|
|
|
|
Value string |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (ui *UiLib) DebugTx(recipient, valueStr, gasStr, gasPriceStr, data string) (string, error) { |
|
|
|
|
|
|
|
state := ui.eth.BlockChain().CurrentBlock.State() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
asm, err := mutan.Compile(strings.NewReader(data), false) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
fmt.Println(err) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
callerScript := ethutil.Assemble(asm...) |
|
|
|
|
|
|
|
dis := ethchain.Disassemble(callerScript) |
|
|
|
|
|
|
|
ui.win.Root().Call("clearAsm") |
|
|
|
|
|
|
|
for _, str := range dis { |
|
|
|
|
|
|
|
ui.win.Root().Call("setAsm", str) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
callerTx := ethchain.NewContractCreationTx(ethutil.Big(valueStr), ethutil.Big(gasPriceStr), callerScript) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Contract addr as test address
|
|
|
|
|
|
|
|
keyPair := ethutil.Config.Db.GetKeys()[0] |
|
|
|
|
|
|
|
account := ui.eth.StateManager().GetAddrState(keyPair.Address()).Account |
|
|
|
|
|
|
|
c := ethchain.MakeContract(callerTx, state) |
|
|
|
|
|
|
|
callerClosure := ethchain.NewClosure(account, c, c.Script(), state, ethutil.Big(gasStr), new(big.Int)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
block := ui.eth.BlockChain().CurrentBlock |
|
|
|
|
|
|
|
vm := ethchain.NewVm(state, ethchain.RuntimeVars{ |
|
|
|
|
|
|
|
Origin: account.Address(), |
|
|
|
|
|
|
|
BlockNumber: block.BlockInfo().Number, |
|
|
|
|
|
|
|
PrevHash: block.PrevHash, |
|
|
|
|
|
|
|
Coinbase: block.Coinbase, |
|
|
|
|
|
|
|
Time: block.Time, |
|
|
|
|
|
|
|
Diff: block.Difficulty, |
|
|
|
|
|
|
|
TxData: nil, |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
callerClosure.Call(vm, nil, func(op ethchain.OpCode, mem *ethchain.Memory, stack *ethchain.Stack) { |
|
|
|
|
|
|
|
ui.win.Root().Call("clearMem") |
|
|
|
|
|
|
|
ui.win.Root().Call("clearStack") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
addr := 0 |
|
|
|
|
|
|
|
for i := 0; i+32 <= mem.Len(); i += 32 { |
|
|
|
|
|
|
|
ui.win.Root().Call("setMem", memAddr{fmt.Sprintf("%03d", addr), fmt.Sprintf("% x", mem.Data()[i:i+32])}) |
|
|
|
|
|
|
|
addr++ |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for _, val := range stack.Data() { |
|
|
|
|
|
|
|
ui.win.Root().Call("setStack", val.String()) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
state.Reset() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return "", nil |
|
|
|
|
|
|
|
} |
|
|
|