Implements Trace API Formatter (#2732)
* Add formatter for Traces API output (#2700) * Adding formatter tests (#2700)
This commit is contained in:
parent
146cefdb32
commit
248437fa1d
@ -163,3 +163,58 @@ export function outTransaction (tx) {
|
|||||||
|
|
||||||
return tx;
|
return tx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function outTrace (trace) {
|
||||||
|
if (trace) {
|
||||||
|
if (trace.action) {
|
||||||
|
Object.keys(trace.action).forEach(key => {
|
||||||
|
switch (key) {
|
||||||
|
case 'gas':
|
||||||
|
case 'value':
|
||||||
|
case 'balance':
|
||||||
|
trace.action[key] = outNumber(trace.action[key]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'from':
|
||||||
|
case 'to':
|
||||||
|
case 'address':
|
||||||
|
case 'refundAddress':
|
||||||
|
trace.action[key] = outAddress(trace.action[key]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (trace.result) {
|
||||||
|
Object.keys(trace.result).forEach(key => {
|
||||||
|
switch (key) {
|
||||||
|
case 'gasUsed':
|
||||||
|
trace.result[key] = outNumber(trace.result[key]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'address':
|
||||||
|
trace.action[key] = outAddress(trace.action[key]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (trace.traceAddress) {
|
||||||
|
trace.traceAddress.forEach((address, index) => {
|
||||||
|
trace.traceAddress[index] = outNumber(address);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Object.keys(trace).forEach((key) => {
|
||||||
|
switch (key) {
|
||||||
|
case 'subtraces':
|
||||||
|
case 'transactionPosition':
|
||||||
|
case 'blockNumber':
|
||||||
|
trace[key] = outNumber(trace[key]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return trace;
|
||||||
|
}
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
import BigNumber from 'bignumber.js';
|
import BigNumber from 'bignumber.js';
|
||||||
|
|
||||||
import { outBlock, outAccountInfo, outAddress, outDate, outNumber, outPeers, outReceipt, outTransaction } from './output';
|
import { outBlock, outAccountInfo, outAddress, outDate, outNumber, outPeers, outReceipt, outTransaction, outTrace } from './output';
|
||||||
import { isAddress, isBigNumber, isInstanceOf } from '../../../test/types';
|
import { isAddress, isBigNumber, isInstanceOf } from '../../../test/types';
|
||||||
|
|
||||||
describe('api/format/output', () => {
|
describe('api/format/output', () => {
|
||||||
@ -244,4 +244,47 @@ describe('api/format/output', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('outTrace', () => {
|
||||||
|
it('ignores and passes through unknown keys', () => {
|
||||||
|
expect(outTrace({ someRandom: 'someRandom' })).to.deep.equal({ someRandom: 'someRandom' });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('formats a trace with all the info converted', () => {
|
||||||
|
const formatted = outTrace({
|
||||||
|
type: 'call',
|
||||||
|
action: {
|
||||||
|
from: address,
|
||||||
|
to: address,
|
||||||
|
value: '0x06',
|
||||||
|
gas: '0x07',
|
||||||
|
input: '0x1234',
|
||||||
|
callType: 'call'
|
||||||
|
},
|
||||||
|
result: {
|
||||||
|
gasUsed: '0x08',
|
||||||
|
output: '0x5678'
|
||||||
|
},
|
||||||
|
traceAddress: [ '0x2' ],
|
||||||
|
subtraces: 3,
|
||||||
|
transactionPosition: '0xb',
|
||||||
|
transactionHash: '0x000000000000000000000000000000000000000000000000000000000000000c',
|
||||||
|
blockNumber: '0x0d',
|
||||||
|
blockHash: '0x000000000000000000000000000000000000000000000000000000000000000e'
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(isBigNumber(formatted.action.gas)).to.be.true;
|
||||||
|
expect(formatted.action.gas.toNumber()).to.equal(7);
|
||||||
|
expect(isBigNumber(formatted.action.value)).to.be.true;
|
||||||
|
expect(formatted.action.value.toNumber()).to.equal(6);
|
||||||
|
|
||||||
|
expect(formatted.action.from).to.equal(checksum);
|
||||||
|
expect(formatted.action.to).to.equal(checksum);
|
||||||
|
|
||||||
|
expect(isBigNumber(formatted.blockNumber)).to.be.true;
|
||||||
|
expect(formatted.blockNumber.toNumber()).to.equal(13);
|
||||||
|
expect(isBigNumber(formatted.transactionPosition)).to.be.true;
|
||||||
|
expect(formatted.transactionPosition.toNumber()).to.equal(11);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
import { inBlockNumber, inHex, inNumber16 } from '../../format/input';
|
import { inBlockNumber, inHex, inNumber16 } from '../../format/input';
|
||||||
|
import { outTrace } from '../../format/output';
|
||||||
|
|
||||||
export default class Trace {
|
export default class Trace {
|
||||||
constructor (transport) {
|
constructor (transport) {
|
||||||
@ -23,21 +24,25 @@ export default class Trace {
|
|||||||
|
|
||||||
filter (filterObj) {
|
filter (filterObj) {
|
||||||
return this._transport
|
return this._transport
|
||||||
.execute('trace_filter', filterObj);
|
.execute('trace_filter', filterObj)
|
||||||
|
.then(traces => traces.map(trace => outTrace(trace)));
|
||||||
}
|
}
|
||||||
|
|
||||||
get (txHash, position) {
|
get (txHash, position) {
|
||||||
return this._transport
|
return this._transport
|
||||||
.execute('trace_get', inHex(txHash), inNumber16(position));
|
.execute('trace_get', inHex(txHash), inNumber16(position))
|
||||||
|
.then(trace => outTrace(trace));
|
||||||
}
|
}
|
||||||
|
|
||||||
transaction (txHash) {
|
transaction (txHash) {
|
||||||
return this._transport
|
return this._transport
|
||||||
.execute('trace_transaction', inHex(txHash));
|
.execute('trace_transaction', inHex(txHash))
|
||||||
|
.then(traces => traces.map(trace => outTrace(trace)));
|
||||||
}
|
}
|
||||||
|
|
||||||
block (blockNumber = 'latest') {
|
block (blockNumber = 'latest') {
|
||||||
return this._transport
|
return this._transport
|
||||||
.execute('trace_block', inBlockNumber(blockNumber));
|
.execute('trace_block', inBlockNumber(blockNumber))
|
||||||
|
.then(traces => traces.map(trace => outTrace(trace)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user