Skip to content

Commit 1ad8dfa

Browse files
authored
Merge pull request #146 from ethereum/statemutability
Add stateMutability field to ABI translator
2 parents 2cc698e + 0f9f64d commit 1ad8dfa

File tree

2 files changed

+36
-11
lines changed

2 files changed

+36
-11
lines changed

abi.js

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,22 @@ function update (compilerVersion, abi) {
1818
hasFallback = true;
1919
}
2020

21-
// add 'payable' to everything except events
22-
if (item.type !== 'event' && semver.lt(compilerVersion, '0.4.0')) {
23-
item.payable = true;
21+
if (item.type !== 'event') {
22+
// add 'payable' to everything
23+
if (semver.lt(compilerVersion, '0.4.0')) {
24+
item.payable = true;
25+
}
26+
27+
// add stateMutability field
28+
if (semver.lt(compilerVersion, '0.4.16')) {
29+
if (item.payable) {
30+
item.stateMutability = 'payable';
31+
} else if (item.constant) {
32+
item.stateMutability = 'view';
33+
} else {
34+
item.stateMutability = 'nonpayable';
35+
}
36+
}
2437
}
2538
}
2639

@@ -29,14 +42,16 @@ function update (compilerVersion, abi) {
2942
abi.push({
3043
type: 'constructor',
3144
payable: true,
45+
stateMutability: 'payable',
3246
inputs: []
3347
});
3448
}
3549

3650
if (!hasFallback && semver.lt(compilerVersion, '0.4.0')) {
3751
abi.push({
3852
type: 'fallback',
39-
payable: true
53+
payable: true,
54+
stateMutability: 'payable'
4055
});
4156
}
4257

test/abi.js

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,37 +7,47 @@ tape('ABI translator', function (t) {
77
st.end();
88
});
99
t.test('0.1.1 (no constructor)', function (st) {
10-
st.deepEqual(abi.update('0.1.1', []), [ { inputs: [], payable: true, type: 'constructor' }, { payable: true, type: 'fallback' } ]);
10+
st.deepEqual(abi.update('0.1.1', []), [ { inputs: [], payable: true, stateMutability: 'payable', type: 'constructor' }, { payable: true, stateMutability: 'payable', type: 'fallback' } ]);
1111
st.end();
1212
});
1313
t.test('0.3.6 (constructor)', function (st) {
1414
var input = [ { inputs: [], type: 'constructor' } ];
15-
st.deepEqual(abi.update('0.3.6', input), [ { inputs: [], payable: true, type: 'constructor' }, { payable: true, type: 'fallback' } ]);
15+
st.deepEqual(abi.update('0.3.6', input), [ { inputs: [], payable: true, stateMutability: 'payable', type: 'constructor' }, { payable: true, stateMutability: 'payable', type: 'fallback' } ]);
1616
st.end();
1717
});
1818
t.test('0.3.6 (function)', function (st) {
1919
var input = [ { inputs: [], type: 'function' } ];
20-
st.deepEqual(abi.update('0.3.6', input), [ { inputs: [], payable: true, type: 'function' }, { payable: true, type: 'fallback' } ]);
20+
st.deepEqual(abi.update('0.3.6', input), [ { inputs: [], payable: true, stateMutability: 'payable', type: 'function' }, { payable: true, stateMutability: 'payable', type: 'fallback' } ]);
2121
st.end();
2222
});
2323
t.test('0.3.6 (event)', function (st) {
2424
var input = [ { inputs: [], type: 'event' } ];
25-
st.deepEqual(abi.update('0.3.6', input), [ { inputs: [], type: 'event' }, { payable: true, type: 'fallback' } ]);
25+
st.deepEqual(abi.update('0.3.6', input), [ { inputs: [], type: 'event' }, { payable: true, stateMutability: 'payable', type: 'fallback' } ]);
2626
st.end();
2727
});
2828
t.test('0.4.0 (has fallback)', function (st) {
2929
var input = [ { inputs: [], type: 'constructor' } ];
30-
st.deepEqual(abi.update('0.4.0', input), [ { inputs: [], payable: true, type: 'constructor' } ]);
30+
st.deepEqual(abi.update('0.4.0', input), [ { inputs: [], payable: true, stateMutability: 'payable', type: 'constructor' } ]);
31+
st.end();
32+
});
33+
t.test('0.4.0 (constant function)', function (st) {
34+
var input = [ { inputs: [], type: 'function', constant: true } ];
35+
st.deepEqual(abi.update('0.4.0', input), [ { inputs: [], constant: true, stateMutability: 'view', type: 'function' } ]);
3136
st.end();
3237
});
3338
t.test('0.4.1 (constructor not payable)', function (st) {
3439
var input = [ { inputs: [], payable: false, type: 'constructor' } ];
35-
st.deepEqual(abi.update('0.4.1', input), [ { inputs: [], payable: true, type: 'constructor' } ]);
40+
st.deepEqual(abi.update('0.4.1', input), [ { inputs: [], payable: true, stateMutability: 'payable', type: 'constructor' } ]);
3641
st.end();
3742
});
3843
t.test('0.4.5 (constructor payable)', function (st) {
3944
var input = [ { inputs: [], payable: false, type: 'constructor' } ];
40-
st.deepEqual(abi.update('0.4.5', input), [ { inputs: [], payable: false, type: 'constructor' } ]);
45+
st.deepEqual(abi.update('0.4.5', input), [ { inputs: [], payable: false, stateMutability: 'nonpayable', type: 'constructor' } ]);
46+
st.end();
47+
});
48+
t.test('0.4.16 (statemutability)', function (st) {
49+
var input = [ { inputs: [], payable: false, stateMutability: 'pure', type: 'function' } ];
50+
st.deepEqual(abi.update('0.4.16', input), [ { inputs: [], payable: false, stateMutability: 'pure', type: 'function' } ]);
4151
st.end();
4252
});
4353
});

0 commit comments

Comments
 (0)