(define-module (guix)
#:use-module (guix packages)
#:use-module ((guix licenses) #:prefix license:)
#:use-module (guix build-system python)
#:use-module (guix build-system gnu)
#:use-module (guix git-download)
#:use-module (guix download)
#:use-module (guix search-paths)
#:use-module (gnu packages)
#:use-module (gnu packages pkg-config)
#:use-module (gnu packages autotools)
#:use-module (gnu packages certs)
#:use-module (gnu packages check)
#:use-module (gnu packages databases)
#:use-module (gnu packages finance)
#:use-module (gnu packages gnupg)
#:use-module (gnu packages protobuf)
#:use-module (gnu packages python)
#:use-module (gnu packages python-build)
#:use-module (gnu packages python-crypto)
#:use-module (gnu packages python-xyz)
#:use-module (gnu packages libffi)
#:use-module (gnu packages license))


(define libsecp256k1-anonswap
  (package
    (name "libsecp256k1-anonswap")
    (version "anonswap_v0.2")
    (source (origin
      (method git-fetch)
      (uri (git-reference
        (url "https://github.com/tecnovert/secp256k1")
        (commit version)))
      (sha256
       (base32
        "1r07rkrw5qsnc5v1q7cb0zfs1cr62fqwq7kd2v8650g6ha4k5r8i"))
      (file-name (git-file-name name version))))
    (build-system gnu-build-system)
    (arguments
     '(#:configure-flags '("--enable-shared"
                           "--disable-dependency-tracking"
                           "--with-pic"
                           "--enable-module-extrakeys"
                           "--enable-module-recovery"
                           "--enable-module-schnorrsig"
                           "--enable-experimental"
                           "--enable-module-ecdh"
                           "--enable-benchmark=no"
                           "--enable-tests=no"
                           "--enable-module-ed25519"
                           "--enable-module-generator"
                           "--enable-module-dleag"
                           "--enable-module-ecdsaotves"
                           "--with-valgrind=no"
                           )))
    (native-inputs
     (list autoconf automake libtool))
    (synopsis "C library for EC operations on curve secp256k1")
    (description
     "Optimized C library for EC operations on curve secp256k1.\n")
    (home-page "https://github.com/bitcoin-core/secp256k1")
    (license license:unlicense)))


(define python-coincurve-anonswap
  (package
    (name "python-coincurve-anonswap")
    (version "anonswap_v0.2")
    (source
     (origin
       (method git-fetch)
       (uri
        (git-reference
         (url "https://github.com/tecnovert/coincurve")
         (commit version)))
       (file-name
        (git-file-name name version))
       (sha256
        (base32 "08fz02afh88m83axfm8jsgq1c65mw1f3g07x9hz361vblvqjwzqh"))))
    (build-system python-build-system)
    (arguments
     '(#:tests? #f ;XXX fails to load "libsecp256k1.dll"
       #:phases (modify-phases %standard-phases
                  (add-after 'unpack 'patch-libsec256k1-path
                    (lambda _
                      (substitute* "setup.py"
                        (("if has_system_lib\\(\\)")
                         "if True")
                        ((", 'requests'")
                         "")
                        (("download_library\\(self\\)")
                         "")))))))
    (propagated-inputs
     (list
      libsecp256k1-anonswap
      python-asn1crypto
      python-cffi))
    (native-inputs
     (list
      python-setuptools
      pkg-config
      ))
    (synopsis "Python libsecp256k1 wrapper")
    (description "Python libsecp256k1 wrapper.")
    (home-page "https://github.com/tecnovert/coincurve")
    (license license:bsd-3)))

(define python-sqlalchemy-1.4.39
  (package
    (inherit python-sqlalchemy)
    (version "1.4.39")
    (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "SQLAlchemy" version))
        (sha256
          (base32 "09sx2lghywnm7qj1xm8xc3xrgj40bndfh2hbiaq4cfvm71h8k541"))))))

(define-public basicswap
(package
  (name "basicswap")
  (version "0.12.1")
  (source (origin
    (method git-fetch)
    (uri (git-reference
      (url "https://github.com/tecnovert/basicswap")
      (commit "15bf9b2187d3b8a03939e61b4c3ebf4d90fcc919")))
    (sha256
      (base32
        "14gn6156x53c6panxdnd1awkd23jxnihvbqy886j66w5js3b5i8h"))
    (file-name (git-file-name name version))))
  (build-system python-build-system)

  (native-search-paths (list $SSL_CERT_DIR $SSL_CERT_FILE))
  (arguments
     '(#:tests? #f ; TODO: Add coin binaries
       #:phases (modify-phases %standard-phases
                  (add-after 'unpack 'patch-env
                    (lambda* (#:key inputs #:allow-other-keys)
                      (substitute* "bin/basicswap_prepare.py"
                        (("GUIX_SSL_CERT_DIR = None")
                         (string-append "GUIX_SSL_CERT_DIR = \"" (search-input-directory inputs "etc/ssl/certs") "\"")))
                        )
                        ))))
  (propagated-inputs
   (list
    gnupg
    nss-certs
    python-coincurve-anonswap
    python-pycryptodome
    python-pytest
    python-protobuf
    python-sqlalchemy-1.4.39
    python-pyzmq
    python-gnupg
    python-jinja2
    python-pysocks
    python-mnemonic
    ))
  (native-inputs
   (list
    python-setuptools
    python-wheel
    python-pylint
    python-pyflakes
    ))
  (synopsis "Simple Atomic Swap Network - Proof of Concept")
  (description #f)
  (home-page "https://github.com/tecnovert/basicswap")
  (license license:bsd-3)))