11 errFailedGetContractUTXOID = errors.New("Failed to get contract UTXO ID")
15 AccountID string `json:"id"`
16 AccountAlias string `json:"alias"`
19 type AccountsResponse struct {
20 Status string `json:"status"`
21 Data []Account `json:"data"`
24 func ListAccounts() []Account {
26 body := request(listAccountsURL, data)
28 accountsResp := new(AccountsResponse)
29 if err := json.Unmarshal(body, accountsResp); err != nil {
32 return accountsResp.Data
36 AccountAlias string `json:"account_alias"`
37 AccountID string `json:"account_id"`
38 Address string `json:"address"`
39 ControlProgram string `json:"control_program"`
40 Change bool `json:"change"`
41 KeyIndex uint64 `json:"key_index"`
44 type AddressesResponse struct {
45 Status string `json:"status"`
46 Data []Address `json:"data"`
49 func ListAddresses(accountAlias string) []Address {
50 data := []byte(`{"account_alias": "` + accountAlias + `"}`)
51 body := request(listAddressesURL, data)
53 addresses := new(AddressesResponse)
54 if err := json.Unmarshal(body, addresses); err != nil {
61 AccountID string `json:"account_id"`
62 Amount uint64 `json:"amount"`
65 type BalancesResponse struct {
66 Status string `json:"status"`
67 Data []Balance `json:"data"`
70 func ListBalances(accountAlias string) []Balance {
71 data := []byte(`{"account_alias": "` + accountAlias + `"}`)
72 body := request(listBalancesURL, data)
74 balancesResp := new(BalancesResponse)
75 if err := json.Unmarshal(body, balancesResp); err != nil {
78 return balancesResp.Data
81 type PubkeyInfo struct {
82 Pubkey string `json:"pubkey"`
83 Path []string `json:"derivation_path"`
87 XPubkey string `json:"root_xpub"`
88 PubkeyInfos []PubkeyInfo `json:"pubkey_infos"`
91 type PubkeysResponse struct {
92 Status string `json:"status"`
93 Data KeyInfo `json:"data"`
96 func ListPubkeys(accountAlias string) KeyInfo {
97 data := []byte(`{"account_alias": "` + accountAlias + `"}`)
98 body := request(listPubkeysURL, data)
100 pubkeysResp := new(PubkeysResponse)
101 if err := json.Unmarshal(body, pubkeysResp); err != nil {
104 return pubkeysResp.Data
107 type ContractInfo struct {
108 Program string `json:"program"`
111 type ContractResponse struct {
112 Status string `json:"status"`
113 Data ContractInfo `json:"data"`
116 func CompileLockContract(assetRequested, seller, cancelKey string, amountRequested uint64) ContractInfo {
118 "contract":"contract TradeOffer(assetRequested: Asset, amountRequested: Amount, seller: Program, cancelKey: PublicKey) locks valueAmount of valueAsset { clause trade() { lock amountRequested of assetRequested with seller unlock valueAmount of valueAsset } clause cancel(sellerSig: Signature) { verify checkTxSig(cancelKey, sellerSig) unlock valueAmount of valueAsset}}",
121 "string":"` + assetRequested + `"
124 "integer":` + strconv.FormatUint(amountRequested, 10) + `
127 "string":"` + seller + `"
130 "string":"` + cancelKey + `"
134 body := request(compileURL, data)
136 contract := new(ContractResponse)
137 if err := json.Unmarshal(body, contract); err != nil {
143 // BuildLockTransaction build locked contract transaction.
144 func BuildLockTransaction(accountIDLocked, assetIDLocked, contractControlProgram string, amountLocked, txFee uint64) []byte {
148 "account_id":"` + accountIDLocked + `",
149 "amount":` + strconv.FormatUint(amountLocked, 10) + `,
150 "asset_id":"` + assetIDLocked + `",
151 "type":"spend_account"
154 "amount":` + strconv.FormatUint(amountLocked, 10) + `,
155 "asset_id":"` + assetIDLocked + `",
156 "control_program":"` + contractControlProgram + `",
157 "type":"control_program"
160 "account_id":"` + accountIDLocked + `",
161 "amount":` + strconv.FormatUint(txFee, 10) + `,
162 "asset_id":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
163 "type":"spend_account"
167 "base_transaction":null
169 body := request(buildTransactionURL, data)
173 type SignedTransaction struct {
174 RawTransaction string `json:"raw_transaction"`
177 type TransactionData struct {
178 SignedTransaction SignedTransaction `json:"transaction"`
181 type signedTransactionResponse struct {
182 Status string `json:"status"`
183 Data TransactionData `json:"data"`
186 // SignTransaction sign built contract transaction.
187 func SignTransaction(password, transaction string) string {
189 "password": "` + password + `",
190 "transaction` + transaction[25:])
191 body := request(signTransactionURL, data)
193 signedTransaction := new(signedTransactionResponse)
194 if err := json.Unmarshal(body, signedTransaction); err != nil {
197 return signedTransaction.Data.SignedTransaction.RawTransaction
200 type TransactionID struct {
201 TxID string `json:"tx_id"`
204 type submitedTransactionResponse struct {
205 Status string `json:"status"`
206 Data TransactionID `json:"data"`
209 // SubmitTransaction submit raw singed contract transaction.
210 func SubmitTransaction(rawTransaction string) string {
211 data := []byte(`{"raw_transaction": "` + rawTransaction + `"}`)
212 body := request(submitTransactionURL, data)
214 submitedTransaction := new(submitedTransactionResponse)
215 if err := json.Unmarshal(body, submitedTransaction); err != nil {
218 return submitedTransaction.Data.TxID
221 type TransactionOutput struct {
222 TransactionOutputID string `json:"id"`
223 ControlProgram string `json:"control_program"`
226 type GotTransactionInfo struct {
227 TransactionOutputs []TransactionOutput `json:"outputs"`
230 type getTransactionResponse struct {
231 Status string `json:"status"`
232 Data GotTransactionInfo `json:"data"`
235 // GetContractUTXOID get contract UTXO ID by transaction ID and contract control program.
236 func GetContractUTXOID(transactionID, controlProgram string) (string, error) {
237 data := []byte(`{"tx_id":"` + transactionID + `"}`)
238 body := request(getTransactionURL, data)
240 getTransactionResponse := new(getTransactionResponse)
241 if err := json.Unmarshal(body, getTransactionResponse); err != nil {
245 for _, v := range getTransactionResponse.Data.TransactionOutputs {
246 if v.ControlProgram == controlProgram {
247 return v.TransactionOutputID, nil
251 return "", errFailedGetContractUTXOID
254 // BuildUnlockContractTransaction build unlocked contract transaction.
255 func BuildUnlockContractTransaction(accountIDUnlocked, contractUTXOID, seller, assetIDLocked, assetRequested, buyerContolProgram string, amountRequested, amountLocked, txFee uint64) []byte {
259 "type":"spend_account_unspent_output",
268 "use_unconfirmed":true,
269 "output_id":"` + contractUTXOID + `"
272 "amount":` + strconv.FormatUint(amountRequested, 10) + `,
273 "asset_id":"` + assetRequested + `",
274 "control_program":"` + seller + `",
275 "type":"control_program"
278 "account_id":"` + accountIDUnlocked + `",
279 "amount":` + strconv.FormatUint(amountRequested, 10) + `,
280 "asset_id":"` + assetRequested + `",
281 "use_unconfirmed":true,
282 "type":"spend_account"
285 "account_id":"` + accountIDUnlocked + `",
286 "amount":` + strconv.FormatUint(txFee, 10) + `,
287 "asset_id":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
288 "use_unconfirmed":true,
289 "type":"spend_account"
292 "amount":` + strconv.FormatUint(amountLocked, 10) + `,
293 "asset_id":"` + assetIDLocked + `",
294 "control_program":"` + buyerContolProgram + `",
295 "type":"control_program"
299 "base_transaction":null
301 body := request(buildTransactionURL, data)