Contract Compilation

ERC20 Contract

A standard ERC20 contract supports the following interface:
1
function totalSupply() external view returns (uint256);
2
function balanceOf(address account) external view returns (uint256);
3
function transfer(address recipient, uint256 amount) external returns (bool);
4
function allowance(address owner, address spender) external view returns (uint256);
5
function approve(address spender, uint256 amount) external returns (bool);
6
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
7
event Transfer(address indexed from, address indexed to, uint256 value);
8
event Approval(address indexed owner, address indexed spender, uint256 value);
Copied!
In this tutorial, a contract based on the implementation of OpenZeppelin will be used, with the addition of token transfer functionality to the creator account at the time the contract is created. The original contract can be found here - ERC20.sol
For ease of use, contract dependencies are collected in one file. As a result, the contract is as follows:
1
pragma solidity 0.4.24;
2
3
/**
4
* @dev Standard math utilities missing in the Solidity language.
5
*/
6
library SafeMath {
7
/**
8
* @dev Returns the addition of two unsigned integers, reverting on
9
* overflow.
10
*
11
* Counterpart to Solidity's `+` operator.
12
*
13
* Requirements:
14
* - Addition cannot overflow.
15
*/
16
function add(uint256 a, uint256 b) internal pure returns (uint256) {
17
uint256 c = a + b;
18
require(c >= a, "SafeMath: addition overflow");
19
20
return c;
21
}
22
23
/**
24
* @dev Returns the subtraction of two unsigned integers, reverting on
25
* overflow (when the result is negative).
26
*
27
* Counterpart to Solidity's `-` operator.
28
*
29
* Requirements:
30
* - Subtraction cannot overflow.
31
*/
32
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
33
require(b <= a, "SafeMath: subtraction overflow");
34
uint256 c = a - b;
35
36
return c;
37
}
38
39
/**
40
* @dev Returns the multiplication of two unsigned integers, reverting on
41
* overflow.
42
*
43
* Counterpart to Solidity's `*` operator.
44
*
45
* Requirements:
46
* - Multiplication cannot overflow.
47
*/
48
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
49
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
50
// benefit is lost if 'b' is also tested.
51
// See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
52
if (a == 0) {
53
return 0;
54
}
55
56
uint256 c = a * b;
57
require(c / a == b, "SafeMath: multiplication overflow");
58
59
return c;
60
}
61
62
/**
63
* @dev Returns the integer division of two unsigned integers. Reverts on
64
* division by zero. The result is rounded towards zero.
65
*
66
* Counterpart to Solidity's `/` operator. Note: this function uses a
67
* `revert` opcode (which leaves remaining gas untouched) while Solidity
68
* uses an invalid opcode to revert (consuming all remaining gas).
69
*
70
* Requirements:
71
* - The divisor cannot be zero.
72
*/
73
function div(uint256 a, uint256 b) internal pure returns (uint256) {
74
// Solidity only automatically asserts when dividing by 0
75
require(b > 0, "SafeMath: division by zero");
76
uint256 c = a / b;
77
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
78
79
return c;
80
}
81
82
/**
83
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
84
* Reverts when dividing by zero.
85
*
86
* Counterpart to Solidity's `%` operator. This function uses a `revert`
87
* opcode (which leaves remaining gas untouched) while Solidity uses an
88
* invalid opcode to revert (consuming all remaining gas).
89
*
90
* Requirements:
91
* - The divisor cannot be zero.
92
*/
93
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
94
require(b != 0, "SafeMath: modulo by zero");
95
return a % b;
96
}
97
}
98
99
contract ERC20 {
100
using SafeMath for uint256;
101
102
string public symbol = 'TEST';
103
104
string public name = 'Test Token';
105
106
uint8 public decimals = 8;
107
108
mapping (address => uint256) private _balances;
109
110
mapping (address => mapping (address => uint256)) private _allowances;
111
112
uint256 private _totalSupply = 1000000000000;
113
114
/**
115
* @dev Emitted when `value` tokens are moved from one account (`from`) to
116
* another (`to`).
117
*
118
* Note that `value` may be zero.
119
*/
120
event Transfer(address indexed from, address indexed to, uint256 value);
121
122
/**
123
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
124
* a call to `approve`. `value` is the new allowance.
125
*/
126
event Approval(address indexed owner, address indexed spender, uint256 value);
127
128
constructor() public {
129
_balances[msg.sender] = 1000000000000;
130
emit Transfer(address(0), msg.sender, 1000000000000);
131
}
132
133
/**
134
* @dev See `IERC20.totalSupply`.
135
*/
136
function totalSupply() public view returns (uint256) {
137
return _totalSupply;
138
}
139
140
/**
141
* @dev See `IERC20.balanceOf`.
142
*/
143
function balanceOf(address account) public view returns (uint256) {
144
return _balances[account];
145
}
146
147
/**
148
* @dev See `IERC20.transfer`.
149
*
150
* Requirements:
151
*
152
* - `recipient` cannot be the zero address.
153
* - the caller must have a balance of at least `amount`.
154
*/
155
function transfer(address recipient, uint256 amount) public returns (bool) {
156
_transfer(msg.sender, recipient, amount);
157
return true;
158
}
159
160
/**
161
* @dev See `IERC20.allowance`.
162
*/
163
function allowance(address owner, address spender) public view returns (uint256) {
164
return _allowances[owner][spender];
165
}
166
167
/**
168
* @dev See `IERC20.approve`.
169
*
170
* Requirements:
171
*
172
* - `spender` cannot be the zero address.
173
*/
174
function approve(address spender, uint256 value) public returns (bool) {
175
_approve(msg.sender, spender, value);
176
return true;
177
}
178
179
/**
180
* @dev See `IERC20.transferFrom`.
181
*
182
* Emits an `Approval` event indicating the updated allowance. This is not
183
* required by the EIP. See the note at the beginning of `ERC20`;
184
*
185
* Requirements:
186
* - `sender` and `recipient` cannot be the zero address.
187
* - `sender` must have a balance of at least `value`.
188
* - the caller must have allowance for `sender`'s tokens of at least
189
* `amount`.
190
*/
191
function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
192
_transfer(sender, recipient, amount);
193
_approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount));
194
return true;
195
}
196
197
/**
198
* @dev Atomically increases the allowance granted to `spender` by the caller.
199
*
200
* This is an alternative to `approve` that can be used as a mitigation for
201
* problems described in `IERC20.approve`.
202
*
203
* Emits an `Approval` event indicating the updated allowance.
204
*
205
* Requirements:
206
*
207
* - `spender` cannot be the zero address.
208
*/
209
function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
210
_approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
211
return true;
212
}
213
214
/**
215
* @dev Atomically decreases the allowance granted to `spender` by the caller.
216
*
217
* This is an alternative to `approve` that can be used as a mitigation for
218
* problems described in `IERC20.approve`.
219
*
220
* Emits an `Approval` event indicating the updated allowance.
221
*
222
* Requirements:
223
*
224
* - `spender` cannot be the zero address.
225
* - `spender` must have allowance for the caller of at least
226
* `subtractedValue`.
227
*/
228
function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
229
_approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue));
230
return true;
231
}
232
233
/**
234
* @dev Moves tokens `amount` from `sender` to `recipient`.
235
*
236
* This is internal function is equivalent to `transfer`, and can be used to
237
* e.g. implement automatic token fees, slashing mechanisms, etc.
238
*
239
* Emits a `Transfer` event.
240
*
241
* Requirements:
242
*
243
* - `sender` cannot be the zero address.
244
* - `recipient` cannot be the zero address.
245
* - `sender` must have a balance of at least `amount`.
246
*/
247
function _transfer(address sender, address recipient, uint256 amount) internal {
248
require(sender != address(0), "ERC20: transfer from the zero address");
249
require(recipient != address(0), "ERC20: transfer to the zero address");
250
251
_balances[sender] = _balances[sender].sub(amount);
252
_balances[recipient] = _balances[recipient].add(amount);
253
emit Transfer(sender, recipient, amount);
254
}
255
256
/**
257
* @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
258
*
259
* This is internal function is equivalent to `approve`, and can be used to
260
* e.g. set automatic allowances for certain subsystems, etc.
261
*
262
* Emits an `Approval` event.
263
*
264
* Requirements:
265
*
266
* - `owner` cannot be the zero address.
267
* - `spender` cannot be the zero address.
268
*/
269
function _approve(address owner, address spender, uint256 value) internal {
270
require(owner != address(0), "ERC20: approve from the zero address");
271
require(spender != address(0), "ERC20: approve to the zero address");
272
273
_allowances[owner][spender] = value;
274
emit Approval(owner, spender, value);
275
}
276
}
Copied!

Contract Compilation

As with Ethereum, the following artifacts are required to work with a contract within Echo:
    1.
    contract ByteCode
    2.
    function hashes
    3.
    ABI (for using by libraries or wallets)
One way to get these artifacts is to use https://remix.ethereum.org/.
The result of the compilation is as follows:
ByteCode
Hashes
ABI
1
60806040526040805190810160405280600481526020017f544553540000000000000000000000000000000000000000000000000000000081525060009080519060200190620000519291906200018d565b506040805190810160405280600a81526020017f5465737420546f6b656e00000000000000000000000000000000000000000000815250600190805190602001906200009f9291906200018d565b506008600260006101000a81548160ff021916908360ff16021790555064e8d4a51000600555348015620000d257600080fd5b5064e8d4a51000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef64e8d4a510006040518082815260200191505060405180910390a36200023c565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001d057805160ff191683800117855562000201565b8280016001018555821562000201579182015b8281111562000200578251825591602001919060010190620001e3565b5b50905062000210919062000214565b5090565b6200023991905b80821115620002355760008160009055506001016200021b565b5090565b90565b611054806200024c6000396000f3006080604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100b4578063095ea7b31461014457806318160ddd146101a957806323b872dd146101d4578063313ce56714610259578063395093511461028a57806370a08231146102ef57806395d89b4114610346578063a457c2d7146103d6578063a9059cbb1461043b578063dd62ed3e146104a0575b600080fd5b3480156100c057600080fd5b506100c9610517565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101095780820151818401526020810190506100ee565b50505050905090810190601f1680156101365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015057600080fd5b5061018f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506105b5565b604051808215151515815260200191505060405180910390f35b3480156101b557600080fd5b506101be6105cc565b6040518082815260200191505060405180910390f35b3480156101e057600080fd5b5061023f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506105d6565b604051808215151515815260200191505060405180910390f35b34801561026557600080fd5b5061026e610687565b604051808260ff1660ff16815260200191505060405180910390f35b34801561029657600080fd5b506102d5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061069a565b604051808215151515815260200191505060405180910390f35b3480156102fb57600080fd5b50610330600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061073f565b6040518082815260200191505060405180910390f35b34801561035257600080fd5b5061035b610788565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561039b578082015181840152602081019050610380565b50505050905090810190601f1680156103c85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103e257600080fd5b50610421600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610826565b604051808215151515815260200191505060405180910390f35b34801561044757600080fd5b50610486600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506108cb565b604051808215151515815260200191505060405180910390f35b3480156104ac57600080fd5b50610501600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108e2565b6040518082815260200191505060405180910390f35b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105ad5780601f10610582576101008083540402835291602001916105ad565b820191906000526020600020905b81548152906001019060200180831161059057829003601f168201915b505050505081565b60006105c2338484610969565b6001905092915050565b6000600554905090565b60006105e3848484610bea565b61067c843361067785600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f1490919063ffffffff16565b610969565b600190509392505050565b600260009054906101000a900460ff1681565b6000610735338461073085600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f9e90919063ffffffff16565b610969565b6001905092915050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561081e5780601f106107f35761010080835404028352916020019161081e565b820191906000526020600020905b81548152906001019060200180831161080157829003601f168201915b505050505081565b60006108c133846108bc85600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f1490919063ffffffff16565b610969565b6001905092915050565b60006108d8338484610bea565b6001905092915050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610a34576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f45524332303a20617070726f76652066726f6d20746865207a65726f2061646481526020017f726573730000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610aff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f45524332303a20617070726f766520746f20746865207a65726f20616464726581526020017f737300000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610cb5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001807f45524332303a207472616e736665722066726f6d20746865207a65726f20616481526020017f647265737300000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610d80576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f45524332303a207472616e7366657220746f20746865207a65726f206164647281526020017f657373000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b610dd281600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f1490919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e6781600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f9e90919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b600080838311151515610f8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b82840390508091505092915050565b600080828401905083811015151561101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b80915050929150505600a165627a7a7230582039ce9e7508dd36731859f027cad7ae62c370929d8243e3d568654d54df69ae050029
Copied!
1
{
2
"39509351": "increaseAllowance(address,uint256)",
3
"dd62ed3e": "allowance(address,address)",
4
"095ea7b3": "approve(address,uint256)",
5
"70a08231": "balanceOf(address)",
6
"313ce567": "decimals()",
7
"a457c2d7": "decreaseAllowance(address,uint256)",
8
"95d89b41": "symbol()",
9
"18160ddd": "totalSupply()",
10
"a9059cbb": "transfer(address,uint256)",
11
"23b872dd": "transferFrom(address,address,uint256)"
12
}
Copied!
1
[
2
{
3
"constant": true,
4
"inputs": [],
5
"name": "name",
6
"outputs": [
7
{
8
"name": "",
9
"type": "string"
10
}
11
],
12
"payable": false,
13
"stateMutability": "view",
14
"type": "function"
15
},
16
{
17
"constant": false,
18
"inputs": [
19
{
20
"name": "spender",
21
"type": "address"
22
},
23
{
24
"name": "value",
25
"type": "uint256"
26
}
27
],
28
"name": "approve",
29
"outputs": [
30
{
31
"name": "",
32
"type": "bool"
33
}
34
],
35
"payable": false,
36
"stateMutability": "nonpayable",
37
"type": "function"
38
},
39
{
40
"constant": true,
41
"inputs": [],
42
"name": "totalSupply",
43
"outputs": [
44
{
45
"name": "",
46
"type": "uint256"
47
}
48
],
49
"payable": false,
50
"stateMutability": "view",
51
"type": "function"
52
},
53
{
54
"constant": false,
55
"inputs": [
56
{
57
"name": "sender",
58
"type": "address"
59
},
60
{
61
"name": "recipient",
62
"type": "address"
63
},
64
{
65
"name": "amount",
66
"type": "uint256"
67
}
68
],
69
"name": "transferFrom",
70
"outputs": [
71
{
72
"name": "",
73
"type": "bool"
74
}
75
],
76
"payable": false,
77
"stateMutability": "nonpayable",
78
"type": "function"
79
},
80
{
81
"constant": true,
82
"inputs": [],
83
"name": "decimals",
84
"outputs": [
85
{
86
"name": "",
87
"type": "uint8"
88
}
89
],
90
"payable": false,
91
"stateMutability": "view",
92
"type": "function"
93
},
94
{
95
"constant": false,
96
"inputs": [
97
{
98
"name": "spender",
99
"type": "address"
100
},
101
{
102
"name": "addedValue",
103
"type": "uint256"
104
}
105
],
106
"name": "increaseAllowance",
107
"outputs": [
108
{
109
"name": "",
110
"type": "bool"
111
}
112
],
113
"payable": false,
114
"stateMutability": "nonpayable",
115
"type": "function"
116
},
117
{
118
"constant": true,
119
"inputs": [
120
{
121
"name": "account",
122
"type": "address"
123
}
124
],
125
"name": "balanceOf",
126
"outputs": [
127
{
128
"name": "",
129
"type": "uint256"
130
}
131
],
132
"payable": false,
133
"stateMutability": "view",
134
"type": "function"
135
},
136
{
137
"constant": true,
138
"inputs": [],
139
"name": "symbol",
140
"outputs": [
141
{
142
"name": "",
143
"type": "string"
144
}
145
],
146
"payable": false,
147
"stateMutability": "view",
148
"type": "function"
149
},
150
{
151
"constant": false,
152
"inputs": [
153
{
154
"name": "spender",
155
"type": "address"
156
},
157
{
158
"name": "subtractedValue",
159
"type": "uint256"
160
}
161
],
162
"name": "decreaseAllowance",
163
"outputs": [
164
{
165
"name": "",
166
"type": "bool"
167
}
168
],
169
"payable": false,
170
"stateMutability": "nonpayable",
171
"type": "function"
172
},
173
{
174
"constant": false,
175
"inputs": [
176
{
177
"name": "recipient",
178
"type": "address"
179
},
180
{
181
"name": "amount",
182
"type": "uint256"
183
}
184
],
185
"name": "transfer",
186
"outputs": [
187
{
188
"name": "",
189
"type": "bool"
190
}
191
],
192
"payable": false,
193
"stateMutability": "nonpayable",
194
"type": "function"
195
},
196
{
197
"constant": true,
198
"inputs": [
199
{
200
"name": "owner",
201
"type": "address"
202
},
203
{
204
"name": "spender",
205
"type": "address"
206
}
207
],
208
"name": "allowance",
209
"outputs": [
210
{
211
"name": "",
212
"type": "uint256"
213
}
214
],
215
"payable": false,
216
"stateMutability": "view",
217
"type": "function"
218
},
219
{
220
"inputs": [],
221
"payable": false,
222
"stateMutability": "nonpayable",
223
"type": "constructor"
224
},
225
{
226
"anonymous": false,
227
"inputs": [
228
{
229
"indexed": true,
230
"name": "from",
231
"type": "address"
232
},
233
{
234
"indexed": true,
235
"name": "to",
236
"type": "address"
237
},
238
{
239
"indexed": false,
240
"name": "value",
241
"type": "uint256"
242
}
243
],
244
"name": "Transfer",
245
"type": "event"
246
},
247
{
248
"anonymous": false,
249
"inputs": [
250
{
251
"indexed": true,
252
"name": "owner",
253
"type": "address"
254
},
255
{
256
"indexed": true,
257
"name": "spender",
258
"type": "address"
259
},
260
{
261
"indexed": false,
262
"name": "value",
263
"type": "uint256"
264
}
265
],
266
"name": "Approval",
267
"type": "event"
268
}
269
]
Copied!

Working With Contracts

Below are several approaches to working with a contract:
Last modified 10mo ago