├── .gitignore ├── .idea └── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── example ├── README.md ├── approveTokenAndCallContract.dart ├── callContract.dart ├── cash.native.dart ├── cash.token.dart ├── onboarding.dart ├── pro.native.dart └── pro.token.dart ├── lib ├── constants │ └── variables.dart ├── src │ ├── abi.dart │ ├── graph.dart │ ├── queries.dart │ ├── studio_api.dart │ ├── wallet_api.dart │ └── web3.dart ├── utils │ └── crypto.dart └── wallet_core.dart └── pubspec.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://www.dartlang.org/guides/libraries/private-files 2 | 3 | # Files and directories created by pub 4 | .dart_tool/ 5 | .packages 6 | .pub/ 7 | build/ 8 | # If you're building an application, you may want to check-in your pubspec.lock 9 | pubspec.lock 10 | 11 | # Directory created by dartdoc 12 | # If you don't generate documentation locally you can remove this line. 13 | doc/api/ 14 | 15 | launch.json 16 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # v0.4.0 2 | 3 | ## Fixes 4 | - downgrade path to `1.8.0` 5 | 6 | # v0.4.0 7 | 8 | ## New Feature 9 | - Rename API module to StudioApi & added api key 10 | - `api.setJwtToken` is deprecated -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Fuse 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Fuse Wallet Core 2 | 3 | Fuse wallet core library for Ethereum based networks, developed in Dart, can be used in Flutter framework. 4 | 5 | ## What's in here 6 | 7 | * Web3 8 | * Using [`web3dart`](https://pub.dev/packages/web3dart) library in a simplified way 9 | * Initialized with any Ethereum based network (and custom network id) 10 | * BIP 39 mnemonic - generate, extract private key from 11 | * Native - get balance, send, sign off-chain transactions to transfer using relay 12 | * [ERC20 based tokens](https://eips.ethereum.org/EIPS/eip-20) - get balance, send, sign off-chain transactions to transfer using relay 13 | * Contracts - read/write 14 | * API 15 | * Interact with [Fuse API](https://github.com/fuseio/fuse-studio/blob/master/server/docs/api-v2.md) 16 | * GraphQL 17 | * Interact with [The Graph](https://thegraph.com/) for easier blockchain data reads 18 | 19 | ## Install 20 | 21 | See [pub.dev](https://pub.dev/packages/wallet_core#-installing-tab-) 22 | 23 | ## Usage 24 | 25 | See [`example`](https://github.com/fuseio/wallet_core/tree/master/example) folder 26 | 27 | ## License 28 | 29 | Fuse Wallet Core is available under the MIT license. See the [LICENSE](LICENSE) file for more info. 30 | -------------------------------------------------------------------------------- /example/README.md: -------------------------------------------------------------------------------- 1 | # examples 2 | 3 | ## onboarding 4 | 5 | ```bash 6 | dart example/onboarding.dart 7 | ``` 8 | 9 | ## pro mode 10 | 11 | ### native 12 | 13 | ```bash 14 | dart example/pro.native.dart 15 | ``` 16 | 17 | ### tokens 18 | 19 | ```bash 20 | dart example/pro.token.dart 21 | ``` 22 | 23 | ## cash mode 24 | 25 | ### native 26 | 27 | ```bash 28 | dart example/cash.native.dart 29 | ``` 30 | 31 | ### tokens 32 | 33 | ```bash 34 | dart example/cash.token.dart 35 | ``` -------------------------------------------------------------------------------- /example/approveTokenAndCallContract.dart: -------------------------------------------------------------------------------- 1 | // import 'dart:async'; 2 | // import 'dart:math'; 3 | 4 | // import 'package:decimal/decimal.dart'; 5 | // import 'package:wallet_core/wallet_core.dart'; 6 | 7 | // Future approvalCallback() async { 8 | // return true; 9 | // } 10 | 11 | // void main() async { 12 | // // init web3 module 13 | // Web3 web3 = Web3( 14 | // approveCb: approvalCallback, 15 | // networkId: 122, 16 | // url: 'https://rpc.fuse.io', 17 | // defaultCommunityAddress: 'DEFAULT_COMMUNITY_ADDRESS', 18 | // communityManagerAddress: 'COMMUNITY_MANAGER_ADDRESS', 19 | // transferManagerAddress: 'TRANSFER_MANAGER_ADDRESS', 20 | // daiPointsManagerAddress: 'DAI_POINTS_MANAGER_ADDRESS', 21 | // ); 22 | 23 | // // set web3 credentials with private key 24 | // await web3.setCredentials('YOUR_PRIVATE_KEY'); 25 | 26 | // // get account address 27 | // String accountAddress = await web3.getAddress(); 28 | // print('account address: $accountAddress'); 29 | 30 | // // init api module 31 | // API api = API('https://studio.fuse.io/api'); 32 | 33 | // api.setJwtToken('YOUR_JWT'); 34 | 35 | // String walletAddress = 'YOUR_WALLET_ADDRESS'; 36 | // String tokenAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F'; // DAI 37 | // String receiverAddress = 'RECEIVER_ADDRESS'; 38 | // String contractAddress = 39 | // '0x782c578B5BC3b9A1B6E1E54f839B610Ac7036bA0'; // DAIPoints 40 | // num tokenAmount = 0.1; 41 | // num tokenDecimals = 18; 42 | 43 | // EthereumAddress receiver = EthereumAddress.fromHex(receiverAddress); 44 | // Decimal tokensAmountDecimal = Decimal.parse(tokenAmount.toString()); 45 | // Decimal decimals = Decimal.parse(pow(10, tokenDecimals).toString()); 46 | // BigInt amount = BigInt.parse((tokensAmountDecimal * decimals).toString()); 47 | 48 | // String data = await web3.getEncodedDataForContractCall('DAIPointsToken', 49 | // contractAddress, 'getDAIPointsToAddress', [amount, receiver]); 50 | // print('data: $data'); 51 | 52 | // dynamic result = await api.approveTokenAndCallContract( 53 | // web3, walletAddress, tokenAddress, contractAddress, tokenAmount, data, 54 | // network: 'mainnet'); 55 | // print('result: $result'); 56 | // } 57 | -------------------------------------------------------------------------------- /example/callContract.dart: -------------------------------------------------------------------------------- 1 | // import 'dart:async'; 2 | 3 | // import 'package:wallet_core/wallet_core.dart'; 4 | 5 | // Future approvalCallback() async { 6 | // return true; 7 | // } 8 | 9 | // void main() async { 10 | // // init web3 module 11 | // Web3 web3 = Web3( 12 | // approveCb: approvalCallback, 13 | // networkId: 122, 14 | // url: 'https://rpc.fuse.io', 15 | // defaultCommunityAddress: 'DEFAULT_COMMUNITY_ADDRESS', 16 | // communityManagerAddress: 'COMMUNITY_MANAGER_ADDRESS', 17 | // transferManagerAddress: 'TRANSFER_MANAGER_ADDRESS', 18 | // daiPointsManagerAddress: 'DAI_POINTS_MANAGER_ADDRESS', 19 | // ); 20 | 21 | // // set web3 credentials with private key 22 | // await web3.setCredentials('YOUR_PRIVATE_KEY'); 23 | 24 | // // get account address 25 | // String accountAddress = await web3.getAddress(); 26 | // print('account address: $accountAddress'); 27 | 28 | // // init api module 29 | // API api = API('https://studio.fuse.io/api'); 30 | 31 | // api.setJwtToken('YOUR_JWT'); 32 | 33 | // String walletAddress = 'YOUR_WALLET_ADDRESS'; 34 | 35 | // String data = await web3.getEncodedDataForContractCall( 36 | // 'Community', web3.getDefaultCommunity(), 'join', []); 37 | // print('data: $data'); 38 | 39 | // dynamic result = await api.callContract( 40 | // web3, walletAddress, web3.getDefaultCommunity(), 0, data); 41 | // print('result: $result'); 42 | // } 43 | -------------------------------------------------------------------------------- /example/cash.native.dart: -------------------------------------------------------------------------------- 1 | // import 'dart:async'; 2 | // import 'dart:convert'; 3 | // import 'dart:io'; 4 | // import 'dart:math'; 5 | 6 | // import 'package:wallet_core/wallet_core.dart'; 7 | 8 | // Future approvalCallback() async { 9 | // return true; 10 | // } 11 | 12 | // void main() async { 13 | // // init web3 module 14 | // Web3 web3 = Web3( 15 | // approveCb: approvalCallback, 16 | // networkId: 122, 17 | // url: 'https://rpc.fuse.io', 18 | // defaultCommunityAddress: 'DEFAULT_COMMUNITY_ADDRESS', 19 | // communityManagerAddress: 'COMMUNITY_MANAGER_ADDRESS', 20 | // transferManagerAddress: 'TRANSFER_MANAGER_ADDRESS', 21 | // daiPointsManagerAddress: 'DAI_POINTS_MANAGER_ADDRESS', 22 | // ); 23 | 24 | // print('enter private key and press ENTER'); 25 | // String? privateKey = 26 | // stdin.readLineSync(encoding: Encoding.getByName('utf-8')!); 27 | 28 | // // set web3 credentials with private key 29 | // await web3.setCredentials(privateKey!); 30 | 31 | // print('enter wallet address and press ENTER'); 32 | // String? walletAddress = 33 | // stdin.readLineSync(encoding: Encoding.getByName('utf-8')!); 34 | 35 | // // get cash balance before transfer 36 | // EtherAmount balance = await web3.cashGetBalance(walletAddress!); 37 | // print( 38 | // 'balance before transaction: ${balance.getInWei} wei (${balance.getValueInUnit(EtherUnit.ether)} ether)'); 39 | 40 | // // init api module 41 | // API api = API('https://studio.fuse.io/api'); 42 | 43 | // // transfer 0.1 ETH to another address 44 | // String receiverAddress = '0xF3a4C2862188781365966A040B1f47b9614b2DC7'; 45 | // num amountInWei = pow(10, 17); 46 | // await api.transfer(web3, walletAddress, receiverAddress, amountInWei); 47 | 48 | // // get balance after transfer 49 | // balance = await web3.cashGetBalance(walletAddress); 50 | // print( 51 | // 'balance after transaction: ${balance.getInWei} wei (${balance.getValueInUnit(EtherUnit.ether)} ether)'); 52 | // } 53 | -------------------------------------------------------------------------------- /example/cash.token.dart: -------------------------------------------------------------------------------- 1 | // import 'dart:async'; 2 | // import 'dart:convert'; 3 | // import 'dart:io'; 4 | // import 'dart:math'; 5 | 6 | // import 'package:wallet_core/wallet_core.dart'; 7 | 8 | // Future approvalCallback() async { 9 | // return true; 10 | // } 11 | 12 | // void main() async { 13 | // // init web3 module 14 | // Web3 web3 = Web3( 15 | // approveCb: approvalCallback, 16 | // networkId: 122, 17 | // url: 'https://rpc.fuse.io', 18 | // defaultCommunityAddress: 'DEFAULT_COMMUNITY_ADDRESS', 19 | // communityManagerAddress: 'COMMUNITY_MANAGER_ADDRESS', 20 | // transferManagerAddress: 'TRANSFER_MANAGER_ADDRESS', 21 | // daiPointsManagerAddress: 'DAI_POINTS_MANAGER_ADDRESS', 22 | // ); 23 | 24 | // print('enter private key and press ENTER'); 25 | // String? privateKey = 26 | // stdin.readLineSync(encoding: Encoding.getByName('utf-8')!); 27 | 28 | // // set web3 credentials with private key 29 | // await web3.setCredentials(privateKey!); 30 | 31 | // print('enter wallet address and press ENTER'); 32 | // String? walletAddress = 33 | // stdin.readLineSync(encoding: Encoding.getByName('utf-8')!); 34 | 35 | // String tokenAddress = '0x0F99E2090D1511e0f2474A56141D9fAB952C19e2'; 36 | // String receiverAddress = '0xF3a4C2862188781365966A040B1f47b9614b2DC7'; 37 | 38 | // // get token details 39 | // dynamic tokenDetails = await web3.getTokenDetails(tokenAddress); 40 | // print('token details: $tokenDetails'); 41 | 42 | // String tokenName = tokenDetails["name"]; 43 | // String tokenSymbol = tokenDetails["symbol"]; 44 | // dynamic tokenDecimals = int.parse(tokenDetails["decimals"].toString()); 45 | // tokenDecimals = BigInt.from(pow(10, tokenDecimals)); 46 | 47 | // // init graph module 48 | // Graph graph = Graph('https://graph.fuse.io/subgraphs/name/fuseio'); 49 | 50 | // // get own token balance before transfer 51 | // dynamic tokenBalance = 52 | // await graph.getTokenBalance(walletAddress, tokenAddress); 53 | // tokenBalance = (tokenBalance / tokenDecimals).toStringAsFixed(2); 54 | // print( 55 | // '$walletAddress has $tokenBalance $tokenName($tokenSymbol) tokens before transfer'); 56 | 57 | // // get receiver token balance before transfer 58 | // tokenBalance = await graph.getTokenBalance(receiverAddress, tokenAddress); 59 | // tokenBalance = (tokenBalance / tokenDecimals).toStringAsFixed(2); 60 | // print( 61 | // '$receiverAddress has $tokenBalance $tokenName($tokenSymbol) tokens before transfer'); 62 | 63 | // // init api module 64 | // API api = API(); 65 | 66 | // // transfer tokens 67 | // await api.tokenTransfer( 68 | // web3, walletAddress, tokenAddress, receiverAddress, 2.2); 69 | 70 | // // get own token balance after transfer 71 | // tokenBalance = await graph.getTokenBalance(walletAddress, tokenAddress); 72 | // tokenBalance = (tokenBalance / tokenDecimals).toStringAsFixed(2); 73 | // print( 74 | // '$walletAddress has $tokenBalance $tokenName($tokenSymbol) tokens after transfer'); 75 | 76 | // // get receiver token balance after transfer 77 | // tokenBalance = await graph.getTokenBalance(receiverAddress, tokenAddress); 78 | // tokenBalance = (tokenBalance / tokenDecimals).toStringAsFixed(2); 79 | // print( 80 | // '$receiverAddress has $tokenBalance $tokenName($tokenSymbol) tokens after transfer'); 81 | 82 | // // get token transfers 83 | // Map transfers = 84 | // await graph.getTransfers(walletAddress, tokenAddress); 85 | // print( 86 | // 'Found ${transfers["count"]} transfers for $walletAddress on $tokenSymbol token: ${transfers["data"]}'); 87 | // } 88 | -------------------------------------------------------------------------------- /example/onboarding.dart: -------------------------------------------------------------------------------- 1 | // import 'dart:async'; 2 | // import 'dart:convert'; 3 | // import 'dart:io'; 4 | 5 | // import 'package:wallet_core/wallet_core.dart'; 6 | 7 | // Future approvalCallback() async { 8 | // return true; 9 | // } 10 | 11 | // void main() async { 12 | // // generate mnemonic 13 | // String mnemonic = Web3.generateMnemonic(); 14 | // print('mnemonic: $mnemonic'); 15 | 16 | // // get private key from mnemonic 17 | // String privateKey = Web3.privateKeyFromMnemonic(mnemonic); 18 | // print('privateKey: $privateKey'); 19 | 20 | // // init web3 module 21 | // Web3 web3 = Web3(approvalCallback); 22 | 23 | // // set web3 credentials with private key 24 | // await web3.setCredentials(privateKey); 25 | 26 | // // get account address 27 | // String accountAddress = await web3.getAddress(); 28 | // print('account address: $accountAddress'); 29 | 30 | // // init api module 31 | // API api = API(); 32 | 33 | // // login 34 | // print('enter phone number and press ENTER'); 35 | // String phoneNumber = 36 | // stdin.readLineSync(encoding: Encoding.getByName('utf-8')); 37 | // await api.loginRequest(phoneNumber); 38 | 39 | // // verify 40 | // print('enter sms verification code and press ENTER'); 41 | // String verificationCode = 42 | // stdin.readLineSync(encoding: Encoding.getByName('utf-8')); 43 | // String jwtToken = 44 | // await api.loginVerify(phoneNumber, verificationCode, accountAddress); 45 | // print('jwtToken: $jwtToken'); 46 | 47 | // // create wallet 48 | // await api.createWallet(); 49 | 50 | // // get wallet 51 | // dynamic wallet = await api.getWallet(); 52 | // print('wallet: $wallet'); 53 | 54 | // String walletAddress = wallet["walletAddress"]; 55 | 56 | // // init graph module 57 | // Graph graph = Graph(); 58 | 59 | // dynamic defaultCommunity = web3.getDefaultCommunity(); 60 | // // get default community details 61 | // dynamic community = await graph.getCommunityByAddress(defaultCommunity); 62 | // print('community: $community'); 63 | 64 | // // get default community token 65 | // dynamic token = await graph.getTokenOfCommunity(defaultCommunity); 66 | // print('token: $token'); 67 | 68 | // // check if member of default community 69 | // bool isMember = await graph.isCommunityMember( 70 | // walletAddress, community["entitiesList"]["address"]); 71 | // print('isMember: $isMember'); 72 | 73 | // if (!isMember) { 74 | // // join default community 75 | // await api.joinCommunity(web3, walletAddress, defaultCommunity); 76 | // } 77 | 78 | // // get default community businesses 79 | // dynamic businesses = await api.getBusinessList(web3.getDefaultCommunity()); 80 | // print('businesses: $businesses'); 81 | 82 | // String communityAddress = '0xc6Dae191309BB5efC1b15B96c68A197A0c600145'; 83 | 84 | // // get community details 85 | // community = 86 | // await graph.getCommunityByAddress(communityAddress); 87 | // print('community: $community'); 88 | 89 | // // get community token 90 | // token = await graph.getTokenOfCommunity(communityAddress); 91 | // print('token: $token'); 92 | 93 | // // check if member of community 94 | // isMember = await graph.isCommunityMember( 95 | // walletAddress, community["entitiesList"]["address"]); 96 | // print('isMember: $isMember'); 97 | 98 | // if (!isMember) { 99 | // // join community 100 | // await api.joinCommunity(web3, walletAddress, communityAddress); 101 | // } 102 | 103 | // // get community businesses 104 | // businesses = await api.getBusinessList(communityAddress); 105 | // print('businesses: $businesses'); 106 | // } 107 | -------------------------------------------------------------------------------- /example/pro.native.dart: -------------------------------------------------------------------------------- 1 | // import 'dart:async'; 2 | // import 'dart:convert'; 3 | // import 'dart:io'; 4 | 5 | // import 'package:wallet_core/wallet_core.dart'; 6 | 7 | // Future approvalCallback() async { 8 | // return true; 9 | // } 10 | 11 | // void main() async { 12 | // /* Fuse */ 13 | 14 | // // init web3 module 15 | // Web3 web3 = Web3(approvalCallback); 16 | 17 | // print('enter private key and press ENTER'); 18 | // String privateKey = stdin.readLineSync(encoding: Encoding.getByName('utf-8')); 19 | 20 | // // set web3 credentials with private key 21 | // await web3.setCredentials(privateKey); 22 | 23 | // // get address 24 | // String address = await web3.getAddress(); 25 | // print('address: $address'); 26 | 27 | // // get balance before transfer 28 | // EtherAmount balance = await web3.getBalance(); 29 | // print( 30 | // 'balance before transaction: ${balance.getInWei} wei (${balance.getValueInUnit(EtherUnit.ether)} ether)'); 31 | 32 | // // transfer 0.1 ETH to another address 33 | // String receiverAddress = '0xF3a4C2862188781365966A040B1f47b9614b2DC7'; 34 | // num amount = 1e17; 35 | // String txHash = await web3.transfer(receiverAddress, amount); 36 | // print('transction $txHash successful'); 37 | 38 | // // get balance after transfer 39 | // balance = await web3.getBalance(); 40 | // print( 41 | // 'balance after transaction: ${balance.getInWei} wei (${balance.getValueInUnit(EtherUnit.ether)} ether)'); 42 | 43 | // /* Ropsten */ 44 | 45 | // // init web3 module 46 | // Web3 web3Ropsten = Web3(approvalCallback, 47 | // url: 'https://ropsten.infura.io', networkId: 3); 48 | 49 | // // set web3 credentials with same private key 50 | // await web3Ropsten.setCredentials(privateKey); 51 | 52 | // // get address 53 | // address = await web3Ropsten.getAddress(); 54 | // print('address: $address'); 55 | 56 | // // get balance before transfer 57 | // balance = await web3Ropsten.getBalance(); 58 | // print( 59 | // 'balance before transaction: ${balance.getInWei} wei (${balance.getValueInUnit(EtherUnit.ether)} ether)'); 60 | 61 | // // transfer 0.1 ETH to another address 62 | // receiverAddress = '0xF3a4C2862188781365966A040B1f47b9614b2DC7'; 63 | // amount = 1e17; 64 | // txHash = await web3Ropsten.transfer(receiverAddress, amount); 65 | // print('transction $txHash successful'); 66 | 67 | // // get balance after transfer 68 | // balance = await web3Ropsten.getBalance(); 69 | // print( 70 | // 'balance after transaction: ${balance.getInWei} wei (${balance.getValueInUnit(EtherUnit.ether)} ether)'); 71 | // } 72 | -------------------------------------------------------------------------------- /example/pro.token.dart: -------------------------------------------------------------------------------- 1 | // import 'dart:async'; 2 | // import 'dart:convert'; 3 | // import 'dart:io'; 4 | // import 'dart:math'; 5 | 6 | // import 'package:wallet_core/wallet_core.dart'; 7 | 8 | // Future approvalCallback() async { 9 | // return true; 10 | // } 11 | 12 | // void main() async { 13 | // // init web3 module 14 | // Web3 web3 = Web3(approvalCallback); 15 | 16 | // print('enter private key and press ENTER'); 17 | // String privateKey = stdin.readLineSync(encoding: Encoding.getByName('utf-8')); 18 | 19 | // // set web3 credentials with private key 20 | // await web3.setCredentials(privateKey); 21 | 22 | // // get address 23 | // String address = await web3.getAddress(); 24 | // print('address: $address'); 25 | 26 | // String tokenAddress = '0x0F99E2090D1511e0f2474A56141D9fAB952C19e2'; 27 | // String receiverAddress = '0xF3a4C2862188781365966A040B1f47b9614b2DC7'; 28 | 29 | // // get token details 30 | // dynamic tokenDetails = await web3.getTokenDetails(tokenAddress); 31 | // print('token details: $tokenDetails'); 32 | 33 | // String tokenName = tokenDetails["name"]; 34 | // String tokenSymbol = tokenDetails["symbol"]; 35 | // dynamic tokenDecimals = int.parse(tokenDetails["decimals"].toString()); 36 | // tokenDecimals = BigInt.from(pow(10, tokenDecimals)); 37 | 38 | // // get own token balance before transfer 39 | // dynamic tokenBalance = await web3.getTokenBalance(tokenAddress); 40 | // tokenBalance = (tokenBalance / tokenDecimals).toStringAsFixed(2); 41 | // print( 42 | // '$address has $tokenBalance $tokenName($tokenSymbol) tokens before transfer'); 43 | 44 | // // get receiver token balance before transfer 45 | // tokenBalance = 46 | // await web3.getTokenBalance(tokenAddress, address: receiverAddress); 47 | // tokenBalance = (tokenBalance / tokenDecimals).toStringAsFixed(2); 48 | // print( 49 | // '$receiverAddress has $tokenBalance $tokenName($tokenSymbol) tokens before transfer'); 50 | 51 | // // transfer tokens 52 | // String txHash = await web3.tokenTransfer(tokenAddress, receiverAddress, 2.5); 53 | // print('transction $txHash successful'); 54 | 55 | // // get own token balance after transfer 56 | // tokenBalance = await web3.getTokenBalance(tokenAddress); 57 | // tokenBalance = (tokenBalance / tokenDecimals).toStringAsFixed(2); 58 | // print( 59 | // '$address has $tokenBalance $tokenName($tokenSymbol) tokens after transfer'); 60 | 61 | // // get receiver token balance after transfer 62 | // tokenBalance = 63 | // await web3.getTokenBalance(tokenAddress, address: receiverAddress); 64 | // tokenBalance = (tokenBalance / tokenDecimals).toStringAsFixed(2); 65 | // print( 66 | // '$receiverAddress has $tokenBalance $tokenName($tokenSymbol) tokens after transfer'); 67 | // } 68 | -------------------------------------------------------------------------------- /lib/constants/variables.dart: -------------------------------------------------------------------------------- 1 | class Variables { 2 | Variables._(); 3 | 4 | static const int DEFAULT_GAS_LIMIT = 700000; 5 | static const String NATIVE_TOKEN_ADDRESS = 6 | '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'; // For sending native (ETH/FUSE) using TransferManager 7 | } 8 | -------------------------------------------------------------------------------- /lib/src/abi.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | 3 | class ABI { 4 | static String get(String name) { 5 | List> abi; 6 | switch (name) { 7 | case "NftTransfer": 8 | abi = [{"constant":true,"inputs":[{"name":"_wallet","type":"address"}],"name":"getNonce","outputs":[{"name":"nonce","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_module","type":"address"}],"name":"addModule","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"recoverToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_data","type":"bytes"},{"name":"_nonce","type":"uint256"},{"name":"_signatures","type":"bytes"},{"name":"_gasPrice","type":"uint256"},{"name":"_gasLimit","type":"uint256"}],"name":"execute","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"relayer","outputs":[{"name":"nonce","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOnlyOwnerModule","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"guardianStorage","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_registry","type":"address"},{"name":"_guardianStorage","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"nftContract","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"data","type":"bytes"}],"name":"NonFungibleTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"success","type":"bool"},{"indexed":false,"name":"signedHash","type":"bytes32"}],"name":"TransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"name","type":"bytes32"}],"name":"ModuleCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"wallet","type":"address"}],"name":"ModuleInitialised","type":"event"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"}],"name":"init","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"},{"name":"","type":"uint256"},{"name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_nftContract","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_safe","type":"bool"},{"name":"_data","type":"bytes"}],"name":"transferNFT","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]; 9 | break; 10 | case "GuardianManager": 11 | abi = [{"constant":true,"inputs":[],"name":"securityWindow","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"}],"name":"init","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_wallet","type":"address"}],"name":"getNonce","outputs":[{"name":"nonce","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_module","type":"address"}],"name":"addModule","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"securityPeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"recoverToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_data","type":"bytes"},{"name":"_nonce","type":"uint256"},{"name":"_signatures","type":"bytes"},{"name":"_gasPrice","type":"uint256"},{"name":"_gasLimit","type":"uint256"}],"name":"execute","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"relayer","outputs":[{"name":"nonce","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"guardianStorage","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_registry","type":"address"},{"name":"_guardianStorage","type":"address"},{"name":"_securityPeriod","type":"uint256"},{"name":"_securityWindow","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"guardian","type":"address"},{"indexed":false,"name":"executeAfter","type":"uint256"}],"name":"GuardianAdditionRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"guardian","type":"address"},{"indexed":false,"name":"executeAfter","type":"uint256"}],"name":"GuardianRevokationRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"guardian","type":"address"}],"name":"GuardianAdditionCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"guardian","type":"address"}],"name":"GuardianRevokationCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"guardian","type":"address"}],"name":"GuardianAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"guardian","type":"address"}],"name":"GuardianRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"success","type":"bool"},{"indexed":false,"name":"signedHash","type":"bytes32"}],"name":"TransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"name","type":"bytes32"}],"name":"ModuleCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"wallet","type":"address"}],"name":"ModuleInitialised","type":"event"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_guardian","type":"address"}],"name":"addGuardian","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_guardian","type":"address"}],"name":"confirmGuardianAddition","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_guardian","type":"address"}],"name":"cancelGuardianAddition","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_guardian","type":"address"}],"name":"revokeGuardian","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_guardian","type":"address"}],"name":"confirmGuardianRevokation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_guardian","type":"address"}],"name":"cancelGuardianRevokation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_wallet","type":"address"},{"name":"_guardian","type":"address"}],"name":"isGuardian","outputs":[{"name":"_isGuardian","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_wallet","type":"address"}],"name":"guardianCount","outputs":[{"name":"_count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_wallet","type":"address"}],"name":"getGuardians","outputs":[{"name":"_guardians","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"}]; 12 | break; 13 | case "ERC721": 14 | abi = [{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"approved","internalType":"address","indexed":true},{"type":"uint256","name":"tokenId","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"operator","internalType":"address","indexed":true},{"type":"bool","name":"approved","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"tokenId","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"approve","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"baseURI","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getApproved","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isApprovedForAll","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"operator","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"mintItem","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"string","name":"tokenURI","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ownerOf","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"safeTransferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"safeTransferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"},{"type":"bytes","name":"_data","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setApprovalForAll","inputs":[{"type":"address","name":"operator","internalType":"address"},{"type":"bool","name":"approved","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"interfaceId","internalType":"bytes4"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenByIndex","inputs":[{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenOfOwnerByIndex","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"tokenURI","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]}]; 15 | break; 16 | case "BasicToken": 17 | abi = [{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"sender","type":"address"},{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"transferAndCall","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"name","type":"string"},{"name":"symbol","type":"string"},{"name":"initialSupply","type":"uint256"},{"name":"tokenURI","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenURI","type":"string"}],"name":"TokenURIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"data","type":"bytes"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"constant":false,"inputs":[{"name":"tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]; 18 | break; 19 | case "Community": 20 | abi = [{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"adminMask","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"userMask","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"entitiesList","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_name","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"constant":false,"inputs":[{"name":"_entitiesList","type":"address"}],"name":"setEntitiesList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"join","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_account","type":"address"},{"name":"_roles","type":"bytes32"}],"name":"addEntity","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_account","type":"address"}],"name":"removeEntity","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_account","type":"address"},{"name":"_entityRoles","type":"bytes32"}],"name":"addEnitityRoles","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_account","type":"address"},{"name":"_entityRoles","type":"bytes32"}],"name":"removeEnitityRoles","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_account","type":"address"},{"name":"_entityRoles","type":"bytes32"}],"name":"hasRoles","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"}]; 21 | break; 22 | case "CommunityManager": 23 | abi = [{"constant":false,"inputs":[{"name":"_wallet","type":"address"}],"name":"init","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_wallet","type":"address"}],"name":"getNonce","outputs":[{"name":"nonce","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_module","type":"address"}],"name":"addModule","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"recoverToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_data","type":"bytes"},{"name":"_nonce","type":"uint256"},{"name":"_signatures","type":"bytes"},{"name":"_gasPrice","type":"uint256"},{"name":"_gasLimit","type":"uint256"}],"name":"execute","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"relayer","outputs":[{"name":"nonce","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOnlyOwnerModule","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"pure","type":"function"},{"inputs":[{"name":"_registry","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"success","type":"bool"},{"indexed":false,"name":"signedHash","type":"bytes32"}],"name":"TransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"name","type":"bytes32"}],"name":"ModuleCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"wallet","type":"address"}],"name":"ModuleInitialised","type":"event"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_community","type":"address"}],"name":"joinCommunity","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]; 24 | break; 25 | case "TransferManager": 26 | abi = [{"constant":true,"inputs":[],"name":"securityWindow","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_wallet","type":"address"}],"name":"getNonce","outputs":[{"name":"nonce","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_wallet","type":"address"}],"name":"getCurrentLimit","outputs":[{"name":"_currentLimit","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_module","type":"address"}],"name":"addModule","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_wallet","type":"address"}],"name":"getDailyUnspent","outputs":[{"name":"_unspent","type":"uint256"},{"name":"_periodEnd","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"securityPeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"oldLimitManager","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"transferStorage","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"recoverToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_wallet","type":"address"}],"name":"getPendingLimit","outputs":[{"name":"_pendingLimit","type":"uint256"},{"name":"_changeAfter","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_data","type":"bytes"},{"name":"_nonce","type":"uint256"},{"name":"_signatures","type":"bytes"},{"name":"_gasPrice","type":"uint256"},{"name":"_gasLimit","type":"uint256"}],"name":"execute","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"priceProvider","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"relayer","outputs":[{"name":"nonce","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOnlyOwnerModule","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"guardianStorage","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"defaultLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_registry","type":"address"},{"name":"_transferStorage","type":"address"},{"name":"_guardianStorage","type":"address"},{"name":"_priceProvider","type":"address"},{"name":"_securityPeriod","type":"uint256"},{"name":"_securityWindow","type":"uint256"},{"name":"_defaultLimit","type":"uint256"},{"name":"_oldLimitManager","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"target","type":"address"},{"indexed":false,"name":"whitelistAfter","type":"uint64"}],"name":"AddedToWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"target","type":"address"}],"name":"RemovedFromWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"id","type":"bytes32"},{"indexed":true,"name":"executeAfter","type":"uint256"},{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"data","type":"bytes"}],"name":"PendingTransferCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"id","type":"bytes32"}],"name":"PendingTransferExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"id","type":"bytes32"}],"name":"PendingTransferCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"newLimit","type":"uint256"},{"indexed":true,"name":"startAfter","type":"uint64"}],"name":"LimitChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"token","type":"address"},{"indexed":true,"name":"amount","type":"uint256"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"data","type":"bytes"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"token","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"spender","type":"address"}],"name":"Approved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"data","type":"bytes"}],"name":"CalledContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"success","type":"bool"},{"indexed":false,"name":"signedHash","type":"bytes32"}],"name":"TransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"name","type":"bytes32"}],"name":"ModuleCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"wallet","type":"address"}],"name":"ModuleInitialised","type":"event"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"}],"name":"init","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_token","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"transferToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_token","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_fee","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"transferTokenWithFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_token","type":"address"},{"name":"_spender","type":"address"},{"name":"_amount","type":"uint256"}],"name":"approveToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_contract","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"callContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_token","type":"address"},{"name":"_contract","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"approveTokenAndCallContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_target","type":"address"}],"name":"addToWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_target","type":"address"}],"name":"removeFromWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_token","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_data","type":"bytes"},{"name":"_block","type":"uint256"}],"name":"executePendingTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_id","type":"bytes32"}],"name":"cancelPendingTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_newLimit","type":"uint256"}],"name":"changeLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"}],"name":"disableLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_wallet","type":"address"},{"name":"_target","type":"address"}],"name":"isWhitelisted","outputs":[{"name":"_isWhitelisted","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_wallet","type":"address"},{"name":"_id","type":"bytes32"}],"name":"getPendingTransfer","outputs":[{"name":"_executeAfter","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_data","type":"bytes"},{"name":"_signature","type":"bytes"}],"name":"isValidSignature","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_msgHash","type":"bytes32"},{"name":"_signature","type":"bytes"}],"name":"isValidSignature","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"}]; 27 | break; 28 | case "DAIPointsManager": 29 | abi = [{"constant":false,"inputs":[{"name":"_wallet","type":"address"}],"name":"init","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_wallet","type":"address"}],"name":"getNonce","outputs":[{"name":"nonce","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_manager","type":"address"}],"name":"addManager","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_manager","type":"address"}],"name":"revokeManager","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_module","type":"address"}],"name":"addModule","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"recoverToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"changeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_data","type":"bytes"},{"name":"_nonce","type":"uint256"},{"name":"_signatures","type":"bytes"},{"name":"_gasPrice","type":"uint256"},{"name":"_gasLimit","type":"uint256"}],"name":"execute","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"daiPoints","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"relayer","outputs":[{"name":"nonce","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOnlyOwnerModule","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"dai","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"managers","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_registry","type":"address"},{"name":"_dai","type":"address"},{"name":"_daiPoints","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_manager","type":"address"}],"name":"ManagerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_manager","type":"address"}],"name":"ManagerRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"success","type":"bool"},{"indexed":false,"name":"signedHash","type":"bytes32"}],"name":"TransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"name","type":"bytes32"}],"name":"ModuleCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"wallet","type":"address"}],"name":"ModuleInitialised","type":"event"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_amount","type":"uint256"}],"name":"getDAIPoints","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_recipient","type":"address"}],"name":"getDAIPointsToAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_dai","type":"address"}],"name":"setDaiAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_daiPoints","type":"address"}],"name":"setDaiPointsAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]; 30 | break; 31 | case "DAIPointsToken": 32 | abi = [{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"sender","type":"address"},{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"daiToDaipConversionRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DECIMALS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"transferAndCall","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"amount","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isMinter","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"fee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bridge","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"dai","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_dai","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"success","type":"bool"},{"indexed":false,"name":"data","type":"bytes"}],"name":"ContractFallback","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"data","type":"bytes"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setDAI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_fee","type":"uint256"}],"name":"setFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setBridge","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_rate","type":"uint256"}],"name":"setConversionRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"getDAIPoints","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"},{"name":"_recipient","type":"address"}],"name":"getDAIPointsToAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_recipient","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_winner","type":"address"}],"name":"reward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]; 33 | break; 34 | case "Wrapper": 35 | abi = [{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_recipient","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_feeRecipient","type":"address"},{"name":"_feeAmount","type":"uint256"}],"name":"transferWithFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_recipient","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_feeRecipient","type":"address"},{"name":"_feeAmount","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"transferAndCallWithFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]; 36 | break; 37 | case "UniswapV2Router01": 38 | abi = [{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]; 39 | break; 40 | case "MarketMaker": 41 | abi = [{"constant":true,"inputs":[],"name":"reserveRatio","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_supply","type":"uint256"},{"name":"_reserveBalance","type":"uint256"},{"name":"_totalRatio","type":"uint32"},{"name":"_amount","type":"uint256"}],"name":"calculateFundCost","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_supply","type":"uint256"},{"name":"_reserveBalance","type":"uint256"},{"name":"_reserveRatio","type":"uint32"},{"name":"_depositAmount","type":"uint256"}],"name":"calculatePurchaseReturn","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"mintedReward","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_supply","type":"uint256"},{"name":"_reserveBalance","type":"uint256"},{"name":"_reserveRatio","type":"uint32"},{"name":"_sellAmount","type":"uint256"}],"name":"calculateSaleReturn","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_fromConnectorBalance","type":"uint256"},{"name":"_fromConnectorWeight","type":"uint32"},{"name":"_toConnectorBalance","type":"uint256"},{"name":"_toConnectorWeight","type":"uint32"},{"name":"_amount","type":"uint256"}],"name":"calculateCrossConnectorReturn","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_fromReserveBalance","type":"uint256"},{"name":"_fromReserveRatio","type":"uint32"},{"name":"_toReserveBalance","type":"uint256"},{"name":"_toReserveRatio","type":"uint32"},{"name":"_amount","type":"uint256"}],"name":"calculateCrossReserveReturn","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"reserveTokens","outputs":[{"name":"reserveBalance","type":"uint256"},{"name":"reserveRatio","type":"uint32"},{"name":"supply","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_supply","type":"uint256"},{"name":"_reserveBalance","type":"uint256"},{"name":"_totalRatio","type":"uint32"},{"name":"_amount","type":"uint256"}],"name":"calculateLiquidateReturn","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"newMintedReward","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_token","type":"address"},{"name":"_nom","type":"uint256"},{"name":"_denom","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"caller","type":"address"},{"indexed":false,"name":"nom","type":"uint256"},{"indexed":false,"name":"denom","type":"uint256"}],"name":"ReserveRatioUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"caller","type":"address"},{"indexed":true,"name":"reserveToken","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"returnAmount","type":"uint256"},{"indexed":false,"name":"totalSupply","type":"uint256"},{"indexed":false,"name":"reserveBalance","type":"uint256"}],"name":"BalancesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"caller","type":"address"},{"indexed":true,"name":"reserveToken","type":"address"},{"indexed":false,"name":"oldReserveRatio","type":"uint256"},{"indexed":false,"name":"oldSupply","type":"uint256"},{"indexed":false,"name":"mint","type":"uint256"}],"name":"RewardMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"constant":false,"inputs":[{"name":"_reserve","type":"address"},{"name":"_supply","type":"uint256"},{"name":"_reserveBalance","type":"uint256"},{"name":"_reserveRatio","type":"uint32"}],"name":"initializeReserveToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_nom","type":"uint256"},{"name":"_denom","type":"uint256"}],"name":"setMintedReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getMintedReward","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNewMintedReward","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_reserve","type":"address"}],"name":"calculateNewReserveRatio","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_reserve","type":"address"}],"name":"calculateMintReward","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_reserve","type":"address"}],"name":"mintReward","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_reserve","type":"address"},{"name":"_reserveAmount","type":"uint256"}],"name":"buyReturn","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_reserve","type":"address"},{"name":"_tokenAmount","type":"uint256"}],"name":"sellReturn","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_reserve","type":"address"},{"name":"_reserveAmount","type":"uint256"}],"name":"buy","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_reserve","type":"address"},{"name":"_tokenAmount","type":"uint256"}],"name":"sell","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_reserve","type":"address"}],"name":"currentPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]; 42 | break; 43 | case "Reserve": 44 | abi = [{"constant":true,"inputs":[],"name":"marketMaker","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastMinted","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardInterval","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_dai","type":"address"},{"name":"_token","type":"address"},{"name":"_marketMaker","type":"address"},{"name":"_rewardInterval","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"caller","type":"address"},{"indexed":true,"name":"token","type":"address"},{"indexed":true,"name":"reserveToken","type":"address"},{"indexed":false,"name":"reserveAmount","type":"uint256"},{"indexed":false,"name":"minReturn","type":"uint256"},{"indexed":false,"name":"actualReturn","type":"uint256"}],"name":"TokenPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"caller","type":"address"},{"indexed":true,"name":"token","type":"address"},{"indexed":true,"name":"reserveToken","type":"address"},{"indexed":false,"name":"tokenAmount","type":"uint256"},{"indexed":false,"name":"minReturn","type":"uint256"},{"indexed":false,"name":"actualReturn","type":"uint256"}],"name":"TokenSold","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"caller","type":"address"},{"indexed":true,"name":"rewardCollector","type":"address"},{"indexed":true,"name":"token","type":"address"},{"indexed":false,"name":"reserve","type":"address"},{"indexed":false,"name":"mintedTokens","type":"uint256"}],"name":"RewardMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"constant":false,"inputs":[{"name":"_marketMaker","type":"address"}],"name":"setMarketMaker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_rewardInterval","type":"uint256"}],"name":"setRewardInterval","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_nom","type":"uint256"},{"name":"_denom","type":"uint256"}],"name":"setMintedReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_reserve","type":"address"},{"name":"_reserveAmount","type":"uint256"},{"name":"_minReturn","type":"uint256"}],"name":"buy","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_reserve","type":"address"},{"name":"_tokenAmount","type":"uint256"},{"name":"_minReturn","type":"uint256"}],"name":"sell","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_reserve","type":"address"}],"name":"currentPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_reserve","type":"address"}],"name":"mintReward","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"transferReserve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_dest","type":"address"}],"name":"transferMarketMaker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]; 45 | break; 46 | case "Seedbed": 47 | abi = [{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isPauser","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renouncePauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isMinter","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_cap","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"data","type":"bytes"}],"name":"Transfer","type":"event"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"},{"name":"data","type":"bytes"}],"name":"transferAndCall","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]; 48 | break; 49 | case "HomeMultiAMBErc20ToErc677": 50 | abi = [{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"_value","type":"uint256"}],"name":"relayTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_maxPerTx","type":"uint256"}],"name":"setExecutionMaxPerTx","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_token","type":"address"}],"name":"maxPerTx","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"isRewardAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_messageId","type":"bytes32"}],"name":"fixFailedMessage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_bridgeContract","type":"address"}],"name":"setBridgeContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_token","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withinLimit","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"removeRewardAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_token","type":"address"}],"name":"executionMaxPerTx","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_token","type":"address"}],"name":"isTokenRegistered","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_dailyLimit","type":"uint256"}],"name":"setDailyLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isInitialized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_token","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withinExecutionLimit","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentDay","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_token","type":"address"}],"name":"executionDailyLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getBridgeMode","outputs":[{"name":"_data","type":"bytes4"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_feeType","type":"bytes32"},{"name":"_token","type":"address"},{"name":"_fee","type":"uint256"}],"name":"setFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_messageId","type":"bytes32"}],"name":"messageFixed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_feeType","type":"bytes32"},{"name":"_token","type":"address"}],"name":"getFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_to","type":"address"}],"name":"claimTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getNextRewardAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_mediatorContract","type":"address"}],"name":"setMediatorContractOnOtherSide","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_feeType","type":"bytes32"},{"name":"_token","type":"address"},{"name":"_value","type":"uint256"}],"name":"calculateFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardAddressCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_token","type":"address"}],"name":"maxAvailablePerTx","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_dailyLimit","type":"uint256"}],"name":"setExecutionDailyLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"mediatorContractOnOtherSide","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_messageId","type":"bytes32"}],"name":"requestFailedMessageFix","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getBridgeInterfacesVersion","outputs":[{"name":"major","type":"uint64"},{"name":"minor","type":"uint64"},{"name":"patch","type":"uint64"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_token","type":"address"}],"name":"minPerTx","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_token","type":"address"},{"name":"_day","type":"uint256"}],"name":"totalSpentPerDay","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"_receiver","type":"address"},{"name":"_value","type":"uint256"}],"name":"relayTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"addRewardAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"requestGasLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"F_ADDR","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bridgeContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_maxPerTx","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rewardAddressList","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_minPerTx","type":"uint256"}],"name":"setMinPerTx","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_token","type":"address"},{"name":"_day","type":"uint256"}],"name":"totalExecutedPerDay","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_requestGasLimit","type":"uint256"}],"name":"setRequestGasLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"FOREIGN_TO_HOME_FEE","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_token","type":"address"}],"name":"dailyLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"HOME_TO_FOREIGN_FEE","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"foreignToken","type":"address"},{"indexed":true,"name":"homeToken","type":"address"}],"name":"NewTokenRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"feeType","type":"bytes32"},{"indexed":true,"name":"token","type":"address"},{"indexed":false,"name":"fee","type":"uint256"}],"name":"FeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fee","type":"uint256"},{"indexed":true,"name":"token","type":"address"},{"indexed":true,"name":"messageId","type":"bytes32"}],"name":"FeeDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"messageId","type":"bytes32"},{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"recipient","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"FailedMessageFixed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"token","type":"address"},{"indexed":true,"name":"recipient","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":true,"name":"messageId","type":"bytes32"}],"name":"TokensBridged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"token","type":"address"},{"indexed":false,"name":"newLimit","type":"uint256"}],"name":"DailyLimitChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"token","type":"address"},{"indexed":false,"name":"newLimit","type":"uint256"}],"name":"ExecutionDailyLimitChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousOwner","type":"address"},{"indexed":false,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addr","type":"address"}],"name":"RewardAddressAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addr","type":"address"}],"name":"RewardAddressRemoved","type":"event"},{"constant":false,"inputs":[{"name":"_bridgeContract","type":"address"},{"name":"_mediatorContract","type":"address"},{"name":"_dailyLimitMaxPerTxMinPerTxArray","type":"uint256[3]"},{"name":"_executionDailyLimitExecutionMaxPerTxArray","type":"uint256[2]"},{"name":"_requestGasLimit","type":"uint256"},{"name":"_owner","type":"address"},{"name":"_tokenImage","type":"address"},{"name":"_rewardAddreses","type":"address[]"},{"name":"_fees","type":"uint256[2]"}],"name":"initialize","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenImage","type":"address"}],"name":"setTokenImage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokenImage","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_decimals","type":"uint8"},{"name":"_recipient","type":"address"},{"name":"_value","type":"uint256"}],"name":"deployAndHandleBridgedTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_recipient","type":"address"},{"name":"_value","type":"uint256"}],"name":"handleBridgedTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"onTokenTransfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_foreignToken","type":"address"}],"name":"homeTokenAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_homeToken","type":"address"}],"name":"foreignTokenAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]; 51 | break; 52 | default: 53 | throw 'ABI does not exists for $name'; 54 | } 55 | 56 | return jsonEncode(abi); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /lib/src/graph.dart: -------------------------------------------------------------------------------- 1 | library graph; 2 | 3 | import 'dart:async'; 4 | import 'package:gql/language.dart'; 5 | import 'package:graphql/client.dart'; 6 | import 'package:wallet_core/src/queries.dart'; 7 | 8 | class Graph { 9 | late final GraphQLClient _clientFuseEntities; 10 | late final GraphQLClient _clientFuseRopstenBridge; 11 | late final GraphQLClient _clientFuseMainnetBridge; 12 | late final GraphQLClient _clientNFT; 13 | 14 | Graph( 15 | String baseUrl, 16 | String nftSubgraph, 17 | ) { 18 | _clientFuseEntities = GraphQLClient( 19 | link: HttpLink('$baseUrl/fuse-entities'), 20 | cache: GraphQLCache(), 21 | ); 22 | 23 | _clientFuseRopstenBridge = GraphQLClient( 24 | link: HttpLink('$baseUrl/fuse-ropsten-bridge'), 25 | cache: GraphQLCache(), 26 | ); 27 | 28 | _clientFuseMainnetBridge = GraphQLClient( 29 | link: HttpLink('$baseUrl/fuse-ethereum-bridge'), 30 | cache: GraphQLCache(), 31 | ); 32 | 33 | _clientNFT = GraphQLClient( 34 | link: HttpLink(nftSubgraph), 35 | cache: GraphQLCache(), 36 | ); 37 | } 38 | 39 | Future getCollectiblesByOwner(String owner) async { 40 | QueryResult result = await _clientNFT.query(QueryOptions( 41 | document: parseString(getCollectiblesByOwnerQuery), 42 | fetchPolicy: FetchPolicy.networkOnly, 43 | cacheRereadPolicy: CacheRereadPolicy.ignoreAll, 44 | variables: { 45 | 'owner': owner.toLowerCase(), 46 | }, 47 | )); 48 | if (result.hasException) { 49 | throw 'Error! Get Collectibles By Owner request failed - owner: $owner ${result.exception.toString()}'; 50 | } else { 51 | return result.data?["collectibles"]; 52 | } 53 | } 54 | 55 | Future getCommunityByAddress(String communityAddress) async { 56 | QueryResult result = await _clientFuseEntities.query(QueryOptions( 57 | document: parseString(getCommunityByAddressQuery), 58 | variables: { 59 | 'address': communityAddress, 60 | }, 61 | )); 62 | if (result.hasException) { 63 | throw 'Error! Get community request failed - communityAddress: $communityAddress ${result.exception.toString()}'; 64 | } else { 65 | return result.data?["communities"][0]; 66 | } 67 | } 68 | 69 | Future getCommunityBusinesses(String communityAddress) async { 70 | QueryResult result = await _clientFuseEntities.query(QueryOptions( 71 | document: parseString(getCommunityBusinessesQuery), 72 | variables: { 73 | 'address': communityAddress, 74 | }, 75 | )); 76 | if (result.hasException) { 77 | throw 'Error! Get community businesses request failed - communityAddress: $communityAddress ${result.exception.toString()}'; 78 | } else { 79 | return result.data?["communities"][0]['entitiesList'] 80 | ['communityEntities']; 81 | } 82 | } 83 | 84 | Future getHomeBridgedToken( 85 | String foreignTokenAddress, 86 | bool isRopsten, 87 | ) async { 88 | GraphQLClient client = 89 | isRopsten ? _clientFuseRopstenBridge : _clientFuseMainnetBridge; 90 | QueryResult result = await client.query(QueryOptions( 91 | document: parseString(getHomeBridgedTokenQuery), 92 | variables: { 93 | 'foreignAddress': foreignTokenAddress, 94 | }, 95 | )); 96 | if (result.hasException) { 97 | throw 'Error! Get home bridge token request failed - foreignTokenAddress: $foreignTokenAddress ${result.exception.toString()}'; 98 | } else { 99 | return result.data?["bridgedTokens"][0]; 100 | } 101 | } 102 | 103 | Future isCommunityMember( 104 | String accountAddress, 105 | String entitiesListAddress, 106 | ) async { 107 | QueryResult result = await _clientFuseEntities.query(QueryOptions( 108 | document: parseString(isCommunityMemberQuery), 109 | variables: { 110 | 'address': accountAddress, 111 | 'entitiesList': entitiesListAddress 112 | }, 113 | )); 114 | if (result.hasException) { 115 | throw 'Error! Is community member request failed - accountAddress: $accountAddress, entitiesListAddress: $entitiesListAddress ${result.exception.toString()}'; 116 | } else { 117 | return result.data?["communityEntities"].length > 0; 118 | } 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /lib/src/queries.dart: -------------------------------------------------------------------------------- 1 | const String getHomeBridgedTokenQuery = r''' 2 | query getBridgedToken($foreignAddress: String!) { 3 | bridgedTokens(where: {foreignAddress: $foreignAddress}) { 4 | address 5 | name 6 | decimals 7 | symbol 8 | foreignAddress 9 | } 10 | } 11 | '''; 12 | 13 | const String getCommunityByAddressQuery = r''' 14 | query getCommunityByAddress($address: String!) { 15 | communities(where:{address: $address}) { 16 | id 17 | address 18 | name 19 | entitiesList { 20 | address 21 | communityEntities { 22 | address 23 | isAdmin 24 | isApproved 25 | isUser 26 | isBusiness 27 | } 28 | } 29 | } 30 | } 31 | '''; 32 | 33 | const String getCommunityBusinessesQuery = r''' 34 | query getCommunityBusinesses($address: String!) { 35 | communities(where:{address: $address}) { 36 | entitiesList { 37 | communityEntities(where:{isBusiness: true}) { 38 | address 39 | isAdmin 40 | isApproved 41 | isBusiness 42 | } 43 | } 44 | } 45 | } 46 | '''; 47 | 48 | const String isCommunityMemberQuery = r''' 49 | query getCommunityEntities($address: String!, $entitiesList: String!) { 50 | communityEntities(where:{address: $address, entitiesList: $entitiesList}) { 51 | id 52 | address 53 | isAdmin 54 | isApproved 55 | } 56 | } 57 | '''; 58 | 59 | const String getCollectiblesByOwnerQuery = r''' 60 | query getCollectiblesByOwner($owner: String!) { 61 | collectibles(where: {owner: $owner}) { 62 | id 63 | name 64 | imageURL 65 | description 66 | collectionName 67 | collectionSymbol 68 | collectionAddress 69 | } 70 | } 71 | '''; 72 | -------------------------------------------------------------------------------- /lib/src/studio_api.dart: -------------------------------------------------------------------------------- 1 | library api; 2 | 3 | import 'dart:async'; 4 | import 'dart:io'; 5 | import 'package:path/path.dart' show basename; 6 | 7 | import 'package:dio/dio.dart'; 8 | 9 | class StudioApi { 10 | late Dio _dio; 11 | 12 | StudioApi({ 13 | String? apiKey, 14 | bool enableLogging = false, 15 | String baseUrl = 'https://studio.fuse.io/api', 16 | List interceptors = const [], 17 | }) { 18 | _dio = Dio( 19 | BaseOptions( 20 | baseUrl: baseUrl, 21 | queryParameters: apiKey != null 22 | ? { 23 | 'apiKey': apiKey, 24 | } 25 | : null, 26 | headers: {"Content-Type": 'application/json'}, 27 | ), 28 | ); 29 | if (enableLogging) { 30 | _dio.interceptors.addAll(interceptors); 31 | } 32 | } 33 | 34 | Future getCommunityData( 35 | String communityAddress, { 36 | String? walletAddress, 37 | }) async { 38 | String path = walletAddress != null 39 | ? '/v1/communities/$communityAddress/$walletAddress' 40 | : '/v1/communities/$communityAddress'; 41 | Response response = await _dio.get( 42 | path, 43 | ); 44 | 45 | return response.data['data']; 46 | } 47 | 48 | Future getBusinessList( 49 | String communityAddress, 50 | ) async { 51 | Response response = await _dio.get( 52 | '/v1/entities/$communityAddress', 53 | queryParameters: { 54 | 'type': 'business', 55 | 'withMetadata': true, 56 | }, 57 | ); 58 | 59 | return response.data; 60 | } 61 | 62 | Future getEntityMetadata( 63 | String communityAddress, 64 | String account, { 65 | bool isRopsten = false, 66 | }) async { 67 | Response response = await _dio.get( 68 | '/v1/entities/metadata/$communityAddress/$account', 69 | ); 70 | 71 | return response.data['data']; 72 | } 73 | 74 | Future uploadImage( 75 | File imageFile, 76 | ) async { 77 | FormData formData = FormData.fromMap({ 78 | 'image': await MultipartFile.fromFile( 79 | imageFile.path, 80 | filename: basename(imageFile.path), 81 | ), 82 | }); 83 | Response response = await _dio.post( 84 | '/v1/images', 85 | data: formData, 86 | ); 87 | 88 | return response.data; 89 | } 90 | 91 | Future fetchMetadata( 92 | String uri, 93 | ) async { 94 | Response response = await _dio.get( 95 | '/v1/metadata/$uri', 96 | ); 97 | 98 | return response.data['data']; 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /lib/src/wallet_api.dart: -------------------------------------------------------------------------------- 1 | library api; 2 | 3 | import 'dart:async'; 4 | import 'package:dio/dio.dart'; 5 | import 'package:wallet_core/src/web3.dart'; 6 | 7 | class WalletApi { 8 | late String _jwtToken; 9 | late Dio _dio; 10 | 11 | WalletApi({ 12 | String baseUrl = 'https://wallet.fuse.io/api', 13 | List interceptors = const [], 14 | }) { 15 | _dio = Dio( 16 | BaseOptions( 17 | baseUrl: baseUrl, 18 | headers: { 19 | 'Content-Type': 'application/json', 20 | }, 21 | ), 22 | ); 23 | if (interceptors.isNotEmpty) { 24 | _dio.interceptors.addAll(interceptors); 25 | } 26 | } 27 | 28 | void setJwtToken(String value) { 29 | _jwtToken = value; 30 | } 31 | 32 | Options get options => Options( 33 | headers: { 34 | 'Authorization': 'Bearer $_jwtToken', 35 | }, 36 | ); 37 | 38 | // Login using Firebase 39 | Future loginWithFirebase( 40 | String token, 41 | String accountAddress, 42 | String identifier, { 43 | String? appName, 44 | }) async { 45 | Response response = await _dio.post( 46 | '/v1/login/firebase/verify', 47 | data: { 48 | 'token': token, 49 | 'accountAddress': accountAddress, 50 | 'identifier': identifier, 51 | 'appName': appName, 52 | }, 53 | ); 54 | if (response.data['token'] != '') { 55 | _jwtToken = response.data['token']; 56 | return response.data['token']; 57 | } else { 58 | throw 'Error! Login verify failed - accountAddress: $accountAddress, token: $token, identifier: $identifier'; 59 | } 60 | } 61 | 62 | // Login using sms 63 | Future loginWithSMS( 64 | String phoneNumber, 65 | ) async { 66 | Response response = await _dio.post( 67 | '/v1/login/sms/request', 68 | data: { 69 | 'phoneNumber': phoneNumber, 70 | }, 71 | ); 72 | if (response.data['response'] == 'ok') { 73 | return true; 74 | } else { 75 | throw 'Error! Login request failed - phoneNumber: $phoneNumber'; 76 | } 77 | } 78 | 79 | // Verify using sms 80 | Future verifySMS( 81 | String verificationCode, 82 | String phoneNumber, 83 | String accountAddress, { 84 | String? appName, 85 | }) async { 86 | Response response = await _dio.post( 87 | '/v1/login/sms/verify', 88 | data: { 89 | 'code': verificationCode, 90 | 'phoneNumber': phoneNumber, 91 | 'accountAddress': accountAddress, 92 | 'appName': appName, 93 | }, 94 | ); 95 | if (response.data['token'] != '') { 96 | _jwtToken = response.data['token']; 97 | return response.data['token']; 98 | } else { 99 | throw 'Error! Login verify failed - phoneNumber: $phoneNumber, verificationCode: $verificationCode'; 100 | } 101 | } 102 | 103 | // Request token 104 | Future requestToken( 105 | String phoneNumber, 106 | String accountAddress, { 107 | String? appName, 108 | }) async { 109 | Response response = await _dio.post( 110 | '/v1/login/request', 111 | data: { 112 | 'phoneNumber': phoneNumber, 113 | 'accountAddress': accountAddress, 114 | 'appName': appName, 115 | }, 116 | ); 117 | if (response.data['token'] != '') { 118 | _jwtToken = response.data['token']; 119 | return response.data['token']; 120 | } else { 121 | throw 'Error! Login verify failed - phoneNumber: $phoneNumber'; 122 | } 123 | } 124 | 125 | Future createWallet({ 126 | String? communityAddress, 127 | String? referralAddress, 128 | }) async { 129 | dynamic wallet = await getWallet(); 130 | if (wallet != null && wallet['walletAddress'] != null) { 131 | print('Wallet already exists - wallet: $wallet'); 132 | return wallet; 133 | } 134 | Response response = await _dio.post( 135 | '/v1/wallets', 136 | data: { 137 | 'communityAddress': communityAddress, 138 | 'referralAddress': referralAddress, 139 | }, 140 | options: options, 141 | ); 142 | if (response.data['job'] != null) { 143 | return response.data; 144 | } else { 145 | throw 'Error! Create wallet request failed'; 146 | } 147 | } 148 | 149 | Future getWallet() async { 150 | Response response = await _dio.get( 151 | '/v1/wallets', 152 | options: options, 153 | ); 154 | if (response.data['data'] != null) { 155 | final Map data = response.data['data']; 156 | return { 157 | 'phoneNumber': data['phoneNumber'], 158 | 'accountAddress': data['accountAddress'], 159 | 'walletAddress': data['walletAddress'], 160 | 'createdAt': data['createdAt'], 161 | 'updatedAt': data['updatedAt'], 162 | 'walletModules': data['walletModules'], 163 | 'communityManager': data['walletModules']['CommunityManager'], 164 | 'transferManager': data['walletModules']['TransferManager'], 165 | 'dAIPointsManager': data['walletModules']['DAIPointsManager'] ?? null, 166 | 'networks': data['networks'], 167 | 'backup': data['backup'], 168 | 'balancesOnForeign': data['balancesOnForeign'], 169 | 'apy': data['apy'], 170 | 'version': data['version'], 171 | 'paddedVersion': data['paddedVersion'], 172 | 'isBlacklisted': data['isBlacklisted'] ?? false, 173 | }; 174 | } else { 175 | return {}; 176 | } 177 | } 178 | 179 | Future> getActionsByWalletAddress( 180 | String walletAddress, { 181 | int updatedAt = 0, 182 | String? tokenAddress, 183 | }) async { 184 | Response response = await _dio.get( 185 | '/v1/wallets/actions/$walletAddress', 186 | queryParameters: { 187 | 'updatedAt': updatedAt, 188 | 'tokenAddress': tokenAddress, 189 | }, 190 | options: options, 191 | ); 192 | return response.data['data']; 193 | } 194 | 195 | Future> getPaginatedActionsByWalletAddress( 196 | String walletAddress, 197 | int pageIndex, { 198 | String? tokenAddress, 199 | }) async { 200 | Response response = await _dio.get( 201 | '/v1/wallets/actions/paginated/$walletAddress', 202 | queryParameters: { 203 | 'page': pageIndex, 204 | 'tokenAddress': tokenAddress, 205 | }, 206 | options: options, 207 | ); 208 | return response.data['data']; 209 | } 210 | 211 | Future getAvailableUpgrades( 212 | String walletAddress, 213 | ) async { 214 | Response response = await _dio.get( 215 | '/v1/wallets/upgrades/available/$walletAddress', 216 | options: options, 217 | ); 218 | return response.data['data']; 219 | } 220 | 221 | Future installUpgrades( 222 | Web3 web3, 223 | String walletAddress, 224 | String disableModuleName, 225 | String disableModuleAddress, 226 | String enableModuleAddress, 227 | String upgradeId, 228 | ) async { 229 | Map relayParams = await web3.addModule( 230 | walletAddress, 231 | disableModuleName, 232 | disableModuleAddress, 233 | enableModuleAddress, 234 | ); 235 | Response response = await _dio.post( 236 | '/v1/wallets/upgrades/install/$walletAddress', 237 | data: { 238 | 'upgradeId': upgradeId, 239 | 'relayParams': relayParams, 240 | }, 241 | options: options, 242 | ); 243 | 244 | return response.data['data']; 245 | } 246 | 247 | Future> getNextReward( 248 | String walletAddress, 249 | ) async { 250 | Response response = await _dio.get( 251 | '/v1/wallets/apy/reward/$walletAddress', 252 | options: options, 253 | ); 254 | 255 | return response.data['data']; 256 | } 257 | 258 | Future> claimReward( 259 | String walletAddress, 260 | ) async { 261 | Response response = await _dio.post( 262 | '/v1/wallets/apy/claim/$walletAddress', 263 | options: options, 264 | ); 265 | 266 | return response.data['data']; 267 | } 268 | 269 | Future> enableWalletApy( 270 | String walletAddress, 271 | ) async { 272 | Response response = await _dio.post( 273 | '/v1/wallets/apy/enable/$walletAddress', 274 | options: options, 275 | ); 276 | 277 | return response.data['data']; 278 | } 279 | 280 | Future getJob(String id) async { 281 | Response response = await _dio.get( 282 | '/v1/jobs/$id', 283 | options: options, 284 | ); 285 | if (response.data['data'] != null) { 286 | return response.data['data']; 287 | } else { 288 | return null; 289 | } 290 | } 291 | 292 | Future getWalletByPhoneNumber( 293 | String phoneNumber, 294 | ) async { 295 | Response response = await _dio.get( 296 | '/v1/wallets/$phoneNumber', 297 | options: options, 298 | ); 299 | if (response.data['data'] != null) { 300 | return { 301 | 'phoneNumber': response.data['data']['phoneNumber'], 302 | 'accountAddress': response.data['data']['accountAddress'], 303 | 'walletAddress': response.data['data']['walletAddress'], 304 | 'createdAt': response.data['data']['createdAt'], 305 | 'updatedAt': response.data['data']['updatedAt'] 306 | }; 307 | } else { 308 | return {}; 309 | } 310 | } 311 | 312 | Future updateFirebaseToken( 313 | String walletAddress, 314 | String firebaseToken, 315 | ) async { 316 | Response response = await _dio.put( 317 | '/v1/wallets/token/$walletAddress', 318 | data: {'firebaseToken': firebaseToken}, 319 | options: options, 320 | ); 321 | return response.data; 322 | } 323 | 324 | Future addUserContext( 325 | Map body, 326 | ) async { 327 | Response response = await _dio.put( 328 | '/v1/wallets/context', 329 | data: body, 330 | options: options, 331 | ); 332 | return response.data; 333 | } 334 | 335 | Future deleteFirebaseToken( 336 | String walletAddress, 337 | String firebaseToken, 338 | ) async { 339 | Response response = await _dio.put( 340 | '/v1/wallets/token/$walletAddress/delete', 341 | data: {'firebaseToken': firebaseToken}, 342 | options: options, 343 | ); 344 | return response.data; 345 | } 346 | 347 | Future backupWallet({ 348 | String? communityAddress, 349 | }) async { 350 | Response response = await _dio.post( 351 | '/v1/wallets/backup', 352 | data: {'communityAddress': communityAddress}, 353 | options: options, 354 | ); 355 | return response.data; 356 | } 357 | 358 | Future joinCommunity( 359 | Web3 web3, 360 | String walletAddress, 361 | String communityAddress, { 362 | String? tokenAddress, 363 | String network = 'fuse', 364 | String? originNetwork, 365 | String? communityName, 366 | }) async { 367 | Map data = await web3.joinCommunityOffChain( 368 | walletAddress, 369 | communityAddress, 370 | tokenAddress: tokenAddress, 371 | network: network, 372 | originNetwork: originNetwork, 373 | communityName: communityName, 374 | ); 375 | Response response = await _dio.post( 376 | '/v1/relay', 377 | data: data, 378 | options: options, 379 | ); 380 | return response.data; 381 | } 382 | 383 | Future transfer( 384 | Web3 web3, 385 | String walletAddress, 386 | String receiverAddress, { 387 | String? tokensAmount, 388 | BigInt? amountInWei, 389 | String network = 'fuse', 390 | Map? transactionBody, 391 | }) async { 392 | Map data = await web3.transferOffChain( 393 | walletAddress, 394 | receiverAddress, 395 | tokensAmount: tokensAmount, 396 | amountInWei: amountInWei, 397 | network: network, 398 | transactionBody: transactionBody, 399 | ); 400 | Response response = await _dio.post( 401 | '/v1/relay', 402 | options: options, 403 | data: data, 404 | ); 405 | return response.data; 406 | } 407 | 408 | Future nftTransfer( 409 | Web3 web3, 410 | String nftTransferContractAddress, 411 | String walletAddress, 412 | String contractAddress, 413 | String receiverAddress, 414 | num tokenId, { 415 | String network = 'fuse', 416 | Map? transactionBody, 417 | }) async { 418 | Map data = await web3.transferNFTOffChain( 419 | nftTransferContractAddress, 420 | walletAddress, 421 | contractAddress, 422 | receiverAddress, 423 | tokenId, 424 | network: network, 425 | transactionBody: transactionBody, 426 | ); 427 | Response response = await _dio.post( 428 | '/v1/relay', 429 | options: options, 430 | data: data, 431 | ); 432 | return response.data; 433 | } 434 | 435 | Future tokenTransfer( 436 | Web3 web3, 437 | String walletAddress, 438 | String tokenAddress, 439 | String receiverAddress, 440 | String tokensAmount, { 441 | String network = 'fuse', 442 | String? externalId, 443 | }) async { 444 | Map data = await web3.transferTokenOffChain( 445 | walletAddress, 446 | tokenAddress, 447 | receiverAddress, 448 | tokensAmount, 449 | network: network, 450 | externalId: externalId, 451 | ); 452 | Response response = await _dio.post( 453 | '/v1/relay', 454 | options: options, 455 | data: data, 456 | ); 457 | return response.data; 458 | } 459 | 460 | Future approveTokenTransfer( 461 | Web3 web3, 462 | String walletAddress, 463 | String tokenAddress, { 464 | String network = 'fuse', 465 | num? tokensAmount, 466 | BigInt? amountInWei, 467 | }) async { 468 | Map data = await web3.approveTokenOffChain( 469 | walletAddress, 470 | tokenAddress, 471 | tokensAmount: tokensAmount, 472 | amountInWei: amountInWei, 473 | network: network, 474 | ); 475 | Response response = await _dio.post( 476 | '/v1/relay', 477 | options: options, 478 | data: data, 479 | ); 480 | return response.data; 481 | } 482 | 483 | Future transferDaiToDaiPointsOffChain( 484 | Web3 web3, 485 | String walletAddress, 486 | num tokensAmount, 487 | int tokenDecimals, { 488 | String? network, 489 | }) async { 490 | Map data = await web3.transferDaiToDAIpOffChain( 491 | walletAddress, 492 | tokensAmount, 493 | tokenDecimals, 494 | network: network, 495 | ); 496 | Response response = await _dio.post( 497 | '/v1/relay', 498 | options: options, 499 | data: data, 500 | ); 501 | return response.data; 502 | } 503 | 504 | Future callContract( 505 | Web3 web3, 506 | String walletAddress, 507 | String contractAddress, 508 | String data, { 509 | String? network, 510 | num? ethAmount, 511 | BigInt? amountInWei, 512 | Map? transactionBody, 513 | Map? txMetadata, 514 | }) async { 515 | Map signedData = await web3.callContractOffChain( 516 | walletAddress, 517 | contractAddress, 518 | data, 519 | network: network, 520 | ethAmount: ethAmount, 521 | amountInWei: amountInWei, 522 | transactionBody: transactionBody, 523 | txMetadata: txMetadata, 524 | ); 525 | Response response = await _dio.post( 526 | '/v1/relay', 527 | options: options, 528 | data: signedData, 529 | ); 530 | return response.data; 531 | } 532 | 533 | Future approveTokenAndCallContract( 534 | Web3 web3, 535 | String walletAddress, 536 | String tokenAddress, 537 | String contractAddress, 538 | String data, { 539 | String? network, 540 | num? tokensAmount, 541 | BigInt? amountInWei, 542 | Map? transactionBody, 543 | Map? txMetadata, 544 | }) async { 545 | Map signedData = 546 | await web3.approveTokenAndCallContractOffChain( 547 | walletAddress, 548 | tokenAddress, 549 | contractAddress, 550 | data, 551 | amountInWei: amountInWei, 552 | tokensAmount: tokensAmount, 553 | network: network, 554 | transactionBody: transactionBody, 555 | txMetadata: txMetadata, 556 | ); 557 | Response response = await _dio.post( 558 | '/v1/relay', 559 | options: options, 560 | data: signedData, 561 | ); 562 | 563 | return response.data; 564 | } 565 | 566 | Future multiRelay( 567 | List items, 568 | ) async { 569 | Response response = await _dio.post( 570 | '/v1/relay/multi', 571 | options: options, 572 | data: { 573 | 'items': items, 574 | }, 575 | ); 576 | 577 | return response.data; 578 | } 579 | 580 | Future syncContacts( 581 | List phoneNumbers, 582 | ) async { 583 | Response response = await _dio.post( 584 | '/v1/contacts', 585 | data: {'contacts': phoneNumbers}, 586 | options: options, 587 | ); 588 | 589 | return response.data['data']; 590 | } 591 | 592 | Future ackSync(int nonce) async { 593 | Response response = await _dio.post( 594 | '/v1/contacts/$nonce', 595 | options: options, 596 | ); 597 | 598 | return response.data; 599 | } 600 | 601 | Future invite( 602 | String phoneNumber, { 603 | String communityAddress = '', 604 | String name = '', 605 | String amount = '', 606 | String symbol = '', 607 | }) async { 608 | Response response = await _dio.post( 609 | '/v1/wallets/invite/$phoneNumber', 610 | data: { 611 | 'communityAddress': communityAddress, 612 | 'name': name, 613 | 'amount': amount, 614 | 'symbol': symbol, 615 | }, 616 | options: options, 617 | ); 618 | return response.data; 619 | } 620 | 621 | Future transferTokenToHomeWithAMBBridge( 622 | Web3 web3, 623 | String walletAddress, 624 | String foreignBridgeMediator, 625 | String tokenAddress, 626 | num tokensAmount, 627 | int tokenDecimals, { 628 | String network = 'mainnet', 629 | }) async { 630 | List signData = await web3.transferTokenToHome( 631 | walletAddress, 632 | foreignBridgeMediator, 633 | tokenAddress, 634 | tokensAmount, 635 | tokenDecimals, 636 | network: network, 637 | ); 638 | Map resp = await multiRelay( 639 | signData, 640 | ); 641 | return resp; 642 | } 643 | 644 | Future transferTokenToForeignWithAMBBridge( 645 | Web3 web3, 646 | String walletAddress, 647 | String homeBridgeMediatorAddress, 648 | String tokenAddress, 649 | num tokensAmount, 650 | int tokenDecimals, { 651 | String network = 'fuse', 652 | }) async { 653 | List signData = await web3.transferTokenToForeign( 654 | walletAddress, 655 | homeBridgeMediatorAddress, 656 | tokenAddress, 657 | tokensAmount, 658 | tokenDecimals, 659 | network: network, 660 | ); 661 | Map resp = await multiRelay( 662 | signData, 663 | ); 664 | return resp; 665 | } 666 | 667 | Future> getBeaconByWalletAddress( 668 | String walletAddress, 669 | ) async { 670 | String url = '/v1/wallets/beacons/$walletAddress'; 671 | Response response = await _dio.post( 672 | url, 673 | options: options, 674 | ); 675 | return response.data['data']; 676 | } 677 | 678 | Future> getWalletAddressByMajorAndMonirIds( 679 | int major, 680 | int minor, 681 | ) async { 682 | String url = '/v1/wallets/beacons/$major/$minor'; 683 | Response response = await _dio.get( 684 | url, 685 | options: options, 686 | ); 687 | return response.data['data']; 688 | } 689 | 690 | Future> getReferralInfo( 691 | String walletAddress, 692 | ) async { 693 | Response response = await _dio.get( 694 | '/v1/wallets/referral/total/$walletAddress', 695 | options: options, 696 | ); 697 | return response.data['data']; 698 | } 699 | 700 | Future> getUserProfile( 701 | String walletAddress, 702 | ) async { 703 | String url = '/v1/wallets/profiles/$walletAddress'; 704 | Response response = await _dio.get( 705 | url, 706 | options: options, 707 | ); 708 | 709 | return response.data['data']; 710 | } 711 | 712 | Future saveUserProfile(Map body) async { 713 | String url = '/v1/wallets/profiles'; 714 | Response response = await _dio.post( 715 | url, 716 | data: body, 717 | options: options, 718 | ); 719 | 720 | return response.data; 721 | } 722 | 723 | Future updateAvatar( 724 | String accountAddress, 725 | String avatarHash, 726 | ) async { 727 | String url = '/v1/wallets/profiles/$accountAddress/avatar'; 728 | Response response = await _dio.put( 729 | url, 730 | data: {'avatarHash': avatarHash}, 731 | options: options, 732 | ); 733 | 734 | return response.data; 735 | } 736 | 737 | Future updateDisplayName( 738 | String accountAddress, 739 | String displayName, 740 | ) async { 741 | String url = '/v1/wallets/profiles/$accountAddress/name'; 742 | Response response = await _dio.put( 743 | url, 744 | data: {'displayName': displayName}, 745 | options: options, 746 | ); 747 | 748 | return response.data; 749 | } 750 | } 751 | -------------------------------------------------------------------------------- /lib/src/web3.dart: -------------------------------------------------------------------------------- 1 | library web3; 2 | 3 | import 'dart:async'; 4 | import 'dart:math'; 5 | import 'dart:typed_data'; 6 | 7 | import 'package:bip32/bip32.dart' as bip32; 8 | import 'package:bip39/bip39.dart' as bip39; 9 | import 'package:decimal/decimal.dart'; 10 | import 'package:hex/hex.dart'; 11 | import 'package:http/http.dart'; 12 | import 'package:web3dart/crypto.dart'; 13 | import 'package:web3dart/web3dart.dart'; 14 | 15 | import 'package:wallet_core/constants/variables.dart'; 16 | 17 | import '../utils/crypto.dart'; 18 | import './abi.dart'; 19 | 20 | class Web3 { 21 | final Web3Client _client; 22 | final Future _approveCb; 23 | late final EthPrivateKey _credentials; 24 | final int _networkId; 25 | final String _defaultCommunityContractAddress; 26 | final String _communityManagerContractAddress; 27 | final String _daiPointsManagerContractAddress; 28 | final String _transferManagerContractAddress; 29 | final int _defaultGasLimit; 30 | 31 | Web3({ 32 | required Future approveCb(), 33 | required String url, 34 | required int networkId, 35 | required String defaultCommunityAddress, 36 | required String communityManagerAddress, 37 | required String daiPointsManagerAddress, 38 | required String transferManagerAddress, 39 | int defaultGasLimit = Variables.DEFAULT_GAS_LIMIT, 40 | }) : _client = Web3Client(url, Client()), 41 | _approveCb = approveCb(), 42 | _networkId = networkId, 43 | _defaultCommunityContractAddress = defaultCommunityAddress, 44 | _communityManagerContractAddress = communityManagerAddress, 45 | _transferManagerContractAddress = transferManagerAddress, 46 | _daiPointsManagerContractAddress = daiPointsManagerAddress, 47 | _defaultGasLimit = defaultGasLimit; 48 | 49 | static String generateMnemonic({int strength = 128}) { 50 | return bip39.generateMnemonic( 51 | strength: strength, 52 | ); 53 | } 54 | 55 | static bool validateMnemonic(String mnemonic) { 56 | return bip39.validateMnemonic(mnemonic); 57 | } 58 | 59 | static String privateKeyFromMnemonic(String mnemonic, {int childIndex = 0}) { 60 | String seed = bip39.mnemonicToSeedHex(mnemonic); 61 | bip32.BIP32 root = bip32.BIP32.fromSeed(HEX.decode(seed) as Uint8List); 62 | bip32.BIP32 child = root.derivePath("m/44'/60'/0'/0/$childIndex"); 63 | String privateKey = HEX.encode(child.privateKey!); 64 | return privateKey; 65 | } 66 | 67 | Future setCredentials(String privateKey) async { 68 | _credentials = await EthPrivateKey.fromHex(privateKey); 69 | } 70 | 71 | Future getAddress() async { 72 | return (await _credentials.address).toString(); 73 | } 74 | 75 | Future getBlockNumber() async { 76 | return _client.getBlockNumber(); 77 | } 78 | 79 | Future _sendTransactionAndWaitForReceipt( 80 | Transaction transaction, 81 | ) async { 82 | print('sendTransactionAndWaitForReceipt'); 83 | String txHash = await _client.sendTransaction(_credentials, transaction, 84 | chainId: _networkId); 85 | TransactionReceipt? receipt; 86 | try { 87 | receipt = await _client.getTransactionReceipt(txHash); 88 | } catch (err) { 89 | print('could not get $txHash receipt, try again'); 90 | } 91 | int delay = 1; 92 | int retries = 10; 93 | while (receipt == null) { 94 | print('waiting for receipt'); 95 | await Future.delayed(Duration(seconds: delay)); 96 | delay *= 2; 97 | retries--; 98 | if (retries == 0) { 99 | throw 'transaction $txHash not mined yet...'; 100 | } 101 | try { 102 | receipt = await _client.getTransactionReceipt(txHash); 103 | } catch (err) { 104 | print('could not get $txHash receipt, try again'); 105 | } 106 | } 107 | return txHash; 108 | } 109 | 110 | Future getBalance({String? address}) async { 111 | EthereumAddress a; 112 | if (address != null && address != "") { 113 | a = EthereumAddress.fromHex(address); 114 | } else { 115 | a = await _credentials.extractAddress(); 116 | } 117 | return await _client.getBalance(a); 118 | } 119 | 120 | Future transfer( 121 | String receiverAddress, 122 | int amountInWei, 123 | ) async { 124 | print('transfer --> receiver: $receiverAddress, amountInWei: $amountInWei'); 125 | 126 | bool isApproved = await _approveCb; 127 | if (!isApproved) { 128 | throw 'transaction not approved'; 129 | } 130 | 131 | EthereumAddress receiver = EthereumAddress.fromHex(receiverAddress); 132 | EtherAmount amount = EtherAmount.fromUnitAndValue( 133 | EtherUnit.wei, 134 | BigInt.from(amountInWei), 135 | ); 136 | 137 | String txHash = await _sendTransactionAndWaitForReceipt( 138 | Transaction(to: receiver, value: amount), 139 | ); 140 | print('transction $txHash successful'); 141 | return txHash; 142 | } 143 | 144 | Future _contract( 145 | String contractName, 146 | String contractAddress, 147 | ) async { 148 | String abi = ABI.get(contractName); 149 | DeployedContract contract = DeployedContract( 150 | ContractAbi.fromJson(abi, contractName), 151 | EthereumAddress.fromHex(contractAddress), 152 | ); 153 | return contract; 154 | } 155 | 156 | Future> _readFromContract( 157 | String contractName, 158 | String contractAddress, 159 | String functionName, 160 | List params, 161 | ) async { 162 | DeployedContract contract = await _contract(contractName, contractAddress); 163 | return await _client.call( 164 | contract: contract, 165 | function: contract.function(functionName), 166 | params: params); 167 | } 168 | 169 | Future _callContract( 170 | String contractName, 171 | String contractAddress, 172 | String functionName, 173 | List params, 174 | ) async { 175 | bool isApproved = await _approveCb; 176 | if (!isApproved) { 177 | throw 'transaction not approved'; 178 | } 179 | DeployedContract contract = await _contract(contractName, contractAddress); 180 | Transaction tx = Transaction.callContract( 181 | contract: contract, 182 | function: contract.function(functionName), 183 | parameters: params); 184 | return await _sendTransactionAndWaitForReceipt(tx); 185 | } 186 | 187 | Future getTokenDetails(String tokenAddress) async { 188 | return { 189 | "name": (await _readFromContract('BasicToken', tokenAddress, 'name', [])) 190 | .first, 191 | "symbol": 192 | (await _readFromContract('BasicToken', tokenAddress, 'symbol', [])) 193 | .first, 194 | "decimals": 195 | (await _readFromContract('BasicToken', tokenAddress, 'decimals', [])) 196 | .first 197 | }; 198 | } 199 | 200 | Future getTokenBalance( 201 | String tokenAddress, { 202 | String? address, 203 | }) async { 204 | List params = []; 205 | if (address != null && address != "") { 206 | params = [EthereumAddress.fromHex(address)]; 207 | } else { 208 | EthereumAddress address = await _credentials.extractAddress(); 209 | params = [address]; 210 | } 211 | final List response = await _readFromContract( 212 | 'BasicToken', 213 | tokenAddress, 214 | 'balanceOf', 215 | params, 216 | ); 217 | return response.first; 218 | } 219 | 220 | Future getTokenAllowance( 221 | String tokenAddress, 222 | String spender, { 223 | String? owner, 224 | }) async { 225 | List params = []; 226 | if (owner != null && owner != "") { 227 | params.add(EthereumAddress.fromHex(owner)); 228 | } else { 229 | EthereumAddress address = await _credentials.extractAddress(); 230 | params.add(address); 231 | } 232 | params.add(EthereumAddress.fromHex(spender)); 233 | final List response = await _readFromContract( 234 | 'BasicToken', 235 | tokenAddress, 236 | 'allowance', 237 | params, 238 | ); 239 | return response.first; 240 | } 241 | 242 | Future tokenTransfer( 243 | String tokenAddress, 244 | String receiverAddress, 245 | String tokensAmount, 246 | ) async { 247 | EthereumAddress receiver = EthereumAddress.fromHex(receiverAddress); 248 | dynamic tokenDetails = await getTokenDetails(tokenAddress); 249 | int tokenDecimals = int.parse(tokenDetails["decimals"].toString()); 250 | Decimal tokensAmountDecimal = Decimal.parse(tokensAmount); 251 | Decimal decimals = Decimal.parse(pow(10, tokenDecimals).toString()); 252 | BigInt amount = BigInt.parse((tokensAmountDecimal * decimals).toString()); 253 | return await _callContract( 254 | 'BasicToken', 255 | tokenAddress, 256 | 'transfer', 257 | [receiver, amount], 258 | ); 259 | } 260 | 261 | String getDefaultCommunity() { 262 | return _defaultCommunityContractAddress; 263 | } 264 | 265 | // "old" join community 266 | Future join(String communityAddress) async { 267 | return await _callContract('Community', communityAddress, 'join', []); 268 | } 269 | 270 | Future cashGetBalance(String walletAddress) async { 271 | return await getBalance(address: walletAddress); 272 | } 273 | 274 | Future getNonceForRelay() async { 275 | BigInt block = BigInt.from(await _client.getBlockNumber()); 276 | print('block: $block'); 277 | BigInt timestamp = BigInt.from(DateTime.now().millisecondsSinceEpoch); 278 | print('timestamp: $timestamp'); 279 | String blockHex = hexZeroPad(hexlify(block), 16); 280 | String timestampHex = hexZeroPad(hexlify(timestamp), 16); 281 | return '0x' + 282 | blockHex.substring(2, blockHex.length) + 283 | timestampHex.substring( 284 | 2, 285 | timestampHex.length, 286 | ); 287 | } 288 | 289 | Future signOffChain( 290 | String from, 291 | String to, 292 | BigInt value, 293 | String data, 294 | String nonce, 295 | BigInt gasPrice, 296 | BigInt gasLimit, 297 | ) async { 298 | dynamic inputArr = [ 299 | '0x19', 300 | '0x00', 301 | from, 302 | to, 303 | hexZeroPad(hexlify(value), 32), 304 | data, 305 | nonce, 306 | hexZeroPad(hexlify(gasPrice), 32), 307 | hexZeroPad(hexlify(gasLimit), 32) 308 | ]; 309 | String input = '0x' + 310 | inputArr.map((hexStr) => hexStr.toString().substring(2)).join(''); 311 | print('input: $input'); 312 | Uint8List hash = keccak256(hexToBytes(input)); 313 | print('hash: ${HEX.encode(hash)}'); 314 | print( 315 | 'signing on message with accountAddress: ${await _credentials.extractAddress()}'); 316 | Uint8List signature = await _credentials.signPersonalMessage(hash); 317 | return '0x' + HEX.encode(signature); 318 | } 319 | 320 | Future> transferDaiToDAIpOffChain( 321 | String walletAddress, 322 | num tokenAmount, 323 | int tokenDecimals, { 324 | String? network = "fuse", 325 | }) async { 326 | EthereumAddress wallet = EthereumAddress.fromHex(walletAddress); 327 | Decimal tokensAmountDecimal = Decimal.parse(tokenAmount.toString()); 328 | Decimal decimals = Decimal.parse(pow(10, tokenDecimals).toString()); 329 | BigInt amount = BigInt.parse((tokensAmountDecimal * decimals).toString()); 330 | 331 | String nonce = await getNonceForRelay(); 332 | print('nonce: $nonce'); 333 | 334 | DeployedContract contract = await _contract( 335 | 'DAIPointsManager', 336 | _daiPointsManagerContractAddress, 337 | ); 338 | Uint8List data = contract.function('getDAIPoints').encodeCall( 339 | [wallet, amount], 340 | ); 341 | String encodedData = '0x' + HEX.encode(data); 342 | print('encodedData: $encodedData'); 343 | 344 | String signature = await signOffChain( 345 | _daiPointsManagerContractAddress, 346 | walletAddress, 347 | BigInt.from(0), 348 | encodedData, 349 | nonce, 350 | BigInt.from(0), 351 | BigInt.from(_defaultGasLimit), 352 | ); 353 | 354 | return { 355 | "walletAddress": walletAddress, 356 | "methodData": encodedData, 357 | "nonce": nonce, 358 | "network": network, 359 | "gasPrice": 0, 360 | "gasLimit": _defaultGasLimit, 361 | "signature": signature, 362 | "walletModule": "DAIPointsManager" 363 | }; 364 | } 365 | 366 | Future> joinCommunityOffChain( 367 | String walletAddress, 368 | String communityAddress, { 369 | String network = 'fuse', 370 | String? originNetwork = 'mainnet', 371 | String? tokenAddress, 372 | String? communityName, 373 | }) async { 374 | String nonce = await getNonceForRelay(); 375 | print('nonce: $nonce'); 376 | 377 | DeployedContract contract = await _contract( 378 | 'CommunityManager', 379 | _communityManagerContractAddress, 380 | ); 381 | Uint8List data = contract.function('joinCommunity').encodeCall([ 382 | EthereumAddress.fromHex(walletAddress), 383 | EthereumAddress.fromHex(communityAddress) 384 | ]); 385 | String encodedData = '0x' + HEX.encode(data); 386 | print('encodedData: $encodedData'); 387 | 388 | String signature = await signOffChain( 389 | _communityManagerContractAddress, 390 | walletAddress, 391 | BigInt.from(0), 392 | encodedData, 393 | nonce, 394 | BigInt.from(0), 395 | BigInt.from(_defaultGasLimit), 396 | ); 397 | 398 | return { 399 | "walletAddress": walletAddress, 400 | "methodData": encodedData, 401 | "communityAddress": communityAddress, 402 | "nonce": nonce, 403 | "gasPrice": 0, 404 | "network": network, 405 | "gasLimit": _defaultGasLimit, 406 | "signature": signature, 407 | "walletModule": "CommunityManager", 408 | "methodName": "joinCommunity", 409 | "transactionBody": { 410 | "tokenAddress": tokenAddress, 411 | "originNetwork": originNetwork, 412 | "status": 'pending', 413 | "communityName": communityName, 414 | } 415 | }; 416 | } 417 | 418 | Future> transferOffChain( 419 | String walletAddress, 420 | String receiverAddress, { 421 | String? tokensAmount, 422 | BigInt? amountInWei, 423 | String network = "fuse", 424 | Map? transactionBody, 425 | }) async { 426 | EthereumAddress wallet = EthereumAddress.fromHex(walletAddress); 427 | EthereumAddress token = EthereumAddress.fromHex( 428 | Variables.NATIVE_TOKEN_ADDRESS, 429 | ); 430 | EthereumAddress receiver = EthereumAddress.fromHex(receiverAddress); 431 | BigInt amount = BigInt.zero; 432 | if (tokensAmount != null) { 433 | Decimal tokensAmountDecimal = Decimal.parse(tokensAmount); 434 | Decimal decimals = Decimal.parse(pow(10, 18).toString()); 435 | amount = BigInt.parse((tokensAmountDecimal * decimals).toString()); 436 | } else if (amountInWei != null) { 437 | amount = amountInWei; 438 | } 439 | 440 | String nonce = await getNonceForRelay(); 441 | DeployedContract contract = await _contract( 442 | 'TransferManager', 443 | _transferManagerContractAddress, 444 | ); 445 | Uint8List data = contract.function('transferToken').encodeCall([ 446 | wallet, 447 | token, 448 | receiver, 449 | amount, 450 | hexToBytes('0x'), 451 | ]); 452 | String encodedData = '0x' + HEX.encode(data); 453 | 454 | String signature = await signOffChain( 455 | _transferManagerContractAddress, 456 | walletAddress, 457 | BigInt.from(0), 458 | encodedData, 459 | nonce, 460 | BigInt.from(0), 461 | BigInt.from(_defaultGasLimit)); 462 | 463 | return { 464 | "walletAddress": walletAddress, 465 | "methodData": encodedData, 466 | "communityAddress": _defaultCommunityContractAddress, 467 | "nonce": nonce, 468 | "network": network, 469 | "methodName": "transferToken", 470 | "gasPrice": 0, 471 | "gasLimit": _defaultGasLimit, 472 | "signature": signature, 473 | "walletModule": "TransferManager", 474 | "transactionBody": transactionBody, 475 | }; 476 | } 477 | 478 | Future> addModule( 479 | String walletAddress, 480 | String disableModuleName, 481 | String disableModuleAddress, 482 | String enableModuleAddress, { 483 | String methodName = 'addModule', 484 | String network = "fuse", 485 | Map? transactionBody, 486 | }) async { 487 | EthereumAddress wallet = EthereumAddress.fromHex(walletAddress); 488 | EthereumAddress newModule = EthereumAddress.fromHex(enableModuleAddress); 489 | String nonce = await getNonceForRelay(); 490 | DeployedContract contract = await _contract( 491 | disableModuleName, 492 | disableModuleAddress, 493 | ); 494 | Uint8List data = contract.function(methodName).encodeCall([ 495 | wallet, 496 | newModule, 497 | ]); 498 | String encodedData = '0x' + HEX.encode(data); 499 | 500 | String signature = await signOffChain( 501 | disableModuleAddress, 502 | walletAddress, 503 | BigInt.from(0), 504 | encodedData, 505 | nonce, 506 | BigInt.from(0), 507 | BigInt.from(_defaultGasLimit), 508 | ); 509 | 510 | return { 511 | "walletAddress": walletAddress, 512 | "methodData": encodedData, 513 | "communityAddress": _defaultCommunityContractAddress, 514 | "nonce": nonce, 515 | "network": network, 516 | "methodName": methodName, 517 | "gasPrice": 0, 518 | "gasLimit": _defaultGasLimit, 519 | "signature": signature, 520 | "walletModule": disableModuleName, 521 | "transactionBody": transactionBody, 522 | }; 523 | } 524 | 525 | Future> transferTokenOffChain( 526 | String walletAddress, 527 | String tokenAddress, 528 | String receiverAddress, 529 | String tokensAmount, { 530 | String? network, 531 | String? externalId, 532 | }) async { 533 | EthereumAddress wallet = EthereumAddress.fromHex(walletAddress); 534 | EthereumAddress token = EthereumAddress.fromHex(tokenAddress); 535 | EthereumAddress receiver = EthereumAddress.fromHex(receiverAddress); 536 | dynamic tokenDetails = await getTokenDetails(tokenAddress); 537 | int tokenDecimals = int.parse(tokenDetails["decimals"].toString()); 538 | String tokenSymbol = tokenDetails["symbol"]; 539 | Decimal tokensAmountDecimal = Decimal.parse(tokensAmount); 540 | Decimal decimals = Decimal.parse(pow(10, tokenDecimals).toString()); 541 | BigInt amount = BigInt.parse((tokensAmountDecimal * decimals).toString()); 542 | 543 | String nonce = await getNonceForRelay(); 544 | DeployedContract contract = await _contract( 545 | 'TransferManager', 546 | _transferManagerContractAddress, 547 | ); 548 | Uint8List data = contract.function('transferToken').encodeCall([ 549 | wallet, 550 | token, 551 | receiver, 552 | amount, 553 | hexToBytes('0x'), 554 | ]); 555 | String encodedData = '0x' + HEX.encode(data); 556 | 557 | String signature = await signOffChain( 558 | _transferManagerContractAddress, 559 | walletAddress, 560 | BigInt.from(0), 561 | encodedData, 562 | nonce, 563 | BigInt.from(0), 564 | BigInt.from(_defaultGasLimit), 565 | ); 566 | 567 | return { 568 | "walletAddress": walletAddress, 569 | "methodData": encodedData, 570 | "nonce": nonce, 571 | "communityAddress": _defaultCommunityContractAddress, 572 | "network": network, 573 | "methodName": "transferToken", 574 | "gasPrice": 0, 575 | "gasLimit": _defaultGasLimit, 576 | "signature": signature, 577 | "walletModule": "TransferManager", 578 | "externalId": externalId, 579 | "transactionBody": { 580 | "tokenAddress": tokenAddress, 581 | "from": walletAddress, 582 | "to": receiverAddress, 583 | "value": amount.toString(), 584 | "asset": tokenSymbol, 585 | "status": 'pending', 586 | 'type': 'SEND', 587 | 'tokenName': tokenDetails['name'], 588 | 'tokenDecimal': tokenDecimals, 589 | 'tokenSymbol': tokenSymbol, 590 | }, 591 | }; 592 | } 593 | 594 | Future> approveTokenOffChain( 595 | String walletAddress, 596 | String tokenAddress, { 597 | String? spenderContract, 598 | String? network = "fuse", 599 | Map? transactionBody, 600 | Map? txMetadata, 601 | num? tokensAmount, 602 | BigInt? amountInWei, 603 | }) async { 604 | EthereumAddress wallet = EthereumAddress.fromHex(walletAddress); 605 | EthereumAddress token = EthereumAddress.fromHex(tokenAddress); 606 | String nonce = await getNonceForRelay(); 607 | DeployedContract contract = await _contract( 608 | 'TransferManager', 609 | _transferManagerContractAddress, 610 | ); 611 | Uint8List data; 612 | EthereumAddress spender = wallet; 613 | if (spenderContract != null) { 614 | spender = EthereumAddress.fromHex(spenderContract); 615 | } 616 | if (tokensAmount != null) { 617 | dynamic tokenDetails = await getTokenDetails(tokenAddress); 618 | int tokenDecimals = int.parse(tokenDetails["decimals"].toString()); 619 | Decimal tokensAmountDecimal = Decimal.parse(tokensAmount.toString()); 620 | Decimal decimals = Decimal.parse(pow(10, tokenDecimals).toString()); 621 | BigInt amount = BigInt.parse((tokensAmountDecimal * decimals).toString()); 622 | data = contract.function('approveToken').encodeCall( 623 | [wallet, token, spender, amount], 624 | ); 625 | } else { 626 | data = contract.function('approveToken').encodeCall( 627 | [wallet, token, spender, amountInWei], 628 | ); 629 | } 630 | 631 | String encodedData = '0x' + HEX.encode(data); 632 | 633 | String signature = await signOffChain( 634 | _transferManagerContractAddress, 635 | walletAddress, 636 | BigInt.from(0), 637 | encodedData, 638 | nonce, 639 | BigInt.from(0), 640 | BigInt.from(_defaultGasLimit), 641 | ); 642 | 643 | return { 644 | "walletAddress": walletAddress, 645 | "methodData": encodedData, 646 | "communityAddress": _defaultCommunityContractAddress, 647 | "nonce": nonce, 648 | "network": network, 649 | "methodName": "approveToken", 650 | "gasPrice": 0, 651 | "gasLimit": _defaultGasLimit, 652 | "signature": signature, 653 | "walletModule": "TransferManager", 654 | "transactionBody": transactionBody, 655 | "txMetadata": txMetadata, 656 | }; 657 | } 658 | 659 | Future> transferNFTOffChain( 660 | String nftTransferContractAddress, 661 | String walletAddress, 662 | String contractAddress, 663 | String receiverAddress, 664 | num tokenId, { 665 | bool? safe = false, 666 | String? network = "fuse", 667 | Map? transactionBody = const {}, 668 | }) async { 669 | EthereumAddress wallet = EthereumAddress.fromHex(walletAddress); 670 | EthereumAddress contract = EthereumAddress.fromHex(contractAddress); 671 | EthereumAddress receiver = EthereumAddress.fromHex(receiverAddress); 672 | BigInt id = BigInt.from(tokenId); 673 | String nonce = await getNonceForRelay(); 674 | DeployedContract NftTransferContract = await _contract( 675 | 'NftTransfer', 676 | nftTransferContractAddress, 677 | ); 678 | Uint8List transferNFTContractData = 679 | NftTransferContract.function('transferNFT').encodeCall( 680 | [ 681 | wallet, 682 | contract, 683 | receiver, 684 | id, 685 | safe, 686 | hexToBytes('0x'), 687 | ], 688 | ); 689 | String encodedCallContractData = '0x' + 690 | HEX.encode( 691 | transferNFTContractData, 692 | ); 693 | 694 | String signature = await signOffChain( 695 | nftTransferContractAddress, 696 | walletAddress, 697 | BigInt.from(0), 698 | encodedCallContractData, 699 | nonce, 700 | BigInt.from(0), 701 | BigInt.from(_defaultGasLimit), 702 | ); 703 | 704 | return { 705 | "walletAddress": walletAddress, 706 | "methodData": encodedCallContractData, 707 | "communityAddress": _defaultCommunityContractAddress, 708 | "nonce": nonce, 709 | "network": network, 710 | "methodName": "transferNFT", 711 | "gasPrice": 0, 712 | "gasLimit": _defaultGasLimit, 713 | "signature": signature, 714 | "walletModule": "NftTransfer", 715 | "transactionBody": transactionBody, 716 | }; 717 | } 718 | 719 | Future> callContractOffChain( 720 | String walletAddress, 721 | String contractAddress, 722 | String data, { 723 | String? network = "fuse", 724 | Map? transactionBody, 725 | num? ethAmount, 726 | BigInt? amountInWei, 727 | Map? txMetadata, 728 | }) async { 729 | EthereumAddress wallet = EthereumAddress.fromHex(walletAddress); 730 | EthereumAddress contract = EthereumAddress.fromHex(contractAddress); 731 | Uint8List callContractData; 732 | String encodedCallContractData; 733 | String nonce = await getNonceForRelay(); 734 | DeployedContract TransferManagerContract = 735 | await _contract('TransferManager', _transferManagerContractAddress); 736 | if (ethAmount != null) { 737 | Decimal ethAmountDecimal = Decimal.parse(ethAmount.toString()); 738 | Decimal decimals = Decimal.parse(pow(10, 18).toString()); 739 | BigInt amount = BigInt.parse((ethAmountDecimal * decimals).toString()); 740 | callContractData = 741 | TransferManagerContract.function('callContract').encodeCall([ 742 | wallet, 743 | contract, 744 | amount, 745 | HEX.decode(data), 746 | ]); 747 | encodedCallContractData = '0x' + HEX.encode(callContractData); 748 | } else { 749 | callContractData = 750 | TransferManagerContract.function('callContract').encodeCall([ 751 | wallet, 752 | contract, 753 | amountInWei, 754 | HEX.decode(data), 755 | ]); 756 | encodedCallContractData = '0x' + HEX.encode(callContractData); 757 | } 758 | 759 | String signature = await signOffChain( 760 | _transferManagerContractAddress, 761 | walletAddress, 762 | BigInt.from(0), 763 | encodedCallContractData, 764 | nonce, 765 | BigInt.from(0), 766 | BigInt.from(_defaultGasLimit), 767 | ); 768 | 769 | return { 770 | "walletAddress": walletAddress, 771 | "methodData": encodedCallContractData, 772 | "communityAddress": _defaultCommunityContractAddress, 773 | "nonce": nonce, 774 | "network": network, 775 | "methodName": "callContract", 776 | "gasPrice": 0, 777 | "gasLimit": _defaultGasLimit, 778 | "signature": signature, 779 | "walletModule": "TransferManager", 780 | "transactionBody": transactionBody, 781 | "txMetadata": txMetadata, 782 | }; 783 | } 784 | 785 | Future> approveTokenAndCallContractOffChain( 786 | String walletAddress, 787 | String tokenAddress, 788 | String contractAddress, 789 | String data, { 790 | String? network = "fuse", 791 | num? tokensAmount, 792 | BigInt? amountInWei, 793 | Map? transactionBody, 794 | Map? txMetadata, 795 | }) async { 796 | EthereumAddress wallet = EthereumAddress.fromHex(walletAddress); 797 | EthereumAddress token = EthereumAddress.fromHex(tokenAddress); 798 | EthereumAddress contract = EthereumAddress.fromHex(contractAddress); 799 | String encodedApproveTokenAndCallContractData; 800 | String nonce = await getNonceForRelay(); 801 | DeployedContract TransferManagerContract = 802 | await _contract('TransferManager', _transferManagerContractAddress); 803 | if (tokensAmount != null) { 804 | dynamic tokenDetails = await getTokenDetails(tokenAddress); 805 | int tokenDecimals = int.parse(tokenDetails["decimals"].toString()); 806 | Decimal tokensAmountDecimal = Decimal.parse(tokensAmount.toString()); 807 | Decimal decimals = Decimal.parse(pow(10, tokenDecimals).toString()); 808 | BigInt amount = BigInt.parse((tokensAmountDecimal * decimals).toString()); 809 | Uint8List approveTokenAndCallContractData = 810 | TransferManagerContract.function('approveTokenAndCallContract') 811 | .encodeCall([ 812 | wallet, 813 | token, 814 | contract, 815 | amount, 816 | HEX.decode(data), 817 | ]); 818 | encodedApproveTokenAndCallContractData = 819 | '0x' + HEX.encode(approveTokenAndCallContractData); 820 | } else { 821 | Uint8List approveTokenAndCallContractData = 822 | TransferManagerContract.function('approveTokenAndCallContract') 823 | .encodeCall([ 824 | wallet, 825 | token, 826 | contract, 827 | amountInWei, 828 | HEX.decode(data), 829 | ]); 830 | encodedApproveTokenAndCallContractData = 831 | '0x' + HEX.encode(approveTokenAndCallContractData); 832 | } 833 | 834 | String signature = await signOffChain( 835 | _transferManagerContractAddress, 836 | walletAddress, 837 | BigInt.from(0), 838 | encodedApproveTokenAndCallContractData, 839 | nonce, 840 | BigInt.from(0), 841 | BigInt.from(_defaultGasLimit), 842 | ); 843 | 844 | return { 845 | "walletAddress": walletAddress, 846 | "methodData": encodedApproveTokenAndCallContractData, 847 | "communityAddress": _defaultCommunityContractAddress, 848 | "nonce": nonce, 849 | "network": network, 850 | "methodName": "approveTokenAndCallContract", 851 | "gasPrice": 0, 852 | "gasLimit": _defaultGasLimit, 853 | "signature": signature, 854 | "walletModule": "TransferManager", 855 | 'transactionBody': transactionBody, 856 | "txMetadata": txMetadata, 857 | }; 858 | } 859 | 860 | Future getEncodedDataForContractCall( 861 | String contractName, 862 | String contractAddress, 863 | String methodName, 864 | List params, 865 | ) async { 866 | DeployedContract contract = await _contract(contractName, contractAddress); 867 | Uint8List data = contract.function(methodName).encodeCall(params); 868 | String encodedData = HEX.encode(data); 869 | return encodedData; 870 | } 871 | 872 | Future> transferTokenToHome( 873 | String walletAddress, 874 | String foreignBridgeMediator, 875 | String tokenAddress, 876 | num tokensAmount, 877 | int tokenDecimals, { 878 | String network = 'mainnet', 879 | }) async { 880 | EthereumAddress token = EthereumAddress.fromHex(tokenAddress); 881 | Decimal tokensAmountDecimal = Decimal.parse(tokensAmount.toString()); 882 | Decimal decimals = Decimal.parse(pow(10, tokenDecimals).toString()); 883 | BigInt amount = BigInt.parse((tokensAmountDecimal * decimals).toString()); 884 | Map approveTokenData = await approveTokenOffChain( 885 | walletAddress, 886 | tokenAddress, 887 | tokensAmount: tokensAmount, 888 | network: network, 889 | spenderContract: foreignBridgeMediator, 890 | ); 891 | String data = await getEncodedDataForContractCall( 892 | 'HomeMultiAMBErc20ToErc677', 893 | foreignBridgeMediator, 894 | 'relayTokens', 895 | [token, amount], 896 | ); 897 | print('relayTokens data: $data'); 898 | Map transferToHomeData = await callContractOffChain( 899 | walletAddress, 900 | foreignBridgeMediator, 901 | data, 902 | network: network, 903 | ethAmount: 0, 904 | ); 905 | return [approveTokenData, transferToHomeData]; 906 | } 907 | 908 | Future> transferTokenToForeign( 909 | String walletAddress, 910 | String homeBridgeMediatorAddress, 911 | String tokenAddress, 912 | num tokensAmount, 913 | int tokenDecimals, { 914 | String network = 'fuse', 915 | }) async { 916 | Decimal tokensAmountDecimal = Decimal.parse(tokensAmount.toString()); 917 | Decimal decimals = Decimal.parse(pow(10, tokenDecimals).toString()); 918 | BigInt amount = BigInt.parse((tokensAmountDecimal * decimals).toString()); 919 | EthereumAddress bridgeMediatorAddress = EthereumAddress.fromHex( 920 | homeBridgeMediatorAddress, 921 | ); 922 | Map approveTokenData = await approveTokenOffChain( 923 | walletAddress, 924 | tokenAddress, 925 | tokensAmount: tokensAmount, 926 | network: network, 927 | spenderContract: homeBridgeMediatorAddress, 928 | ); 929 | String data = await getEncodedDataForContractCall( 930 | 'BasicToken', tokenAddress, 'transferAndCall', [ 931 | bridgeMediatorAddress, 932 | amount, 933 | HEX.decode(''), 934 | ]); 935 | print('transferAndCall data: $data'); 936 | Map transferToHomeData = await callContractOffChain( 937 | walletAddress, 938 | homeBridgeMediatorAddress, 939 | data, 940 | network: network, 941 | ethAmount: 0, 942 | ); 943 | return [approveTokenData, transferToHomeData]; 944 | } 945 | 946 | Future tokenOfOwnerByIndex( 947 | String contractAddress, 948 | String owner, 949 | int index, 950 | ) async { 951 | return (await _readFromContract( 952 | 'ERC721', 953 | contractAddress, 954 | 'tokenOfOwnerByIndex', 955 | [ 956 | owner, 957 | index, 958 | ], 959 | )) 960 | .first; 961 | } 962 | 963 | Future balanceOfERC721( 964 | String contractAddress, 965 | String owner, 966 | ) async { 967 | return (await _readFromContract( 968 | 'ERC721', 969 | contractAddress, 970 | 'balanceOf', 971 | [owner], 972 | )) 973 | .first; 974 | } 975 | 976 | Future tokenURI( 977 | String contractAddress, 978 | int index, 979 | ) async { 980 | return (await _readFromContract( 981 | 'ERC721', 982 | contractAddress, 983 | 'tokenURI', 984 | [index], 985 | )) 986 | .first; 987 | } 988 | } 989 | -------------------------------------------------------------------------------- /lib/utils/crypto.dart: -------------------------------------------------------------------------------- 1 | String hexZeroPad(String value, num length) { 2 | while (value.length < 2 * length + 2) { 3 | value = '0x0' + value.substring(2); 4 | } 5 | return value; 6 | } 7 | 8 | String hexlify(BigInt dec) { 9 | return '0x0' + dec.toRadixString(16); 10 | } 11 | -------------------------------------------------------------------------------- /lib/wallet_core.dart: -------------------------------------------------------------------------------- 1 | library wallet_core; 2 | 3 | export 'package:web3dart/web3dart.dart'; 4 | 5 | export 'src/graph.dart'; 6 | export 'src/web3.dart'; 7 | export 'src/studio_api.dart'; 8 | export 'src/wallet_api.dart'; 9 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: wallet_core 2 | version: 0.4.1 3 | homepage: https://github.com/fuseio/wallet_core 4 | description: Fuse wallet core Dart library to interact with Ethereum based networks and APIs. 5 | environment: 6 | sdk: ">=2.15.0 <3.0.0" 7 | dependencies: 8 | path: ^1.8.0 9 | gql: ^0.13.1 10 | bip32: ^2.0.0 11 | bip39: ^1.0.6 12 | hex: ^0.2.0 13 | http: ^0.13.3 14 | web3dart: ^2.3.5 15 | graphql: ^5.1.1 16 | decimal: ^2.1.0 17 | dio: ^4.0.6 --------------------------------------------------------------------------------