|
|
@@ -535,6 +535,22 @@ func cmdToken() *cobra.Command {
|
|
|
tokCmd.AddCommand(cmd)
|
|
|
}
|
|
|
|
|
|
+ {
|
|
|
+ cmd := &cobra.Command{Use: "get-info [token-id]", Short: "Show owner and content", Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) {
|
|
|
+ loadEnv()
|
|
|
+ id, ok := new(big.Int).SetString(args[0], 10); if !ok { log.Fatal("invalid token-id") }
|
|
|
+ ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second); defer cancel()
|
|
|
+ c, _ := mustClient(ctx)
|
|
|
+ addr := mustAddress(tokenAddr, "EASY_TOKEN_ADDR")
|
|
|
+ con := boundContract(addr, easyTokenDocumentABI, c)
|
|
|
+ owner, err := callAddress(ctx, con, "ownerOf", id); if err != nil { log.Fatal(err) }
|
|
|
+ content, err := callString(ctx, con, "contentOf", id); if err != nil { log.Fatal(err) }
|
|
|
+ fmt.Printf("owner=%s\n", owner.Hex())
|
|
|
+ fmt.Printf("content=%s\n", content)
|
|
|
+ }}
|
|
|
+ tokCmd.AddCommand(cmd)
|
|
|
+ }
|
|
|
+
|
|
|
// balance
|
|
|
var tbAddr string
|
|
|
{
|
|
|
@@ -639,24 +655,33 @@ func cmdToken() *cobra.Command {
|
|
|
tokCmd.AddCommand(cmd)
|
|
|
}
|
|
|
|
|
|
- // safe-mint
|
|
|
- var smTo, smURI, smHash, smVal string
|
|
|
+ // mint content
|
|
|
{
|
|
|
- cmd := &cobra.Command{Use: "safe-mint", Short: "Mint new document NFT", Run: func(cmd *cobra.Command, args []string) {
|
|
|
- loadEnv(); if smTo==""||smURI==""||smHash==""||smVal=="" { log.Fatal("--to --uri --hash --value required") }
|
|
|
- h, err := fromHex32(smHash); if err != nil { log.Fatal(err) }
|
|
|
- v, err := toWei(smVal); if err != nil { log.Fatal(err) }
|
|
|
+ cmd := &cobra.Command{Use: "mint [content]", Short: "Mint new token content (<=20 chars)", Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) {
|
|
|
+ content := args[0]
|
|
|
+ if content == "" { log.Fatal("content required") }
|
|
|
+ if len([]byte(content)) > 20 { log.Fatal("content must be at most 20 bytes") }
|
|
|
+ loadEnv()
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), 240*time.Second); defer cancel()
|
|
|
c, chain := mustClient(ctx); auth := txOpts(ctx, c, chain)
|
|
|
addr := mustAddress(tokenAddr, "EASY_TOKEN_ADDR")
|
|
|
con := boundContract(addr, easyTokenDocumentABI, c)
|
|
|
- tx, err := con.Transact(auth, "safeMint", common.HexToAddress(smTo), smURI, h, v); if err != nil { log.Fatal(err) }
|
|
|
- fmt.Println(tx.Hash().Hex())
|
|
|
+ sender := crypto.PubkeyToAddress(mustPrivKey().PublicKey)
|
|
|
+ tx, err := con.Transact(auth, "mintContent", sender, content); if err != nil { log.Fatal(err) }
|
|
|
+ receipt, err := bind.WaitMined(ctx, c, tx); if err != nil { log.Fatal(err) }
|
|
|
+ mintSig := crypto.Keccak256Hash([]byte("ContentMinted(uint256,address,string)"))
|
|
|
+ tokenID := new(big.Int)
|
|
|
+ for _, lg := range receipt.Logs {
|
|
|
+ if lg.Address == addr && len(lg.Topics) >= 3 && lg.Topics[0] == mintSig {
|
|
|
+ tokenID.SetBytes(lg.Topics[1].Bytes())
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ fmt.Printf("tx=%s\n", tx.Hash().Hex())
|
|
|
+ if tokenID.Sign() > 0 {
|
|
|
+ fmt.Printf("tokenId=%s\n", tokenID.String())
|
|
|
+ }
|
|
|
}}
|
|
|
- cmd.Flags().StringVar(&smTo, "to", "", "Recipient address")
|
|
|
- cmd.Flags().StringVar(&smURI, "uri", "", "Document URL")
|
|
|
- cmd.Flags().StringVar(&smHash, "hash", "", "Document hash (0x + 64 hex)")
|
|
|
- cmd.Flags().StringVar(&smVal, "value", "", "Appraisal in base units")
|
|
|
tokCmd.AddCommand(cmd)
|
|
|
}
|
|
|
|