diff --git a/example/claim/main.go b/example/claim/main.go new file mode 100644 index 0000000..ae780c0 --- /dev/null +++ b/example/claim/main.go @@ -0,0 +1,94 @@ +package main + +import ( + "encoding/base64" + "encoding/json" + "fmt" + "io" + "log" + "math/rand" + "net/http" + + "github.com/xssnick/tonutils-go/address" + "github.com/xssnick/tonutils-go/tvm/cell" +) + +const COMPRESSED_NFT_API_URL = "http://localhost:8081/v1" + +func main() { + // 1. Fetch collection state + resp, err := http.Get(fmt.Sprintf("%s/state", COMPRESSED_NFT_API_URL)) + if err != nil { + log.Fatalln("Fetch state err:", err.Error()) + return + } + defer resp.Body.Close() + + b, err := io.ReadAll(resp.Body) + if err != nil { + log.Fatalln("ReadAll state err:", err.Error()) + return + } + + var state struct { + Address string `json:"address"` + } + err = json.Unmarshal(b, &state) + if err != nil { + log.Fatalln("Unmarshal state err:", err.Error()) + return + } + + // 2. Fetch proof cell for a specific item (by its index) + var itemIndex uint64 = 1 + resp, err = http.Get(fmt.Sprintf("%s/items/%d", COMPRESSED_NFT_API_URL, itemIndex)) + if err != nil { + log.Fatalln("Fetch item err:", err.Error()) + return + } + defer resp.Body.Close() + + b, err = io.ReadAll(resp.Body) + if err != nil { + log.Fatalln("ReadAll item err:", err.Error()) + return + } + + var item struct { + ProofCellBase64 string `json:"proof_cell"` + } + err = json.Unmarshal(b, &item) + if err != nil { + log.Fatalln("Unmarshal item err:", err.Error()) + return + } + + // 3. Prepare payload for the claim transacation + proofCellDecoded, err := base64.StdEncoding.DecodeString(item.ProofCellBase64) + if err != nil { + log.Fatalln("DecodeString err:", err.Error()) + return + } + proofCell, err := cell.FromBOC(proofCellDecoded) + if err != nil { + log.Fatalln("FromBOC err:", err.Error()) + return + } + payload := cell.BeginCell(). + MustStoreUInt(0x13a3ca6, 32). + MustStoreUInt(rand.Uint64(), 64). + MustStoreUInt(itemIndex, 256). + MustStoreRef(proofCell). + EndCell() + + // 4. Complete the transaction + collectionAddrs := address.MustParseRawAddr(state.Address) + amount := "85000000" // Claim transaction min is 0.085 TON (https://github.com/ton-community/compressed-nft-contract/blob/de529e67971f0c888ef496cf983d681a5a13a06b/contracts/collection_new.fc#L22) + link := fmt.Sprintf( + "ton://transfer/%v?amount=%s&bin=%v", + collectionAddrs.String(), + amount, + base64.RawURLEncoding.EncodeToString(payload.ToBOC()), + ) + fmt.Println(link) +} diff --git a/go.mod b/go.mod index 69275e5..ab453a3 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/labstack/echo/v4 v4.10.2 github.com/rs/zerolog v1.29.1 github.com/spf13/cobra v1.7.0 - github.com/xssnick/tonutils-go v1.7.4 + github.com/xssnick/tonutils-go v1.9.7 ) require ( @@ -30,10 +30,10 @@ require ( github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect go.uber.org/atomic v1.7.0 // indirect - golang.org/x/crypto v0.9.0 // indirect + golang.org/x/crypto v0.17.0 // indirect golang.org/x/net v0.10.0 // indirect golang.org/x/sync v0.2.0 // indirect - golang.org/x/sys v0.10.0 // indirect - golang.org/x/text v0.9.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect ) diff --git a/go.sum b/go.sum index e3c9afb..fb4d27f 100644 --- a/go.sum +++ b/go.sum @@ -78,12 +78,12 @@ github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyC github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/xssnick/tonutils-go v1.7.4 h1:t27eGhwkmaiSyslzZDAdOxM5cuEEjP2fMbyVxnXYWu0= -github.com/xssnick/tonutils-go v1.7.4/go.mod h1:wH8ldhLueyfXW15r3MyaIq9YzA+8bzvL6UMU2BLp08g= +github.com/xssnick/tonutils-go v1.9.7 h1:DRlTp9I4LmMXCQEIkoAT4H+10ShSz24tuzScg+SdThU= +github.com/xssnick/tonutils-go v1.9.7/go.mod h1:p1l1Bxdv9sz6x2jfbuGQUGJn6g5cqg7xsTp8rBHFoJY= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= @@ -94,10 +94,10 @@ golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo=