support passing kdf and node config from receiver when local pairing (#3179)

This commit is contained in:
frank 2023-02-17 21:02:42 +08:00 committed by GitHub
parent b9de89ca38
commit e64091c779
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 405 additions and 298 deletions

View File

@ -1 +1 @@
0.131.9
0.131.10

View File

@ -2435,7 +2435,6 @@ type SyncRawMessage struct {
// we need these to be able to login
SubAccountsJsonBytes []byte `protobuf:"bytes,2,opt,name=subAccountsJsonBytes,proto3" json:"subAccountsJsonBytes,omitempty"`
SettingsJsonBytes []byte `protobuf:"bytes,3,opt,name=settingsJsonBytes,proto3" json:"settingsJsonBytes,omitempty"`
NodeConfigJsonBytes []byte `protobuf:"bytes,4,opt,name=nodeConfigJsonBytes,proto3" json:"nodeConfigJsonBytes,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -2487,13 +2486,6 @@ func (m *SyncRawMessage) GetSettingsJsonBytes() []byte {
return nil
}
func (m *SyncRawMessage) GetNodeConfigJsonBytes() []byte {
if m != nil {
return m.NodeConfigJsonBytes
}
return nil
}
func init() {
proto.RegisterEnum("protobuf.SyncTrustedUser_TrustStatus", SyncTrustedUser_TrustStatus_name, SyncTrustedUser_TrustStatus_value)
proto.RegisterEnum("protobuf.SyncVerificationRequest_VerificationStatus", SyncVerificationRequest_VerificationStatus_name, SyncVerificationRequest_VerificationStatus_value)
@ -2539,154 +2531,153 @@ func init() {
}
var fileDescriptor_d61ab7221f0b5518 = []byte{
// 2378 bytes of a gzipped FileDescriptorProto
// 2361 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x19, 0x4d, 0x73, 0x1b, 0x49,
0x75, 0x47, 0x52, 0x2c, 0xe9, 0x49, 0x96, 0x95, 0xb6, 0x77, 0xa3, 0xd8, 0xde, 0x8a, 0x33, 0xcb,
0xd6, 0x86, 0xaa, 0xc5, 0xbb, 0x95, 0x00, 0x0b, 0x9b, 0x4d, 0xed, 0x2a, 0xb2, 0xd9, 0x38, 0x1f,
0x8e, 0xab, 0x6d, 0x27, 0x40, 0x51, 0x35, 0xd5, 0x9e, 0x69, 0x5b, 0x8d, 0x47, 0x33, 0xc3, 0x74,
0xcb, 0x41, 0xdc, 0xb8, 0xf0, 0x03, 0xb8, 0x70, 0xdd, 0x3b, 0x37, 0xaa, 0x96, 0x13, 0x3f, 0x80,
0x1b, 0x07, 0x2e, 0x54, 0xc1, 0x2f, 0xe0, 0x57, 0x50, 0xfd, 0xba, 0x47, 0x33, 0x23, 0x4b, 0xc6,
0x29, 0x4e, 0x9c, 0x3c, 0xef, 0xf5, 0x7b, 0xaf, 0x5f, 0xbf, 0xef, 0x27, 0xc3, 0x72, 0xc2, 0x44,
0x2a, 0xa2, 0xb3, 0xed, 0x24, 0x8d, 0x55, 0x4c, 0x1a, 0xf8, 0xe7, 0x64, 0x7c, 0xba, 0xbe, 0x2a,
0x27, 0x91, 0xef, 0x49, 0xae, 0x94, 0x88, 0xce, 0xa4, 0x39, 0x5e, 0x77, 0x59, 0x92, 0x84, 0xc2,
0x67, 0x4a, 0xc4, 0x91, 0x37, 0xe2, 0x8a, 0x05, 0x4c, 0x31, 0x6f, 0xc4, 0xa5, 0x64, 0x67, 0xdc,
0xd0, 0xb8, 0x0c, 0x36, 0x7e, 0xc2, 0x95, 0x3f, 0x14, 0xd1, 0xd9, 0x63, 0xe6, 0x9f, 0xf3, 0xe0,
0x38, 0xd9, 0x61, 0x8a, 0xed, 0x70, 0xc5, 0x44, 0x28, 0xc9, 0x1d, 0x68, 0x21, 0x53, 0x34, 0x1e,
0x9d, 0xf0, 0xb4, 0xe7, 0x6c, 0x39, 0xf7, 0x96, 0x29, 0x68, 0xd4, 0x3e, 0x62, 0xc8, 0x5d, 0x68,
0xab, 0x58, 0xb1, 0x30, 0xa3, 0xa8, 0x20, 0x45, 0x0b, 0x71, 0x86, 0xc4, 0xfd, 0x47, 0x0d, 0x96,
0xb4, 0xec, 0x71, 0x42, 0xd6, 0xe0, 0x86, 0x1f, 0xc6, 0xfe, 0x39, 0x0a, 0xaa, 0x51, 0x03, 0x90,
0x0e, 0x54, 0x44, 0x80, 0x9c, 0x4d, 0x5a, 0x11, 0x01, 0xf9, 0x12, 0x1a, 0x7e, 0x1c, 0x29, 0xe6,
0x2b, 0xd9, 0xab, 0x6e, 0x55, 0xef, 0xb5, 0xee, 0x7f, 0xb0, 0x9d, 0xbd, 0x74, 0xfb, 0x70, 0x12,
0xf9, 0x7b, 0x91, 0x54, 0x2c, 0x0c, 0xf1, 0x61, 0x03, 0x43, 0xf9, 0xea, 0x3e, 0x9d, 0x32, 0x91,
0x1f, 0x43, 0xcb, 0x8f, 0x47, 0xa3, 0x71, 0x24, 0x94, 0xe0, 0xb2, 0x57, 0x43, 0x19, 0xb7, 0xca,
0x32, 0x06, 0x96, 0x60, 0x42, 0x8b, 0xb4, 0xe4, 0x25, 0xac, 0x64, 0x62, 0xac, 0x0d, 0x7a, 0x37,
0xb6, 0x9c, 0x7b, 0xad, 0xfb, 0x1f, 0xe6, 0xec, 0x57, 0x18, 0x8c, 0xce, 0x72, 0x93, 0x63, 0x20,
0x05, 0xf9, 0x99, 0xcc, 0xa5, 0xb7, 0x91, 0x39, 0x47, 0x00, 0x79, 0x00, 0xf5, 0x24, 0x8d, 0x4f,
0x45, 0xc8, 0x7b, 0x75, 0x94, 0x75, 0x3b, 0x97, 0x95, 0xc9, 0x38, 0x30, 0x04, 0x34, 0xa3, 0x24,
0x2f, 0xa0, 0x63, 0x3f, 0x33, 0x3d, 0x1a, 0x6f, 0xa3, 0xc7, 0x0c, 0x33, 0xf9, 0x04, 0xea, 0x36,
0xe2, 0x7a, 0x4d, 0x94, 0xf3, 0x6e, 0xd9, 0xc4, 0x87, 0xe6, 0x90, 0x66, 0x54, 0xda, 0xb8, 0x59,
0x88, 0x66, 0x0a, 0xc0, 0x5b, 0x19, 0x77, 0x86, 0xdb, 0xfd, 0x4b, 0x0d, 0xda, 0x2f, 0xc6, 0xa1,
0x12, 0x7d, 0xdf, 0x8f, 0xc7, 0x91, 0x22, 0x04, 0x6a, 0x11, 0x1b, 0x71, 0x8c, 0xaf, 0x26, 0xc5,
0x6f, 0xb2, 0x09, 0x4d, 0x25, 0x46, 0x5c, 0x2a, 0x36, 0x4a, 0x30, 0xca, 0xaa, 0x34, 0x47, 0xe8,
0x53, 0x11, 0xf0, 0x48, 0x09, 0x3f, 0x8e, 0x7a, 0x55, 0x64, 0xcb, 0x11, 0xe4, 0x2b, 0x00, 0x3f,
0x0e, 0xe3, 0xd4, 0x1b, 0x32, 0x39, 0xb4, 0x81, 0x74, 0x37, 0x57, 0xb6, 0x78, 0xf7, 0xf6, 0x20,
0x0e, 0xe3, 0x71, 0xfa, 0x84, 0xc9, 0x21, 0x6d, 0x22, 0x93, 0xfe, 0x24, 0x3d, 0xa8, 0x23, 0xb0,
0x17, 0x60, 0x20, 0x55, 0x69, 0x06, 0x92, 0x8f, 0x60, 0xe5, 0x9c, 0x4f, 0x7c, 0x96, 0x06, 0x9e,
0x4d, 0x6b, 0x0c, 0x8b, 0x26, 0xed, 0x58, 0xf4, 0x81, 0xc1, 0x92, 0x5b, 0x50, 0x3f, 0xe7, 0x13,
0x6f, 0x2c, 0x02, 0xf4, 0x75, 0x93, 0x2e, 0x9d, 0xf3, 0xc9, 0xb1, 0x08, 0xc8, 0x17, 0xb0, 0x24,
0x46, 0xec, 0x8c, 0x6b, 0x3f, 0x6a, 0xcd, 0xbe, 0xb3, 0x40, 0xb3, 0x3d, 0x7c, 0x8f, 0x9a, 0xec,
0x69, 0x62, 0x6a, 0x79, 0xd6, 0x5d, 0x80, 0x5c, 0x65, 0x9d, 0x9a, 0x22, 0x0a, 0xf8, 0xaf, 0x7b,
0xce, 0x56, 0xf5, 0x5e, 0x95, 0x1a, 0x60, 0xfd, 0x9f, 0x0e, 0x2c, 0x97, 0xb8, 0x8b, 0xca, 0x38,
0x25, 0x65, 0x32, 0xd3, 0x57, 0x0a, 0xa6, 0xef, 0x41, 0x3d, 0x61, 0x93, 0x30, 0x66, 0x01, 0x9a,
0xb6, 0x4d, 0x33, 0x50, 0x5f, 0xf7, 0x46, 0x04, 0x4a, 0xdb, 0x54, 0x1b, 0xc5, 0x00, 0xe4, 0x3d,
0x58, 0x1a, 0x72, 0x71, 0x36, 0x54, 0xd6, 0x56, 0x16, 0x22, 0xeb, 0xd0, 0xd0, 0x81, 0x27, 0xc5,
0x6f, 0x38, 0xda, 0xa8, 0x4a, 0xa7, 0x30, 0xf9, 0x00, 0x96, 0x53, 0xfc, 0xf2, 0x14, 0x4b, 0xcf,
0xb8, 0x42, 0x1b, 0x55, 0x69, 0xdb, 0x20, 0x8f, 0x10, 0x97, 0x17, 0x9e, 0x46, 0xa1, 0xf0, 0xb8,
0x7f, 0x77, 0x60, 0xf5, 0x79, 0xec, 0xb3, 0xd0, 0x5a, 0xfa, 0xc0, 0x2a, 0xf7, 0x03, 0xa8, 0x9d,
0xf3, 0x89, 0x44, 0x53, 0x94, 0xfc, 0x3d, 0x87, 0x78, 0xfb, 0x19, 0x9f, 0x50, 0x24, 0x27, 0x9f,
0x43, 0x7b, 0xa4, 0xcd, 0xce, 0x8c, 0xd9, 0xd1, 0x12, 0xad, 0xfb, 0xef, 0xcd, 0x77, 0x0a, 0x2d,
0xd1, 0xea, 0x17, 0x26, 0x4c, 0xca, 0x37, 0x71, 0x1a, 0xd8, 0x28, 0x9c, 0xc2, 0xeb, 0xdf, 0x83,
0xea, 0x33, 0x3e, 0x99, 0x1b, 0xdb, 0x04, 0x6a, 0xba, 0x18, 0xe3, 0x55, 0x6d, 0x8a, 0xdf, 0xee,
0xef, 0x1c, 0xe8, 0x6a, 0x1d, 0x8b, 0x55, 0x72, 0x41, 0xe5, 0xfd, 0x08, 0x56, 0x44, 0x81, 0xca,
0x9b, 0x96, 0xe1, 0x4e, 0x11, 0xbd, 0x17, 0x60, 0x1f, 0xe0, 0x17, 0xc2, 0xe7, 0x9e, 0x9a, 0x24,
0xdc, 0x6a, 0x08, 0x06, 0x75, 0x34, 0x49, 0xf8, 0x54, 0xb9, 0x5a, 0xae, 0x9c, 0xfb, 0x6f, 0x07,
0x6e, 0x2d, 0x28, 0xd7, 0xd7, 0xec, 0x04, 0x1f, 0xc0, 0xb2, 0xad, 0x39, 0x1e, 0x06, 0xad, 0xbd,
0xb8, 0x6d, 0x91, 0x26, 0x22, 0x6f, 0x43, 0x83, 0x47, 0xd2, 0x2b, 0x5c, 0x5f, 0xe7, 0x91, 0xdc,
0xd7, 0xe6, 0xb9, 0x0b, 0xed, 0x90, 0x49, 0xe5, 0x8d, 0x93, 0x80, 0x29, 0x6e, 0x32, 0xb0, 0x46,
0x5b, 0x1a, 0x77, 0x6c, 0x50, 0xfa, 0x65, 0x72, 0x22, 0x15, 0x1f, 0x79, 0x8a, 0x9d, 0xe9, 0xc2,
0x5c, 0xd5, 0x2f, 0x33, 0xa8, 0x23, 0x76, 0x26, 0xc9, 0x87, 0xd0, 0x09, 0xb5, 0xdb, 0xbd, 0x48,
0xf8, 0xe7, 0x78, 0x89, 0x49, 0xc2, 0x65, 0xc4, 0xee, 0x5b, 0xa4, 0xfb, 0xdb, 0x25, 0xb8, 0xbd,
0xb0, 0x37, 0x91, 0x4f, 0x61, 0xad, 0xa8, 0x88, 0x87, 0xbc, 0xe1, 0xc4, 0xbe, 0x9e, 0x14, 0x14,
0x7a, 0x6e, 0x4e, 0xfe, 0x8f, 0x4d, 0xa1, 0x7d, 0xcb, 0x82, 0x80, 0x07, 0xd8, 0x15, 0x1a, 0xd4,
0x00, 0xba, 0x16, 0x9c, 0x68, 0x27, 0xf3, 0x00, 0x8b, 0x7e, 0x83, 0x66, 0xa0, 0xa6, 0x1f, 0x8d,
0xb5, 0x4e, 0x2d, 0x43, 0x8f, 0x80, 0xa6, 0x4f, 0xf9, 0x28, 0xbe, 0xe0, 0x41, 0xaf, 0x6d, 0xe8,
0x2d, 0x48, 0xb6, 0xa0, 0x3d, 0x64, 0xd2, 0x43, 0xb1, 0xde, 0x58, 0xf6, 0x96, 0xf1, 0x18, 0x86,
0x4c, 0xf6, 0x35, 0xea, 0x58, 0x77, 0xa6, 0xd5, 0x0b, 0x9e, 0x8a, 0xd3, 0x6c, 0xf8, 0x91, 0x8a,
0xa9, 0xb1, 0xec, 0x75, 0xb0, 0x32, 0x90, 0xe2, 0xd1, 0x21, 0x9e, 0xe0, 0x18, 0x93, 0x8e, 0xa5,
0xca, 0x28, 0x57, 0x90, 0xb2, 0x85, 0x38, 0x4b, 0xf2, 0x08, 0x36, 0x6c, 0x6f, 0xf7, 0x52, 0xfe,
0xab, 0x31, 0x97, 0xca, 0x78, 0x11, 0x59, 0x78, 0xaf, 0x8b, 0x1c, 0x3d, 0x4b, 0x42, 0x0d, 0x05,
0x3a, 0x53, 0xf3, 0xf3, 0xc5, 0xec, 0x26, 0x0d, 0x6e, 0x2e, 0x64, 0x1f, 0x60, 0x66, 0x7c, 0x09,
0x9b, 0xb3, 0xec, 0xda, 0x1c, 0x8a, 0xdb, 0xeb, 0x09, 0xf2, 0xdf, 0x2e, 0xf3, 0x53, 0xa4, 0x30,
0xf7, 0x2f, 0x16, 0x60, 0x14, 0x58, 0x5d, 0x2c, 0xc0, 0x68, 0x70, 0x17, 0xda, 0x81, 0x90, 0x49,
0xc8, 0x26, 0x26, 0xbe, 0xd6, 0xd0, 0xf5, 0x2d, 0x8b, 0xd3, 0x31, 0xe6, 0xbe, 0xb9, 0x9c, 0xef,
0x59, 0x63, 0x9e, 0x9f, 0xef, 0x97, 0x82, 0xba, 0x32, 0x27, 0xa8, 0x67, 0x23, 0xb7, 0x7a, 0x29,
0x72, 0xdd, 0xc7, 0xb0, 0x3e, 0x7b, 0xf1, 0xc1, 0xf8, 0x24, 0x14, 0xfe, 0x60, 0xc8, 0xae, 0x59,
0x6b, 0xdc, 0x6f, 0xab, 0xb0, 0x5c, 0x1a, 0x0c, 0xff, 0x2b, 0x5f, 0x1b, 0x13, 0xf3, 0x0e, 0xb4,
0x92, 0x54, 0x5c, 0x30, 0xc5, 0xbd, 0x73, 0x3e, 0xb1, 0x7d, 0x0e, 0x2c, 0x4a, 0xd7, 0xed, 0x2d,
0x5d, 0x3b, 0xa5, 0x9f, 0x8a, 0x44, 0xeb, 0x85, 0x79, 0xd9, 0xa6, 0x45, 0x94, 0x6e, 0x7b, 0xbf,
0x8c, 0x45, 0x64, 0xb3, 0xb2, 0x41, 0x2d, 0xa4, 0x9b, 0x82, 0x89, 0x55, 0x1e, 0x60, 0xdb, 0x6b,
0xd0, 0x29, 0x9c, 0x27, 0x4d, 0xbd, 0x98, 0x34, 0x2f, 0xa1, 0x6b, 0xbd, 0x2b, 0x3d, 0x15, 0x7b,
0x5a, 0x8e, 0x9d, 0x0d, 0x3e, 0x5c, 0x34, 0xfe, 0x5a, 0xf2, 0xa3, 0xf8, 0x69, 0x2c, 0x22, 0xda,
0x49, 0x4b, 0x30, 0x79, 0x08, 0x8d, 0x6c, 0xe8, 0xb2, 0x43, 0xde, 0x9d, 0x05, 0x82, 0xec, 0xb4,
0x27, 0xe9, 0x94, 0x41, 0xcf, 0x56, 0x3c, 0xf2, 0xd3, 0x49, 0xa2, 0xa6, 0x49, 0x9f, 0x23, 0xf4,
0xa9, 0x4c, 0xb8, 0xaf, 0x58, 0x9e, 0xfa, 0x39, 0x42, 0xb7, 0x26, 0x4b, 0xaa, 0x13, 0x18, 0xdb,
0x71, 0x1b, 0x2d, 0xd7, 0xc9, 0xd1, 0xcf, 0xf8, 0x44, 0xba, 0x7f, 0x73, 0x60, 0xe3, 0x8a, 0x17,
0x59, 0x7f, 0x39, 0x53, 0x7f, 0xbd, 0x0f, 0x90, 0x60, 0x6c, 0xa0, 0xbb, 0x8c, 0xff, 0x9b, 0x06,
0xa3, 0xbd, 0x35, 0x75, 0x7a, 0xb5, 0xe8, 0xf4, 0x2b, 0x0a, 0xeb, 0x2d, 0xa8, 0xfb, 0x43, 0xa6,
0x74, 0xef, 0xbc, 0x61, 0x06, 0x22, 0x0d, 0xee, 0x05, 0x3a, 0x6e, 0xb3, 0xc1, 0x7d, 0xa2, 0x4f,
0x97, 0x8c, 0xe3, 0xa7, 0xb8, 0x3d, 0x74, 0xa2, 0x49, 0xdf, 0xba, 0xb9, 0x0c, 0x01, 0xf7, 0xf7,
0x15, 0xe8, 0xce, 0x86, 0x33, 0x79, 0x54, 0x58, 0x8a, 0x2e, 0xcd, 0x25, 0x0b, 0x1a, 0x4f, 0x61,
0x25, 0xfa, 0x1a, 0xda, 0xf6, 0xd5, 0x5a, 0x3b, 0xd9, 0xab, 0xcc, 0x0e, 0x8c, 0x8b, 0xf3, 0x87,
0xb6, 0x92, 0xe9, 0xb7, 0x24, 0x0f, 0xa1, 0x9e, 0xcd, 0x37, 0x55, 0x8c, 0x87, 0x2b, 0xd4, 0xc8,
0x46, 0x9d, 0x8c, 0xe3, 0x7f, 0x58, 0xcc, 0xdc, 0xcf, 0x60, 0x05, 0x4f, 0xb5, 0x42, 0xb6, 0x0f,
0x5c, 0x2f, 0xaf, 0xbf, 0x80, 0xb5, 0x8c, 0xf1, 0x85, 0x59, 0x7d, 0x25, 0xe5, 0xec, 0xba, 0xdc,
0x5f, 0xc1, 0x7b, 0x9a, 0xbb, 0xef, 0x2b, 0x71, 0x21, 0xd4, 0x64, 0xc0, 0x23, 0xc5, 0xd3, 0x2b,
0xf8, 0xbb, 0x50, 0x15, 0x81, 0x31, 0x6f, 0x9b, 0xea, 0x4f, 0x77, 0xc7, 0xd4, 0xa6, 0xb2, 0x84,
0xbe, 0xef, 0x73, 0x4c, 0x82, 0xeb, 0x4a, 0xd9, 0x35, 0x41, 0x5e, 0x96, 0xb2, 0x23, 0xe4, 0x48,
0x48, 0xf9, 0x16, 0x62, 0xbe, 0x71, 0xa0, 0xad, 0xe5, 0x3c, 0x8e, 0xe3, 0xf3, 0x11, 0x4b, 0xcf,
0x17, 0x33, 0x8e, 0xd3, 0xd0, 0x9a, 0x41, 0x7f, 0x4e, 0xe7, 0xbb, 0x6a, 0x61, 0xf8, 0xdc, 0x80,
0x26, 0x56, 0x6d, 0x4f, 0xd3, 0x9a, 0xac, 0x68, 0x20, 0xe2, 0x38, 0x0d, 0x8b, 0xed, 0xfb, 0x46,
0xb9, 0x7d, 0xbf, 0x0f, 0x10, 0xf0, 0x90, 0xeb, 0x31, 0x88, 0x29, 0xcc, 0x8a, 0x1a, 0x6d, 0x5a,
0x4c, 0x5f, 0xb9, 0x4f, 0x4d, 0xf0, 0x0f, 0x42, 0xce, 0xd2, 0x27, 0x42, 0xaa, 0x38, 0x9d, 0x14,
0x73, 0xcc, 0x29, 0xe5, 0xd8, 0xfb, 0x00, 0xbe, 0x26, 0x34, 0xb2, 0x2a, 0x46, 0x96, 0xc5, 0xf4,
0x95, 0xfb, 0x57, 0x07, 0x88, 0x16, 0x66, 0x37, 0xe1, 0x03, 0xe1, 0xab, 0x71, 0xca, 0xe7, 0x4e,
0xd2, 0x85, 0x55, 0xa5, 0xb2, 0x60, 0x55, 0xa9, 0xe2, 0x6f, 0x1b, 0x97, 0x56, 0x95, 0x1a, 0xa2,
0xb3, 0x55, 0x65, 0x03, 0x9a, 0xd8, 0xcf, 0x70, 0x57, 0xb9, 0x81, 0x47, 0xb8, 0xab, 0x1c, 0xce,
0xdd, 0x55, 0x96, 0x90, 0x60, 0xc1, 0xae, 0x52, 0x2f, 0xee, 0x2a, 0x43, 0x58, 0xbd, 0xfc, 0x12,
0xb9, 0x78, 0x1d, 0xfb, 0x11, 0x34, 0x12, 0x4b, 0x64, 0x93, 0x7d, 0xb3, 0x9c, 0x67, 0x65, 0x49,
0x74, 0x4a, 0xed, 0xfe, 0xb1, 0x02, 0x37, 0x35, 0xc1, 0x6b, 0x16, 0x86, 0x5c, 0x5d, 0xdd, 0xc0,
0x7b, 0x50, 0x67, 0x41, 0x90, 0x72, 0x29, 0x33, 0xab, 0x59, 0x50, 0xdb, 0xe7, 0x0d, 0x0a, 0x40,
0xb3, 0x35, 0xa8, 0x85, 0xb4, 0xed, 0xb5, 0xef, 0xd0, 0x6a, 0x0d, 0x8a, 0xdf, 0x1a, 0x87, 0x6b,
0x85, 0xa9, 0x9f, 0xf8, 0xad, 0x25, 0x6b, 0xdf, 0xeb, 0xa1, 0xc0, 0x6c, 0xc5, 0x19, 0xa8, 0xa9,
0x13, 0xa6, 0x86, 0x76, 0xf6, 0xc4, 0x6f, 0xdd, 0x4b, 0xa6, 0x25, 0x1c, 0x77, 0xbc, 0x76, 0xb1,
0xa6, 0x67, 0xfe, 0x6e, 0x16, 0xfc, 0xad, 0xdf, 0xa3, 0x17, 0x71, 0xec, 0x4b, 0x4d, 0x6a, 0x00,
0xf4, 0xaa, 0x08, 0x02, 0x1e, 0xd9, 0x86, 0x64, 0xa1, 0xc5, 0xc3, 0xa8, 0xfb, 0xc2, 0x44, 0x58,
0xc9, 0x58, 0x92, 0x7c, 0x06, 0x0d, 0x5b, 0xf3, 0xb2, 0x6a, 0xbd, 0x51, 0xb6, 0x7e, 0x89, 0x9e,
0x4e, 0x89, 0xdd, 0x3f, 0x3b, 0x26, 0xfc, 0x0f, 0xd9, 0x05, 0x0f, 0xfa, 0xd6, 0x96, 0x05, 0x2b,
0x3b, 0x65, 0x2b, 0xcf, 0x5b, 0xba, 0x37, 0xa1, 0x79, 0xca, 0x2e, 0xe2, 0x71, 0x2a, 0x14, 0xb7,
0xc6, 0xcf, 0x11, 0xba, 0x93, 0xf9, 0x43, 0x26, 0x70, 0xd7, 0xab, 0xa1, 0x2b, 0xeb, 0x08, 0xef,
0x05, 0x57, 0xa4, 0xec, 0x5d, 0x68, 0x9b, 0xe9, 0xcb, 0x2b, 0x46, 0x66, 0xcb, 0xe0, 0x70, 0x3c,
0x74, 0xff, 0xe0, 0xc0, 0xbb, 0x73, 0xe7, 0x81, 0x05, 0x91, 0x33, 0xdb, 0x1d, 0xcd, 0x0b, 0x4a,
0xdd, 0x71, 0x17, 0xee, 0x0c, 0x4d, 0x01, 0xf0, 0x58, 0xea, 0x0f, 0xc5, 0x05, 0xf7, 0xe4, 0x38,
0x49, 0xe2, 0x54, 0x79, 0x3c, 0x62, 0x27, 0xa1, 0x9d, 0x05, 0x1b, 0x74, 0xd3, 0x92, 0xf5, 0x0d,
0xd5, 0xa1, 0x21, 0xda, 0x35, 0x34, 0xee, 0x9f, 0x1c, 0xd3, 0x3a, 0x8e, 0xf4, 0x30, 0xaf, 0xd7,
0x03, 0x9e, 0x5e, 0x73, 0xfd, 0x7c, 0x04, 0x4b, 0x76, 0x1f, 0xd0, 0xf7, 0x74, 0x66, 0x67, 0xa8,
0x82, 0xc0, 0xed, 0xa3, 0x7c, 0x53, 0xa0, 0x96, 0xc9, 0xfd, 0x1c, 0x5a, 0x05, 0x34, 0x69, 0x41,
0xfd, 0x78, 0xff, 0xd9, 0xfe, 0xcb, 0xd7, 0xfb, 0xdd, 0x77, 0x34, 0x70, 0x44, 0x8f, 0x0f, 0x8f,
0x76, 0x77, 0xba, 0x0e, 0xb9, 0x09, 0xcb, 0xc7, 0xfb, 0x08, 0xbe, 0x7e, 0x49, 0x8f, 0x9e, 0xfc,
0xac, 0x5b, 0x71, 0xbf, 0xa9, 0x9a, 0x59, 0xfa, 0x55, 0x61, 0x57, 0xb1, 0x83, 0xcd, 0x02, 0xe5,
0x09, 0xd4, 0x4e, 0xd3, 0x78, 0x94, 0x85, 0x82, 0xfe, 0xd6, 0x0f, 0x52, 0xb1, 0xad, 0xd9, 0x15,
0x15, 0xeb, 0xd0, 0xf0, 0x87, 0x3a, 0xf2, 0xa2, 0xb3, 0x6c, 0x8e, 0xc9, 0x11, 0xda, 0x25, 0x76,
0xfa, 0x33, 0xe5, 0xd4, 0xae, 0x88, 0x53, 0x5c, 0x1f, 0x7f, 0xa6, 0x48, 0xb9, 0x4c, 0xe2, 0x48,
0x66, 0x69, 0x39, 0x85, 0x75, 0x2d, 0x4e, 0x79, 0x12, 0x0a, 0xc3, 0x6c, 0x42, 0xa4, 0x69, 0x31,
0x7d, 0x45, 0xf8, 0xfc, 0x9d, 0xac, 0x81, 0x96, 0xfd, 0x7e, 0xd9, 0xb2, 0x73, 0x5e, 0xbd, 0xfd,
0xea, 0xd2, 0xd6, 0x36, 0x77, 0x93, 0x33, 0x3e, 0x6c, 0x4e, 0x1b, 0xf8, 0x4f, 0x81, 0x5c, 0xe6,
0xbc, 0xe4, 0x8b, 0x83, 0xdd, 0xfd, 0x9d, 0xbd, 0xfd, 0xaf, 0xbb, 0x0e, 0x69, 0x43, 0xa3, 0x3f,
0x18, 0xec, 0x1e, 0x68, 0xcf, 0x54, 0x34, 0xb4, 0xb3, 0x3b, 0x78, 0xbe, 0xb7, 0xbf, 0xbb, 0xd3,
0xad, 0x6a, 0x68, 0xd0, 0xdf, 0x1f, 0xec, 0x3e, 0xdf, 0xdd, 0xe9, 0xd6, 0xdc, 0x7f, 0x39, 0xa6,
0xb3, 0x0f, 0x4a, 0x2b, 0xd3, 0x0e, 0xf7, 0x85, 0x5c, 0xfc, 0x8b, 0xcb, 0x26, 0x34, 0xad, 0x3d,
0xf7, 0xb2, 0x48, 0xcb, 0x11, 0xe4, 0x17, 0xb0, 0x12, 0x58, 0x7e, 0xaf, 0x14, 0x79, 0x0f, 0x66,
0x67, 0xa4, 0x79, 0x57, 0x6e, 0x67, 0x1f, 0xd6, 0x3c, 0x9d, 0xa0, 0x04, 0xbb, 0x1f, 0x43, 0xa7,
0x4c, 0x51, 0x7a, 0xec, 0x3b, 0xa5, 0xc7, 0x3a, 0xee, 0xb7, 0x0e, 0xac, 0xcc, 0xfc, 0x92, 0xbc,
0xb8, 0xdb, 0xcc, 0x2e, 0x87, 0x95, 0x4b, 0xcb, 0x21, 0xf9, 0x18, 0x48, 0x91, 0xc4, 0x2b, 0x4e,
0xd9, 0xdd, 0x02, 0xa1, 0xd9, 0x36, 0x8b, 0xed, 0xab, 0xf6, 0x56, 0xed, 0x4b, 0x02, 0x50, 0xf6,
0xc6, 0x8e, 0x7a, 0xc5, 0xb6, 0xee, 0x94, 0xdb, 0xfa, 0x33, 0x68, 0xd9, 0x7f, 0x85, 0x1c, 0xe9,
0xde, 0x53, 0x41, 0x3b, 0x7f, 0x37, 0xbf, 0xa4, 0x9f, 0xff, 0xf3, 0xe4, 0x85, 0xfd, 0xdf, 0x89,
0x15, 0xba, 0xad, 0x19, 0x68, 0x91, 0x5b, 0xc7, 0x42, 0x47, 0x6b, 0x55, 0xb8, 0xf9, 0x87, 0xd0,
0x4a, 0xa7, 0x50, 0xd6, 0x05, 0xd6, 0x72, 0xf9, 0x39, 0x29, 0x2d, 0x12, 0x92, 0xfb, 0xb0, 0x26,
0xc7, 0x27, 0x59, 0x27, 0x79, 0x2a, 0xe3, 0xe8, 0xf1, 0x44, 0xf1, 0xac, 0xbf, 0xce, 0x3d, 0x23,
0x1f, 0xc3, 0xcd, 0x6c, 0xe9, 0xca, 0x19, 0xcc, 0x26, 0x7a, 0xf9, 0x80, 0x7c, 0x0a, 0xab, 0x51,
0x1c, 0xf0, 0x41, 0x1c, 0x9d, 0x8a, 0xb3, 0x9c, 0xde, 0x2c, 0xa6, 0xf3, 0x8e, 0x1e, 0x2f, 0xff,
0xbc, 0xb5, 0xfd, 0xc9, 0xc3, 0x4c, 0xf5, 0x93, 0x25, 0xfc, 0x7a, 0xf0, 0x9f, 0x00, 0x00, 0x00,
0xff, 0xff, 0xbb, 0x15, 0xb2, 0x92, 0x8f, 0x1a, 0x00, 0x00,
0x75, 0x47, 0x52, 0x2c, 0xe9, 0x49, 0x96, 0x95, 0x8e, 0x77, 0xa3, 0xd8, 0x4e, 0xc5, 0x99, 0x90,
0xda, 0x50, 0x15, 0xbc, 0x54, 0x02, 0x2c, 0x6c, 0x36, 0xb5, 0xab, 0xc8, 0x66, 0xe3, 0x7c, 0x38,
0xae, 0xb6, 0x9d, 0x00, 0x45, 0xd5, 0x54, 0x7b, 0xa6, 0x63, 0x35, 0x1e, 0xcd, 0x0c, 0xd3, 0x2d,
0x87, 0xe1, 0xc6, 0x85, 0x1f, 0xc0, 0x85, 0xeb, 0x9e, 0xe1, 0x46, 0xd5, 0x72, 0xe2, 0x07, 0x70,
0xe3, 0xc0, 0x85, 0x2a, 0xf8, 0x05, 0xfc, 0x0a, 0xaa, 0x5f, 0xf7, 0x48, 0x33, 0xb2, 0x64, 0x9c,
0xe2, 0xc4, 0xc9, 0xfd, 0xde, 0xbc, 0xf7, 0xfa, 0xf5, 0xfb, 0x7e, 0x32, 0x2c, 0x27, 0x4c, 0xa4,
0x22, 0x3a, 0xd9, 0x4a, 0xd2, 0x58, 0xc5, 0xa4, 0x81, 0x7f, 0x8e, 0xc7, 0x6f, 0xd7, 0xae, 0xc9,
0x2c, 0xf2, 0x3d, 0xc9, 0x95, 0x12, 0xd1, 0x89, 0x34, 0x9f, 0xd7, 0x5c, 0x96, 0x24, 0xa1, 0xf0,
0x99, 0x12, 0x71, 0xe4, 0x8d, 0xb8, 0x62, 0x01, 0x53, 0xcc, 0x1b, 0x71, 0x29, 0xd9, 0x09, 0x37,
0x34, 0x2e, 0x83, 0xf5, 0x1f, 0x73, 0xe5, 0x0f, 0x45, 0x74, 0xf2, 0x84, 0xf9, 0xa7, 0x3c, 0x38,
0x4a, 0xb6, 0x99, 0x62, 0xdb, 0x5c, 0x31, 0x11, 0x4a, 0x72, 0x0b, 0x5a, 0xc8, 0x14, 0x8d, 0x47,
0xc7, 0x3c, 0xed, 0x39, 0x9b, 0xce, 0xbd, 0x65, 0x0a, 0x1a, 0xb5, 0x87, 0x18, 0x72, 0x1b, 0xda,
0x2a, 0x56, 0x2c, 0xcc, 0x29, 0x2a, 0x48, 0xd1, 0x42, 0x9c, 0x21, 0x71, 0xff, 0x51, 0x83, 0x25,
0x2d, 0x7b, 0x9c, 0x90, 0x55, 0xb8, 0xe2, 0x87, 0xb1, 0x7f, 0x8a, 0x82, 0x6a, 0xd4, 0x00, 0xa4,
0x03, 0x15, 0x11, 0x20, 0x67, 0x93, 0x56, 0x44, 0x40, 0xbe, 0x80, 0x86, 0x1f, 0x47, 0x8a, 0xf9,
0x4a, 0xf6, 0xaa, 0x9b, 0xd5, 0x7b, 0xad, 0x07, 0x77, 0xb6, 0xf2, 0x97, 0x6e, 0x1d, 0x64, 0x91,
0xbf, 0x1b, 0x49, 0xc5, 0xc2, 0x10, 0x1f, 0x36, 0x30, 0x94, 0xaf, 0x1f, 0xd0, 0x09, 0x13, 0xf9,
0x11, 0xb4, 0xfc, 0x78, 0x34, 0x1a, 0x47, 0x42, 0x09, 0x2e, 0x7b, 0x35, 0x94, 0x71, 0xbd, 0x2c,
0x63, 0x60, 0x09, 0x32, 0x5a, 0xa4, 0x25, 0xaf, 0x60, 0x25, 0x17, 0x63, 0x6d, 0xd0, 0xbb, 0xb2,
0xe9, 0xdc, 0x6b, 0x3d, 0xb8, 0x3b, 0x65, 0xbf, 0xc0, 0x60, 0x74, 0x96, 0x9b, 0x1c, 0x01, 0x29,
0xc8, 0xcf, 0x65, 0x2e, 0xbd, 0x8f, 0xcc, 0x39, 0x02, 0xc8, 0x43, 0xa8, 0x27, 0x69, 0xfc, 0x56,
0x84, 0xbc, 0x57, 0x47, 0x59, 0x37, 0xa6, 0xb2, 0x72, 0x19, 0xfb, 0x86, 0x80, 0xe6, 0x94, 0xe4,
0x25, 0x74, 0xec, 0x31, 0xd7, 0xa3, 0xf1, 0x3e, 0x7a, 0xcc, 0x30, 0x93, 0x4f, 0xa0, 0x6e, 0x23,
0xae, 0xd7, 0x44, 0x39, 0x1f, 0x96, 0x4d, 0x7c, 0x60, 0x3e, 0xd2, 0x9c, 0x4a, 0x1b, 0x37, 0x0f,
0xd1, 0x5c, 0x01, 0x78, 0x2f, 0xe3, 0xce, 0x70, 0xbb, 0x7f, 0xa9, 0x41, 0xfb, 0xe5, 0x38, 0x54,
0xa2, 0xef, 0xfb, 0xf1, 0x38, 0x52, 0x84, 0x40, 0x2d, 0x62, 0x23, 0x8e, 0xf1, 0xd5, 0xa4, 0x78,
0x26, 0x1b, 0xd0, 0x54, 0x62, 0xc4, 0xa5, 0x62, 0xa3, 0x04, 0xa3, 0xac, 0x4a, 0xa7, 0x08, 0xfd,
0x55, 0x04, 0x3c, 0x52, 0xc2, 0x8f, 0xa3, 0x5e, 0x15, 0xd9, 0xa6, 0x08, 0xf2, 0x25, 0x80, 0x1f,
0x87, 0x71, 0xea, 0x0d, 0x99, 0x1c, 0xda, 0x40, 0xba, 0x3d, 0x55, 0xb6, 0x78, 0xf7, 0xd6, 0x20,
0x0e, 0xe3, 0x71, 0xfa, 0x94, 0xc9, 0x21, 0x6d, 0x22, 0x93, 0x3e, 0x92, 0x1e, 0xd4, 0x11, 0xd8,
0x0d, 0x30, 0x90, 0xaa, 0x34, 0x07, 0xc9, 0xc7, 0xb0, 0x72, 0xca, 0x33, 0x9f, 0xa5, 0x81, 0x67,
0xd3, 0x1a, 0xc3, 0xa2, 0x49, 0x3b, 0x16, 0xbd, 0x6f, 0xb0, 0xe4, 0x3a, 0xd4, 0x4f, 0x79, 0xe6,
0x8d, 0x45, 0x80, 0xbe, 0x6e, 0xd2, 0xa5, 0x53, 0x9e, 0x1d, 0x89, 0x80, 0x7c, 0x0e, 0x4b, 0x62,
0xc4, 0x4e, 0xb8, 0xf6, 0xa3, 0xd6, 0xec, 0x5b, 0x0b, 0x34, 0xdb, 0xc5, 0xf7, 0xa8, 0x6c, 0x57,
0x13, 0x53, 0xcb, 0xb3, 0xe6, 0x02, 0x4c, 0x55, 0xd6, 0xa9, 0x29, 0xa2, 0x80, 0xff, 0xaa, 0xe7,
0x6c, 0x56, 0xef, 0x55, 0xa9, 0x01, 0xd6, 0xfe, 0xe9, 0xc0, 0x72, 0x89, 0xbb, 0xa8, 0x8c, 0x53,
0x52, 0x26, 0x37, 0x7d, 0xa5, 0x60, 0xfa, 0x1e, 0xd4, 0x13, 0x96, 0x85, 0x31, 0x0b, 0xd0, 0xb4,
0x6d, 0x9a, 0x83, 0xfa, 0xba, 0x77, 0x22, 0x50, 0xda, 0xa6, 0xda, 0x28, 0x06, 0x20, 0x1f, 0xc1,
0xd2, 0x90, 0x8b, 0x93, 0xa1, 0xb2, 0xb6, 0xb2, 0x10, 0x59, 0x83, 0x86, 0x0e, 0x3c, 0x29, 0x7e,
0xcd, 0xd1, 0x46, 0x55, 0x3a, 0x81, 0xc9, 0x1d, 0x58, 0x4e, 0xf1, 0xe4, 0x29, 0x96, 0x9e, 0x70,
0x85, 0x36, 0xaa, 0xd2, 0xb6, 0x41, 0x1e, 0x22, 0x6e, 0x5a, 0x78, 0x1a, 0x85, 0xc2, 0xe3, 0xfe,
0xdd, 0x81, 0x6b, 0x2f, 0x62, 0x9f, 0x85, 0xd6, 0xd2, 0xfb, 0x56, 0xb9, 0xef, 0x43, 0xed, 0x94,
0x67, 0x12, 0x4d, 0x51, 0xf2, 0xf7, 0x1c, 0xe2, 0xad, 0xe7, 0x3c, 0xa3, 0x48, 0x4e, 0x3e, 0x83,
0xf6, 0x48, 0x9b, 0x9d, 0x19, 0xb3, 0xa3, 0x25, 0x5a, 0x0f, 0x3e, 0x9a, 0xef, 0x14, 0x5a, 0xa2,
0xd5, 0x2f, 0x4c, 0x98, 0x94, 0xef, 0xe2, 0x34, 0xb0, 0x51, 0x38, 0x81, 0xd7, 0xbe, 0x03, 0xd5,
0xe7, 0x3c, 0x9b, 0x1b, 0xdb, 0x04, 0x6a, 0xba, 0x18, 0xe3, 0x55, 0x6d, 0x8a, 0x67, 0xf7, 0xb7,
0x0e, 0x74, 0xb5, 0x8e, 0xc5, 0x2a, 0xb9, 0xa0, 0xf2, 0x7e, 0x0c, 0x2b, 0xa2, 0x40, 0xe5, 0x4d,
0xca, 0x70, 0xa7, 0x88, 0xde, 0x0d, 0xb0, 0x0f, 0xf0, 0x33, 0xe1, 0x73, 0x4f, 0x65, 0x09, 0xb7,
0x1a, 0x82, 0x41, 0x1d, 0x66, 0x09, 0x9f, 0x28, 0x57, 0x9b, 0x2a, 0xe7, 0xfe, 0xdb, 0x81, 0xeb,
0x0b, 0xca, 0xf5, 0x25, 0x3b, 0xc1, 0x1d, 0x58, 0xb6, 0x35, 0xc7, 0xc3, 0xa0, 0xb5, 0x17, 0xb7,
0x2d, 0xd2, 0x44, 0xe4, 0x0d, 0x68, 0xf0, 0x48, 0x7a, 0x85, 0xeb, 0xeb, 0x3c, 0x92, 0x7b, 0xda,
0x3c, 0xb7, 0xa1, 0x1d, 0x32, 0xa9, 0xbc, 0x71, 0x12, 0x30, 0xc5, 0x4d, 0x06, 0xd6, 0x68, 0x4b,
0xe3, 0x8e, 0x0c, 0x4a, 0xbf, 0x4c, 0x66, 0x52, 0xf1, 0x91, 0xa7, 0xd8, 0x89, 0x2e, 0xcc, 0x55,
0xfd, 0x32, 0x83, 0x3a, 0x64, 0x27, 0x92, 0xdc, 0x85, 0x4e, 0xa8, 0xdd, 0xee, 0x45, 0xc2, 0x3f,
0xc5, 0x4b, 0x4c, 0x12, 0x2e, 0x23, 0x76, 0xcf, 0x22, 0xdd, 0xdf, 0x2c, 0xc1, 0x8d, 0x85, 0xbd,
0x89, 0x7c, 0x17, 0x56, 0x8b, 0x8a, 0x78, 0xc8, 0x1b, 0x66, 0xf6, 0xf5, 0xa4, 0xa0, 0xd0, 0x0b,
0xf3, 0xe5, 0xff, 0xd8, 0x14, 0xda, 0xb7, 0x2c, 0x08, 0x78, 0x80, 0x5d, 0xa1, 0x41, 0x0d, 0xa0,
0x6b, 0xc1, 0xb1, 0x76, 0x32, 0x0f, 0xb0, 0xe8, 0x37, 0x68, 0x0e, 0x6a, 0xfa, 0xd1, 0x58, 0xeb,
0xd4, 0x32, 0xf4, 0x08, 0x68, 0xfa, 0x94, 0x8f, 0xe2, 0x33, 0x1e, 0xf4, 0xda, 0x86, 0xde, 0x82,
0x64, 0x13, 0xda, 0x43, 0x26, 0x3d, 0x14, 0xeb, 0x8d, 0x65, 0x6f, 0x19, 0x3f, 0xc3, 0x90, 0xc9,
0xbe, 0x46, 0x1d, 0xe9, 0xce, 0x74, 0xed, 0x8c, 0xa7, 0xe2, 0x6d, 0x3e, 0xfc, 0x48, 0xc5, 0xd4,
0x58, 0xf6, 0x3a, 0x58, 0x19, 0x48, 0xf1, 0xd3, 0x01, 0x7e, 0xc1, 0x31, 0x26, 0x1d, 0x4b, 0x95,
0x53, 0xae, 0x20, 0x65, 0x0b, 0x71, 0x96, 0xe4, 0x31, 0xac, 0xdb, 0xde, 0xee, 0xa5, 0xfc, 0x97,
0x63, 0x2e, 0x95, 0xf1, 0x22, 0xb2, 0xf0, 0x5e, 0x17, 0x39, 0x7a, 0x96, 0x84, 0x1a, 0x0a, 0x74,
0xa6, 0xe6, 0xe7, 0x8b, 0xd9, 0x4d, 0x1a, 0x5c, 0x5d, 0xc8, 0x3e, 0xc0, 0xcc, 0xf8, 0x02, 0x36,
0x66, 0xd9, 0xb5, 0x39, 0x14, 0xb7, 0xd7, 0x13, 0xe4, 0xbf, 0x51, 0xe6, 0xa7, 0x48, 0x61, 0xee,
0x5f, 0x2c, 0xc0, 0x28, 0x70, 0x6d, 0xb1, 0x00, 0xa3, 0xc1, 0x6d, 0x68, 0x07, 0x42, 0x26, 0x21,
0xcb, 0x4c, 0x7c, 0xad, 0xa2, 0xeb, 0x5b, 0x16, 0xa7, 0x63, 0xcc, 0x7d, 0x77, 0x3e, 0xdf, 0xf3,
0xc6, 0x3c, 0x3f, 0xdf, 0xcf, 0x05, 0x75, 0x65, 0x4e, 0x50, 0xcf, 0x46, 0x6e, 0xf5, 0x5c, 0xe4,
0xba, 0x4f, 0x60, 0x6d, 0xf6, 0xe2, 0xfd, 0xf1, 0x71, 0x28, 0xfc, 0xc1, 0x90, 0x5d, 0xb2, 0xd6,
0xb8, 0xdf, 0x54, 0x61, 0xb9, 0x34, 0x18, 0xfe, 0x57, 0xbe, 0x36, 0x26, 0xe6, 0x2d, 0x68, 0x25,
0xa9, 0x38, 0x63, 0x8a, 0x7b, 0xa7, 0x3c, 0xb3, 0x7d, 0x0e, 0x2c, 0x4a, 0xd7, 0xed, 0x4d, 0x5d,
0x3b, 0xa5, 0x9f, 0x8a, 0x44, 0xeb, 0x85, 0x79, 0xd9, 0xa6, 0x45, 0x94, 0x6e, 0x7b, 0xbf, 0x88,
0x45, 0x64, 0xb3, 0xb2, 0x41, 0x2d, 0xa4, 0x9b, 0x82, 0x89, 0x55, 0x1e, 0x60, 0xdb, 0x6b, 0xd0,
0x09, 0x3c, 0x4d, 0x9a, 0x7a, 0x31, 0x69, 0x5e, 0x41, 0xd7, 0x7a, 0x57, 0x7a, 0x2a, 0xf6, 0xb4,
0x1c, 0x3b, 0x1b, 0xdc, 0x5d, 0x34, 0xfe, 0x5a, 0xf2, 0xc3, 0xf8, 0x59, 0x2c, 0x22, 0xda, 0x49,
0x4b, 0x30, 0x79, 0x04, 0x8d, 0x7c, 0xe8, 0xb2, 0x43, 0xde, 0xad, 0x05, 0x82, 0xec, 0xb4, 0x27,
0xe9, 0x84, 0x41, 0xcf, 0x56, 0x3c, 0xf2, 0xd3, 0x2c, 0x51, 0x93, 0xa4, 0x9f, 0x22, 0xf4, 0x57,
0x99, 0x70, 0x5f, 0xb1, 0x69, 0xea, 0x4f, 0x11, 0xba, 0x35, 0x59, 0x52, 0x9d, 0xc0, 0xd8, 0x8e,
0xdb, 0x68, 0xb9, 0xce, 0x14, 0xfd, 0x9c, 0x67, 0xd2, 0xfd, 0x9b, 0x03, 0xeb, 0x17, 0xbc, 0xc8,
0xfa, 0xcb, 0x99, 0xf8, 0xeb, 0x26, 0x40, 0x82, 0xb1, 0x81, 0xee, 0x32, 0xfe, 0x6f, 0x1a, 0x8c,
0xf6, 0xd6, 0xc4, 0xe9, 0xd5, 0xa2, 0xd3, 0x2f, 0x28, 0xac, 0xd7, 0xa1, 0xee, 0x0f, 0x99, 0xd2,
0xbd, 0xf3, 0x8a, 0x19, 0x88, 0x34, 0xb8, 0x1b, 0xe8, 0xb8, 0xcd, 0x07, 0xf7, 0x4c, 0x7f, 0x5d,
0x32, 0x8e, 0x9f, 0xe0, 0x76, 0xd1, 0x89, 0x26, 0x7d, 0xeb, 0xe6, 0x32, 0x04, 0xdc, 0xdf, 0x55,
0xa0, 0x3b, 0x1b, 0xce, 0xe4, 0x71, 0x61, 0x29, 0x3a, 0x37, 0x97, 0x2c, 0x68, 0x3c, 0x85, 0x95,
0xe8, 0x2b, 0x68, 0xdb, 0x57, 0x6b, 0xed, 0x64, 0xaf, 0x32, 0x3b, 0x30, 0x2e, 0xce, 0x1f, 0xda,
0x4a, 0x26, 0x67, 0x49, 0x1e, 0x41, 0x3d, 0x9f, 0x6f, 0xaa, 0x18, 0x0f, 0x17, 0xa8, 0x91, 0x8f,
0x3a, 0x39, 0xc7, 0xff, 0xb0, 0x98, 0xb9, 0x9f, 0xc2, 0x0a, 0x7e, 0xd5, 0x0a, 0xd9, 0x3e, 0x70,
0xb9, 0xbc, 0xfe, 0x1c, 0x56, 0x73, 0xc6, 0x97, 0x66, 0xf5, 0x95, 0x94, 0xb3, 0xcb, 0x72, 0x7f,
0x09, 0x1f, 0x69, 0xee, 0xbe, 0xaf, 0xc4, 0x99, 0x50, 0xd9, 0x80, 0x47, 0x8a, 0xa7, 0x17, 0xf0,
0x77, 0xa1, 0x2a, 0x02, 0x63, 0xde, 0x36, 0xd5, 0x47, 0x77, 0xdb, 0xd4, 0xa6, 0xb2, 0x84, 0xbe,
0xef, 0x73, 0x4c, 0x82, 0xcb, 0x4a, 0xd9, 0x31, 0x41, 0x5e, 0x96, 0xb2, 0x2d, 0xe4, 0x48, 0x48,
0xf9, 0x1e, 0x62, 0xbe, 0x76, 0xa0, 0xad, 0xe5, 0x3c, 0x89, 0xe3, 0xd3, 0x11, 0x4b, 0x4f, 0x17,
0x33, 0x8e, 0xd3, 0xd0, 0x9a, 0x41, 0x1f, 0x27, 0xf3, 0x5d, 0xb5, 0x30, 0x7c, 0xae, 0x43, 0x13,
0xab, 0xb6, 0xa7, 0x69, 0x4d, 0x56, 0x34, 0x10, 0x71, 0x94, 0x86, 0xc5, 0xf6, 0x7d, 0xa5, 0xdc,
0xbe, 0x6f, 0x02, 0x04, 0x3c, 0xe4, 0x7a, 0x0c, 0x62, 0x0a, 0xb3, 0xa2, 0x46, 0x9b, 0x16, 0xd3,
0x57, 0xee, 0x33, 0x13, 0xfc, 0x83, 0x90, 0xb3, 0xf4, 0xa9, 0x90, 0x2a, 0x4e, 0xb3, 0x62, 0x8e,
0x39, 0xa5, 0x1c, 0xbb, 0x09, 0xe0, 0x6b, 0x42, 0x23, 0xab, 0x62, 0x64, 0x59, 0x4c, 0x5f, 0xb9,
0x7f, 0x75, 0x80, 0x68, 0x61, 0x76, 0x13, 0xde, 0x17, 0xbe, 0x1a, 0xa7, 0x7c, 0xee, 0x24, 0x5d,
0x58, 0x55, 0x2a, 0x0b, 0x56, 0x95, 0x2a, 0xfe, 0xb6, 0x71, 0x6e, 0x55, 0xa9, 0x21, 0x3a, 0x5f,
0x55, 0xd6, 0xa1, 0x89, 0xfd, 0x0c, 0x77, 0x95, 0x2b, 0xf8, 0x09, 0x77, 0x95, 0x83, 0xb9, 0xbb,
0xca, 0x12, 0x12, 0x2c, 0xd8, 0x55, 0xea, 0xc5, 0x5d, 0x65, 0x08, 0xd7, 0xce, 0xbf, 0x44, 0x2e,
0x5e, 0xc7, 0x7e, 0x08, 0x8d, 0xc4, 0x12, 0xd9, 0x64, 0xdf, 0x28, 0xe7, 0x59, 0x59, 0x12, 0x9d,
0x50, 0xbb, 0x7f, 0xac, 0xc0, 0x55, 0x4d, 0xf0, 0x86, 0x85, 0x21, 0x57, 0x17, 0x37, 0xf0, 0x1e,
0xd4, 0x59, 0x10, 0xa4, 0x5c, 0xca, 0xdc, 0x6a, 0x16, 0xd4, 0xf6, 0x79, 0x87, 0x02, 0xd0, 0x6c,
0x0d, 0x6a, 0x21, 0x6d, 0x7b, 0xed, 0x3b, 0xb4, 0x5a, 0x83, 0xe2, 0x59, 0xe3, 0x70, 0xad, 0x30,
0xf5, 0x13, 0xcf, 0x5a, 0xb2, 0xf6, 0xbd, 0x1e, 0x0a, 0xcc, 0x56, 0x9c, 0x83, 0x9a, 0x3a, 0x61,
0x6a, 0x68, 0x67, 0x4f, 0x3c, 0xeb, 0x5e, 0x32, 0x29, 0xe1, 0xb8, 0xe3, 0xb5, 0x8b, 0x35, 0x3d,
0xf7, 0x77, 0xb3, 0xe0, 0x6f, 0xfd, 0x1e, 0xbd, 0x88, 0x63, 0x5f, 0x6a, 0x52, 0x03, 0xa0, 0x57,
0x45, 0x10, 0xf0, 0xc8, 0x36, 0x24, 0x0b, 0x2d, 0x1e, 0x46, 0xdd, 0x97, 0x26, 0xc2, 0x4a, 0xc6,
0x92, 0xe4, 0x53, 0x68, 0xd8, 0x9a, 0x97, 0x57, 0xeb, 0xf5, 0xb2, 0xf5, 0x4b, 0xf4, 0x74, 0x42,
0xec, 0xfe, 0xd9, 0x31, 0xe1, 0x7f, 0xc0, 0xce, 0x78, 0xd0, 0xb7, 0xb6, 0x2c, 0x58, 0xd9, 0x29,
0x5b, 0x79, 0xde, 0xd2, 0xbd, 0x01, 0xcd, 0xb7, 0xec, 0x2c, 0x1e, 0xa7, 0x42, 0x71, 0x6b, 0xfc,
0x29, 0x42, 0x77, 0x32, 0x7f, 0xc8, 0x04, 0xee, 0x7a, 0x35, 0x74, 0x65, 0x1d, 0xe1, 0xdd, 0xe0,
0x82, 0x94, 0xbd, 0x0d, 0x6d, 0x33, 0x7d, 0x79, 0xc5, 0xc8, 0x6c, 0x19, 0x1c, 0x8e, 0x87, 0xee,
0xef, 0x1d, 0xf8, 0x70, 0xee, 0x3c, 0xb0, 0x20, 0x72, 0x66, 0xbb, 0xa3, 0x79, 0x41, 0xa9, 0x3b,
0xee, 0xc0, 0xad, 0xa1, 0x29, 0x00, 0x1e, 0x4b, 0xfd, 0xa1, 0x38, 0xe3, 0x9e, 0x1c, 0x27, 0x49,
0x9c, 0x2a, 0x8f, 0x47, 0xec, 0x38, 0xb4, 0xb3, 0x60, 0x83, 0x6e, 0x58, 0xb2, 0xbe, 0xa1, 0x3a,
0x30, 0x44, 0x3b, 0x86, 0xc6, 0xfd, 0x93, 0x63, 0x5a, 0xc7, 0xa1, 0x1e, 0xe6, 0xf5, 0x7a, 0xc0,
0xd3, 0x4b, 0xae, 0x9f, 0x8f, 0x61, 0xc9, 0xee, 0x03, 0xfa, 0x9e, 0xce, 0xec, 0x0c, 0x55, 0x10,
0xb8, 0x75, 0x38, 0xdd, 0x14, 0xa8, 0x65, 0x72, 0x3f, 0x83, 0x56, 0x01, 0x4d, 0x5a, 0x50, 0x3f,
0xda, 0x7b, 0xbe, 0xf7, 0xea, 0xcd, 0x5e, 0xf7, 0x03, 0x0d, 0x1c, 0xd2, 0xa3, 0x83, 0xc3, 0x9d,
0xed, 0xae, 0x43, 0xae, 0xc2, 0xf2, 0xd1, 0x1e, 0x82, 0x6f, 0x5e, 0xd1, 0xc3, 0xa7, 0x3f, 0xed,
0x56, 0xdc, 0xaf, 0xab, 0x66, 0x96, 0x7e, 0x5d, 0xd8, 0x55, 0xec, 0x60, 0xb3, 0x40, 0x79, 0x02,
0xb5, 0xb7, 0x69, 0x3c, 0xca, 0x43, 0x41, 0x9f, 0xf5, 0x83, 0x54, 0x6c, 0x6b, 0x76, 0x45, 0xc5,
0x3a, 0x34, 0xfc, 0xa1, 0x8e, 0xbc, 0xe8, 0x24, 0x9f, 0x63, 0xa6, 0x08, 0xed, 0x12, 0x3b, 0xfd,
0x99, 0x72, 0x6a, 0x57, 0xc4, 0x09, 0xae, 0x8f, 0x3f, 0x53, 0xa4, 0x5c, 0x26, 0x71, 0x24, 0xf3,
0xb4, 0x9c, 0xc0, 0xba, 0x16, 0xa7, 0x3c, 0x09, 0x85, 0x61, 0x36, 0x21, 0xd2, 0xb4, 0x98, 0xbe,
0x22, 0x7c, 0xfe, 0x4e, 0xd6, 0x40, 0xcb, 0x7e, 0xaf, 0x6c, 0xd9, 0x39, 0xaf, 0xde, 0x7a, 0x7d,
0x6e, 0x6b, 0x9b, 0xbb, 0xc9, 0x19, 0x1f, 0x36, 0x27, 0x0d, 0xfc, 0x27, 0x40, 0xce, 0x73, 0x9e,
0xf3, 0xc5, 0xfe, 0xce, 0xde, 0xf6, 0xee, 0xde, 0x57, 0x5d, 0x87, 0xb4, 0xa1, 0xd1, 0x1f, 0x0c,
0x76, 0xf6, 0xb5, 0x67, 0x2a, 0x1a, 0xda, 0xde, 0x19, 0xbc, 0xd8, 0xdd, 0xdb, 0xd9, 0xee, 0x56,
0x35, 0x34, 0xe8, 0xef, 0x0d, 0x76, 0x5e, 0xec, 0x6c, 0x77, 0x6b, 0xee, 0xbf, 0x1c, 0xd3, 0xd9,
0x07, 0xa5, 0x95, 0x69, 0x9b, 0xfb, 0x42, 0x2e, 0xfe, 0xc5, 0x65, 0x03, 0x9a, 0xd6, 0x9e, 0xbb,
0x79, 0xa4, 0x4d, 0x11, 0xe4, 0xe7, 0xb0, 0x12, 0x58, 0x7e, 0xaf, 0x14, 0x79, 0x0f, 0x67, 0x67,
0xa4, 0x79, 0x57, 0x6e, 0xe5, 0x07, 0x6b, 0x9e, 0x4e, 0x50, 0x82, 0xdd, 0xfb, 0xd0, 0x29, 0x53,
0x94, 0x1e, 0xfb, 0x41, 0xe9, 0xb1, 0x8e, 0xfb, 0x8d, 0x03, 0x2b, 0x33, 0xbf, 0x24, 0x2f, 0xee,
0x36, 0xb3, 0xcb, 0x61, 0xe5, 0xdc, 0x72, 0x48, 0xee, 0x03, 0x29, 0x92, 0x78, 0xc5, 0x29, 0xbb,
0x5b, 0x20, 0x34, 0xdb, 0x66, 0xb1, 0x7d, 0xd5, 0xde, 0xab, 0x7d, 0x49, 0x00, 0xca, 0xde, 0xd9,
0x51, 0xaf, 0xd8, 0xd6, 0x9d, 0x72, 0x5b, 0x7f, 0x0e, 0x2d, 0xfb, 0xaf, 0x90, 0x43, 0xdd, 0x7b,
0x2a, 0x68, 0xe7, 0x6f, 0x4f, 0x2f, 0xe9, 0x4f, 0xff, 0x79, 0xf2, 0xd2, 0xfe, 0xef, 0xc4, 0x0a,
0xdd, 0xd2, 0x0c, 0xb4, 0xc8, 0xed, 0xfe, 0xc1, 0x81, 0x8e, 0xd6, 0xaa, 0x70, 0xf3, 0x0f, 0xa0,
0x95, 0x4e, 0xa0, 0xbc, 0x0b, 0xac, 0x4e, 0xe5, 0x4f, 0x49, 0x69, 0x91, 0x90, 0x3c, 0x80, 0x55,
0x39, 0x3e, 0xce, 0x3b, 0xc9, 0x33, 0x19, 0x47, 0x4f, 0x32, 0xc5, 0xf3, 0xfe, 0x3a, 0xf7, 0x1b,
0xb9, 0x0f, 0x57, 0xf3, 0xa5, 0x6b, 0xca, 0x60, 0x36, 0xd1, 0xf3, 0x1f, 0x9e, 0x2c, 0xff, 0xac,
0xb5, 0xf5, 0xc9, 0xa3, 0x5c, 0x91, 0xe3, 0x25, 0x3c, 0x3d, 0xfc, 0x4f, 0x00, 0x00, 0x00, 0xff,
0xff, 0xa8, 0x44, 0x31, 0x9e, 0x5d, 0x1a, 0x00, 0x00,
}

View File

@ -297,5 +297,4 @@ message SyncRawMessage {
// we need these to be able to login
bytes subAccountsJsonBytes = 2;
bytes settingsJsonBytes = 3;
bytes nodeConfigJsonBytes = 4;
}

View File

@ -5,7 +5,6 @@ import (
"crypto/ecdsa"
"crypto/tls"
"crypto/x509"
"encoding/json"
"encoding/pem"
"fmt"
"io"
@ -76,7 +75,7 @@ func NewPairingClient(backend *api.GethStatusBackend, c *ConnectionParams, confi
return nil, err
}
rmpm, err := NewRawMessagePayloadManager(logutils.ZapLogger().Named("Client"), pm.accountPayload, c.aesKey, backend, config.KeystorePath)
rmpm, err := NewRawMessagePayloadManager(logutils.ZapLogger().Named("Client"), pm.accountPayload, c.aesKey, backend, config.GetNodeConfig(), config.GetSettingCurrentNetwork())
if err != nil {
return nil, err
}
@ -280,19 +279,18 @@ func StartUpPairingClient(backend *api.GethStatusBackend, cs, configJSON string)
}
func setupClient(backend *api.GethStatusBackend, cs string, configJSON string) (*Client, error) {
var conf PayloadSourceConfig
err := json.Unmarshal([]byte(configJSON), &conf)
if err != nil {
return nil, err
}
ccp := new(ConnectionParams)
err = ccp.FromString(cs)
err := ccp.FromString(cs)
if err != nil {
return nil, err
}
c, err := NewPairingClient(backend, ccp, &AccountPayloadManagerConfig{backend.GetMultiaccountDB(), &conf})
conf, err := NewPayloadSourceForClient(configJSON, ccp.serverMode)
if err != nil {
return nil, err
}
c, err := NewPairingClient(backend, ccp, &AccountPayloadManagerConfig{backend.GetMultiaccountDB(), conf})
if err != nil {
return nil, err
}

View File

@ -118,11 +118,7 @@ func (tpsc *TestPairingServerComponents) SetupPairingServerComponents(t *testing
EK: tpsc.EphemeralAES,
Cert: &tpsc.Cert,
Hostname: tpsc.OutboundIP.String(),
AccountPayloadManagerConfig: &AccountPayloadManagerConfig{
PayloadSourceConfig: &PayloadSourceConfig{
KeystorePath: "",
},
}})
AccountPayloadManagerConfig: &AccountPayloadManagerConfig{}})
require.NoError(t, err)
}

View File

@ -9,20 +9,23 @@ import (
"os"
"path/filepath"
"github.com/status-im/status-go/api"
"github.com/golang/protobuf/proto"
"go.uber.org/zap"
"github.com/status-im/status-go/account/generator"
"github.com/status-im/status-go/api"
"github.com/status-im/status-go/eth-node/keystore"
"github.com/status-im/status-go/multiaccounts"
"github.com/status-im/status-go/params"
"github.com/status-im/status-go/protocol/common"
"github.com/status-im/status-go/protocol/protobuf"
)
var (
ErrKeyFileAlreadyExists = errors.New("key file already exists")
ErrKeyUIDEmptyAsSender = errors.New("keyUID must be provided as sender")
ErrNodeConfigNilAsReceiver = errors.New("node config must be provided as receiver")
ErrPayloadSourceConfigBothSet = errors.New("payloadSourceSenderConfig and payloadSourceReceiverConfig cannot be both set")
)
// PayloadManager is the interface for PayloadManagers and wraps the basic functions for fulfilling payload management
@ -49,29 +52,123 @@ type PayloadManager interface {
LockPayload()
}
type PayloadSourceSenderConfig struct {
KeyUID string `json:"keyUID"`
Password string `json:"password"`
}
type PayloadSourceReceiverConfig struct {
KDFIterations int `json:"kdfIterations"`
NodeConfig *params.NodeConfig
// this field already exists within params.NodeConfig, but it doesn't support json marshalling, so we need to duplicate it here
RootDataDir string
// corresponding to field current_network from table settings, so that we can override current network from sender
SettingCurrentNetwork string
}
// PayloadSourceConfig represents location and access data of the pairing payload
// ONLY available from the application client
type PayloadSourceConfig struct {
// required
// required for sender and receiver, there are some different cases:
// 1. for sender, KeystorePath must end with keyUID
// 2. for receiver, KeystorePath must not end with keyUID (because keyUID is not known yet)
KeystorePath string `json:"keystorePath"`
// following 2 fields r optional.
// optional cases:
// 1. server mode is Receiving and server side doesn't contain this info
// 2. server mode is Sending and client side doesn't contain this info
// they are required in other cases
KeyUID string `json:"keyUID"`
Password string `json:"password"`
*PayloadSourceSenderConfig
*PayloadSourceReceiverConfig
// Timeout the number of milliseconds after which the pairing server will automatically terminate
Timeout uint `json:"timeout"`
}
type payloadSourceUnmarshalCallback func(conf *PayloadSourceConfig) (*PayloadSourceConfig, error)
func NewPayloadSourceForClient(configJSON string, mode Mode) (*PayloadSourceConfig, error) {
return unmarshalPayloadSourceConfig(configJSON, func(conf *PayloadSourceConfig) (*PayloadSourceConfig, error) {
if mode == Sending && conf.NodeConfig == nil {
return nil, ErrNodeConfigNilAsReceiver
}
if mode == Receiving && conf.KeyUID == "" {
return nil, ErrKeyUIDEmptyAsSender
}
return updateRootDataDirToNodeConfig(conf)
})
}
func NewPayloadSourceForServer(configJSON string, mode Mode) (*PayloadSourceConfig, error) {
return unmarshalPayloadSourceConfig(configJSON, func(conf *PayloadSourceConfig) (*PayloadSourceConfig, error) {
if mode == Sending && conf.KeyUID == "" {
return nil, ErrKeyUIDEmptyAsSender
}
if mode == Receiving && conf.NodeConfig == nil {
return nil, ErrNodeConfigNilAsReceiver
}
return updateRootDataDirToNodeConfig(conf)
})
}
func updateRootDataDirToNodeConfig(conf *PayloadSourceConfig) (*PayloadSourceConfig, error) {
if conf.PayloadSourceReceiverConfig != nil && conf.PayloadSourceReceiverConfig.NodeConfig != nil {
conf.NodeConfig.RootDataDir = conf.RootDataDir
}
return conf, nil
}
func unmarshalPayloadSourceConfig(configJSON string, successCallback payloadSourceUnmarshalCallback) (*PayloadSourceConfig, error) {
var conf = PayloadSourceConfig{}
err := json.Unmarshal([]byte(configJSON), &conf)
if err != nil {
return nil, err
}
return successCallback(&conf)
}
// AccountPayloadManagerConfig represents the initialisation parameters required for a AccountPayloadManager
type AccountPayloadManagerConfig struct {
DB *multiaccounts.Database
*PayloadSourceConfig
}
func (a *AccountPayloadManagerConfig) GetNodeConfig() *params.NodeConfig {
if a.PayloadSourceConfig != nil && a.PayloadSourceConfig.PayloadSourceReceiverConfig != nil {
return a.NodeConfig
}
return nil
}
func (a *AccountPayloadManagerConfig) GetSettingCurrentNetwork() string {
if a.PayloadSourceConfig != nil && a.PayloadSourceConfig.PayloadSourceReceiverConfig != nil {
return a.SettingCurrentNetwork
}
return ""
}
func (a *AccountPayloadManagerConfig) GetPayloadSourceSenderConfig() *PayloadSourceSenderConfig {
if a.PayloadSourceConfig != nil && a.PayloadSourceConfig.PayloadSourceSenderConfig != nil {
return a.PayloadSourceSenderConfig
}
return nil
}
func (a *AccountPayloadManagerConfig) GetPayloadSourceReceiverConfig() *PayloadSourceReceiverConfig {
if a.PayloadSourceConfig != nil && a.PayloadSourceConfig.PayloadSourceReceiverConfig != nil {
return a.PayloadSourceReceiverConfig
}
return nil
}
func (a *AccountPayloadManagerConfig) GetKeystorePath() string {
if a.PayloadSourceConfig != nil {
return a.KeystorePath
}
return ""
}
func (a *AccountPayloadManagerConfig) GetTimeout() uint {
if a.PayloadSourceConfig != nil {
return a.Timeout
}
return 0
}
// AccountPayloadManager is responsible for the whole lifecycle of a AccountPayload
type AccountPayloadManager struct {
logger *zap.Logger
@ -93,13 +190,17 @@ func NewAccountPayloadManager(aesKey []byte, config *AccountPayloadManagerConfig
// A new SHARED AccountPayload
p := new(AccountPayload)
accountPayloadRepository, err := NewAccountPayloadRepository(p, config)
if err != nil {
return nil, err
}
return &AccountPayloadManager{
logger: l,
accountPayload: p,
PayloadEncryptionManager: pem,
accountPayloadMarshaller: NewPairingPayloadMarshaller(p, l),
payloadRepository: NewAccountPayloadRepository(p, config),
payloadRepository: accountPayloadRepository,
}, nil
}
@ -357,22 +458,32 @@ type AccountPayloadRepository struct {
multiaccountsDB *multiaccounts.Database
keystorePath, keyUID string
kdfIterations int
}
func NewAccountPayloadRepository(p *AccountPayload, config *AccountPayloadManagerConfig) *AccountPayloadRepository {
func NewAccountPayloadRepository(p *AccountPayload, config *AccountPayloadManagerConfig) (*AccountPayloadRepository, error) {
ppr := &AccountPayloadRepository{
AccountPayload: p,
}
if config == nil {
return ppr
return ppr, nil
}
ppr.multiaccountsDB = config.DB
ppr.keystorePath = config.KeystorePath
if config.GetPayloadSourceSenderConfig() != nil && config.GetPayloadSourceReceiverConfig() != nil {
return nil, ErrPayloadSourceConfigBothSet
}
if config.GetPayloadSourceSenderConfig() != nil {
ppr.keyUID = config.KeyUID
ppr.password = config.Password
return ppr
} else if config.GetPayloadSourceReceiverConfig() != nil {
ppr.kdfIterations = config.KDFIterations
}
ppr.keystorePath = config.GetKeystorePath()
return ppr, nil
}
func (apr *AccountPayloadRepository) LoadFromSource() error {
@ -515,6 +626,7 @@ func (apr *AccountPayloadRepository) storeKeys(keyStorePath string) error {
}
func (apr *AccountPayloadRepository) storeMultiAccount() error {
apr.multiaccount.KDFIterations = apr.kdfIterations
return apr.multiaccountsDB.SaveAccount(*apr.multiaccount)
}
@ -526,7 +638,7 @@ type RawMessagePayloadManager struct {
payloadRepository *RawMessageRepository
}
func NewRawMessagePayloadManager(logger *zap.Logger, accountPayload *AccountPayload, aesKey []byte, backend *api.GethStatusBackend, keystorePath string) (*RawMessagePayloadManager, error) {
func NewRawMessagePayloadManager(logger *zap.Logger, accountPayload *AccountPayload, aesKey []byte, backend *api.GethStatusBackend, nodeConfig *params.NodeConfig, settingCurrentNetwork string) (*RawMessagePayloadManager, error) {
l := logger.Named("RawMessagePayloadManager")
pem, err := NewPayloadEncryptionManager(aesKey, l)
if err != nil {
@ -536,7 +648,7 @@ func NewRawMessagePayloadManager(logger *zap.Logger, accountPayload *AccountPayl
logger: l,
accountPayload: accountPayload,
PayloadEncryptionManager: pem,
payloadRepository: NewRawMessageRepository(backend, keystorePath, accountPayload),
payloadRepository: NewRawMessageRepository(backend, accountPayload, nodeConfig, settingCurrentNetwork),
}, nil
}
@ -565,16 +677,18 @@ func (r *RawMessagePayloadManager) ResetPayload() {
type RawMessageRepository struct {
payload []byte
syncRawMessageHandler *SyncRawMessageHandler
keystorePath string
accountPayload *AccountPayload
nodeConfig *params.NodeConfig
settingCurrentNetwork string
}
func NewRawMessageRepository(backend *api.GethStatusBackend, keystorePath string, accountPayload *AccountPayload) *RawMessageRepository {
func NewRawMessageRepository(backend *api.GethStatusBackend, accountPayload *AccountPayload, config *params.NodeConfig, settingCurrentNetwork string) *RawMessageRepository {
return &RawMessageRepository{
syncRawMessageHandler: NewSyncRawMessageHandler(backend),
keystorePath: keystorePath,
payload: make([]byte, 0),
accountPayload: accountPayload,
nodeConfig: config,
settingCurrentNetwork: settingCurrentNetwork,
}
}
@ -596,5 +710,5 @@ func (r *RawMessageRepository) StoreToSource() error {
if accountPayload == nil || accountPayload.multiaccount == nil {
return fmt.Errorf("no known multiaccount when storing raw messages")
}
return r.syncRawMessageHandler.HandleRawMessage(accountPayload.multiaccount, accountPayload.password, r.keystorePath, r.payload)
return r.syncRawMessageHandler.HandleRawMessage(accountPayload.multiaccount, accountPayload.password, r.nodeConfig, r.settingCurrentNetwork, r.payload)
}

View File

@ -136,18 +136,22 @@ func (pms *PayloadMarshallerSuite) SetupTest() {
DB: db1,
PayloadSourceConfig: &PayloadSourceConfig{
KeystorePath: keystore1,
PayloadSourceSenderConfig: &PayloadSourceSenderConfig{
KeyUID: keyUID,
Password: password,
},
},
}
pms.config2 = &AccountPayloadManagerConfig{
DB: db2,
PayloadSourceConfig: &PayloadSourceConfig{
KeystorePath: keystore2,
PayloadSourceSenderConfig: &PayloadSourceSenderConfig{
KeyUID: keyUID,
Password: password,
},
},
}
}
@ -160,8 +164,9 @@ func (pms *PayloadMarshallerSuite) TestPayloadMarshaller_LoadPayloads() {
pp := new(AccountPayload)
// Make and LoadFromSource PairingPayloadRepository 1
ppr := NewAccountPayloadRepository(pp, pms.config1)
err := ppr.LoadFromSource()
ppr, err := NewAccountPayloadRepository(pp, pms.config1)
pms.Require().NoError(err)
err = ppr.LoadFromSource()
pms.Require().NoError(err)
// TEST PairingPayloadRepository 1 LoadFromSource()
@ -193,8 +198,9 @@ func (pms *PayloadMarshallerSuite) TestPayloadMarshaller_MarshalToProtobuf() {
pp := new(AccountPayload)
// Make and LoadFromSource PairingPayloadRepository 1
ppr := NewAccountPayloadRepository(pp, pms.config1)
err := ppr.LoadFromSource()
ppr, err := NewAccountPayloadRepository(pp, pms.config1)
pms.Require().NoError(err)
err = ppr.LoadFromSource()
pms.Require().NoError(err)
// Make and Load PairingPayloadMarshaller 1
@ -222,8 +228,9 @@ func (pms *PayloadMarshallerSuite) TestPayloadMarshaller_UnmarshalProtobuf() {
pp := new(AccountPayload)
// Make and LoadFromSource PairingPayloadRepository 1
ppr := NewAccountPayloadRepository(pp, pms.config1)
err := ppr.LoadFromSource()
ppr, err := NewAccountPayloadRepository(pp, pms.config1)
pms.Require().NoError(err)
err = ppr.LoadFromSource()
pms.Require().NoError(err)
// Make and Load PairingPayloadMarshaller 1
@ -275,8 +282,9 @@ func (pms *PayloadMarshallerSuite) TestPayloadMarshaller_StorePayloads() {
pp := new(AccountPayload)
// Make and LoadFromSource PairingPayloadRepository 1
ppr := NewAccountPayloadRepository(pp, pms.config1)
err := ppr.LoadFromSource()
ppr, err := NewAccountPayloadRepository(pp, pms.config1)
pms.Require().NoError(err)
err = ppr.LoadFromSource()
pms.Require().NoError(err)
// Make and Load PairingPayloadMarshaller 1
@ -295,8 +303,8 @@ func (pms *PayloadMarshallerSuite) TestPayloadMarshaller_StorePayloads() {
pms.Require().NoError(err)
// Make and Load PairingPayloadRepository 2
ppr2 := NewAccountPayloadRepository(pp2, pms.config2)
ppr2, err := NewAccountPayloadRepository(pp2, pms.config2)
require.NoError(pms.T(), err)
err = ppr2.StoreToSource()
pms.Require().NoError(err)

View File

@ -5,17 +5,13 @@ import (
"encoding/json"
"fmt"
"path/filepath"
"strings"
"github.com/google/uuid"
"github.com/status-im/status-go/multiaccounts/settings"
"github.com/golang/protobuf/proto"
"github.com/status-im/status-go/api"
"github.com/status-im/status-go/multiaccounts"
"github.com/status-im/status-go/multiaccounts/accounts"
"github.com/status-im/status-go/multiaccounts/settings"
"github.com/status-im/status-go/params"
"github.com/status-im/status-go/protocol/protobuf"
)
@ -81,45 +77,26 @@ func (s *SyncRawMessageHandler) PrepareRawMessage(keyUID string) ([]byte, error)
return nil, err
}
nodeConfig := s.backend.StatusNode().Config()
dataDir := nodeConfig.DataDir
disabledDataDir := nodeConfig.ShhextConfig.BackupDisabledDataDir
defer func() {
// restore data dir
nodeConfig.DataDir = dataDir
nodeConfig.ShhextConfig.BackupDisabledDataDir = disabledDataDir
}()
nodeConfig.DataDir = strings.Replace(dataDir, nodeConfig.RootDataDir, "", 1)
nodeConfig.ShhextConfig.BackupDisabledDataDir = strings.Replace(disabledDataDir, nodeConfig.RootDataDir, "", 1)
if syncRawMessage.NodeConfigJsonBytes, err = json.Marshal(nodeConfig); err != nil {
return nil, err
}
return proto.Marshal(syncRawMessage)
}
func (s *SyncRawMessageHandler) HandleRawMessage(account *multiaccounts.Account, password, keystorePath string, payload []byte) error {
rawMessages, subAccounts, setting, nodeConfig, err := s.unmarshalSyncRawMessage(payload)
func (s *SyncRawMessageHandler) HandleRawMessage(account *multiaccounts.Account, password string, nodeConfig *params.NodeConfig, settingCurrentNetwork string, payload []byte) error {
rawMessages, subAccounts, setting, err := s.unmarshalSyncRawMessage(payload)
if err != nil {
return err
}
newKeystoreDir := filepath.Join(keystorePath, account.KeyUID)
s.backend.UpdateRootDataDir(nodeConfig.RootDataDir)
// because client don't know keyUID before received data, we need help client to update keystore dir
newKeystoreDir := filepath.Join(nodeConfig.KeyStoreDir, account.KeyUID)
nodeConfig.KeyStoreDir = newKeystoreDir
accountManager := s.backend.AccountManager()
err = accountManager.InitKeystore(newKeystoreDir)
err = accountManager.InitKeystore(filepath.Join(nodeConfig.RootDataDir, newKeystoreDir))
if err != nil {
return err
}
//TODO root data dir should be passed from client, following is a temporary solution
nodeConfig.RootDataDir = filepath.Dir(keystorePath)
nodeConfig.KeyStoreDir = filepath.Join(filepath.Base(keystorePath), account.KeyUID)
installationID := uuid.New().String()
nodeConfig.ShhextConfig.InstallationID = installationID
setting.InstallationID = installationID
//TODO we need a better way(e.g. pass from client when doing local pair?) to handle this, following is a temporary solution
nodeConfig.LogDir = nodeConfig.RootDataDir
nodeConfig.LogFile = "geth.log"
setting.InstallationID = nodeConfig.ShhextConfig.InstallationID
setting.CurrentNetwork = settingCurrentNetwork
err = s.backend.StartNodeWithAccountAndInitialConfig(*account, password, *setting, nodeConfig, subAccounts)
if err != nil {
@ -133,28 +110,23 @@ func (s *SyncRawMessageHandler) HandleRawMessage(account *multiaccounts.Account,
return messenger.HandleSyncRawMessages(rawMessages)
}
func (s *SyncRawMessageHandler) unmarshalSyncRawMessage(payload []byte) ([]*protobuf.RawMessage, []*accounts.Account, *settings.Settings, *params.NodeConfig, error) {
func (s *SyncRawMessageHandler) unmarshalSyncRawMessage(payload []byte) ([]*protobuf.RawMessage, []*accounts.Account, *settings.Settings, error) {
var (
syncRawMessage protobuf.SyncRawMessage
subAccounts []*accounts.Account
setting *settings.Settings
nodeConfig *params.NodeConfig
)
err := proto.Unmarshal(payload, &syncRawMessage)
if err != nil {
return nil, nil, nil, nil, err
return nil, nil, nil, err
}
err = json.Unmarshal(syncRawMessage.SubAccountsJsonBytes, &subAccounts)
if err != nil {
return nil, nil, nil, nil, err
return nil, nil, nil, err
}
err = json.Unmarshal(syncRawMessage.SettingsJsonBytes, &setting)
if err != nil {
return nil, nil, nil, nil, err
return nil, nil, nil, err
}
err = json.Unmarshal(syncRawMessage.NodeConfigJsonBytes, &nodeConfig)
if err != nil {
return nil, nil, nil, nil, err
}
return syncRawMessage.RawMessages, subAccounts, setting, nodeConfig, nil
return syncRawMessage.RawMessages, subAccounts, setting, nil
}

View File

@ -5,17 +5,15 @@ import (
"crypto/elliptic"
"crypto/rand"
"crypto/tls"
"encoding/json"
"fmt"
"net"
"time"
"github.com/status-im/status-go/api"
"github.com/status-im/status-go/server"
"github.com/gorilla/sessions"
"github.com/status-im/status-go/api"
"github.com/status-im/status-go/logutils"
"github.com/status-im/status-go/server"
)
type Server struct {
@ -61,7 +59,8 @@ func makeCookieStore() (*sessions.CookieStore, error) {
// NewPairingServer returns a *Server init from the given *Config
func NewPairingServer(backend *api.GethStatusBackend, config *Config) (*Server, error) {
logger := logutils.ZapLogger().Named("Server")
pm, err := NewAccountPayloadManager(config.EK, config.AccountPayloadManagerConfig, logger)
accountPayloadManagerConfig := config.AccountPayloadManagerConfig
pm, err := NewAccountPayloadManager(config.EK, accountPayloadManagerConfig, logger)
if err != nil {
return nil, err
}
@ -71,7 +70,7 @@ func NewPairingServer(backend *api.GethStatusBackend, config *Config) (*Server,
return nil, err
}
rmpm, err := NewRawMessagePayloadManager(logger, pm.accountPayload, config.EK, backend, config.KeystorePath)
rmpm, err := NewRawMessagePayloadManager(logger, pm.accountPayload, config.EK, backend, accountPayloadManagerConfig.GetNodeConfig(), accountPayloadManagerConfig.GetSettingCurrentNetwork())
if err != nil {
return nil, err
}
@ -89,7 +88,7 @@ func NewPairingServer(backend *api.GethStatusBackend, config *Config) (*Server,
cookieStore: cs,
rawMessagePayloadManager: rmpm,
}
s.SetTimeout(config.Timeout)
s.SetTimeout(config.GetTimeout())
return s, nil
}
@ -189,13 +188,12 @@ func MakeFullPairingServer(backend *api.GethStatusBackend, mode Mode, storeConfi
// StartUpPairingServer generates a Server, starts the pairing server in the correct mode
// and returns the ConnectionParams string to allow a Client to make a successful connection.
func StartUpPairingServer(backend *api.GethStatusBackend, mode Mode, configJSON string) (string, error) {
var conf PayloadSourceConfig
err := json.Unmarshal([]byte(configJSON), &conf)
conf, err := NewPayloadSourceForServer(configJSON, mode)
if err != nil {
return "", err
}
ps, err := MakeFullPairingServer(backend, mode, &conf)
ps, err := MakeFullPairingServer(backend, mode, conf)
if err != nil {
return "", err
}

View File

@ -74,6 +74,10 @@ func (s *PairingServerSuite) TestMultiTimeout() {
s.Require().False(s.PS.IsRunning())
}
func newAccountPayloadManagerConfig() *AccountPayloadManagerConfig {
return &AccountPayloadManagerConfig{}
}
func (s *PairingServerSuite) TestPairingServer_StartPairing() {
// Replace PairingServer.PayloadManager with a MockEncryptOnlyPayloadManager
pm, err := NewMockEncryptOnlyPayloadManager(s.EphemeralAES)
@ -101,9 +105,7 @@ func (s *PairingServerSuite) TestPairingServer_StartPairing() {
err = ccp.FromString(qr)
s.Require().NoError(err)
c, err := NewPairingClient(nil, ccp, &AccountPayloadManagerConfig{
PayloadSourceConfig: &PayloadSourceConfig{KeystorePath: ""},
})
c, err := NewPairingClient(nil, ccp, newAccountPayloadManagerConfig())
s.Require().NoError(err)
// Compare cert values
@ -164,9 +166,7 @@ func (s *PairingServerSuite) sendingSetup() *Client {
err = ccp.FromString(qr)
s.Require().NoError(err)
c, err := NewPairingClient(nil, ccp, &AccountPayloadManagerConfig{
PayloadSourceConfig: &PayloadSourceConfig{KeystorePath: ""},
})
c, err := NewPairingClient(nil, ccp, newAccountPayloadManagerConfig())
s.Require().NoError(err)
// Replace PairingClient.PayloadManager with a MockEncryptOnlyPayloadManager
@ -277,9 +277,7 @@ func (s *PairingServerSuite) TestGetOutboundIPWithFullServerE2e() {
err = ccp.FromString(qr)
s.Require().NoError(err)
c, err := NewPairingClient(nil, ccp, &AccountPayloadManagerConfig{
PayloadSourceConfig: &PayloadSourceConfig{KeystorePath: ""},
})
c, err := NewPairingClient(nil, ccp, newAccountPayloadManagerConfig())
s.Require().NoError(err)
thing, err := makeThingToSay()

View File

@ -3,7 +3,6 @@ package pairing
import (
"context"
"encoding/json"
"fmt"
"os"
"path/filepath"
"testing"
@ -33,6 +32,8 @@ var paths = []string{pathWalletRoot, pathEIP1581, pathDefaultChat, pathDefaultWa
const keystoreDir = "keystore"
const currentNetwork = "mainnet_rpc"
func TestSyncDeviceSuite(t *testing.T) {
suite.Run(t, new(SyncDeviceSuite))
}
@ -85,7 +86,7 @@ func (s *SyncDeviceSuite) prepareBackendWithAccount(tmpdir string) *api.GethStat
account.Name = settings.Name
nodeConfig, err := defaultNodeConfig(tmpdir, settings.InstallationID, account.KeyUID)
nodeConfig, err := defaultNodeConfig(settings.InstallationID, account.KeyUID)
require.NoError(s.T(), err)
walletDerivedAccount := derivedAddresses[pathDefaultWallet]
@ -135,9 +136,22 @@ func (s *SyncDeviceSuite) TestPairingSyncDeviceClientAsSender() {
require.NoError(s.T(), err)
err = serverBackend.OpenAccounts()
require.NoError(s.T(), err)
serverKeystorePath := filepath.Join(serverTmpDir, keystoreDir)
configJSON := fmt.Sprintf(`{"KeystorePath":"%s"}`, serverKeystorePath)
cs, err := StartUpPairingServer(serverBackend, Receiving, configJSON)
serverNodeConfig, err := defaultNodeConfig(uuid.New().String(), "")
require.NoError(s.T(), err)
expectedKDFIterations := 1024
serverKeystoreDir := filepath.Join(serverTmpDir, keystoreDir)
serverPayloadSourceConfig := PayloadSourceConfig{
KeystorePath: serverKeystoreDir,
PayloadSourceReceiverConfig: &PayloadSourceReceiverConfig{
KDFIterations: expectedKDFIterations,
NodeConfig: serverNodeConfig,
RootDataDir: serverTmpDir,
SettingCurrentNetwork: currentNetwork,
},
}
serverConfigBytes, err := json.Marshal(serverPayloadSourceConfig)
require.NoError(s.T(), err)
cs, err := StartUpPairingServer(serverBackend, Receiving, string(serverConfigBytes))
require.NoError(s.T(), err)
// generate some data for the client
@ -151,14 +165,16 @@ func (s *SyncDeviceSuite) TestPairingSyncDeviceClientAsSender() {
clientActiveAccount, err := clientBackend.GetActiveAccount()
require.NoError(s.T(), err)
clientKeystorePath := filepath.Join(clientTmpDir, keystoreDir, clientActiveAccount.KeyUID)
var config = PayloadSourceConfig{
clientPayloadSourceConfig := PayloadSourceConfig{
KeystorePath: clientKeystorePath,
PayloadSourceSenderConfig: &PayloadSourceSenderConfig{
KeyUID: clientActiveAccount.KeyUID,
Password: s.password,
},
}
configBytes, err := json.Marshal(config)
clientConfigBytes, err := json.Marshal(clientPayloadSourceConfig)
require.NoError(s.T(), err)
err = StartUpPairingClient(clientBackend, cs, string(configBytes))
err = StartUpPairingClient(clientBackend, cs, string(clientConfigBytes))
require.NoError(s.T(), err)
require.NoError(s.T(), clientBackend.Logout())
@ -171,6 +187,7 @@ func (s *SyncDeviceSuite) TestPairingSyncDeviceClientAsSender() {
serverActiveAccount, err := serverBackend.GetActiveAccount()
require.NoError(s.T(), err)
require.Equal(s.T(), serverActiveAccount.Name, clientActiveAccount.Name)
require.Equal(s.T(), serverActiveAccount.KDFIterations, expectedKDFIterations)
}
func (s *SyncDeviceSuite) TestPairingSyncDeviceClientAsReceiver() {
@ -188,8 +205,10 @@ func (s *SyncDeviceSuite) TestPairingSyncDeviceClientAsReceiver() {
serverKeystorePath := filepath.Join(serverTmpDir, keystoreDir, serverActiveAccount.KeyUID)
var config = PayloadSourceConfig{
KeystorePath: serverKeystorePath,
PayloadSourceSenderConfig: &PayloadSourceSenderConfig{
KeyUID: serverActiveAccount.KeyUID,
Password: s.password,
},
}
configBytes, err := json.Marshal(config)
require.NoError(s.T(), err)
@ -208,9 +227,22 @@ func (s *SyncDeviceSuite) TestPairingSyncDeviceClientAsReceiver() {
require.NoError(s.T(), err)
err = clientBackend.OpenAccounts()
require.NoError(s.T(), err)
clientKeystorePath := filepath.Join(clientTmpDir, keystoreDir)
configJSON := fmt.Sprintf(`{"KeystorePath":"%s"}`, clientKeystorePath)
err = StartUpPairingClient(clientBackend, cs, configJSON)
clientNodeConfig, err := defaultNodeConfig(uuid.New().String(), "")
require.NoError(s.T(), err)
expectedKDFIterations := 2048
clientKeystoreDir := filepath.Join(clientTmpDir, keystoreDir)
clientPayloadSourceConfig := PayloadSourceConfig{
KeystorePath: clientKeystoreDir,
PayloadSourceReceiverConfig: &PayloadSourceReceiverConfig{
KDFIterations: expectedKDFIterations,
NodeConfig: clientNodeConfig,
RootDataDir: clientTmpDir,
SettingCurrentNetwork: currentNetwork,
},
}
clientConfigBytes, err := json.Marshal(clientPayloadSourceConfig)
require.NoError(s.T(), err)
err = StartUpPairingClient(clientBackend, cs, string(clientConfigBytes))
require.NoError(s.T(), err)
require.NoError(s.T(), serverBackend.Logout())
@ -224,6 +256,7 @@ func (s *SyncDeviceSuite) TestPairingSyncDeviceClientAsReceiver() {
clientActiveAccount, err := clientBackend.GetActiveAccount()
require.NoError(s.T(), err)
require.Equal(s.T(), serverActiveAccount.Name, clientActiveAccount.Name)
require.Equal(s.T(), clientActiveAccount.KDFIterations, expectedKDFIterations)
}
func defaultSettings(generatedAccountInfo generator.GeneratedAccountInfo, derivedAddresses map[string]generator.AccountInfo, mnemonic *string) (*settings.Settings, error) {
@ -273,18 +306,18 @@ func defaultSettings(generatedAccountInfo generator.GeneratedAccountInfo, derive
}
networkRawMessage := json.RawMessage(networksJSON)
settings.Networks = &networkRawMessage
settings.CurrentNetwork = "mainnet_rpc"
settings.CurrentNetwork = currentNetwork
return settings, nil
}
func defaultNodeConfig(tmpdir, installationID, keyUID string) (*params.NodeConfig, error) {
func defaultNodeConfig(installationID, keyUID string) (*params.NodeConfig, error) {
// Set mainnet
nodeConfig := &params.NodeConfig{}
nodeConfig.NetworkID = 1
nodeConfig.LogLevel = "ERROR"
nodeConfig.DataDir = filepath.Join(tmpdir, "ethereum/mainnet_rpc")
nodeConfig.KeyStoreDir = filepath.Join(tmpdir, keystoreDir, keyUID)
nodeConfig.DataDir = filepath.Join("ethereum/mainnet_rpc")
nodeConfig.KeyStoreDir = filepath.Join(keystoreDir, keyUID)
nodeConfig.UpstreamConfig = params.UpstreamRPCConfig{
Enabled: true,
URL: "https://mainnet.infura.io/v3/800c641949d64d768a5070a1b0511938",