-
Notifications
You must be signed in to change notification settings - Fork 62
/
address_mapper_client.go
76 lines (59 loc) · 2.21 KB
/
address_mapper_client.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package client
import (
"crypto/ecdsa"
loom "github.com/loomnetwork/go-loom"
"github.com/loomnetwork/go-loom/auth"
"github.com/loomnetwork/go-loom/client"
ethcommon "github.com/ethereum/go-ethereum/common"
amtypes "github.com/loomnetwork/go-loom/builtin/types/address_mapper"
ssha "github.com/miguelmota/go-solidity-sha3"
"github.com/loomnetwork/go-loom/common/evmcompat"
)
const (
AddressMapperContractName = "addressmapper"
)
type AddressMapperClient struct {
contract *client.Contract
}
func (a *AddressMapperClient) HasMapping(from, caller loom.Address) (*amtypes.AddressMapperHasMappingResponse, error) {
addressMapperResponse := amtypes.AddressMapperHasMappingResponse{}
_, err := a.contract.StaticCall("HasMapping", &amtypes.AddressMapperHasMappingRequest{
From: from.MarshalPB(),
}, caller, &addressMapperResponse)
if err != nil {
return nil, err
}
return &addressMapperResponse, nil
}
func (a *AddressMapperClient) AddIdentityMapping(from, to loom.Address, dappchainTxSigner auth.Signer, ethKey *ecdsa.PrivateKey) error {
addressMappingSig, err := a.generateAddressMappingSignature(from, to, ethKey)
if err != nil {
return err
}
_, err = a.contract.Call("AddIdentityMapping", &amtypes.AddressMapperAddIdentityMappingRequest{
From: from.MarshalPB(),
To: to.MarshalPB(),
Signature: addressMappingSig,
}, dappchainTxSigner, nil)
return err
}
func (a *AddressMapperClient) generateAddressMappingSignature(from, to loom.Address, key *ecdsa.PrivateKey) ([]byte, error) {
hash := ssha.SoliditySHA3(
ssha.Address(ethcommon.BytesToAddress(from.Local)),
ssha.Address(ethcommon.BytesToAddress(to.Local)),
)
sig, err := evmcompat.SoliditySign(hash, key)
if err != nil {
return nil, err
}
// Prefix the sig with a single byte indicating the sig type, in this case EIP712
return append(make([]byte, 1, 66), sig...), nil
}
func NewAddressMapperClient(chainID, writeUri, readUri string) (*AddressMapperClient, error) {
rpcClient := client.NewDAppChainRPCClient(chainID, writeUri, readUri)
contractAddr, err := rpcClient.Resolve(AddressMapperContractName)
if err != nil {
return nil, err
}
return &AddressMapperClient{contract: client.NewContract(rpcClient, contractAddr.Local)}, nil
}