or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

abi-utilities.mdcli.mdcompilation.mdindex.mdlinking.mdsmt-integration.mdutilities.mdversion-management.md

abi-utilities.mddocs/

0

# ABI Utilities

1

2

Translate and update ABI definitions across different Solidity compiler versions to ensure compatibility with modern tooling and standards.

3

4

## Capabilities

5

6

### ABI Update

7

8

Update ABI definitions from older compiler versions to include modern fields and comply with current standards.

9

10

```typescript { .api }

11

/**

12

* Update ABI to latest standard format with modern fields

13

* @param compilerVersion - Semantic version string of the compiler that generated the ABI

14

* @param abi - Original ABI array from compiler output

15

* @returns Updated ABI array with modern fields added

16

*/

17

function update(compilerVersion: string, abi: any[]): any[];

18

```

19

20

**Usage Examples:**

21

22

```typescript

23

import abi from "solc/abi";

24

25

// Update ABI from old compiler version

26

const oldABI = [

27

{

28

constant: false,

29

inputs: [],

30

name: 'hello',

31

outputs: [{ name: '', type: 'string' }],

32

payable: false,

33

type: 'function'

34

}

35

];

36

37

const updatedABI = abi.update('0.3.6', oldABI);

38

console.log(updatedABI);

39

/* Output includes modern fields:

40

[

41

{

42

constant: false,

43

inputs: [],

44

name: 'hello',

45

outputs: [{ name: '', type: 'string' }],

46

payable: true,

47

stateMutability: 'payable',

48

type: 'function'

49

},

50

{

51

type: 'fallback',

52

payable: true,

53

stateMutability: 'payable'

54

}

55

]

56

*/

57

```

58

59

### Version-Specific Updates

60

61

The ABI updater applies different transformations based on the compiler version:

62

63

**Pre-0.4.0 Changes:**

64

- Adds `payable: true` to all non-constant functions

65

- Adds default constructor if missing

66

- Adds default fallback function

67

68

**Pre-0.4.5 Changes:**

69

- Assumes all constructors are payable

70

71

**Pre-0.4.16 Changes:**

72

- Adds `stateMutability` field based on `payable` and `constant` flags:

73

- `payable: true``stateMutability: 'payable'`

74

- `constant: true``stateMutability: 'view'`

75

- Otherwise → `stateMutability: 'nonpayable'`

76

77

**Pre-0.1.2 Changes:**

78

- Adds default constructor with payable state

79

80

```typescript

81

import abi from "solc/abi";

82

83

// Different behavior based on version

84

const modernVersion = abi.update('0.8.0', originalABI); // Minimal changes

85

const oldVersion = abi.update('0.3.0', originalABI); // Many compatibility additions

86

```

87

88

### ABI Field Evolution

89

90

Understanding how ABI fields have evolved across compiler versions:

91

92

```typescript { .api }

93

interface ABIFunction {

94

type: 'function' | 'constructor' | 'fallback' | 'receive' | 'event';

95

name?: string;

96

inputs: ABIParameter[];

97

outputs?: ABIParameter[];

98

99

// Legacy field (pre-0.4.16)

100

constant?: boolean;

101

102

// Legacy field (pre-0.4.16)

103

payable?: boolean;

104

105

// Modern field (0.4.16+)

106

stateMutability?: 'pure' | 'view' | 'nonpayable' | 'payable';

107

}

108

109

interface ABIParameter {

110

name: string;

111

type: string;

112

components?: ABIParameter[]; // For structs and tuples

113

indexed?: boolean; // For events

114

}

115

```

116

117

### Practical Usage Scenarios

118

119

**Legacy Contract Integration:**

120

121

```typescript

122

import solc from "solc";

123

import abi from "solc/abi";

124

125

// When working with contracts compiled by old versions

126

const legacyOutput = JSON.parse(fs.readFileSync('legacy-contract-output.json'));

127

const contractABI = legacyOutput.contracts['Contract.sol']['MyContract'].interface;

128

129

// Parse and update the ABI

130

const parsedABI = JSON.parse(contractABI);

131

const modernABI = abi.update('0.3.6', parsedABI);

132

133

// Now compatible with modern web3 libraries

134

const contract = new web3.eth.Contract(modernABI, contractAddress);

135

```

136

137

**ABI Compatibility Checking:**

138

139

```typescript

140

import abi from "solc/abi";

141

142

function ensureModernABI(contractABI: any[], compilerVersion: string) {

143

// Check if ABI needs updating

144

const hasStateMutability = contractABI.some(item =>

145

item.type === 'function' && 'stateMutability' in item

146

);

147

148

if (!hasStateMutability) {

149

console.log('Updating legacy ABI to modern format');

150

return abi.update(compilerVersion, contractABI);

151

}

152

153

return contractABI;

154

}

155

```

156

157

### State Mutability Migration

158

159

The most significant change handled by the ABI updater is the migration from `constant`/`payable` flags to `stateMutability`:

160

161

```typescript

162

// Before (legacy format)

163

const legacyFunction = {

164

type: 'function',

165

name: 'getValue',

166

constant: true,

167

payable: false,

168

inputs: [],

169

outputs: [{ name: '', type: 'uint256' }]

170

};

171

172

// After ABI update

173

const modernFunction = {

174

type: 'function',

175

name: 'getValue',

176

constant: true, // Preserved for compatibility

177

payable: false, // Preserved for compatibility

178

stateMutability: 'view', // Added based on constant: true

179

inputs: [],

180

outputs: [{ name: '', type: 'uint256' }]

181

};

182

```

183

184

### Default Function Addition

185

186

For very old compiler versions, the updater adds missing default functions:

187

188

```typescript

189

// Original ABI from pre-0.1.2 compiler

190

const originalABI = [

191

{

192

type: 'function',

193

name: 'myFunction',

194

inputs: [],

195

outputs: []

196

}

197

];

198

199

// Updated ABI includes default constructor and fallback

200

const updatedABI = abi.update('0.1.1', originalABI);

201

/* Result:

202

[

203

{

204

type: 'function',

205

name: 'myFunction',

206

inputs: [],

207

outputs: [],

208

payable: true,

209

stateMutability: 'payable'

210

},

211

{

212

type: 'constructor',

213

payable: true,

214

stateMutability: 'payable',

215

inputs: []

216

},

217

{

218

type: 'fallback',

219

payable: true,

220

stateMutability: 'payable'

221

}

222

]

223

*/

224

```