@instadapp/interop-x 0.0.0-dev.2c0a756 → 0.0.0-dev.376f394

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 (75) hide show
  1. package/.github/workflows/ci.yml +19 -0
  2. package/dist/package.json +13 -12
  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/constants/addresses.js +2 -7
  8. package/dist/src/constants/index.js +0 -1
  9. package/dist/src/constants/tokens.js +62 -39
  10. package/dist/src/db/models/transaction.js +29 -11
  11. package/dist/src/gnosis/actions/index.js +9 -0
  12. package/dist/src/gnosis/actions/withdraw/index.js +114 -0
  13. package/dist/src/gnosis/index.js +20 -0
  14. package/dist/src/index.js +7 -18
  15. package/dist/src/net/protocol/dial/SignatureDialProtocol.js +9 -10
  16. package/dist/src/net/protocol/dial/TransactionStatusDialProtocol.js +2 -0
  17. package/dist/src/net/protocol/index.js +11 -1
  18. package/dist/src/tasks/InteropX/SyncLogSubmitEvents.js +84 -0
  19. package/dist/src/tasks/Transactions/SyncTransactionStatusTask.js +7 -2
  20. package/dist/src/tasks/index.js +8 -30
  21. package/dist/src/typechain/{InteropBridgeToken.js → InteropX.js} +0 -0
  22. package/dist/src/typechain/factories/InteropX__factory.js +1928 -0
  23. package/dist/src/typechain/factories/index.js +3 -5
  24. package/dist/src/typechain/index.js +3 -5
  25. package/dist/src/utils/index.js +46 -89
  26. package/package.json +13 -12
  27. package/src/abi/index.ts +2 -4
  28. package/src/abi/interopX.json +1436 -0
  29. package/src/alias.ts +6 -0
  30. package/src/api/index.ts +3 -0
  31. package/src/constants/addresses.ts +3 -8
  32. package/src/constants/index.ts +0 -1
  33. package/src/constants/tokens.ts +63 -40
  34. package/src/db/models/transaction.ts +65 -25
  35. package/src/gnosis/actions/index.ts +5 -0
  36. package/src/gnosis/actions/withdraw/index.ts +155 -0
  37. package/src/gnosis/index.ts +19 -0
  38. package/src/index.ts +6 -17
  39. package/src/net/protocol/dial/SignatureDialProtocol.ts +11 -13
  40. package/src/net/protocol/dial/TransactionStatusDialProtocol.ts +3 -1
  41. package/src/net/protocol/index.ts +13 -3
  42. package/src/tasks/InteropX/SyncLogSubmitEvents.ts +136 -0
  43. package/src/tasks/Transactions/SyncTransactionStatusTask.ts +7 -2
  44. package/src/tasks/index.ts +10 -40
  45. package/src/typechain/InteropX.ts +1216 -0
  46. package/src/typechain/factories/InteropX__factory.ts +1932 -0
  47. package/src/typechain/factories/index.ts +1 -2
  48. package/src/typechain/index.ts +2 -4
  49. package/src/utils/index.ts +98 -128
  50. package/tsconfig.json +7 -2
  51. package/dist/src/abi/interopBridgeToken.json +0 -298
  52. package/dist/src/abi/interopXGateway.json +0 -184
  53. package/dist/src/constants/itokens.js +0 -13
  54. package/dist/src/tasks/InteropBridge/ProcessWithdrawEvents.js +0 -146
  55. package/dist/src/tasks/InteropBridge/SyncBurnEvents.js +0 -71
  56. package/dist/src/tasks/InteropBridge/SyncMintEvents.js +0 -66
  57. package/dist/src/tasks/InteropXGateway/ProcessDepositEvents.js +0 -162
  58. package/dist/src/tasks/InteropXGateway/SyncDepositEvents.js +0 -74
  59. package/dist/src/tasks/InteropXGateway/SyncWithdrawtEvents.js +0 -71
  60. package/dist/src/typechain/InteropXGateway.js +0 -2
  61. package/dist/src/typechain/factories/InteropBridgeToken__factory.js +0 -471
  62. package/dist/src/typechain/factories/InteropXGateway__factory.js +0 -265
  63. package/src/abi/interopBridgeToken.json +0 -298
  64. package/src/abi/interopXGateway.json +0 -184
  65. package/src/constants/itokens.ts +0 -10
  66. package/src/tasks/InteropBridge/ProcessWithdrawEvents.ts +0 -231
  67. package/src/tasks/InteropBridge/SyncBurnEvents.ts +0 -121
  68. package/src/tasks/InteropBridge/SyncMintEvents.ts +0 -98
  69. package/src/tasks/InteropXGateway/ProcessDepositEvents.ts +0 -257
  70. package/src/tasks/InteropXGateway/SyncDepositEvents.ts +0 -124
  71. package/src/tasks/InteropXGateway/SyncWithdrawtEvents.ts +0 -103
  72. package/src/typechain/InteropBridgeToken.ts +0 -692
  73. package/src/typechain/InteropXGateway.ts +0 -407
  74. package/src/typechain/factories/InteropBridgeToken__factory.ts +0 -478
  75. 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, sourceChainId, targetChainId, itoken: itokenAddress } = transaction.submitEvent;
226
-
227
- const itoken = itokens[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[targetChainId].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(targetChainId as ChainId));
240
- const targetWallet = new ethers.Wallet(config.privateKey, targetChainProvider);
241
- const gatewayAddress = addresses[targetChainId].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(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,298 +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": false,
51
- "internalType": "uint32",
52
- "name": "sourceChainId",
53
- "type": "uint32"
54
- },
55
- {
56
- "indexed": true,
57
- "internalType": "uint32",
58
- "name": "targetChainId",
59
- "type": "uint32"
60
- }
61
- ],
62
- "name": "Burn",
63
- "type": "event"
64
- },
65
- {
66
- "anonymous": false,
67
- "inputs": [
68
- {
69
- "indexed": true,
70
- "internalType": "address",
71
- "name": "to",
72
- "type": "address"
73
- },
74
- {
75
- "indexed": false,
76
- "internalType": "uint256",
77
- "name": "amount",
78
- "type": "uint256"
79
- },
80
- {
81
- "indexed": true,
82
- "internalType": "uint32",
83
- "name": "sourceChainId",
84
- "type": "uint32"
85
- },
86
- {
87
- "indexed": false,
88
- "internalType": "uint32",
89
- "name": "targetChainId",
90
- "type": "uint32"
91
- },
92
- {
93
- "indexed": true,
94
- "internalType": "bytes32",
95
- "name": "submitTransactionHash",
96
- "type": "bytes32"
97
- }
98
- ],
99
- "name": "Mint",
100
- "type": "event"
101
- },
102
- {
103
- "anonymous": false,
104
- "inputs": [
105
- {
106
- "indexed": true,
107
- "internalType": "address",
108
- "name": "previousOwner",
109
- "type": "address"
110
- },
111
- {
112
- "indexed": true,
113
- "internalType": "address",
114
- "name": "newOwner",
115
- "type": "address"
116
- }
117
- ],
118
- "name": "OwnershipTransferred",
119
- "type": "event"
120
- },
121
- {
122
- "anonymous": false,
123
- "inputs": [
124
- {
125
- "indexed": true,
126
- "internalType": "address",
127
- "name": "from",
128
- "type": "address"
129
- },
130
- {
131
- "indexed": true,
132
- "internalType": "address",
133
- "name": "to",
134
- "type": "address"
135
- },
136
- {
137
- "indexed": false,
138
- "internalType": "uint256",
139
- "name": "value",
140
- "type": "uint256"
141
- }
142
- ],
143
- "name": "Transfer",
144
- "type": "event"
145
- },
146
- {
147
- "inputs": [
148
- { "internalType": "address", "name": "owner", "type": "address" },
149
- { "internalType": "address", "name": "spender", "type": "address" }
150
- ],
151
- "name": "allowance",
152
- "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
153
- "stateMutability": "view",
154
- "type": "function"
155
- },
156
- {
157
- "inputs": [
158
- { "internalType": "address", "name": "spender", "type": "address" },
159
- { "internalType": "uint256", "name": "amount", "type": "uint256" }
160
- ],
161
- "name": "approve",
162
- "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
163
- "stateMutability": "nonpayable",
164
- "type": "function"
165
- },
166
- {
167
- "inputs": [
168
- { "internalType": "address", "name": "account", "type": "address" }
169
- ],
170
- "name": "balanceOf",
171
- "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
172
- "stateMutability": "view",
173
- "type": "function"
174
- },
175
- {
176
- "inputs": [
177
- { "internalType": "address", "name": "to", "type": "address" },
178
- { "internalType": "uint256", "name": "amount", "type": "uint256" },
179
- { "internalType": "uint32", "name": "chainId", "type": "uint32" }
180
- ],
181
- "name": "burn",
182
- "outputs": [],
183
- "stateMutability": "nonpayable",
184
- "type": "function"
185
- },
186
- {
187
- "inputs": [],
188
- "name": "decimals",
189
- "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }],
190
- "stateMutability": "view",
191
- "type": "function"
192
- },
193
- {
194
- "inputs": [
195
- { "internalType": "address", "name": "spender", "type": "address" },
196
- {
197
- "internalType": "uint256",
198
- "name": "subtractedValue",
199
- "type": "uint256"
200
- }
201
- ],
202
- "name": "decreaseAllowance",
203
- "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
204
- "stateMutability": "nonpayable",
205
- "type": "function"
206
- },
207
- {
208
- "inputs": [
209
- { "internalType": "address", "name": "spender", "type": "address" },
210
- { "internalType": "uint256", "name": "addedValue", "type": "uint256" }
211
- ],
212
- "name": "increaseAllowance",
213
- "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
214
- "stateMutability": "nonpayable",
215
- "type": "function"
216
- },
217
- {
218
- "inputs": [
219
- { "internalType": "address", "name": "to", "type": "address" },
220
- { "internalType": "uint256", "name": "amount", "type": "uint256" },
221
- { "internalType": "uint32", "name": "chainId", "type": "uint32" },
222
- {
223
- "internalType": "bytes32",
224
- "name": "transactionHash",
225
- "type": "bytes32"
226
- }
227
- ],
228
- "name": "mint",
229
- "outputs": [],
230
- "stateMutability": "nonpayable",
231
- "type": "function"
232
- },
233
- {
234
- "inputs": [],
235
- "name": "name",
236
- "outputs": [{ "internalType": "string", "name": "", "type": "string" }],
237
- "stateMutability": "view",
238
- "type": "function"
239
- },
240
- {
241
- "inputs": [],
242
- "name": "owner",
243
- "outputs": [{ "internalType": "address", "name": "", "type": "address" }],
244
- "stateMutability": "view",
245
- "type": "function"
246
- },
247
- {
248
- "inputs": [],
249
- "name": "renounceOwnership",
250
- "outputs": [],
251
- "stateMutability": "nonpayable",
252
- "type": "function"
253
- },
254
- {
255
- "inputs": [],
256
- "name": "symbol",
257
- "outputs": [{ "internalType": "string", "name": "", "type": "string" }],
258
- "stateMutability": "view",
259
- "type": "function"
260
- },
261
- {
262
- "inputs": [],
263
- "name": "totalSupply",
264
- "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
265
- "stateMutability": "view",
266
- "type": "function"
267
- },
268
- {
269
- "inputs": [
270
- { "internalType": "address", "name": "to", "type": "address" },
271
- { "internalType": "uint256", "name": "amount", "type": "uint256" }
272
- ],
273
- "name": "transfer",
274
- "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
275
- "stateMutability": "nonpayable",
276
- "type": "function"
277
- },
278
- {
279
- "inputs": [
280
- { "internalType": "address", "name": "from", "type": "address" },
281
- { "internalType": "address", "name": "to", "type": "address" },
282
- { "internalType": "uint256", "name": "amount", "type": "uint256" }
283
- ],
284
- "name": "transferFrom",
285
- "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
286
- "stateMutability": "nonpayable",
287
- "type": "function"
288
- },
289
- {
290
- "inputs": [
291
- { "internalType": "address", "name": "newOwner", "type": "address" }
292
- ],
293
- "name": "transferOwnership",
294
- "outputs": [],
295
- "stateMutability": "nonpayable",
296
- "type": "function"
297
- }
298
- ]