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 }