From 2685d0536c5aa434ec876f002a506f0a517f5624 Mon Sep 17 00:00:00 2001 From: Adam Shannon Date: Fri, 22 Dec 2023 15:20:31 -0600 Subject: [PATCH] feat: add /crypto address and extract digital currency addresses from OFAC Issue: https://github.com/moov-io/watchman/issues/362 --- cmd/server/download.go | 2 + cmd/server/search.go | 11 +++-- cmd/server/search_crypto.go | 74 ++++++++++++++++++++++++++++++++++ cmd/server/search_handlers.go | 1 + pkg/ofac/ofac.go | 11 +++++ pkg/ofac/reader.go | 61 +++++++++++++++++++++++++++- pkg/ofac/reader_test.go | 25 ++++++++++++ test/testdata/sdn_comments.csv | 13 +++++- 8 files changed, 192 insertions(+), 6 deletions(-) create mode 100644 cmd/server/search_crypto.go diff --git a/cmd/server/download.go b/cmd/server/download.go index 5bb2930c..6c4401e8 100644 --- a/cmd/server/download.go +++ b/cmd/server/download.go @@ -281,6 +281,7 @@ func (s *searcher) refreshData(initialDir string) (*DownloadStats, error) { sdns := precomputeSDNs(results.SDNs, results.Addresses, s.pipe) adds := precomputeAddresses(results.Addresses) alts := precomputeAlts(results.AlternateIdentities, s.pipe) + sdnComments := results.SDNComments deniedPersons, err := dplRecords(s.logger, initialDir) if err != nil { @@ -390,6 +391,7 @@ func (s *searcher) refreshData(initialDir string) (*DownloadStats, error) { s.SDNs = sdns s.Addresses = adds s.Alts = alts + s.SDNComments = sdnComments // BIS s.DPs = dps // CSL diff --git a/cmd/server/search.go b/cmd/server/search.go index aa73c12c..5ccf7361 100644 --- a/cmd/server/search.go +++ b/cmd/server/search.go @@ -36,9 +36,10 @@ var ( // This data comes from various US and EU Federal agencies type searcher struct { // OFAC - SDNs []*SDN - Addresses []*Address - Alts []*Alt + SDNs []*SDN + Addresses []*Address + Alts []*Alt + SDNComments []*ofac.SDNComments // BIS DPs []*DP @@ -410,6 +411,10 @@ func (s *searcher) debugSDN(entityID string) *SDN { s.RLock() defer s.RUnlock() + return s.findSDNWithoutLock(entityID) +} + +func (s *searcher) findSDNWithoutLock(entityID string) *SDN { for i := range s.SDNs { if s.SDNs[i].EntityID == entityID { return s.SDNs[i] diff --git a/cmd/server/search_crypto.go b/cmd/server/search_crypto.go new file mode 100644 index 00000000..ba81a9b2 --- /dev/null +++ b/cmd/server/search_crypto.go @@ -0,0 +1,74 @@ +// Copyright 2022 The Moov Authors +// Use of this source code is governed by an Apache License +// license that can be found in the LICENSE file. + +package main + +import ( + "encoding/json" + "net/http" + "strings" + + moovhttp "github.com/moov-io/base/http" + "github.com/moov-io/base/log" + "github.com/moov-io/watchman/pkg/ofac" +) + +type cryptoAddressSearchResult struct { + OFAC []SDNWithDigitalCurrencyAddress `json:"ofac"` +} + +func searchByCryptoAddress(logger log.Logger, searcher *searcher) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + cryptoAddress := strings.TrimSpace(r.URL.Query().Get("address")) + cryptoName := strings.TrimSpace(r.URL.Query().Get("name")) + if cryptoAddress == "" { + moovhttp.Problem(w, errNoSearchParams) + return + } + + limit := extractSearchLimit(r) + + // Find SDNs with a crypto address that exactly matches + resp := cryptoAddressSearchResult{ + OFAC: searcher.FindSDNCryptoAddresses(limit, cryptoName, cryptoAddress), + } + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(http.StatusOK) + json.NewEncoder(w).Encode(resp) + } +} + +type SDNWithDigitalCurrencyAddress struct { + SDN *ofac.SDN `json:"sdn"` + + DigitalCurrencyAddresses []ofac.DigitalCurrencyAddress `json:"digitalCurrencyAddresses"` +} + +func (s *searcher) FindSDNCryptoAddresses(limit int, name, needle string) []SDNWithDigitalCurrencyAddress { + s.RLock() + defer s.RUnlock() + + var out []SDNWithDigitalCurrencyAddress + for i := range s.SDNComments { + addresses := s.SDNComments[i].DigitalCurrencyAddresses + for j := range addresses { + // Skip addresses of a different coin + if name != "" && addresses[j].Currency != name { + continue + } + if addresses[j].Address == needle { + // Find SDN + sdn := s.findSDNWithoutLock(s.SDNComments[i].EntityID) + if sdn != nil { + out = append(out, SDNWithDigitalCurrencyAddress{ + SDN: sdn.SDN, + DigitalCurrencyAddresses: addresses, + }) + } + } + } + } + return out +} diff --git a/cmd/server/search_handlers.go b/cmd/server/search_handlers.go index 5f82bfd8..93b3aa0c 100644 --- a/cmd/server/search_handlers.go +++ b/cmd/server/search_handlers.go @@ -33,6 +33,7 @@ var ( // TODO: modify existing search endpoint with additional eu info and add an eu only endpoint func addSearchRoutes(logger log.Logger, r *mux.Router, searcher *searcher) { + r.Methods("GET").Path("/crypto").HandlerFunc(searchByCryptoAddress(logger, searcher)) r.Methods("GET").Path("/search").HandlerFunc(search(logger, searcher)) r.Methods("GET").Path("/search/us-csl").HandlerFunc(searchUSCSL(logger, searcher)) r.Methods("GET").Path("/search/eu-csl").HandlerFunc(searchEUCSL(logger, searcher)) diff --git a/pkg/ofac/ofac.go b/pkg/ofac/ofac.go index 1c94d1d1..b146d796 100644 --- a/pkg/ofac/ofac.go +++ b/pkg/ofac/ofac.go @@ -69,4 +69,15 @@ type SDNComments struct { EntityID string `json:"entityID"` // RemarksExtended is remarks extended on a Specially Designated National RemarksExtended string `json:"remarksExtended"` + // DigitalCurrencyAddresses are wallet addresses for digital currencies + DigitalCurrencyAddresses []DigitalCurrencyAddress `json:"digitalCurrencyAddresses"` +} + +type DigitalCurrencyAddress struct { + // Currency is the name of the digital currency. + // Examples: XBT (Bitcoin), ETH (Ethereum) + Currency string + + // Address is a digital wallet address + Address string } diff --git a/pkg/ofac/reader.go b/pkg/ofac/reader.go index 91df14f0..e28ade97 100644 --- a/pkg/ofac/reader.go +++ b/pkg/ofac/reader.go @@ -233,8 +233,9 @@ func csvSDNCommentsFile(path string) (*Results, error) { } line = replaceNull(line) out = append(out, &SDNComments{ - EntityID: line[0], - RemarksExtended: line[1], + EntityID: line[0], + RemarksExtended: line[1], + DigitalCurrencyAddresses: readDigitalCurrencyAddresses(line[1]), }) } return &Results{SDNComments: out}, nil @@ -262,3 +263,59 @@ func splitPrograms(in string) []string { norm := cleanPrgmsList(in) return strings.Split(norm, "; ") } + +var ( + digitalCurrencies = []string{ + "XBT", // Bitcoin + "ETH", // Ethereum + "XMR", // Monero + "LTC", // Litecoin + "ZEC", // ZCash + "DASH", // Dash + "BTG", // Bitcoin Gold + "ETC", // Ethereum Classic + "BSV", // Bitcoin Satoshi Vision + "BCH", // Bitcoin Cash + "XVG", // Verge + "USDC", // USD Coin + "USDT", // USD Tether + "XRP", // Ripple + "TRX", // Tron + "ARB", // Arbitrum + "BSC", // Binance Smart Chain + } +) + +func readDigitalCurrencyAddresses(remarks string) []DigitalCurrencyAddress { + var out []DigitalCurrencyAddress + + // The format is semicolon delineated, but "Digital Currency Address" is sometimes truncated badly + // + // alt. Digital Currency Address - XBT 12jVCWW1ZhTLA5yVnroEJswqKwsfiZKsax; + // + parts := strings.Split(remarks, ";") + for i := range parts { + // Check if the currency is in the remark + var addressIndex int + for j := range digitalCurrencies { + idx := strings.Index(parts[i], fmt.Sprintf(" %s ", digitalCurrencies[j])) + if idx > -1 { + addressIndex = idx + break + } + } + if addressIndex > 0 { + fields := strings.Fields(parts[i][addressIndex:]) + if len(fields) < 2 { + break // bad parsing + } + out = append(out, DigitalCurrencyAddress{ + Currency: fields[0], + Address: fields[1], + }) + continue + } + } + + return out +} diff --git a/pkg/ofac/reader_test.go b/pkg/ofac/reader_test.go index 68648572..db55ac82 100644 --- a/pkg/ofac/reader_test.go +++ b/pkg/ofac/reader_test.go @@ -9,6 +9,8 @@ import ( "path/filepath" "reflect" "testing" + + "github.com/stretchr/testify/require" ) // TestOFAC__read validates reading an OFAC Address CSV File @@ -113,3 +115,26 @@ func TestSDNComments(t *testing.T) { } } } + +func TestSDNComments_CryptoCurrencies(t *testing.T) { + fd, err := os.CreateTemp("", "sdn-comments") + require.NoError(t, err) + + _, err = fd.WriteString(`42496," alt. Digital Currency Address - XBT 12jVCWW1ZhTLA5yVnroEJswqKwsfiZKsax; alt. Digital Currency Address - XBT 1J378PbmTKn2sEw6NBrSWVfjZLBZW3DZem; alt. Digital Currency Address - XBT 18aqbRhHupgvC9K8qEqD78phmTQQWs7B5d; alt. Digital Currency Address - XBT 16ti2EXaae5izfkUZ1Zc59HMcsdnHpP5QJ; Secondary sanctions risk: North Korea Sanctions Regulations, sections 510.201 and 510.210; Transactions Prohibited For Persons Owned or Controlled By U.S. Financial Institutions: North Korea Sanctions Regulations section 510.214; Passport E59165201 (China) expires 01 Sep 2025; Identification Number 371326198812157611 (China); a.k.a. 'WAKEMEUPUPUP'; a.k.a. 'FAST4RELEASE'; Linked To: LAZARUS GROUP."`) + require.NoError(t, err) + + sdn, err := csvSDNCommentsFile(fd.Name()) + require.NoError(t, err) + require.Len(t, sdn.SDNComments, 1) + + addresses := sdn.SDNComments[0].DigitalCurrencyAddresses + require.Len(t, addresses, 4) + + expected := []DigitalCurrencyAddress{ + {Currency: "XBT", Address: "12jVCWW1ZhTLA5yVnroEJswqKwsfiZKsax"}, + {Currency: "XBT", Address: "1J378PbmTKn2sEw6NBrSWVfjZLBZW3DZem"}, + {Currency: "XBT", Address: "18aqbRhHupgvC9K8qEqD78phmTQQWs7B5d"}, + {Currency: "XBT", Address: "16ti2EXaae5izfkUZ1Zc59HMcsdnHpP5QJ"}, + } + require.ElementsMatch(t, expected, addresses) +} diff --git a/test/testdata/sdn_comments.csv b/test/testdata/sdn_comments.csv index 966daaef..b0f5afd0 100644 --- a/test/testdata/sdn_comments.csv +++ b/test/testdata/sdn_comments.csv @@ -1,3 +1,14 @@ 12300,"Z S.A.S.; Linked To: RED MUNDIAL INMOBILIARIA, S.A. DE C.V.; Linked To: FUNDACION PARA EL BIENESTAR Y EL PORVENIR; Linked To: C.I. METALURGIA EXTRACTIVA DE COLOMBIA S.A.S.; Linked To: GRUPO MUNDO MARINO, S.A.; Linked To: C.I. DISERCOM S.A.S.; Linked To: C.I. OKCOFFEE COLOMBIA S.A.S.; Linked To: C.I. OKCOFFEE INTERNATIONAL S.A.S.; Linked To: FUNDACION OKCOFFEE COLOMBIA; Linked To: CUBICAFE S.A.S.; Linked To: HOTELES Y BIENES S.A.; Linked To: FUNDACION SALVA LA SELVA; Linked To: LINEA AEREA PUEBLOS AMAZONICOS S.A.S.; Linked To: DESARROLLO MINERO RESPONSABLE C.I. S.A.S.; Linked To: R D I S.A." 15599,"MI FEL, S. DE R.L. DE C.V.; Linked To: SERVICIO Y OPERADORA SANTA ANA, S.A. DE C.V.; Linked To: TAXI AEREO NACIONAL DE CULIACAN, S.A.; Linked To: VILLAS DEL COLLI S.A. DE C.V." -15600,"ONDON, S. DE R.L. DE C.V.; Linked To: PETRO MAS, S. DE R.L. DE C.V.; Linked To: PROMI FEL, S. DE R.L. DE C.V.; Linked To: TAXI AEREO NACIONAL DE CULIACAN, S.A.; Linked To: VILLAS DEL COLLI S.A. DE C.V." \ No newline at end of file +15600,"ONDON, S. DE R.L. DE C.V.; Linked To: PETRO MAS, S. DE R.L. DE C.V.; Linked To: PROMI FEL, S. DE R.L. DE C.V.; Linked To: TAXI AEREO NACIONAL DE CULIACAN, S.A.; Linked To: VILLAS DEL COLLI S.A. DE C.V." +17018,": 24 Feb 2022; Effective Date (EO 14024 Directive 3): 26 Mar 2022; Tax ID No. 7707083893 (Russia); Registration Number 1027700132195 (Russia); For more information on directives, please visit the following link: http://www.treasury.gov/resource-center/sanctions/Programs/Pages/ukraine.aspx#directives." +27307,"G TEAM'; a.k.a. 'RED DOT'; a.k.a. 'TEMP.HERMIT'; a.k.a. 'GROUP 77'; a.k.a. 'ZINC'; a.k.a. 'APT-C-26'; a.k.a. 'APPLEWORM'." +28263,"hn'; Linked To: LAZARUS GROUP." +28264,"hone Number 8613314257947; alt. Phone Number 8618004121000; Transactions Prohibited For Persons Owned or Controlled By U.S. Financial Institutions: North Korea Sanctions Regulations section 510.214; Identification Number 210302198701102136 (China); a.k.a. 'blackjack1987'; a.k.a. 'khaleesi'; Linked To: LAZARUS GROUP." +33854,"M7CGBPUJwXXSroWuZ6H5jiprdKCyf7V5M; alt. Digital Currency Address - XBT 34kWCKF2wCbe6uinit2uL4ND6d8yxsuxKM; alt. Digital Currency Address - XBT bc1qe95l438kzjcvnsm3kn8n5augf9gpctdlhsq7f7hpnkyvlr7rc7cqupapf7; alt. Digital Currency Address - XBT 32VgTk8kGvBsqkHhkvtNooGdtqZm46jTVo; alt. Digital Currency Address - XBT 3NPognMSbzyA2JYW2fpkVKWyBMi2XTq2Zt; alt. Digital Currency Address - XBT 3MzLtBQ4Lz9J6w4Qu55TktgxFKZwxYWrP6; alt. Digital Currency Address - XBT 36YGN5dGzqrxMomTHdkT6cYVMnWBw8S7hD; alt. Digital Currency Address - XBT bc1q4rzdtlt0uslyw86cp29sctl6ct29g9a95cuup7pn5md9ddj7xgmqpp5m73; alt. Digital Currency Address - XBT 39KQvziHwUe2vddbpfC5WkQEV72qbQhxuh; alt. Digital Currency Address - XBT 3Qw9Fn19gCnga9LfHfpM99aGzuqxBNjR2i; Digital Currency Address - ETH 0x67d40EE1A85bf4a4Bb7Ffae16De985e8427B6b45; alt. Digital Currency Address - ETH 0x6f1ca141a28907f78ebaa64fb83a9088b02a8352; alt. Digital Currency Address - ETH 0x6acdfba02d390b97ac2b2d42a63e85293bcc160e; alt. Digital Currency Address - ETH 0x48549a34ae37b12f6a30566245176994e17c6b4a; alt. Digital Currency Address - ETH 0x5512d943ed1f7c8a43f3435c85f7ab68b30121b0; alt. Digital Currency Address - ETH 0xc455f7fd3e0e12afd51fba5c106909934d8a0e4a; Organization Established Date 2018; Digital Currency Address - USDT 3LtcaPbCj87CwJHnRX3vh7c2y9RZQqeSy8; Digital Currency Address - XRP rnXyVQzgxZe7TR1EPzTkGj2jxH4LMJYh66." +36216,"FhMdRq5UpPDpNyriYNVtkn; alt. Digital Currency Address - XBT 16SPDQFFzgsoNSPiFFTfS8Dw8LLXqia4oc; alt. Digital Currency Address - XBT 19pPbUDvoSBZafkUCYkD2Z9AkuqqV6sWm7; alt. Digital Currency Address - XBT 3BQACtiMXYB9JpUMpkEWt9m8BzswpGHq4X; alt. Digital Currency Address - XBT 1DGsY4ww3BJnWXTsnmTgWa6UWdoRXgA1pX; alt. Digital Currency Address - XBT 1GcKLUUXodTQcLcPD7VLMgvCc4hs5Q775; alt. Digital Currency Address - XBT 1EvhBad5wCZYhBoAsGaciV6AvmZ1osLpeJ; alt. Digital Currency Address - XBT bc1qsmv6lkrw65l30yazdqpdjjtwzpvk9f8gfh0cy7; alt. Digital Currency Address - XBT bc1qs9u6j78e3utj08mwvqkkmqm9de5xk3g4yh8qtq; alt. Digital Currency Address - XBT 12VrYZgS1nmf9KHHped24xBb1aLLRpV2cT; alt. Digital Currency Address - XBT bc1q202ajnhxgg9d9jjczmg0g4usp6haqldyy2eakl; alt. Digital Currency Address - XBT 1NbGwQwt4uEhg2srAKppLf8QaF6fbp3PZG; alt. Digital Currency Address - XBT 13LQJQ1oJ9K7PsqsGfjNhoVv6UeU6hgzQz; alt. Digital Currency Address - XBT 1CG1aSCxUnbmv9G34ofxTQoHtuVnMLJtQV; alt. Digital Currency Address - XBT 3Kp8Qc5z7yevDeoQxhS5RSSKnEi5x7AQ43; alt. Digital Currency Address - XBT 331TS6DyASY7iU5CRA8UryBnkPS78fP2B1; alt. Digital Currency Address - XBT 1NvJm3jfZxENNyqws5BKQvhkLxg9chLJdo; alt. Digital Currency Address - XBT 1Licqjca74n8pmNaoARXLLqcTUTHFpxbXH; alt. Digital Currency Address - XBT 175BUqf8JCU1uoG1iTRKTacDa4uvJDUCw2; alt. Digital Currency Address - XBT 1ANpca7g93BwptUJg1zV116v49zn9gjDi3; alt. Digital Currency Address - XBT 1BCWMwpR4M1nYUuuYe2bmzrNuwGoF9ZAbA; alt. Digital Currency Address - XBT 18cFGAdYcvNHkuhXLBE7izQKCyUW8TzCJE; alt. Digital Currency Address - XBT 1QHxyuLGRMHfbNPJikV4Dwhfx45HWfUMWB; alt. Digital Currency Address - XBT 1GnFTy5F9qi5MfaRZfgdg2jkyT5xtAHvd8; alt. Digital Currency Address - XBT bc1quyc6j8ca84q9gjej5jjd2n8hra0vfu0j60fefs57p6e5rerkq07q0l5u3w; alt. Digital Currency Address - XBT 16p2UWTZwXRyK5bTHNVjdDyy1D3EQGsZf2; alt. Digital Currency Address - XBT 1CddRqw7oSPrT4tt5oXKyx2LiHJDPszy7y; alt. Digital Currency Address - XBT 1Hhe61Bwxs8Hd2WxzWY9FQyZicBiZGeSNW; alt. Digital Currency Address - XBT 1D3GuaS9eqKw8dWj9JFQtNufdRtysjSLxZ; alt. Digital Currency Address - XBT 1PWRKxkR5AU7Tc9zPqjdhtu1eGW1QZzs4y; alt. Digital Currency Address - XBT 1D1ej7zQzywWBDNXKNYpmH7Hso2U9koDG4; alt. Digital Currency Address - XBT 3KGQ3hX6eFYtBjTBFSdvdkzHmwZyYWLRQh; alt. Digital Currency Address - XBT 1LKE3XA9bf5JFqtGtCHzWj5QGxKGwMfXZw; alt. Digital Currency Address - XBT 1MtsQsw6n2jvJCWhpCw7jifTfD9Q3rBBVg; alt. Digital Currency Address - XBT 1KkaKujnqwJf7Cbm7JKAZGF3X9d4685m8n; alt. Digital Currency Address - XBT 1Ge8JodC2HiBiEuT7D3MoH6Fak6XrcT9Kf; alt. Digital Currency Address - XBT bc1qsmqpalp3gtgkltag4x3ygevmhh9y2hzk73t2ug; alt. Digital Currency Address - XBT 1E9uUnLbyfToazo95vmM3ysYnzgkrL7GeC; alt. Digital Currency Address - XBT 1HH8eiuaTMucTNyvGCUmAvmCZCtdMi8SqK; alt. Digital Currency Address - XBT 19FQzHibWDhSP8pKmJS3uagFYoisXtehzw; alt. Digital Currency Address - XBT 3DLGfN7hgsWXXSp9euXcnmWXLpFQuswW2t; alt. Digital Currency Address - XBT 1PXxwPVtYxZiCRp9LKq7aKMDFrhAQztvUE; alt. Digital Currency Address - XBT 1Q4tJjH2aBr3AJrzxqa4Z3jPpf5SDgF4jK; alt. Digital Currency Address - XBT 1PYtgFS2t6i57WdDvbRa7kPcsagGMBxzfg; alt. Digital Currency Address - XBT 16ZSAEfYpPCj3D94fsNt2okYj9Ue8mxy6T; alt. Digital Currency Address - XBT bc1qvlzfn6kmezv44d8kw0p5jsmxe6wchv3zc7gsxs; alt. Digital Currency Address - XBT 3QVyoH4u3qT88uChAeJVhfB3r6maZt431y; alt. Digital Currency Address - XBT 1FFS6pX1TCKTNy668Mbk2Lyoem1qB48kYX; alt. Digital Currency Address - XBT 1Dpddb1TMjvmNQeYDqgyd1ww6cmwPJRdSk; alt. Digital Currency Address - XBT 3AjiWiUdKB5mcGUSS9mBeoHCeYJw3Zo8r6; alt. Digital Currency Address - XBT 1EtMuBPQnPCa3cecerdSH1SzydxnhbTmw; alt. Digital Currency Address - XBT 3CCmt5LjQ5yKkaFY1DWC2SbERVEtWRnSRD; alt. Digital Currency Address - XBT 1MQBDeRWsiJBf7K1VGjJ7PWEL6GJXMfmLg; alt. Digital Currency Address - XBT 1MbtT2ZsTtLp7EKZUV9r74cTyqvsMtTP2M; alt. Digital Currency Address - XBT 36yS87PLuW7sErLg1TY26WzaVarTim7AcC; alt. Digital Currency Address - XBT 3AYU365Tcjef7j9pdKF9Xe8rWpEpsH196t; alt. Digital Currency Address - XBT 148LKmyZT3FGE4x1GjsFN6RsAwcjzk5iuE; alt. Digital Currency Address - XBT 16EKTes8ahD8xvwisqjc2xSNLiG3fDHatW; alt. Digital Currency Address - XBT 3GuQjr7kkrR5EjpanMgyAuxuLgrjEUwe21; alt. Digital Currency Address - XBT 35eanEz5iYg2eYaxCtMrR4SCoypFqrBWUH; alt. Digital Currency Address - XBT 3QWUdP5taP4GrRuueVDud1eWetb7hc3wDH; alt. Digital Currency Address - XBT 3Czhm6xqn8odwz6jgTcjRrUjog28v6aVS8; alt. Digital Currency Address - XBT 1F7UL41qYm6TvnExZzPHBCyeENvX3XDEMS; alt. Digital Currency Address - XBT 123WBUDmSJv4GctdVEz6Qq6z8nXSKrJ4KX; alt. Digital Currency Address - XBT 3BCN3WgMRJwULTz1vsEQ7NZrBjwaUBf5Ca; alt. Digital Currency Address - XBT 35SwVFxosV3AsvnrBfzdXarqavRbvDyyxv; alt. Digital Currency Address - XBT 32pCmCWEjwhkLwh5BgLNAeBQFp5Gi1hv81; alt. Digital Currency Address - XBT 1G64TFMFVJTjhJXra6x74BBhsfSyiWaFtT; alt. Digital Currency Address - XBT 1A3iYY4c3dkgNYGewzYzr7EsqfBuWXibGo; alt. Digital Currency Address - XBT 3GAUBtrTtWp1D9yeXgr3wMg8B599QHa5m5; alt. Digital Currency Address - XBT 3HJN4jRa4mdfkey9JR9jUhr86yPwL86A3C; alt. Digital Currency Address - XBT 1EuUMPBCZtSd5pVVFEqmRqUSfU1qy6ASuL; alt. Digital Currency Address - XBT 1Pu1nAW7kCoSMThMs8QcpM8JxuByQDZgH; alt. Digital Currency Address - XBT 3QnWE5GVfQu3wVav91RuFkqip4Ti4NWqAY; alt. Digital Currency Address - XBT 1CNbhgxGRZvsWnEHotfXge7k2E1UPzBDC7; alt. Digital Currency Address - XBT 3HSZc4BLnQBznjSq7JvXgqNCZUUs3M9fZz; alt. Digital Currency Address - XBT 37dDBCexFPraKW4jGSqkE3NyG52YeZQbJx; alt. Digital Currency Address - XBT 1H8sDTTgJPBKw83EBZDLhXvetCbxZUMMZM; alt. Digital Currency Address - XBT 1BvJRBRp9ZZ6zLyuZaZsV7g3xP6JokdZQW; alt. Digital Currency Address - XBT bc1q237mvl0heyw0r38wd3xz8h5mar96rrwpams8pp; alt. Digital Currency Address - XBT 34dxZvijpBM1YkPybczbQ7DuGuKAnULdfS; alt. Digital Currency Address - XBT 1GkLN7DbA9mAtHNzQWNPANcdWbefaz4Gzm; alt. Digital Currency Address - XBT 13hfsQm6oCaDZehfYBSMFiJVAi1jsL6sQd; alt. Digital Currency Address - XBT 1Sf6e4xQv8muMZqYPTdRFf3e5o5eWcg9F; alt. Digital Currency Address - XBT bc1qj6j6p0jdefl6pvdzx3kx8245yy5mz6q4luhzes; alt. Digital Currency Address - XBT 1B3u21itzjgKtm7QsNQNCBpSkwzzeDHqrW; alt. Digital Currency Address - XBT 3JhPsVV3KnL9dBYGSZALS9EbrLr97R865a; alt. Digital Currency Address - XBT bc1qqf8kcc9m57xjqcvsvuf989nnl48ve6d2s24cx3; alt. Digital Currency Address - XBT 1HuYfoEwsfHgZiRhbhJrCd5ST3iksa8KEx; alt. Digital Currency Address - XBT 1J9wJH2bamZVxscXAvoDH4jvtGKb7sYFDm; alt. Digital Currency Address - XBT 34WWXwFKAsXL9zYxbeNPaPV6vDamkjQLUo; alt. Digital Currency Address - XBT 3PDmRwotTkRAFRLGTUrucCERp2JdM1q4ar; alt. Digital Currency Address - XBT 3AFcE2mbSSndcpYFgHoExSmjUc26ef2gQh; alt. Digital Currency Address - XBT 3P6PzdfETr4275Gn3veLkCyDxA1jV8fHKm; alt. Digital Currency Address - XBT 3HRExd8GKFskZC5inmVcpiyy9UWG7FVa6o; alt. Digital Currency Address - XBT 3MP7yBGSW2gkXVRE8S84T2j4KVgPh3rEzv; alt. Digital Currency Address - XBT 1K2fmE9hfhbRNSZoBvCBWZAvsS5idTUxBG; alt. Digital Currency Address - XBT 3ES6pqCueDPCnC4hCqhhYuey6gyiRJZw6E; alt. Digital Currency Address - XBT 3KvBX3jo69Qn8jHy44M33RYoeYcf8DdRBD; alt. Digital Currency Address - XBT 3K26aMKmnrv97Pj6YiFcqiXk2LxeHfhnG3; alt. Digital Currency Address - XBT 3BWP6ZQAhc4j5wR1b95zJAthJEFvhdees7; alt. Digital Currency Address - XBT 3JuSgFrwnrNfuhvR4GpWAPmeJVot4xrEae; alt. Digital Currency Address - XBT 1DKGRGJXGNLAtTeFb9SNPNHtrkZ87q7qKi; alt. Digital Currency Address - XBT 361AkMKNNWYwZRsCE8pPNmoh5aQf4V7g4p; alt. Digital Currency Address - XBT 33fWcMdmsB2Ey4CEbVWbjGFkuevBSyP9nG; alt. Digital Currency Address - XBT 35aTjkBh4yeTypJsi9nuTdoMKHTsawKVgX; Secondary sanctions risk: Ukraine-/Russia-Related Sanctions Regulations, 31 CFR 589.201; Organization Established Date 2015; a.k.a. 'HYDRA'." +39796,"ddress - ETH 0x4736dCf1b7A3d580672CcE6E7c65cd5cc9cFBa9D; alt. Digital Currency Address - ETH 0xDD4c48C0B24039969fC16D1cdF626eaB821d3384; alt. Digital Currency Address - ETH 0xd96f2B1c14Db8458374d9Aca76E26c3D18364307; alt. Digital Currency Address - ETH 0x169AD27A470D064DEDE56a2D3ff727986b15D52B; alt. Digital Currency Address - ETH 0x0836222F2B2B24A3F36f98668Ed8F0B38D1a872f; alt. Digital Currency Address - ETH 0x178169B423a011fff22B9e3F3abeA13414dDD0F1; alt. Digital Currency Address - ETH 0x610B717796ad172B316836AC95a2ffad065CeaB4; alt. Digital Currency Address - ETH 0xbB93e510BbCD0B7beb5A853875f9eC60275CF498; alt. Digital Currency Address - ETH 0x84443CFd09A48AF6eF360C6976C5392aC5023a1F; alt. Digital Currency Address - ETH 0xd47438C816c9E7f2E2888E060936a499Af9582b3; alt. Digital Currency Address - ETH 0x330bdFADE01eE9bF63C209Ee33102DD334618e0a; alt. Digital Currency Address - ETH 0x1E34A77868E19A6647b1f2F47B51ed72dEDE95DD; alt. Digital Currency Address - ETH 0xdf231d99Ff8b6c6CBF4E9B9a945CBAcEF9339178; alt. Digital Currency Address - ETH 0xaf4c0B70B2Ea9FB7487C7CbB37aDa259579fe040; alt. Digital Currency Address - ETH 0xa5C2254e4253490C54cef0a4347fddb8f75A4998; alt. Digital Currency Address - ETH 0xaf8d1839c3c67cf571aa74B5c12398d4901147B3; alt. Digital Currency Address - ETH 0x6Bf694a291DF3FeC1f7e69701E3ab6c592435Ae7; alt. Digital Currency Address - ETH 0x3aac1cC67c2ec5Db4eA850957b967Ba153aD6279; alt. Digital Currency Address - ETH 0x723B78e67497E85279CB204544566F4dC5d2acA0; alt. Digital Currency Address - ETH 0x0E3A09dDA6B20aFbB34aC7cD4A6881493f3E7bf7; alt. Digital Currency Address - ETH 0x76D85B4C0Fc497EeCc38902397aC608000A06607; alt. Digital Currency Address - ETH 0xCC84179FFD19A1627E79F8648d09e095252Bc418; alt. Digital Currency Address - ETH 0xD5d6f8D9e784d0e26222ad3834500801a68D027D; alt. Digital Currency Address - ETH 0x407CcEeaA7c95d2FE2250Bf9F2c105aA7AAFB512; alt. Digital Currency Address - ETH 0x833481186f16Cece3f1Eeea1a694c42034c3a0dB; alt. Digital Currency Address - ETH 0xd8D7DE3349ccaA0Fde6298fe6D7b7d0d34586193; alt. Digital Currency Address - ETH 0x8281Aa6795aDE17C8973e1aedcA380258Bc124F9; alt. Digital Currency Address - ETH 0x57b2B8c82F065de8Ef5573f9730fC1449B403C9f; alt. Digital Currency Address - ETH 0x05E0b5B40B7b66098C2161A5EE11C5740A3A7C45; alt. Digital Currency Address - ETH 0x23173fE8b96A4Ad8d2E17fB83EA5dcccdCa1Ae52; alt. Digital Currency Address - ETH 0x538Ab61E8A9fc1b2f93b3dd9011d662d89bE6FE6; alt. Digital Currency Address - ETH 0x94Be88213a387E992Dd87DE56950a9aef34b9448; alt. Digital Currency Address - ETH 0x242654336ca2205714071898f67E254EB49ACdCe; alt. Digital Currency Address - ETH 0x776198CCF446DFa168347089d7338879273172cF; alt. Digital Currency Address - ETH 0xeDC5d01286f99A066559F60a585406f3878a033e; alt. Digital Currency Address - ETH 0xD692Fd2D0b2Fbd2e52CFa5B5b9424bC981C30696; alt. Digital Currency Address - ETH 0xca0840578f57fe71599d29375e16783424023357; alt. Digital Currency Address - ETH 0xDF3A408c53E5078af6e8fb2A85088D46Ee09A61b; alt. Digital Currency Address - ETH 0x743494b60097A2230018079c02fe21a7B687EAA5; alt. Digital Currency Address - ETH 0x94C92F096437ab9958fC0A37F09348f30389Ae79; alt. Digital Currency Address - ETH 0x5efda50f22d34F262c29268506C5Fa42cB56A1Ce; alt. Digital Currency Address - ETH 0x2f50508a8a3d323b91336fa3ea6ae50e55f32185; alt. Digital Currency Address - ETH 0xCEe71753C9820f063b38FDbE4cFDAf1d3D928A80; alt. Digital Currency Address - ETH 0xffbac21a641dcfe4552920138d90f3638b3c9fba; alt. Digital Currency Address - ETH 0x179f48c78f57a3a78f0608cc9197b8972921d1d2; alt. Digital Currency Address - ETH 0xb04E030140b30C27bcdfaafFFA98C57d80eDa7B4; alt. Digital Currency Address - ETH 0x77777feddddffc19ff86db637967013e6c6a116c; alt. Digital Currency Address - ETH 0x3efa30704d2b8bbac821307230376556cf8cc39e; alt. Digital Currency Address - ETH 0x746aebc06d2ae31b71ac51429a19d54e797878e9; alt. Digital Currency Address - ETH 0xd90e2f925DA726b50C4Ed8D0Fb90Ad053324F31b; alt. Digital Currency Address - ETH 0x5f6c97C6AD7bdd0AE7E0Dd4ca33A4ED3fDabD4D7; alt. Digital Currency Address - ETH 0xf4B067dD14e95Bab89Be928c07Cb22E3c94E0DAA; alt. Digital Currency Address - ETH 0x58E8dCC13BE9780fC42E8723D8EaD4CF46943dF2; alt. Digital Currency Address - ETH 0x01e2919679362dFBC9ee1644Ba9C6da6D6245BB1; alt. Digital Currency Address - ETH 0x2FC93484614a34f26F7970CBB94615bA109BB4bf; alt. Digital Currency Address - ETH 0x26903a5a198D571422b2b4EA08b56a37cbD68c89; alt. Digital Currency Address - ETH 0xB20c66C4DE72433F3cE747b58B86830c459CA911; alt. Digital Currency Address - ETH 0x2573BAc39EBe2901B4389CD468F2872cF7767FAF; alt. Digital Currency Address - ETH 0x527653eA119F3E6a1F5BD18fbF4714081D7B31ce; alt. Digital Currency Address - ETH 0x653477c392c16b0765603074f157314Cc4f40c32; alt. Digital Currency Address - ETH 0x88fd245fEdeC4A936e700f9173454D1931B4C307; alt. Digital Currency Address - ETH 0x09193888b3f38C82dEdfda55259A82C0E7De875E; alt. Digital Currency Address - ETH 0x5cab7692D4E94096462119ab7bF57319726Eed2A; alt. Digital Currency Address - ETH 0x756C4628E57F7e7f8a459EC2752968360Cf4D1AA; alt. Digital Currency Address - ETH 0x722122dF12D4e14e13Ac3b6895a86e84145b6967; alt. Digital Currency Address - ETH 0x94A1B5CdB22c43faab4AbEb5c74999895464Ddaf; alt. Digital Currency Address - ETH 0xb541fc07bC7619fD4062A54d96268525cBC6FfEF; alt. Digital Currency Address - ETH 0xD82ed8786D7c69DC7e052F7A542AB047971E73d2; alt. Digital Currency Address - ETH 0xF67721A2D8F736E75a49FdD7FAd2e31D8676542a; alt. Digital Currency Address - ETH 0x9AD122c22B14202B4490eDAf288FDb3C7cb3ff5E; alt. Digital Currency Address - ETH 0xD691F27f38B395864Ea86CfC7253969B409c362d; alt. Digital Currency Address - ETH 0xaEaaC358560e11f52454D997AAFF2c5731B6f8a6; alt. Digital Currency Address - ETH 0x1356c899D8C9467C7f71C195612F8A395aBf2f0a; alt. Digital Currency Address - ETH 0xA60C772958a3eD56c1F15dD055bA37AC8e523a0D; alt. Digital Currency Address - ETH 0xBA214C1c1928a32Bffe790263E38B4Af9bFCD659; alt. Digital Currency Address - ETH 0xb1C8094B234DcE6e03f10a5b673c1d8C69739A00; alt. Digital Currency Address - ETH 0xF60dD140cFf0706bAE9Cd734Ac3ae76AD9eBC32A; alt. Digital Currency Address - ETH 0x8589427373D6D84E98730D7795D8f6f8731FDA16; Secondary sanctions risk: North Korea Sanctions Regulations, sections 510.201 and 510.210; Transactions Prohibited For Persons Owned or Controlled By U.S. Financial Institutions: North Korea Sanctions Regulations section 510.214; Organization Established Date 2019." +42496," alt. Digital Currency Address - XBT 12jVCWW1ZhTLA5yVnroEJswqKwsfiZKsax; alt. Digital Currency Address - XBT 1J378PbmTKn2sEw6NBrSWVfjZLBZW3DZem; alt. Digital Currency Address - XBT 18aqbRhHupgvC9K8qEqD78phmTQQWs7B5d; alt. Digital Currency Address - XBT 16ti2EXaae5izfkUZ1Zc59HMcsdnHpP5QJ; Secondary sanctions risk: North Korea Sanctions Regulations, sections 510.201 and 510.210; Transactions Prohibited For Persons Owned or Controlled By U.S. Financial Institutions: North Korea Sanctions Regulations section 510.214; Passport E59165201 (China) expires 01 Sep 2025; Identification Number 371326198812157611 (China); a.k.a. 'WAKEMEUPUPUP'; a.k.a. 'FAST4RELEASE'; Linked To: LAZARUS GROUP." +44718,"Financial Institutions: North Korea Sanctions Regulations section 510.214; Passport 731969851 (Russia); a.k.a. 'ROMA'; a.k.a. 'POMA'." +45430,"10; Transactions Prohibited For Persons Owned or Controlled By U.S. Financial Institutions: North Korea Sanctions Regulations section 510.214; a.k.a. 'THALLIUM'; a.k.a. 'BLACK BANSHEE'; a.k.a. 'VELVET CHOLLIMA'; a.k.a. 'APT43'; a.k.a. 'ARCHIPELAGO'; a.k.a. 'EMERALD SLEET'; a.k.a. 'NICKEL KIMBALL'." + \ No newline at end of file