Skip to content

Commit 5a24014

Browse files
committed
feat: support metaplex tokenmeta decode
1 parent 470bc5c commit 5a24014

5 files changed

Lines changed: 78 additions & 0 deletions

File tree

common/program_id.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@ var (
1010
TokenProgramID = PublicKeyFromString("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA")
1111
SPLAssociatedTokenAccountProgramID = PublicKeyFromString("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL")
1212
SPLNameServiceProgramID = PublicKeyFromString("namesLPneVptA9Z5rqUDD9tMTWEJwofgaYwp8cawRkX")
13+
MetaplexTokenMetaProgramID = PublicKeyFromString("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s")
1314
)

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ go 1.16
55
require (
66
filippo.io/edwards25519 v1.0.0-rc.1
77
github.com/mr-tron/base58 v1.2.0
8+
github.com/near/borsh-go v0.3.1-0.20210831082424-4377deff6791
89
github.com/stretchr/testify v1.7.0
910
)

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8
44
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
55
github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
66
github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
7+
github.com/near/borsh-go v0.3.1-0.20210831082424-4377deff6791 h1:8uy2DX0wCU3Ac8bHWq2Z11zquQ+iKX9Yk3JAmVdHkWk=
8+
github.com/near/borsh-go v0.3.1-0.20210831082424-4377deff6791/go.mod h1:NeMochZp7jN/pYFuxLkrZtmLqbADmnp/y1+/dL+AsyQ=
79
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
810
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
911
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package tokenmeta
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/near/borsh-go"
7+
"github.com/portto/solana-go-sdk/common"
8+
)
9+
10+
type Key borsh.Enum
11+
12+
const (
13+
KeyUninitialized Key = iota
14+
KeyEditionV1
15+
KeyMasterEditionV1
16+
KeyReservationListV1
17+
KeyMetadataV1
18+
KeyReservationListV2
19+
KeyMasterEditionV2
20+
KeyEditionMarker
21+
)
22+
23+
type Creator struct {
24+
Address common.PublicKey
25+
Verified bool
26+
Share uint8
27+
}
28+
29+
type Data struct {
30+
Name string
31+
Symbol string
32+
Uri string
33+
SellerFeeBasisPoints uint16
34+
Creators *[]Creator
35+
}
36+
37+
type Metadata struct {
38+
Key Key
39+
UpdateAuthority common.PublicKey
40+
Mint common.PublicKey
41+
Data Data
42+
PrimarySaleHappened bool
43+
IsMutable bool
44+
EditionNonce *uint8
45+
}
46+
47+
func MetadataDeserialize(data []byte) (Metadata, error) {
48+
var metadata Metadata
49+
err := borsh.Deserialize(&metadata, data)
50+
if err != nil {
51+
return Metadata{}, fmt.Errorf("failed to deserialize data, err: %v", err)
52+
}
53+
return metadata, nil
54+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package tokenmeta
2+
3+
import (
4+
"github.com/portto/solana-go-sdk/common"
5+
)
6+
7+
func GetTokenMetaPubkey(mint common.PublicKey) (common.PublicKey, error) {
8+
metadataAccount, _, err := common.FindProgramAddress(
9+
[][]byte{
10+
[]byte("metadata"),
11+
common.MetaplexTokenMetaProgramID.Bytes(),
12+
mint.Bytes(),
13+
},
14+
common.MetaplexTokenMetaProgramID,
15+
)
16+
if err != nil {
17+
return common.PublicKey{}, err
18+
}
19+
return metadataAccount, nil
20+
}

0 commit comments

Comments
 (0)