github.com/status-im/status-go@v1.1.0/contracts/contracts.go (about)

     1  package contracts
     2  
     3  import (
     4  	"errors"
     5  
     6  	"github.com/ethereum/go-ethereum/common"
     7  	"github.com/status-im/status-go/contracts/balancechecker"
     8  	"github.com/status-im/status-go/contracts/directory"
     9  	"github.com/status-im/status-go/contracts/ethscan"
    10  	"github.com/status-im/status-go/contracts/ierc20"
    11  	"github.com/status-im/status-go/contracts/registrar"
    12  	"github.com/status-im/status-go/contracts/resolver"
    13  	"github.com/status-im/status-go/contracts/snt"
    14  	"github.com/status-im/status-go/contracts/stickers"
    15  	"github.com/status-im/status-go/rpc"
    16  )
    17  
    18  type ContractMakerIface interface {
    19  	NewEthScan(chainID uint64) (ethscan.BalanceScannerIface, uint, error)
    20  	NewERC20(chainID uint64, contractAddr common.Address) (ierc20.IERC20Iface, error)
    21  	NewERC20Caller(chainID uint64, contractAddr common.Address) (ierc20.IERC20CallerIface, error)
    22  	// TODO extend with other contracts
    23  }
    24  
    25  type ContractMaker struct {
    26  	RPCClient rpc.ClientInterface
    27  }
    28  
    29  func NewContractMaker(client rpc.ClientInterface) (*ContractMaker, error) {
    30  	if client == nil {
    31  		return nil, errors.New("could not initialize ContractMaker with an rpc client")
    32  	}
    33  	return &ContractMaker{RPCClient: client}, nil
    34  }
    35  
    36  func (c *ContractMaker) NewRegistryWithAddress(chainID uint64, address common.Address) (*resolver.ENSRegistryWithFallback, error) {
    37  	backend, err := c.RPCClient.EthClient(chainID)
    38  	if err != nil {
    39  		return nil, err
    40  	}
    41  
    42  	return resolver.NewENSRegistryWithFallback(
    43  		address,
    44  		backend,
    45  	)
    46  }
    47  
    48  func (c *ContractMaker) NewRegistry(chainID uint64) (*resolver.ENSRegistryWithFallback, error) {
    49  	contractAddr, err := resolver.ContractAddress(chainID)
    50  	if err != nil {
    51  		return nil, err
    52  	}
    53  	return c.NewRegistryWithAddress(chainID, contractAddr)
    54  }
    55  
    56  func (c *ContractMaker) NewPublicResolver(chainID uint64, resolverAddress *common.Address) (*resolver.PublicResolver, error) {
    57  	backend, err := c.RPCClient.EthClient(chainID)
    58  	if err != nil {
    59  		return nil, err
    60  	}
    61  
    62  	return resolver.NewPublicResolver(*resolverAddress, backend)
    63  }
    64  
    65  func (c *ContractMaker) NewUsernameRegistrar(chainID uint64, contractAddr common.Address) (*registrar.UsernameRegistrar, error) {
    66  	backend, err := c.RPCClient.EthClient(chainID)
    67  	if err != nil {
    68  		return nil, err
    69  	}
    70  
    71  	return registrar.NewUsernameRegistrar(
    72  		contractAddr,
    73  		backend,
    74  	)
    75  }
    76  
    77  func (c *ContractMaker) NewERC20(chainID uint64, contractAddr common.Address) (ierc20.IERC20Iface, error) {
    78  	backend, err := c.RPCClient.EthClient(chainID)
    79  	if err != nil {
    80  		return nil, err
    81  	}
    82  
    83  	return ierc20.NewIERC20(
    84  		contractAddr,
    85  		backend,
    86  	)
    87  }
    88  func (c *ContractMaker) NewERC20Caller(chainID uint64, contractAddr common.Address) (ierc20.IERC20CallerIface, error) {
    89  	backend, err := c.RPCClient.EthClient(chainID)
    90  	if err != nil {
    91  		return nil, err
    92  	}
    93  
    94  	return ierc20.NewIERC20Caller(contractAddr, backend)
    95  }
    96  
    97  func (c *ContractMaker) NewSNT(chainID uint64) (*snt.SNT, error) {
    98  	contractAddr, err := snt.ContractAddress(chainID)
    99  	if err != nil {
   100  		return nil, err
   101  	}
   102  
   103  	backend, err := c.RPCClient.EthClient(chainID)
   104  	if err != nil {
   105  		return nil, err
   106  	}
   107  
   108  	return snt.NewSNT(contractAddr, backend)
   109  }
   110  
   111  func (c *ContractMaker) NewStickerType(chainID uint64) (*stickers.StickerType, error) {
   112  	contractAddr, err := stickers.StickerTypeContractAddress(chainID)
   113  	if err != nil {
   114  		return nil, err
   115  	}
   116  
   117  	backend, err := c.RPCClient.EthClient(chainID)
   118  	if err != nil {
   119  		return nil, err
   120  	}
   121  
   122  	return stickers.NewStickerType(
   123  		contractAddr,
   124  		backend,
   125  	)
   126  }
   127  
   128  func (c *ContractMaker) NewStickerMarket(chainID uint64) (*stickers.StickerMarket, error) {
   129  	contractAddr, err := stickers.StickerMarketContractAddress(chainID)
   130  	if err != nil {
   131  		return nil, err
   132  	}
   133  
   134  	backend, err := c.RPCClient.EthClient(chainID)
   135  	if err != nil {
   136  		return nil, err
   137  	}
   138  
   139  	return stickers.NewStickerMarket(
   140  		contractAddr,
   141  		backend,
   142  	)
   143  }
   144  
   145  func (c *ContractMaker) NewStickerPack(chainID uint64) (*stickers.StickerPack, error) {
   146  	contractAddr, err := stickers.StickerPackContractAddress(chainID)
   147  	if err != nil {
   148  		return nil, err
   149  	}
   150  
   151  	backend, err := c.RPCClient.EthClient(chainID)
   152  	if err != nil {
   153  		return nil, err
   154  	}
   155  
   156  	return stickers.NewStickerPack(
   157  		contractAddr,
   158  		backend,
   159  	)
   160  }
   161  
   162  func (c *ContractMaker) NewDirectory(chainID uint64) (*directory.Directory, error) {
   163  	contractAddr, err := directory.ContractAddress(chainID)
   164  	if err != nil {
   165  		return nil, err
   166  	}
   167  
   168  	backend, err := c.RPCClient.EthClient(chainID)
   169  	if err != nil {
   170  		return nil, err
   171  	}
   172  
   173  	return directory.NewDirectory(
   174  		contractAddr,
   175  		backend,
   176  	)
   177  }
   178  
   179  func (c *ContractMaker) NewEthScan(chainID uint64) (ethscan.BalanceScannerIface, uint, error) {
   180  	contractAddr, err := ethscan.ContractAddress(chainID)
   181  	if err != nil {
   182  		return nil, 0, err
   183  	}
   184  
   185  	contractCreatedAt, err := ethscan.ContractCreatedAt(chainID)
   186  	if err != nil {
   187  		return nil, 0, err
   188  	}
   189  
   190  	backend, err := c.RPCClient.EthClient(chainID)
   191  	if err != nil {
   192  		return nil, 0, err
   193  	}
   194  
   195  	scanner, err := ethscan.NewBalanceScanner(
   196  		contractAddr,
   197  		backend,
   198  	)
   199  
   200  	return scanner, contractCreatedAt, err
   201  }
   202  
   203  func (c *ContractMaker) NewBalanceChecker(chainID uint64) (*balancechecker.BalanceChecker, error) {
   204  	contractAddr, err := balancechecker.ContractAddress(chainID)
   205  	if err != nil {
   206  		return nil, err
   207  	}
   208  
   209  	backend, err := c.RPCClient.EthClient(chainID)
   210  	if err != nil {
   211  		return nil, err
   212  	}
   213  	return balancechecker.NewBalanceChecker(
   214  		contractAddr,
   215  		backend,
   216  	)
   217  }