@instadapp/interop-x 0.0.0-dev.fabee70 → 0.0.0-dev.fbcbec6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/.github/workflows/ci.yml +19 -0
  2. package/dist/package.json +14 -13
  3. package/dist/src/abi/index.js +2 -4
  4. package/dist/src/abi/interopX.json +1436 -0
  5. package/dist/src/alias.js +10 -0
  6. package/dist/src/api/index.js +3 -0
  7. package/dist/src/config/index.js +10 -1
  8. package/dist/src/constants/addresses.js +2 -7
  9. package/dist/src/constants/index.js +0 -1
  10. package/dist/src/constants/tokens.js +62 -39
  11. package/dist/src/db/models/transaction.js +29 -11
  12. package/dist/src/gnosis/actions/index.js +9 -0
  13. package/dist/src/gnosis/actions/withdraw/index.js +114 -0
  14. package/dist/src/gnosis/index.js +20 -0
  15. package/dist/src/index.js +34 -22
  16. package/dist/src/net/protocol/dial/SignatureDialProtocol.js +9 -10
  17. package/dist/src/net/protocol/dial/{SignatureDialProtocol.1.js → TransactionStatusDialProtocol.js} +2 -0
  18. package/dist/src/net/protocol/index.js +17 -7
  19. package/dist/src/tasks/AutoUpdateTask.js +20 -7
  20. package/dist/src/tasks/BaseTask.js +4 -0
  21. package/dist/src/tasks/InteropX/SyncLogSubmitEvents.js +84 -0
  22. package/dist/src/tasks/Transactions/SyncTransactionStatusTask.js +8 -3
  23. package/dist/src/tasks/index.js +9 -19
  24. package/dist/src/typechain/{InteropBridgeToken.js → InteropX.js} +0 -0
  25. package/dist/src/typechain/factories/InteropX__factory.js +1928 -0
  26. package/dist/src/typechain/factories/index.js +3 -5
  27. package/dist/src/typechain/index.js +3 -5
  28. package/dist/src/utils/index.js +46 -89
  29. package/package.json +14 -13
  30. package/src/abi/index.ts +2 -4
  31. package/src/abi/interopX.json +1436 -0
  32. package/src/alias.ts +6 -0
  33. package/src/api/index.ts +3 -0
  34. package/src/config/index.ts +9 -1
  35. package/src/constants/addresses.ts +3 -8
  36. package/src/constants/index.ts +0 -1
  37. package/src/constants/tokens.ts +63 -40
  38. package/src/db/models/transaction.ts +65 -25
  39. package/src/gnosis/actions/index.ts +5 -0
  40. package/src/gnosis/actions/withdraw/index.ts +155 -0
  41. package/src/gnosis/index.ts +19 -0
  42. package/src/index.ts +47 -26
  43. package/src/net/protocol/dial/SignatureDialProtocol.ts +11 -13
  44. package/src/net/protocol/dial/{SignatureDialProtocol.1.ts → TransactionStatusDialProtocol.ts} +3 -1
  45. package/src/net/protocol/index.ts +17 -7
  46. package/src/tasks/AutoUpdateTask.ts +24 -15
  47. package/src/tasks/BaseTask.ts +5 -0
  48. package/src/tasks/InteropX/SyncLogSubmitEvents.ts +136 -0
  49. package/src/tasks/Transactions/SyncTransactionStatusTask.ts +8 -3
  50. package/src/tasks/index.ts +12 -22
  51. package/src/typechain/InteropX.ts +1216 -0
  52. package/src/typechain/factories/InteropX__factory.ts +1932 -0
  53. package/src/typechain/factories/index.ts +1 -2
  54. package/src/typechain/index.ts +2 -4
  55. package/src/utils/index.ts +98 -128
  56. package/tsconfig.json +7 -2
  57. package/dist/src/abi/interopBridgeToken.json +0 -286
  58. package/dist/src/abi/interopXGateway.json +0 -184
  59. package/dist/src/constants/itokens.js +0 -13
  60. package/dist/src/tasks/InteropBridge/ProcessWithdrawEvents.js +0 -146
  61. package/dist/src/tasks/InteropBridge/SyncWithdrawEvents.js +0 -69
  62. package/dist/src/tasks/InteropXGateway/ProcessDepositEvents.js +0 -149
  63. package/dist/src/tasks/InteropXGateway/SyncDepositEvents.js +0 -74
  64. package/dist/src/typechain/InteropXGateway.js +0 -2
  65. package/dist/src/typechain/factories/InteropBridgeToken__factory.js +0 -459
  66. package/dist/src/typechain/factories/InteropXGateway__factory.js +0 -265
  67. package/src/abi/interopBridgeToken.json +0 -286
  68. package/src/abi/interopXGateway.json +0 -184
  69. package/src/constants/itokens.ts +0 -10
  70. package/src/tasks/InteropBridge/ProcessWithdrawEvents.ts +0 -231
  71. package/src/tasks/InteropBridge/SyncWithdrawEvents.ts +0 -119
  72. package/src/tasks/InteropXGateway/ProcessDepositEvents.ts +0 -243
  73. package/src/tasks/InteropXGateway/SyncDepositEvents.ts +0 -124
  74. package/src/typechain/InteropBridgeToken.ts +0 -686
  75. package/src/typechain/InteropXGateway.ts +0 -407
  76. package/src/typechain/factories/InteropBridgeToken__factory.ts +0 -466
  77. package/src/typechain/factories/InteropXGateway__factory.ts +0 -272
@@ -3,5 +3,4 @@
3
3
  /* eslint-disable */
4
4
  export { Erc20__factory } from "./Erc20__factory";
5
5
  export { GnosisSafe__factory } from "./GnosisSafe__factory";
6
- export { InteropBridgeToken__factory } from "./InteropBridgeToken__factory";
7
- export { InteropXGateway__factory } from "./InteropXGateway__factory";
6
+ export { InteropX__factory } from "./InteropX__factory";
@@ -3,10 +3,8 @@
3
3
  /* eslint-disable */
4
4
  export type { Erc20 } from "./Erc20";
5
5
  export type { GnosisSafe } from "./GnosisSafe";
6
- export type { InteropBridgeToken } from "./InteropBridgeToken";
7
- export type { InteropXGateway } from "./InteropXGateway";
6
+ export type { InteropX } from "./InteropX";
8
7
  export * as factories from "./factories";
9
8
  export { Erc20__factory } from "./factories/Erc20__factory";
10
9
  export { GnosisSafe__factory } from "./factories/GnosisSafe__factory";
11
- export { InteropBridgeToken__factory } from "./factories/InteropBridgeToken__factory";
12
- export { InteropXGateway__factory } from "./factories/InteropXGateway__factory";
10
+ export { InteropX__factory } from "./factories/InteropX__factory";
@@ -3,14 +3,11 @@
3
3
  */
4
4
  import axios from 'axios'
5
5
  import axiosRetry from "axios-retry";
6
- import { addresses, itokens, tokens } from '@/constants';
6
+ import { addresses } from '@/constants';
7
7
  import { ChainId } from '@/types'
8
8
  import { ethers } from 'ethers';
9
- import { encodeMulti, MetaTransaction, OperationType } from 'ethers-multisend';
10
- import { Transaction } from '@/db';
11
- import config from '@/config';
12
- import abi from '@/abi';
13
- import { InteropBridgeToken, InteropXGateway } from '@/typechain';
9
+ import { GnosisSafe } from '@/typechain';
10
+ import retry from 'async-retry'
14
11
 
15
12
  export const http = axios.create();
16
13
 
@@ -136,130 +133,37 @@ export const asyncCallWithTimeout = async <T>(asyncPromise: Promise<T>, timeout:
136
133
  }
137
134
 
138
135
 
139
- export const generateInteropTransactionHash = (data: { action: string, submitTransactionHash: string, sourceChainId: string | number, targetChainId: string | number }) => {
140
- return ethers.utils.solidityKeccak256(['string', 'string', 'string', 'string'], [
141
- String(data.action),
142
- String(data.submitTransactionHash),
143
- String(data.sourceChainId),
144
- String(data.targetChainId),
145
- ]);
146
- }
147
-
148
- export const buildDataForTransaction = async (transaction: Transaction, type?: 'source' | 'target') => {
149
- type = type || transaction.sourceStatus === 'pending' ? 'source' : 'target';
150
-
151
- switch (transaction.action) {
152
- case "deposit":
153
- return await buildDepositDataForTransaction(transaction, type);
154
- case "withdraw":
155
- return await buildWithdrawDataForTransaction(transaction, type);
156
- default:
157
- throw new Error(`Unknown action: ${transaction.action}`);
158
- }
159
- }
160
-
161
- export const buildDepositDataForTransaction = async (transaction: Transaction, type: 'source' | 'target') => {
162
- const transactions: MetaTransaction[] = [];
163
-
164
- if (transaction.action !== 'deposit') {
165
- throw new Error(`Invalid action: ${transaction.action}`)
166
- }
167
-
168
- if (transaction.action === 'deposit' && transaction.sourceStatus === 'pending') {
169
- throw Error('Cannot build data for pending deposit transaction');
170
- }
171
-
172
- if (!transaction.submitEvent) {
173
- throw Error('Cannot build data for transaction without submitEvent');
174
- }
175
-
176
-
177
- const token = tokens[transaction.sourceChainId].find(token => token.address.toLowerCase() === transaction.submitEvent.token.toLowerCase());
178
-
179
- if (!token) {
180
- throw Error('Cannot build data for transaction without token');
181
- }
182
-
183
- const itoken = itokens[transaction.targetChainId].find(itoken => itoken.symbol.toLowerCase() === token.symbol.toLowerCase());
184
-
185
- if (!itoken) {
186
- throw Error('Cannot build data for transaction without itoken');
187
- }
188
-
189
- const targetChainProvider = new ethers.providers.JsonRpcProvider(getRpcProviderUrl(transaction.targetChainId as ChainId));
190
- const targetWallet = new ethers.Wallet(config.privateKey, targetChainProvider);
191
- const interopBridgeContract = getContract<InteropBridgeToken>(itoken.address, abi.interopBridgeToken, targetWallet);
192
-
193
- const { data } = await interopBridgeContract.populateTransaction.mint(
194
- transaction.submitEvent.user,
195
- ethers.BigNumber.from(transaction.submitEvent.amount.toString()),
196
- ethers.BigNumber.from(transaction.submitEvent.sourceChainId.toString()),
197
- transaction.submitTransactionHash,
198
- );
199
-
200
- transactions.push({
201
- to: itoken.address,
202
- data: data!,
203
- value: '0',
204
- operation: OperationType.Call,
205
- });
136
+ type GenerateInteropTransactionHashParam = {
137
+ actionId: string,
138
+ vnonce: string,
139
+ sourceSender: string,
140
+ sourceChainId: string | number,
141
+ sourceDsaId: string,
142
+ targetChainId: string | number,
143
+ targetDsaId: string,
144
+ };
206
145
 
207
- return encodeMulti(transactions).data
146
+ export const generateInteropTransactionHash = (data: GenerateInteropTransactionHashParam) => {
147
+ return ethers.utils.solidityKeccak256(
148
+ Array.from({ length : 7 }, () => 'string'),
149
+ [
150
+ String(data.actionId),
151
+ String(data.vnonce),
152
+ String(data.sourceSender),
153
+ String(data.sourceChainId),
154
+ String(data.sourceDsaId),
155
+ String(data.targetChainId),
156
+ String(data.targetDsaId),
157
+ ]);
208
158
  }
209
159
 
210
- export const buildWithdrawDataForTransaction = async (transaction: Transaction, type: 'source' | 'target') => {
211
- const transactions: MetaTransaction[] = [];
212
-
213
- if (transaction.action !== 'withdraw') {
214
- throw new Error(`Invalid action: ${transaction.action}`)
215
- }
216
-
217
- if (transaction.action === 'withdraw' && transaction.sourceStatus === 'pending') {
218
- throw Error('Cannot build data for pending withdraw transaction');
219
- }
220
-
221
- if (!transaction.submitEvent) {
222
- throw Error('Cannot build data for transaction without submitEvent');
223
- }
224
-
225
- const { to, amount, chainId, itoken: itokenAddress } = transaction.submitEvent;
226
-
227
- const itoken = itokens[transaction.sourceChainId].find(token => token.address.toLowerCase() === itokenAddress.toLowerCase());
228
-
229
- if (!itoken) {
230
- throw Error('Cannot build data for transaction without itoken');
231
- }
232
-
233
- const token = tokens[chainId].find(t => t.symbol.toLowerCase() === itoken.symbol.toLowerCase());
234
-
235
- if (!token) {
236
- throw Error('Cannot build data for transaction without token');
237
- }
238
-
239
- const targetChainProvider = new ethers.providers.JsonRpcProvider(getRpcProviderUrl(transaction.targetChainId as ChainId));
240
- const targetWallet = new ethers.Wallet(config.privateKey, targetChainProvider);
241
- const gatewayAddress = addresses[chainId].interopXGateway;
242
- const interopBridgeContract = getContract<InteropXGateway>(gatewayAddress, abi.interopXGateway, targetWallet);
243
-
244
- const { data } = await interopBridgeContract.populateTransaction.systemWithdraw(
245
- ethers.BigNumber.from(amount.toString()),
246
- to,
247
- token.address,
248
- ethers.BigNumber.from(transaction.sourceChainId.toString()),
249
- transaction.submitTransactionHash,
250
- );
251
-
252
- transactions.push({
253
- to: gatewayAddress,
254
- data: data!,
255
- value: '0',
256
- operation: OperationType.Call,
257
- });
258
160
 
259
- return encodeMulti(transactions).data
161
+ export class ContractError extends Error {
162
+ method: string;
163
+ address: string;
164
+ args: any[];
260
165
  }
261
166
 
262
-
263
167
  export function getContract<TContract extends ethers.Contract>(address: string, contractInterface: ethers.ContractInterface | any, signerOrProvider?: ethers.Signer | ethers.providers.Provider) {
264
168
  if (!ethers.utils.getAddress(address) || address === ethers.constants.AddressZero) {
265
169
  throw Error(`Invalid 'address' parameter '${address}'.`)
@@ -283,11 +187,24 @@ export function getContract<TContract extends ethers.Contract>(address: string,
283
187
  const value = Reflect.get(target, prop, receiver);
284
188
 
285
189
  if (typeof value === 'function' && (contract.functions.hasOwnProperty(prop) || ['queryFilter'].includes(String(prop)))) {
190
+ let isConstant = false;
191
+
192
+ try {
193
+ isConstant = contract.interface.getFunction(String(prop)).constant
194
+ } catch (error) {
195
+ }
196
+
286
197
  return async (...args: any[]) => {
287
198
  try {
288
- return await value.bind(contract)(...args);
199
+ return await retry(async () => await value.bind(contract)(...args), { retries: isConstant ? 1 : 3 });
289
200
  } catch (error) {
290
- throw new Error(`Error calling "${String(prop)}" on "${address}": ${error.reason || error.message}`)
201
+ const err = new ContractError(`Error calling "${String(prop)}" on "${address}": ${error.reason || error.message}`)
202
+
203
+ err.method = String(prop)
204
+ err.address = address
205
+ err.args = [...args]
206
+
207
+ throw err
291
208
  }
292
209
  }
293
210
  }
@@ -303,9 +220,15 @@ export function getContract<TContract extends ethers.Contract>(address: string,
303
220
  if (typeof value === 'function') {
304
221
  return async (...args: any[]) => {
305
222
  try {
306
- return await value.bind(contract)(...args);
223
+ return await retry(async () => await value.bind(contract)(...args), { retries: parentProp === 'callStatic' ? 3 : 1 });
307
224
  } catch (error) {
308
- throw new Error(`Error calling "${String(prop)}" using "${parentProp}" on "${address}": ${error.reason || error.message}`)
225
+ const err = new ContractError(`Error calling "${String(prop)}" using "${parentProp}" on "${address}": ${error.reason || error.message}`)
226
+
227
+ err.method = String(prop)
228
+ err.address = address
229
+ err.args = [...args]
230
+
231
+ throw err
309
232
  }
310
233
  }
311
234
  }
@@ -316,4 +239,51 @@ export function getContract<TContract extends ethers.Contract>(address: string,
316
239
  return value;
317
240
  },
318
241
  });
242
+ }
243
+
244
+ export const generateGnosisTransaction = async (transactionData: any, safeContract: GnosisSafe) => {
245
+ console.log(transactionData);
246
+
247
+ let isExecuted = await safeContract.dataHashes(
248
+ await safeContract.getTransactionHash(
249
+ transactionData.to,
250
+ transactionData.value,
251
+ transactionData.data,
252
+ transactionData.operation,
253
+ transactionData.safeTxGas,
254
+ transactionData.baseGas,
255
+ transactionData.gasPrice,
256
+ transactionData.gasToken,
257
+ transactionData.refundReceiver,
258
+ transactionData.nonce
259
+ )
260
+ )
261
+
262
+ while (isExecuted == 1) {
263
+ transactionData.safeTxGas = ethers.BigNumber.from(String(transactionData.safeTxGas)).add(1).toString()
264
+
265
+ isExecuted = await safeContract.dataHashes(
266
+ await safeContract.getTransactionHash(
267
+ transactionData.to,
268
+ transactionData.value,
269
+ transactionData.data,
270
+ transactionData.operation,
271
+ transactionData.safeTxGas,
272
+ transactionData.baseGas,
273
+ transactionData.gasPrice,
274
+ transactionData.gasToken,
275
+ transactionData.refundReceiver,
276
+ transactionData.nonce
277
+ )
278
+ )
279
+ }
280
+
281
+ return transactionData
282
+ }
283
+
284
+ export class LiquidityError extends Error {
285
+ constructor(message?: string) {
286
+ super(message || 'Not enough liquidity');
287
+ Object.setPrototypeOf(this, new.target.prototype);
288
+ }
319
289
  }
package/tsconfig.json CHANGED
@@ -16,8 +16,13 @@
16
16
  "noEmit": false,
17
17
  "outDir": "dist",
18
18
  "baseUrl": "src",
19
- "paths": {
20
- "@/*" : ["./*" ]
19
+ "paths": {
20
+ "@/*": [
21
+ "*"
22
+ ],
23
+ "@": [
24
+ "/"
25
+ ]
21
26
  },
22
27
  "typeRoots": [
23
28
  "./node_modules/@types",
@@ -1,286 +0,0 @@
1
- [
2
- {
3
- "inputs": [
4
- { "internalType": "address", "name": "__owner", "type": "address" }
5
- ],
6
- "stateMutability": "nonpayable",
7
- "type": "constructor"
8
- },
9
- {
10
- "anonymous": false,
11
- "inputs": [
12
- {
13
- "indexed": true,
14
- "internalType": "address",
15
- "name": "owner",
16
- "type": "address"
17
- },
18
- {
19
- "indexed": true,
20
- "internalType": "address",
21
- "name": "spender",
22
- "type": "address"
23
- },
24
- {
25
- "indexed": false,
26
- "internalType": "uint256",
27
- "name": "value",
28
- "type": "uint256"
29
- }
30
- ],
31
- "name": "Approval",
32
- "type": "event"
33
- },
34
- {
35
- "anonymous": false,
36
- "inputs": [
37
- {
38
- "indexed": true,
39
- "internalType": "address",
40
- "name": "to",
41
- "type": "address"
42
- },
43
- {
44
- "indexed": false,
45
- "internalType": "uint256",
46
- "name": "amount",
47
- "type": "uint256"
48
- },
49
- {
50
- "indexed": true,
51
- "internalType": "uint256",
52
- "name": "chainId",
53
- "type": "uint256"
54
- }
55
- ],
56
- "name": "Burn",
57
- "type": "event"
58
- },
59
- {
60
- "anonymous": false,
61
- "inputs": [
62
- {
63
- "indexed": true,
64
- "internalType": "address",
65
- "name": "to",
66
- "type": "address"
67
- },
68
- {
69
- "indexed": false,
70
- "internalType": "uint256",
71
- "name": "amount",
72
- "type": "uint256"
73
- },
74
- {
75
- "indexed": true,
76
- "internalType": "uint256",
77
- "name": "chainId",
78
- "type": "uint256"
79
- },
80
- {
81
- "indexed": true,
82
- "internalType": "bytes32",
83
- "name": "transactionHash",
84
- "type": "bytes32"
85
- }
86
- ],
87
- "name": "Mint",
88
- "type": "event"
89
- },
90
- {
91
- "anonymous": false,
92
- "inputs": [
93
- {
94
- "indexed": true,
95
- "internalType": "address",
96
- "name": "previousOwner",
97
- "type": "address"
98
- },
99
- {
100
- "indexed": true,
101
- "internalType": "address",
102
- "name": "newOwner",
103
- "type": "address"
104
- }
105
- ],
106
- "name": "OwnershipTransferred",
107
- "type": "event"
108
- },
109
- {
110
- "anonymous": false,
111
- "inputs": [
112
- {
113
- "indexed": true,
114
- "internalType": "address",
115
- "name": "from",
116
- "type": "address"
117
- },
118
- {
119
- "indexed": true,
120
- "internalType": "address",
121
- "name": "to",
122
- "type": "address"
123
- },
124
- {
125
- "indexed": false,
126
- "internalType": "uint256",
127
- "name": "value",
128
- "type": "uint256"
129
- }
130
- ],
131
- "name": "Transfer",
132
- "type": "event"
133
- },
134
- {
135
- "inputs": [
136
- { "internalType": "address", "name": "owner", "type": "address" },
137
- { "internalType": "address", "name": "spender", "type": "address" }
138
- ],
139
- "name": "allowance",
140
- "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
141
- "stateMutability": "view",
142
- "type": "function"
143
- },
144
- {
145
- "inputs": [
146
- { "internalType": "address", "name": "spender", "type": "address" },
147
- { "internalType": "uint256", "name": "amount", "type": "uint256" }
148
- ],
149
- "name": "approve",
150
- "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
151
- "stateMutability": "nonpayable",
152
- "type": "function"
153
- },
154
- {
155
- "inputs": [
156
- { "internalType": "address", "name": "account", "type": "address" }
157
- ],
158
- "name": "balanceOf",
159
- "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
160
- "stateMutability": "view",
161
- "type": "function"
162
- },
163
- {
164
- "inputs": [
165
- { "internalType": "address", "name": "to", "type": "address" },
166
- { "internalType": "uint256", "name": "amount", "type": "uint256" },
167
- { "internalType": "uint256", "name": "chainId", "type": "uint256" }
168
- ],
169
- "name": "burn",
170
- "outputs": [],
171
- "stateMutability": "nonpayable",
172
- "type": "function"
173
- },
174
- {
175
- "inputs": [],
176
- "name": "decimals",
177
- "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }],
178
- "stateMutability": "view",
179
- "type": "function"
180
- },
181
- {
182
- "inputs": [
183
- { "internalType": "address", "name": "spender", "type": "address" },
184
- {
185
- "internalType": "uint256",
186
- "name": "subtractedValue",
187
- "type": "uint256"
188
- }
189
- ],
190
- "name": "decreaseAllowance",
191
- "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
192
- "stateMutability": "nonpayable",
193
- "type": "function"
194
- },
195
- {
196
- "inputs": [
197
- { "internalType": "address", "name": "spender", "type": "address" },
198
- { "internalType": "uint256", "name": "addedValue", "type": "uint256" }
199
- ],
200
- "name": "increaseAllowance",
201
- "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
202
- "stateMutability": "nonpayable",
203
- "type": "function"
204
- },
205
- {
206
- "inputs": [
207
- { "internalType": "address", "name": "to", "type": "address" },
208
- { "internalType": "uint256", "name": "amount", "type": "uint256" },
209
- { "internalType": "uint256", "name": "chainId", "type": "uint256" },
210
- {
211
- "internalType": "bytes32",
212
- "name": "transactionHash",
213
- "type": "bytes32"
214
- }
215
- ],
216
- "name": "mint",
217
- "outputs": [],
218
- "stateMutability": "nonpayable",
219
- "type": "function"
220
- },
221
- {
222
- "inputs": [],
223
- "name": "name",
224
- "outputs": [{ "internalType": "string", "name": "", "type": "string" }],
225
- "stateMutability": "view",
226
- "type": "function"
227
- },
228
- {
229
- "inputs": [],
230
- "name": "owner",
231
- "outputs": [{ "internalType": "address", "name": "", "type": "address" }],
232
- "stateMutability": "view",
233
- "type": "function"
234
- },
235
- {
236
- "inputs": [],
237
- "name": "renounceOwnership",
238
- "outputs": [],
239
- "stateMutability": "nonpayable",
240
- "type": "function"
241
- },
242
- {
243
- "inputs": [],
244
- "name": "symbol",
245
- "outputs": [{ "internalType": "string", "name": "", "type": "string" }],
246
- "stateMutability": "view",
247
- "type": "function"
248
- },
249
- {
250
- "inputs": [],
251
- "name": "totalSupply",
252
- "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
253
- "stateMutability": "view",
254
- "type": "function"
255
- },
256
- {
257
- "inputs": [
258
- { "internalType": "address", "name": "to", "type": "address" },
259
- { "internalType": "uint256", "name": "amount", "type": "uint256" }
260
- ],
261
- "name": "transfer",
262
- "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
263
- "stateMutability": "nonpayable",
264
- "type": "function"
265
- },
266
- {
267
- "inputs": [
268
- { "internalType": "address", "name": "from", "type": "address" },
269
- { "internalType": "address", "name": "to", "type": "address" },
270
- { "internalType": "uint256", "name": "amount", "type": "uint256" }
271
- ],
272
- "name": "transferFrom",
273
- "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
274
- "stateMutability": "nonpayable",
275
- "type": "function"
276
- },
277
- {
278
- "inputs": [
279
- { "internalType": "address", "name": "newOwner", "type": "address" }
280
- ],
281
- "name": "transferOwnership",
282
- "outputs": [],
283
- "stateMutability": "nonpayable",
284
- "type": "function"
285
- }
286
- ]