mirror of
https://github.com/GMWalletApp/epusdt.git
synced 2026-07-07 18:26:16 +00:00
Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e69cade706 | |||
| 220d73df6e | |||
| aacf37cc10 | |||
| ec4410af8f | |||
| 8908455183 | |||
| 37d4ed3844 | |||
| e53e964213 | |||
| b2e33a7601 | |||
| a6795510a2 | |||
| 8f8a93527a | |||
| 405115165f | |||
| 5d39e41ec9 | |||
| c4122b2963 | |||
| a50daa4993 | |||
| 2ff0540328 | |||
| 0c9e876f1f |
@@ -39,11 +39,16 @@ Epusdt
|
||||
|
||||
## 教程:
|
||||
- 宝塔运行`epusdt`教程👉🏻[宝塔运行epusdt](wiki/BT_RUN.md)
|
||||
- 不好意思我有洁癖,手动运行`epusdt`教程👉🏻[手动运行epusdt](wiki/manual_RUN.md)
|
||||
- 开发者接入`epusdt`文档👉🏻[开发者接入epusdt](wiki/API.md)
|
||||
- HTML+PHP极速运行`epusdt`教程👉🏻[使用PHPAPI-for-epusdt极速接入epusdt](https://github.com/BlueSkyXN/PHPAPI-for-epusdt)
|
||||
|
||||
## 已适配系统插件
|
||||
- 独角数卡[插件地址](plugins/dujiaoka)
|
||||
|
||||
## 🔥推荐服务器
|
||||
- (美国免备案vps,配置2核2G仅需`20.98$`≈`145RMB`一年/支持支付宝付款)[👉🏻点我直达](https://my.racknerd.com/aff.php?aff=2745&pid=681)
|
||||
|
||||
## 加入交流/意见反馈
|
||||
- `Epusdt`频道[https://t.me/epusdt](https://t.me/epusdt)
|
||||
- `Epusdt`交流群组[https://t.me/epusdt_group](https://t.me/epusdt_group)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# This is an example .goreleaser.yml file with some sensible defaults.
|
||||
# Make sure to check the documentation at https://goreleaser.com
|
||||
project_name: epusdt
|
||||
before:
|
||||
hooks:
|
||||
# You may remove this if you don't use go modules.
|
||||
@@ -15,8 +16,8 @@ builds:
|
||||
- windows
|
||||
goarch:
|
||||
- amd64
|
||||
#- arm
|
||||
#- 386
|
||||
- arm
|
||||
- 386
|
||||
archives:
|
||||
- replacements:
|
||||
darwin: Darwin
|
||||
@@ -25,7 +26,7 @@ archives:
|
||||
386: i386
|
||||
amd64: x86_64
|
||||
id: epusdt
|
||||
name_template: "{{ .ProjectName }}_v0.0.1_{{ .Os }}_{{ .Arch }}"
|
||||
name_template: "{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}"
|
||||
format: tar.gz
|
||||
files:
|
||||
- .env.example
|
||||
|
||||
+9
-1
@@ -6,19 +6,27 @@ require (
|
||||
github.com/go-redis/redis/v8 v8.11.5
|
||||
github.com/go-resty/resty/v2 v2.7.0
|
||||
github.com/golang-module/carbon/v2 v2.0.1
|
||||
github.com/google/btree v1.0.0 // indirect
|
||||
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect
|
||||
github.com/google/uuid v1.3.0 // indirect
|
||||
github.com/gookit/color v1.5.0
|
||||
github.com/gookit/goutil v0.4.6
|
||||
github.com/gookit/validate v1.3.1
|
||||
github.com/hibiken/asynq v0.22.1
|
||||
github.com/hibiken/asynq v0.23.0
|
||||
github.com/json-iterator/go v1.1.12
|
||||
github.com/labstack/echo/v4 v4.6.0
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
github.com/natefinch/lumberjack v2.0.0+incompatible
|
||||
github.com/robfig/cron/v3 v3.0.1
|
||||
github.com/satori/go.uuid v1.2.0
|
||||
github.com/shopspring/decimal v1.3.1
|
||||
github.com/spf13/cast v1.5.0 // indirect
|
||||
github.com/spf13/cobra v1.2.1
|
||||
github.com/spf13/viper v1.9.0
|
||||
go.uber.org/zap v1.17.0
|
||||
golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec // indirect
|
||||
golang.org/x/time v0.0.0-20220922220347-f3bd1da661af // indirect
|
||||
google.golang.org/protobuf v1.28.1 // indirect
|
||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
|
||||
gopkg.in/telebot.v3 v3.0.0
|
||||
gorm.io/driver/mysql v1.1.2
|
||||
|
||||
+19
@@ -71,6 +71,7 @@ github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWH
|
||||
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
@@ -88,6 +89,7 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv
|
||||
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
|
||||
github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
|
||||
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
|
||||
github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||
github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI=
|
||||
@@ -162,6 +164,8 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
|
||||
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=
|
||||
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
||||
@@ -186,6 +190,8 @@ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm4
|
||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs=
|
||||
github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||
github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
|
||||
@@ -236,6 +242,8 @@ github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/J
|
||||
github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk=
|
||||
github.com/hibiken/asynq v0.22.1 h1:t7bbiz2O4MC69qKeKp5UON7ToxynBNXT/kTP/XYq9M8=
|
||||
github.com/hibiken/asynq v0.22.1/go.mod h1:K70jPVx+CAmmQrXot7Dru0D52EO7ob4BIun3ri5z1Qw=
|
||||
github.com/hibiken/asynq v0.23.0 h1:kmKkNFgqiXBatC8oz94Mer6uvKoGn4STlIVDV5wnKyE=
|
||||
github.com/hibiken/asynq v0.23.0/go.mod h1:K70jPVx+CAmmQrXot7Dru0D52EO7ob4BIun3ri5z1Qw=
|
||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||
@@ -258,9 +266,11 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=
|
||||
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/labstack/echo/v4 v4.6.0 h1:vsYEeeYy077cB5yMpgI+ubA7iVRZEtrzHhcvRhd27gA=
|
||||
github.com/labstack/echo/v4 v4.6.0/go.mod h1:RnjgMWNDB9g/HucVWhQYNQP9PvbYf6adqftqryo7s9k=
|
||||
github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0=
|
||||
@@ -340,6 +350,7 @@ github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
|
||||
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
|
||||
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
|
||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
||||
github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE=
|
||||
@@ -357,6 +368,8 @@ github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z
|
||||
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||
github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA=
|
||||
github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||
github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=
|
||||
github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU=
|
||||
github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw=
|
||||
github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk=
|
||||
github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
|
||||
@@ -592,6 +605,8 @@ golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBc
|
||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0=
|
||||
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec h1:BkDtF2Ih9xZ7le9ndzTA7KJow28VbQW3odyk/8drmuI=
|
||||
golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
@@ -609,6 +624,8 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb
|
||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE=
|
||||
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20220922220347-f3bd1da661af h1:Yx9k8YCG3dvF87UAn2tu2HQLf2dt/eR1bXxpLMWeH+Y=
|
||||
golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
@@ -798,6 +815,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0
|
||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
|
||||
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
|
||||
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
|
||||
|
||||
@@ -21,10 +21,10 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
CnyMinimumPaymentAmount = 0.01 // cny最低支付金额
|
||||
UsdtMinimumPaymentAmount = 0.001 // usdt最低支付金额
|
||||
UsdtAmountPerIncrement = 0.001 // usdt每次递增金额
|
||||
IncrementalMaximumNumber = 100 // 最大递增次数
|
||||
CnyMinimumPaymentAmount = 0.01 // cny最低支付金额
|
||||
UsdtMinimumPaymentAmount = 0.01 // usdt最低支付金额
|
||||
UsdtAmountPerIncrement = 0.01 // usdt每次递增金额
|
||||
IncrementalMaximumNumber = 100 // 最大递增次数
|
||||
)
|
||||
|
||||
var gCreateTransactionLock sync.Mutex
|
||||
@@ -62,7 +62,7 @@ func CreateTransaction(req *request.CreateTransactionRequest) (*response.CreateT
|
||||
if len(walletAddress) <= 0 {
|
||||
return nil, constant.NotAvailableWalletAddress
|
||||
}
|
||||
amount := math.MustParsePrecFloat64(decimalUsdt.InexactFloat64(), 3)
|
||||
amount := math.MustParsePrecFloat64(decimalUsdt.InexactFloat64(), 2)
|
||||
availableToken, availableAmount, err := CalculateAvailableWalletAndAmount(amount, walletAddress)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
||||
@@ -18,12 +18,12 @@ import (
|
||||
"sync"
|
||||
)
|
||||
|
||||
const UsdtTrc20ApiUri = "https://apilist.tronscan.org/api/token_trc20/transfers"
|
||||
const UsdtTrc20ApiUri = "https://apilist.tronscanapi.com/api/transfer/trc20"
|
||||
|
||||
type UsdtTrc20Resp struct {
|
||||
Total int `json:"total"`
|
||||
RangeTotal int `json:"rangeTotal"`
|
||||
TokenTransfers []TokenTransfers `json:"token_transfers"`
|
||||
PageSize int `json:"page_size"`
|
||||
Code int `json:"code"`
|
||||
Data []Data `json:"data"`
|
||||
}
|
||||
|
||||
type TokenInfo struct {
|
||||
@@ -35,26 +35,29 @@ type TokenInfo struct {
|
||||
TokenType string `json:"tokenType"`
|
||||
TokenLogo string `json:"tokenLogo"`
|
||||
TokenLevel string `json:"tokenLevel"`
|
||||
IssuerAddr string `json:"issuerAddr"`
|
||||
Vip bool `json:"vip"`
|
||||
}
|
||||
type TokenTransfers struct {
|
||||
TransactionID string `json:"transaction_id"`
|
||||
BlockTs int64 `json:"block_ts"`
|
||||
FromAddress string `json:"from_address"`
|
||||
ToAddress string `json:"to_address"`
|
||||
Block int `json:"block"`
|
||||
ContractAddress string `json:"contract_address"`
|
||||
Quant string `json:"quant"`
|
||||
ApprovalAmount string `json:"approval_amount"`
|
||||
EventType string `json:"event_type"`
|
||||
ContractType string `json:"contract_type"`
|
||||
Confirmed bool `json:"confirmed"`
|
||||
ContractRet string `json:"contractRet"`
|
||||
FinalResult string `json:"finalResult"`
|
||||
TokenInfo TokenInfo `json:"tokenInfo"`
|
||||
FromAddressIsContract bool `json:"fromAddressIsContract"`
|
||||
ToAddressIsContract bool `json:"toAddressIsContract"`
|
||||
Revert bool `json:"revert"`
|
||||
|
||||
type Data struct {
|
||||
Amount string `json:"amount"`
|
||||
ApprovalAmount string `json:"approval_amount"`
|
||||
BlockTimestamp int64 `json:"block_timestamp"`
|
||||
Block int `json:"block"`
|
||||
From string `json:"from"`
|
||||
To string `json:"to"`
|
||||
Hash string `json:"hash"`
|
||||
Confirmed int `json:"confirmed"`
|
||||
ContractType string `json:"contract_type"`
|
||||
ContracTType int `json:"contractType"`
|
||||
Revert int `json:"revert"`
|
||||
ContractRet string `json:"contract_ret"`
|
||||
EventType string `json:"event_type"`
|
||||
IssueAddress string `json:"issue_address"`
|
||||
Decimals int `json:"decimals"`
|
||||
TokenName string `json:"token_name"`
|
||||
ID string `json:"id"`
|
||||
Direction int `json:"direction"`
|
||||
}
|
||||
|
||||
// Trc20CallBack trc20回调
|
||||
@@ -69,11 +72,13 @@ func Trc20CallBack(token string, wg *sync.WaitGroup) {
|
||||
startTime := carbon.Now().AddHours(-24).TimestampWithMillisecond()
|
||||
endTime := carbon.Now().TimestampWithMillisecond()
|
||||
resp, err := client.R().SetQueryParams(map[string]string{
|
||||
"limit": "200",
|
||||
"sort": "-timestamp",
|
||||
"limit": "50",
|
||||
"start": "0",
|
||||
"direction": "in",
|
||||
"tokens": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
|
||||
"relatedAddress": token,
|
||||
"direction": "2",
|
||||
"db_version": "1",
|
||||
"trc20Id": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
|
||||
"address": token,
|
||||
"start_timestamp": stdutil.ToString(startTime),
|
||||
"end_timestamp": stdutil.ToString(endTime),
|
||||
}).Get(UsdtTrc20ApiUri)
|
||||
@@ -88,14 +93,14 @@ func Trc20CallBack(token string, wg *sync.WaitGroup) {
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if trc20Resp.Total <= 0 {
|
||||
if trc20Resp.PageSize <= 0 {
|
||||
return
|
||||
}
|
||||
for _, transfer := range trc20Resp.TokenTransfers {
|
||||
if transfer.ToAddress != token || transfer.FinalResult != "SUCCESS" {
|
||||
for _, transfer := range trc20Resp.Data {
|
||||
if transfer.To != token || transfer.ContractRet != "SUCCESS" {
|
||||
continue
|
||||
}
|
||||
decimalQuant, err := decimal.NewFromString(transfer.Quant)
|
||||
decimalQuant, err := decimal.NewFromString(transfer.Amount)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
@@ -114,7 +119,7 @@ func Trc20CallBack(token string, wg *sync.WaitGroup) {
|
||||
}
|
||||
// 区块的确认时间必须在订单创建时间之后
|
||||
createTime := order.CreatedAt.TimestampWithMillisecond()
|
||||
if transfer.BlockTs < createTime {
|
||||
if transfer.BlockTimestamp < createTime {
|
||||
panic("Orders cannot actually be matched")
|
||||
}
|
||||
// 到这一步就完全算是支付成功了
|
||||
@@ -122,7 +127,7 @@ func Trc20CallBack(token string, wg *sync.WaitGroup) {
|
||||
Token: token,
|
||||
TradeId: tradeId,
|
||||
Amount: amount,
|
||||
BlockTransactionId: transfer.TransactionID,
|
||||
BlockTransactionId: transfer.Hash,
|
||||
}
|
||||
err = OrderProcessing(req)
|
||||
if err != nil {
|
||||
|
||||
@@ -181,6 +181,7 @@
|
||||
let second = Math.round(ms / 1000);
|
||||
let minute = Math.floor(second / 60);
|
||||
let hour = Math.floor(minute / 60);
|
||||
if(minute > 60) minute %= 60
|
||||
if (ms <= 0) {
|
||||
layer.alert("支付超时,请重新发起支付!", {icon: 5});
|
||||
return;
|
||||
@@ -240,4 +241,4 @@
|
||||
});
|
||||
}
|
||||
window.onload = checkOrderStatus();
|
||||
</script>
|
||||
</script>
|
||||
|
||||
+1
-1
@@ -7,6 +7,6 @@ func Start() {
|
||||
// 汇率监听
|
||||
c.AddJob("@every 60s", UsdtRateJob{})
|
||||
// trc20钱包监听
|
||||
c.AddJob("@every 10s", ListenTrc20Job{})
|
||||
c.AddJob("@every 5s", ListenTrc20Job{})
|
||||
c.Start()
|
||||
}
|
||||
|
||||
@@ -0,0 +1,210 @@
|
||||
## 写在前面
|
||||
|
||||
- 此教程专为有洁癖的宝宝们准备。不使用任何一键安装脚本。面板党可以退散了!!
|
||||
- 本人测试环境是 Debian 11 其他的没测试。
|
||||
## 1.下载源代码
|
||||
```bash
|
||||
cd /var/www/
|
||||
mkdir epusdt
|
||||
chmod 777 -R /var/www/epusdt
|
||||
cd epusdt
|
||||
wget https://github.com/assimon/epusdt/releases/download/v0.0.2/epusdt_v0.0.2_Linux_x86_64.tar.gz
|
||||
tar -xzf epusdt_v0.0.2_Linux_x86_64.tar.gz
|
||||
rm epusdt_v0.0.2_Linux_x86_64.tar.gz
|
||||
```
|
||||
## 2.导入Sql
|
||||
- 创建sql文件
|
||||
```bash
|
||||
nano epusdt.sql
|
||||
```
|
||||
然后复制下面的
|
||||
```sql
|
||||
-- auto-generated definition
|
||||
use epusdt;
|
||||
create table orders
|
||||
(
|
||||
id int auto_increment
|
||||
primary key,
|
||||
trade_id varchar(32) not null comment 'epusdt订单号',
|
||||
order_id varchar(32) not null comment '客户交易id',
|
||||
block_transaction_id varchar(128) null comment '区块唯一编号',
|
||||
actual_amount decimal(19, 4) not null comment '订单实际需要支付的金额,保留4位小数',
|
||||
amount decimal(19, 4) not null comment '订单金额,保留4位小数',
|
||||
token varchar(50) not null comment '所属钱包地址',
|
||||
status int default 1 not null comment '1:等待支付,2:支付成功,3:已过期',
|
||||
notify_url varchar(128) not null comment '异步回调地址',
|
||||
redirect_url varchar(128) null comment '同步回调地址',
|
||||
callback_num int default 0 null comment '回调次数',
|
||||
callback_confirm int default 2 null comment '回调是否已确认? 1是 2否',
|
||||
created_at timestamp null,
|
||||
updated_at timestamp null,
|
||||
deleted_at timestamp null,
|
||||
constraint orders_order_id_uindex
|
||||
unique (order_id),
|
||||
constraint orders_trade_id_uindex
|
||||
unique (trade_id)
|
||||
);
|
||||
|
||||
create index orders_block_transaction_id_index
|
||||
on orders (block_transaction_id);
|
||||
|
||||
-- auto-generated definition
|
||||
create table wallet_address
|
||||
(
|
||||
id int auto_increment
|
||||
primary key,
|
||||
token varchar(50) not null comment '钱包token',
|
||||
status int default 1 not null comment '1:启用 2:禁用',
|
||||
created_at timestamp null,
|
||||
updated_at timestamp null,
|
||||
deleted_at timestamp null
|
||||
)
|
||||
comment '钱包表';
|
||||
|
||||
create index wallet_address_token_index
|
||||
on wallet_address (token);
|
||||
```
|
||||
`ctrl+x` 退出,按 `Y`保存 再按回车就好了
|
||||
- 创建数据库
|
||||
```bash
|
||||
mysql
|
||||
```
|
||||
接下来输入命令
|
||||
```sql
|
||||
CREATE DATABASE [这里替换为数据库名] ;
|
||||
GRANT ALL ON [这里替换为数据库名].* TO '[这里替换为用户名]'@'localhost' IDENTIFIED BY '[这里替换为密码]' WITH GRANT OPTION;
|
||||
FLUSH PRIVILEGES;
|
||||
EXIT
|
||||
```
|
||||
- 导入sql文件
|
||||
```bash
|
||||
mysql -u[用户名] -p[密码] < epusdt.sql
|
||||
```
|
||||
## 3.配置反向代理
|
||||
```bash
|
||||
nano /etc/nginx/sites-enabled/epusdt
|
||||
```
|
||||
你可以参考以下我的配置文件,注意更改域名。
|
||||
```bash
|
||||
server {
|
||||
listen 80;
|
||||
server_name domain.com;
|
||||
return 301 https://domain.com$request_uri;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name domain.com;
|
||||
ssl_certificate /etc/nginx/sslcert/cert.crt;
|
||||
ssl_certificate_key /etc/nginx/sslcert/key.key;
|
||||
ssl_prefer_server_ciphers on;
|
||||
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:8000;
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
## 4.赋予Epusdt执行权限
|
||||
`linux`服务器需要赋予`Epust`执行权限方可启动。
|
||||
执行命令```chmod +x epusdt```赋予权限
|
||||
## 5、配置Epusdt
|
||||
执行命令
|
||||
```bash
|
||||
mv .env.example .env
|
||||
nano .env
|
||||
```
|
||||
|
||||
```dotenv
|
||||
app_name=epusdt
|
||||
#下面配置你的域名,收银台会需要
|
||||
app_uri=https://upay.dujiaoka.com
|
||||
#是否开启debug,默认false
|
||||
app_debug=false
|
||||
#http服务监听端口
|
||||
http_listen=:8000
|
||||
#静态资源文件目录
|
||||
static_path=/static
|
||||
#缓存路径
|
||||
runtime_root_path=/runtime
|
||||
#日志配置
|
||||
log_save_path=/logs
|
||||
log_max_size=32
|
||||
log_max_age=7
|
||||
max_backups=3
|
||||
# mysql配置
|
||||
mysql_host=127.0.0.1
|
||||
mysql_port=3306
|
||||
mysql_user=mysql账号
|
||||
mysql_passwd=mysql密码
|
||||
mysql_database=数据库
|
||||
mysql_table_prefix=
|
||||
mysql_max_idle_conns=10
|
||||
mysql_max_open_conns=100
|
||||
mysql_max_life_time=6
|
||||
# redis配置
|
||||
redis_host=127.0.0.1
|
||||
redis_port=6379
|
||||
redis_passwd=
|
||||
redis_db=5
|
||||
redis_pool_size=5
|
||||
redis_max_retries=3
|
||||
redis_idle_timeout=1000
|
||||
# 消息队列配置
|
||||
queue_concurrency=10
|
||||
queue_level_critical=6
|
||||
queue_level_default=3
|
||||
queue_level_low=1
|
||||
#机器人Apitoken
|
||||
tg_bot_token=
|
||||
#telegram代理url(大陆地区服务器可使用一台国外服务器做反代tg的url),如果运行的本来就是境外服务器,则无需填写
|
||||
tg_proxy=
|
||||
#管理员userid
|
||||
tg_manage=
|
||||
#api接口认证token(用于发起交易的签名认证,请勿外泄)
|
||||
api_auth_token=
|
||||
#订单过期时间(单位分钟)
|
||||
order_expiration_time=10
|
||||
#强制汇率(设置此参数后每笔交易将按照此汇率计算,例如:6.4)
|
||||
forced_usdt_rate=
|
||||
```
|
||||
⚠️注意:配置文件里面不认识的不要修改,留空即可,不会改又要瞎改,除非你对项目源代码很熟悉很有信心😁
|
||||
## 6、配置supervisor
|
||||
为了保证`Epusdt`常驻后台运行,我们需要配置`supervisor`来实现进程监听
|
||||
```bash
|
||||
nano /etc/supervisor/conf.d/epusdt.conf
|
||||
```
|
||||
你可以参考以下我的配置文件,注意更改路径。
|
||||
```conf
|
||||
[program:epusdt]
|
||||
process_name=epusdt
|
||||
directory=/var/www/epusdt
|
||||
command=/var/www/epusdt/epusdt http start
|
||||
autostart=true
|
||||
autorestart=true
|
||||
user=www-data
|
||||
numprocs=1
|
||||
redirect_stderr=true
|
||||
stdout_logfile=/var/log/supervisor/epusdt.log
|
||||
```
|
||||
接下来输入命令
|
||||
```bash
|
||||
supervisorctl reread
|
||||
supervisorctl update
|
||||
supervisorctl start epusdt
|
||||
supervisorctl tail epusdt
|
||||
```
|
||||
出现下图,即为配置成功
|
||||
```bash
|
||||
_____ _ _
|
||||
| ____|_ __ _ _ ___ __| | |_
|
||||
| _| | '_ \| | | / __|/ _` | __|
|
||||
| |___| |_) | |_| \__ \ (_| | |_
|
||||
|_____| .__/ \__,_|___/\__,_|\__|
|
||||
|_|
|
||||
Epusdt version(0.0.2) Powered by assimon https://github.com/assimon/epusdt
|
||||
⇨ http server started on [::]:8000
|
||||
```
|
||||
## 其他注意事项
|
||||
- 1.所有`.env`配置文件有了修改后都需要重启supervisor进程 `supervisorctl restart epusdt`
|
||||
- 2.教程所示的目录均为参考,请勿1:1照抄,根据自己实际情况来
|
||||
Reference in New Issue
Block a user