-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtransfer_fungible_token.go
151 lines (113 loc) · 4.82 KB
/
transfer_fungible_token.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package main
import (
"fmt"
"os"
"github.com/hashgraph/hedera-sdk-go/v2"
"github.com/joho/godotenv"
)
func main() {
//LOADS THE .ENV FILE AND THROWS AN EROOR IF IT CANNOT LOAD THE VARIABLES
err := godotenv.Load(".env")
if err != nil {
panic(fmt.Errorf("Unable to load enviroment variables from .env file. Error:\n%v\n", err))
}
//GRAB YOUR TESTNET ACCOUNT ID AND KEY FROMZ THE .ENV FILE
myAccountId, err := hedera.AccountIDFromString(os.Getenv("MY_ACCOUNT_ID"))
if err != nil {
panic(err)
}
myPrivateKey, err := hedera.PrivateKeyFromString(os.Getenv("MY_PRIVATE_KEY"))
if err != nil {
panic(err)
}
//PRINT ACCOUNT ID AND KEY TO MAKE SURE THERE WASN'T AN ERROR READING FROM THE .ENV FILE
fmt.Printf("The account ID is = %v\n", myAccountId)
fmt.Printf("The private key is = %v\n", myPrivateKey)
//CREATE TESTNET CLIENT
client := hedera.ClientForTestnet()
client.SetOperator(myAccountId, myPrivateKey)
//CREATE TREASURY KEY
treasuryKey, err := hedera.GeneratePrivateKey()
treasuryPublicKey := treasuryKey.PublicKey()
//CREATE TREASURY ACCOUNT
treasuryAccount, err := hedera.NewAccountCreateTransaction().
SetKey(treasuryPublicKey).
SetInitialBalance(hedera.NewHbar(10)).
Execute(client)
//GET THE RECEIPT OF THE TRANSACTION
receipt, err := treasuryAccount.GetReceipt(client)
//GET THE ACCOUNT ID
treasuryAccountId := *receipt.AccountID
//ALICE'S KEY
aliceKey, err := hedera.GeneratePrivateKey()
alicePublicKey := aliceKey.PublicKey()
//CREATE AILICE'S ACCOUNT
aliceAccount, err := hedera.NewAccountCreateTransaction().
SetKey(alicePublicKey).
SetInitialBalance(hedera.NewHbar(10)).
Execute(client)
//GET THE RECEIPT OF THE TRANSACTION
receipt2, err := aliceAccount.GetReceipt(client)
//GET ALICE'S ACCOUNT ID
aliceAccountId := *receipt2.AccountID
//CREATE SUPPLY KEY
supplyKey, err := hedera.GeneratePrivateKey()
//CREATE FUNGIBLE TOKEN (STABLECOIN)
tokenCreateTx, err := hedera.NewTokenCreateTransaction().
SetTokenName("USD Bar").
SetTokenSymbol("USDB").
SetTokenType(hedera.TokenTypeFungibleCommon).
SetDecimals(2).
SetInitialSupply(10000).
SetTreasuryAccountID(treasuryAccountId).
SetSupplyType(hedera.TokenSupplyTypeInfinite).
SetSupplyKey(supplyKey).
FreezeWith(client)
//SIGN WITH TREASURY KEY
tokenCreateSign := tokenCreateTx.Sign(treasuryKey)
//SUBMIT THE TRANSACTION
tokenCreateSubmit, err := tokenCreateSign.Execute(client)
//GET THE TRANSACTION RECEIPT
tokenCreateRx, err := tokenCreateSubmit.GetReceipt(client)
//GET THE TOKEN ID
tokenId := *tokenCreateRx.TokenID
//LOG THE TOKEN ID TO THE CONSOLE
fmt.Println("Created fungible token with token ID", tokenId)
//TOKEN ASSOCIATION WITH ALICE's ACCOUNT
associateAliceTx, err := hedera.NewTokenAssociateTransaction().
SetAccountID(aliceAccountId).
SetTokenIDs(tokenId).
FreezeWith(client)
//SIGN WITH ALICE'S KEY TO AUTHORIZE THE ASSOCIATION
signTx := associateAliceTx.Sign(aliceKey)
//SUBMIT THE TRANSACTION
associateAliceTxSubmit, err := signTx.Execute(client)
//GET THE RECEIPT OF THE TRANSACTION
associateAliceRx, err := associateAliceTxSubmit.GetReceipt(client)
//LOG THE TRANSACTION STATUS
fmt.Println("STABLECOIN token association with Alice's account:", associateAliceRx.Status)
//Check the balance before the transfer for the treasury account
balanceCheckTreasury, err := hedera.NewAccountBalanceQuery().SetAccountID(treasuryAccountId).Execute(client)
fmt.Println("Treasury balance:", balanceCheckTreasury.Tokens, "units of token ID", tokenId)
//Check the balance before the transfer for Alice's account
balanceCheckAlice, err := hedera.NewAccountBalanceQuery().SetAccountID(aliceAccountId).Execute(client)
fmt.Println("Alice's balance:", balanceCheckAlice.Tokens, "units of token ID", tokenId)
//Transfer the STABLECOIN from treasury to Alice
tokenTransferTx, err := hedera.NewTransferTransaction().
AddTokenTransfer(tokenId, treasuryAccountId, -2500).
AddTokenTransfer(tokenId, aliceAccountId, 2500).
FreezeWith(client)
//SIGN WITH THE TREASURY KEY TO AUTHORIZE THE TRANSFER
signTransferTx := tokenTransferTx.Sign(treasuryKey)
//SUBMIT THE TRANSACTION
tokenTransferSubmit, err := signTransferTx.Execute(client)
//GET THE TRANSACTION RECEIPT
tokenTransferRx, err := tokenTransferSubmit.GetReceipt(client)
fmt.Println("Token transfer from Treasury to Alice:", tokenTransferRx.Status)
//CHECK THE BALANCE AFTER THE TRANSFER FOR THE TREASURY ACCOUNT
balanceCheckTreasury2, err := hedera.NewAccountBalanceQuery().SetAccountID(treasuryAccountId).Execute(client)
fmt.Println("Treasury balance:", balanceCheckTreasury2.Tokens, "units of token", tokenId)
//CHECK THE BALANCE AFTER THE TRANSFER FOR ALICE'S ACCOUNT
balanceCheckAlice2, err := hedera.NewAccountBalanceQuery().SetAccountID(aliceAccountId).Execute(client)
fmt.Println("Alice's balance:", balanceCheckAlice2.Tokens, "units of token", tokenId)
}