Giter Site home page Giter Site logo

rstormsf / multisender Goto Github PK

View Code? Open in Web Editor NEW
478.0 15.0 339.0 8.6 MB

Token Multisender Dapp smart contract. Airdrop tokens. Batch sending ERC20, ETH, Ethereum tokens. Send thousands of transfers in a few transactions. It can help user to save more tx fee and time than sending one by one

Home Page: https://multisender.app

License: GNU General Public License v3.0

HTML 2.90% JavaScript 76.50% CSS 20.60%
ethereum erc20 solidity batch dapp metamask transfers transaction multisender bulksender

multisender's Introduction

Demo

Problem:

Previously in Ethereum Network, additional tools were required in order to transfer many ERC20 tokens at once. Many people still do this manually, one transaction at a time. This process is time consuming and prone to an error.

Solution:

This Dapp allows a user to send thousands of token transfers in a very effecient way by batching them in groups of 145 token transfers per Ethereum transaction. This automation saves time by automatically generating transactions to MetaMask. Finally, this tool allows a user to maintain security of their account by delegating the trust of their private keys to a secure MetaMask wallet.

How to use:

  1. Install Metamask.
  2. Make sure you have an account in MetaMask which has a token balance.
  3. Make sure your MetaMask is pointed to the network that you would like to use.
  4. Make sure your MetaMask account is unlocked.
  5. Go to https://rstormsf.github.io/multisender/#/
  6. Wait for the full page to load.
  7. Select a token from the dropdown that you would like to send.
  8. Provide either JSON or CSV text in the textarea (see example below).
  9. Click next.
  10. If everything looks good, click next once again.
  11. Wait for MetaMask to generate an approval transaction.
  12. Once the approval transaction is mined, MetaMask will generate as many transactions as needed for your token transfers (145 addresses per tx).
  13. Done!

You can test this tool on any test network, if you want to make sure that everything will work as expected.

Contracts deployed:
Mainnet, Rinkeby, Kovan, Ropsten, Sokol, CORE-POA:
ProxyStorage: 0xa5025faba6e70b84f74e9b1113e5f7f4e7f4859f

Example JSON:

[
  {"0xCBA5018De6b2b6F89d84A1F5A68953f07554765e":"12"},
  {"0xa6Bf70bd230867c870eF13631D7EFf1AE8Ab85c9":"1123.45645"},
  {"0x00b5F428905DEA1a67940093fFeaCeee58cA91Ae":"1.049"},
  {"0x00fC79F38bAf0dE21E1fee5AC4648Bc885c1d774":"14546"}
]

Example CSV:

0xCBA5018De6b2b6F89d84A1F5A68953f07554765e,12
0xa6Bf70bd230867c870eF13631D7EFf1AE8Ab85c9,1123.45645
0x00b5F428905DEA1a67940093fFeaCeee58cA91Ae,1.049
0x00fC79F38bAf0dE21E1fee5AC4648Bc885c1d774,14546
Proof of work:
https://etherscan.io/tx/0x2fd09c03609f3f34a326983f1c685ea1bcb87dfcaabc12932dbe38d2c453f2c8
https://kovan.etherscan.io/tx/0x755b84a8a61fd82c1410f6bbbb452c94ddf12fac5b1daaa1496671bcd6e21882

How to setup dev environment

  1. git clone [email protected]:rstormsf/multisender.git
  2. cd contracts
  3. I used node -v v9.7.1
  4. npm install
  5. deploy MultiSender contract OR use existing deployed version: 0xa5025faba6e70b84f74e9b1113e5f7f4e7f4859f currenty deployed on Kovan, Rinkeby, Ropsten, POA-network, POA-Sokol, Mainnet Instructions on how to deploy it is listed below.
  6. cd ..
  7. npm install
  8. cp .env.example .env
  9. open .env file and provide an address of multisender contract
  10. npm run start

Contract Deployment

There are 2 ways to deploy the contracts: Upgradable and non-upgradable way. Non-upgrdable:

  • cd contracts
  • npm run flatten
  • take flats/UpgradebleStormSender_flat.sol and deploy it using https://remix.ethereum.org/
    • select solidity 0.4.23 version in settings
  • once deployed, call initialize function with parameter address of owner's contract

Disclaimer

This tool is not affiliated with https://poa.network This is a personal project of Roman Storm.

He is not responsible for any loss from transactions derived by MultiSender. Some of the underlying JavaScript libraries and Ethereum tools that were used are under active development. The website and smart contract has been thoroughly tested, there is always the possibility something unexpected happens resulting in losses of Ethereum and/or tokens.

Any ERC20 tokens you transfer to the Multisender will be sent out to the addresses that you provided.

The smart contract source code can be audited by anyone in this repository.

I encourage you to assess its security before using the Mutlisender Dapp.

multisender's People

Contributors

idobrovolskyi avatar rstormsf avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

multisender's Issues

Proper structure

  1. Integrate travis-ci or circleci
  2. Write unit test and end-to-end test
  3. Integrate netlify for predeployment's PR previews

How to setup project in local environment

Hello Sir, it is an interesting project, could you kindly add a installation guide when you have free time? Thanks.
I tried to setup this project in my laptop but failed at the compiling the contracts.
Node: v8.11.3
Npm: 5.6.0
Truffle v4.1.13 (core: 4.1.13)
Solidity v0.4.24 (solc-js)

error log:
contracts/contracts/DeprecatedStormSender.sol:3:1: SyntaxError: Source file requires different compiler version (current compiler is 0.4.24+commit.e67f0147.Emscripten.clang - note that nightly builds are considered to be strictly less than the released version
pragma solidity 0.4.23;
^---------------------^

write e2e script

Problem: We need to make sure each PR satisfies our requirements to send tx via metamask from Home to Foreign and from Foreign to Home
Solution: Write end to end test script

Module parse failed: Unexpected token (225:12)

npm run start

./node_modules/web3-eth-accounts/lib/index.js
Module parse failed: Unexpected token (225:12)
You may need an appropriate loader to handle this file type.
| }
| return signed({
| ...tx,
| chainId: args[0],
| nonce: args[1],

Add localStorage support

Problem:
When navigating thru routes, multisender will still run a job that was asked previously such as recursive functions or setTimeout.

Solution:
If a route was changed from
/#/4 to /#/1
it should cancel out all processes and start everything again by cleaning up all data in it.

However if navigating from #/1 to #/3 - it should keep the state by storing it in localStorage, not JS mobx state.

RPC error

RPC error in https://rstormsf.github.io/multisender/#/4

MultiSender approval status is mined and then not working token transfer with under error massage

Kovan Network => MetaMask - RPC Error: Error: Transaction execution error.
Ropsten Network => MetaMask - RPC Error: Error: gas required exceeds allowance or always failing transaction

Thanks.

error

./node_modules/web3/packages/web3-utils/src/utils.js
Module not found: Can't resolve 'eth-lib/src/hash' in '/root/multisender/node_modules/web3/packages/web3-utils/src'

integrate netlify

Problem: hard to review changes from PRs
Solution: Use netlify for each PR deployment

BigNumber Error js

Hello,

When submitting information on the "Next >" button, this error appears on my console :

bignumber.js:1309 Uncaught Error: [BigNumber Error] Not a number: undefined at bignumber.js:1309 at new e (bignumber.js:220) at tokenStore.js:166 at Array.forEach (<anonymous>) at e.<anonymous> (mobx.module.js:693) at t.value (tokenStore.js:159) at k (mobx.module.js:911) at t.n (mobx.module.js:902) at e.value (1.js:149) at Object.u (react-dom.production.min.js:26) at Object.invokeGuardedCallback (react-dom.production.min.js:25) at Object.invokeGuardedCallbackAndCatchFirstError (react-dom.production.min.js:25) at d (react-dom.production.min.js:30) at b (react-dom.production.min.js:32) at g (react-dom.production.min.js:32) at Array.forEach (<anonymous>) at v (react-dom.production.min.js:31) at E (react-dom.production.min.js:34) at Hr (react-dom.production.min.js:93) at Ct (react-dom.production.min.js:70) at batchedUpdates (react-dom.production.min.js:171) at Q (react-dom.production.min.js:54)

Parameters :
Metamask - Ropsten
Contract address : 0x9e55a0396d360fe7ee53268f8de0e29e6e49d1c2 (ERC20) Ropsten
Decimals : 10
Addresses :
[
{"0xCBA5018De6b2b6F89d84A1F5A68953f07554765e":"12"},
{"0xa6Bf70bd230867c870eF13631D7EFf1AE8Ab85c9":"1123.45645"},
{"0x00b5F428905DEA1a67940093fFeaCeee58cA91Ae":"1.049"},
{"0x00fC79F38bAf0dE21E1fee5AC4648Bc885c1d774":"14546"}
]

Best regards,
Joseph

Airdrop not going through

Hi! First, thank you for this amazing software!

I tried to send Rinkeby ETH to 30 addresses and got this message: "Please wait...until you sign 1 transactions in Metamask" but nothing happened on my MetaMask.

On the console this is the error that shows:

Error: Wrong response id "1237062073" (expected: "5") in {"jsonrpc":"2.0","id":5,"method":"eth_estimateGas","params":[{"from":"0x37d4a3fd83cc3e2df7386a3b1107ea0bc21558fb","data":"0x83cdcb76000000000000000000000000000000000000000000000000000000000000beef00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000283edea298a20000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000004dbab93802ffd7bcfcf1f01d57f04b0a5cebaa67000000000000000000000000640454f80916dae40b3ff7f135dc9a866cb7c0820000000000000000000000003a9c98e889d5ff24e721b11f1e00fe3cf4b732a9000000000000000000000000f9f8587544471dcf00a48b0d4231ce7ca9b0348700000000000000000000000059b139c7e32c983d7001fb7d55f19f0113287d14000000000000000000000000e20b564bf87d70e95c206d80e48edf5c7426f58f000000000000000000000000b8ec496240e95ab5d44768512f80774980b0238c000000000000000000000000cf60e7e885148718bc952eb4e2fb0e7e0dc4299c000000000000000000000000c0d896c133b81abb6b489a5667c84680f32554d00000000000000000000000001f33db14642e9541ed304f6263760e636ffbb98200000000000000000000000075c865f21138e3d4ab7f913b1977a6dd401f4059000000000000000000000000e2d6aff297b41881c1aea9599f68aedfab38c651000000000000000000000000198d5ad5bece0be2761e645aeef0a5dedb62a280000000000000000000000000ab1129ad844cf2d039d8d1c82c42086953ac6abd0000000000000000000000000f8acf11c3d719b294c0f237f40f8135ac2c55de000000000000000000000000cabd8a54362885f258868f15212a9751c8feb3390000000000000000000000003452af6edf48a82f2f3a262c38ea4e1eed0adfa0000000000000000000000000c6809da4ed644c12ca770e7136d995fe86754f3a000000000000000000000000ef31ba71cb9ea76c58ffdf404ce40d2c76816b22000000000000000000000000af9eae31e6e20ebe85ef73aa8a499efcda811b4a000000000000000000000000e64b48bf7137f61f1d8dbf9011ec87f9b8f030d4000000000000000000000000e85757ae1400ea3b9cf6a7e6b62aff6d2a386d590000000000000000000000001027117ab2084b81729a007500d2f7eb195c05790000000000000000000000005b52abdfb53491944d129d8afd89195cb81d96b5000000000000000000000000ff4cda42f9b14170fd29137f27381aff7bdfb558000000000000000000000000b23325cf594ecd42a2e2d8a7584c59e77f01cf4f000000000000000000000000836ad1f0dee73ba8c2fc24bd0c794dba0915c0dd000000000000000000000000b0c21561fe46a64eac4c24a4eb6d32b1707aa383000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000002c68af0bb140000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000","value":"0x28f06f2e2a81c000","to":"0xa5025faba6e70b84f74e9b1113e5f7f4e7f4859f"}]}
    at index.js:133
    at inpage.js:1
    at inpage.js:1
    at i (inpage.js:1)
    at inpage.js:1
    at inpage.js:1
    at n (inpage.js:1)
    at i (inpage.js:1)
    at inpage.js:1
    at inpage.js:1
(anonymous) @ txStore.js:149

-> Any ideas of what can I do?

out of gas error when sending erc1155 batch tx

Hello,

I've tried to use the contract to do an erc1155 airdrop, but have encounter a problem.
We used this contract before and it was working fine so I assume this is link to the Berlin update

Opcode: [DELEGATECALL]
Error Message: out of gas
image

  1. Is this a know issue?
  2. Do you plan to fix this?
  3. If yes, when?
  4. If no, do you know any other solution I could use?

Thanks a lot!

gas required exceeds allowance

I follow the instruction .

  1. deply the contract flats/UpgradebleStormSender_flat.sol
  2. invoke initialize method
  3. approve to contract

then I invoke multisendEther or multisendToken method and get the error as title describe.
Please give me some help :)

Second tx does not appear after approve tx is confirmed

I am testing Multisender on Rinkeby.

I have created a multisend with 3 recipients, transferring 1 DAI to each.

I am using Frame + Aragon Agent (a smart contract account).

I have passed a proposal in my Aragon organization to confirm the approval tx:

multisender3

However the Multisender dapp does not ever send the second tx needed to complete the transfer, and it gives me an error message suggesting I contact support:

multisender2

Any idea what might be going wrong here?

Not a number: 2,647,733.007

if metamask native eth balance is big like: 2,647,733.007 eth, it doesn't work when user navigates to second screen.

Sending multiple ERC721 tokens to an address.

  1. We should either be allowed to enter multiple addresses to send
  2. or multiple token IDs separated with commas.

I want to send 65 NFTs to the same address. 103 to another, 1 to another, 30 to another. I want to send the NFTs randomly from my address, but I can make a CSV myself, that is easy. I can just pick out Token IDs randomly.

But the main issue is stated above. I should be able to send more than one NFTs to the same address.

This is on Avalanche Network C-Chain by the way.

TypeError: window.Web3 is not a constructor

Getting this error after npm run start in the last step. I can see the MultiSender screen for one second then I get the error. I have used nvm to use the same version of Node.js during installation as the author.

(anonymous function)
`http://localhost:3000/static/js/bundle.js:151509:16
151506 | // Checking if Web3 has been injected by the browser (Mist/MetaMask)
151507 | if (typeof web3 !== 'undefined') {
151508 | // Use Mist/MetaMask's provider.

151509 | web3 = new window.Web3(web3.currentProvider);
| ^ 151510 | web3.version.getNetwork(function (err, netId) {
151511 | var netIdName = void 0,
151512 | trustApiName = void 0,```

Terminal Output:

  Line 41:  Anchors must have content and the content must be accessible by a screen reader   jsx-a11y/anchor-has-content
  Line 41:  Links must not point to "#". Use a more descriptive href or use a button instead  jsx-a11y/href-no-hash
  Line 48:  Anchors must have content and the content must be accessible by a screen reader   jsx-a11y/anchor-has-content
  Line 48:  Links must not point to "#". Use a more descriptive href or use a button instead  jsx-a11y/href-no-hash

./src/stores/txStore.js
  Line 1:    'computed' is defined but never used               no-unused-vars
  Line 1:    'autorun' is defined but never used                no-unused-vars
  Line 5:    'Web3' is defined but never used                   no-unused-vars
  Line 6:    'observer' is defined but never used               no-unused-vars
  Line 86:   'totalBalance' is assigned a value but never used  no-unused-vars
  Line 117:  'tx' is assigned a value but never used            no-unused-vars

./src/App.js
  Line 1:  'Component' is defined but never used  no-unused-vars
  Line 2:  'Retry' is defined but never used      no-unused-vars
  Line 2:  'Welcome' is defined but never used    no-unused-vars

./src/getWeb3.js
  Line 1:  'Web3' is defined but never used  no-unused-vars

./src/components/Header.js
  Line 2:   'Link' is defined but never used                                                                                              no-unused-vars
  Line 14:  Anchors must have content and the content must be accessible by a screen reader                                               jsx-a11y/anchor-has-content
  Line 14:  Links must not point to "#". Use a more descriptive href or use a button instead                                              jsx-a11y/href-no-hash
  Line 27:  Anchors must have content and the content must be accessible by a screen reader                                               jsx-a11y/anchor-has-content
  Line 27:  Using target="_blank" without rel="noopener noreferrer" is a security risk: see https://mathiasbynens.github.io/rel-noopener  react/jsx-no-target-blank

./src/components/1.js
  Line 6:   'form' is defined but never used                                                                                              no-unused-vars
  Line 6:   'button' is defined but never used                                                                                            no-unused-vars
  Line 32:  'isAddress' is assigned a value but never used                                                                                no-unused-vars
  Line 37:  Using target="_blank" without rel="noopener noreferrer" is a security risk: see https://mathiasbynens.github.io/rel-noopener  react/jsx-no-target-blank
  Line 39:  'isJson' is assigned a value but never used                                                                                   no-unused-vars

./src/stores/tokenStore.js
  Line 7:  'add' is defined but never used  no-unused-vars

Search for the keywords to learn more about each warning.
To ignore, add // eslint-disable-next-line to the line before.
`

features

  • tx builder for those who can't build CSV/JSON
  • add support for MAX value in CSV or JSON so that would indicate to send remainer of token balance
  • Statistics

ETH转账问题请教

你好。打扰了,我有个问题想请教一下。我现在有一个以太坊私钥,很多年前的。导入okex钱包后可以看到里边的余额,但无法交易,咨询了客服,告知我我这个是ETH分叉之前的老地址,不支持地址重放保护机制,所以无法转账,建议我找一个没有这种保护机制的小钱包尝试一下。请问对这些有了解么,可以付费解决,打扰您了,谢谢

KCC

Can you guys make it run over the KCC (kucoin community chain).
Thanks guys

Add repeat tx hash

if for some reason tx failed, as a user, I should be able to insert a tx hash and repeat it again.

How to do it?

  1. Validate tx hash
  2. Check status, if it was successful, just offer user to execute it
  3. if status was 0x1 which means failed, try to see if
  • it was out of gas by checking if gasLimit == gasUsed in that txHash. If so, increase gasLimit and offer to resubmit
  • if it was multisend ether, maybe the reason was not enough eth balance at the time of execution.

There is pending PR #2 which hasn't been tested fully and maybe it could be reused.

Transfer transaction may fail when chain reorgantzaion happens

In usual cases, there are two transaction we need to send to use multisender.
The first one is to approve tokens for multisender contract and the second one is to actually do the transfer.

However, cases can happen where chain organization happens when approve transaction is reverted, but multisender has already make user send the second transfer transaction at this time, which will definitely fail because tokens are not approved.

This will cause users to lose transaction fee for transaction failure.

"NaN ETH" values on VIP tab

There value stated to buy VIP access is "NaN ETH", believe this to be wrong. Link to site is here

Refer to screen capture below
image

On BSC very large gas limit

try to send USDT to 4 address but get error "Insufficient BNB balance on your account Please have at least 0.5 BNB"
Transaction Fee for one simple transfer is 0.0005 BNB

image

Add statistics

Every tx emits an event Multisended
Collect all events, calculate all token balances, write a nice UI that shows how much total token transfers has been transferred using this tool.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.