@@ -6,14 +6,22 @@ import com.algorand.algosdk.transaction.Transaction
6
6
import com.algorand.algosdk.util.Encoder
7
7
import com.algorand.algosdk.v2.client.common.AlgodClient
8
8
import com.algorand.algosdk.v2.client.common.IndexerClient
9
- import com.algorand.algosdk.v2.client.model.Asset
9
+
10
10
import id.walt.nftkit.Values.ALGORAND_TESTNET_EXPLORER
11
11
import id.walt.nftkit.metadata.IPFSMetadata
12
12
import id.walt.nftkit.services.WaltIdServices.loadAlgorand
13
+ import io.ktor.client.*
13
14
import io.ktor.client.call.*
15
+ import io.ktor.client.engine.cio.*
16
+ import io.ktor.client.plugins.contentnegotiation.*
17
+ import io.ktor.client.plugins.logging.*
14
18
import io.ktor.client.request.*
19
+ import io.ktor.http.*
20
+ import io.ktor.serialization.kotlinx.json.*
15
21
import kotlinx.coroutines.runBlocking
22
+ import kotlinx.serialization.SerialName
16
23
import kotlinx.serialization.Serializable
24
+ import kotlinx.serialization.json.Json
17
25
import kotlinx.serialization.json.JsonElement
18
26
19
27
@@ -29,18 +37,86 @@ data class AlgorandAccount(val address: String, val mnemonic: String)
29
37
@Serializable
30
38
data class AlgodResponse (val txId : String , val explorerUrl : String )
31
39
40
+ @Serializable
41
+ data class AlgorandToken
42
+ (
43
+ var TokenParams : Asset ? = null ,
44
+ var Metadata : AlgoNftMetadata ? = null
45
+ )
46
+
47
+ @Serializable
48
+ data class Asset (
49
+ var index : Long? = null ,
50
+ @SerialName(" created-at-round" )
51
+ var createdAtRound : Long? = null ,
52
+ var deleted : Boolean? = null ,
53
+ @SerialName(" destroyed-at-round" )
54
+ var destroyedAtRound : Long? = null ,
55
+ @SerialName(" params" )
56
+ var params : AssetParams ? = null
57
+ ){
58
+ @Serializable
59
+ data class AssetParams (
60
+ var clawback : String? = null ,
61
+ var creator : String? = null ,
62
+ var decimals : Long? = null ,
63
+ @SerialName(" default-frozen" )
64
+ var defaultFrozen : Boolean? = null ,
65
+ var freeze : String? = null ,
66
+ var manager : String? = null ,
67
+ var name : String? = null ,
68
+ var reserve : String? = null ,
69
+ var total : Long? = null ,
70
+ @SerialName(" unit-name" )
71
+ var unitName : String? = null ,
72
+ var url : String? = null
73
+ )
74
+ }
75
+
76
+
77
+ @Serializable
78
+ data class AssetHoldingsResponse (
79
+ var assets : List <AssetHolding > = ArrayList ())
80
+ {
81
+ @Serializable
82
+ data class AssetHolding (
83
+ var amount : Int? = null ,
84
+ @SerialName(" asset-id" )
85
+ var assetId : Long? = null ,
86
+ @SerialName(" deleted" )
87
+ var deleted : Boolean? = null ,
88
+ @SerialName(" is-frozen" )
89
+ var isFrozen : Boolean? = null ,
90
+ )
91
+ }
92
+
93
+
32
94
@Serializable
33
95
data class AlgoNftMetadata (
34
96
var name : String? = null ,
35
97
var description : String? = null ,
36
98
var image : String? = null ,
37
99
var decimals : Int? = null ,
38
100
var unitName : String? = null ,
39
- var properties : Map <String , JsonElement > ? = null ,
101
+ // var properties : Map<String, JsonElement> ? = null,
40
102
)
41
103
42
104
object AlgorandNftService {
43
105
106
+ val client1 = HttpClient (CIO .create { requestTimeout = 0 }) {
107
+ install(ContentNegotiation ) {
108
+ json(Json {
109
+ ignoreUnknownKeys = true
110
+ })
111
+ }
112
+ install(Logging ) {
113
+ // logger = Logger.SIMPLE
114
+ // level = LogLevel.ALL
115
+ level = LogLevel .BODY
116
+ }
117
+ expectSuccess = false
118
+ }
119
+
44
120
val ALGOD_API_ADDR = " https://testnet-algorand.api.purestake.io/ps2"
45
121
val IDX_API_ADDR = " https://testnet-algorand.api.purestake.io/idx2"
46
122
@@ -94,40 +170,92 @@ object AlgorandNftService {
94
170
return AlgodResponse (" Null" , " Null" )
95
171
}
96
172
97
- fun getAssetMeatadata (assetId : Long , chain : AlgorandChain ) : Asset {
173
+ // fun getAssetMeatadata(assetId: Long, chain: AlgorandChain) : Asset {
174
+ //
175
+ // val ALGOD_API_ADDR = when (chain) {
176
+ // AlgorandChain.MAINNET -> "https://mainnet-api.algonode.cloud"
177
+ // AlgorandChain.TESTNET -> "https://testnet-api.algonode.cloud"
178
+ // AlgorandChain.BETANET -> "https://betanet-api.algonode.cloud"
179
+ // }
180
+ // var client = AlgodClient(ALGOD_API_ADDR, ALGOD_PORT, ALGOD_API_TOKEN)
181
+ //
182
+ // return client.GetAssetByID(assetId).execute().body()
183
+ //
184
+ // }
185
+ // fun getNftMetadata(assetId: Long, chain: AlgorandChain):AlgoNftMetadata{
186
+ //
187
+ // return runBlocking {
188
+ //
189
+ // val asset: Asset = getAssetMeatadata(assetId, chain)
190
+ // var cid = (asset.params.url).substringAfter("ipfs://")
191
+ // val nft = IPFSMetadata.client.get("https://ipfs.algonode.xyz/ipfs/$cid") {}.body<AlgoNftMetadata>()
192
+ //
193
+ // return@runBlocking nft;
194
+ // }
195
+ // }
98
196
99
- val ALGOD_API_ADDR = when (chain) {
100
- AlgorandChain .MAINNET -> " https://mainnet-api.algonode.cloud"
101
- AlgorandChain .TESTNET -> " https://testnet-api.algonode.cloud"
102
- AlgorandChain .BETANET -> " https://betanet-api.algonode.cloud"
103
- }
104
- var client = AlgodClient (ALGOD_API_ADDR , ALGOD_PORT , ALGOD_API_TOKEN )
197
+ fun getToken (assetId : Long , chain : AlgorandChain ): AlgorandToken {
198
+ return runBlocking {
199
+ val ALGOD_API_ADDR = when (chain) {
200
+ AlgorandChain .MAINNET -> " https://mainnet-api.algonode.cloud"
201
+ AlgorandChain .TESTNET -> " https://testnet-api.algonode.cloud"
202
+ AlgorandChain .BETANET -> " https://betanet-api.algonode.cloud"
203
+ }
204
+ val tokenParams = client1.get(ALGOD_API_ADDR + " /v2/assets/" + assetId){
205
+ contentType(ContentType .Application .Json )
206
+ }.body<Asset >()
105
207
106
- return client.GetAssetByID (assetId).execute().body()
208
+ var cid = (tokenParams.params?.url)?.substringAfter(" ipfs://" )
209
+ val nft =
210
+ IPFSMetadata .client.get(" https://ipfs.io/ipfs/$cid " )
211
+ { contentType(ContentType .Application .Json )}.body<AlgoNftMetadata >()
107
212
108
- }
109
- fun getNftMetadata (assetId : Long , chain : AlgorandChain ):AlgoNftMetadata {
213
+ var result = AlgorandToken ()
110
214
215
+ result.TokenParams = tokenParams
216
+ result.Metadata = nft
217
+ return @runBlocking result
218
+ }
219
+ }
220
+ fun getAssetMeatadata (assetId : Long , chain : AlgorandChain ): Asset {
111
221
return runBlocking {
222
+ val ALGOD_API_ADDR = when (chain) {
223
+ AlgorandChain .MAINNET -> " https://mainnet-api.algonode.cloud"
224
+ AlgorandChain .TESTNET -> " https://testnet-api.algonode.cloud"
225
+ AlgorandChain .BETANET -> " https://betanet-api.algonode.cloud"
226
+ }
227
+ val asset = client1.get(ALGOD_API_ADDR + " /v2/assets/" + assetId){
228
+ contentType(ContentType .Application .Json )
229
+ }.body<Asset >()
112
230
113
- val asset: Asset = getAssetMeatadata(assetId, chain)
114
- var cid = (asset.params.url).substringAfter( " ipfs:// " )
115
- val nft = IPFSMetadata .client.get( " https://ipfs.algonode.xyz/ipfs/ $cid " ) {}.body< AlgoNftMetadata >()
231
+ return @runBlocking asset
232
+ }
233
+ }
116
234
235
+ fun getNftMetadata (assetId : Long , chain : AlgorandChain ): AlgoNftMetadata {
236
+ return runBlocking {
237
+ val asset: Asset = getAssetMeatadata(assetId, chain)
238
+ var cid = (asset.params?.url)?.substringAfter(" ipfs://" )
239
+ val nft =
240
+ IPFSMetadata .client.get(" https://ipfs.algonode.xyz/ipfs/$cid " )
241
+ { contentType(ContentType .Application .Json )}.body<AlgoNftMetadata >()
117
242
return @runBlocking nft;
118
243
}
119
244
}
120
245
121
- fun getAccountAssets (address : String , chain : AlgorandChain ):Any {
122
- var ALGOD_API_ADDR = when (chain){
123
- AlgorandChain .MAINNET -> " https://mainnet-algorand.api.purestake.io/idx2"
124
- AlgorandChain .TESTNET -> " https://testnet-algorand.api.purestake.io/idx2"
125
- AlgorandChain .BETANET -> " https://betanet-algorand.api.purestake.io/idx2"
246
+ fun getAccountAssets (address : String , chain : AlgorandChain ): AssetHoldingsResponse {
247
+ return runBlocking {
248
+ var ALGOD_API_ADDR = when (chain) {
249
+ AlgorandChain .MAINNET -> " https://mainnet-idx.algonode.cloud"
250
+ AlgorandChain .TESTNET -> " https://testnet-idx.algonode.cloud"
251
+ AlgorandChain .BETANET -> " https://betanet-idx.algonode.cloud"
252
+ }
253
+ val add = Address (address);
254
+ val result =
255
+ client1.get(ALGOD_API_ADDR + " /v2/accounts/" + add + " /assets" ) {
256
+ contentType(ContentType .Application .Json )
257
+ }.body<AssetHoldingsResponse >()
258
+ return @runBlocking result;
126
259
}
127
- var client = AlgodClient (ALGOD_API_ADDR , ALGOD_PORT , ALGOD_API_TOKEN , ALGOD_API_TOKEN_KEY )
128
- val add = Address (address);
129
-
130
- return 0 ;
131
260
}
132
-
133
261
}
0 commit comments