Browse Source

Merge pull request #1961 from arkpar/mix_fix

Mix: a few issues
cl-refactor
Gav Wood 10 years ago
parent
commit
c839f73a1e
  1. 151
      mix/ClientModel.cpp
  2. 1
      mix/qml.qrc
  3. 27
      mix/qml/ContractLibrary.qml
  4. 29
      mix/qml/StateListModel.qml
  5. 2
      mix/qml/TransactionDialog.qml
  6. 4
      mix/qml/html/cm/codemirror.css
  7. 2
      mix/qml/html/cm/solidityToken.js

151
mix/ClientModel.cpp

@ -256,32 +256,17 @@ void ClientModel::setupState(QVariantMap _state)
u256 value = (qvariant_cast<QEther*>(transaction.value("value")))->toU256Wei(); u256 value = (qvariant_cast<QEther*>(transaction.value("value")))->toU256Wei();
u256 gasPrice = (qvariant_cast<QEther*>(transaction.value("gasPrice")))->toU256Wei(); u256 gasPrice = (qvariant_cast<QEther*>(transaction.value("gasPrice")))->toU256Wei();
QString sender = transaction.value("sender").toString(); QString sender = transaction.value("sender").toString();
bool isStdContract = transaction.value("stdContract").toBool();
bool isContractCreation = transaction.value("isContractCreation").toBool(); bool isContractCreation = transaction.value("isContractCreation").toBool();
bool isFunctionCall = transaction.value("isFunctionCall").toBool(); bool isFunctionCall = transaction.value("isFunctionCall").toBool();
if (isStdContract) if (contractId.isEmpty() && m_codeModel->hasContract()) //TODO: This is to support old project files, remove later
{ contractId = m_codeModel->contracts().keys()[0];
if (contractId.isEmpty()) //TODO: This is to support old project files, remove later TransactionSettings transactionSettings(contractId, functionId, value, gas, gasAuto, gasPrice, Secret(sender.toStdString()), isContractCreation, isFunctionCall);
contractId = functionId; transactionSettings.parameterValues = transaction.value("parameters").toMap();
TransactionSettings transactionSettings(contractId, transaction.value("url").toString());
transactionSettings.gasPrice = 10000000000000;
transactionSettings.gasAuto = true;
transactionSettings.value = 0;
transactionSettings.sender = Secret(sender.toStdString());
transactionSequence.push_back(transactionSettings);
}
else
{
if (contractId.isEmpty() && m_codeModel->hasContract()) //TODO: This is to support old project files, remove later
contractId = m_codeModel->contracts().keys()[0];
TransactionSettings transactionSettings(contractId, functionId, value, gas, gasAuto, gasPrice, Secret(sender.toStdString()), isContractCreation, isFunctionCall);
transactionSettings.parameterValues = transaction.value("parameters").toMap();
if (contractId == functionId || functionId == "Constructor") if (contractId == functionId || functionId == "Constructor")
transactionSettings.functionId.clear(); transactionSettings.functionId.clear();
transactionSequence.push_back(transactionSettings); transactionSequence.push_back(transactionSettings);
}
} }
m_ethAccounts->setAccounts(userAccounts); m_ethAccounts->setAccounts(userAccounts);
executeSequence(transactionSequence, accounts, Secret(_state.value("miner").toMap().value("secret").toString().toStdString())); executeSequence(transactionSequence, accounts, Secret(_state.value("miner").toMap().value("secret").toString().toStdString()));
@ -319,79 +304,66 @@ void ClientModel::executeSequence(vector<TransactionSettings> const& _sequence,
continue; continue;
} }
ContractCallDataEncoder encoder; ContractCallDataEncoder encoder;
if (!transaction.stdContractUrl.isEmpty()) //encode data
CompiledContract const& compilerRes = m_codeModel->contract(ctrInstance.first);
QFunctionDefinition const* f = nullptr;
bytes contractCode = compilerRes.bytes();
shared_ptr<QContractDefinition> contractDef = compilerRes.sharedContract();
if (transaction.functionId.isEmpty())
f = contractDef->constructor();
else
for (QFunctionDefinition const* tf: contractDef->functionsList())
if (tf->name() == transaction.functionId)
{
f = tf;
break;
}
if (!f)
{ {
//std contract emit runFailed("Function '" + transaction.functionId + tr("' not found. Please check transactions or the contract code."));
bytes const& stdContractCode = m_codeModel->getStdContractCode(transaction.contractId, transaction.stdContractUrl); m_running = false;
TransactionSettings stdTransaction = transaction; emit runStateChanged();
stdTransaction.gasAuto = true; return;
Address address = deployContract(stdContractCode, stdTransaction); }
m_stdContractAddresses[stdTransaction.contractId] = address; if (!transaction.functionId.isEmpty())
m_stdContractNames[address] = stdTransaction.contractId; encoder.encode(f);
for (QVariableDeclaration const* p: f->parametersList())
{
QSolidityType const* type = p->type();
QVariant value = transaction.parameterValues.value(p->name());
if (type->type().type == SolidityType::Type::Address)
{
std::pair<QString, int> ctrParamInstance = resolvePair(value.toString());
value = QVariant(resolveToken(ctrParamInstance, deployedContracts));
}
encoder.encode(value, type->type());
}
if (transaction.functionId.isEmpty() || transaction.functionId == ctrInstance.first)
{
bytes param = encoder.encodedData();
contractCode.insert(contractCode.end(), param.begin(), param.end());
Address newAddress = deployContract(contractCode, transaction);
deployedContracts.push_back(newAddress);
std::pair<QString, int> contractToken = retrieveToken(transaction.contractId, deployedContracts);
m_contractAddresses[contractToken] = newAddress;
m_contractNames[newAddress] = contractToken.first;
contractAddressesChanged();
gasCostsChanged();
} }
else else
{ {
//encode data auto contractAddressIter = m_contractAddresses.find(ctrInstance);
CompiledContract const& compilerRes = m_codeModel->contract(ctrInstance.first); if (contractAddressIter == m_contractAddresses.end())
QFunctionDefinition const* f = nullptr;
bytes contractCode = compilerRes.bytes();
shared_ptr<QContractDefinition> contractDef = compilerRes.sharedContract();
if (transaction.functionId.isEmpty())
f = contractDef->constructor();
else
for (QFunctionDefinition const* tf: contractDef->functionsList())
if (tf->name() == transaction.functionId)
{
f = tf;
break;
}
if (!f)
{ {
emit runFailed("Function '" + transaction.functionId + tr("' not found. Please check transactions or the contract code.")); emit runFailed("Contract '" + transaction.contractId + tr(" not deployed.") + "' " + tr(" Cannot call ") + transaction.functionId);
m_running = false; m_running = false;
emit runStateChanged(); emit runStateChanged();
return; return;
} }
if (!transaction.functionId.isEmpty()) callAddress(contractAddressIter->second, encoder.encodedData(), transaction);
encoder.encode(f);
for (QVariableDeclaration const* p: f->parametersList())
{
QSolidityType const* type = p->type();
QVariant value = transaction.parameterValues.value(p->name());
if (type->type().type == SolidityType::Type::Address)
{
std::pair<QString, int> ctrParamInstance = resolvePair(value.toString());
value = QVariant(resolveToken(ctrParamInstance, deployedContracts));
}
encoder.encode(value, type->type());
}
if (transaction.functionId.isEmpty() || transaction.functionId == ctrInstance.first)
{
bytes param = encoder.encodedData();
contractCode.insert(contractCode.end(), param.begin(), param.end());
Address newAddress = deployContract(contractCode, transaction);
deployedContracts.push_back(newAddress);
std::pair<QString, int> contractToken = retrieveToken(transaction.contractId, deployedContracts);
m_contractAddresses[contractToken] = newAddress;
m_contractNames[newAddress] = contractToken.first;
contractAddressesChanged();
gasCostsChanged();
}
else
{
auto contractAddressIter = m_contractAddresses.find(ctrInstance);
if (contractAddressIter == m_contractAddresses.end())
{
emit runFailed("Contract '" + transaction.contractId + tr(" not deployed.") + "' " + tr(" Cannot call ") + transaction.functionId);
m_running = false;
emit runStateChanged();
return;
}
callAddress(contractAddressIter->second, encoder.encodedData(), transaction);
}
m_gasCosts.append(m_client->lastExecution().gasUsed);
} }
m_gasCosts.append(m_client->lastExecution().gasUsed);
onNewTransaction(); onNewTransaction();
} }
m_running = false; m_running = false;
@ -697,14 +669,7 @@ void ClientModel::onNewTransaction()
if (creation) if (creation)
{ {
//contract creation //contract creation
auto const stdContractName = m_stdContractNames.find(tr.contractAddress); function = QObject::tr("Constructor");
if (stdContractName != m_stdContractNames.end())
{
function = stdContractName->second;
contract = function;
}
else
function = QObject::tr("Constructor");
address = QObject::tr("(Create contract)"); address = QObject::tr("(Create contract)");
} }
else else

1
mix/qml.qrc

@ -8,7 +8,6 @@
<file>qml/CodeEditorStyle.qml</file> <file>qml/CodeEditorStyle.qml</file>
<file>qml/CodeEditorView.qml</file> <file>qml/CodeEditorView.qml</file>
<file>qml/CommonSeparator.qml</file> <file>qml/CommonSeparator.qml</file>
<file>qml/ContractLibrary.qml</file>
<file>qml/DebugBasicInfo.qml</file> <file>qml/DebugBasicInfo.qml</file>
<file>qml/DebugInfoList.qml</file> <file>qml/DebugInfoList.qml</file>
<file>qml/Debugger.qml</file> <file>qml/Debugger.qml</file>

27
mix/qml/ContractLibrary.qml

@ -1,27 +0,0 @@
import QtQuick 2.2
Item {
id: contractLibrary
property alias model: contractListModel;
Connections {
target: mainApplication
onLoaded: {
//TODO: load a list, dependencies, ets, from external files
contractListModel.append({
name: "Config",
url: "qrc:///stdc/std.sol",
});
contractListModel.append({
name: "NameReg",
url: "qrc:///stdc/std.sol",
});
}
}
ListModel {
id: contractListModel
}
}

29
mix/qml/StateListModel.qml

@ -22,7 +22,7 @@ Item {
s.contracts = []; s.contracts = [];
return { return {
title: s.title, title: s.title,
transactions: s.transactions.map(fromPlainTransactionItem), transactions: s.transactions.filter(function(t) { return !t.stdContract; }).map(fromPlainTransactionItem), //support old projects by filtering std contracts
accounts: s.accounts.map(fromPlainAccountItem), accounts: s.accounts.map(fromPlainAccountItem),
contracts: s.contracts.map(fromPlainAccountItem), contracts: s.contracts.map(fromPlainAccountItem),
miner: s.miner miner: s.miner
@ -54,7 +54,6 @@ Item {
gas: QEtherHelper.createBigInt(t.gas.value), gas: QEtherHelper.createBigInt(t.gas.value),
gasPrice: QEtherHelper.createEther(t.gasPrice.value, t.gasPrice.unit), gasPrice: QEtherHelper.createEther(t.gasPrice.value, t.gasPrice.unit),
gasAuto: t.gasAuto, gasAuto: t.gasAuto,
stdContract: t.stdContract ? true : false,
parameters: {}, parameters: {},
sender: t.sender, sender: t.sender,
isContractCreation: t.isContractCreation, isContractCreation: t.isContractCreation,
@ -122,7 +121,6 @@ Item {
gas: { value: t.gas.value() }, gas: { value: t.gas.value() },
gasAuto: t.gasAuto, gasAuto: t.gasAuto,
gasPrice: { value: t.gasPrice.value, unit: t.gasPrice.unit }, gasPrice: { value: t.gasPrice.value, unit: t.gasPrice.unit },
stdContract: t.stdContract,
sender: t.sender, sender: t.sender,
parameters: {}, parameters: {},
isContractCreation: t.isContractCreation, isContractCreation: t.isContractCreation,
@ -189,10 +187,6 @@ Item {
} }
} }
ContractLibrary {
id: contractLibrary;
}
ListModel { ListModel {
id: stateListModel id: stateListModel
property int defaultStateIndex: 0 property int defaultStateIndex: 0
@ -226,18 +220,6 @@ Item {
item.accounts.push(account); item.accounts.push(account);
item.miner = account; item.miner = account;
//add all stdc contracts
for (var i = 0; i < contractLibrary.model.count; i++) {
var contractTransaction = defaultTransactionItem();
var contractItem = contractLibrary.model.get(i);
contractTransaction.url = contractItem.url;
contractTransaction.contractId = contractItem.name;
contractTransaction.functionId = contractItem.name;
contractTransaction.stdContract = true;
contractTransaction.sender = item.accounts[0].secret; // default account is used to deploy std contract.
item.transactions.push(contractTransaction);
};
//add constructors, //TODO: order by dependencies //add constructors, //TODO: order by dependencies
for(var c in codeModel.contracts) { for(var c in codeModel.contracts) {
var ctorTr = defaultTransactionItem(); var ctorTr = defaultTransactionItem();
@ -273,17 +255,12 @@ Item {
} }
function addNewContracts() { function addNewContracts() {
//add new contracts for all states //add new contracts to empty states
var changed = false; var changed = false;
for (var c in codeModel.contracts) { for (var c in codeModel.contracts) {
for (var s = 0; s < stateListModel.count; s++) { for (var s = 0; s < stateListModel.count; s++) {
var state = stateList[s]; var state = stateList[s];
for (var t = 0; t < state.transactions.length; t++) { if (state.transactions.length === 0) {
var transaction = state.transactions[t];
if (transaction.functionId === c && transaction.contractId === c)
break;
}
if (t === state.transactions.length) {
//append this contract //append this contract
var ctorTr = defaultTransactionItem(); var ctorTr = defaultTransactionItem();
ctorTr.functionId = c; ctorTr.functionId = c;

2
mix/qml/TransactionDialog.qml

@ -210,6 +210,8 @@ Dialog {
} }
item.isContractCreation = trType.checked; item.isContractCreation = trType.checked;
if (item.isContractCreation)
item.functionId = item.contractId;
item.isFunctionCall = item.functionId !== " - "; item.isFunctionCall = item.functionId !== " - ";
if (!item.isContractCreation) if (!item.isContractCreation)

4
mix/qml/html/cm/codemirror.css

@ -8,6 +8,10 @@
font-size:12px font-size:12px
} }
.CodeMirror-search-field {
height:200%;
}
/* BREAKPOINTS */ /* BREAKPOINTS */
.breakpoints {width: .8em;} .breakpoints {width: .8em;}
.breakpoint { color: #822; } .breakpoint { color: #822; }

2
mix/qml/html/cm/solidityToken.js

@ -5,7 +5,7 @@ function solCurrency()
function solKeywords() function solKeywords()
{ {
return { "break": true, "case": true, "constant": true, "continue": true, "contract": true, "default": true, "do": true, "else": true, "event": true, "external": true, "is": true, "indexed": true, "for": true, "function": true, "if": true, "import": true, "mapping": true, "modifier": true, "new": true, "public": true, "private": true, "internal": true, "return": true, "returns": true, "struct": true, "switch": true, "var": true, "while": true, "enum": true }; return { "break": true, "case": true, "constant": true, "continue": true, "contract": true, "default": true, "delete": true, "do": true, "else": true, "event": true, "external": true, "is": true, "indexed": true, "for": true, "function": true, "if": true, "import": true, "mapping": true, "modifier": true, "new": true, "public": true, "private": true, "internal": true, "return": true, "returns": true, "struct": true, "switch": true, "var": true, "while": true, "enum": true };
} }
function solStdContract() function solStdContract()

Loading…
Cancel
Save