Payload requires 'contract' and 'address'

This commit is contained in:
Richard Ramos 2018-08-15 14:11:49 -04:00
parent 9badb2f3fe
commit 3d5739715b
8 changed files with 32 additions and 22 deletions

View File

@ -87,8 +87,9 @@ const msgObj = {
powTime: 20, powTime: 20,
topic: "0x4964656e", topic: "0x4964656e",
payload: web3.utils.toHex({ payload: web3.utils.toHex({
'address': "0x692a70d2e424a56d2c6c27aa97d1a86395877b3a", 'contract': "0x692a70d2e424a56d2c6c27aa97d1a86395877b3a",
'encodedFunctionCall': funCall 'encodedFunctionCall': funCall,
'address': web3.eth.defaultAccount
}) })
}; };

View File

@ -23,7 +23,7 @@ class MessageProcessor {
} }
async _validateInput(message){ async _validateInput(message){
console.info("Processing request to: %s, %s", message.input.address, message.input.functionName); console.info("Processing request to: %s, %s", message.input.contract, message.input.functionName);
const contract = this.settings.getContractByTopic(message.topic); const contract = this.settings.getContractByTopic(message.topic);
@ -37,24 +37,31 @@ class MessageProcessor {
return false; return false;
} }
// Get code from address and compare it against the contract code // Get code from contract and compare it against the contract code
if(!contract.isIdentity){ if(!contract.isIdentity){
const code = this.web3.utils.soliditySha3(await this.web3.eth.getCode(message.input.address)); const code = this.web3.utils.soliditySha3(await this.web3.eth.getCode(message.input.contract));
if(code != contract.code){ if(code != contract.code){
this._reply('Invalid contract code', message); this._reply('Invalid contract code', message);
return false; return false;
} }
} else { } else {
if(!(/^0x[0-9a-f]{40}$/i).test(message.input.address)){ if(!(/^0x[0-9a-f]{40}$/i).test(message.input.contract)){
this._reply('Invalid address', message); this._reply('Invalid contract address', message);
return false; return false;
} }
} }
if(message.input.address && !(/^0x[0-9a-f]{40}$/i).test(message.input.address)){
this._reply('Invalid address', message);
return false;
}
return true; return true;
} }
_extractInput(message){ _extractInput(message){
let obj = { let obj = {
contract: null,
address: null, address: null,
functionName: null, functionName: null,
functionParameters: null, functionParameters: null,
@ -64,8 +71,8 @@ class MessageProcessor {
try { try {
const msg = this.web3.utils.toAscii(message.payload); const msg = this.web3.utils.toAscii(message.payload);
let parsedObj = JSON.parse(msg); let parsedObj = JSON.parse(msg);
obj.contract = parsedObj.contract;
obj.address = parsedObj.address; obj.address = parsedObj.address;
obj.wallet = parsedObj.wallet;
obj.functionName = parsedObj.encodedFunctionCall.slice(0, 10); obj.functionName = parsedObj.encodedFunctionCall.slice(0, 10);
obj.functionParameters = "0x" + parsedObj.encodedFunctionCall.slice(10); obj.functionParameters = "0x" + parsedObj.encodedFunctionCall.slice(10);
obj.payload = parsedObj.encodedFunctionCall; obj.payload = parsedObj.encodedFunctionCall;
@ -103,7 +110,7 @@ class MessageProcessor {
let p = { let p = {
from: this.config.node.blockchain.account, from: this.config.node.blockchain.account,
to: message.input.address, to: message.input.contract,
value: 0, value: 0,
data: message.input.payload, data: message.input.payload,
gasPrice: this.config.gasPrice gasPrice: this.config.gasPrice

View File

@ -4,7 +4,7 @@ const erc20ABI = require('../../abi/ERC20Token.json');
class IdentityStrategy extends Strategy { class IdentityStrategy extends Strategy {
async _validateInstance(message){ async _validateInstance(message){
const instanceCodeHash = this.web3.utils.soliditySha3(await this.web3.eth.getCode(message.input.address)); const instanceCodeHash = this.web3.utils.soliditySha3(await this.web3.eth.getCode(message.input.contract));
const kernelVerifSignature = this.web3.utils.soliditySha3(this.contract.kernelVerification).slice(0, 10); const kernelVerifSignature = this.web3.utils.soliditySha3(this.contract.kernelVerification).slice(0, 10);
if(instanceCodeHash === null) return false; if(instanceCodeHash === null) return false;
@ -35,14 +35,14 @@ class IdentityStrategy extends Strategy {
if(this.contract.allowedFunctions[message.input.functionName].isToken){ if(this.contract.allowedFunctions[message.input.functionName].isToken){
const Token = new this.web3.eth.Contract(erc20ABI.abi); const Token = new this.web3.eth.Contract(erc20ABI.abi);
Token.options.address = params('_baseToken'); Token.options.address = params('_baseToken');
const tokenBalance = new this.web3.utils.BN(await Token.methods.balanceOf(message.input.address).call()); const tokenBalance = new this.web3.utils.BN(await Token.methods.balanceOf(message.input.contract).call());
if(tokenBalance.lt(this.web3.utils.toBN(params('_value')))){ if(tokenBalance.lt(this.web3.utils.toBN(params('_value')))){
return {success: false, message: "Identity has not enough balance for specified value"}; return {success: false, message: "Identity has not enough balance for specified value"};
} }
} }
// gasPrice * limit calculation // gasPrice * limit calculation
const balance = await this.getBalance(message.input.address, token); const balance = await this.getBalance(message.input.contract, token);
if(balance.lt(this.web3.utils.toBN(gasPrice.mul(gasLimit)))) { if(balance.lt(this.web3.utils.toBN(gasPrice.mul(gasLimit)))) {
return {success: false, message: "Identity has not enough tokens for gasPrice*gasLimit"}; return {success: false, message: "Identity has not enough tokens for gasPrice*gasLimit"};
} }

View File

@ -13,13 +13,13 @@ class SNTStrategy extends Strategy {
const token = this.settings.getTokenBySymbol("SNT"); const token = this.settings.getTokenBySymbol("SNT");
if(token == undefined) return {success: false, message: "Token not allowed"}; if(token == undefined) return {success: false, message: "Token not allowed"};
const balance = await this.getBalance(message.input.wallet, token); const balance = await this.getBalance(message.input.address, token);
if(message.input.functionName == TransferSNT){ if(message.input.functionName == TransferSNT){
const estimatedGas = await this.web3.eth.estimateGas({ const estimatedGas = await this.web3.eth.estimateGas({
data: message.input.payload, data: message.input.payload,
from: this.config.node.blockchain.account, from: this.config.node.blockchain.account,
to: message.input.address to: message.input.contract
}); });
const gas = this.web3.utils.toBN(estimatedGas); const gas = this.web3.utils.toBN(estimatedGas);

View File

@ -126,8 +126,9 @@ class ApproveAndCallGasRelayed extends Component {
topic: this.state.topic, topic: this.state.topic,
symKeyID: skid, symKeyID: skid,
payload: web3.utils.toHex({ payload: web3.utils.toHex({
'address': this.props.identityAddress, 'contract': this.props.identityAddress,
'encodedFunctionCall': funCall 'encodedFunctionCall': funCall,
'address': web3.eth.defaultAccount
}) })
}; };

View File

@ -128,8 +128,9 @@ class CallGasRelayed extends Component {
topic: this.state.topic, topic: this.state.topic,
symKeyID: skid, symKeyID: skid,
payload: web3.utils.toHex({ payload: web3.utils.toHex({
'address': this.props.identityAddress, 'contract': this.props.identityAddress,
'encodedFunctionCall': funCall 'encodedFunctionCall': funCall,
'address': web3.eth.defaultAccount
}) })
}; };

View File

@ -131,8 +131,8 @@ class Execute extends Component {
topic: this.state.topic, topic: this.state.topic,
symKeyID: skid, symKeyID: skid,
payload: web3.utils.toHex({ payload: web3.utils.toHex({
'address': SNTController.options.address, 'contract': SNTController.options.address,
'wallet': accounts[2], 'address': accounts[2],
'encodedFunctionCall': funCall 'encodedFunctionCall': funCall
}) })
}; };

View File

@ -128,8 +128,8 @@ class TransferSNT extends Component {
topic: this.state.topic, topic: this.state.topic,
symKeyID: skid, symKeyID: skid,
payload: web3.utils.toHex({ payload: web3.utils.toHex({
'address': SNTController.options.address, 'contract': SNTController.options.address,
'wallet': accounts[2], 'address': accounts[2],
'encodedFunctionCall': funCall 'encodedFunctionCall': funCall
}) })
}; };