From 61dd7a8c2df7134e2b7fba57bb80939609ab8754 Mon Sep 17 00:00:00 2001 From: banasa44 Date: Thu, 17 Jul 2025 12:02:18 +0200 Subject: [PATCH 01/18] feat(_code-samples): WiP add tx examples skeleton --- _code-samples/README.md | 0 _code-samples/batch/README.md | 0 _code-samples/batch/go/go.mod | 5 +++++ _code-samples/batch/go/rpc/main.go | 1 + _code-samples/batch/go/ws/main.go | 1 + _code-samples/checks/go/go.mod | 5 +++++ _code-samples/checks/go/rpc/main.go | 1 + _code-samples/checks/go/ws/main.go | 1 + _code-samples/clawback/go/go.mod | 5 +++++ _code-samples/clawback/go/rpc/main.go | 1 + _code-samples/clawback/go/ws/main.go | 1 + 11 files changed, 21 insertions(+) create mode 100644 _code-samples/README.md create mode 100644 _code-samples/batch/README.md create mode 100644 _code-samples/batch/go/go.mod create mode 100644 _code-samples/batch/go/rpc/main.go create mode 100644 _code-samples/batch/go/ws/main.go create mode 100644 _code-samples/checks/go/go.mod create mode 100644 _code-samples/checks/go/rpc/main.go create mode 100644 _code-samples/checks/go/ws/main.go create mode 100644 _code-samples/clawback/go/go.mod create mode 100644 _code-samples/clawback/go/rpc/main.go create mode 100644 _code-samples/clawback/go/ws/main.go diff --git a/_code-samples/README.md b/_code-samples/README.md new file mode 100644 index 00000000000..e69de29bb2d diff --git a/_code-samples/batch/README.md b/_code-samples/batch/README.md new file mode 100644 index 00000000000..e69de29bb2d diff --git a/_code-samples/batch/go/go.mod b/_code-samples/batch/go/go.mod new file mode 100644 index 00000000000..63f569b0cd7 --- /dev/null +++ b/_code-samples/batch/go/go.mod @@ -0,0 +1,5 @@ +module github.com/XRPLF + +go 1.23 + +require github.com/Peersyst/xrpl-go v0.1.11 \ No newline at end of file diff --git a/_code-samples/batch/go/rpc/main.go b/_code-samples/batch/go/rpc/main.go new file mode 100644 index 00000000000..9ab1e3e8e78 --- /dev/null +++ b/_code-samples/batch/go/rpc/main.go @@ -0,0 +1 @@ +package rpc diff --git a/_code-samples/batch/go/ws/main.go b/_code-samples/batch/go/ws/main.go new file mode 100644 index 00000000000..98592950df4 --- /dev/null +++ b/_code-samples/batch/go/ws/main.go @@ -0,0 +1 @@ +package ws diff --git a/_code-samples/checks/go/go.mod b/_code-samples/checks/go/go.mod new file mode 100644 index 00000000000..63f569b0cd7 --- /dev/null +++ b/_code-samples/checks/go/go.mod @@ -0,0 +1,5 @@ +module github.com/XRPLF + +go 1.23 + +require github.com/Peersyst/xrpl-go v0.1.11 \ No newline at end of file diff --git a/_code-samples/checks/go/rpc/main.go b/_code-samples/checks/go/rpc/main.go new file mode 100644 index 00000000000..9ab1e3e8e78 --- /dev/null +++ b/_code-samples/checks/go/rpc/main.go @@ -0,0 +1 @@ +package rpc diff --git a/_code-samples/checks/go/ws/main.go b/_code-samples/checks/go/ws/main.go new file mode 100644 index 00000000000..98592950df4 --- /dev/null +++ b/_code-samples/checks/go/ws/main.go @@ -0,0 +1 @@ +package ws diff --git a/_code-samples/clawback/go/go.mod b/_code-samples/clawback/go/go.mod new file mode 100644 index 00000000000..63f569b0cd7 --- /dev/null +++ b/_code-samples/clawback/go/go.mod @@ -0,0 +1,5 @@ +module github.com/XRPLF + +go 1.23 + +require github.com/Peersyst/xrpl-go v0.1.11 \ No newline at end of file diff --git a/_code-samples/clawback/go/rpc/main.go b/_code-samples/clawback/go/rpc/main.go new file mode 100644 index 00000000000..9ab1e3e8e78 --- /dev/null +++ b/_code-samples/clawback/go/rpc/main.go @@ -0,0 +1 @@ +package rpc diff --git a/_code-samples/clawback/go/ws/main.go b/_code-samples/clawback/go/ws/main.go new file mode 100644 index 00000000000..98592950df4 --- /dev/null +++ b/_code-samples/clawback/go/ws/main.go @@ -0,0 +1 @@ +package ws From ff5b5ab2582ebb3b1a9591103fb533c6c4af0463 Mon Sep 17 00:00:00 2001 From: banasa44 Date: Thu, 17 Jul 2025 16:03:19 +0200 Subject: [PATCH 02/18] feat(_code-samples): WiP add go tx examples implementation --- _code-samples/batch/README.md | 4 + _code-samples/batch/go/go.mod | 23 +- _code-samples/batch/go/go.sum | 58 +++ _code-samples/batch/go/rpc/main.go | 209 +++++++++- _code-samples/batch/go/ws/main.go | 211 ++++++++++- _code-samples/checks/go/go.mod | 23 +- _code-samples/checks/go/go.sum | 58 +++ _code-samples/checks/go/rpc/main.go | 163 +++++++- _code-samples/checks/go/ws/main.go | 174 ++++++++- _code-samples/clawback/README.md | 3 + _code-samples/clawback/go/go.mod | 23 +- _code-samples/clawback/go/go.sum | 58 +++ _code-samples/clawback/go/rpc/main.go | 252 ++++++++++++- _code-samples/clawback/go/ws/main.go | 259 ++++++++++++- _code-samples/credential/README.md | 3 + _code-samples/credential/go/go.mod | 24 ++ _code-samples/credential/go/go.sum | 58 +++ _code-samples/credential/go/rpc/main.go | 109 ++++++ _code-samples/credential/go/ws/main.go | 122 ++++++ _code-samples/delegate-set/README.md | 3 + _code-samples/delegate-set/go/go.mod | 24 ++ _code-samples/delegate-set/go/go.sum | 58 +++ _code-samples/delegate-set/go/rpc/main.go | 131 +++++++ _code-samples/delegate-set/go/ws/main.go | 151 ++++++++ _code-samples/deposit-preauth/README.md | 3 + _code-samples/deposit-preauth/go/go.mod | 24 ++ _code-samples/deposit-preauth/go/go.sum | 58 +++ _code-samples/deposit-preauth/go/rpc/main.go | 220 +++++++++++ _code-samples/deposit-preauth/go/ws/main.go | 234 ++++++++++++ _code-samples/freeze/go/go.mod | 24 ++ _code-samples/freeze/go/go.sum | 58 +++ _code-samples/freeze/go/rpc/main.go | 347 +++++++++++++++++ _code-samples/freeze/go/ws/main.go | 357 ++++++++++++++++++ _code-samples/multisigning/go/go.mod | 24 ++ _code-samples/multisigning/go/go.sum | 58 +++ _code-samples/multisigning/go/rpc/main.go | 166 ++++++++ _code-samples/multisigning/go/ws/main.go | 181 +++++++++ _code-samples/non-fungible-token/go/go.mod | 24 ++ _code-samples/non-fungible-token/go/go.sum | 58 +++ .../go/nft-accept/rpc/main.go | 128 +++++++ .../go/nft-accept/ws/main.go | 133 +++++++ .../go/nft-burn/rpc/main.go | 114 ++++++ .../non-fungible-token/go/nft-burn/ws/main.go | 123 ++++++ .../go/nft-cancel/rpc/main.go | 163 ++++++++ .../go/nft-cancel/ws/main.go | 172 +++++++++ .../go/nft-modify/rpc/main.go | 107 ++++++ .../go/nft-modify/ws/main.go | 117 ++++++ _code-samples/partial-payment/go/go.mod | 24 ++ _code-samples/partial-payment/go/go.sum | 58 +++ _code-samples/partial-payment/go/rpc/main.go | 168 +++++++++ _code-samples/partial-payment/go/ws/main.go | 179 +++++++++ _code-samples/paths/go/go.mod | 24 ++ _code-samples/paths/go/go.sum | 58 +++ _code-samples/paths/go/rpc/main.go | 111 ++++++ _code-samples/paths/go/ws/main.go | 122 ++++++ _code-samples/send-xrp/go/go.mod | 5 + _code-samples/send-xrp/go/rpc/main.go | 1 + _code-samples/send-xrp/go/ws/main.go | 1 + _code-samples/set-regular-key/go/go.mod | 24 ++ _code-samples/set-regular-key/go/go.sum | 58 +++ _code-samples/set-regular-key/go/rpc/main.go | 131 +++++++ _code-samples/set-regular-key/go/ws/main.go | 142 +++++++ _code-samples/use-tickets/go/go.mod | 24 ++ _code-samples/use-tickets/go/go.sum | 58 +++ _code-samples/use-tickets/go/rpc/main.go | 137 +++++++ _code-samples/use-tickets/go/ws/main.go | 148 ++++++++ 66 files changed, 6555 insertions(+), 12 deletions(-) create mode 100644 _code-samples/batch/go/go.sum create mode 100644 _code-samples/checks/go/go.sum create mode 100644 _code-samples/clawback/README.md create mode 100644 _code-samples/clawback/go/go.sum create mode 100644 _code-samples/credential/README.md create mode 100644 _code-samples/credential/go/go.mod create mode 100644 _code-samples/credential/go/go.sum create mode 100644 _code-samples/credential/go/rpc/main.go create mode 100644 _code-samples/credential/go/ws/main.go create mode 100644 _code-samples/delegate-set/README.md create mode 100644 _code-samples/delegate-set/go/go.mod create mode 100644 _code-samples/delegate-set/go/go.sum create mode 100644 _code-samples/delegate-set/go/rpc/main.go create mode 100644 _code-samples/delegate-set/go/ws/main.go create mode 100644 _code-samples/deposit-preauth/README.md create mode 100644 _code-samples/deposit-preauth/go/go.mod create mode 100644 _code-samples/deposit-preauth/go/go.sum create mode 100644 _code-samples/deposit-preauth/go/rpc/main.go create mode 100644 _code-samples/deposit-preauth/go/ws/main.go create mode 100644 _code-samples/freeze/go/go.mod create mode 100644 _code-samples/freeze/go/go.sum create mode 100644 _code-samples/freeze/go/rpc/main.go create mode 100644 _code-samples/freeze/go/ws/main.go create mode 100644 _code-samples/multisigning/go/go.mod create mode 100644 _code-samples/multisigning/go/go.sum create mode 100644 _code-samples/multisigning/go/rpc/main.go create mode 100644 _code-samples/multisigning/go/ws/main.go create mode 100644 _code-samples/non-fungible-token/go/go.mod create mode 100644 _code-samples/non-fungible-token/go/go.sum create mode 100644 _code-samples/non-fungible-token/go/nft-accept/rpc/main.go create mode 100644 _code-samples/non-fungible-token/go/nft-accept/ws/main.go create mode 100644 _code-samples/non-fungible-token/go/nft-burn/rpc/main.go create mode 100644 _code-samples/non-fungible-token/go/nft-burn/ws/main.go create mode 100644 _code-samples/non-fungible-token/go/nft-cancel/rpc/main.go create mode 100644 _code-samples/non-fungible-token/go/nft-cancel/ws/main.go create mode 100644 _code-samples/non-fungible-token/go/nft-modify/rpc/main.go create mode 100644 _code-samples/non-fungible-token/go/nft-modify/ws/main.go create mode 100644 _code-samples/partial-payment/go/go.mod create mode 100644 _code-samples/partial-payment/go/go.sum create mode 100644 _code-samples/partial-payment/go/rpc/main.go create mode 100644 _code-samples/partial-payment/go/ws/main.go create mode 100644 _code-samples/paths/go/go.mod create mode 100644 _code-samples/paths/go/go.sum create mode 100644 _code-samples/paths/go/rpc/main.go create mode 100644 _code-samples/paths/go/ws/main.go create mode 100644 _code-samples/send-xrp/go/go.mod create mode 100644 _code-samples/send-xrp/go/rpc/main.go create mode 100644 _code-samples/send-xrp/go/ws/main.go create mode 100644 _code-samples/set-regular-key/go/go.mod create mode 100644 _code-samples/set-regular-key/go/go.sum create mode 100644 _code-samples/set-regular-key/go/rpc/main.go create mode 100644 _code-samples/set-regular-key/go/ws/main.go create mode 100644 _code-samples/use-tickets/go/go.mod create mode 100644 _code-samples/use-tickets/go/go.sum create mode 100644 _code-samples/use-tickets/go/rpc/main.go create mode 100644 _code-samples/use-tickets/go/ws/main.go diff --git a/_code-samples/batch/README.md b/_code-samples/batch/README.md index e69de29bb2d..c0852466c27 100644 --- a/_code-samples/batch/README.md +++ b/_code-samples/batch/README.md @@ -0,0 +1,4 @@ +# Batch + +Code samples showing how to create and submit a [Batch transaction](../../docs/concepts/transactions/batch-transactions.md). +Both for simple and multi account batch transactions. diff --git a/_code-samples/batch/go/go.mod b/_code-samples/batch/go/go.mod index 63f569b0cd7..fa9fde5d08c 100644 --- a/_code-samples/batch/go/go.mod +++ b/_code-samples/batch/go/go.mod @@ -1,5 +1,24 @@ module github.com/XRPLF -go 1.23 +go 1.23.0 -require github.com/Peersyst/xrpl-go v0.1.11 \ No newline at end of file +toolchain go1.23.10 + +require github.com/Peersyst/xrpl-go v0.1.11 + +require ( + github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect + github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect + github.com/decred/dcrd/crypto/ripemd160 v1.0.2 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/tyler-smith/go-bip32 v1.0.0 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + golang.org/x/crypto v0.23.0 // indirect +) diff --git a/_code-samples/batch/go/go.sum b/_code-samples/batch/go/go.sum new file mode 100644 index 00000000000..8d8522a619c --- /dev/null +++ b/_code-samples/batch/go/go.sum @@ -0,0 +1,58 @@ +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc= +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= +github.com/Peersyst/xrpl-go v0.1.11 h1:P6r/gHxRnbAtAdPmzNHz/7zpsdfvwh0SS+QI2JNT44w= +github.com/Peersyst/xrpl-go v0.1.11/go.mod h1:CBRM3/soqNeeL2Jx6USVUtECqulZVUoq3UxZKMz9hdw= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2 h1:TvGTmUBHDU75OHro9ojPLK+Yv7gDl2hnUvRocRCjsys= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2/go.mod h1:uGfjDyePSpa75cSQLzNdVmWlbQMBuiJkvXw/MNKRY4M= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.1.5-0.20170601210322-f6abca593680/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/tyler-smith/go-bip32 v1.0.0 h1:sDR9juArbUgX+bO/iblgZnMPeWY1KZMUC2AFUJdv5KE= +github.com/tyler-smith/go-bip32 v1.0.0/go.mod h1:onot+eHknzV4BVPwrzqY5OoVpyCvnwD7lMawL5aQupE= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= diff --git a/_code-samples/batch/go/rpc/main.go b/_code-samples/batch/go/rpc/main.go index 9ab1e3e8e78..3675a7432d7 100644 --- a/_code-samples/batch/go/rpc/main.go +++ b/_code-samples/batch/go/rpc/main.go @@ -1 +1,208 @@ -package rpc +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/rpc/types" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" +) + +var ( + CreatePaymentTx = func(sender, receiver *wallet.Wallet, amount txnTypes.CurrencyAmount) *transaction.Payment { + return &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: sender.GetAddress(), + TransactionType: transaction.PaymentTx, + Flags: txnTypes.TfInnerBatchTxn, + }, + Amount: amount, + Destination: receiver.GetAddress(), + } + } +) + +func main() { + // Configure the client + cfg, err := rpc.NewClientConfig( + "https://s.devnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + client := rpc.NewClient(cfg) + + // Create and fund wallets + userWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + user2Wallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + receiverWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Funding wallets...") + if err := client.FundWallet(&userWallet); err != nil { + fmt.Println(err) + return + } + if err := client.FundWallet(&user2Wallet); err != nil { + fmt.Println(err) + return + } + fmt.Println("💸 Wallets funded") + + // Check initial balances + userBalance, err := client.GetXrpBalance(userWallet.ClassicAddress) + if err != nil { + userBalance = "0" + } + user2Balance, err := client.GetXrpBalance(user2Wallet.ClassicAddress) + if err != nil { + user2Balance = "0" + } + + receiverBalance, err := client.GetXrpBalance(receiverWallet.ClassicAddress) + if err != nil { + receiverBalance = "0" + } + + fmt.Printf("💳 User initial balance: %s XRP\n", userBalance) + fmt.Printf("💳 User2 initial balance: %s XRP\n", user2Balance) + fmt.Printf("💳 Receiver initial balance: %s XRP\n", receiverBalance) + fmt.Println() + + fmt.Printf("Batch transaction test\n") + + // Create test batch transaction + batchTx := &transaction.Batch{ + BaseTx: transaction.BaseTx{ + Account: txnTypes.Address(userWallet.ClassicAddress), + TransactionType: transaction.BatchTx, + }, + RawTransactions: []txnTypes.RawTransaction{ + {RawTransaction: CreatePaymentTx(&userWallet, &receiverWallet, txnTypes.XRPCurrencyAmount(5000000)).Flatten()}, + {RawTransaction: CreatePaymentTx(&userWallet, &receiverWallet, txnTypes.XRPCurrencyAmount(5000000)).Flatten()}, + }, + } + batchTx.SetAllOrNothingFlag() + + flattenedBatchTx := batchTx.Flatten() + fmt.Println("⏳ Autofilling flattened batch transaction...") + if err := client.Autofill(&flattenedBatchTx); err != nil { + fmt.Println("Autofill error:", err) + return + } + + fmt.Println("⏳ Signing batch transaction...") + response, err := client.SubmitTxAndWait(flattenedBatchTx, &types.SubmitOptions{ + Autofill: false, + Wallet: &userWallet, + }) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Batch transaction submitted") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Printf("🌐 Validated: %t\n", response.Validated) + fmt.Println() + + // Check final balances + finalUserBalance, err := client.GetXrpBalance(userWallet.ClassicAddress) + if err != nil { + finalUserBalance = "0" + } + finalReceiverBalance, err := client.GetXrpBalance(receiverWallet.ClassicAddress) + if err != nil { + finalReceiverBalance = "0" + } + + fmt.Printf("💳 User final balance: %s XRP\n", finalUserBalance) + + fmt.Printf("💳 Receiver final balance: %s XRP\n", finalReceiverBalance) + + fmt.Println() + fmt.Printf("Multisig Batch transaction test\n") + + // Create test batch transaction + multiBatchTx := &transaction.Batch{ + BaseTx: transaction.BaseTx{ + Account: txnTypes.Address(userWallet.ClassicAddress), + TransactionType: transaction.BatchTx, + }, + RawTransactions: []txnTypes.RawTransaction{ + {RawTransaction: CreatePaymentTx(&userWallet, &receiverWallet, txnTypes.XRPCurrencyAmount(5000000)).Flatten()}, + {RawTransaction: CreatePaymentTx(&user2Wallet, &receiverWallet, txnTypes.XRPCurrencyAmount(5000000)).Flatten()}, + }, + BatchSigners: []txnTypes.BatchSigner{ + { + BatchSigner: txnTypes.BatchSignerData{ + Account: txnTypes.Address(user2Wallet.ClassicAddress), + SigningPubKey: user2Wallet.PublicKey, + }, + }, + }, + } + multiBatchTx.SetAllOrNothingFlag() + + flattenedMultiBatchTx := multiBatchTx.Flatten() + fmt.Println("⏳ Autofilling flattened multi batch transaction...") + if err := client.AutofillMultisigned(&flattenedMultiBatchTx, 1); err != nil { + fmt.Println("Autofill error:", err) + return + } + + fmt.Println("⏳ Signing multi batch transaction...") + if err := wallet.SignMultiBatch(user2Wallet, &flattenedMultiBatchTx, nil); err != nil { + fmt.Println("Signing error:", err) + return + } + + response, err = client.SubmitTxAndWait(flattenedMultiBatchTx, &types.SubmitOptions{ + Autofill: false, + Wallet: &userWallet, + }) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Multisig Batch transaction submitted") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Printf("🌐 Validated: %t\n", response.Validated) + fmt.Println() + + // Check final balances + finalUser2Balance, err := client.GetXrpBalance(user2Wallet.ClassicAddress) + if err != nil { + finalUser2Balance = "0" + } + finalUserBalance, err = client.GetXrpBalance(userWallet.ClassicAddress) + if err != nil { + finalUserBalance = "0" + } + finalReceiverBalance, err = client.GetXrpBalance(receiverWallet.ClassicAddress) + if err != nil { + finalReceiverBalance = "0" + } + fmt.Printf("💳 User final balance: %s XRP\n", finalUserBalance) + fmt.Printf("💳 User2 final balance: %s XRP\n", finalUser2Balance) + fmt.Printf("💳 Receiver final balance: %s XRP\n", finalReceiverBalance) +} diff --git a/_code-samples/batch/go/ws/main.go b/_code-samples/batch/go/ws/main.go index 98592950df4..db6bd304ba9 100644 --- a/_code-samples/batch/go/ws/main.go +++ b/_code-samples/batch/go/ws/main.go @@ -1 +1,210 @@ -package ws +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" + "github.com/Peersyst/xrpl-go/xrpl/websocket/types" +) + +var ( + CreatePaymentTx = func(sender, receiver *wallet.Wallet, amount txnTypes.CurrencyAmount) *transaction.Payment { + return &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: sender.GetAddress(), + TransactionType: transaction.PaymentTx, + Flags: txnTypes.TfInnerBatchTxn, + }, + Amount: amount, + Destination: receiver.GetAddress(), + } + } +) + +func main() { + // Connect to testnet + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.devnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) + defer client.Disconnect() + + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + // Create and fund wallets + userWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + user2Wallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + receiverWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Funding wallets...") + if err := client.FundWallet(&userWallet); err != nil { + fmt.Println(err) + return + } + if err := client.FundWallet(&user2Wallet); err != nil { + fmt.Println(err) + return + } + fmt.Println("💸 Wallets funded") + + // Check initial balances + userBalance, err := client.GetXrpBalance(userWallet.ClassicAddress) + if err != nil { + userBalance = "0" + } + user2Balance, err := client.GetXrpBalance(user2Wallet.ClassicAddress) + if err != nil { + user2Balance = "0" + } + + receiverBalance, err := client.GetXrpBalance(receiverWallet.ClassicAddress) + if err != nil { + receiverBalance = "0" + } + + fmt.Printf("💳 User initial balance: %s XRP\n", userBalance) + fmt.Printf("💳 User2 initial balance: %s XRP\n", user2Balance) + fmt.Printf("💳 Receiver initial balance: %s XRP\n", receiverBalance) + fmt.Println() + + fmt.Printf("Batch transaction test\n") + + // Create test batch transaction + batchTx := &transaction.Batch{ + BaseTx: transaction.BaseTx{ + Account: txnTypes.Address(userWallet.ClassicAddress), + TransactionType: transaction.BatchTx, + }, + RawTransactions: []txnTypes.RawTransaction{ + {RawTransaction: CreatePaymentTx(&userWallet, &receiverWallet, txnTypes.XRPCurrencyAmount(5000000)).Flatten()}, + {RawTransaction: CreatePaymentTx(&userWallet, &receiverWallet, txnTypes.XRPCurrencyAmount(5000000)).Flatten()}, + }, + } + batchTx.SetAllOrNothingFlag() + + flattenedBatchTx := batchTx.Flatten() + fmt.Println("⏳ Autofilling flattened batch transaction...") + if err := client.Autofill(&flattenedBatchTx); err != nil { + fmt.Println("Autofill error:", err) + return + } + + fmt.Println("⏳ Signing batch transaction...") + response, err := client.SubmitTxAndWait(flattenedBatchTx, &types.SubmitOptions{ + Autofill: false, + Wallet: &userWallet, + }) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Batch transaction submitted") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Printf("🌐 Validated: %t\n", response.Validated) + fmt.Println() + + // Check final balances + finalUserBalance, err := client.GetXrpBalance(userWallet.ClassicAddress) + if err != nil { + finalUserBalance = "0" + } + finalReceiverBalance, err := client.GetXrpBalance(receiverWallet.ClassicAddress) + if err != nil { + finalReceiverBalance = "0" + } + + fmt.Printf("💳 User final balance: %s XRP\n", finalUserBalance) + + fmt.Printf("💳 Receiver final balance: %s XRP\n", finalReceiverBalance) + + fmt.Println() + fmt.Printf("Multisig Batch transaction test\n") + + // Create test batch transaction + multiBatchTx := &transaction.Batch{ + BaseTx: transaction.BaseTx{ + Account: txnTypes.Address(userWallet.ClassicAddress), + TransactionType: transaction.BatchTx, + }, + RawTransactions: []txnTypes.RawTransaction{ + {RawTransaction: CreatePaymentTx(&userWallet, &receiverWallet, txnTypes.XRPCurrencyAmount(5000000)).Flatten()}, + {RawTransaction: CreatePaymentTx(&user2Wallet, &receiverWallet, txnTypes.XRPCurrencyAmount(5000000)).Flatten()}, + }, + BatchSigners: []txnTypes.BatchSigner{ + { + BatchSigner: txnTypes.BatchSignerData{ + Account: txnTypes.Address(user2Wallet.ClassicAddress), + SigningPubKey: user2Wallet.PublicKey, + }, + }, + }, + } + multiBatchTx.SetAllOrNothingFlag() + + flattenedMultiBatchTx := multiBatchTx.Flatten() + fmt.Println("⏳ Autofilling flattened multi batch transaction...") + if err := client.AutofillMultisigned(&flattenedMultiBatchTx, 1); err != nil { + fmt.Println("Autofill error:", err) + return + } + + fmt.Println("⏳ Signing multi batch transaction...") + if err := wallet.SignMultiBatch(user2Wallet, &flattenedMultiBatchTx, nil); err != nil { + fmt.Println("Signing error:", err) + return + } + + response, err = client.SubmitTxAndWait(flattenedMultiBatchTx, &types.SubmitOptions{ + Autofill: false, + Wallet: &userWallet, + }) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Multisig Batch transaction submitted") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Printf("🌐 Validated: %t\n", response.Validated) + fmt.Println() + + // Check final balances + finalUser2Balance, err := client.GetXrpBalance(user2Wallet.ClassicAddress) + if err != nil { + finalUser2Balance = "0" + } + finalUserBalance, err = client.GetXrpBalance(userWallet.ClassicAddress) + if err != nil { + finalUserBalance = "0" + } + finalReceiverBalance, err = client.GetXrpBalance(receiverWallet.ClassicAddress) + if err != nil { + finalReceiverBalance = "0" + } + fmt.Printf("💳 User final balance: %s XRP\n", finalUserBalance) + fmt.Printf("💳 User2 final balance: %s XRP\n", finalUser2Balance) + fmt.Printf("💳 Receiver final balance: %s XRP\n", finalReceiverBalance) +} diff --git a/_code-samples/checks/go/go.mod b/_code-samples/checks/go/go.mod index 63f569b0cd7..fa9fde5d08c 100644 --- a/_code-samples/checks/go/go.mod +++ b/_code-samples/checks/go/go.mod @@ -1,5 +1,24 @@ module github.com/XRPLF -go 1.23 +go 1.23.0 -require github.com/Peersyst/xrpl-go v0.1.11 \ No newline at end of file +toolchain go1.23.10 + +require github.com/Peersyst/xrpl-go v0.1.11 + +require ( + github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect + github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect + github.com/decred/dcrd/crypto/ripemd160 v1.0.2 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/tyler-smith/go-bip32 v1.0.0 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + golang.org/x/crypto v0.23.0 // indirect +) diff --git a/_code-samples/checks/go/go.sum b/_code-samples/checks/go/go.sum new file mode 100644 index 00000000000..8d8522a619c --- /dev/null +++ b/_code-samples/checks/go/go.sum @@ -0,0 +1,58 @@ +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc= +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= +github.com/Peersyst/xrpl-go v0.1.11 h1:P6r/gHxRnbAtAdPmzNHz/7zpsdfvwh0SS+QI2JNT44w= +github.com/Peersyst/xrpl-go v0.1.11/go.mod h1:CBRM3/soqNeeL2Jx6USVUtECqulZVUoq3UxZKMz9hdw= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2 h1:TvGTmUBHDU75OHro9ojPLK+Yv7gDl2hnUvRocRCjsys= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2/go.mod h1:uGfjDyePSpa75cSQLzNdVmWlbQMBuiJkvXw/MNKRY4M= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.1.5-0.20170601210322-f6abca593680/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/tyler-smith/go-bip32 v1.0.0 h1:sDR9juArbUgX+bO/iblgZnMPeWY1KZMUC2AFUJdv5KE= +github.com/tyler-smith/go-bip32 v1.0.0/go.mod h1:onot+eHknzV4BVPwrzqY5OoVpyCvnwD7lMawL5aQupE= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= diff --git a/_code-samples/checks/go/rpc/main.go b/_code-samples/checks/go/rpc/main.go index 9ab1e3e8e78..fb9d51a372c 100644 --- a/_code-samples/checks/go/rpc/main.go +++ b/_code-samples/checks/go/rpc/main.go @@ -1 +1,162 @@ -package rpc +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/ledger-entry-types" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" +) + +func main() { + cfg, err := rpc.NewClientConfig( + "https://s.altnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + client := rpc.NewClient(cfg) + + w, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + receiverWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Setting up wallets...") + if err := client.FundWallet(&w); err != nil { + fmt.Println(err) + return + } + fmt.Println("💸 Sender wallet funded!") + + if err := client.FundWallet(&receiverWallet); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Receiver wallet funded!") + fmt.Println() + + fmt.Println("✅ Wallets setup complete!") + fmt.Println("💳 Sender wallet:", w.ClassicAddress) + fmt.Println("💳 Receiver wallet:", receiverWallet.ClassicAddress) + fmt.Println() + + fmt.Println("⏳ Creating check...") + cc := &transaction.CheckCreate{ + BaseTx: transaction.BaseTx{ + Account: w.GetAddress(), + }, + Destination: receiverWallet.GetAddress(), + SendMax: types.XRPCurrencyAmount(1000000), + InvoiceID: "46060241FABCF692D4D934BA2A6C4427CD4279083E38C77CBE642243E43BE291", + } + + flatCc := cc.Flatten() + + if err := client.Autofill(&flatCc); err != nil { + fmt.Println(err) + return + } + + blob, _, err := w.Sign(flatCc) + if err != nil { + fmt.Println(err) + return + } + + res, err := client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + if !res.Validated { + fmt.Println("❌ Check creation failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Check created!") + fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Println() + + meta, ok := res.Meta.(map[string]interface{}) + if !ok { + fmt.Println("❌ Meta is not of type TxObjMeta") + return + } + + var checkID string + + affectedNodes := meta["AffectedNodes"].([]interface{}) + + for _, node := range affectedNodes { + affectedNode, ok := node.(map[string]interface{}) + if !ok { + fmt.Println("❌ Node is not of type map[string]interface{}") + return + } + + createdNode, ok := affectedNode["CreatedNode"].(map[string]interface{}) + if !ok { + continue + } + + if createdNode["LedgerEntryType"] == string(ledger.CheckEntry) { + + checkID = createdNode["LedgerIndex"].(string) + } + } + + if checkID == "" { + fmt.Println("Check not found") + return + } + + fmt.Println("⏳ Cashing out check...") + checkCash := &transaction.CheckCash{ + BaseTx: transaction.BaseTx{ + Account: receiverWallet.GetAddress(), + }, + CheckID: types.Hash256(checkID), + Amount: types.XRPCurrencyAmount(1000000), + } + + flatCheckCash := checkCash.Flatten() + + if err := client.Autofill(&flatCheckCash); err != nil { + fmt.Println(err) + return + } + + blob, _, err = receiverWallet.Sign(flatCheckCash) + if err != nil { + fmt.Println(err) + return + } + + res, err = client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Check cashed out!") + fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Println() +} diff --git a/_code-samples/checks/go/ws/main.go b/_code-samples/checks/go/ws/main.go index 98592950df4..a3e38cd72bb 100644 --- a/_code-samples/checks/go/ws/main.go +++ b/_code-samples/checks/go/ws/main.go @@ -1 +1,173 @@ -package ws +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/ledger-entry-types" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" +) + +func main() { + fmt.Println("⏳ Connecting to testnet...") + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + defer client.Disconnect() + + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + if !client.IsConnected() { + fmt.Println("❌ Failed to connect to testnet") + return + } + + fmt.Println("✅ Connected to testnet") + fmt.Println() + + w, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + receiverWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Setting up wallets...") + if err := client.FundWallet(&w); err != nil { + fmt.Println(err) + return + } + fmt.Println("💸 Sender wallet funded!") + + if err := client.FundWallet(&receiverWallet); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Receiver wallet funded!") + fmt.Println() + + fmt.Println("✅ Wallets setup complete!") + fmt.Println("💳 Sender wallet:", w.ClassicAddress) + fmt.Println("💳 Receiver wallet:", receiverWallet.ClassicAddress) + fmt.Println() + + fmt.Println("⏳ Creating check...") + cc := &transaction.CheckCreate{ + BaseTx: transaction.BaseTx{ + Account: w.GetAddress(), + }, + Destination: receiverWallet.GetAddress(), + SendMax: types.XRPCurrencyAmount(1000000), + InvoiceID: "46060241FABCF692D4D934BA2A6C4427CD4279083E38C77CBE642243E43BE291", + } + + flatCc := cc.Flatten() + + if err := client.Autofill(&flatCc); err != nil { + fmt.Println(err) + return + } + + blob, _, err := w.Sign(flatCc) + if err != nil { + fmt.Println(err) + return + } + + res, err := client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + if !res.Validated { + fmt.Println("❌ Check creation failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Check created!") + fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Println() + + meta, ok := res.Meta.(map[string]interface{}) + if !ok { + fmt.Println("❌ Meta is not of type TxObjMeta") + return + } + + var checkID string + + affectedNodes := meta["AffectedNodes"].([]interface{}) + + for _, node := range affectedNodes { + affectedNode, ok := node.(map[string]interface{}) + if !ok { + fmt.Println("❌ Node is not of type map[string]interface{}") + return + } + + createdNode, ok := affectedNode["CreatedNode"].(map[string]interface{}) + if !ok { + continue + } + + if createdNode["LedgerEntryType"] == string(ledger.CheckEntry) { + + checkID = createdNode["LedgerIndex"].(string) + } + } + + if checkID == "" { + fmt.Println("Check not found") + return + } + + fmt.Println("⏳ Cashing out check...") + checkCash := &transaction.CheckCash{ + BaseTx: transaction.BaseTx{ + Account: receiverWallet.GetAddress(), + }, + CheckID: types.Hash256(checkID), + Amount: types.XRPCurrencyAmount(1000000), + } + + flatCheckCash := checkCash.Flatten() + + if err := client.Autofill(&flatCheckCash); err != nil { + fmt.Println(err) + return + } + + blob, _, err = receiverWallet.Sign(flatCheckCash) + if err != nil { + fmt.Println(err) + return + } + + res, err = client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Check cashed out!") + fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Println() +} diff --git a/_code-samples/clawback/README.md b/_code-samples/clawback/README.md new file mode 100644 index 00000000000..3a6a54c8d02 --- /dev/null +++ b/_code-samples/clawback/README.md @@ -0,0 +1,3 @@ +# Clawback + +Create, configure, and execute a Clawback transaction to reclaim issued tokens from a trust line on the XRPL. diff --git a/_code-samples/clawback/go/go.mod b/_code-samples/clawback/go/go.mod index 63f569b0cd7..fa9fde5d08c 100644 --- a/_code-samples/clawback/go/go.mod +++ b/_code-samples/clawback/go/go.mod @@ -1,5 +1,24 @@ module github.com/XRPLF -go 1.23 +go 1.23.0 -require github.com/Peersyst/xrpl-go v0.1.11 \ No newline at end of file +toolchain go1.23.10 + +require github.com/Peersyst/xrpl-go v0.1.11 + +require ( + github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect + github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect + github.com/decred/dcrd/crypto/ripemd160 v1.0.2 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/tyler-smith/go-bip32 v1.0.0 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + golang.org/x/crypto v0.23.0 // indirect +) diff --git a/_code-samples/clawback/go/go.sum b/_code-samples/clawback/go/go.sum new file mode 100644 index 00000000000..8d8522a619c --- /dev/null +++ b/_code-samples/clawback/go/go.sum @@ -0,0 +1,58 @@ +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc= +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= +github.com/Peersyst/xrpl-go v0.1.11 h1:P6r/gHxRnbAtAdPmzNHz/7zpsdfvwh0SS+QI2JNT44w= +github.com/Peersyst/xrpl-go v0.1.11/go.mod h1:CBRM3/soqNeeL2Jx6USVUtECqulZVUoq3UxZKMz9hdw= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2 h1:TvGTmUBHDU75OHro9ojPLK+Yv7gDl2hnUvRocRCjsys= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2/go.mod h1:uGfjDyePSpa75cSQLzNdVmWlbQMBuiJkvXw/MNKRY4M= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.1.5-0.20170601210322-f6abca593680/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/tyler-smith/go-bip32 v1.0.0 h1:sDR9juArbUgX+bO/iblgZnMPeWY1KZMUC2AFUJdv5KE= +github.com/tyler-smith/go-bip32 v1.0.0/go.mod h1:onot+eHknzV4BVPwrzqY5OoVpyCvnwD7lMawL5aQupE= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= diff --git a/_code-samples/clawback/go/rpc/main.go b/_code-samples/clawback/go/rpc/main.go index 9ab1e3e8e78..ead2e28eb60 100644 --- a/_code-samples/clawback/go/rpc/main.go +++ b/_code-samples/clawback/go/rpc/main.go @@ -1 +1,251 @@ -package rpc +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" +) + +const ( + currencyCode = "FOO" +) + +func main() { + // + // Configure client + // + cfg, err := rpc.NewClientConfig( + "https://s.altnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + client := rpc.NewClient(cfg) + + // + // Configure wallets + // + fmt.Println("⏳ Setting up wallets...") + coldWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating cold wallet: %s\n", err) + return + } + err = client.FundWallet(&coldWallet) + if err != nil { + fmt.Printf("❌ Error funding cold wallet: %s\n", err) + return + } + fmt.Println("💸 Cold wallet funded!") + + hotWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating hot wallet: %s\n", err) + return + } + err = client.FundWallet(&hotWallet) + if err != nil { + fmt.Printf("❌ Error funding hot wallet: %s\n", err) + return + } + fmt.Println("💸 Hot wallet funded!") + fmt.Println() + + fmt.Println("✅ Wallets setup complete!") + fmt.Println("💳 Cold wallet:", coldWallet.ClassicAddress) + fmt.Println("💳 Hot wallet:", hotWallet.ClassicAddress) + fmt.Println() + + // + // Configure cold address settings + // + fmt.Println("⏳ Configuring cold address settings...") + coldWalletAccountSet := &transactions.AccountSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + TickSize: types.TickSize(5), + TransferRate: types.TransferRate(0), + Domain: types.Domain("6578616D706C652E636F6D"), // example.com + } + + coldWalletAccountSet.SetAsfAllowTrustLineClawback() + coldWalletAccountSet.SetDisallowXRP() + + coldWalletAccountSet.SetRequireDestTag() + + flattenedTx := coldWalletAccountSet.Flatten() + + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err := coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err := client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Cold wallet unfreezing failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Cold address settings configured!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Create trust line from hot to cold address + // + fmt.Println("⏳ Creating trust line from hot to cold address...") + hotColdTrustSet := &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(hotWallet.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "100000000000000", + }, + } + + flattenedTx = hotColdTrustSet.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = hotWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Trust line from hot to cold address creation failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Trust line from hot to cold address created!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Send tokens from cold wallet to hot wallet + // + fmt.Println("⏳ Sending tokens from cold wallet to hot wallet...") + coldToHotPayment := &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "3800", + }, + Destination: types.Address(hotWallet.ClassicAddress), + DestinationTag: types.DestinationTag(1), + } + + flattenedTx = coldToHotPayment.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Tokens not sent from cold wallet to hot wallet!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Tokens sent from cold wallet to hot wallet!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Claw back tokens from customer one + // + fmt.Println("⏳ Clawing back tokens from hot wallet...") + + coldWalletClawback := &transactions.Clawback{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(hotWallet.ClassicAddress), + Value: "50", + }, + } + + flattenedTx = coldWalletClawback.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Tokens not clawed back from customer one!") + fmt.Println("Try again!") + return + } + + fmt.Println("✅ Tokens clawed back from customer one!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() +} diff --git a/_code-samples/clawback/go/ws/main.go b/_code-samples/clawback/go/ws/main.go index 98592950df4..6a689ccde48 100644 --- a/_code-samples/clawback/go/ws/main.go +++ b/_code-samples/clawback/go/ws/main.go @@ -1 +1,258 @@ -package ws +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" +) + +const ( + currencyCode = "FOO" +) + +func main() { + // + // Configure client + // + fmt.Println("⏳ Setting up client...") + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net"). + WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + fmt.Println("✅ Client configured!") + fmt.Println() + + fmt.Println("Connecting to server...") + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + fmt.Println("Connection: ", client.IsConnected()) + + // + // Configure wallets + // + fmt.Println("⏳ Setting up wallets...") + coldWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating cold wallet: %s\n", err) + return + } + err = client.FundWallet(&coldWallet) + if err != nil { + fmt.Printf("❌ Error funding cold wallet: %s\n", err) + return + } + fmt.Println("💸 Cold wallet funded!") + + hotWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating hot wallet: %s\n", err) + return + } + err = client.FundWallet(&hotWallet) + if err != nil { + fmt.Printf("❌ Error funding hot wallet: %s\n", err) + return + } + fmt.Println("💸 Hot wallet funded!") + fmt.Println() + + fmt.Println("✅ Wallets setup complete!") + fmt.Println("💳 Cold wallet:", coldWallet.ClassicAddress) + fmt.Println("💳 Hot wallet:", hotWallet.ClassicAddress) + fmt.Println() + + // + // Configure cold address settings + // + fmt.Println("⏳ Configuring cold address settings...") + coldWalletAccountSet := &transactions.AccountSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + TickSize: types.TickSize(5), + TransferRate: types.TransferRate(0), + Domain: types.Domain("6578616D706C652E636F6D"), // example.com + } + + coldWalletAccountSet.SetAsfAllowTrustLineClawback() + coldWalletAccountSet.SetDisallowXRP() + + coldWalletAccountSet.SetRequireDestTag() + + flattenedTx := coldWalletAccountSet.Flatten() + + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err := coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err := client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Cold wallet unfreezing failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Cold address settings configured!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Create trust line from hot to cold address + // + fmt.Println("⏳ Creating trust line from hot to cold address...") + hotColdTrustSet := &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(hotWallet.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "100000000000000", + }, + } + + flattenedTx = hotColdTrustSet.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = hotWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Trust line from hot to cold address creation failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Trust line from hot to cold address created!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Send tokens from cold wallet to hot wallet + // + fmt.Println("⏳ Sending tokens from cold wallet to hot wallet...") + coldToHotPayment := &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "3800", + }, + Destination: types.Address(hotWallet.ClassicAddress), + DestinationTag: types.DestinationTag(1), + } + + flattenedTx = coldToHotPayment.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Tokens not sent from cold wallet to hot wallet!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Tokens sent from cold wallet to hot wallet!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Claw back tokens from customer one + // + fmt.Println("⏳ Clawing back tokens from hot wallet...") + + coldWalletClawback := &transactions.Clawback{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(hotWallet.ClassicAddress), + Value: "50", + }, + } + + flattenedTx = coldWalletClawback.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Tokens not clawed back from customer one!") + fmt.Println("Try again!") + return + } + + fmt.Println("✅ Tokens clawed back from customer one!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() +} diff --git a/_code-samples/credential/README.md b/_code-samples/credential/README.md new file mode 100644 index 00000000000..751fa22c5f5 --- /dev/null +++ b/_code-samples/credential/README.md @@ -0,0 +1,3 @@ +# Credential + +Create, accept, and delete a credential on the XRPL using dedicated transactions between issuer and subject wallets. diff --git a/_code-samples/credential/go/go.mod b/_code-samples/credential/go/go.mod new file mode 100644 index 00000000000..fa9fde5d08c --- /dev/null +++ b/_code-samples/credential/go/go.mod @@ -0,0 +1,24 @@ +module github.com/XRPLF + +go 1.23.0 + +toolchain go1.23.10 + +require github.com/Peersyst/xrpl-go v0.1.11 + +require ( + github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect + github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect + github.com/decred/dcrd/crypto/ripemd160 v1.0.2 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/tyler-smith/go-bip32 v1.0.0 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + golang.org/x/crypto v0.23.0 // indirect +) diff --git a/_code-samples/credential/go/go.sum b/_code-samples/credential/go/go.sum new file mode 100644 index 00000000000..8d8522a619c --- /dev/null +++ b/_code-samples/credential/go/go.sum @@ -0,0 +1,58 @@ +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc= +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= +github.com/Peersyst/xrpl-go v0.1.11 h1:P6r/gHxRnbAtAdPmzNHz/7zpsdfvwh0SS+QI2JNT44w= +github.com/Peersyst/xrpl-go v0.1.11/go.mod h1:CBRM3/soqNeeL2Jx6USVUtECqulZVUoq3UxZKMz9hdw= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2 h1:TvGTmUBHDU75OHro9ojPLK+Yv7gDl2hnUvRocRCjsys= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2/go.mod h1:uGfjDyePSpa75cSQLzNdVmWlbQMBuiJkvXw/MNKRY4M= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.1.5-0.20170601210322-f6abca593680/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/tyler-smith/go-bip32 v1.0.0 h1:sDR9juArbUgX+bO/iblgZnMPeWY1KZMUC2AFUJdv5KE= +github.com/tyler-smith/go-bip32 v1.0.0/go.mod h1:onot+eHknzV4BVPwrzqY5OoVpyCvnwD7lMawL5aQupE= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= diff --git a/_code-samples/credential/go/rpc/main.go b/_code-samples/credential/go/rpc/main.go new file mode 100644 index 00000000000..ab3bf1a1d07 --- /dev/null +++ b/_code-samples/credential/go/rpc/main.go @@ -0,0 +1,109 @@ +package main + +import ( + "encoding/hex" + "fmt" + "time" + + "github.com/Peersyst/xrpl-go/examples/clients" + "github.com/Peersyst/xrpl-go/pkg/crypto" + rippleTime "github.com/Peersyst/xrpl-go/xrpl/time" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" +) + +func main() { + // As of February 2025, Credential is only available on Devnet. + client := clients.GetDevnetRpcClient() + + // Configure wallets + + // Issuer + fmt.Println("⏳ Setting up credential issuer wallet...") + issuer, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating issuer wallet: %s\n", err) + return + } + + err = client.FundWallet(&issuer) + if err != nil { + fmt.Printf("❌ Error funding issuer wallet: %s\n", err) + return + } + fmt.Printf("✅ Issuer wallet funded: %s\n", issuer.ClassicAddress) + + // ----------------------------------------------------- + + // Subject (destination) + fmt.Println("⏳ Setting up Subject wallet...") + subjectWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating subject wallet: %s\n", err) + return + } + + err = client.FundWallet(&subjectWallet) + if err != nil { + fmt.Printf("❌ Error funding subject wallet: %s\n", err) + return + } + fmt.Printf("✅ Subject wallet funded: %s\n", subjectWallet.ClassicAddress) + + // ----------------------------------------------------- + + // Creating the CredentialCreate transaction + fmt.Println("⏳ Creating CredentialCreate transaction...") + + expiration, err := rippleTime.IsoTimeToRippleTime(time.Now().Add(time.Hour * 24).Format(time.RFC3339)) + credentialType := types.CredentialType("6D795F63726564656E7469616C") + + if err != nil { + fmt.Printf("❌ Error converting expiration to ripple time: %s\n", err) + return + } + + txn := &transaction.CredentialCreate{ + BaseTx: transaction.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + CredentialType: credentialType, + Subject: types.Address(subjectWallet.ClassicAddress), + Expiration: uint32(expiration), + URI: hex.EncodeToString([]byte("https://example.com")), + } + + clients.SubmitTxBlobAndWait(client, txn, issuer) + + // ----------------------------------------------------- + + // Creating the CredentialAccept transaction + fmt.Println("⏳ Creating CredentialAccept transaction...") + + acceptTxn := &transaction.CredentialAccept{ + BaseTx: transaction.BaseTx{ + Account: types.Address(subjectWallet.ClassicAddress), + }, + CredentialType: credentialType, + Issuer: types.Address(issuer.ClassicAddress), + } + + clients.SubmitTxBlobAndWait(client, acceptTxn, subjectWallet) + + // ----------------------------------------------------- + + // Creating the CredentialDelete transaction + fmt.Println("⏳ Creating CredentialDelete transaction...") + + deleteTxn := &transaction.CredentialDelete{ + BaseTx: transaction.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + CredentialType: credentialType, + Issuer: types.Address(issuer.ClassicAddress), + Subject: types.Address(subjectWallet.ClassicAddress), + } + + clients.SubmitTxBlobAndWait(client, deleteTxn, issuer) +} diff --git a/_code-samples/credential/go/ws/main.go b/_code-samples/credential/go/ws/main.go new file mode 100644 index 00000000000..3fd7eabce9d --- /dev/null +++ b/_code-samples/credential/go/ws/main.go @@ -0,0 +1,122 @@ +package main + +import ( + "encoding/hex" + "fmt" + "time" + + "github.com/Peersyst/xrpl-go/examples/clients" + "github.com/Peersyst/xrpl-go/pkg/crypto" + rippleTime "github.com/Peersyst/xrpl-go/xrpl/time" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" +) + +func main() { + + fmt.Println("⏳ Setting up client...") + + client := clients.GetDevnetWebsocketClient() + fmt.Println("Connecting to server...") + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Client configured!") + fmt.Println() + + fmt.Printf("Connection: %t", client.IsConnected()) + fmt.Println() + + // Configure wallets + + // Issuer + fmt.Println("⏳ Setting up credential issuer wallet...") + issuer, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating issuer wallet: %s\n", err) + return + } + + err = client.FundWallet(&issuer) + if err != nil { + fmt.Printf("❌ Error funding issuer wallet: %s\n", err) + return + } + fmt.Printf("✅ Issuer wallet funded: %s\n", issuer.ClassicAddress) + + // ----------------------------------------------------- + + // Subject (destination) + fmt.Println("⏳ Setting up Subject wallet...") + subjectWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating subject wallet: %s\n", err) + return + } + + err = client.FundWallet(&subjectWallet) + if err != nil { + fmt.Printf("❌ Error funding subject wallet: %s\n", err) + return + } + fmt.Printf("✅ Subject wallet funded: %s\n", subjectWallet.ClassicAddress) + + // ----------------------------------------------------- + + // Creating the CredentialCreate transaction + fmt.Println("⏳ Creating CredentialCreate transaction...") + + expiration, err := rippleTime.IsoTimeToRippleTime(time.Now().Add(time.Hour * 24).Format(time.RFC3339)) + credentialType := types.CredentialType("6D795F63726564656E7469616C") + + if err != nil { + fmt.Printf("❌ Error converting expiration to ripple time: %s\n", err) + return + } + + txn := &transaction.CredentialCreate{ + BaseTx: transaction.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + CredentialType: credentialType, + Subject: types.Address(subjectWallet.ClassicAddress), + Expiration: uint32(expiration), + URI: hex.EncodeToString([]byte("https://example.com")), + } + + clients.SubmitTxBlobAndWait(client, txn, issuer) + + // ----------------------------------------------------- + + // Creating the CredentialAccept transaction + fmt.Println("⏳ Creating CredentialAccept transaction...") + + acceptTxn := &transaction.CredentialAccept{ + BaseTx: transaction.BaseTx{ + Account: types.Address(subjectWallet.ClassicAddress), + }, + CredentialType: credentialType, + Issuer: types.Address(issuer.ClassicAddress), + } + + clients.SubmitTxBlobAndWait(client, acceptTxn, subjectWallet) + + // ----------------------------------------------------- + + // Creating the CredentialDelete transaction + fmt.Println("⏳ Creating CredentialDelete transaction...") + + deleteTxn := &transaction.CredentialDelete{ + BaseTx: transaction.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + CredentialType: credentialType, + Issuer: types.Address(issuer.ClassicAddress), + Subject: types.Address(subjectWallet.ClassicAddress), + } + + clients.SubmitTxBlobAndWait(client, deleteTxn, issuer) +} diff --git a/_code-samples/delegate-set/README.md b/_code-samples/delegate-set/README.md new file mode 100644 index 00000000000..2d8736f4e42 --- /dev/null +++ b/_code-samples/delegate-set/README.md @@ -0,0 +1,3 @@ +# Delegate + +Example delegating payment permission to an account and executing on behalf the delegator. diff --git a/_code-samples/delegate-set/go/go.mod b/_code-samples/delegate-set/go/go.mod new file mode 100644 index 00000000000..fa9fde5d08c --- /dev/null +++ b/_code-samples/delegate-set/go/go.mod @@ -0,0 +1,24 @@ +module github.com/XRPLF + +go 1.23.0 + +toolchain go1.23.10 + +require github.com/Peersyst/xrpl-go v0.1.11 + +require ( + github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect + github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect + github.com/decred/dcrd/crypto/ripemd160 v1.0.2 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/tyler-smith/go-bip32 v1.0.0 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + golang.org/x/crypto v0.23.0 // indirect +) diff --git a/_code-samples/delegate-set/go/go.sum b/_code-samples/delegate-set/go/go.sum new file mode 100644 index 00000000000..8d8522a619c --- /dev/null +++ b/_code-samples/delegate-set/go/go.sum @@ -0,0 +1,58 @@ +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc= +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= +github.com/Peersyst/xrpl-go v0.1.11 h1:P6r/gHxRnbAtAdPmzNHz/7zpsdfvwh0SS+QI2JNT44w= +github.com/Peersyst/xrpl-go v0.1.11/go.mod h1:CBRM3/soqNeeL2Jx6USVUtECqulZVUoq3UxZKMz9hdw= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2 h1:TvGTmUBHDU75OHro9ojPLK+Yv7gDl2hnUvRocRCjsys= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2/go.mod h1:uGfjDyePSpa75cSQLzNdVmWlbQMBuiJkvXw/MNKRY4M= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.1.5-0.20170601210322-f6abca593680/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/tyler-smith/go-bip32 v1.0.0 h1:sDR9juArbUgX+bO/iblgZnMPeWY1KZMUC2AFUJdv5KE= +github.com/tyler-smith/go-bip32 v1.0.0/go.mod h1:onot+eHknzV4BVPwrzqY5OoVpyCvnwD7lMawL5aQupE= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= diff --git a/_code-samples/delegate-set/go/rpc/main.go b/_code-samples/delegate-set/go/rpc/main.go new file mode 100644 index 00000000000..4bc070f0bc3 --- /dev/null +++ b/_code-samples/delegate-set/go/rpc/main.go @@ -0,0 +1,131 @@ +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/rpc/types" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" +) + +func main() { + // Configure the client + cfg, err := rpc.NewClientConfig( + "https://s.devnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + client := rpc.NewClient(cfg) + + // Create and fund wallets + delegatorWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + delegateeWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Funding wallets...") + if err := client.FundWallet(&delegatorWallet); err != nil { + fmt.Println(err) + return + } + if err := client.FundWallet(&delegateeWallet); err != nil { + fmt.Println(err) + return + } + fmt.Println("💸 Wallets funded") + + // Check initial balances + delegatorBalance, err := client.GetXrpBalance(delegatorWallet.ClassicAddress) + if err != nil { + delegatorBalance = "0" + } + delegateeBalance, err := client.GetXrpBalance(delegateeWallet.ClassicAddress) + if err != nil { + delegateeBalance = "0" + } + + fmt.Printf("💳 Delegator initial balance: %s XRP\n", delegatorBalance) + fmt.Printf("💳 Delegatee initial balance: %s XRP\n", delegateeBalance) + fmt.Println() + + // Create DelegateSet transaction + delegateSetTx := &transactions.DelegateSet{ + BaseTx: transactions.BaseTx{ + Account: txnTypes.Address(delegatorWallet.ClassicAddress), + }, + Authorize: txnTypes.Address(delegateeWallet.ClassicAddress), + Permissions: []txnTypes.Permission{ + { + Permission: txnTypes.PermissionValue{ + PermissionValue: "Payment", + }, + }, + }, + } + + // Submit DelegateSet transaction + response, err := client.SubmitTxAndWait(delegateSetTx.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &delegatorWallet, + }) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ DelegateSet transaction submitted") + fmt.Printf("🌐 Hash: %s\n", response.Hash) + fmt.Printf("🌐 Validated: %t\n", response.Validated) + fmt.Println() + + // Create delegated payment transaction + delegatedPaymentTx := &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: txnTypes.Address(delegatorWallet.ClassicAddress), + Delegate: txnTypes.Address(delegateeWallet.ClassicAddress), + }, + Destination: txnTypes.Address(delegateeWallet.ClassicAddress), + Amount: txnTypes.XRPCurrencyAmount(1000000), // 1 XRP + } + + // Submit delegated payment + response2, err := client.SubmitTxAndWait(delegatedPaymentTx.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &delegateeWallet, + }) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Delegated payment submitted") + fmt.Printf("🌐 Hash: %s\n", response2.Hash) + fmt.Printf("🌐 Validated: %t\n", response2.Validated) + fmt.Println() + + // Check final balances + finalDelegatorBalance, err := client.GetXrpBalance(delegatorWallet.ClassicAddress) + if err != nil { + finalDelegatorBalance = "0" + } + finalDelegateeBalance, err := client.GetXrpBalance(delegateeWallet.ClassicAddress) + if err != nil { + finalDelegateeBalance = "0" + } + + fmt.Printf("💳 Delegator final balance: %s XRP\n", finalDelegatorBalance) + fmt.Printf("💳 Delegatee final balance: %s XRP\n", finalDelegateeBalance) +} diff --git a/_code-samples/delegate-set/go/ws/main.go b/_code-samples/delegate-set/go/ws/main.go new file mode 100644 index 00000000000..7aac89cc56c --- /dev/null +++ b/_code-samples/delegate-set/go/ws/main.go @@ -0,0 +1,151 @@ +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" +) + +func main() { + // Connect to testnet + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.devnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) + defer client.Disconnect() + + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + // Create and fund wallets + delegatorWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + delegateeWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Funding wallets...") + if err := client.FundWallet(&delegatorWallet); err != nil { + fmt.Println(err) + return + } + if err := client.FundWallet(&delegateeWallet); err != nil { + fmt.Println(err) + return + } + fmt.Println("💸 Wallets funded") + + // Check initial balances + delegatorBalance, err := client.GetXrpBalance(delegatorWallet.ClassicAddress) + if err != nil { + delegatorBalance = "0" + } + delegateeBalance, err := client.GetXrpBalance(delegateeWallet.ClassicAddress) + if err != nil { + delegateeBalance = "0" + } + + fmt.Printf("💳 Delegator initial balance: %s XRP\n", delegatorBalance) + fmt.Printf("💳 Delegatee initial balance: %s XRP\n", delegateeBalance) + fmt.Println() + + // Create DelegateSet transaction + delegateSetTx := &transactions.DelegateSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(delegatorWallet.ClassicAddress), + }, + Authorize: types.Address(delegateeWallet.ClassicAddress), + Permissions: []types.Permission{ + { + Permission: types.PermissionValue{ + PermissionValue: "Payment", + }, + }, + }, + } + + // Submit DelegateSet transaction + flattenedTx := delegateSetTx.Flatten() + if err := client.Autofill(&flattenedTx); err != nil { + fmt.Println(err) + return + } + + txBlob, _, err := delegatorWallet.Sign(flattenedTx) + if err != nil { + fmt.Println(err) + return + } + + response, err := client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ DelegateSet transaction submitted") + fmt.Printf("🌐 Hash: %s\n", response.Hash) + fmt.Printf("🌐 Validated: %t\n", response.Validated) + fmt.Println() + + // Create delegated payment transaction + delegatedPaymentTx := &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(delegatorWallet.ClassicAddress), + Delegate: types.Address(delegateeWallet.ClassicAddress), + }, + Destination: types.Address(delegateeWallet.ClassicAddress), + Amount: types.XRPCurrencyAmount(1000000), // 1 XRP + } + + // Submit delegated payment + flatDelegatedPayment := delegatedPaymentTx.Flatten() + if err := client.Autofill(&flatDelegatedPayment); err != nil { + fmt.Println(err) + return + } + + txBlob2, _, err := delegateeWallet.Sign(flatDelegatedPayment) + if err != nil { + fmt.Println(err) + return + } + + response2, err := client.SubmitTxBlobAndWait(txBlob2, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Delegated payment submitted") + fmt.Printf("🌐 Hash: %s\n", response2.Hash) + fmt.Printf("🌐 Validated: %t\n", response2.Validated) + fmt.Println() + + // Check final balances + finalDelegatorBalance, err := client.GetXrpBalance(delegatorWallet.ClassicAddress) + if err != nil { + finalDelegatorBalance = "0" + } + finalDelegateeBalance, err := client.GetXrpBalance(delegateeWallet.ClassicAddress) + if err != nil { + finalDelegateeBalance = "0" + } + + fmt.Printf("💳 Delegator final balance: %s XRP\n", finalDelegatorBalance) + fmt.Printf("💳 Delegatee final balance: %s XRP\n", finalDelegateeBalance) +} diff --git a/_code-samples/deposit-preauth/README.md b/_code-samples/deposit-preauth/README.md new file mode 100644 index 00000000000..16b546d7eb1 --- /dev/null +++ b/_code-samples/deposit-preauth/README.md @@ -0,0 +1,3 @@ +# DepositPreauth + +Example of DepositPreauth transaction demonstrating how deposit permissions can be managed. diff --git a/_code-samples/deposit-preauth/go/go.mod b/_code-samples/deposit-preauth/go/go.mod new file mode 100644 index 00000000000..fa9fde5d08c --- /dev/null +++ b/_code-samples/deposit-preauth/go/go.mod @@ -0,0 +1,24 @@ +module github.com/XRPLF + +go 1.23.0 + +toolchain go1.23.10 + +require github.com/Peersyst/xrpl-go v0.1.11 + +require ( + github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect + github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect + github.com/decred/dcrd/crypto/ripemd160 v1.0.2 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/tyler-smith/go-bip32 v1.0.0 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + golang.org/x/crypto v0.23.0 // indirect +) diff --git a/_code-samples/deposit-preauth/go/go.sum b/_code-samples/deposit-preauth/go/go.sum new file mode 100644 index 00000000000..8d8522a619c --- /dev/null +++ b/_code-samples/deposit-preauth/go/go.sum @@ -0,0 +1,58 @@ +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc= +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= +github.com/Peersyst/xrpl-go v0.1.11 h1:P6r/gHxRnbAtAdPmzNHz/7zpsdfvwh0SS+QI2JNT44w= +github.com/Peersyst/xrpl-go v0.1.11/go.mod h1:CBRM3/soqNeeL2Jx6USVUtECqulZVUoq3UxZKMz9hdw= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2 h1:TvGTmUBHDU75OHro9ojPLK+Yv7gDl2hnUvRocRCjsys= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2/go.mod h1:uGfjDyePSpa75cSQLzNdVmWlbQMBuiJkvXw/MNKRY4M= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.1.5-0.20170601210322-f6abca593680/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/tyler-smith/go-bip32 v1.0.0 h1:sDR9juArbUgX+bO/iblgZnMPeWY1KZMUC2AFUJdv5KE= +github.com/tyler-smith/go-bip32 v1.0.0/go.mod h1:onot+eHknzV4BVPwrzqY5OoVpyCvnwD7lMawL5aQupE= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= diff --git a/_code-samples/deposit-preauth/go/rpc/main.go b/_code-samples/deposit-preauth/go/rpc/main.go new file mode 100644 index 00000000000..1280390928e --- /dev/null +++ b/_code-samples/deposit-preauth/go/rpc/main.go @@ -0,0 +1,220 @@ +package main + +import ( + "encoding/hex" + "fmt" + "time" + + "github.com/Peersyst/xrpl-go/examples/clients" + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/queries/account" + "github.com/Peersyst/xrpl-go/xrpl/queries/common" + rippletime "github.com/Peersyst/xrpl-go/xrpl/time" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" +) + +func main() { + client := clients.GetDevnetRpcClient() + + // Configure wallets + + // Issuer + fmt.Println("⏳ Setting up credential issuer wallet...") + issuer, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating credential issuer wallet: %s\n", err) + return + } + + err = client.FundWallet(&issuer) + if err != nil { + fmt.Printf("❌ Error funding credential issuer wallet: %s\n", err) + return + } + fmt.Printf("✅ Credential issuer wallet funded: %s\n", issuer.ClassicAddress) + + // ----------------------------------------------------- + + // Holder 1 + fmt.Println("⏳ Setting up holder 1 wallet...") + holderWallet1, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating holder 1 wallet: %s\n", err) + return + } + + err = client.FundWallet(&holderWallet1) + if err != nil { + fmt.Printf("❌ Error funding holder 1 wallet: %s\n", err) + return + } + fmt.Printf("✅ Holder 1 wallet funded: %s\n", holderWallet1.ClassicAddress) + + // ----------------------------------------------------- + + // Enabling DepositAuth on the issuer account with an AccountSet transaction + fmt.Println("⏳ Enabling DepositAuth on the issuer account...") + accountSetTx := &transaction.AccountSet{ + BaseTx: transaction.BaseTx{ + Account: issuer.ClassicAddress, + TransactionType: transaction.AccountSetTx, + }, + } + accountSetTx.SetAsfDepositAuth() + + clients.SubmitTxBlobAndWait(client, accountSetTx, issuer) + + // ----------------------------------------------------- + + // Creating the CredentialCreate transaction + fmt.Println("⏳ Creating the CredentialCreate transaction...") + + expiration, err := rippletime.IsoTimeToRippleTime(time.Now().Add(time.Hour * 24).Format(time.RFC3339)) + if err != nil { + fmt.Printf("❌ Error converting expiration to ripple time: %s\n", err) + return + } + credentialType := types.CredentialType("6D795F63726564656E7469616C") // my_credential + + credentialCreateTx := &transaction.CredentialCreate{ + BaseTx: transaction.BaseTx{ + Account: issuer.ClassicAddress, + TransactionType: transaction.CredentialCreateTx, + }, + Expiration: uint32(expiration), + CredentialType: credentialType, + Subject: types.Address(holderWallet1.ClassicAddress), + URI: hex.EncodeToString([]byte("https://example.com")), + } + + clients.SubmitTxBlobAndWait(client, credentialCreateTx, issuer) + + // ----------------------------------------------------- + + // Creating the CredentialAccept transaction + fmt.Println("⏳ Creating the CredentialAccept transaction...") + + credentialAcceptTx := &transaction.CredentialAccept{ + BaseTx: transaction.BaseTx{ + Account: holderWallet1.ClassicAddress, + TransactionType: transaction.CredentialAcceptTx, + }, + CredentialType: credentialType, + Issuer: types.Address(issuer.ClassicAddress), + } + + clients.SubmitTxBlobAndWait(client, credentialAcceptTx, holderWallet1) + + // ----------------------------------------------------- + + // Creating the DepositPreauth transaction + fmt.Println("⏳ Creating the DepositPreauth transaction using AuthorizeCredentials...") + + depositPreauthTx := &transaction.DepositPreauth{ + BaseTx: transaction.BaseTx{ + Account: issuer.ClassicAddress, + TransactionType: transaction.DepositPreauthTx, + }, + AuthorizeCredentials: []types.AuthorizeCredentialsWrapper{ + { + Credential: types.AuthorizeCredentials{ + Issuer: issuer.ClassicAddress, + CredentialType: credentialType, + }, + }, + }, + } + + clients.SubmitTxBlobAndWait(client, depositPreauthTx, issuer) + + // ----------------------------------------------------- + + // Get the credential ID + fmt.Println("⏳ Getting the credential ID from the holder 1 account...") + + objectsRequest := &account.ObjectsRequest{ + Account: holderWallet1.ClassicAddress, + Type: account.CredentialObject, + LedgerIndex: common.Validated, + } + + objectsResponse, err := client.GetAccountObjects(objectsRequest) + if err != nil { + fmt.Printf("❌ Error getting the credential ID: %s\n", err) + return + } + + // Check if we have any credential objects + if len(objectsResponse.AccountObjects) == 0 { + fmt.Println("❌ No credential objects found") + return + } + + // Extract the credential ID + credentialID, ok := objectsResponse.AccountObjects[0]["index"].(string) + if !ok { + fmt.Println("❌ Could not extract credential ID from response") + return + } + + fmt.Printf("✅ Credential ID: %s\n", credentialID) + fmt.Println() + + // ----------------------------------------------------- + + // Sending XRP to the holder 1 account + fmt.Println("⏳ Sending XRP to the issuer account, should succeed...") + + sendTx := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: holderWallet1.ClassicAddress, + TransactionType: transaction.PaymentTx, + }, + Amount: types.XRPCurrencyAmount(1000000), + Destination: issuer.ClassicAddress, + CredentialIDs: types.CredentialIDs{credentialID}, + } + + clients.SubmitTxBlobAndWait(client, sendTx, holderWallet1) + + // ----------------------------------------------------- + + // Unauthorizing the holder 1 account + fmt.Println("⏳ Unauthorizing the holder 1 account with the DepositPreauth transaction and the UnauthorizeCredentials field...") + + unauthorizeTx := &transaction.DepositPreauth{ + BaseTx: transaction.BaseTx{ + Account: issuer.ClassicAddress, + TransactionType: transaction.DepositPreauthTx, + }, + UnauthorizeCredentials: []types.AuthorizeCredentialsWrapper{ + { + Credential: types.AuthorizeCredentials{ + Issuer: issuer.ClassicAddress, + CredentialType: credentialType, + }, + }, + }, + } + + clients.SubmitTxBlobAndWait(client, unauthorizeTx, issuer) + + // ----------------------------------------------------- + + // Sending XRP to the holder 1 account again (which should fail) + fmt.Println("⏳ Sending XRP to the issuer account again (which should fail)...") + + sendTx2 := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: holderWallet1.ClassicAddress, + TransactionType: transaction.PaymentTx, + }, + Amount: types.XRPCurrencyAmount(1000000), + Destination: issuer.ClassicAddress, + CredentialIDs: types.CredentialIDs{credentialID}, + } + + clients.SubmitTxBlobAndWait(client, sendTx2, holderWallet1) +} diff --git a/_code-samples/deposit-preauth/go/ws/main.go b/_code-samples/deposit-preauth/go/ws/main.go new file mode 100644 index 00000000000..2d0a304ec37 --- /dev/null +++ b/_code-samples/deposit-preauth/go/ws/main.go @@ -0,0 +1,234 @@ +package main + +import ( + "encoding/hex" + "fmt" + "time" + + "github.com/Peersyst/xrpl-go/examples/clients" + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/queries/account" + "github.com/Peersyst/xrpl-go/xrpl/queries/common" + rippletime "github.com/Peersyst/xrpl-go/xrpl/time" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" +) + +func main() { + + fmt.Println("⏳ Setting up client...") + + client := clients.GetDevnetWebsocketClient() + fmt.Println("Connecting to server...") + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Client configured!") + fmt.Println() + + fmt.Printf("Connection: %t", client.IsConnected()) + fmt.Println() + + // Configure wallets + + // Issuer + fmt.Println("⏳ Setting up credential issuer wallet...") + issuer, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating credential issuer wallet: %s\n", err) + return + } + + err = client.FundWallet(&issuer) + if err != nil { + fmt.Printf("❌ Error funding credential issuer wallet: %s\n", err) + return + } + fmt.Printf("✅ Credential issuer wallet funded: %s\n", issuer.ClassicAddress) + + // ----------------------------------------------------- + + // Holder 1 + fmt.Println("⏳ Setting up holder 1 wallet...") + holderWallet1, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating holder 1 wallet: %s\n", err) + return + } + + err = client.FundWallet(&holderWallet1) + if err != nil { + fmt.Printf("❌ Error funding holder 1 wallet: %s\n", err) + return + } + fmt.Printf("✅ Holder 1 wallet funded: %s\n", holderWallet1.ClassicAddress) + + // ----------------------------------------------------- + + // Enabling DepositAuth on the issuer account with an AccountSet transaction + fmt.Println("⏳ Enabling DepositAuth on the issuer account...") + accountSetTx := &transaction.AccountSet{ + BaseTx: transaction.BaseTx{ + Account: issuer.ClassicAddress, + TransactionType: transaction.AccountSetTx, + }, + } + accountSetTx.SetAsfDepositAuth() + + clients.SubmitTxBlobAndWait(client, accountSetTx, issuer) + + // ----------------------------------------------------- + + // Creating the CredentialCreate transaction + fmt.Println("⏳ Creating the CredentialCreate transaction...") + + expiration, err := rippletime.IsoTimeToRippleTime(time.Now().Add(time.Hour * 24).Format(time.RFC3339)) + if err != nil { + fmt.Printf("❌ Error converting expiration to ripple time: %s\n", err) + return + } + credentialType := types.CredentialType("6D795F63726564656E7469616C") // my_credential + + credentialCreateTx := &transaction.CredentialCreate{ + BaseTx: transaction.BaseTx{ + Account: issuer.ClassicAddress, + TransactionType: transaction.CredentialCreateTx, + }, + Expiration: uint32(expiration), + CredentialType: credentialType, + Subject: types.Address(holderWallet1.ClassicAddress), + URI: hex.EncodeToString([]byte("https://example.com")), + } + + clients.SubmitTxBlobAndWait(client, credentialCreateTx, issuer) + + // ----------------------------------------------------- + + // Creating the CredentialAccept transaction + fmt.Println("⏳ Creating the CredentialAccept transaction...") + + credentialAcceptTx := &transaction.CredentialAccept{ + BaseTx: transaction.BaseTx{ + Account: holderWallet1.ClassicAddress, + TransactionType: transaction.CredentialAcceptTx, + }, + CredentialType: credentialType, + Issuer: types.Address(issuer.ClassicAddress), + } + + clients.SubmitTxBlobAndWait(client, credentialAcceptTx, holderWallet1) + + // ----------------------------------------------------- + + // Creating the DepositPreauth transaction + fmt.Println("⏳ Creating the DepositPreauth transaction using AuthorizeCredentials...") + + depositPreauthTx := &transaction.DepositPreauth{ + BaseTx: transaction.BaseTx{ + Account: issuer.ClassicAddress, + TransactionType: transaction.DepositPreauthTx, + }, + AuthorizeCredentials: []types.AuthorizeCredentialsWrapper{ + { + Credential: types.AuthorizeCredentials{ + Issuer: issuer.ClassicAddress, + CredentialType: credentialType, + }, + }, + }, + } + + clients.SubmitTxBlobAndWait(client, depositPreauthTx, issuer) + + // ----------------------------------------------------- + + // Get the credential ID + fmt.Println("⏳ Getting the credential ID from the holder 1 account...") + + objectsRequest := &account.ObjectsRequest{ + Account: holderWallet1.ClassicAddress, + Type: account.CredentialObject, + LedgerIndex: common.Validated, + } + + objectsResponse, err := client.GetAccountObjects(objectsRequest) + if err != nil { + fmt.Printf("❌ Error getting the credential ID: %s\n", err) + return + } + + // Check if we have any credential objects + if len(objectsResponse.AccountObjects) == 0 { + fmt.Println("❌ No credential objects found") + return + } + + // Extract the credential ID + credentialID, ok := objectsResponse.AccountObjects[0]["index"].(string) + if !ok { + fmt.Println("❌ Could not extract credential ID from response") + return + } + + fmt.Printf("✅ Credential ID: %s\n", credentialID) + fmt.Println() + + // ----------------------------------------------------- + + // Sending XRP to the holder 1 account + fmt.Println("⏳ Sending XRP to the issuer account, should succeed...") + + sendTx := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: holderWallet1.ClassicAddress, + TransactionType: transaction.PaymentTx, + }, + Amount: types.XRPCurrencyAmount(1000000), + Destination: issuer.ClassicAddress, + CredentialIDs: types.CredentialIDs{credentialID}, + } + + clients.SubmitTxBlobAndWait(client, sendTx, holderWallet1) + + // ----------------------------------------------------- + + // Unauthorize the holder 1 account + fmt.Println("⏳ Unauthorize the holder 1 account with the DepositPreauth transaction and the UnauthorizeCredentials field...") + + unauthorizeTx := &transaction.DepositPreauth{ + BaseTx: transaction.BaseTx{ + Account: issuer.ClassicAddress, + TransactionType: transaction.DepositPreauthTx, + }, + UnauthorizeCredentials: []types.AuthorizeCredentialsWrapper{ + { + Credential: types.AuthorizeCredentials{ + Issuer: issuer.ClassicAddress, + CredentialType: credentialType, + }, + }, + }, + } + + clients.SubmitTxBlobAndWait(client, unauthorizeTx, issuer) + + // ----------------------------------------------------- + + // Sending XRP to the holder 1 account again (which should fail) + fmt.Println("⏳ Sending XRP to the issuer account again (which should fail)...") + + sendTx2 := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: holderWallet1.ClassicAddress, + TransactionType: transaction.PaymentTx, + }, + Amount: types.XRPCurrencyAmount(1000000), + Destination: issuer.ClassicAddress, + CredentialIDs: types.CredentialIDs{credentialID}, + } + + clients.SubmitTxBlobAndWait(client, sendTx2, holderWallet1) +} diff --git a/_code-samples/freeze/go/go.mod b/_code-samples/freeze/go/go.mod new file mode 100644 index 00000000000..fa9fde5d08c --- /dev/null +++ b/_code-samples/freeze/go/go.mod @@ -0,0 +1,24 @@ +module github.com/XRPLF + +go 1.23.0 + +toolchain go1.23.10 + +require github.com/Peersyst/xrpl-go v0.1.11 + +require ( + github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect + github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect + github.com/decred/dcrd/crypto/ripemd160 v1.0.2 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/tyler-smith/go-bip32 v1.0.0 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + golang.org/x/crypto v0.23.0 // indirect +) diff --git a/_code-samples/freeze/go/go.sum b/_code-samples/freeze/go/go.sum new file mode 100644 index 00000000000..8d8522a619c --- /dev/null +++ b/_code-samples/freeze/go/go.sum @@ -0,0 +1,58 @@ +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc= +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= +github.com/Peersyst/xrpl-go v0.1.11 h1:P6r/gHxRnbAtAdPmzNHz/7zpsdfvwh0SS+QI2JNT44w= +github.com/Peersyst/xrpl-go v0.1.11/go.mod h1:CBRM3/soqNeeL2Jx6USVUtECqulZVUoq3UxZKMz9hdw= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2 h1:TvGTmUBHDU75OHro9ojPLK+Yv7gDl2hnUvRocRCjsys= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2/go.mod h1:uGfjDyePSpa75cSQLzNdVmWlbQMBuiJkvXw/MNKRY4M= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.1.5-0.20170601210322-f6abca593680/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/tyler-smith/go-bip32 v1.0.0 h1:sDR9juArbUgX+bO/iblgZnMPeWY1KZMUC2AFUJdv5KE= +github.com/tyler-smith/go-bip32 v1.0.0/go.mod h1:onot+eHknzV4BVPwrzqY5OoVpyCvnwD7lMawL5aQupE= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= diff --git a/_code-samples/freeze/go/rpc/main.go b/_code-samples/freeze/go/rpc/main.go new file mode 100644 index 00000000000..e5a874cd758 --- /dev/null +++ b/_code-samples/freeze/go/rpc/main.go @@ -0,0 +1,347 @@ +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/currency" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" +) + +const ( + currencyCode = "USDA" +) + +type SubmittableTransaction interface { + TxType() transactions.TxType + Flatten() transactions.FlatTransaction // Ensures all transactions can be flattened +} + +func main() { + client := getRpcClient() + + // Configure wallets + + // Issuer + fmt.Println("⏳ Setting up issuer wallet...") + issuer, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating issuer wallet: %s\n", err) + return + } + + err = client.FundWallet(&issuer) + if err != nil { + fmt.Printf("❌ Error funding issuer wallet: %s\n", err) + return + } + fmt.Printf("✅ Issuer wallet funded: %s\n", issuer.ClassicAddress) + + // ----------------------------------------------------- + + // Holder 1 + fmt.Println("⏳ Setting up holder 1 wallet...") + holderWallet1, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating holder wallet 1: %s\n", err) + return + } + + err = client.FundWallet(&holderWallet1) + if err != nil { + fmt.Printf("❌ Error funding holder wallet 1: %s\n", err) + return + } + fmt.Printf("✅ Holder wallet 1 funded: %s\n", holderWallet1.ClassicAddress) + + // ----------------------------------------------------- + + // Holder 2 + fmt.Println("⏳ Setting up holder 2 wallet...") + holderWallet2, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating holder wallet 2: %s\n", err) + return + } + + err = client.FundWallet(&holderWallet2) + if err != nil { + fmt.Printf("❌ Error funding holder wallet 2: %s\n", err) + return + } + fmt.Printf("✅ Holder wallet 2 funded: %s\n", holderWallet2.ClassicAddress) + fmt.Println() + + fmt.Println("✅ Wallets setup complete!") + fmt.Println() + + // ----------------------------------------------------- + + // Configuring Issuing account + fmt.Println("⏳ Configuring issuer address settings...") + accountSet := &transactions.AccountSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + Domain: types.Domain("697373756572"), // issuer + } + + accountSet.SetAsfDefaultRipple() + submitAndWait(client, accountSet, issuer) + + // ----------------------------------------------------- + + // Trustline from the holder 1 to the issuer + fmt.Println("⏳ Setting up trustline from holder 1 to the issuer...") + trustSet := &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet1.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "1000000000", + }} + trustSet.SetSetNoRippleFlag() + submitAndWait(client, trustSet, holderWallet1) + + // ----------------------------------------------------- + + // Trustline from the holder 2 to the issuer + fmt.Println("⏳ Setting up trustline from holder 2 to the issuer...") + trustSet = &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet2.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "1000000000", + }, + } + trustSet.SetSetNoRippleFlag() + submitAndWait(client, trustSet, holderWallet2) + + // ----------------------------------------------------- + + // Minting to Holder 1 + fmt.Println("⏳ Minting to Holder 1...") + payment := &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + Destination: types.Address(holderWallet1.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "50000", + }, + } + submitAndWait(client, payment, issuer) + + // ----------------------------------------------------- + + // Minting to Holder 2 + fmt.Println("⏳ Minting to Holder 2...") + payment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + Destination: types.Address(holderWallet2.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "40000", + }, + } + submitAndWait(client, payment, issuer) + + // ----------------------------------------------------- + + // Sending payment from Holder 1 to Holder 2 + fmt.Println("⏳ Sending payment from Holder 1 to Holder 2...") + payment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet1.ClassicAddress), + }, + Destination: types.Address(holderWallet2.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "20", + }, + } + submitAndWait(client, payment, holderWallet1) + + // ----------------------------------------------------- + + // Freezing and Deep Freezing holder1 + fmt.Println("⏳ Freezing and Deep Freezing holder 1 trustline...") + trustSet = &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(holderWallet1.ClassicAddress), + Value: "0", + }, + } + trustSet.SetSetFreezeFlag() + trustSet.SetSetDeepFreezeFlag() + + submitAndWait(client, trustSet, issuer) + + // ------------------- SHOULD FAIL ⬇️ ------------------ + + // Sending payment from Holder 1 to Holder 2 (which should fail), Holder 1 can't decrease its balance + fmt.Println("⏳ Sending payment from Holder 1 to Holder 2 (which should fail). Holder 1 can't decrease its balance...") + payment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet1.ClassicAddress), + }, + Destination: types.Address(holderWallet2.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "10", + }, + } + submitAndWait(client, payment, holderWallet1) + + // ------------------- SHOULD FAIL ⬇️ ------------------ + + // Sending payment from Holder 2 to Holder 1 (which should fail), Holder 1 can't increase its balance + fmt.Println("⏳ Sending payment from Holder 2 to Holder 1 (which should fail). Holder 1 can't increase its balance...") + payment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet2.ClassicAddress), + }, + Destination: types.Address(holderWallet1.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "10", + }, + } + submitAndWait(client, payment, holderWallet2) + + // ------------------- SHOULD FAIL ⬇️ ------------------ + + // Creating OfferCreate transaction (which should fail), Holder 1 can't create an offer + fmt.Println("⏳ Creating OfferCreate transaction (which should fail). Holder 1 can't create an offer...") + offerCreate := &transactions.OfferCreate{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet1.ClassicAddress), + }, + TakerPays: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "10", + }, + TakerGets: types.XRPCurrencyAmount(10), + } + submitAndWait(client, offerCreate, holderWallet1) + + // ----------------------------------------------------- + + // Unfreezing and Deep Unfreezing holder 1 + fmt.Println("⏳ Unfreezing and Deep Unfreezing holder 1 trustline...") + trustSet = &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(holderWallet1.ClassicAddress), + Value: "0", + }, + } + trustSet.SetClearFreezeFlag() + trustSet.SetClearDeepFreezeFlag() + submitAndWait(client, trustSet, issuer) + + // ----------------------------------------------------- + + // Sending payment from Holder 1 to Holder 2 (which should succeed), Holder 1 can decrease its balance + fmt.Println("⏳ Sending payment from Holder 1 to Holder 2 (which should succeed). Holder 1 can decrease its balance...") + payment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet1.ClassicAddress), + }, + Destination: types.Address(holderWallet2.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "10", + }, + } + submitAndWait(client, payment, holderWallet1) + + // ----------------------------------------------------- + + // Sending payment from Holder 2 to Holder 1 (which should succeed), Holder 1 can increase its balance + fmt.Println("⏳ Sending payment from Holder 2 to Holder 1 (which should succeed). Holder 1 can increase its balance...") + payment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet2.ClassicAddress), + }, + Destination: types.Address(holderWallet1.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "10", + }, + } + submitAndWait(client, payment, holderWallet2) +} + +// getRpcClient returns a new rpc client +func getRpcClient() *rpc.Client { + cfg, err := rpc.NewClientConfig( + // DeepFreeze only available on Devnet as of February 2025, change to testnet/mainnet once the amendment passes. + "https://s.devnet.rippletest.net:51234", + rpc.WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + return rpc.NewClient(cfg) +} + +// submitAndWait submits a transaction and waits for it to be included in a validated ledger +func submitAndWait(client *rpc.Client, txn SubmittableTransaction, wallet wallet.Wallet) { + fmt.Printf("⏳ Submitting %s transaction...\n", txn.TxType()) + + flattenedTx := txn.Flatten() + + err := client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling %s transaction: %s\n", txn.TxType(), err) + fmt.Println() + return + } + + txBlob, _, err := wallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing %s transaction: %s\n", txn.TxType(), err) + fmt.Println() + return + } + + response, err := client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting %s transaction: %s\n", txn.TxType(), err) + fmt.Println() + return + } + + fmt.Printf("✅ %s transaction submitted\n", txn.TxType()) + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() +} diff --git a/_code-samples/freeze/go/ws/main.go b/_code-samples/freeze/go/ws/main.go new file mode 100644 index 00000000000..47e2323178e --- /dev/null +++ b/_code-samples/freeze/go/ws/main.go @@ -0,0 +1,357 @@ +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/currency" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" +) + +const ( + currencyCode = "USDA" +) + +type SubmittableTransaction interface { + TxType() transactions.TxType + Flatten() transactions.FlatTransaction // Ensures all transactions can be flattened +} + +func main() { + fmt.Println("⏳ Setting up client...") + + client := getClient() + fmt.Println("Connecting to server...") + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Client configured!") + fmt.Println() + + fmt.Printf("Connection: %t", client.IsConnected()) + fmt.Println() + + // Configure wallets + + // Issuer + fmt.Println("⏳ Setting up issuer wallet...") + issuer, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating issuer wallet: %s\n", err) + return + } + + err = client.FundWallet(&issuer) + if err != nil { + fmt.Printf("❌ Error funding issuer wallet: %s\n", err) + return + } + fmt.Printf("✅ Issuer wallet funded: %s\n", issuer.ClassicAddress) + + // ----------------------------------------------------- + + // Holder 1 + fmt.Println("⏳ Setting up holder 1 wallet...") + holderWallet1, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating holder wallet 1: %s\n", err) + return + } + + err = client.FundWallet(&holderWallet1) + if err != nil { + fmt.Printf("❌ Error funding holder wallet 1: %s\n", err) + return + } + fmt.Printf("✅ Holder wallet 1 funded: %s\n", holderWallet1.ClassicAddress) + + // ----------------------------------------------------- + + // Holder 2 + fmt.Println("⏳ Setting up holder 2 wallet...") + holderWallet2, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating holder wallet 2: %s\n", err) + return + } + + err = client.FundWallet(&holderWallet2) + if err != nil { + fmt.Printf("❌ Error funding holder wallet 2: %s\n", err) + return + } + fmt.Printf("✅ Holder wallet 2 funded: %s\n", holderWallet2.ClassicAddress) + fmt.Println() + + fmt.Println("✅ Wallets setup complete!") + fmt.Println() + + // ----------------------------------------------------- + + // Configuring Issuing account + fmt.Println("⏳ Configuring issuer address settings...") + accountSet := &transactions.AccountSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + Domain: types.Domain("697373756572"), // issuer + } + + accountSet.SetAsfDefaultRipple() + submitAndWait(client, accountSet, issuer) + + // ----------------------------------------------------- + + // Trustline from the holder 1 to the issuer + fmt.Println("⏳ Setting up trustline from holder 1 to the issuer...") + trustSet := &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet1.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "1000000000", + }} + trustSet.SetSetNoRippleFlag() + submitAndWait(client, trustSet, holderWallet1) + + // ----------------------------------------------------- + + // Trustline from the holder 2 to the issuer + fmt.Println("⏳ Setting up trustline from holder 2 to the issuer...") + trustSet = &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet2.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "1000000000", + }, + } + trustSet.SetSetNoRippleFlag() + submitAndWait(client, trustSet, holderWallet2) + + // ----------------------------------------------------- + + // Minting to Holder 1 + fmt.Println("⏳ Minting to Holder 1...") + payment := &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + Destination: types.Address(holderWallet1.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "50000", + }, + } + submitAndWait(client, payment, issuer) + + // ----------------------------------------------------- + + // Minting to Holder 2 + fmt.Println("⏳ Minting to Holder 2...") + payment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + Destination: types.Address(holderWallet2.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "40000", + }, + } + submitAndWait(client, payment, issuer) + + // ----------------------------------------------------- + + // Sending payment from Holder 1 to Holder 2 + fmt.Println("⏳ Sending payment from Holder 1 to Holder 2...") + payment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet1.ClassicAddress), + }, + Destination: types.Address(holderWallet2.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "20", + }, + } + submitAndWait(client, payment, holderWallet1) + + // ----------------------------------------------------- + + // Freezing and Deep Freezing holder1 + fmt.Println("⏳ Freezing and Deep Freezing holder 1 trustline...") + trustSet = &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(holderWallet1.ClassicAddress), + Value: "0", + }, + } + trustSet.SetSetFreezeFlag() + trustSet.SetSetDeepFreezeFlag() + + submitAndWait(client, trustSet, issuer) + + // ------------------- SHOULD FAIL ⬇️ ------------------ + + // Sending payment from Holder 1 to Holder 2 (which should fail), Holder 1 can't decrease its balance + fmt.Println("⏳ Sending payment from Holder 1 to Holder 2 (which should fail). Holder 1 can't decrease its balance...") + payment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet1.ClassicAddress), + }, + Destination: types.Address(holderWallet2.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "10", + }, + } + submitAndWait(client, payment, holderWallet1) + + // ------------------- SHOULD FAIL ⬇️ ------------------ + + // Sending payment from Holder 2 to Holder 1 (which should fail), Holder 1 can't increase its balance + fmt.Println("⏳ Sending payment from Holder 2 to Holder 1 (which should fail). Holder 1 can't increase its balance...") + payment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet2.ClassicAddress), + }, + Destination: types.Address(holderWallet1.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "10", + }, + } + submitAndWait(client, payment, holderWallet2) + + // ------------------- SHOULD FAIL ⬇️ ------------------ + + // Creating OfferCreate transaction (which should fail), Holder 1 can't create an offer + fmt.Println("⏳ Creating OfferCreate transaction (which should fail). Holder 1 can't create an offer...") + offerCreate := &transactions.OfferCreate{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet1.ClassicAddress), + }, + TakerPays: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "10", + }, + TakerGets: types.XRPCurrencyAmount(10), + } + submitAndWait(client, offerCreate, holderWallet1) + + // ----------------------------------------------------- + + // Unfreezing and Deep Unfreezing holder 1 + fmt.Println("⏳ Unfreezing and Deep Unfreezing holder 1 trustline...") + trustSet = &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(holderWallet1.ClassicAddress), + Value: "0", + }, + } + trustSet.SetClearFreezeFlag() + trustSet.SetClearDeepFreezeFlag() + submitAndWait(client, trustSet, issuer) + + // ----------------------------------------------------- + + // Sending payment from Holder 1 to Holder 2 (which should succeed), Holder 1 can decrease its balance + fmt.Println("⏳ Sending payment from Holder 1 to Holder 2 (which should succeed). Holder 1 can decrease its balance...") + payment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet1.ClassicAddress), + }, + Destination: types.Address(holderWallet2.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "10", + }, + } + submitAndWait(client, payment, holderWallet1) + + // ----------------------------------------------------- + + // Sending payment from Holder 2 to Holder 1 (which should succeed), Holder 1 can increase its balance + fmt.Println("⏳ Sending payment from Holder 2 to Holder 1 (which should succeed). Holder 1 can increase its balance...") + payment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet2.ClassicAddress), + }, + Destination: types.Address(holderWallet1.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "10", + }, + } + submitAndWait(client, payment, holderWallet2) +} + +// getRpcClient returns a new rpc client +func getClient() *websocket.Client { + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.devnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) + + return client +} + +// submitAndWait submits a transaction and waits for it to be included in a validated ledger +func submitAndWait(client *websocket.Client, txn SubmittableTransaction, wallet wallet.Wallet) { + fmt.Printf("⏳ Submitting %s transaction...\n", txn.TxType()) + + flattenedTx := txn.Flatten() + + err := client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling %s transaction: %s\n", txn.TxType(), err) + fmt.Println() + return + } + + txBlob, _, err := wallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing %s transaction: %s\n", txn.TxType(), err) + fmt.Println() + return + } + + response, err := client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting %s transaction: %s\n", txn.TxType(), err) + fmt.Println() + return + } + + fmt.Printf("✅ %s transaction submitted\n", txn.TxType()) + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() +} diff --git a/_code-samples/multisigning/go/go.mod b/_code-samples/multisigning/go/go.mod new file mode 100644 index 00000000000..fa9fde5d08c --- /dev/null +++ b/_code-samples/multisigning/go/go.mod @@ -0,0 +1,24 @@ +module github.com/XRPLF + +go 1.23.0 + +toolchain go1.23.10 + +require github.com/Peersyst/xrpl-go v0.1.11 + +require ( + github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect + github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect + github.com/decred/dcrd/crypto/ripemd160 v1.0.2 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/tyler-smith/go-bip32 v1.0.0 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + golang.org/x/crypto v0.23.0 // indirect +) diff --git a/_code-samples/multisigning/go/go.sum b/_code-samples/multisigning/go/go.sum new file mode 100644 index 00000000000..8d8522a619c --- /dev/null +++ b/_code-samples/multisigning/go/go.sum @@ -0,0 +1,58 @@ +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc= +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= +github.com/Peersyst/xrpl-go v0.1.11 h1:P6r/gHxRnbAtAdPmzNHz/7zpsdfvwh0SS+QI2JNT44w= +github.com/Peersyst/xrpl-go v0.1.11/go.mod h1:CBRM3/soqNeeL2Jx6USVUtECqulZVUoq3UxZKMz9hdw= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2 h1:TvGTmUBHDU75OHro9ojPLK+Yv7gDl2hnUvRocRCjsys= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2/go.mod h1:uGfjDyePSpa75cSQLzNdVmWlbQMBuiJkvXw/MNKRY4M= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.1.5-0.20170601210322-f6abca593680/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/tyler-smith/go-bip32 v1.0.0 h1:sDR9juArbUgX+bO/iblgZnMPeWY1KZMUC2AFUJdv5KE= +github.com/tyler-smith/go-bip32 v1.0.0/go.mod h1:onot+eHknzV4BVPwrzqY5OoVpyCvnwD7lMawL5aQupE= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= diff --git a/_code-samples/multisigning/go/rpc/main.go b/_code-samples/multisigning/go/rpc/main.go new file mode 100644 index 00000000000..447c8f8cf1b --- /dev/null +++ b/_code-samples/multisigning/go/rpc/main.go @@ -0,0 +1,166 @@ +package main + +import ( + "encoding/hex" + "fmt" + "maps" + "strings" + + "github.com/Peersyst/xrpl-go/xrpl" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/ledger-entry-types" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" +) + +func main() { + cfg, err := rpc.NewClientConfig( + "https://s.altnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + client := rpc.NewClient(cfg) + + w1, err := wallet.FromSeed("sEdTtvLmJmrb7GaivhWoXRkvU4NDjVf", "") + if err != nil { + fmt.Println(err) + return + } + + w2, err := wallet.FromSeed("sEdSFiKMQp7RvYLgH7t7FEpwNRWv2Gr", "") + if err != nil { + fmt.Println(err) + return + } + + master, err := wallet.FromSeed("sEdTMm2yv8c8Rg8YHFHQA9TxVMFy1ze", "") + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Funding wallets...") + + if err := client.FundWallet(&w1); err != nil { + fmt.Println(err) + return + } + fmt.Println("💸 Wallet 1 funded") + + if err := client.FundWallet(&w2); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet 2 funded") + + if err := client.FundWallet(&master); err != nil { + fmt.Println(err) + return + } + fmt.Println("💸 Master wallet funded") + fmt.Println() + fmt.Println("⏳ Setting up signer list...") + + ss := &transaction.SignerListSet{ + BaseTx: transaction.BaseTx{ + Account: master.GetAddress(), + }, + SignerQuorum: uint32(2), + SignerEntries: []ledger.SignerEntryWrapper{ + { + SignerEntry: ledger.SignerEntry{ + Account: w1.GetAddress(), + SignerWeight: 1, + }, + }, + { + SignerEntry: ledger.SignerEntry{ + Account: w2.GetAddress(), + SignerWeight: 1, + }, + }, + { + SignerEntry: ledger.SignerEntry{ + Account: "XVYRdEocC28DRx94ZFGP3qNJ1D5Ln7ecXFMd3vREB5Pesju", + SignerWeight: 1, + }, + }, + }, + } + + flatSs := ss.Flatten() + + if err := client.Autofill(&flatSs); err != nil { + fmt.Println(err) + return + } + + blob, _, err := master.Sign(flatSs) + if err != nil { + fmt.Println(err) + return + } + + res, err := client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ SignerListSet transaction submitted!") + fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Println() + + fmt.Println("⏳ Setting up AccountSet multisign transaction...") + + as := &transaction.AccountSet{ + BaseTx: transaction.BaseTx{ + Account: master.GetAddress(), + }, + Domain: types.Domain(strings.ToUpper(hex.EncodeToString([]byte("example.com")))), + } + + flatAs := as.Flatten() + + if err := client.AutofillMultisigned(&flatAs, 2); err != nil { + fmt.Println(err) + return + } + + w1As := maps.Clone(flatAs) + + blob1, _, err := w1.Multisign(w1As) + if err != nil { + fmt.Println(err) + return + } + + w2As := maps.Clone(flatAs) + + blob2, _, err := w2.Multisign(w2As) + if err != nil { + fmt.Println(err) + return + } + + blob, err = xrpl.Multisign(blob1, blob2) + if err != nil { + fmt.Println(err) + return + } + + mRes, err := client.SubmitMultisigned(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Multisigned transaction submitted!") + fmt.Printf("🌐 Result: %s\n", mRes.EngineResult) +} diff --git a/_code-samples/multisigning/go/ws/main.go b/_code-samples/multisigning/go/ws/main.go new file mode 100644 index 00000000000..88abba06a3f --- /dev/null +++ b/_code-samples/multisigning/go/ws/main.go @@ -0,0 +1,181 @@ +package main + +import ( + "encoding/hex" + "fmt" + "maps" + "strings" + + "github.com/Peersyst/xrpl-go/xrpl" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/ledger-entry-types" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" +) + +func main() { + fmt.Println("⏳ Connecting to testnet...") + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + defer client.Disconnect() + + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + if !client.IsConnected() { + fmt.Println("❌ Failed to connect to testnet") + return + } + + fmt.Println("✅ Connected to testnet") + fmt.Println() + + w1, err := wallet.FromSeed("sEdTtvLmJmrb7GaivhWoXRkvU4NDjVf", "") + if err != nil { + fmt.Println(err) + return + } + + w2, err := wallet.FromSeed("sEdSFiKMQp7RvYLgH7t7FEpwNRWv2Gr", "") + if err != nil { + fmt.Println(err) + return + } + + master, err := wallet.FromSeed("sEdTMm2yv8c8Rg8YHFHQA9TxVMFy1ze", "") + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Funding wallets...") + + if err := client.FundWallet(&w1); err != nil { + fmt.Println(err) + return + } + fmt.Println("💸 Wallet 1 funded") + + if err := client.FundWallet(&w2); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet 2 funded") + + if err := client.FundWallet(&master); err != nil { + fmt.Println(err) + return + } + fmt.Println("💸 Master wallet funded") + fmt.Println() + fmt.Println("⏳ Setting up signer list...") + + ss := &transaction.SignerListSet{ + BaseTx: transaction.BaseTx{ + Account: master.GetAddress(), + }, + SignerQuorum: uint32(2), + SignerEntries: []ledger.SignerEntryWrapper{ + { + SignerEntry: ledger.SignerEntry{ + Account: w1.GetAddress(), + SignerWeight: 1, + }, + }, + { + SignerEntry: ledger.SignerEntry{ + Account: w2.GetAddress(), + SignerWeight: 1, + }, + }, + { + SignerEntry: ledger.SignerEntry{ + Account: "XVYRdEocC28DRx94ZFGP3qNJ1D5Ln7ecXFMd3vREB5Pesju", + SignerWeight: 1, + }, + }, + }, + } + + fmt.Println("⏳ Flattening transaction...") + flatSs := ss.Flatten() + + fmt.Println("⏳ Autofilling transaction...") + if err := client.Autofill(&flatSs); err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Signing transaction...") + blob, _, err := master.Sign(flatSs) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Submitting transaction...") + res, err := client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ SignerListSet transaction submitted!") + fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Println() + + fmt.Println("⏳ Setting up AccountSet multisign transaction...") + + as := &transaction.AccountSet{ + BaseTx: transaction.BaseTx{ + Account: master.GetAddress(), + }, + Domain: types.Domain(strings.ToUpper(hex.EncodeToString([]byte("example.com")))), + } + + flatAs := as.Flatten() + + if err := client.AutofillMultisigned(&flatAs, 2); err != nil { + fmt.Println(err) + return + } + + w1As := maps.Clone(flatAs) + + blob1, _, err := w1.Multisign(w1As) + if err != nil { + fmt.Println(err) + return + } + + w2As := maps.Clone(flatAs) + + blob2, _, err := w2.Multisign(w2As) + if err != nil { + fmt.Println(err) + return + } + + blob, err = xrpl.Multisign(blob1, blob2) + if err != nil { + fmt.Println(err) + return + } + + mRes, err := client.SubmitMultisigned(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Multisigned transaction submitted!") + fmt.Printf("🌐 Result: %s\n", mRes.EngineResult) +} diff --git a/_code-samples/non-fungible-token/go/go.mod b/_code-samples/non-fungible-token/go/go.mod new file mode 100644 index 00000000000..fa9fde5d08c --- /dev/null +++ b/_code-samples/non-fungible-token/go/go.mod @@ -0,0 +1,24 @@ +module github.com/XRPLF + +go 1.23.0 + +toolchain go1.23.10 + +require github.com/Peersyst/xrpl-go v0.1.11 + +require ( + github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect + github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect + github.com/decred/dcrd/crypto/ripemd160 v1.0.2 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/tyler-smith/go-bip32 v1.0.0 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + golang.org/x/crypto v0.23.0 // indirect +) diff --git a/_code-samples/non-fungible-token/go/go.sum b/_code-samples/non-fungible-token/go/go.sum new file mode 100644 index 00000000000..8d8522a619c --- /dev/null +++ b/_code-samples/non-fungible-token/go/go.sum @@ -0,0 +1,58 @@ +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc= +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= +github.com/Peersyst/xrpl-go v0.1.11 h1:P6r/gHxRnbAtAdPmzNHz/7zpsdfvwh0SS+QI2JNT44w= +github.com/Peersyst/xrpl-go v0.1.11/go.mod h1:CBRM3/soqNeeL2Jx6USVUtECqulZVUoq3UxZKMz9hdw= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2 h1:TvGTmUBHDU75OHro9ojPLK+Yv7gDl2hnUvRocRCjsys= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2/go.mod h1:uGfjDyePSpa75cSQLzNdVmWlbQMBuiJkvXw/MNKRY4M= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.1.5-0.20170601210322-f6abca593680/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/tyler-smith/go-bip32 v1.0.0 h1:sDR9juArbUgX+bO/iblgZnMPeWY1KZMUC2AFUJdv5KE= +github.com/tyler-smith/go-bip32 v1.0.0/go.mod h1:onot+eHknzV4BVPwrzqY5OoVpyCvnwD7lMawL5aQupE= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= diff --git a/_code-samples/non-fungible-token/go/nft-accept/rpc/main.go b/_code-samples/non-fungible-token/go/nft-accept/rpc/main.go new file mode 100644 index 00000000000..72bbe964c78 --- /dev/null +++ b/_code-samples/non-fungible-token/go/nft-accept/rpc/main.go @@ -0,0 +1,128 @@ +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/rpc/types" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" +) + +func main() { + // Initialize the RPC client configuration + cfg, err := rpc.NewClientConfig( + "https://s.devnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + // Create the RPC client + client := rpc.NewClient(cfg) + + // Step 1: Fund wallets + fmt.Println("⏳ Funding wallets...") + + // Create and fund the NFT minter wallet + nftMinter, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println("❌ Error creating NFT minter wallet:", err) + return + } + if err := client.FundWallet(&nftMinter); err != nil { + fmt.Println("❌ Error funding NFT minter wallet:", err) + return + } + fmt.Println("💸 NFT minter wallet funded!") + + // Create and fund the NFT buyer wallet + nftBuyer, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println("❌ Error creating NFT buyer wallet:", err) + return + } + if err := client.FundWallet(&nftBuyer); err != nil { + fmt.Println("❌ Error funding NFT buyer wallet:", err) + return + } + fmt.Println("💸 NFT buyer wallet funded!") + fmt.Println() + + // Step 2: Mint an NFT + fmt.Println("⏳ Minting NFT...") + + nftMint := transaction.NFTokenMint{ + BaseTx: transaction.BaseTx{ + Account: nftMinter.ClassicAddress, + TransactionType: transaction.NFTokenMintTx, + }, + Destination: nftBuyer.ClassicAddress, + Amount: txnTypes.XRPCurrencyAmount(1000000), // 1 XRP + NFTokenTaxon: 0, + URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com + } + nftMint.SetTransferableFlag() + + responseMint, err := client.SubmitTxAndWait(nftMint.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftMinter, + }) + if err != nil { + fmt.Println("❌ Error minting NFT:", err) + return + } + if !responseMint.Validated { + fmt.Println("❌ NFTokenMint txn is not in a validated ledger", responseMint) + return + } + fmt.Println("✅ NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println() + + // Step 3: Retrieve the NFT token offer ID + fmt.Println("⏳ Retrieving NFT offer ID...") + + metaMap, ok := responseMint.Meta.(map[string]any) + if !ok { + fmt.Println("❌ Meta is not a map[string]any") + return + } + + offerID, ok := metaMap["offer_id"].(string) + if !ok { + fmt.Println("❌ offer_id not found or not a string") + return + } + + fmt.Println("🌎 offer_id:", offerID) + fmt.Println() + + // Step 4: Accept the NFT offer + fmt.Println("⏳ Accepting NFT offer...") + + nftAccept := transaction.NFTokenAcceptOffer{ + BaseTx: transaction.BaseTx{ + Account: nftBuyer.ClassicAddress, + TransactionType: transaction.NFTokenAcceptOfferTx, + }, + NFTokenSellOffer: txnTypes.Hash256(offerID), + } + + response, err := client.SubmitTxAndWait(nftAccept.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftBuyer, + }) + if err != nil { + fmt.Println("❌ Error accepting NFT offer:", err) + return + } + if !response.Validated { + fmt.Println("❌ NFTokenAcceptOffer txn is not in a validated ledger", response) + return + } + fmt.Println("✅ NFT offer accepted successfully! - 🌎 Hash: ", response.Hash) +} diff --git a/_code-samples/non-fungible-token/go/nft-accept/ws/main.go b/_code-samples/non-fungible-token/go/nft-accept/ws/main.go new file mode 100644 index 00000000000..d25ac1e4d07 --- /dev/null +++ b/_code-samples/non-fungible-token/go/nft-accept/ws/main.go @@ -0,0 +1,133 @@ +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" + "github.com/Peersyst/xrpl-go/xrpl/websocket/types" +) + +func main() { + // Connect to the XRPL devnet + fmt.Println("⏳ Connecting to devnet...") + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.devnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) + defer client.Disconnect() + + if err := client.Connect(); err != nil { + fmt.Println("❌ Error connecting to devnet:", err) + return + } + + if !client.IsConnected() { + fmt.Println("❌ Failed to connect to devnet") + return + } + fmt.Println("✅ Connected to devnet") + fmt.Println() + + // Fund wallets + fmt.Println("⏳ Funding wallets...") + + // Create and fund the NFT minter wallet + nftMinter, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println("❌ Error creating NFT minter wallet:", err) + return + } + if err := client.FundWallet(&nftMinter); err != nil { + fmt.Println("❌ Error funding NFT minter wallet:", err) + return + } + fmt.Println("💸 NFT minter wallet funded!") + + // Create and fund the NFT buyer wallet + nftBuyer, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println("❌ Error creating NFT buyer wallet:", err) + return + } + if err := client.FundWallet(&nftBuyer); err != nil { + fmt.Println("❌ Error funding NFT buyer wallet:", err) + return + } + fmt.Println("💸 NFT buyer wallet funded!") + fmt.Println() + + // Mint an NFT + fmt.Println("⏳ Minting NFT...") + nftMint := transaction.NFTokenMint{ + BaseTx: transaction.BaseTx{ + Account: nftMinter.ClassicAddress, + TransactionType: transaction.NFTokenMintTx, + }, + Destination: nftBuyer.ClassicAddress, + Amount: txnTypes.XRPCurrencyAmount(1000000), // 1 XRP + NFTokenTaxon: 0, + URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com + } + nftMint.SetTransferableFlag() + + responseMint, err := client.SubmitTxAndWait(nftMint.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftMinter, + }) + if err != nil { + fmt.Println("❌ Error minting NFT:", err) + return + } + if !responseMint.Validated { + fmt.Println("❌ NFTokenMint transaction is not in a validated ledger:", responseMint) + return + } + fmt.Println("✅ NFT minted successfully! - 🌎 Hash:", responseMint.Hash) + fmt.Println() + + // Extract the NFT token offer ID from the transaction metadata + fmt.Println("⏳ Extracting offer ID...") + metaMap, ok := responseMint.Meta.(map[string]any) + if !ok { + fmt.Println("❌ Meta is not a map[string]any") + return + } + + offerID, ok := metaMap["offer_id"].(string) + if !ok { + fmt.Println("❌ offer_id not found or not a string") + return + } + fmt.Println("🌎 offer_id:", offerID) + fmt.Println() + + // Accept the NFT offer + fmt.Println("⏳ Accepting NFT offer...") + nftAccept := transaction.NFTokenAcceptOffer{ + BaseTx: transaction.BaseTx{ + Account: nftBuyer.ClassicAddress, + TransactionType: transaction.NFTokenAcceptOfferTx, + }, + NFTokenSellOffer: txnTypes.Hash256(offerID), + } + + response, err := client.SubmitTxAndWait(nftAccept.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftBuyer, + }) + if err != nil { + fmt.Println("❌ Error accepting NFT offer:", err) + return + } + if !response.Validated { + fmt.Println("❌ NFTokenAcceptOffer transaction is not in a validated ledger:", response) + return + } + fmt.Println("✅ NFT offer accepted successfully! - 🌎 Hash:", response.Hash) +} diff --git a/_code-samples/non-fungible-token/go/nft-burn/rpc/main.go b/_code-samples/non-fungible-token/go/nft-burn/rpc/main.go new file mode 100644 index 00000000000..317fe6be7e4 --- /dev/null +++ b/_code-samples/non-fungible-token/go/nft-burn/rpc/main.go @@ -0,0 +1,114 @@ +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/rpc/types" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" +) + +func main() { + // Initialize the RPC client configuration + cfg, err := rpc.NewClientConfig( + "https://s.devnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + // Create the RPC client + client := rpc.NewClient(cfg) + + // Step 1: Fund wallets + fmt.Println("⏳ Funding wallets...") + + // Create and fund the NFT minter wallet + nftMinter, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println("❌ Error creating NFT minter wallet:", err) + return + } + if err := client.FundWallet(&nftMinter); err != nil { + fmt.Println("❌ Error funding NFT minter wallet:", err) + return + } + fmt.Println("💸 NFT minter wallet funded!") + fmt.Println() + + // Step 2: Mint an NFT + fmt.Println("⏳ Minting NFT...") + + nftMint := transaction.NFTokenMint{ + BaseTx: transaction.BaseTx{ + Account: nftMinter.ClassicAddress, + TransactionType: transaction.NFTokenMintTx, + }, + NFTokenTaxon: 0, + URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com + } + nftMint.SetTransferableFlag() + + responseMint, err := client.SubmitTxAndWait(nftMint.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftMinter, + }) + if err != nil { + fmt.Println("❌ Error minting NFT:", err) + return + } + if !responseMint.Validated { + fmt.Println("❌ NFTokenMint txn is not in a validated ledger", responseMint) + return + } + fmt.Println("✅ NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println() + + // Step 3: Retrieve the token ID + fmt.Println("⏳ Retrieving NFT ID...") + + metaMap, ok := responseMint.Meta.(map[string]any) + if !ok { + fmt.Println("❌ Meta is not a map[string]any") + return + } + + nftokenID, ok := metaMap["nftoken_id"].(string) + if !ok { + fmt.Println("❌ nftoken_id not found or not a string") + return + } + + fmt.Println("🌎 nftoken_id:", nftokenID) + fmt.Println() + + // Step 4: Burn the NFT + fmt.Println("⏳ Burn the NFT...") + + nftBurn := transaction.NFTokenBurn{ + BaseTx: transaction.BaseTx{ + Account: nftMinter.ClassicAddress, + TransactionType: transaction.NFTokenAcceptOfferTx, + }, + NFTokenID: txnTypes.NFTokenID(nftokenID), + } + + responseBurn, err := client.SubmitTxAndWait(nftBurn.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftMinter, + }) + if err != nil { + fmt.Println("❌ Error burning NFT:", err) + return + } + if !responseBurn.Validated { + fmt.Println("❌ NFTokenBurn transactiob is not in a validated ledger", responseBurn) + return + } + fmt.Println("✅ NFT burned successfully! - 🌎 Hash: ", responseBurn.Hash) +} diff --git a/_code-samples/non-fungible-token/go/nft-burn/ws/main.go b/_code-samples/non-fungible-token/go/nft-burn/ws/main.go new file mode 100644 index 00000000000..f8a834a563b --- /dev/null +++ b/_code-samples/non-fungible-token/go/nft-burn/ws/main.go @@ -0,0 +1,123 @@ +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" + "github.com/Peersyst/xrpl-go/xrpl/websocket/types" +) + +func main() { + // Connect to the XRPL devnet + fmt.Println("⏳ Connecting to devnet...") + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.devnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) + defer client.Disconnect() + + if err := client.Connect(); err != nil { + fmt.Println("❌ Error connecting to devnet:", err) + return + } + + if !client.IsConnected() { + fmt.Println("❌ Failed to connect to devnet") + return + } + fmt.Println("✅ Connected to devnet") + fmt.Println() + + // Step 1: Fund wallets + fmt.Println("⏳ Funding wallets...") + + // Create and fund the NFT minter wallet + nftMinter, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println("❌ Error creating NFT minter wallet:", err) + return + } + if err := client.FundWallet(&nftMinter); err != nil { + fmt.Println("❌ Error funding NFT minter wallet:", err) + return + } + fmt.Println("💸 NFT minter wallet funded!") + fmt.Println() + + // Step 2: Mint an NFT + fmt.Println("⏳ Minting NFT...") + + nftMint := transaction.NFTokenMint{ + BaseTx: transaction.BaseTx{ + Account: nftMinter.ClassicAddress, + TransactionType: transaction.NFTokenMintTx, + }, + NFTokenTaxon: 0, + URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com + } + nftMint.SetTransferableFlag() + + responseMint, err := client.SubmitTxAndWait(nftMint.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftMinter, + }) + if err != nil { + fmt.Println("❌ Error minting NFT:", err) + return + } + if !responseMint.Validated { + fmt.Println("❌ NFTokenMint txn is not in a validated ledger", responseMint) + return + } + fmt.Println("✅ NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println() + + // Step 3: Retrieve the token ID + fmt.Println("⏳ Retrieving NFT ID...") + + metaMap, ok := responseMint.Meta.(map[string]any) + if !ok { + fmt.Println("❌ Meta is not a map[string]any") + return + } + + nftokenID, ok := metaMap["nftoken_id"].(string) + if !ok { + fmt.Println("❌ nftoken_id not found or not a string") + return + } + + fmt.Println("🌎 nftoken_id:", nftokenID) + fmt.Println() + + // Step 4: Burn the NFT + fmt.Println("⏳ Burn the NFT...") + + nftBurn := transaction.NFTokenBurn{ + BaseTx: transaction.BaseTx{ + Account: nftMinter.ClassicAddress, + TransactionType: transaction.NFTokenAcceptOfferTx, + }, + NFTokenID: txnTypes.NFTokenID(nftokenID), + } + + responseBurn, err := client.SubmitTxAndWait(nftBurn.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftMinter, + }) + if err != nil { + fmt.Println("❌ Error burning NFT:", err) + return + } + if !responseBurn.Validated { + fmt.Println("❌ NFTokenBurn transactiob is not in a validated ledger", responseBurn) + return + } + fmt.Println("✅ NFT burned successfully! - 🌎 Hash: ", responseBurn.Hash) +} diff --git a/_code-samples/non-fungible-token/go/nft-cancel/rpc/main.go b/_code-samples/non-fungible-token/go/nft-cancel/rpc/main.go new file mode 100644 index 00000000000..5d0b59dbbec --- /dev/null +++ b/_code-samples/non-fungible-token/go/nft-cancel/rpc/main.go @@ -0,0 +1,163 @@ +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/rpc/types" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" +) + +func main() { + // Initialize the RPC client configuration + cfg, err := rpc.NewClientConfig( + "https://s.devnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + // Create the RPC client + client := rpc.NewClient(cfg) + + // Step 1: Fund wallet + fmt.Println("⏳ Funding wallet...") + + // Create and fund the NFT minter wallet + nftMinter, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println("❌ Error creating NFT minter wallet:", err) + return + } + if err := client.FundWallet(&nftMinter); err != nil { + fmt.Println("❌ Error funding NFT minter wallet:", err) + return + } + fmt.Println("💸 NFT minter wallet funded!") + + // Step 2: Mint two NFTs + fmt.Println("⏳ Minting first NFT...") + + nftMint := transaction.NFTokenMint{ + BaseTx: transaction.BaseTx{ + Account: nftMinter.ClassicAddress, + TransactionType: transaction.NFTokenMintTx, + }, + NFTokenTaxon: 0, + URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com + } + nftMint.SetTransferableFlag() + + responseMint, err := client.SubmitTxAndWait(nftMint.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftMinter, + }) + if err != nil { + fmt.Println("❌ Error minting first NFT:", err) + return + } + if !responseMint.Validated { + fmt.Println("❌ First NFTokenMint transaction is not in a validated ledger", responseMint) + return + } + fmt.Println("✅ First NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println() + + // Step 3: Retrieve the NFT token ID + fmt.Println("⏳ Retrieving NFT ID...") + + metaMap, ok := responseMint.Meta.(map[string]any) + if !ok { + fmt.Println("❌ Meta is not a map[string]any") + return + } + + nftokenID1, ok := metaMap["nftoken_id"].(string) + if !ok { + fmt.Println("❌ nftoken_id not found or not a string") + return + } + + fmt.Println("🌎 nftoken_id:", nftokenID1) + fmt.Println() + + // ------ + + fmt.Println("⏳ Minting second NFT...") + + nftMint2 := transaction.NFTokenMint{ + BaseTx: transaction.BaseTx{ + Account: nftMinter.ClassicAddress, + TransactionType: transaction.NFTokenMintTx, + }, + NFTokenTaxon: 0, + URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com + } + nftMint2.SetTransferableFlag() + + responseMint2, err := client.SubmitTxAndWait(nftMint2.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftMinter, + }) + if err != nil { + fmt.Println("❌ Error minting second NFT:", err) + return + } + if !responseMint.Validated { + fmt.Println("❌ Second NFTokenMint transaction is not in a validated ledger", responseMint) + return + } + fmt.Println("✅ Second NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println() + + // Step 3: Retrieve the second NFT token ID + fmt.Println("⏳ Retrieving second NFT ID...") + + metaMap2, ok := responseMint2.Meta.(map[string]any) + if !ok { + fmt.Println("❌ Meta is not a map[string]any") + return + } + + nftokenID2, ok := metaMap2["nftoken_id"].(string) + if !ok { + fmt.Println("❌ nftoken_id not found or not a string") + return + } + + fmt.Println("🌎 nftoken_id:", nftokenID2) + fmt.Println() + + // Step 4: Cancel the NFT offers + fmt.Println("⏳ Canceling NFT offers...") + + nftCancel := transaction.NFTokenCancelOffer{ + BaseTx: transaction.BaseTx{ + Account: nftMinter.ClassicAddress, + TransactionType: transaction.NFTokenAcceptOfferTx, + }, + NFTokenOffers: []txnTypes.NFTokenID{ + txnTypes.NFTokenID(nftokenID1), + txnTypes.NFTokenID(nftokenID2), + }, + } + + response, err := client.SubmitTxAndWait(nftCancel.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftMinter, + }) + if err != nil { + fmt.Println("❌ Error canceling NFT offers:", err) + return + } + if !response.Validated { + fmt.Println("❌ NFTokenCancelOffer transaction is not in a validated ledger", response) + return + } + fmt.Println("✅ NFT offers canceled successfully! - 🌎 Hash: ", response.Hash) +} diff --git a/_code-samples/non-fungible-token/go/nft-cancel/ws/main.go b/_code-samples/non-fungible-token/go/nft-cancel/ws/main.go new file mode 100644 index 00000000000..be2fd945791 --- /dev/null +++ b/_code-samples/non-fungible-token/go/nft-cancel/ws/main.go @@ -0,0 +1,172 @@ +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" + "github.com/Peersyst/xrpl-go/xrpl/websocket/types" +) + +func main() { + // Connect to the XRPL devnet + fmt.Println("⏳ Connecting to devnet...") + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.devnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) + defer client.Disconnect() + + if err := client.Connect(); err != nil { + fmt.Println("❌ Error connecting to devnet:", err) + return + } + + if !client.IsConnected() { + fmt.Println("❌ Failed to connect to devnet") + return + } + fmt.Println("✅ Connected to devnet") + fmt.Println() + + // Step 1: Fund wallet + fmt.Println("⏳ Funding wallet...") + + // Create and fund the NFT minter wallet + nftMinter, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println("❌ Error creating NFT minter wallet:", err) + return + } + if err := client.FundWallet(&nftMinter); err != nil { + fmt.Println("❌ Error funding NFT minter wallet:", err) + return + } + fmt.Println("💸 NFT minter wallet funded!") + + // Step 2: Mint two NFTs + fmt.Println("⏳ Minting first NFT...") + + nftMint := transaction.NFTokenMint{ + BaseTx: transaction.BaseTx{ + Account: nftMinter.ClassicAddress, + TransactionType: transaction.NFTokenMintTx, + }, + NFTokenTaxon: 0, + URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com + } + nftMint.SetTransferableFlag() + + responseMint, err := client.SubmitTxAndWait(nftMint.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftMinter, + }) + if err != nil { + fmt.Println("❌ Error minting first NFT:", err) + return + } + if !responseMint.Validated { + fmt.Println("❌ First NFTokenMint transaction is not in a validated ledger", responseMint) + return + } + fmt.Println("✅ First NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println() + + // Step 3: Retrieve the NFT token ID + fmt.Println("⏳ Retrieving NFT ID...") + + metaMap, ok := responseMint.Meta.(map[string]any) + if !ok { + fmt.Println("❌ Meta is not a map[string]any") + return + } + + nftokenID1, ok := metaMap["nftoken_id"].(string) + if !ok { + fmt.Println("❌ nftoken_id not found or not a string") + return + } + + fmt.Println("🌎 nftoken_id:", nftokenID1) + fmt.Println() + + // ------ + + fmt.Println("⏳ Minting second NFT...") + + nftMint2 := transaction.NFTokenMint{ + BaseTx: transaction.BaseTx{ + Account: nftMinter.ClassicAddress, + TransactionType: transaction.NFTokenMintTx, + }, + NFTokenTaxon: 0, + URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com + } + nftMint2.SetTransferableFlag() + + responseMint2, err := client.SubmitTxAndWait(nftMint2.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftMinter, + }) + if err != nil { + fmt.Println("❌ Error minting second NFT:", err) + return + } + if !responseMint.Validated { + fmt.Println("❌ Second NFTokenMint transaction is not in a validated ledger", responseMint) + return + } + fmt.Println("✅ Second NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println() + + // Step 3: Retrieve the second NFT token ID + fmt.Println("⏳ Retrieving second NFT ID...") + + metaMap2, ok := responseMint2.Meta.(map[string]any) + if !ok { + fmt.Println("❌ Meta is not a map[string]any") + return + } + + nftokenID2, ok := metaMap2["nftoken_id"].(string) + if !ok { + fmt.Println("❌ nftoken_id not found or not a string") + return + } + + fmt.Println("🌎 nftoken_id:", nftokenID2) + fmt.Println() + + // Step 4: Cancel the NFT offers + fmt.Println("⏳ Canceling NFT offers...") + + nftCancel := transaction.NFTokenCancelOffer{ + BaseTx: transaction.BaseTx{ + Account: nftMinter.ClassicAddress, + TransactionType: transaction.NFTokenAcceptOfferTx, + }, + NFTokenOffers: []txnTypes.NFTokenID{ + txnTypes.NFTokenID(nftokenID1), + txnTypes.NFTokenID(nftokenID2), + }, + } + + response, err := client.SubmitTxAndWait(nftCancel.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftMinter, + }) + if err != nil { + fmt.Println("❌ Error canceling NFT offers:", err) + return + } + if !response.Validated { + fmt.Println("❌ NFTokenCancelOffer transaction is not in a validated ledger", response) + return + } + fmt.Println("✅ NFT offers canceled successfully! - 🌎 Hash: ", response.Hash) +} diff --git a/_code-samples/non-fungible-token/go/nft-modify/rpc/main.go b/_code-samples/non-fungible-token/go/nft-modify/rpc/main.go new file mode 100644 index 00000000000..286fb147712 --- /dev/null +++ b/_code-samples/non-fungible-token/go/nft-modify/rpc/main.go @@ -0,0 +1,107 @@ +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/rpc/types" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" +) + +func main() { + cfg, err := rpc.NewClientConfig( + "https://s.devnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + client := rpc.NewClient(cfg) + fmt.Println() + + fmt.Println("⏳ Funding wallet...") + + // Create and fund the nft wallet + nftWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println("❌ Error creating nft wallet:", err) + return + } + if err := client.FundWallet(&nftWallet); err != nil { + fmt.Println("❌ Error funding nft wallet:", err) + return + } + fmt.Println("💸 NFT wallet funded! - #️⃣: ", nftWallet.ClassicAddress) + fmt.Println() + + // Mint NFT + nftMint := transaction.NFTokenMint{ + BaseTx: transaction.BaseTx{ + Account: nftWallet.ClassicAddress, + TransactionType: transaction.NFTokenMintTx, + }, + NFTokenTaxon: 0, + URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com + } + nftMint.SetMutableFlag() + nftMint.SetTransferableFlag() + + responseMint, err := client.SubmitTxAndWait(nftMint.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftWallet, + }) + if err != nil { + fmt.Println("❌ Error minting NFT:", err) + return + } + if !responseMint.Validated { + fmt.Println("❌ NFTokenMint txn is not in a validated ledger", responseMint) + return + } + fmt.Println("✅ NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println() + + metaMap, ok := responseMint.Meta.(map[string]any) + if !ok { + fmt.Println("❌ Meta is not a map[string]any") + return + } + + nftokenID, ok := metaMap["nftoken_id"].(string) + if !ok { + fmt.Println("❌ nftoken_id not found or not a string") + return + } + + fmt.Println("🌎 nftoken_id:", nftokenID) + fmt.Println() + + // Update NFT + nftModify := transaction.NFTokenModify{ + BaseTx: transaction.BaseTx{ + Account: nftWallet.ClassicAddress, + TransactionType: transaction.NFTokenModifyTx, + }, + URI: "68747470733A2F2F7961686F6F2E636F6D", // https://yahoo.com + NFTokenID: txnTypes.NFTokenID(nftokenID), + } + // nftoken_id + responseModify, err := client.SubmitTxAndWait(nftModify.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftWallet, + }) + if err != nil { + fmt.Println("❌ Error modifying NFT:", err) + return + } + if !responseModify.Validated { + fmt.Println("❌ NFTokenModify txn is not in a validated ledger", responseModify) + return + } + fmt.Println("✅ NFT URI modified successfully! - 🌎 Hash: ", responseModify.Hash) +} diff --git a/_code-samples/non-fungible-token/go/nft-modify/ws/main.go b/_code-samples/non-fungible-token/go/nft-modify/ws/main.go new file mode 100644 index 00000000000..77d28416d4f --- /dev/null +++ b/_code-samples/non-fungible-token/go/nft-modify/ws/main.go @@ -0,0 +1,117 @@ +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" + "github.com/Peersyst/xrpl-go/xrpl/websocket/types" +) + +func main() { + fmt.Println("⏳ Connecting to devnet...") + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.devnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) + + defer client.Disconnect() + + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + if !client.IsConnected() { + fmt.Println("❌ Failed to connect to devnet") + return + } + + fmt.Println("✅ Connected to devnet") + fmt.Println() + + // Create and fund the nft wallet + fmt.Println("⏳ Funding wallet...") + nftWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println("❌ Error creating nft wallet:", err) + return + } + if err := client.FundWallet(&nftWallet); err != nil { + fmt.Println("❌ Error funding nft wallet:", err) + return + } + fmt.Println("💸 NFT wallet funded!") + fmt.Println() + + // Mint NFT + nftMint := transaction.NFTokenMint{ + BaseTx: transaction.BaseTx{ + Account: nftWallet.ClassicAddress, + TransactionType: transaction.NFTokenMintTx, + }, + NFTokenTaxon: 0, + URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com + } + nftMint.SetMutableFlag() + nftMint.SetTransferableFlag() + + responseMint, err := client.SubmitTxAndWait(nftMint.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftWallet, + }) + if err != nil { + fmt.Println("❌ Error minting NFT:", err) + return + } + if !responseMint.Validated { + fmt.Println("❌ NFTokenMint txn is not in a validated ledger", responseMint) + return + } + fmt.Println("✅ NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println() + + metaMap, ok := responseMint.Meta.(map[string]any) + if !ok { + fmt.Println("❌ Meta is not a map[string]any") + return + } + + nftokenID, ok := metaMap["nftoken_id"].(string) + if !ok { + fmt.Println("❌ nftoken_id not found or not a string") + return + } + + fmt.Println("🌎 nftoken_id:", nftokenID) + fmt.Println() + + // Update NFT + nftModify := transaction.NFTokenModify{ + BaseTx: transaction.BaseTx{ + Account: nftWallet.ClassicAddress, + TransactionType: transaction.NFTokenModifyTx, + }, + URI: "68747470733A2F2F7961686F6F2E636F6D", // https://yahoo.com + NFTokenID: txnTypes.NFTokenID(nftokenID), + } + + responseModify, err := client.SubmitTxAndWait(nftModify.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftWallet, + }) + if err != nil { + fmt.Println("❌ Error modifying NFT:", err) + return + } + if !responseModify.Validated { + fmt.Println("❌ NFTokenModify txn is not in a validated ledger", responseModify) + return + } + fmt.Println("✅ NFT URI modified successfully! - 🌎 Hash: ", responseModify.Hash) +} diff --git a/_code-samples/partial-payment/go/go.mod b/_code-samples/partial-payment/go/go.mod new file mode 100644 index 00000000000..fa9fde5d08c --- /dev/null +++ b/_code-samples/partial-payment/go/go.mod @@ -0,0 +1,24 @@ +module github.com/XRPLF + +go 1.23.0 + +toolchain go1.23.10 + +require github.com/Peersyst/xrpl-go v0.1.11 + +require ( + github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect + github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect + github.com/decred/dcrd/crypto/ripemd160 v1.0.2 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/tyler-smith/go-bip32 v1.0.0 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + golang.org/x/crypto v0.23.0 // indirect +) diff --git a/_code-samples/partial-payment/go/go.sum b/_code-samples/partial-payment/go/go.sum new file mode 100644 index 00000000000..8d8522a619c --- /dev/null +++ b/_code-samples/partial-payment/go/go.sum @@ -0,0 +1,58 @@ +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc= +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= +github.com/Peersyst/xrpl-go v0.1.11 h1:P6r/gHxRnbAtAdPmzNHz/7zpsdfvwh0SS+QI2JNT44w= +github.com/Peersyst/xrpl-go v0.1.11/go.mod h1:CBRM3/soqNeeL2Jx6USVUtECqulZVUoq3UxZKMz9hdw= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2 h1:TvGTmUBHDU75OHro9ojPLK+Yv7gDl2hnUvRocRCjsys= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2/go.mod h1:uGfjDyePSpa75cSQLzNdVmWlbQMBuiJkvXw/MNKRY4M= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.1.5-0.20170601210322-f6abca593680/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/tyler-smith/go-bip32 v1.0.0 h1:sDR9juArbUgX+bO/iblgZnMPeWY1KZMUC2AFUJdv5KE= +github.com/tyler-smith/go-bip32 v1.0.0/go.mod h1:onot+eHknzV4BVPwrzqY5OoVpyCvnwD7lMawL5aQupE= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= diff --git a/_code-samples/partial-payment/go/rpc/main.go b/_code-samples/partial-payment/go/rpc/main.go new file mode 100644 index 00000000000..73751ffcb76 --- /dev/null +++ b/_code-samples/partial-payment/go/rpc/main.go @@ -0,0 +1,168 @@ +package main + +import ( + "fmt" + "time" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" +) + +func main() { + cfg, err := rpc.NewClientConfig( + "https://s.altnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + client := rpc.NewClient(cfg) + + fmt.Println("⏳ Funding wallets...") + w1, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + w2, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + if err := client.FundWallet(&w1); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet 1 funded") + if err := client.FundWallet(&w2); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet 2 funded") + fmt.Println() + + time.Sleep(5 * time.Second) + + fmt.Println("⏳ Sending TrustSet transaction...") + ts := &transaction.TrustSet{ + BaseTx: transaction.BaseTx{ + Account: w2.ClassicAddress, + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: "FOO", + Issuer: w1.ClassicAddress, + Value: "10000000000", + }, + } + + flatTs := ts.Flatten() + + err = client.Autofill(&flatTs) + if err != nil { + fmt.Println(err) + return + } + + blob, _, err := w2.Sign(flatTs) + if err != nil { + fmt.Println(err) + return + } + + res, err := client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ TrustSet transaction submitted!") + fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println() + + fmt.Println("⏳ Issuing tokens for wallet 2...") + p := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: w1.GetAddress(), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: "FOO", + Issuer: w1.GetAddress(), + Value: "50", + }, + Destination: w2.GetAddress(), + } + + flatP := p.Flatten() + + err = client.Autofill(&flatP) + if err != nil { + fmt.Println(err) + return + } + + blob, _, err = w1.Sign(flatP) + if err != nil { + fmt.Println(err) + return + } + + res, err = client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Payment transaction submitted!") + fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println() + + fmt.Println("⏳ Submitting Partial Payment transaction...") + pp := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: w2.GetAddress(), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: "FOO", + Issuer: w1.GetAddress(), + Value: "10", + }, + Destination: w1.GetAddress(), + } + + pp.SetPartialPaymentFlag() + + flatPP := pp.Flatten() + + err = client.Autofill(&flatPP) + if err != nil { + fmt.Println(err) + return + } + + blob, _, err = w2.Sign(flatPP) + if err != nil { + fmt.Println(err) + return + } + + res, err = client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Partial Payment transaction submitted!") + fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println() +} diff --git a/_code-samples/partial-payment/go/ws/main.go b/_code-samples/partial-payment/go/ws/main.go new file mode 100644 index 00000000000..af18ae9ac43 --- /dev/null +++ b/_code-samples/partial-payment/go/ws/main.go @@ -0,0 +1,179 @@ +package main + +import ( + "fmt" + "time" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" +) + +func main() { + fmt.Println("⏳ Connecting to testnet...") + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + defer client.Disconnect() + + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + if !client.IsConnected() { + fmt.Println("❌ Failed to connect to testnet") + return + } + + fmt.Println("✅ Connected to testnet") + fmt.Println() + + fmt.Println("⏳ Funding wallets...") + w1, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + w2, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + if err := client.FundWallet(&w1); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet 1 funded") + if err := client.FundWallet(&w2); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet 2 funded") + fmt.Println() + + time.Sleep(5 * time.Second) + + fmt.Println("⏳ Sending TrustSet transaction...") + ts := &transaction.TrustSet{ + BaseTx: transaction.BaseTx{ + Account: w2.ClassicAddress, + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: "FOO", + Issuer: w1.ClassicAddress, + Value: "10000000000", + }, + } + + flatTs := ts.Flatten() + + err = client.Autofill(&flatTs) + if err != nil { + fmt.Println(err) + return + } + + blob, _, err := w2.Sign(flatTs) + if err != nil { + fmt.Println(err) + return + } + + res, err := client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ TrustSet transaction submitted!") + fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println() + + fmt.Println("⏳ Issuing tokens for wallet 2...") + p := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: w1.GetAddress(), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: "FOO", + Issuer: w1.GetAddress(), + Value: "50", + }, + Destination: w2.GetAddress(), + } + + flatP := p.Flatten() + + err = client.Autofill(&flatP) + if err != nil { + fmt.Println(err) + return + } + + blob, _, err = w1.Sign(flatP) + if err != nil { + fmt.Println(err) + return + } + + res, err = client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Payment transaction submitted!") + fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println() + + fmt.Println("⏳ Submitting Partial Payment transaction...") + pp := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: w2.GetAddress(), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: "FOO", + Issuer: w1.GetAddress(), + Value: "10", + }, + Destination: w1.GetAddress(), + } + + pp.SetPartialPaymentFlag() + + flatPP := pp.Flatten() + + err = client.Autofill(&flatPP) + if err != nil { + fmt.Println(err) + return + } + + blob, _, err = w2.Sign(flatPP) + if err != nil { + fmt.Println(err) + return + } + + res, err = client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Partial Payment transaction submitted!") + fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println() +} diff --git a/_code-samples/paths/go/go.mod b/_code-samples/paths/go/go.mod new file mode 100644 index 00000000000..fa9fde5d08c --- /dev/null +++ b/_code-samples/paths/go/go.mod @@ -0,0 +1,24 @@ +module github.com/XRPLF + +go 1.23.0 + +toolchain go1.23.10 + +require github.com/Peersyst/xrpl-go v0.1.11 + +require ( + github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect + github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect + github.com/decred/dcrd/crypto/ripemd160 v1.0.2 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/tyler-smith/go-bip32 v1.0.0 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + golang.org/x/crypto v0.23.0 // indirect +) diff --git a/_code-samples/paths/go/go.sum b/_code-samples/paths/go/go.sum new file mode 100644 index 00000000000..8d8522a619c --- /dev/null +++ b/_code-samples/paths/go/go.sum @@ -0,0 +1,58 @@ +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc= +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= +github.com/Peersyst/xrpl-go v0.1.11 h1:P6r/gHxRnbAtAdPmzNHz/7zpsdfvwh0SS+QI2JNT44w= +github.com/Peersyst/xrpl-go v0.1.11/go.mod h1:CBRM3/soqNeeL2Jx6USVUtECqulZVUoq3UxZKMz9hdw= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2 h1:TvGTmUBHDU75OHro9ojPLK+Yv7gDl2hnUvRocRCjsys= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2/go.mod h1:uGfjDyePSpa75cSQLzNdVmWlbQMBuiJkvXw/MNKRY4M= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.1.5-0.20170601210322-f6abca593680/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/tyler-smith/go-bip32 v1.0.0 h1:sDR9juArbUgX+bO/iblgZnMPeWY1KZMUC2AFUJdv5KE= +github.com/tyler-smith/go-bip32 v1.0.0/go.mod h1:onot+eHknzV4BVPwrzqY5OoVpyCvnwD7lMawL5aQupE= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= diff --git a/_code-samples/paths/go/rpc/main.go b/_code-samples/paths/go/rpc/main.go new file mode 100644 index 00000000000..0e25d00dc22 --- /dev/null +++ b/_code-samples/paths/go/rpc/main.go @@ -0,0 +1,111 @@ +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/queries/path" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + + pathtypes "github.com/Peersyst/xrpl-go/xrpl/queries/path/types" +) + +const ( + DestinationAccount = types.Address("rKT4JX4cCof6LcDYRz8o3rGRu7qxzZ2Zwj") +) + +var ( + DestinationAmount = types.IssuedCurrencyAmount{ + Issuer: "rVnYNK9yuxBz4uP8zC8LEFokM2nqH3poc", + Currency: "USD", + Value: "0.001", + } +) + +func main() { + cfg, err := rpc.NewClientConfig( + "https://s.altnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + client := rpc.NewClient(cfg) + + wallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Funding wallet...") + if err := client.FundWallet(&wallet); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet funded") + fmt.Println() + + fmt.Println("⏳ Getting paths...") + res, err := client.GetRipplePathFind(&path.RipplePathFindRequest{ + SourceAccount: wallet.GetAddress(), + SourceCurrencies: []pathtypes.RipplePathFindCurrency{ + { + Currency: "XRP", + }, + }, + DestinationAccount: DestinationAccount, + DestinationAmount: DestinationAmount, + }) + if err != nil { + fmt.Println(err) + return + } + + fmt.Printf("🌐 Computed paths: %d\n", len(res.Alternatives)) + fmt.Println() + + if len(res.Alternatives) == 0 { + fmt.Println("❌ No alternatives found") + return + } + + fmt.Println("⏳ Submitting Payment through path: ", res.Alternatives[0].PathsComputed) + p := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: wallet.GetAddress(), + }, + Destination: DestinationAccount, + Amount: DestinationAmount, + Paths: res.Alternatives[0].PathsComputed, + } + + flatP := p.Flatten() + + if err := client.Autofill(&flatP); err != nil { + fmt.Println(err) + return + } + + blob, hash, err := wallet.Sign(flatP) + if err != nil { + fmt.Println(err) + return + } + + txRes, err := client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Payment submitted") + fmt.Printf("🌐 Hash: %s\n", hash) + fmt.Printf("🌐 Validated: %t\n", txRes.Validated) +} diff --git a/_code-samples/paths/go/ws/main.go b/_code-samples/paths/go/ws/main.go new file mode 100644 index 00000000000..284b7bed2d9 --- /dev/null +++ b/_code-samples/paths/go/ws/main.go @@ -0,0 +1,122 @@ +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/queries/path" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" + + pathtypes "github.com/Peersyst/xrpl-go/xrpl/queries/path/types" +) + +const ( + DestinationAccount = types.Address("rKT4JX4cCof6LcDYRz8o3rGRu7qxzZ2Zwj") +) + +var ( + DestinationAmount = types.IssuedCurrencyAmount{ + Issuer: "rVnYNK9yuxBz4uP8zC8LEFokM2nqH3poc", + Currency: "USD", + Value: "0.001", + } +) + +func main() { + fmt.Println("⏳ Connecting to testnet...") + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + defer client.Disconnect() + + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + if !client.IsConnected() { + fmt.Println("❌ Failed to connect to testnet") + return + } + + fmt.Println("✅ Connected to testnet") + fmt.Println() + + wallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Funding wallet...") + if err := client.FundWallet(&wallet); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet funded") + fmt.Println() + + fmt.Println("⏳ Getting paths...") + res, err := client.GetRipplePathFind(&path.RipplePathFindRequest{ + SourceAccount: wallet.GetAddress(), + SourceCurrencies: []pathtypes.RipplePathFindCurrency{ + { + Currency: "XRP", + }, + }, + DestinationAccount: DestinationAccount, + DestinationAmount: DestinationAmount, + }) + if err != nil { + fmt.Println(err) + return + } + + fmt.Printf("🌐 Computed paths: %d\n", len(res.Alternatives)) + fmt.Println() + + if len(res.Alternatives) == 0 { + fmt.Println("❌ No alternatives found") + return + } + + fmt.Println("⏳ Submitting Payment through path: ", res.Alternatives[0].PathsComputed) + p := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: wallet.GetAddress(), + }, + Destination: DestinationAccount, + Amount: DestinationAmount, + Paths: res.Alternatives[0].PathsComputed, + } + + flatP := p.Flatten() + + if err := client.Autofill(&flatP); err != nil { + fmt.Println(err) + return + } + + blob, hash, err := wallet.Sign(flatP) + if err != nil { + fmt.Println(err) + return + } + + txRes, err := client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Payment submitted") + fmt.Printf("🌐 Hash: %s\n", hash) + fmt.Printf("🌐 Validated: %t\n", txRes.Validated) +} diff --git a/_code-samples/send-xrp/go/go.mod b/_code-samples/send-xrp/go/go.mod new file mode 100644 index 00000000000..63f569b0cd7 --- /dev/null +++ b/_code-samples/send-xrp/go/go.mod @@ -0,0 +1,5 @@ +module github.com/XRPLF + +go 1.23 + +require github.com/Peersyst/xrpl-go v0.1.11 \ No newline at end of file diff --git a/_code-samples/send-xrp/go/rpc/main.go b/_code-samples/send-xrp/go/rpc/main.go new file mode 100644 index 00000000000..9ab1e3e8e78 --- /dev/null +++ b/_code-samples/send-xrp/go/rpc/main.go @@ -0,0 +1 @@ +package rpc diff --git a/_code-samples/send-xrp/go/ws/main.go b/_code-samples/send-xrp/go/ws/main.go new file mode 100644 index 00000000000..98592950df4 --- /dev/null +++ b/_code-samples/send-xrp/go/ws/main.go @@ -0,0 +1 @@ +package ws diff --git a/_code-samples/set-regular-key/go/go.mod b/_code-samples/set-regular-key/go/go.mod new file mode 100644 index 00000000000..fa9fde5d08c --- /dev/null +++ b/_code-samples/set-regular-key/go/go.mod @@ -0,0 +1,24 @@ +module github.com/XRPLF + +go 1.23.0 + +toolchain go1.23.10 + +require github.com/Peersyst/xrpl-go v0.1.11 + +require ( + github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect + github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect + github.com/decred/dcrd/crypto/ripemd160 v1.0.2 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/tyler-smith/go-bip32 v1.0.0 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + golang.org/x/crypto v0.23.0 // indirect +) diff --git a/_code-samples/set-regular-key/go/go.sum b/_code-samples/set-regular-key/go/go.sum new file mode 100644 index 00000000000..8d8522a619c --- /dev/null +++ b/_code-samples/set-regular-key/go/go.sum @@ -0,0 +1,58 @@ +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc= +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= +github.com/Peersyst/xrpl-go v0.1.11 h1:P6r/gHxRnbAtAdPmzNHz/7zpsdfvwh0SS+QI2JNT44w= +github.com/Peersyst/xrpl-go v0.1.11/go.mod h1:CBRM3/soqNeeL2Jx6USVUtECqulZVUoq3UxZKMz9hdw= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2 h1:TvGTmUBHDU75OHro9ojPLK+Yv7gDl2hnUvRocRCjsys= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2/go.mod h1:uGfjDyePSpa75cSQLzNdVmWlbQMBuiJkvXw/MNKRY4M= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.1.5-0.20170601210322-f6abca593680/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/tyler-smith/go-bip32 v1.0.0 h1:sDR9juArbUgX+bO/iblgZnMPeWY1KZMUC2AFUJdv5KE= +github.com/tyler-smith/go-bip32 v1.0.0/go.mod h1:onot+eHknzV4BVPwrzqY5OoVpyCvnwD7lMawL5aQupE= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= diff --git a/_code-samples/set-regular-key/go/rpc/main.go b/_code-samples/set-regular-key/go/rpc/main.go new file mode 100644 index 00000000000..dd58029a6a1 --- /dev/null +++ b/_code-samples/set-regular-key/go/rpc/main.go @@ -0,0 +1,131 @@ +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" +) + +func main() { + cfg, err := rpc.NewClientConfig( + "https://s.altnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + client := rpc.NewClient(cfg) + + w1, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + w2, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + regularKeyWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Funding wallets...") + if err := client.FundWallet(&w1); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet 1 funded") + + if err := client.FundWallet(&w2); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet 2 funded") + + if err := client.FundWallet(®ularKeyWallet); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Regular key wallet funded") + fmt.Println() + + fmt.Println("⏳ Setting regular key...") + rk := &transaction.SetRegularKey{ + BaseTx: transaction.BaseTx{ + Account: w1.GetAddress(), + }, + RegularKey: regularKeyWallet.GetAddress(), + } + + flatRk := rk.Flatten() + + err = client.Autofill(&flatRk) + if err != nil { + fmt.Println(err) + return + } + + blob, _, err := w1.Sign(flatRk) + if err != nil { + fmt.Println(err) + return + } + + res, err := client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ SetRegularKey transaction submitted") + fmt.Printf("🌐 Hash: %s\n", res.Hash) + fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println() + + fmt.Println("⏳ Checking if regular key is set...") + p := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: w1.GetAddress(), + }, + Destination: w2.GetAddress(), + Amount: types.XRPCurrencyAmount(10000), + } + + flatP := p.Flatten() + + err = client.Autofill(&flatP) + if err != nil { + fmt.Println(err) + return + } + + blob, _, err = regularKeyWallet.Sign(flatP) + if err != nil { + fmt.Println(err) + return + } + + res, err = client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Payment transaction submitted") + fmt.Printf("🌐 Hash: %s\n", res.Hash) + fmt.Printf("🌐 Validated: %t\n", res.Validated) +} diff --git a/_code-samples/set-regular-key/go/ws/main.go b/_code-samples/set-regular-key/go/ws/main.go new file mode 100644 index 00000000000..3bb0ec62567 --- /dev/null +++ b/_code-samples/set-regular-key/go/ws/main.go @@ -0,0 +1,142 @@ +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" +) + +func main() { + fmt.Println("⏳ Connecting to testnet...") + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + defer client.Disconnect() + + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + if !client.IsConnected() { + fmt.Println("❌ Failed to connect to testnet") + return + } + + fmt.Println("✅ Connected to testnet") + fmt.Println() + + w1, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + w2, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + regularKeyWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Funding wallets...") + if err := client.FundWallet(&w1); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet 1 funded") + + if err := client.FundWallet(&w2); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet 2 funded") + + if err := client.FundWallet(®ularKeyWallet); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Regular key wallet funded") + fmt.Println() + + fmt.Println("⏳ Setting regular key...") + rk := &transaction.SetRegularKey{ + BaseTx: transaction.BaseTx{ + Account: w1.GetAddress(), + }, + RegularKey: regularKeyWallet.GetAddress(), + } + + flatRk := rk.Flatten() + + err = client.Autofill(&flatRk) + if err != nil { + fmt.Println(err) + return + } + + blob, _, err := w1.Sign(flatRk) + if err != nil { + fmt.Println(err) + return + } + + res, err := client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ SetRegularKey transaction submitted") + fmt.Printf("🌐 Hash: %s\n", res.Hash) + fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println() + + fmt.Println("⏳ Checking if regular key is set...") + p := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: w1.GetAddress(), + }, + Destination: w2.GetAddress(), + Amount: types.XRPCurrencyAmount(10000), + } + + flatP := p.Flatten() + + err = client.Autofill(&flatP) + if err != nil { + fmt.Println(err) + return + } + + blob, _, err = regularKeyWallet.Sign(flatP) + if err != nil { + fmt.Println(err) + return + } + + res, err = client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Payment transaction submitted") + fmt.Printf("🌐 Hash: %s\n", res.Hash) + fmt.Printf("🌐 Validated: %t\n", res.Validated) +} diff --git a/_code-samples/use-tickets/go/go.mod b/_code-samples/use-tickets/go/go.mod new file mode 100644 index 00000000000..fa9fde5d08c --- /dev/null +++ b/_code-samples/use-tickets/go/go.mod @@ -0,0 +1,24 @@ +module github.com/XRPLF + +go 1.23.0 + +toolchain go1.23.10 + +require github.com/Peersyst/xrpl-go v0.1.11 + +require ( + github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect + github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect + github.com/decred/dcrd/crypto/ripemd160 v1.0.2 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/tyler-smith/go-bip32 v1.0.0 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + golang.org/x/crypto v0.23.0 // indirect +) diff --git a/_code-samples/use-tickets/go/go.sum b/_code-samples/use-tickets/go/go.sum new file mode 100644 index 00000000000..8d8522a619c --- /dev/null +++ b/_code-samples/use-tickets/go/go.sum @@ -0,0 +1,58 @@ +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc= +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= +github.com/Peersyst/xrpl-go v0.1.11 h1:P6r/gHxRnbAtAdPmzNHz/7zpsdfvwh0SS+QI2JNT44w= +github.com/Peersyst/xrpl-go v0.1.11/go.mod h1:CBRM3/soqNeeL2Jx6USVUtECqulZVUoq3UxZKMz9hdw= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2 h1:TvGTmUBHDU75OHro9ojPLK+Yv7gDl2hnUvRocRCjsys= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2/go.mod h1:uGfjDyePSpa75cSQLzNdVmWlbQMBuiJkvXw/MNKRY4M= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.1.5-0.20170601210322-f6abca593680/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/tyler-smith/go-bip32 v1.0.0 h1:sDR9juArbUgX+bO/iblgZnMPeWY1KZMUC2AFUJdv5KE= +github.com/tyler-smith/go-bip32 v1.0.0/go.mod h1:onot+eHknzV4BVPwrzqY5OoVpyCvnwD7lMawL5aQupE= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= diff --git a/_code-samples/use-tickets/go/rpc/main.go b/_code-samples/use-tickets/go/rpc/main.go new file mode 100644 index 00000000000..1c48d20df8b --- /dev/null +++ b/_code-samples/use-tickets/go/rpc/main.go @@ -0,0 +1,137 @@ +package main + +import ( + "encoding/json" + "fmt" + + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/queries/account" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/wallet" +) + +const ( + WalletSeed = "sn3nxiW7v8KXzPzAqzyHXbSSKNuN9" +) + +func main() { + cfg, err := rpc.NewClientConfig( + "https://s.altnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + client := rpc.NewClient(cfg) + + w, err := wallet.FromSeed(WalletSeed, "") + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Funding wallet...") + if err := client.FundWallet(&w); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet funded") + fmt.Println() + + info, err := client.GetAccountInfo(&account.InfoRequest{ + Account: w.GetAddress(), + }) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("🌐 Current wallet sequence:", info.AccountData.Sequence) + fmt.Println() + + fmt.Println("⏳ Submitting TicketCreate transaction...") + tc := &transaction.TicketCreate{ + BaseTx: transaction.BaseTx{ + Account: w.GetAddress(), + Sequence: info.AccountData.Sequence, + }, + TicketCount: 10, + } + + flatTc := tc.Flatten() + + if err := client.Autofill(&flatTc); err != nil { + fmt.Println(err) + return + } + + blob, _, err := w.Sign(flatTc) + if err != nil { + fmt.Println(err) + return + } + + res, err := client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ TicketCreate transaction submitted") + fmt.Printf("🌐 Hash: %s\n", res.Hash) + fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println() + + objects, err := client.GetAccountObjects(&account.ObjectsRequest{ + Account: w.GetAddress(), + }) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("🌐 Account objects:", objects.AccountObjects[0]["TicketSequence"]) + + seq, err := objects.AccountObjects[0]["TicketSequence"].(json.Number).Int64() + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Submitting AccountSet transaction...") + as := &transaction.AccountSet{ + BaseTx: transaction.BaseTx{ + Account: w.GetAddress(), + Sequence: 0, + TicketSequence: uint32(seq), + }, + } + + flatAs := as.Flatten() + + if err := client.Autofill(&flatAs); err != nil { + fmt.Println(err) + return + } + + flatAs["Sequence"] = uint32(0) + + blob, _, err = w.Sign(flatAs) + if err != nil { + fmt.Println(err) + return + } + + res, err = client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ AccountSet transaction submitted") + fmt.Printf("🌐 Hash: %s\n", res.Hash) + fmt.Printf("🌐 Validated: %t\n", res.Validated) +} diff --git a/_code-samples/use-tickets/go/ws/main.go b/_code-samples/use-tickets/go/ws/main.go new file mode 100644 index 00000000000..5e128c2752e --- /dev/null +++ b/_code-samples/use-tickets/go/ws/main.go @@ -0,0 +1,148 @@ +package main + +import ( + "encoding/json" + "fmt" + + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/queries/account" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" +) + +const ( + WalletSeed = "sn3nxiW7v8KXzPzAqzyHXbSSKNuN9" +) + +func main() { + fmt.Println("⏳ Connecting to testnet...") + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + defer client.Disconnect() + + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + if !client.IsConnected() { + fmt.Println("❌ Failed to connect to testnet") + return + } + + fmt.Println("✅ Connected to testnet") + fmt.Println() + + w, err := wallet.FromSeed(WalletSeed, "") + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Funding wallet...") + if err := client.FundWallet(&w); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet funded") + fmt.Println() + + info, err := client.GetAccountInfo(&account.InfoRequest{ + Account: w.GetAddress(), + }) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("🌐 Current wallet sequence:", info.AccountData.Sequence) + fmt.Println() + + fmt.Println("⏳ Submitting TicketCreate transaction...") + tc := &transaction.TicketCreate{ + BaseTx: transaction.BaseTx{ + Account: w.GetAddress(), + Sequence: info.AccountData.Sequence, + }, + TicketCount: 10, + } + + flatTc := tc.Flatten() + + if err := client.Autofill(&flatTc); err != nil { + fmt.Println(err) + return + } + + blob, _, err := w.Sign(flatTc) + if err != nil { + fmt.Println(err) + return + } + + res, err := client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ TicketCreate transaction submitted") + fmt.Printf("🌐 Hash: %s\n", res.Hash) + fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println() + + objects, err := client.GetAccountObjects(&account.ObjectsRequest{ + Account: w.GetAddress(), + }) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("🌐 Account objects:", objects.AccountObjects[0]["TicketSequence"]) + + seq, err := objects.AccountObjects[0]["TicketSequence"].(json.Number).Int64() + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Submitting AccountSet transaction...") + as := &transaction.AccountSet{ + BaseTx: transaction.BaseTx{ + Account: w.GetAddress(), + Sequence: 0, + TicketSequence: uint32(seq), + }, + } + + flatAs := as.Flatten() + + if err := client.Autofill(&flatAs); err != nil { + fmt.Println(err) + return + } + + flatAs["Sequence"] = uint32(0) + + blob, _, err = w.Sign(flatAs) + if err != nil { + fmt.Println(err) + return + } + + res, err = client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ AccountSet transaction submitted") + fmt.Printf("🌐 Hash: %s\n", res.Hash) + fmt.Printf("🌐 Validated: %t\n", res.Validated) +} From 877ed4e9803b44bb3ac13a2cecca289d58e8370a Mon Sep 17 00:00:00 2001 From: banasa44 Date: Mon, 21 Jul 2025 11:47:33 +0200 Subject: [PATCH 03/18] feat(_code-samples): WiP add go tx examples implementation and get-started section --- _code-samples/get-started/go/base/rpc/main.go | 24 + _code-samples/get-started/go/base/ws/main.go | 24 + .../get-started/go/get-acc-info/rpc/main.go | 59 ++ .../get-started/go/get-acc-info/ws/main.go | 74 +++ _code-samples/get-started/go/go.mod | 24 + _code-samples/get-started/go/go.sum | 58 ++ _code-samples/get-tx/go/go.mod | 23 + _code-samples/get-tx/go/go.sum | 56 ++ _code-samples/get-tx/go/main.go | 45 ++ _code-samples/issue-a-token/go/go.mod | 24 + _code-samples/issue-a-token/go/go.sum | 58 ++ _code-samples/issue-a-token/go/rpc/main.go | 523 +++++++++++++++++ _code-samples/issue-a-token/go/ws/main.go | 529 ++++++++++++++++++ _code-samples/send-xrp/go/go.mod | 23 +- _code-samples/send-xrp/go/go.sum | 58 ++ _code-samples/send-xrp/go/rpc/main.go | 112 +++- _code-samples/send-xrp/go/ws/main.go | 121 +++- _code-samples/use-tickets/go/rpc/main.go | 7 +- 18 files changed, 1833 insertions(+), 9 deletions(-) create mode 100644 _code-samples/get-started/go/base/rpc/main.go create mode 100644 _code-samples/get-started/go/base/ws/main.go create mode 100644 _code-samples/get-started/go/get-acc-info/rpc/main.go create mode 100644 _code-samples/get-started/go/get-acc-info/ws/main.go create mode 100644 _code-samples/get-started/go/go.mod create mode 100644 _code-samples/get-started/go/go.sum create mode 100644 _code-samples/get-tx/go/go.mod create mode 100644 _code-samples/get-tx/go/go.sum create mode 100644 _code-samples/get-tx/go/main.go create mode 100644 _code-samples/issue-a-token/go/go.mod create mode 100644 _code-samples/issue-a-token/go/go.sum create mode 100644 _code-samples/issue-a-token/go/rpc/main.go create mode 100644 _code-samples/issue-a-token/go/ws/main.go create mode 100644 _code-samples/send-xrp/go/go.sum diff --git a/_code-samples/get-started/go/base/rpc/main.go b/_code-samples/get-started/go/base/rpc/main.go new file mode 100644 index 00000000000..61ec4c01016 --- /dev/null +++ b/_code-samples/get-started/go/base/rpc/main.go @@ -0,0 +1,24 @@ +package main + +import ( + "github.com/Peersyst/xrpl-go/xrpl/queries/utility" + "github.com/Peersyst/xrpl-go/xrpl/rpc" +) + +func main() { + // Define the network client configuration + cfg, err := rpc.NewClientConfig("https://s.altnet.rippletest.net:51234/") + if err != nil { + panic(err) + } + + // Initiate the network client + client := rpc.NewClient(cfg) + + // Ping the network (used to avoid Go unused variable error, but useful to check connectivity) + _, err = client.Ping(&utility.PingRequest{}) + if err != nil { + panic(err) + } + +} diff --git a/_code-samples/get-started/go/base/ws/main.go b/_code-samples/get-started/go/base/ws/main.go new file mode 100644 index 00000000000..1d165413911 --- /dev/null +++ b/_code-samples/get-started/go/base/ws/main.go @@ -0,0 +1,24 @@ +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/xrpl/websocket" +) + +func main() { + + // Define the network client + client := websocket.NewClient(websocket.NewClientConfig().WithHost("wss://s.altnet.rippletest.net:51233")) + + // Disconnect the client when done. (Defer executes at the end of the function) + defer client.Disconnect() + + // Connect to the network + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + // ... custom code goes here +} diff --git a/_code-samples/get-started/go/get-acc-info/rpc/main.go b/_code-samples/get-started/go/get-acc-info/rpc/main.go new file mode 100644 index 00000000000..792e89a3ed7 --- /dev/null +++ b/_code-samples/get-started/go/get-acc-info/rpc/main.go @@ -0,0 +1,59 @@ +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/queries/account" + "github.com/Peersyst/xrpl-go/xrpl/queries/common" + "github.com/Peersyst/xrpl-go/xrpl/queries/ledger" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/wallet" +) + +func main() { + // Define the network client with a faucet provider + cfg, err := rpc.NewClientConfig( + "https://s.altnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + client := rpc.NewClient(cfg) + + // Create a new wallet + w, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + fmt.Println("New wallet created:") + fmt.Println("Address:", w.ClassicAddress) + + // Fund the wallet with testnet XRP + if err := client.FundWallet(&w); err != nil { + fmt.Println(err) + return + } + + // Get info from the ledger about the address we just funded + acc_info, err := client.GetAccountInfo(&account.InfoRequest{ + Account: w.GetAddress(), + }) + if err != nil { + fmt.Println(err) + return + } + fmt.Println("Account Balance:", acc_info.AccountData.Balance) + fmt.Println("Account Sequence:", acc_info.AccountData.Sequence) + + // Get info about the ledger + ledger, err := client.GetLedger(&ledger.Request{LedgerIndex: common.Current}) + if err != nil { + fmt.Println(err) + return + } + fmt.Println("Ledger Index:", ledger.Ledger.LedgerIndex) +} diff --git a/_code-samples/get-started/go/get-acc-info/ws/main.go b/_code-samples/get-started/go/get-acc-info/ws/main.go new file mode 100644 index 00000000000..f4ef0ff1297 --- /dev/null +++ b/_code-samples/get-started/go/get-acc-info/ws/main.go @@ -0,0 +1,74 @@ +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/queries/account" + "github.com/Peersyst/xrpl-go/xrpl/queries/common" + "github.com/Peersyst/xrpl-go/xrpl/queries/ledger" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" +) + +func main() { + + // Define the network client with a faucet provider + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + + // Disconnect the client when done. (Defer executes at the end of the function) + defer client.Disconnect() + + // Connect to the network + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + if !client.IsConnected() { + fmt.Println("❌ Failed to connect to testnet") + return + } + + fmt.Println("✅ Connected to testnet") + fmt.Println() + + // Create a new wallet + w, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + fmt.Println("New wallet created:") + fmt.Println("Address:", w.ClassicAddress) + + // Fund the wallet with testnet XRP + if err := client.FundWallet(&w); err != nil { + fmt.Println(err) + return + } + + // Get info from the ledger about the address we just funded + acc_info, err := client.GetAccountInfo(&account.InfoRequest{ + Account: w.GetAddress(), + }) + if err != nil { + fmt.Println(err) + return + } + fmt.Println("Account Balance:", acc_info.AccountData.Balance) + fmt.Println("Account Sequence:", acc_info.AccountData.Sequence) + + // Get info about the ledger + ledger, err := client.GetLedger(&ledger.Request{LedgerIndex: common.Current}) + if err != nil { + fmt.Println(err) + return + } + fmt.Println("Ledger Index:", ledger.Ledger.LedgerIndex) +} diff --git a/_code-samples/get-started/go/go.mod b/_code-samples/get-started/go/go.mod new file mode 100644 index 00000000000..fa9fde5d08c --- /dev/null +++ b/_code-samples/get-started/go/go.mod @@ -0,0 +1,24 @@ +module github.com/XRPLF + +go 1.23.0 + +toolchain go1.23.10 + +require github.com/Peersyst/xrpl-go v0.1.11 + +require ( + github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect + github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect + github.com/decred/dcrd/crypto/ripemd160 v1.0.2 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/tyler-smith/go-bip32 v1.0.0 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + golang.org/x/crypto v0.23.0 // indirect +) diff --git a/_code-samples/get-started/go/go.sum b/_code-samples/get-started/go/go.sum new file mode 100644 index 00000000000..8d8522a619c --- /dev/null +++ b/_code-samples/get-started/go/go.sum @@ -0,0 +1,58 @@ +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc= +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= +github.com/Peersyst/xrpl-go v0.1.11 h1:P6r/gHxRnbAtAdPmzNHz/7zpsdfvwh0SS+QI2JNT44w= +github.com/Peersyst/xrpl-go v0.1.11/go.mod h1:CBRM3/soqNeeL2Jx6USVUtECqulZVUoq3UxZKMz9hdw= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2 h1:TvGTmUBHDU75OHro9ojPLK+Yv7gDl2hnUvRocRCjsys= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2/go.mod h1:uGfjDyePSpa75cSQLzNdVmWlbQMBuiJkvXw/MNKRY4M= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.1.5-0.20170601210322-f6abca593680/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/tyler-smith/go-bip32 v1.0.0 h1:sDR9juArbUgX+bO/iblgZnMPeWY1KZMUC2AFUJdv5KE= +github.com/tyler-smith/go-bip32 v1.0.0/go.mod h1:onot+eHknzV4BVPwrzqY5OoVpyCvnwD7lMawL5aQupE= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= diff --git a/_code-samples/get-tx/go/go.mod b/_code-samples/get-tx/go/go.mod new file mode 100644 index 00000000000..2b62834f200 --- /dev/null +++ b/_code-samples/get-tx/go/go.mod @@ -0,0 +1,23 @@ +module github.com/XRPLF + +go 1.23.0 + +toolchain go1.23.10 + +require github.com/Peersyst/xrpl-go v0.1.11 + +require ( + github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect + github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect + github.com/decred/dcrd/crypto/ripemd160 v1.0.2 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/tyler-smith/go-bip32 v1.0.0 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + golang.org/x/crypto v0.23.0 // indirect +) diff --git a/_code-samples/get-tx/go/go.sum b/_code-samples/get-tx/go/go.sum new file mode 100644 index 00000000000..175bc12e7dd --- /dev/null +++ b/_code-samples/get-tx/go/go.sum @@ -0,0 +1,56 @@ +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc= +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= +github.com/Peersyst/xrpl-go v0.1.11 h1:P6r/gHxRnbAtAdPmzNHz/7zpsdfvwh0SS+QI2JNT44w= +github.com/Peersyst/xrpl-go v0.1.11/go.mod h1:CBRM3/soqNeeL2Jx6USVUtECqulZVUoq3UxZKMz9hdw= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2 h1:TvGTmUBHDU75OHro9ojPLK+Yv7gDl2hnUvRocRCjsys= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2/go.mod h1:uGfjDyePSpa75cSQLzNdVmWlbQMBuiJkvXw/MNKRY4M= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.1.5-0.20170601210322-f6abca593680/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/tyler-smith/go-bip32 v1.0.0 h1:sDR9juArbUgX+bO/iblgZnMPeWY1KZMUC2AFUJdv5KE= +github.com/tyler-smith/go-bip32 v1.0.0/go.mod h1:onot+eHknzV4BVPwrzqY5OoVpyCvnwD7lMawL5aQupE= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= diff --git a/_code-samples/get-tx/go/main.go b/_code-samples/get-tx/go/main.go new file mode 100644 index 00000000000..d7d2f4ae263 --- /dev/null +++ b/_code-samples/get-tx/go/main.go @@ -0,0 +1,45 @@ +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/xrpl/queries/common" + "github.com/Peersyst/xrpl-go/xrpl/queries/ledger" + "github.com/Peersyst/xrpl-go/xrpl/queries/transactions" + "github.com/Peersyst/xrpl-go/xrpl/rpc" +) + +func main() { + cfg, err := rpc.NewClientConfig( + "https://s.altnet.rippletest.net:51234/", + ) + if err != nil { + panic(err) + } + + client := rpc.NewClient(cfg) + + led, err := client.GetLedger(&ledger.Request{ + Transactions: true, + LedgerIndex: common.Validated, + }) + if err != nil { + panic(err) + } + fmt.Println("Latest validated ledger:", led) + + // Get the first transaction hash from the ledger + if len(led.Ledger.Transactions) > 0 { + txHash := led.Ledger.Transactions[0].(string) // type assertion may be needed + + // Query the transaction details + txResp, err := client.Request(&transactions.TxRequest{ + Transaction: txHash, + }) + if err != nil { + panic(err) + } + fmt.Println("First transaction in the ledger:") + fmt.Println(txResp) + } +} diff --git a/_code-samples/issue-a-token/go/go.mod b/_code-samples/issue-a-token/go/go.mod new file mode 100644 index 00000000000..fa9fde5d08c --- /dev/null +++ b/_code-samples/issue-a-token/go/go.mod @@ -0,0 +1,24 @@ +module github.com/XRPLF + +go 1.23.0 + +toolchain go1.23.10 + +require github.com/Peersyst/xrpl-go v0.1.11 + +require ( + github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect + github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect + github.com/decred/dcrd/crypto/ripemd160 v1.0.2 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/tyler-smith/go-bip32 v1.0.0 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + golang.org/x/crypto v0.23.0 // indirect +) diff --git a/_code-samples/issue-a-token/go/go.sum b/_code-samples/issue-a-token/go/go.sum new file mode 100644 index 00000000000..8d8522a619c --- /dev/null +++ b/_code-samples/issue-a-token/go/go.sum @@ -0,0 +1,58 @@ +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc= +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= +github.com/Peersyst/xrpl-go v0.1.11 h1:P6r/gHxRnbAtAdPmzNHz/7zpsdfvwh0SS+QI2JNT44w= +github.com/Peersyst/xrpl-go v0.1.11/go.mod h1:CBRM3/soqNeeL2Jx6USVUtECqulZVUoq3UxZKMz9hdw= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2 h1:TvGTmUBHDU75OHro9ojPLK+Yv7gDl2hnUvRocRCjsys= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2/go.mod h1:uGfjDyePSpa75cSQLzNdVmWlbQMBuiJkvXw/MNKRY4M= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.1.5-0.20170601210322-f6abca593680/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/tyler-smith/go-bip32 v1.0.0 h1:sDR9juArbUgX+bO/iblgZnMPeWY1KZMUC2AFUJdv5KE= +github.com/tyler-smith/go-bip32 v1.0.0/go.mod h1:onot+eHknzV4BVPwrzqY5OoVpyCvnwD7lMawL5aQupE= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= diff --git a/_code-samples/issue-a-token/go/rpc/main.go b/_code-samples/issue-a-token/go/rpc/main.go new file mode 100644 index 00000000000..bbdec424c72 --- /dev/null +++ b/_code-samples/issue-a-token/go/rpc/main.go @@ -0,0 +1,523 @@ +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" +) + +const ( + currencyCode = "FOO" +) + +func main() { + // + // Configure client + // + fmt.Println("⏳ Setting up client...") + cfg, err := rpc.NewClientConfig( + "https://s.altnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + client := rpc.NewClient(cfg) + fmt.Println("✅ Client configured!") + fmt.Println() + + // + // Configure wallets + // + fmt.Println("⏳ Setting up wallets...") + coldWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating cold wallet: %s\n", err) + return + } + err = client.FundWallet(&coldWallet) + if err != nil { + fmt.Printf("❌ Error funding cold wallet: %s\n", err) + return + } + fmt.Println("💸 Cold wallet funded!") + + hotWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating hot wallet: %s\n", err) + return + } + err = client.FundWallet(&hotWallet) + if err != nil { + fmt.Printf("❌ Error funding hot wallet: %s\n", err) + return + } + fmt.Println("💸 Hot wallet funded!") + + customerOneWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating token wallet: %s\n", err) + return + } + err = client.FundWallet(&customerOneWallet) + if err != nil { + fmt.Printf("❌ Error funding customer one wallet: %s\n", err) + return + } + fmt.Println("💸 Customer one wallet funded!") + fmt.Println() + + fmt.Println("✅ Wallets setup complete!") + fmt.Println("💳 Cold wallet:", coldWallet.ClassicAddress) + fmt.Println("💳 Hot wallet:", hotWallet.ClassicAddress) + fmt.Println("💳 Customer one wallet:", customerOneWallet.ClassicAddress) + fmt.Println() + + // + // Configure cold address settings + // + fmt.Println("⏳ Configuring cold address settings...") + coldWalletAccountSet := &transactions.AccountSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + TickSize: types.TickSize(5), + TransferRate: types.TransferRate(0), + Domain: types.Domain("6578616D706C652E636F6D"), // example.com + } + + coldWalletAccountSet.SetAsfDefaultRipple() + coldWalletAccountSet.SetDisallowXRP() + + coldWalletAccountSet.SetRequireDestTag() + + flattenedTx := coldWalletAccountSet.Flatten() + + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err := coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err := client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Cold address settings configuration failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Cold address settings configured!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Configure hot address settings + // + fmt.Println("⏳ Configuring hot address settings...") + hotWalletAccountSet := &transactions.AccountSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(hotWallet.ClassicAddress), + }, + Domain: types.Domain("6578616D706C652E636F6D"), // example.com + } + + hotWalletAccountSet.SetAsfRequireAuth() + hotWalletAccountSet.SetDisallowXRP() + hotWalletAccountSet.SetRequireDestTag() + + flattenedTx = hotWalletAccountSet.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = hotWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Hot address settings configuration failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Hot address settings configured!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Create trust line from hot to cold address + // + fmt.Println("⏳ Creating trust line from hot to cold address...") + hotColdTrustSet := &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(hotWallet.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "100000000000000", + }, + } + + flattenedTx = hotColdTrustSet.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = hotWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Trust line from hot to cold address creation failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Trust line from hot to cold address created!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Create trust line from costumer one to cold address + // + fmt.Println("⏳ Creating trust line from customer one to cold address...") + customerOneColdTrustSet := &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(customerOneWallet.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "100000000000000", + }, + } + + flattenedTx = customerOneColdTrustSet.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = customerOneWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Trust line from customer one to cold address creation failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Trust line from customer one to cold address created!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Send tokens from cold wallet to hot wallet + // + fmt.Println("⏳ Sending tokens from cold wallet to hot wallet...") + coldToHotPayment := &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "3800", + }, + Destination: types.Address(hotWallet.ClassicAddress), + DestinationTag: types.DestinationTag(1), + } + + flattenedTx = coldToHotPayment.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Tokens not sent from cold wallet to hot wallet!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Tokens sent from cold wallet to hot wallet!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Send tokens from hot wallet to customer one + // + fmt.Println("⏳ Sending tokens from cold wallet to customer one...") + coldToCustomerOnePayment := &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "100", + }, + Destination: types.Address(customerOneWallet.ClassicAddress), + } + + flattenedTx = coldToCustomerOnePayment.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Tokens not sent from cold wallet to customer one!") + fmt.Println() + return + } + + fmt.Println("✅ Tokens sent from cold wallet to customer one!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Freeze cold wallet + // + fmt.Println("⏳ Freezing cold wallet...") + freezeColdWallet := &transactions.AccountSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + } + + freezeColdWallet.SetAsfGlobalFreeze() + + flattenedTx = freezeColdWallet.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Cold wallet freezing failed!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + return + } + + fmt.Println("✅ Cold wallet frozen!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Try to send tokens from hot wallet to customer one + // + fmt.Println("⏳ Trying to send tokens from hot wallet to customer one...") + hotToCustomerOnePayment := &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(hotWallet.ClassicAddress), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "100", + }, + Destination: types.Address(customerOneWallet.ClassicAddress), + } + + flattenedTx = hotToCustomerOnePayment.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = hotWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + _, err = client.SubmitTxBlobAndWait(txBlob, false) + if err == nil { + return + } + + fmt.Println("❌ Tokens not sent from hot wallet to customer one!") + fmt.Println() + + // // + // // Unfreeze cold wallet + // // + fmt.Println("⏳ Unfreezing cold wallet...") + unfreezeColdWallet := &transactions.AccountSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + } + + unfreezeColdWallet.ClearAsfGlobalFreeze() + + flattenedTx = unfreezeColdWallet.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Cold wallet unfreezing failed!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + return + } + + fmt.Println("✅ Cold wallet unfrozen!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Try to send tokens from hot wallet to customer one + // + fmt.Println("⏳ Trying to send tokens from hot wallet to customer one...") + hotToCustomerOnePayment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(hotWallet.ClassicAddress), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "100", + }, + Destination: types.Address(customerOneWallet.ClassicAddress), + } + + flattenedTx = hotToCustomerOnePayment.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = hotWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Tokens not sent from hot wallet to customer one!") + fmt.Println("Try again!") + return + } + + fmt.Println("✅ Tokens sent from hot wallet to customer one!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() +} diff --git a/_code-samples/issue-a-token/go/ws/main.go b/_code-samples/issue-a-token/go/ws/main.go new file mode 100644 index 00000000000..04a57383ddd --- /dev/null +++ b/_code-samples/issue-a-token/go/ws/main.go @@ -0,0 +1,529 @@ +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" +) + +const ( + currencyCode = "FOO" +) + +func main() { + // + // Configure client + // + fmt.Println("⏳ Setting up client...") + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net"). + WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + defer client.Disconnect() + fmt.Println("✅ Client configured!") + fmt.Println() + + fmt.Println("Connecting to server...") + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + fmt.Println("Connection: ", client.IsConnected()) + fmt.Println() + + // + // Configure wallets + // + fmt.Println("⏳ Setting up wallets...") + coldWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating cold wallet: %s\n", err) + return + } + err = client.FundWallet(&coldWallet) + if err != nil { + fmt.Printf("❌ Error funding cold wallet: %s\n", err) + return + } + fmt.Println("💸 Cold wallet funded!") + + hotWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating hot wallet: %s\n", err) + return + } + err = client.FundWallet(&hotWallet) + if err != nil { + fmt.Printf("❌ Error funding hot wallet: %s\n", err) + return + } + fmt.Println("💸 Hot wallet funded!") + + customerOneWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating token wallet: %s\n", err) + return + } + err = client.FundWallet(&customerOneWallet) + if err != nil { + fmt.Printf("❌ Error funding customer one wallet: %s\n", err) + return + } + fmt.Println("💸 Customer one wallet funded!") + fmt.Println() + + fmt.Println("✅ Wallets setup complete!") + fmt.Println("💳 Cold wallet:", coldWallet.ClassicAddress) + fmt.Println("💳 Hot wallet:", hotWallet.ClassicAddress) + fmt.Println("💳 Customer one wallet:", customerOneWallet.ClassicAddress) + fmt.Println() + + // + // Configure cold address settings + // + fmt.Println("⏳ Configuring cold address settings...") + coldWalletAccountSet := &transactions.AccountSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + TickSize: types.TickSize(5), + TransferRate: types.TransferRate(0), + Domain: types.Domain("6578616D706C652E636F6D"), // example.com + } + + coldWalletAccountSet.SetAsfDefaultRipple() + coldWalletAccountSet.SetDisallowXRP() + + coldWalletAccountSet.SetRequireDestTag() + + flattenedTx := coldWalletAccountSet.Flatten() + + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err := coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err := client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Cold address settings configuration failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Cold address settings configured!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Configure hot address settings + // + fmt.Println("⏳ Configuring hot address settings...") + hotWalletAccountSet := &transactions.AccountSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(hotWallet.ClassicAddress), + }, + Domain: types.Domain("6578616D706C652E636F6D"), // example.com + } + + hotWalletAccountSet.SetAsfRequireAuth() + hotWalletAccountSet.SetDisallowXRP() + hotWalletAccountSet.SetRequireDestTag() + + flattenedTx = hotWalletAccountSet.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = hotWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Hot address settings configuration failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Hot address settings configured!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Create trust line from hot to cold address + // + fmt.Println("⏳ Creating trust line from hot to cold address...") + hotColdTrustSet := &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(hotWallet.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "100000000000000", + }, + } + + flattenedTx = hotColdTrustSet.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = hotWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Trust line from hot to cold address creation failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Trust line from hot to cold address created!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Create trust line from costumer one to cold address + // + fmt.Println("⏳ Creating trust line from customer one to cold address...") + customerOneColdTrustSet := &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(customerOneWallet.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "100000000000000", + }, + } + + flattenedTx = customerOneColdTrustSet.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = customerOneWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Trust line from customer one to cold address creation failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Trust line from customer one to cold address created!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Send tokens from cold wallet to hot wallet + // + fmt.Println("⏳ Sending tokens from cold wallet to hot wallet...") + coldToHotPayment := &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "3800", + }, + Destination: types.Address(hotWallet.ClassicAddress), + DestinationTag: types.DestinationTag(1), + } + + flattenedTx = coldToHotPayment.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Tokens not sent from cold wallet to hot wallet!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Tokens sent from cold wallet to hot wallet!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Send tokens from hot wallet to customer one + // + fmt.Println("⏳ Sending tokens from cold wallet to customer one...") + coldToCustomerOnePayment := &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "100", + }, + Destination: types.Address(customerOneWallet.ClassicAddress), + } + + flattenedTx = coldToCustomerOnePayment.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Tokens not sent from cold wallet to customer one!") + fmt.Println() + return + } + + fmt.Println("✅ Tokens sent from cold wallet to customer one!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Freeze cold wallet + // + fmt.Println("⏳ Freezing cold wallet...") + freezeColdWallet := &transactions.AccountSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + } + + freezeColdWallet.SetAsfGlobalFreeze() + + flattenedTx = freezeColdWallet.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Cold wallet freezing failed!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + return + } + + fmt.Println("✅ Cold wallet frozen!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Try to send tokens from hot wallet to customer one + // + fmt.Println("⏳ Trying to send tokens from hot wallet to customer one...") + hotToCustomerOnePayment := &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(hotWallet.ClassicAddress), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "100", + }, + Destination: types.Address(customerOneWallet.ClassicAddress), + } + + flattenedTx = hotToCustomerOnePayment.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = hotWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + _, err = client.SubmitTxBlobAndWait(txBlob, false) + if err == nil { + return + } + + fmt.Println("❌ Tokens not sent from hot wallet to customer one!") + fmt.Println() + + // // + // // Unfreeze cold wallet + // // + fmt.Println("⏳ Unfreezing cold wallet...") + unfreezeColdWallet := &transactions.AccountSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + } + + unfreezeColdWallet.ClearAsfGlobalFreeze() + + flattenedTx = unfreezeColdWallet.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Cold wallet unfreezing failed!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + return + } + + fmt.Println("✅ Cold wallet unfrozen!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Try to send tokens from hot wallet to customer one + // + fmt.Println("⏳ Trying to send tokens from hot wallet to customer one...") + hotToCustomerOnePayment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(hotWallet.ClassicAddress), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "100", + }, + Destination: types.Address(customerOneWallet.ClassicAddress), + } + + flattenedTx = hotToCustomerOnePayment.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = hotWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Tokens not sent from hot wallet to customer one!") + fmt.Println("Try again!") + return + } + + fmt.Println("✅ Tokens sent from hot wallet to customer one!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() +} diff --git a/_code-samples/send-xrp/go/go.mod b/_code-samples/send-xrp/go/go.mod index 63f569b0cd7..fa9fde5d08c 100644 --- a/_code-samples/send-xrp/go/go.mod +++ b/_code-samples/send-xrp/go/go.mod @@ -1,5 +1,24 @@ module github.com/XRPLF -go 1.23 +go 1.23.0 -require github.com/Peersyst/xrpl-go v0.1.11 \ No newline at end of file +toolchain go1.23.10 + +require github.com/Peersyst/xrpl-go v0.1.11 + +require ( + github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect + github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect + github.com/decred/dcrd/crypto/ripemd160 v1.0.2 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/tyler-smith/go-bip32 v1.0.0 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + golang.org/x/crypto v0.23.0 // indirect +) diff --git a/_code-samples/send-xrp/go/go.sum b/_code-samples/send-xrp/go/go.sum new file mode 100644 index 00000000000..8d8522a619c --- /dev/null +++ b/_code-samples/send-xrp/go/go.sum @@ -0,0 +1,58 @@ +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc= +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= +github.com/Peersyst/xrpl-go v0.1.11 h1:P6r/gHxRnbAtAdPmzNHz/7zpsdfvwh0SS+QI2JNT44w= +github.com/Peersyst/xrpl-go v0.1.11/go.mod h1:CBRM3/soqNeeL2Jx6USVUtECqulZVUoq3UxZKMz9hdw= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2 h1:TvGTmUBHDU75OHro9ojPLK+Yv7gDl2hnUvRocRCjsys= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2/go.mod h1:uGfjDyePSpa75cSQLzNdVmWlbQMBuiJkvXw/MNKRY4M= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.1.5-0.20170601210322-f6abca593680/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/tyler-smith/go-bip32 v1.0.0 h1:sDR9juArbUgX+bO/iblgZnMPeWY1KZMUC2AFUJdv5KE= +github.com/tyler-smith/go-bip32 v1.0.0/go.mod h1:onot+eHknzV4BVPwrzqY5OoVpyCvnwD7lMawL5aQupE= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= diff --git a/_code-samples/send-xrp/go/rpc/main.go b/_code-samples/send-xrp/go/rpc/main.go index 9ab1e3e8e78..fd62e66556b 100644 --- a/_code-samples/send-xrp/go/rpc/main.go +++ b/_code-samples/send-xrp/go/rpc/main.go @@ -1 +1,111 @@ -package rpc +package main + +import ( + "fmt" + "strconv" + + "github.com/Peersyst/xrpl-go/xrpl/currency" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + + rpctypes "github.com/Peersyst/xrpl-go/xrpl/rpc/types" +) + +const ( + WalletSeed = "sn3nxiW7v8KXzPzAqzyHXbSSKNuN9" +) + +func main() { + + cfg, err := rpc.NewClientConfig( + "https://s.altnet.rippletest.net:51234/", + rpc.WithMaxFeeXRP(5.0), + rpc.WithFeeCushion(1.5), + rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + client := rpc.NewClient(cfg) + + w, err := wallet.FromSeed(WalletSeed, "") + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Funding wallet...") + if err := client.FundWallet(&w); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet funded") + fmt.Println() + + xrpAmount, err := currency.XrpToDrops("1") + if err != nil { + fmt.Println(err) + return + } + + xrpAmountInt, err := strconv.ParseInt(xrpAmount, 10, 64) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Sending 1 XRP to rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe...") + p := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: types.Address(w.GetAddress()), + }, + Destination: "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe", + Amount: types.XRPCurrencyAmount(xrpAmountInt), + DeliverMax: types.XRPCurrencyAmount(xrpAmountInt), + } + + flattenedTx := p.Flatten() + + if err := client.Autofill(&flattenedTx); err != nil { + fmt.Println(err) + return + } + + txBlob, _, err := w.Sign(flattenedTx) + if err != nil { + fmt.Println(err) + return + } + + res, err := client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Payment submitted") + fmt.Printf("🌐 Hash: %s\n", res.Hash) + fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println() + fmt.Println("⏳ Using SubmitTxAndWait with wallet") + fmt.Println() + + flattenedTx2 := p.Flatten() + resp, err := client.SubmitTxAndWait(flattenedTx2, &rpctypes.SubmitOptions{ + Autofill: true, + Wallet: &w, + }) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Payment submitted via SubmitTxAndWait") + fmt.Printf("🌐 Hash: %s\n", resp.Hash) + fmt.Printf("🌐 Validated: %t\n", resp.Validated) +} diff --git a/_code-samples/send-xrp/go/ws/main.go b/_code-samples/send-xrp/go/ws/main.go index 98592950df4..5f1e392ec63 100644 --- a/_code-samples/send-xrp/go/ws/main.go +++ b/_code-samples/send-xrp/go/ws/main.go @@ -1 +1,120 @@ -package ws +package main + +import ( + "fmt" + "strconv" + + "github.com/Peersyst/xrpl-go/xrpl/currency" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" + wstypes "github.com/Peersyst/xrpl-go/xrpl/websocket/types" +) + +const ( + WalletSeed = "sn3nxiW7v8KXzPzAqzyHXbSSKNuN9" +) + +func main() { + + fmt.Println("⏳ Connecting to testnet...") + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + defer client.Disconnect() + + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + if !client.IsConnected() { + fmt.Println("❌ Failed to connect to testnet") + return + } + + fmt.Println("✅ Connected to testnet") + fmt.Println() + + w, err := wallet.FromSeed(WalletSeed, "") + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Funding wallet...") + if err := client.FundWallet(&w); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet funded") + fmt.Println() + + xrpAmount, err := currency.XrpToDrops("1") + if err != nil { + fmt.Println(err) + return + } + + xrpAmountInt, err := strconv.ParseInt(xrpAmount, 10, 64) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Sending 1 XRP to rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe...") + p := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: types.Address(w.GetAddress()), + }, + Destination: "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe", + Amount: types.XRPCurrencyAmount(xrpAmountInt), + DeliverMax: types.XRPCurrencyAmount(xrpAmountInt), + } + + flattenedTx := p.Flatten() + + if err := client.Autofill(&flattenedTx); err != nil { + fmt.Println(err) + return + } + + txBlob, _, err := w.Sign(flattenedTx) + if err != nil { + fmt.Println(err) + return + } + + res, err := client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Payment submitted") + fmt.Printf("🌐 Hash: %s\n", res.Hash) + fmt.Printf("🌐 Validated: %t\n", res.Validated) + + fmt.Println() + fmt.Println("⏳ Using SubmitTxAndWait with wallet") + fmt.Println() + + flattenedTx2 := p.Flatten() + resp, err := client.SubmitTxAndWait(flattenedTx2, &wstypes.SubmitOptions{ + Autofill: true, + Wallet: &w, + }) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Payment submitted via SubmitTxAndWait") + fmt.Printf("🌐 Hash: %s\n", resp.Hash) + fmt.Printf("🌐 Validated: %t\n", resp.Validated) +} diff --git a/_code-samples/use-tickets/go/rpc/main.go b/_code-samples/use-tickets/go/rpc/main.go index 1c48d20df8b..626e8932d93 100644 --- a/_code-samples/use-tickets/go/rpc/main.go +++ b/_code-samples/use-tickets/go/rpc/main.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" + "github.com/Peersyst/xrpl-go/pkg/crypto" "github.com/Peersyst/xrpl-go/xrpl/faucet" "github.com/Peersyst/xrpl-go/xrpl/queries/account" "github.com/Peersyst/xrpl-go/xrpl/rpc" @@ -11,10 +12,6 @@ import ( "github.com/Peersyst/xrpl-go/xrpl/wallet" ) -const ( - WalletSeed = "sn3nxiW7v8KXzPzAqzyHXbSSKNuN9" -) - func main() { cfg, err := rpc.NewClientConfig( "https://s.altnet.rippletest.net:51234/", @@ -26,7 +23,7 @@ func main() { client := rpc.NewClient(cfg) - w, err := wallet.FromSeed(WalletSeed, "") + w, err := wallet.New(crypto.ED25519()) if err != nil { fmt.Println(err) return From d9700399eb948bcc2424d40d237061ccd08b7edf Mon Sep 17 00:00:00 2001 From: banasa44 Date: Mon, 21 Jul 2025 12:35:57 +0200 Subject: [PATCH 04/18] refactor(_code-samples): remove Go WebSocket use-ticket example --- _code-samples/use-tickets/go/ws/main.go | 148 ------------------------ 1 file changed, 148 deletions(-) delete mode 100644 _code-samples/use-tickets/go/ws/main.go diff --git a/_code-samples/use-tickets/go/ws/main.go b/_code-samples/use-tickets/go/ws/main.go deleted file mode 100644 index 5e128c2752e..00000000000 --- a/_code-samples/use-tickets/go/ws/main.go +++ /dev/null @@ -1,148 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/queries/account" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" -) - -const ( - WalletSeed = "sn3nxiW7v8KXzPzAqzyHXbSSKNuN9" -) - -func main() { - fmt.Println("⏳ Connecting to testnet...") - client := websocket.NewClient( - websocket.NewClientConfig(). - WithHost("wss://s.altnet.rippletest.net:51233"). - WithFaucetProvider(faucet.NewTestnetFaucetProvider()), - ) - defer client.Disconnect() - - if err := client.Connect(); err != nil { - fmt.Println(err) - return - } - - if !client.IsConnected() { - fmt.Println("❌ Failed to connect to testnet") - return - } - - fmt.Println("✅ Connected to testnet") - fmt.Println() - - w, err := wallet.FromSeed(WalletSeed, "") - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("⏳ Funding wallet...") - if err := client.FundWallet(&w); err != nil { - fmt.Println(err) - return - } - - fmt.Println("💸 Wallet funded") - fmt.Println() - - info, err := client.GetAccountInfo(&account.InfoRequest{ - Account: w.GetAddress(), - }) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("🌐 Current wallet sequence:", info.AccountData.Sequence) - fmt.Println() - - fmt.Println("⏳ Submitting TicketCreate transaction...") - tc := &transaction.TicketCreate{ - BaseTx: transaction.BaseTx{ - Account: w.GetAddress(), - Sequence: info.AccountData.Sequence, - }, - TicketCount: 10, - } - - flatTc := tc.Flatten() - - if err := client.Autofill(&flatTc); err != nil { - fmt.Println(err) - return - } - - blob, _, err := w.Sign(flatTc) - if err != nil { - fmt.Println(err) - return - } - - res, err := client.SubmitTxBlobAndWait(blob, false) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ TicketCreate transaction submitted") - fmt.Printf("🌐 Hash: %s\n", res.Hash) - fmt.Printf("🌐 Validated: %t\n", res.Validated) - fmt.Println() - - objects, err := client.GetAccountObjects(&account.ObjectsRequest{ - Account: w.GetAddress(), - }) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("🌐 Account objects:", objects.AccountObjects[0]["TicketSequence"]) - - seq, err := objects.AccountObjects[0]["TicketSequence"].(json.Number).Int64() - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("⏳ Submitting AccountSet transaction...") - as := &transaction.AccountSet{ - BaseTx: transaction.BaseTx{ - Account: w.GetAddress(), - Sequence: 0, - TicketSequence: uint32(seq), - }, - } - - flatAs := as.Flatten() - - if err := client.Autofill(&flatAs); err != nil { - fmt.Println(err) - return - } - - flatAs["Sequence"] = uint32(0) - - blob, _, err = w.Sign(flatAs) - if err != nil { - fmt.Println(err) - return - } - - res, err = client.SubmitTxBlobAndWait(blob, false) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ AccountSet transaction submitted") - fmt.Printf("🌐 Hash: %s\n", res.Hash) - fmt.Printf("🌐 Validated: %t\n", res.Validated) -} From 7e700c05b40feceab414c3a441bb8c521cd2a54d Mon Sep 17 00:00:00 2001 From: banasa44 Date: Tue, 22 Jul 2025 09:28:07 +0200 Subject: [PATCH 05/18] feat(docs): add GoLang tutorial link and logo to the documentation index --- docs/index.page.tsx | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/index.page.tsx b/docs/index.page.tsx index 43e4d9c1ae9..cf9cedf2c63 100644 --- a/docs/index.page.tsx +++ b/docs/index.page.tsx @@ -334,6 +334,26 @@ export default function Docs() {
{translate('Java')}
+
+ + GoLang Logo +
{translate("GoLang")}
+ +
+
+ + GoLang Logo +
{translate("GoLang")}
+ +
From 82b976905e7afd0bf031d85f1e8703d1106a6057 Mon Sep 17 00:00:00 2001 From: banasa44 Date: Tue, 22 Jul 2025 11:15:48 +0200 Subject: [PATCH 06/18] feat(docs): add xrpl-go GoLang package to XRPLF documentation site --- _code-samples/get-started/README.md | 1 + _code-samples/get-tx/go/main.go | 1 + _code-samples/send-xrp/go/ws/main.go | 201 ++++++++++---------- docs/references/client-libraries.md | 1 + docs/references/index.md | 2 + docs/tutorials/go/build-apps/get-started.md | 153 +++++++++++++++ docs/tutorials/go/build-apps/index.md | 13 ++ docs/tutorials/go/index.md | 24 +++ docs/tutorials/how-tos/send-xrp.md | 75 +++++++- docs/tutorials/index.md | 2 +- sidebars.yaml | 10 + top-nav.yaml | 1 + 12 files changed, 381 insertions(+), 103 deletions(-) create mode 100644 docs/tutorials/go/build-apps/get-started.md create mode 100644 docs/tutorials/go/build-apps/index.md create mode 100644 docs/tutorials/go/index.md diff --git a/_code-samples/get-started/README.md b/_code-samples/get-started/README.md index b953a5d5b55..c8a36d8a9ea 100644 --- a/_code-samples/get-started/README.md +++ b/_code-samples/get-started/README.md @@ -8,3 +8,4 @@ For more context, see the Get Started tutorial for your preferred language: - [Java](https://xrpl.org/get-started-using-java.html) - [JavaScript](https://xrpl.org/get-started-using-javascript.html) - [PHP](https://xrpl.org/get-started-using-php.html) +- [GoLang](https://xrpl.org/get-started-using-golang.html) diff --git a/_code-samples/get-tx/go/main.go b/_code-samples/get-tx/go/main.go index d7d2f4ae263..32a433d90c3 100644 --- a/_code-samples/get-tx/go/main.go +++ b/_code-samples/get-tx/go/main.go @@ -19,6 +19,7 @@ func main() { client := rpc.NewClient(cfg) + // Get the latest validated ledger led, err := client.GetLedger(&ledger.Request{ Transactions: true, LedgerIndex: common.Validated, diff --git a/_code-samples/send-xrp/go/ws/main.go b/_code-samples/send-xrp/go/ws/main.go index 5f1e392ec63..84555843acd 100644 --- a/_code-samples/send-xrp/go/ws/main.go +++ b/_code-samples/send-xrp/go/ws/main.go @@ -6,6 +6,7 @@ import ( "github.com/Peersyst/xrpl-go/xrpl/currency" "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/queries/transactions" "github.com/Peersyst/xrpl-go/xrpl/transaction" "github.com/Peersyst/xrpl-go/xrpl/transaction/types" "github.com/Peersyst/xrpl-go/xrpl/wallet" @@ -13,108 +14,106 @@ import ( wstypes "github.com/Peersyst/xrpl-go/xrpl/websocket/types" ) -const ( - WalletSeed = "sn3nxiW7v8KXzPzAqzyHXbSSKNuN9" +func main() { +client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewTestnetFaucetProvider()), ) +defer client.Disconnect() -func main() { +if err := client.Connect(); err != nil { + fmt.Println(err) + return +} + +if !client.IsConnected() { + fmt.Println("❌ Failed to connect to testnet") + return +} + +fmt.Println("✅ Connected to testnet") +fmt.Println() + +// Example credentials +const WalletSeed = "sEd7zwWAu7vXMCBkkzokJHEXiKw2B2s" +w, err := wallet.FromSeed(WalletSeed, "") +if err != nil { + fmt.Println(err) + return +} + +// Funding the wallet +fmt.Println("⏳ Funding wallet...") +if err := client.FundWallet(&w); err != nil { + fmt.Println(err) + return +} + +fmt.Println("💸 Wallet funded") +fmt.Println() + +xrpAmount, err := currency.XrpToDrops("1") +if err != nil { + fmt.Println(err) + return +} - fmt.Println("⏳ Connecting to testnet...") - client := websocket.NewClient( - websocket.NewClientConfig(). - WithHost("wss://s.altnet.rippletest.net:51233"). - WithFaucetProvider(faucet.NewTestnetFaucetProvider()), - ) - defer client.Disconnect() - - if err := client.Connect(); err != nil { - fmt.Println(err) - return - } - - if !client.IsConnected() { - fmt.Println("❌ Failed to connect to testnet") - return - } - - fmt.Println("✅ Connected to testnet") - fmt.Println() - - w, err := wallet.FromSeed(WalletSeed, "") - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("⏳ Funding wallet...") - if err := client.FundWallet(&w); err != nil { - fmt.Println(err) - return - } - - fmt.Println("💸 Wallet funded") - fmt.Println() - - xrpAmount, err := currency.XrpToDrops("1") - if err != nil { - fmt.Println(err) - return - } - - xrpAmountInt, err := strconv.ParseInt(xrpAmount, 10, 64) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("⏳ Sending 1 XRP to rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe...") - p := &transaction.Payment{ - BaseTx: transaction.BaseTx{ - Account: types.Address(w.GetAddress()), - }, - Destination: "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe", - Amount: types.XRPCurrencyAmount(xrpAmountInt), - DeliverMax: types.XRPCurrencyAmount(xrpAmountInt), - } - - flattenedTx := p.Flatten() - - if err := client.Autofill(&flattenedTx); err != nil { - fmt.Println(err) - return - } - - txBlob, _, err := w.Sign(flattenedTx) - if err != nil { - fmt.Println(err) - return - } - - res, err := client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Payment submitted") - fmt.Printf("🌐 Hash: %s\n", res.Hash) - fmt.Printf("🌐 Validated: %t\n", res.Validated) - - fmt.Println() - fmt.Println("⏳ Using SubmitTxAndWait with wallet") - fmt.Println() - - flattenedTx2 := p.Flatten() - resp, err := client.SubmitTxAndWait(flattenedTx2, &wstypes.SubmitOptions{ - Autofill: true, - Wallet: &w, - }) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Payment submitted via SubmitTxAndWait") - fmt.Printf("🌐 Hash: %s\n", resp.Hash) - fmt.Printf("🌐 Validated: %t\n", resp.Validated) +xrpAmountInt, err := strconv.ParseInt(xrpAmount, 10, 64) +if err != nil { + fmt.Println(err) + return +} + +// Prepare a payment transaction +p := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: types.Address(w.GetAddress()), + }, + Destination: "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe", + Amount: types.XRPCurrencyAmount(xrpAmountInt), + DeliverMax: types.XRPCurrencyAmount(xrpAmountInt), +} + +flattenedTx := p.Flatten() + +if err := client.Autofill(&flattenedTx); err != nil { + fmt.Println(err) + return +} + +// Sign the transaction using the wallet +txBlob, _, err := w.Sign(flattenedTx) +if err != nil { + fmt.Println(err) + return +} + +// Submit the transaction and wait for the result +res_blob, err := client.SubmitTxBlobAndWait(txBlob, false) +if err != nil { + fmt.Println(err) + return +} + +// Example with SubmitTxAndWait +flattenedTx2 := p.Flatten() +res_flat, err := client.SubmitTxAndWait(flattenedTx2, &wstypes.SubmitOptions{ + Autofill: true, + Wallet: &w, +}) +if err != nil { + fmt.Println(err) + return +} +// Wait for validation ------------------------------------------------------- +// SubmitTxBlobAndWait() handles this automatically, but it can take 4-7s. + +// Check transaction results ------------------------------------------------- +fmt.Printf("🌐 Hash: %s\n", res_blob.Hash) +fmt.Printf("🌐 Meta: %t\n", res_blob.Meta) +res, _ := client.Request(&transactions.TxRequest{ + Transaction: res_flat.Hash.String(), +}) +fmt.Printf("🌐 Result: %s\n", res.Result) } diff --git a/docs/references/client-libraries.md b/docs/references/client-libraries.md index 1e129c74679..dacecf3ce6d 100644 --- a/docs/references/client-libraries.md +++ b/docs/references/client-libraries.md @@ -13,6 +13,7 @@ For other programming languages, you can access the XRP Ledger through the [HTTP | Language | Library Name | Get Started | API Reference | Source Code | |---------------------------------|---------------------------|-------------|--------------|-------------| | **Python** | `xrpl-py` | [Get Started Using Python](../tutorials/python/build-apps/get-started.md) | [API Reference](https://xrpl-py.readthedocs.io/) | [Repo](https://github.com/XRPLF/xrpl-py) | +| **GoLang** | `xrpl-go` | [Get Started Using Go](../tutorials/go/build-apps/get-started.md) | [API Reference](https://pkg.go.dev/github.com/Peersyst/xrpl-go) | [Repo](https://github.com/Peersyst/xrpl-go) | | **JavaScript** / **TypeScript** | `xrpl.js` | [Get Started](../tutorials/javascript/build-apps/get-started.md) | [API Reference](https://js.xrpl.org/) | [Repo](https://github.com/XRPLF/xrpl.js) | | **JavaScript** / **TypeScript** | `xrpl-client` | [Get Started](https://jsfiddle.net/WietseWind/35az6p1b/) | [NPM Reference](https://www.npmjs.com/package/xrpl-client) | [Repo](https://github.com/XRPL-Labs/xrpl-client) | | **JavaScript** / **TypeScript** | `xrpl-accountlib` | [Get Started](https://jsfiddle.net/WietseWind/gkefpnu0/) | [NPM Reference](https://www.npmjs.com/package/xrpl-accountlib) | [Repo](https://github.com/WietseWind/xrpl-accountlib) | diff --git a/docs/references/index.md b/docs/references/index.md index 3ce41d479e4..ab75af78018 100644 --- a/docs/references/index.md +++ b/docs/references/index.md @@ -16,6 +16,8 @@ Use these libraries to access the XRP Ledger from your programming language of c {% xrpl-card title="Python" body="xrpl.py - a pure Python library" href="https://xrpl-py.readthedocs.io/" image="/img/logos/python.svg" imageAlt="Python logo" /%} +{% xrpl-card title="GoLang" body="xrpl.go - a pure GoLang library" href="https://pkg.go.dev/github.com/Peersyst/xrpl-go" image="/img/logos/golang.svg" imageAlt="GoLang logo" /%} + {% xrpl-card title="Java" body="xrpl4j - a pure Java library" href="https://javadoc.io/doc/org.xrpl/" image="/img/logos/java.svg" imageAlt="Java logo" /%} {% /card-grid %} diff --git a/docs/tutorials/go/build-apps/get-started.md b/docs/tutorials/go/build-apps/get-started.md new file mode 100644 index 00000000000..8f94f0f847a --- /dev/null +++ b/docs/tutorials/go/build-apps/get-started.md @@ -0,0 +1,153 @@ +--- +html: get-started-using-golang-library.html +parent: golang.html +funnel: Build +doc_type: Tutorials +category: Get Started +seo: + description: Build a GoLang application that interacts with the XRP Ledger. +top_nav_name: GoLang +top_nav_grouping: Get Started +labels: + - Development +showcase_icon: assets/img/logos/golang.svg +--- + +# Get Started Using GoLang Library + +This tutorial walks you through the basics of building an XRP Ledger-connected application using [`xrpl-go`](https://github.com/Peersyst/xrpl-go), a pure GoLang library built to interact with the XRP Ledger. + +This tutorial is intended for beginners and should take no longer than 30 minutes to complete. + +## Learning Goals + +In this tutorial, you'll learn: + +- The basic building blocks of XRP Ledger-based applications. +- How to connect to the XRP Ledger using `xrpl-go`. +- How to get an account on the [Testnet](/resources/dev-tools/xrp-faucets) using `xrpl-go`. +- How to use the `xrpl-go` library to look up information about an account on the XRP Ledger. +- How to put these steps together to create a Java app. + +## Requirements + +Requiring Go version `1.22.0` and later. +[Download latest Go version](https://go.dev/dl/) + +## Installation + +The [`xrpl-go` library](https://github.com/Peersyst/xrpl-go) is available on + +Start a new project (or use an existing one) and install the `xrpl-go` library via Go modules: + +```bash +# Initialize your module (if you haven't already) +go mod init your-module-name + +# Fetch the latest version of xrpl-go +go get -u github.com/Peersyst/xrpl-go +``` + +## Start Building + +When you're working with the XRP Ledger, there are a few things you'll need to manage, whether you're adding XRP to your [account](../../../concepts/accounts/index.md), integrating with the [decentralized exchange](../../../concepts/tokens/decentralized-exchange/index.md), or [issuing tokens](../../../concepts/tokens/index.md). This tutorial walks you through basic patterns common to getting started with all of these use cases and provides sample code for implementing them. + +Here are the basic steps you'll need to cover for almost any XRP Ledger project: + +1. [Connect to the XRP Ledger.](#1-connect-to-the-xrp-ledger) +1. [Get an account.](#2-get-account) +1. [Query the XRP Ledger.](#3-query-the-xrp-ledger) + +### 1. Connect to the XRP Ledger + +To make queries and submit transactions, you need to connect to the XRP Ledger. To do this with `xrpl-go`, you have two main options: + +1. Via `websocket`: {% code-snippet file="/_code-samples/get-started/go/base/ws/main.go from="// Define the network client" before="// ... custom code goes here" language="go" /%} +2. Via `RPC`: {% code-snippet file="/_code-samples/get-started/go/base/rpc/main.go from="// Define the network client" before="// Ping the network (used to avoid Go unused variable error, but useful to check connectivity)" language="go" /%} + +#### Connect to the production XRP Ledger + +The sample code in the previous section shows you how to connect to the Testnet, which is a [parallel network](../../../concepts/networks-and-servers/parallel-networks.md) for testing where the money has no real value. When you're ready to integrate with the production XRP Ledger, you'll need to connect to the Mainnet. You can do that in two ways: + +- By [installing the core server](../../../infrastructure/installation/index.md) (`rippled`) and running a node yourself. The core server connects to the Mainnet by default, but you can [change the configuration to use Testnet or Devnet](../../../infrastructure/configuration/connect-your-rippled-to-the-xrp-test-net.md). [There are good reasons to run your own core server](../../../concepts/networks-and-servers/index.md#reasons-to-run-your-own-server). If you run your own server, you can connect to it like so: + + ```go + import "github.com/Peersyst/xrpl-go/xrpl/websocket" + const MyServer := "http://localhost:5005/" + client := websocket.NewClient(websocket.NewClientConfig().WithHost(MyServer)) + ``` + + See the example [core server config file](https://github.com/XRPLF/rippled/blob/c0a0b79d2d483b318ce1d82e526bd53df83a4a2c/cfg/rippled-example.cfg#L1562) for more information about default values. + +- By using one of the available [public servers][]: + + ```go + import "github.com/Peersyst/xrpl-go/xrpl/websocket" + const PublicServer = "wss://xrplcluster.com/" + client := websocket.NewClient(websocket.NewClientConfig().WithHost(PublicServer)) + ``` + +### 2. Get account + +In `xrpl-go`, account creation and key management live in the wallet package, and on Testnet you can use the built-in faucet provider on your WebSocket client to fund a brand-new account immediately. + +Here we spin up a Testnet‐connected WebSocket client, generate a fresh ED25519 wallet, then fund it automatically via the public faucet. + +```go +client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewTestnetFaucetProvider()), +) + +defer client.Disconnect() +if err := client.Connect(); err != nil { + fmt.Println(err) + return +} + +w, err := wallet.New(crypto.ED25519()) +if err != nil { + fmt.Println(err) + return +} +if err := client.FundWallet(&w); err != nil { + fmt.Println(err) + return +} +``` + +This constructor returns a Go `Wallet` value with the following fields: + +```go +type Wallet struct { + PublicKey string // the hex-encoded public key + PrivateKey string // the hex-encoded private key + ClassicAddress types.Address // the XRPL “r…” address + Seed string // the base58 seed +} +``` + +If you already have a seed encoded in [base58][], you can make a `Wallet` instance from it like this: + +```go + w, err := wallet.FromSeed("sn3nxiW7v8KXzPzAqzyHXbSSKNuN9", "") +``` + +### 3. Query the XRP Ledger + +You can query the XRP Ledger to get information about [a specific account](../../../references/http-websocket-apis/public-api-methods/account-methods/index.md), [a specific transaction](../../../references/http-websocket-apis/public-api-methods/transaction-methods/tx.md), the state of a [current or a historical ledger](../../../references/http-websocket-apis/public-api-methods/ledger-methods/index.md), and [the XRP Ledger's decentralized exchange](../../../references/http-websocket-apis/public-api-methods/path-and-order-book-methods/index.md). You need to make these queries, among other reasons, to look up account info to follow best practices for [reliable transaction submission](../../../concepts/transactions/reliable-transaction-submission.md). + +You can use either the Client's `request()` method to access the XRP Ledger's [WebSocket API](../../../references/http-websocket-apis/api-conventions/request-formatting.md). For example: + +{% code-snippet file="/_code-samples/get-tx/go/main.go" from="// Get the latest validated ledger" language="go" /%} + +Or use the [`websocket` or `rpc` packages] getter methods: + +{% code-snippet file="/_code-samples/get-started/go/get-acc-info/ws/main.go" from="// Get info from" before="// Get info about" language="go" /%} + +## Keep on Building + +Now that you know how to use `xrpl.js` to connect to the XRP Ledger, get an account, and look up information about it, you can also: + +- [Send XRP](../../how-tos/send-xrp.md). diff --git a/docs/tutorials/go/build-apps/index.md b/docs/tutorials/go/build-apps/index.md new file mode 100644 index 00000000000..0b3ee025417 --- /dev/null +++ b/docs/tutorials/go/build-apps/index.md @@ -0,0 +1,13 @@ +--- +html: build-apps-with-golang.html +parent: golang.html +top_nav_grouping: Article Types +metadata: + indexPage: true +--- + +# Build Applications with GoLang Library + +Build full-featured applications in GoLang. + +{% child-pages /%} diff --git a/docs/tutorials/go/index.md b/docs/tutorials/go/index.md new file mode 100644 index 00000000000..88796c6186c --- /dev/null +++ b/docs/tutorials/go/index.md @@ -0,0 +1,24 @@ +--- +html: golang.html +parent: tutorials.html +top_nav_grouping: Article Types +metadata: + indexPage: true +--- + +# GoLang + +You can create your own interface to try out the capabilities and support your specific business needs. These tutorials build a test harness interface to try out features of the XRP Ledger. The harness displays multiple accounts, so that you can transfer tokens from one account to the other and see the results in real time. + +Typically, the example functions involve four steps. + +- Connect to the XRP Ledger and instantiate your wallet. +- Make changes to the XRP Ledger using transactions. +- Get the state of accounts and tokens on the XRP Ledger using requests. +- Disconnect from the XRP Ledger. + +Once familiar with the library functions, you can build sample applications in GoLang. We anticipate that the applications you build greatly improve upon these examples. Your feedback and contributions are most welcome. + +## Tutorial Modules + +{% child-pages /%} diff --git a/docs/tutorials/how-tos/send-xrp.md b/docs/tutorials/how-tos/send-xrp.md index b23e5e9191a..de1a6d8508b 100644 --- a/docs/tutorials/how-tos/send-xrp.md +++ b/docs/tutorials/how-tos/send-xrp.md @@ -28,7 +28,7 @@ To interact with the XRP Ledger, you need to set up a dev environment with the n - **Python** with the [`xrpl-py` library](https://xrpl-py.readthedocs.io/). See [Get Started using Python](../python/build-apps/get-started.md) for setup steps. - **Java** with the [xrpl4j library](https://github.com/XRPLF/xrpl4j). See [Get Started Using Java](../java/build-apps/get-started.md) for setup steps. - **PHP** with the [XRPL_PHP library](https://github.com/AlexanderBuzz/xrpl-php). See [Get Started Using PHP](../php/build-apps/get-started.md) for setup steps. - +- **GoLang** with the [xrpl-go library](https://github.com/Peersyst/xrpl-go). See [Get Started Using GoLang](../go/build-apps/get-started.md) for setup steps. ## Send a Payment on the Test Net @@ -54,6 +54,10 @@ To transact on the XRP Ledger, you need an address and secret key, and some XRP. {% code-snippet file="/_code-samples/send-xrp/php/send-xrp.php" from="// Example credentials" before="// Create" language="php" /%} {% /tab %} +{% tab label="GoLang" %} +{% code-snippet file="/_code-samples/send-xrp/go/ws/main.go" from="// Example credentials" before="// Funding" language="go" /%} +{% /tab %} + {% /tabs %} The secret key shown here is for example only. For development purposes, you can get your own credentials, pre-funded with XRP, on the Testnet using the following interface: @@ -87,6 +91,10 @@ The following code connects to a public Testnet servers: {% code-snippet file="/_code-samples/send-xrp/php/send-xrp.php" from="// Create a client" before="// Transaction definition" language="php" /%} {% /tab %} +{% tab label="GoLang" %} +{% code-snippet file="/_code-samples/send-xrp/go/ws/main.go" from="func main()" before="if !client.IsConnected() " language="go" /%} +{% /tab %} + {% /tabs %} For this tutorial, click the following button to connect: @@ -142,6 +150,10 @@ Here's an example of preparing the above payment: {% code-snippet file="/_code-samples/send-xrp/php/send-xrp.php" from="// Transaction definition" before="// Sign" language="php" /%} {% /tab %} +{% tab label="GoLang" %} +{% code-snippet file="/_code-samples/send-xrp/go/ws/main.go" from="// Prepare " before="// Sign" language="go" /%} +{% /tab %} + {% /tabs %} {% interactive-block label="Prepare" steps=$frontmatter.steps %} @@ -172,6 +184,7 @@ Signing a transaction uses your credentials to authorize the transaction on your - **Python:** Use the [`xrpl.transaction.safe_sign_transaction()` method](https://xrpl-py.readthedocs.io/en/latest/source/xrpl.transaction.html#xrpl.transaction.safe_sign_transaction) with a model and `Wallet` object. - **Java:** Use a [`SignatureService`](https://javadoc.io/doc/org.xrpl/xrpl4j-crypto-core/latest/org/xrpl/xrpl4j/crypto/signing/SignatureService.html) instance to sign the transaction. For this tutorial, use the [`SingleKeySignatureService`](https://javadoc.io/doc/org.xrpl/xrpl4j-crypto-bouncycastle/latest/org/xrpl/xrpl4j/crypto/signing/SingleKeySignatureService.html). - **PHP:** Use a [`sign()` method of a `Wallet` instance](https://alexanderbuzz.github.io/xrpl-php-docs/wallet.html#signing-a-transaction) instance to sign the transaction. The input to this step is a completed array of transaction instructions. +- **GoLang:** Use the [`Sign()` method of the `Wallet` package](https://pkg.go.dev/github.com/Peersyst/xrpl-go@v0.1.12/xrpl/wallet) to sign the transaction. {% tabs %} @@ -191,6 +204,10 @@ Signing a transaction uses your credentials to authorize the transaction on your {% code-snippet file="/_code-samples/send-xrp/php/send-xrp.php" from="// Sign" before="// Submit" language="php" /%} {% /tab %} +{% tab label="GoLang" %} +{% code-snippet file="/_code-samples/send-xrp/go/ws/main.go" from="// Sign" before="// Submit" language="go" /%} +{% /tab %} + {% /tabs %} The result of the signing operation is a transaction object containing a signature. Typically, XRP Ledger APIs expect a signed transaction to be the hexadecimal representation of the transaction's canonical [binary format](../../references/protocol/binary-format.md), called a "blob". @@ -199,6 +216,7 @@ The result of the signing operation is a transaction object containing a signatu - In `xrpl-py`, you can get the transaction's hash in the response to submitting it in the next step. - In xrpl4j, `SignatureService.sign` returns a `SignedTransaction`, which contains the transaction's hash, which you can use to look up the transaction later. - In `XRPL_PHP`, the signing API also returns the transaction's ID, or identifying hash, which you can use to look up the transaction later. This is a 64-character hexadecimal string that is unique to this transaction. +- In `xrpl-go`, the signing API also returns the transaction's ID, or identifying hash, which you can use to look up the transaction later. This is a 64-character hexadecimal string that is unique to this transaction. {% interactive-block label="Sign" steps=$frontmatter.steps %} @@ -217,6 +235,7 @@ Now that you have a signed transaction, you can submit it to an XRP Ledger serve - **Python:** Use the [`xrpl.transaction.submit_and_wait()` method](https://xrpl-py.readthedocs.io/en/stable/source/xrpl.transaction.html#xrpl.transaction.submit_and_wait) to submit a transaction to the network and wait for a response. - **Java:** Use the [`XrplClient.submit(SignedTransaction)` method](https://javadoc.io/doc/org.xrpl/xrpl4j-client/latest/org/xrpl/xrpl4j/client/XrplClient.html#submit(org.xrpl.xrpl4j.crypto.signing.SignedTransaction)) to submit a transaction to the network. Use the [`XrplClient.ledger()`](https://javadoc.io/doc/org.xrpl/xrpl4j-client/latest/org/xrpl/xrpl4j/client/XrplClient.html#ledger(org.xrpl.xrpl4j.model.client.ledger.LedgerRequestParams)) method to get the latest validated ledger index. - **PHP:** Use the [`submitAndWait()` method of the Client](https://alexanderbuzz.github.io/xrpl-php-docs/client.html) to submit a transaction to the network and wait for the response. +- **GoLang:** Use [`SubmitTxAndWait()` or `SubmitTxBlobAndWait()` methods os the Client](https://pkg.go.dev/github.com/Peersyst/xrpl-go@v0.1.12/xrpl/websocket#Client.SubmitTxAndWait) to submit a transaction to the network and wait for the response. {% tabs %} @@ -236,6 +255,10 @@ Now that you have a signed transaction, you can submit it to an XRP Ledger serve {% code-snippet file="/_code-samples/send-xrp/php/send-xrp.php" from="// Submit" before="// Wait" language="php" /%} {% /tab %} +{% tab label="GoLang" %} +{% code-snippet file="/_code-samples/send-xrp/go/ws/main.go" from="// Submit" before="// Wait" language="go" /%} +{% /tab %} + {% /tabs %} This method returns the **tentative** result of trying to apply the transaction to the open ledger. This result _can_ change when the transaction is included in a validated ledger: transactions that succeed initially might ultimately fail, and transactions that fail initially might ultimately succeed. Still, the tentative result often matches the final result, so it's OK to get excited if you see `tesSUCCESS` here. 😁 @@ -273,6 +296,8 @@ Most transactions are accepted into the next ledger version after they're submit - **PHP:** If you used the [`.submitAndWait()` method](https://alexanderbuzz.github.io/xrpl-php-docs/client.html), you can wait until the returned Promise resolves. Other, more asynchronous approaches are also possible. +- **GoLang:** If you used the `SubmitTxAndWait()` or `SubmitTxBlobAndWait()` methods, the client will handle submission and wait until the transaction is confirmed in a ledger. Internally, these methods use a polling mechanism, querying the transaction status with the client's `Request()` method and a `TxRequest`. + {% tabs %} {% tab label="JavaScript" %} @@ -291,6 +316,10 @@ Most transactions are accepted into the next ledger version after they're submit {% code-snippet file="/_code-samples/send-xrp/php/send-xrp.php" from="// Wait" before="// Check" language="php" /%} {% /tab %} +{% tab label="GoLang" %} +{% code-snippet file="/_code-samples/send-xrp/go/ws/main.go" from="// Wait" before="// Check" language="go" /%} +{% /tab %} + {% /tabs %} {% partial file="/docs/_snippets/interactive-tutorials/wait-step.md" /%} @@ -310,6 +339,8 @@ To know for sure what a transaction did, you must look up the outcome of the tra - **PHP:** Use the response from `submitAndWait()` or call the `tx method` using [`$client->syncRequest()`](https://alexanderbuzz.github.io/xrpl-php-docs/client.html). +- **GoLang:** Use the response from `SubmitTxAndWait()` or `SubmitTxBlobAndWait()`, or manually query the transaction status using a `TxRequest` with the client's `Request()` method. + {% tabs %} {% tab label="JavaScript" %} @@ -328,6 +359,10 @@ To know for sure what a transaction did, you must look up the outcome of the tra {% code-snippet file="/_code-samples/send-xrp/php/send-xrp.php" from="// Check" language="php" /%} {% /tab %} +{% tab label="GoLang" %} +{% code-snippet file="/_code-samples/send-xrp/go/ws/main.go" from="// Check" language="go" /%} +{% /tab %} + {% /tabs %} {% admonition type="warning" name="Caution" %}XRP Ledger APIs may return tentative results from ledger versions that have not yet been validated. For example, in [tx method][] response, be sure to look for `"validated": true` to confirm that the data comes from a validated ledger version. Transaction results that are not from a validated ledger version are subject to change. For more information, see [Finality of Results](../../concepts/transactions/finality-of-results/index.md).{% /admonition %} @@ -391,6 +426,16 @@ print_r("Seed: " . $wallet->getSeed()); // Example: sp6JS7f14BuwFY8Mw6bTtLKWauoU ``` {% /tab %} +{% tab label="GoLang" %} + +```go +wallet, err := wallet.New(crypto.ED25519()) +fmt.Println("🌐 Classic Address:", wallet.ClassicAddress) // Example: r9ESeQQswbTxV8neiDTLTHXbXfUwiihyJk +fmt.Println("🌐 Seed:", wallet.Seed) // Example: sEd7XGFGSWteam777HQHvw7vHypEWy2 + +``` +{% /tab %} + {% /tabs %} {% admonition type="danger" name="Warning" %}You should only use an address and secret that you generated securely, on your local machine. If another computer generated the address and secret and sent it to you over a network, it's possible that someone else on the network may see that information. If they do, they'll have as much control over your XRP as you do. It's also recommended not to use the same address for the Testnet and Mainnet, because transactions that you created for use on one network could also be valid to execute on the other network, depending on the parameters you provided.{% /admonition %} @@ -433,6 +478,20 @@ $client = new JsonRpcClient("https://xrplcluster.com"); ``` {% /tab %} +{% tab label="GoLang" %} + +```go +client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://xrplcluster.com") +) +if err := client.Connect(); err != nil { + fmt.Println(err) + return +} +``` +{% /tab %} + {% /tabs %} If you [install `rippled`](../../infrastructure/installation/index.md) yourself, it connects to the production network by default. (You can also [configure it to connect to the test net](../../infrastructure/configuration/connect-your-rippled-to-the-xrp-test-net.md) instead.) After the server has synced (typically within about 15 minutes of starting it up), you can connect to it locally, which has [various benefits](../../concepts/networks-and-servers/index.md). The following example shows how to connect to a server running the default configuration: @@ -469,6 +528,20 @@ $client = new JsonRpcClient("http://localhost:5005"); ``` {% /tab %} +{% tab label="GoLang" %} + +```go +client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("http://localhost:5005") +) +if err := client.Connect(); err != nil { + fmt.Println(err) + return +} +``` +{% /tab %} + {% /tabs %} {% admonition type="success" name="Tip" %}The local connection uses an unencrypted protocol (`ws` or `http`) rather than the TLS-encrypted version (`wss` or `https`). This is secure only because the communications never leave the same machine, and is easier to set up because it does not require a TLS certificate. For connections on an outside network, always use `wss` or `https`.{% /admonition %} diff --git a/docs/tutorials/index.md b/docs/tutorials/index.md index 124aa5c2b33..773c1d0b447 100644 --- a/docs/tutorials/index.md +++ b/docs/tutorials/index.md @@ -16,7 +16,7 @@ These tutorials walk you through the basics of building a very simple XRP Ledger {% xrpl-card title="Python" body="Using xrpl.py, a pure Python library." href="/docs/tutorials/python/" image="/img/logos/python.svg" imageAlt="Python logo" /%} -
+{% xrpl-card title="GoLang" body="Using xrpl-go, a pure GoLang library." href="/docs/tutorials/go/" image="/img/logos/golang.svg" imageAlt="GoLang logo" /%} {% xrpl-card title="Java" body="Using xrpl4j, a pure Java library." href="/docs/tutorials/java/" image="/img/logos/java.svg" imageAlt="Java logo" /%} diff --git a/sidebars.yaml b/sidebars.yaml index d6acf43f656..1125575b90f 100644 --- a/sidebars.yaml +++ b/sidebars.yaml @@ -247,6 +247,13 @@ - page: docs/tutorials/python/compliance/index.md items: - page: docs/tutorials/python/compliance/verify-credential.md + - page: docs/tutorials/go/index.md + expanded: false + items: + - page: docs/tutorials/go/build-apps/index.md + expanded: false + items: + - page: docs/tutorials/go/build-apps/get-started.md - page: docs/tutorials/java/index.md expanded: false items: @@ -469,6 +476,9 @@ - label: Ruby Client Library href: https://www.rubydoc.info/gems/xrbp external: true + - label: GoLang Client Library + href: https://pkg.go.dev/github.com/Peersyst/xrpl-go + external: true - page: docs/references/http-websocket-apis/index.md expanded: false items: diff --git a/top-nav.yaml b/top-nav.yaml index 7b5aa6999db..0627ee92a74 100644 --- a/top-nav.yaml +++ b/top-nav.yaml @@ -88,6 +88,7 @@ - page: ./docs/tutorials/python/index.md - page: ./docs/tutorials/java/index.md - page: ./docs/tutorials/php/index.md + - page: ./docs/tutorials/go/index.md - page: ./docs/tutorials/http-websocket-apis/index.md - group: Resources From 7baaa03c2d237a5776aacc45f3eb2dd5390c699c Mon Sep 17 00:00:00 2001 From: banasa44 Date: Tue, 22 Jul 2025 11:30:33 +0200 Subject: [PATCH 07/18] refactor(_code-samples): remove README.md file from code samples --- _code-samples/README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 _code-samples/README.md diff --git a/_code-samples/README.md b/_code-samples/README.md deleted file mode 100644 index e69de29bb2d..00000000000 From 2e45eb7860d618ec1542201e1912f7331bbec9ba Mon Sep 17 00:00:00 2001 From: banasa44 Date: Tue, 22 Jul 2025 11:42:20 +0200 Subject: [PATCH 08/18] refactor(_code-samples): move use-tickets example --- _code-samples/use-tickets/go/{rpc => }/main.go | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename _code-samples/use-tickets/go/{rpc => }/main.go (100%) diff --git a/_code-samples/use-tickets/go/rpc/main.go b/_code-samples/use-tickets/go/main.go similarity index 100% rename from _code-samples/use-tickets/go/rpc/main.go rename to _code-samples/use-tickets/go/main.go From 2aa7d5f4cce2a83ea9a741950c4c5f63a086a6ed Mon Sep 17 00:00:00 2001 From: banasa44 Date: Tue, 22 Jul 2025 11:59:29 +0200 Subject: [PATCH 09/18] chore(docs): small fixes/changes in go tutorials docs --- docs/tutorials/go/build-apps/get-started.md | 5 ++--- docs/tutorials/go/index.md | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/tutorials/go/build-apps/get-started.md b/docs/tutorials/go/build-apps/get-started.md index 8f94f0f847a..631201a446b 100644 --- a/docs/tutorials/go/build-apps/get-started.md +++ b/docs/tutorials/go/build-apps/get-started.md @@ -27,7 +27,6 @@ In this tutorial, you'll learn: - How to connect to the XRP Ledger using `xrpl-go`. - How to get an account on the [Testnet](/resources/dev-tools/xrp-faucets) using `xrpl-go`. - How to use the `xrpl-go` library to look up information about an account on the XRP Ledger. -- How to put these steps together to create a Java app. ## Requirements @@ -73,7 +72,7 @@ The sample code in the previous section shows you how to connect to the Testnet, ```go import "github.com/Peersyst/xrpl-go/xrpl/websocket" - const MyServer := "http://localhost:5005/" + const MyServer := "ws://localhost:6006/" client := websocket.NewClient(websocket.NewClientConfig().WithHost(MyServer)) ``` @@ -89,7 +88,7 @@ The sample code in the previous section shows you how to connect to the Testnet, ### 2. Get account -In `xrpl-go`, account creation and key management live in the wallet package, and on Testnet you can use the built-in faucet provider on your WebSocket client to fund a brand-new account immediately. +In `xrpl-go`, account creation and key management live in the wallet package, and on Testnet you can use the built-in faucet provider on your WebSocket (or RPC) client to fund a brand-new account immediately. Here we spin up a Testnet‐connected WebSocket client, generate a fresh ED25519 wallet, then fund it automatically via the public faucet. diff --git a/docs/tutorials/go/index.md b/docs/tutorials/go/index.md index 88796c6186c..e6baea3531f 100644 --- a/docs/tutorials/go/index.md +++ b/docs/tutorials/go/index.md @@ -8,7 +8,7 @@ metadata: # GoLang -You can create your own interface to try out the capabilities and support your specific business needs. These tutorials build a test harness interface to try out features of the XRP Ledger. The harness displays multiple accounts, so that you can transfer tokens from one account to the other and see the results in real time. +You can create your own interface to try out the capabilities and support your specific business needs. These tutorials build a test harness interface to try out features of the XRP Ledger. Typically, the example functions involve four steps. From 79ed25b125b1aa7c444e150019ddec1951c0643a Mon Sep 17 00:00:00 2001 From: banasa44 Date: Tue, 22 Jul 2025 17:08:38 +0200 Subject: [PATCH 10/18] chore(docs): small style and comments changes and fixes --- _code-samples/get-started/go/base/rpc/main.go | 2 ++ _code-samples/get-started/go/base/ws/main.go | 3 +- docs/tutorials/go/build-apps/get-started.md | 28 +++++++++++++++++-- docs/tutorials/go/build-apps/index.md | 2 +- 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/_code-samples/get-started/go/base/rpc/main.go b/_code-samples/get-started/go/base/rpc/main.go index 61ec4c01016..e4633862548 100644 --- a/_code-samples/get-started/go/base/rpc/main.go +++ b/_code-samples/get-started/go/base/rpc/main.go @@ -21,4 +21,6 @@ func main() { panic(err) } + // ... custom code goes here + } diff --git a/_code-samples/get-started/go/base/ws/main.go b/_code-samples/get-started/go/base/ws/main.go index 1d165413911..dad84126f16 100644 --- a/_code-samples/get-started/go/base/ws/main.go +++ b/_code-samples/get-started/go/base/ws/main.go @@ -9,7 +9,8 @@ import ( func main() { // Define the network client - client := websocket.NewClient(websocket.NewClientConfig().WithHost("wss://s.altnet.rippletest.net:51233")) + client := websocket.NewClient(websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net:51233")) // Disconnect the client when done. (Defer executes at the end of the function) defer client.Disconnect() diff --git a/docs/tutorials/go/build-apps/get-started.md b/docs/tutorials/go/build-apps/get-started.md index 631201a446b..3c956b0bc82 100644 --- a/docs/tutorials/go/build-apps/get-started.md +++ b/docs/tutorials/go/build-apps/get-started.md @@ -61,8 +61,32 @@ Here are the basic steps you'll need to cover for almost any XRP Ledger project: To make queries and submit transactions, you need to connect to the XRP Ledger. To do this with `xrpl-go`, you have two main options: -1. Via `websocket`: {% code-snippet file="/_code-samples/get-started/go/base/ws/main.go from="// Define the network client" before="// ... custom code goes here" language="go" /%} -2. Via `RPC`: {% code-snippet file="/_code-samples/get-started/go/base/rpc/main.go from="// Define the network client" before="// Ping the network (used to avoid Go unused variable error, but useful to check connectivity)" language="go" /%} +1. Via `websocket`: + ```go + // Define the network client + client := websocket.NewClient(websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net:51233")) + + // Disconnect the client when done. (Defer executes at the end of the function) + defer client.Disconnect() + + // Connect to the network + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + ``` +2. Via `RPC`: + ```go + cfg, err := rpc.NewClientConfig("https://s.altnet.rippletest.net:51234/") + if err != nil { + panic(err) + } + + // Initiate the network client + client := rpc.NewClient(cfg) + ``` + #### Connect to the production XRP Ledger diff --git a/docs/tutorials/go/build-apps/index.md b/docs/tutorials/go/build-apps/index.md index 0b3ee025417..d2d4fd8edd7 100644 --- a/docs/tutorials/go/build-apps/index.md +++ b/docs/tutorials/go/build-apps/index.md @@ -1,5 +1,5 @@ --- -html: build-apps-with-golang.html +html: build-apps-in-golang.html parent: golang.html top_nav_grouping: Article Types metadata: From 0ab859343d7df5fcfb2c814f987a4deef11874f2 Mon Sep 17 00:00:00 2001 From: banasa44 Date: Tue, 22 Jul 2025 17:28:54 +0200 Subject: [PATCH 11/18] chore(docs): small fixes --- docs/tutorials/go/build-apps/get-started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorials/go/build-apps/get-started.md b/docs/tutorials/go/build-apps/get-started.md index 3c956b0bc82..96881c298ec 100644 --- a/docs/tutorials/go/build-apps/get-started.md +++ b/docs/tutorials/go/build-apps/get-started.md @@ -165,7 +165,7 @@ You can use either the Client's `request()` method to access the XRP Ledger's [W {% code-snippet file="/_code-samples/get-tx/go/main.go" from="// Get the latest validated ledger" language="go" /%} -Or use the [`websocket` or `rpc` packages] getter methods: +Or use the [`websocket` or `rpc` packages](https://pkg.go.dev/github.com/Peersyst/xrpl-go@v0.1.12/xrpl/websocket#Client.GetAccountChannels) getter methods: {% code-snippet file="/_code-samples/get-started/go/get-acc-info/ws/main.go" from="// Get info from" before="// Get info about" language="go" /%} From 1009242c6a1348501f40f6047fa5a8052db709e0 Mon Sep 17 00:00:00 2001 From: banasa44 Date: Tue, 22 Jul 2025 17:29:26 +0200 Subject: [PATCH 12/18] chore(docs): small fixes --- docs/tutorials/how-tos/send-xrp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorials/how-tos/send-xrp.md b/docs/tutorials/how-tos/send-xrp.md index de1a6d8508b..a5aa52e03cb 100644 --- a/docs/tutorials/how-tos/send-xrp.md +++ b/docs/tutorials/how-tos/send-xrp.md @@ -533,7 +533,7 @@ $client = new JsonRpcClient("http://localhost:5005"); ```go client := websocket.NewClient( websocket.NewClientConfig(). - WithHost("http://localhost:5005") + WithHost("ws://localhost:6006") ) if err := client.Connect(); err != nil { fmt.Println(err) From 6de921ccfb0ffb0105f600adf59d86ac89bc2f9e Mon Sep 17 00:00:00 2001 From: banasa44 Date: Tue, 22 Jul 2025 18:13:00 +0200 Subject: [PATCH 13/18] feat(samples): add go examples, secure signing and send a memo --- _code-samples/secure-signing/go/go.mod | 19 ++++ _code-samples/secure-signing/go/go.sum | 45 +++++++++ _code-samples/secure-signing/go/main.go | 42 ++++++++ _code-samples/send-a-memo/go/go.mod | 24 +++++ _code-samples/send-a-memo/go/go.sum | 58 +++++++++++ _code-samples/send-a-memo/go/rpc/main.go | 115 +++++++++++++++++++++ _code-samples/send-a-memo/go/ws/main.go | 121 +++++++++++++++++++++++ 7 files changed, 424 insertions(+) create mode 100644 _code-samples/secure-signing/go/go.mod create mode 100644 _code-samples/secure-signing/go/go.sum create mode 100644 _code-samples/secure-signing/go/main.go create mode 100644 _code-samples/send-a-memo/go/go.mod create mode 100644 _code-samples/send-a-memo/go/go.sum create mode 100644 _code-samples/send-a-memo/go/rpc/main.go create mode 100644 _code-samples/send-a-memo/go/ws/main.go diff --git a/_code-samples/secure-signing/go/go.mod b/_code-samples/secure-signing/go/go.mod new file mode 100644 index 00000000000..5bb66b65afd --- /dev/null +++ b/_code-samples/secure-signing/go/go.mod @@ -0,0 +1,19 @@ +module github.com/XRPLF + +go 1.23.0 + +toolchain go1.23.10 + +require github.com/Peersyst/xrpl-go v0.1.11 + +require ( + github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect + github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect + github.com/decred/dcrd/crypto/ripemd160 v1.0.2 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/tyler-smith/go-bip32 v1.0.0 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + golang.org/x/crypto v0.23.0 // indirect +) diff --git a/_code-samples/secure-signing/go/go.sum b/_code-samples/secure-signing/go/go.sum new file mode 100644 index 00000000000..6746307d709 --- /dev/null +++ b/_code-samples/secure-signing/go/go.sum @@ -0,0 +1,45 @@ +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc= +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= +github.com/Peersyst/xrpl-go v0.1.11 h1:P6r/gHxRnbAtAdPmzNHz/7zpsdfvwh0SS+QI2JNT44w= +github.com/Peersyst/xrpl-go v0.1.11/go.mod h1:CBRM3/soqNeeL2Jx6USVUtECqulZVUoq3UxZKMz9hdw= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2 h1:TvGTmUBHDU75OHro9ojPLK+Yv7gDl2hnUvRocRCjsys= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2/go.mod h1:uGfjDyePSpa75cSQLzNdVmWlbQMBuiJkvXw/MNKRY4M= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.1.5-0.20170601210322-f6abca593680/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/tyler-smith/go-bip32 v1.0.0 h1:sDR9juArbUgX+bO/iblgZnMPeWY1KZMUC2AFUJdv5KE= +github.com/tyler-smith/go-bip32 v1.0.0/go.mod h1:onot+eHknzV4BVPwrzqY5OoVpyCvnwD7lMawL5aQupE= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= diff --git a/_code-samples/secure-signing/go/main.go b/_code-samples/secure-signing/go/main.go new file mode 100644 index 00000000000..daca4f3bd87 --- /dev/null +++ b/_code-samples/secure-signing/go/main.go @@ -0,0 +1,42 @@ +package main + +import ( + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" +) + +func main() { + w, err := wallet.New(crypto.ED25519()) + if err != nil { + panic(err) + } + + p := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: types.Address(w.GetAddress()), + Fee: types.XRPCurrencyAmount(13), + Sequence: 1, + Flags: 2147483648, + LastLedgerSequence: 7835923, + }, + Destination: "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe", + Amount: types.XRPCurrencyAmount(10000), + DeliverMax: types.XRPCurrencyAmount(10000), + } + + flattenedTx := p.Flatten() + + fmt.Println("Payment object created:", flattenedTx) + + signedTx, txHash, err := w.Sign(flattenedTx) + if err != nil { + panic(err) + } + + fmt.Println("Transaction signed successfully:", signedTx) + fmt.Println("Transaction hash:", txHash) +} diff --git a/_code-samples/send-a-memo/go/go.mod b/_code-samples/send-a-memo/go/go.mod new file mode 100644 index 00000000000..fa9fde5d08c --- /dev/null +++ b/_code-samples/send-a-memo/go/go.mod @@ -0,0 +1,24 @@ +module github.com/XRPLF + +go 1.23.0 + +toolchain go1.23.10 + +require github.com/Peersyst/xrpl-go v0.1.11 + +require ( + github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect + github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect + github.com/decred/dcrd/crypto/ripemd160 v1.0.2 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/tyler-smith/go-bip32 v1.0.0 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + golang.org/x/crypto v0.23.0 // indirect +) diff --git a/_code-samples/send-a-memo/go/go.sum b/_code-samples/send-a-memo/go/go.sum new file mode 100644 index 00000000000..8d8522a619c --- /dev/null +++ b/_code-samples/send-a-memo/go/go.sum @@ -0,0 +1,58 @@ +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc= +github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc= +github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= +github.com/Peersyst/xrpl-go v0.1.11 h1:P6r/gHxRnbAtAdPmzNHz/7zpsdfvwh0SS+QI2JNT44w= +github.com/Peersyst/xrpl-go v0.1.11/go.mod h1:CBRM3/soqNeeL2Jx6USVUtECqulZVUoq3UxZKMz9hdw= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2 h1:TvGTmUBHDU75OHro9ojPLK+Yv7gDl2hnUvRocRCjsys= +github.com/decred/dcrd/crypto/ripemd160 v1.0.2/go.mod h1:uGfjDyePSpa75cSQLzNdVmWlbQMBuiJkvXw/MNKRY4M= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.1.5-0.20170601210322-f6abca593680/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/tyler-smith/go-bip32 v1.0.0 h1:sDR9juArbUgX+bO/iblgZnMPeWY1KZMUC2AFUJdv5KE= +github.com/tyler-smith/go-bip32 v1.0.0/go.mod h1:onot+eHknzV4BVPwrzqY5OoVpyCvnwD7lMawL5aQupE= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= diff --git a/_code-samples/send-a-memo/go/rpc/main.go b/_code-samples/send-a-memo/go/rpc/main.go new file mode 100644 index 00000000000..0842b072bd0 --- /dev/null +++ b/_code-samples/send-a-memo/go/rpc/main.go @@ -0,0 +1,115 @@ +package main + +import ( + "encoding/hex" + "fmt" + "strconv" + + "github.com/Peersyst/xrpl-go/xrpl/currency" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" +) + +func main() { + w, err := wallet.FromSeed("sEdSMVV4dJ1JbdBxmakRR4Puu3XVZz2", "") + if err != nil { + fmt.Println(err) + return + } + + receiverWallet, err := wallet.FromSeed("sEd7d8Ci9nevdLCeUMctF3uGXp9WQqJ", "") + if err != nil { + fmt.Println(err) + return + } + + cfg, err := rpc.NewClientConfig( + "https://s.altnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + client := rpc.NewClient(cfg) + + balance, err := client.GetXrpBalance(w.GetAddress()) + + if err != nil || balance == "0" { + fmt.Println("⏳ Funding wallet...") + err = client.FundWallet(&w) + if err != nil { + fmt.Println(err) + return + } + fmt.Println("💸 Wallet funded") + } + + balance, _ = client.GetXrpBalance(w.GetAddress()) + + fmt.Printf("💸 Balance: %s\n", balance) + + amount, err := currency.XrpToDrops("1") + if err != nil { + fmt.Println(err) + return + } + + amountUint, err := strconv.ParseUint(amount, 10, 64) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Sending payment...") + payment := transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(w.GetAddress()), + Memos: []types.MemoWrapper{ + { + Memo: types.Memo{ + MemoData: hex.EncodeToString([]byte("Hello, World!")), + MemoFormat: hex.EncodeToString([]byte("plain")), + MemoType: hex.EncodeToString([]byte("message")), + }, + }, + { + Memo: types.Memo{ + MemoData: hex.EncodeToString([]byte("Hello, World 2!")), + MemoFormat: hex.EncodeToString([]byte("text/plain")), + MemoType: hex.EncodeToString([]byte("message2")), + }, + }, + }, + }, + Destination: types.Address(receiverWallet.GetAddress()), + Amount: types.XRPCurrencyAmount(amountUint), + } + + flatTx := payment.Flatten() + + err = client.Autofill(&flatTx) + if err != nil { + fmt.Println(err) + return + } + + txBlob, _, err := w.Sign(flatTx) + if err != nil { + fmt.Println(err) + return + } + + response, err := client.SubmitTxBlobAndWait(txBlob, true) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Payment submitted") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Printf("🌐 Validated: %t\n", response.Validated) +} diff --git a/_code-samples/send-a-memo/go/ws/main.go b/_code-samples/send-a-memo/go/ws/main.go new file mode 100644 index 00000000000..4fdc94f8df6 --- /dev/null +++ b/_code-samples/send-a-memo/go/ws/main.go @@ -0,0 +1,121 @@ +package main + +import ( + "encoding/hex" + "fmt" + "strconv" + + "github.com/Peersyst/xrpl-go/xrpl/currency" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" +) + +func main() { + w, err := wallet.FromSeed("sEdSMVV4dJ1JbdBxmakRR4Puu3XVZz2", "") + if err != nil { + fmt.Println(err) + return + } + + receiverWallet, err := wallet.FromSeed("sEd7d8Ci9nevdLCeUMctF3uGXp9WQqJ", "") + if err != nil { + fmt.Println(err) + return + } + + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + defer client.Disconnect() + + fmt.Println("⏳ Connecting to server...") + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Connected to server") + fmt.Println() + + balance, err := client.GetXrpBalance(w.GetAddress()) + + if err != nil || balance == "0" { + fmt.Println("⏳ Funding wallet...") + err = client.FundWallet(&w) + if err != nil { + fmt.Println(err) + return + } + fmt.Println("💸 Wallet funded") + } + + balance, _ = client.GetXrpBalance(w.GetAddress()) + + fmt.Printf("💸 Balance: %s\n", balance) + + amount, err := currency.XrpToDrops("1") + if err != nil { + fmt.Println(err) + return + } + + amountUint, err := strconv.ParseUint(amount, 10, 64) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Sending payment...") + payment := transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(w.GetAddress()), + Memos: []types.MemoWrapper{ + { + Memo: types.Memo{ + MemoData: hex.EncodeToString([]byte("Hello, World!")), + MemoFormat: hex.EncodeToString([]byte("plain")), + MemoType: hex.EncodeToString([]byte("message")), + }, + }, + { + Memo: types.Memo{ + MemoData: hex.EncodeToString([]byte("Hello, World 2!")), + MemoFormat: hex.EncodeToString([]byte("text/plain")), + MemoType: hex.EncodeToString([]byte("message2")), + }, + }, + }, + }, + Destination: types.Address(receiverWallet.GetAddress()), + Amount: types.XRPCurrencyAmount(amountUint), + } + + flatTx := payment.Flatten() + + err = client.Autofill(&flatTx) + if err != nil { + fmt.Println(err) + return + } + + txBlob, _, err := w.Sign(flatTx) + if err != nil { + fmt.Println(err) + return + } + + response, err := client.SubmitTxBlobAndWait(txBlob, true) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Payment submitted") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Printf("🌐 Validated: %t\n", response.Validated) +} From e1153eb00897add1272e3bddb1a81aaa74edc640 Mon Sep 17 00:00:00 2001 From: banasa44 Date: Wed, 23 Jul 2025 10:51:03 +0200 Subject: [PATCH 14/18] chore(samples): replace tab for 4 spaces --- _code-samples/batch/go/rpc/main.go | 396 +++---- _code-samples/batch/go/ws/main.go | 400 +++---- _code-samples/checks/go/rpc/main.go | 310 ++--- _code-samples/checks/go/ws/main.go | 332 +++--- _code-samples/clawback/go/rpc/main.go | 482 ++++---- _code-samples/clawback/go/ws/main.go | 496 ++++---- _code-samples/credential/go/rpc/main.go | 204 ++-- _code-samples/credential/go/ws/main.go | 228 ++-- _code-samples/delegate-set/go/rpc/main.go | 248 ++-- _code-samples/delegate-set/go/ws/main.go | 288 ++--- _code-samples/deposit-preauth/go/rpc/main.go | 426 +++---- _code-samples/deposit-preauth/go/ws/main.go | 452 +++---- _code-samples/freeze/go/rpc/main.go | 652 +++++------ _code-samples/freeze/go/ws/main.go | 670 +++++------ _code-samples/get-started/go/base/rpc/main.go | 30 +- _code-samples/get-started/go/base/ws/main.go | 26 +- .../get-started/go/get-acc-info/rpc/main.go | 94 +- .../get-started/go/get-acc-info/ws/main.go | 114 +- _code-samples/get-tx/go/main.go | 68 +- _code-samples/issue-a-token/go/rpc/main.go | 1026 ++++++++-------- _code-samples/issue-a-token/go/ws/main.go | 1038 ++++++++--------- .../go/monitor-incoming-payments.go | 154 +-- _code-samples/multisigning/go/rpc/main.go | 318 ++--- _code-samples/multisigning/go/ws/main.go | 348 +++--- .../go/nft-accept/rpc/main.go | 242 ++-- .../go/nft-accept/ws/main.go | 228 ++-- .../go/nft-burn/rpc/main.go | 214 ++-- .../non-fungible-token/go/nft-burn/ws/main.go | 232 ++-- .../go/nft-cancel/rpc/main.go | 312 ++--- .../go/nft-cancel/ws/main.go | 330 +++--- .../go/nft-modify/rpc/main.go | 180 +-- .../go/nft-modify/ws/main.go | 194 +-- _code-samples/partial-payment/go/rpc/main.go | 322 ++--- _code-samples/partial-payment/go/ws/main.go | 344 +++--- _code-samples/paths/go/rpc/main.go | 192 +-- _code-samples/paths/go/ws/main.go | 214 ++-- _code-samples/secure-signing/go/main.go | 68 +- _code-samples/send-a-memo/go/rpc/main.go | 216 ++-- _code-samples/send-a-memo/go/ws/main.go | 228 ++-- _code-samples/send-xrp/go/rpc/main.go | 196 ++-- _code-samples/send-xrp/go/ws/main.go | 86 +- _code-samples/set-regular-key/go/rpc/main.go | 248 ++-- _code-samples/set-regular-key/go/ws/main.go | 270 ++--- _code-samples/use-tickets/go/main.go | 254 ++-- 44 files changed, 6685 insertions(+), 6685 deletions(-) diff --git a/_code-samples/batch/go/rpc/main.go b/_code-samples/batch/go/rpc/main.go index 3675a7432d7..8280b1b032e 100644 --- a/_code-samples/batch/go/rpc/main.go +++ b/_code-samples/batch/go/rpc/main.go @@ -1,208 +1,208 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/rpc/types" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/rpc/types" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) var ( - CreatePaymentTx = func(sender, receiver *wallet.Wallet, amount txnTypes.CurrencyAmount) *transaction.Payment { - return &transaction.Payment{ - BaseTx: transaction.BaseTx{ - Account: sender.GetAddress(), - TransactionType: transaction.PaymentTx, - Flags: txnTypes.TfInnerBatchTxn, - }, - Amount: amount, - Destination: receiver.GetAddress(), - } - } + CreatePaymentTx = func(sender, receiver *wallet.Wallet, amount txnTypes.CurrencyAmount) *transaction.Payment { + return &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: sender.GetAddress(), + TransactionType: transaction.PaymentTx, + Flags: txnTypes.TfInnerBatchTxn, + }, + Amount: amount, + Destination: receiver.GetAddress(), + } + } ) func main() { - // Configure the client - cfg, err := rpc.NewClientConfig( - "https://s.devnet.rippletest.net:51234/", - rpc.WithFaucetProvider(faucet.NewDevnetFaucetProvider()), - ) - if err != nil { - panic(err) - } - client := rpc.NewClient(cfg) - - // Create and fund wallets - userWallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - - user2Wallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - - receiverWallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("⏳ Funding wallets...") - if err := client.FundWallet(&userWallet); err != nil { - fmt.Println(err) - return - } - if err := client.FundWallet(&user2Wallet); err != nil { - fmt.Println(err) - return - } - fmt.Println("💸 Wallets funded") - - // Check initial balances - userBalance, err := client.GetXrpBalance(userWallet.ClassicAddress) - if err != nil { - userBalance = "0" - } - user2Balance, err := client.GetXrpBalance(user2Wallet.ClassicAddress) - if err != nil { - user2Balance = "0" - } - - receiverBalance, err := client.GetXrpBalance(receiverWallet.ClassicAddress) - if err != nil { - receiverBalance = "0" - } - - fmt.Printf("💳 User initial balance: %s XRP\n", userBalance) - fmt.Printf("💳 User2 initial balance: %s XRP\n", user2Balance) - fmt.Printf("💳 Receiver initial balance: %s XRP\n", receiverBalance) - fmt.Println() - - fmt.Printf("Batch transaction test\n") - - // Create test batch transaction - batchTx := &transaction.Batch{ - BaseTx: transaction.BaseTx{ - Account: txnTypes.Address(userWallet.ClassicAddress), - TransactionType: transaction.BatchTx, - }, - RawTransactions: []txnTypes.RawTransaction{ - {RawTransaction: CreatePaymentTx(&userWallet, &receiverWallet, txnTypes.XRPCurrencyAmount(5000000)).Flatten()}, - {RawTransaction: CreatePaymentTx(&userWallet, &receiverWallet, txnTypes.XRPCurrencyAmount(5000000)).Flatten()}, - }, - } - batchTx.SetAllOrNothingFlag() - - flattenedBatchTx := batchTx.Flatten() - fmt.Println("⏳ Autofilling flattened batch transaction...") - if err := client.Autofill(&flattenedBatchTx); err != nil { - fmt.Println("Autofill error:", err) - return - } - - fmt.Println("⏳ Signing batch transaction...") - response, err := client.SubmitTxAndWait(flattenedBatchTx, &types.SubmitOptions{ - Autofill: false, - Wallet: &userWallet, - }) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Batch transaction submitted") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Printf("🌐 Validated: %t\n", response.Validated) - fmt.Println() - - // Check final balances - finalUserBalance, err := client.GetXrpBalance(userWallet.ClassicAddress) - if err != nil { - finalUserBalance = "0" - } - finalReceiverBalance, err := client.GetXrpBalance(receiverWallet.ClassicAddress) - if err != nil { - finalReceiverBalance = "0" - } - - fmt.Printf("💳 User final balance: %s XRP\n", finalUserBalance) - - fmt.Printf("💳 Receiver final balance: %s XRP\n", finalReceiverBalance) - - fmt.Println() - fmt.Printf("Multisig Batch transaction test\n") - - // Create test batch transaction - multiBatchTx := &transaction.Batch{ - BaseTx: transaction.BaseTx{ - Account: txnTypes.Address(userWallet.ClassicAddress), - TransactionType: transaction.BatchTx, - }, - RawTransactions: []txnTypes.RawTransaction{ - {RawTransaction: CreatePaymentTx(&userWallet, &receiverWallet, txnTypes.XRPCurrencyAmount(5000000)).Flatten()}, - {RawTransaction: CreatePaymentTx(&user2Wallet, &receiverWallet, txnTypes.XRPCurrencyAmount(5000000)).Flatten()}, - }, - BatchSigners: []txnTypes.BatchSigner{ - { - BatchSigner: txnTypes.BatchSignerData{ - Account: txnTypes.Address(user2Wallet.ClassicAddress), - SigningPubKey: user2Wallet.PublicKey, - }, - }, - }, - } - multiBatchTx.SetAllOrNothingFlag() - - flattenedMultiBatchTx := multiBatchTx.Flatten() - fmt.Println("⏳ Autofilling flattened multi batch transaction...") - if err := client.AutofillMultisigned(&flattenedMultiBatchTx, 1); err != nil { - fmt.Println("Autofill error:", err) - return - } - - fmt.Println("⏳ Signing multi batch transaction...") - if err := wallet.SignMultiBatch(user2Wallet, &flattenedMultiBatchTx, nil); err != nil { - fmt.Println("Signing error:", err) - return - } - - response, err = client.SubmitTxAndWait(flattenedMultiBatchTx, &types.SubmitOptions{ - Autofill: false, - Wallet: &userWallet, - }) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Multisig Batch transaction submitted") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Printf("🌐 Validated: %t\n", response.Validated) - fmt.Println() - - // Check final balances - finalUser2Balance, err := client.GetXrpBalance(user2Wallet.ClassicAddress) - if err != nil { - finalUser2Balance = "0" - } - finalUserBalance, err = client.GetXrpBalance(userWallet.ClassicAddress) - if err != nil { - finalUserBalance = "0" - } - finalReceiverBalance, err = client.GetXrpBalance(receiverWallet.ClassicAddress) - if err != nil { - finalReceiverBalance = "0" - } - fmt.Printf("💳 User final balance: %s XRP\n", finalUserBalance) - fmt.Printf("💳 User2 final balance: %s XRP\n", finalUser2Balance) - fmt.Printf("💳 Receiver final balance: %s XRP\n", finalReceiverBalance) + // Configure the client + cfg, err := rpc.NewClientConfig( + "https://s.devnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + client := rpc.NewClient(cfg) + + // Create and fund wallets + userWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + user2Wallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + receiverWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Funding wallets...") + if err := client.FundWallet(&userWallet); err != nil { + fmt.Println(err) + return + } + if err := client.FundWallet(&user2Wallet); err != nil { + fmt.Println(err) + return + } + fmt.Println("💸 Wallets funded") + + // Check initial balances + userBalance, err := client.GetXrpBalance(userWallet.ClassicAddress) + if err != nil { + userBalance = "0" + } + user2Balance, err := client.GetXrpBalance(user2Wallet.ClassicAddress) + if err != nil { + user2Balance = "0" + } + + receiverBalance, err := client.GetXrpBalance(receiverWallet.ClassicAddress) + if err != nil { + receiverBalance = "0" + } + + fmt.Printf("💳 User initial balance: %s XRP\n", userBalance) + fmt.Printf("💳 User2 initial balance: %s XRP\n", user2Balance) + fmt.Printf("💳 Receiver initial balance: %s XRP\n", receiverBalance) + fmt.Println() + + fmt.Printf("Batch transaction test\n") + + // Create test batch transaction + batchTx := &transaction.Batch{ + BaseTx: transaction.BaseTx{ + Account: txnTypes.Address(userWallet.ClassicAddress), + TransactionType: transaction.BatchTx, + }, + RawTransactions: []txnTypes.RawTransaction{ + {RawTransaction: CreatePaymentTx(&userWallet, &receiverWallet, txnTypes.XRPCurrencyAmount(5000000)).Flatten()}, + {RawTransaction: CreatePaymentTx(&userWallet, &receiverWallet, txnTypes.XRPCurrencyAmount(5000000)).Flatten()}, + }, + } + batchTx.SetAllOrNothingFlag() + + flattenedBatchTx := batchTx.Flatten() + fmt.Println("⏳ Autofilling flattened batch transaction...") + if err := client.Autofill(&flattenedBatchTx); err != nil { + fmt.Println("Autofill error:", err) + return + } + + fmt.Println("⏳ Signing batch transaction...") + response, err := client.SubmitTxAndWait(flattenedBatchTx, &types.SubmitOptions{ + Autofill: false, + Wallet: &userWallet, + }) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Batch transaction submitted") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Printf("🌐 Validated: %t\n", response.Validated) + fmt.Println() + + // Check final balances + finalUserBalance, err := client.GetXrpBalance(userWallet.ClassicAddress) + if err != nil { + finalUserBalance = "0" + } + finalReceiverBalance, err := client.GetXrpBalance(receiverWallet.ClassicAddress) + if err != nil { + finalReceiverBalance = "0" + } + + fmt.Printf("💳 User final balance: %s XRP\n", finalUserBalance) + + fmt.Printf("💳 Receiver final balance: %s XRP\n", finalReceiverBalance) + + fmt.Println() + fmt.Printf("Multisig Batch transaction test\n") + + // Create test batch transaction + multiBatchTx := &transaction.Batch{ + BaseTx: transaction.BaseTx{ + Account: txnTypes.Address(userWallet.ClassicAddress), + TransactionType: transaction.BatchTx, + }, + RawTransactions: []txnTypes.RawTransaction{ + {RawTransaction: CreatePaymentTx(&userWallet, &receiverWallet, txnTypes.XRPCurrencyAmount(5000000)).Flatten()}, + {RawTransaction: CreatePaymentTx(&user2Wallet, &receiverWallet, txnTypes.XRPCurrencyAmount(5000000)).Flatten()}, + }, + BatchSigners: []txnTypes.BatchSigner{ + { + BatchSigner: txnTypes.BatchSignerData{ + Account: txnTypes.Address(user2Wallet.ClassicAddress), + SigningPubKey: user2Wallet.PublicKey, + }, + }, + }, + } + multiBatchTx.SetAllOrNothingFlag() + + flattenedMultiBatchTx := multiBatchTx.Flatten() + fmt.Println("⏳ Autofilling flattened multi batch transaction...") + if err := client.AutofillMultisigned(&flattenedMultiBatchTx, 1); err != nil { + fmt.Println("Autofill error:", err) + return + } + + fmt.Println("⏳ Signing multi batch transaction...") + if err := wallet.SignMultiBatch(user2Wallet, &flattenedMultiBatchTx, nil); err != nil { + fmt.Println("Signing error:", err) + return + } + + response, err = client.SubmitTxAndWait(flattenedMultiBatchTx, &types.SubmitOptions{ + Autofill: false, + Wallet: &userWallet, + }) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Multisig Batch transaction submitted") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Printf("🌐 Validated: %t\n", response.Validated) + fmt.Println() + + // Check final balances + finalUser2Balance, err := client.GetXrpBalance(user2Wallet.ClassicAddress) + if err != nil { + finalUser2Balance = "0" + } + finalUserBalance, err = client.GetXrpBalance(userWallet.ClassicAddress) + if err != nil { + finalUserBalance = "0" + } + finalReceiverBalance, err = client.GetXrpBalance(receiverWallet.ClassicAddress) + if err != nil { + finalReceiverBalance = "0" + } + fmt.Printf("💳 User final balance: %s XRP\n", finalUserBalance) + fmt.Printf("💳 User2 final balance: %s XRP\n", finalUser2Balance) + fmt.Printf("💳 Receiver final balance: %s XRP\n", finalReceiverBalance) } diff --git a/_code-samples/batch/go/ws/main.go b/_code-samples/batch/go/ws/main.go index db6bd304ba9..921986e8b2b 100644 --- a/_code-samples/batch/go/ws/main.go +++ b/_code-samples/batch/go/ws/main.go @@ -1,210 +1,210 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" - "github.com/Peersyst/xrpl-go/xrpl/websocket/types" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" + "github.com/Peersyst/xrpl-go/xrpl/websocket/types" ) var ( - CreatePaymentTx = func(sender, receiver *wallet.Wallet, amount txnTypes.CurrencyAmount) *transaction.Payment { - return &transaction.Payment{ - BaseTx: transaction.BaseTx{ - Account: sender.GetAddress(), - TransactionType: transaction.PaymentTx, - Flags: txnTypes.TfInnerBatchTxn, - }, - Amount: amount, - Destination: receiver.GetAddress(), - } - } + CreatePaymentTx = func(sender, receiver *wallet.Wallet, amount txnTypes.CurrencyAmount) *transaction.Payment { + return &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: sender.GetAddress(), + TransactionType: transaction.PaymentTx, + Flags: txnTypes.TfInnerBatchTxn, + }, + Amount: amount, + Destination: receiver.GetAddress(), + } + } ) func main() { - // Connect to testnet - client := websocket.NewClient( - websocket.NewClientConfig(). - WithHost("wss://s.devnet.rippletest.net:51233"). - WithFaucetProvider(faucet.NewDevnetFaucetProvider()), - ) - defer client.Disconnect() - - if err := client.Connect(); err != nil { - fmt.Println(err) - return - } - - // Create and fund wallets - userWallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - - user2Wallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - receiverWallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("⏳ Funding wallets...") - if err := client.FundWallet(&userWallet); err != nil { - fmt.Println(err) - return - } - if err := client.FundWallet(&user2Wallet); err != nil { - fmt.Println(err) - return - } - fmt.Println("💸 Wallets funded") - - // Check initial balances - userBalance, err := client.GetXrpBalance(userWallet.ClassicAddress) - if err != nil { - userBalance = "0" - } - user2Balance, err := client.GetXrpBalance(user2Wallet.ClassicAddress) - if err != nil { - user2Balance = "0" - } - - receiverBalance, err := client.GetXrpBalance(receiverWallet.ClassicAddress) - if err != nil { - receiverBalance = "0" - } - - fmt.Printf("💳 User initial balance: %s XRP\n", userBalance) - fmt.Printf("💳 User2 initial balance: %s XRP\n", user2Balance) - fmt.Printf("💳 Receiver initial balance: %s XRP\n", receiverBalance) - fmt.Println() - - fmt.Printf("Batch transaction test\n") - - // Create test batch transaction - batchTx := &transaction.Batch{ - BaseTx: transaction.BaseTx{ - Account: txnTypes.Address(userWallet.ClassicAddress), - TransactionType: transaction.BatchTx, - }, - RawTransactions: []txnTypes.RawTransaction{ - {RawTransaction: CreatePaymentTx(&userWallet, &receiverWallet, txnTypes.XRPCurrencyAmount(5000000)).Flatten()}, - {RawTransaction: CreatePaymentTx(&userWallet, &receiverWallet, txnTypes.XRPCurrencyAmount(5000000)).Flatten()}, - }, - } - batchTx.SetAllOrNothingFlag() - - flattenedBatchTx := batchTx.Flatten() - fmt.Println("⏳ Autofilling flattened batch transaction...") - if err := client.Autofill(&flattenedBatchTx); err != nil { - fmt.Println("Autofill error:", err) - return - } - - fmt.Println("⏳ Signing batch transaction...") - response, err := client.SubmitTxAndWait(flattenedBatchTx, &types.SubmitOptions{ - Autofill: false, - Wallet: &userWallet, - }) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Batch transaction submitted") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Printf("🌐 Validated: %t\n", response.Validated) - fmt.Println() - - // Check final balances - finalUserBalance, err := client.GetXrpBalance(userWallet.ClassicAddress) - if err != nil { - finalUserBalance = "0" - } - finalReceiverBalance, err := client.GetXrpBalance(receiverWallet.ClassicAddress) - if err != nil { - finalReceiverBalance = "0" - } - - fmt.Printf("💳 User final balance: %s XRP\n", finalUserBalance) - - fmt.Printf("💳 Receiver final balance: %s XRP\n", finalReceiverBalance) - - fmt.Println() - fmt.Printf("Multisig Batch transaction test\n") - - // Create test batch transaction - multiBatchTx := &transaction.Batch{ - BaseTx: transaction.BaseTx{ - Account: txnTypes.Address(userWallet.ClassicAddress), - TransactionType: transaction.BatchTx, - }, - RawTransactions: []txnTypes.RawTransaction{ - {RawTransaction: CreatePaymentTx(&userWallet, &receiverWallet, txnTypes.XRPCurrencyAmount(5000000)).Flatten()}, - {RawTransaction: CreatePaymentTx(&user2Wallet, &receiverWallet, txnTypes.XRPCurrencyAmount(5000000)).Flatten()}, - }, - BatchSigners: []txnTypes.BatchSigner{ - { - BatchSigner: txnTypes.BatchSignerData{ - Account: txnTypes.Address(user2Wallet.ClassicAddress), - SigningPubKey: user2Wallet.PublicKey, - }, - }, - }, - } - multiBatchTx.SetAllOrNothingFlag() - - flattenedMultiBatchTx := multiBatchTx.Flatten() - fmt.Println("⏳ Autofilling flattened multi batch transaction...") - if err := client.AutofillMultisigned(&flattenedMultiBatchTx, 1); err != nil { - fmt.Println("Autofill error:", err) - return - } - - fmt.Println("⏳ Signing multi batch transaction...") - if err := wallet.SignMultiBatch(user2Wallet, &flattenedMultiBatchTx, nil); err != nil { - fmt.Println("Signing error:", err) - return - } - - response, err = client.SubmitTxAndWait(flattenedMultiBatchTx, &types.SubmitOptions{ - Autofill: false, - Wallet: &userWallet, - }) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Multisig Batch transaction submitted") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Printf("🌐 Validated: %t\n", response.Validated) - fmt.Println() - - // Check final balances - finalUser2Balance, err := client.GetXrpBalance(user2Wallet.ClassicAddress) - if err != nil { - finalUser2Balance = "0" - } - finalUserBalance, err = client.GetXrpBalance(userWallet.ClassicAddress) - if err != nil { - finalUserBalance = "0" - } - finalReceiverBalance, err = client.GetXrpBalance(receiverWallet.ClassicAddress) - if err != nil { - finalReceiverBalance = "0" - } - fmt.Printf("💳 User final balance: %s XRP\n", finalUserBalance) - fmt.Printf("💳 User2 final balance: %s XRP\n", finalUser2Balance) - fmt.Printf("💳 Receiver final balance: %s XRP\n", finalReceiverBalance) + // Connect to testnet + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.devnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) + defer client.Disconnect() + + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + // Create and fund wallets + userWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + user2Wallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + receiverWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Funding wallets...") + if err := client.FundWallet(&userWallet); err != nil { + fmt.Println(err) + return + } + if err := client.FundWallet(&user2Wallet); err != nil { + fmt.Println(err) + return + } + fmt.Println("💸 Wallets funded") + + // Check initial balances + userBalance, err := client.GetXrpBalance(userWallet.ClassicAddress) + if err != nil { + userBalance = "0" + } + user2Balance, err := client.GetXrpBalance(user2Wallet.ClassicAddress) + if err != nil { + user2Balance = "0" + } + + receiverBalance, err := client.GetXrpBalance(receiverWallet.ClassicAddress) + if err != nil { + receiverBalance = "0" + } + + fmt.Printf("💳 User initial balance: %s XRP\n", userBalance) + fmt.Printf("💳 User2 initial balance: %s XRP\n", user2Balance) + fmt.Printf("💳 Receiver initial balance: %s XRP\n", receiverBalance) + fmt.Println() + + fmt.Printf("Batch transaction test\n") + + // Create test batch transaction + batchTx := &transaction.Batch{ + BaseTx: transaction.BaseTx{ + Account: txnTypes.Address(userWallet.ClassicAddress), + TransactionType: transaction.BatchTx, + }, + RawTransactions: []txnTypes.RawTransaction{ + {RawTransaction: CreatePaymentTx(&userWallet, &receiverWallet, txnTypes.XRPCurrencyAmount(5000000)).Flatten()}, + {RawTransaction: CreatePaymentTx(&userWallet, &receiverWallet, txnTypes.XRPCurrencyAmount(5000000)).Flatten()}, + }, + } + batchTx.SetAllOrNothingFlag() + + flattenedBatchTx := batchTx.Flatten() + fmt.Println("⏳ Autofilling flattened batch transaction...") + if err := client.Autofill(&flattenedBatchTx); err != nil { + fmt.Println("Autofill error:", err) + return + } + + fmt.Println("⏳ Signing batch transaction...") + response, err := client.SubmitTxAndWait(flattenedBatchTx, &types.SubmitOptions{ + Autofill: false, + Wallet: &userWallet, + }) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Batch transaction submitted") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Printf("🌐 Validated: %t\n", response.Validated) + fmt.Println() + + // Check final balances + finalUserBalance, err := client.GetXrpBalance(userWallet.ClassicAddress) + if err != nil { + finalUserBalance = "0" + } + finalReceiverBalance, err := client.GetXrpBalance(receiverWallet.ClassicAddress) + if err != nil { + finalReceiverBalance = "0" + } + + fmt.Printf("💳 User final balance: %s XRP\n", finalUserBalance) + + fmt.Printf("💳 Receiver final balance: %s XRP\n", finalReceiverBalance) + + fmt.Println() + fmt.Printf("Multisig Batch transaction test\n") + + // Create test batch transaction + multiBatchTx := &transaction.Batch{ + BaseTx: transaction.BaseTx{ + Account: txnTypes.Address(userWallet.ClassicAddress), + TransactionType: transaction.BatchTx, + }, + RawTransactions: []txnTypes.RawTransaction{ + {RawTransaction: CreatePaymentTx(&userWallet, &receiverWallet, txnTypes.XRPCurrencyAmount(5000000)).Flatten()}, + {RawTransaction: CreatePaymentTx(&user2Wallet, &receiverWallet, txnTypes.XRPCurrencyAmount(5000000)).Flatten()}, + }, + BatchSigners: []txnTypes.BatchSigner{ + { + BatchSigner: txnTypes.BatchSignerData{ + Account: txnTypes.Address(user2Wallet.ClassicAddress), + SigningPubKey: user2Wallet.PublicKey, + }, + }, + }, + } + multiBatchTx.SetAllOrNothingFlag() + + flattenedMultiBatchTx := multiBatchTx.Flatten() + fmt.Println("⏳ Autofilling flattened multi batch transaction...") + if err := client.AutofillMultisigned(&flattenedMultiBatchTx, 1); err != nil { + fmt.Println("Autofill error:", err) + return + } + + fmt.Println("⏳ Signing multi batch transaction...") + if err := wallet.SignMultiBatch(user2Wallet, &flattenedMultiBatchTx, nil); err != nil { + fmt.Println("Signing error:", err) + return + } + + response, err = client.SubmitTxAndWait(flattenedMultiBatchTx, &types.SubmitOptions{ + Autofill: false, + Wallet: &userWallet, + }) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Multisig Batch transaction submitted") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Printf("🌐 Validated: %t\n", response.Validated) + fmt.Println() + + // Check final balances + finalUser2Balance, err := client.GetXrpBalance(user2Wallet.ClassicAddress) + if err != nil { + finalUser2Balance = "0" + } + finalUserBalance, err = client.GetXrpBalance(userWallet.ClassicAddress) + if err != nil { + finalUserBalance = "0" + } + finalReceiverBalance, err = client.GetXrpBalance(receiverWallet.ClassicAddress) + if err != nil { + finalReceiverBalance = "0" + } + fmt.Printf("💳 User final balance: %s XRP\n", finalUserBalance) + fmt.Printf("💳 User2 final balance: %s XRP\n", finalUser2Balance) + fmt.Printf("💳 Receiver final balance: %s XRP\n", finalReceiverBalance) } diff --git a/_code-samples/checks/go/rpc/main.go b/_code-samples/checks/go/rpc/main.go index fb9d51a372c..cfa65a2b1fa 100644 --- a/_code-samples/checks/go/rpc/main.go +++ b/_code-samples/checks/go/rpc/main.go @@ -1,162 +1,162 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/ledger-entry-types" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/ledger-entry-types" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { - cfg, err := rpc.NewClientConfig( - "https://s.altnet.rippletest.net:51234/", - rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), - ) - if err != nil { - panic(err) - } - - client := rpc.NewClient(cfg) - - w, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - - receiverWallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("⏳ Setting up wallets...") - if err := client.FundWallet(&w); err != nil { - fmt.Println(err) - return - } - fmt.Println("💸 Sender wallet funded!") - - if err := client.FundWallet(&receiverWallet); err != nil { - fmt.Println(err) - return - } - - fmt.Println("💸 Receiver wallet funded!") - fmt.Println() - - fmt.Println("✅ Wallets setup complete!") - fmt.Println("💳 Sender wallet:", w.ClassicAddress) - fmt.Println("💳 Receiver wallet:", receiverWallet.ClassicAddress) - fmt.Println() - - fmt.Println("⏳ Creating check...") - cc := &transaction.CheckCreate{ - BaseTx: transaction.BaseTx{ - Account: w.GetAddress(), - }, - Destination: receiverWallet.GetAddress(), - SendMax: types.XRPCurrencyAmount(1000000), - InvoiceID: "46060241FABCF692D4D934BA2A6C4427CD4279083E38C77CBE642243E43BE291", - } - - flatCc := cc.Flatten() - - if err := client.Autofill(&flatCc); err != nil { - fmt.Println(err) - return - } - - blob, _, err := w.Sign(flatCc) - if err != nil { - fmt.Println(err) - return - } - - res, err := client.SubmitTxBlobAndWait(blob, false) - if err != nil { - fmt.Println(err) - return - } - - if !res.Validated { - fmt.Println("❌ Check creation failed!") - fmt.Println("Try again!") - fmt.Println() - return - } - - fmt.Println("✅ Check created!") - fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) - fmt.Println() - - meta, ok := res.Meta.(map[string]interface{}) - if !ok { - fmt.Println("❌ Meta is not of type TxObjMeta") - return - } - - var checkID string - - affectedNodes := meta["AffectedNodes"].([]interface{}) - - for _, node := range affectedNodes { - affectedNode, ok := node.(map[string]interface{}) - if !ok { - fmt.Println("❌ Node is not of type map[string]interface{}") - return - } - - createdNode, ok := affectedNode["CreatedNode"].(map[string]interface{}) - if !ok { - continue - } - - if createdNode["LedgerEntryType"] == string(ledger.CheckEntry) { - - checkID = createdNode["LedgerIndex"].(string) - } - } - - if checkID == "" { - fmt.Println("Check not found") - return - } - - fmt.Println("⏳ Cashing out check...") - checkCash := &transaction.CheckCash{ - BaseTx: transaction.BaseTx{ - Account: receiverWallet.GetAddress(), - }, - CheckID: types.Hash256(checkID), - Amount: types.XRPCurrencyAmount(1000000), - } - - flatCheckCash := checkCash.Flatten() - - if err := client.Autofill(&flatCheckCash); err != nil { - fmt.Println(err) - return - } - - blob, _, err = receiverWallet.Sign(flatCheckCash) - if err != nil { - fmt.Println(err) - return - } - - res, err = client.SubmitTxBlobAndWait(blob, false) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Check cashed out!") - fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) - fmt.Println() + cfg, err := rpc.NewClientConfig( + "https://s.altnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + client := rpc.NewClient(cfg) + + w, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + receiverWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Setting up wallets...") + if err := client.FundWallet(&w); err != nil { + fmt.Println(err) + return + } + fmt.Println("💸 Sender wallet funded!") + + if err := client.FundWallet(&receiverWallet); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Receiver wallet funded!") + fmt.Println() + + fmt.Println("✅ Wallets setup complete!") + fmt.Println("💳 Sender wallet:", w.ClassicAddress) + fmt.Println("💳 Receiver wallet:", receiverWallet.ClassicAddress) + fmt.Println() + + fmt.Println("⏳ Creating check...") + cc := &transaction.CheckCreate{ + BaseTx: transaction.BaseTx{ + Account: w.GetAddress(), + }, + Destination: receiverWallet.GetAddress(), + SendMax: types.XRPCurrencyAmount(1000000), + InvoiceID: "46060241FABCF692D4D934BA2A6C4427CD4279083E38C77CBE642243E43BE291", + } + + flatCc := cc.Flatten() + + if err := client.Autofill(&flatCc); err != nil { + fmt.Println(err) + return + } + + blob, _, err := w.Sign(flatCc) + if err != nil { + fmt.Println(err) + return + } + + res, err := client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + if !res.Validated { + fmt.Println("❌ Check creation failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Check created!") + fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Println() + + meta, ok := res.Meta.(map[string]interface{}) + if !ok { + fmt.Println("❌ Meta is not of type TxObjMeta") + return + } + + var checkID string + + affectedNodes := meta["AffectedNodes"].([]interface{}) + + for _, node := range affectedNodes { + affectedNode, ok := node.(map[string]interface{}) + if !ok { + fmt.Println("❌ Node is not of type map[string]interface{}") + return + } + + createdNode, ok := affectedNode["CreatedNode"].(map[string]interface{}) + if !ok { + continue + } + + if createdNode["LedgerEntryType"] == string(ledger.CheckEntry) { + + checkID = createdNode["LedgerIndex"].(string) + } + } + + if checkID == "" { + fmt.Println("Check not found") + return + } + + fmt.Println("⏳ Cashing out check...") + checkCash := &transaction.CheckCash{ + BaseTx: transaction.BaseTx{ + Account: receiverWallet.GetAddress(), + }, + CheckID: types.Hash256(checkID), + Amount: types.XRPCurrencyAmount(1000000), + } + + flatCheckCash := checkCash.Flatten() + + if err := client.Autofill(&flatCheckCash); err != nil { + fmt.Println(err) + return + } + + blob, _, err = receiverWallet.Sign(flatCheckCash) + if err != nil { + fmt.Println(err) + return + } + + res, err = client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Check cashed out!") + fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Println() } diff --git a/_code-samples/checks/go/ws/main.go b/_code-samples/checks/go/ws/main.go index a3e38cd72bb..323be583d5d 100644 --- a/_code-samples/checks/go/ws/main.go +++ b/_code-samples/checks/go/ws/main.go @@ -1,173 +1,173 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/ledger-entry-types" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/ledger-entry-types" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" ) func main() { - fmt.Println("⏳ Connecting to testnet...") - client := websocket.NewClient( - websocket.NewClientConfig(). - WithHost("wss://s.altnet.rippletest.net:51233"). - WithFaucetProvider(faucet.NewTestnetFaucetProvider()), - ) - defer client.Disconnect() - - if err := client.Connect(); err != nil { - fmt.Println(err) - return - } - - if !client.IsConnected() { - fmt.Println("❌ Failed to connect to testnet") - return - } - - fmt.Println("✅ Connected to testnet") - fmt.Println() - - w, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - - receiverWallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("⏳ Setting up wallets...") - if err := client.FundWallet(&w); err != nil { - fmt.Println(err) - return - } - fmt.Println("💸 Sender wallet funded!") - - if err := client.FundWallet(&receiverWallet); err != nil { - fmt.Println(err) - return - } - - fmt.Println("💸 Receiver wallet funded!") - fmt.Println() - - fmt.Println("✅ Wallets setup complete!") - fmt.Println("💳 Sender wallet:", w.ClassicAddress) - fmt.Println("💳 Receiver wallet:", receiverWallet.ClassicAddress) - fmt.Println() - - fmt.Println("⏳ Creating check...") - cc := &transaction.CheckCreate{ - BaseTx: transaction.BaseTx{ - Account: w.GetAddress(), - }, - Destination: receiverWallet.GetAddress(), - SendMax: types.XRPCurrencyAmount(1000000), - InvoiceID: "46060241FABCF692D4D934BA2A6C4427CD4279083E38C77CBE642243E43BE291", - } - - flatCc := cc.Flatten() - - if err := client.Autofill(&flatCc); err != nil { - fmt.Println(err) - return - } - - blob, _, err := w.Sign(flatCc) - if err != nil { - fmt.Println(err) - return - } - - res, err := client.SubmitTxBlobAndWait(blob, false) - if err != nil { - fmt.Println(err) - return - } - - if !res.Validated { - fmt.Println("❌ Check creation failed!") - fmt.Println("Try again!") - fmt.Println() - return - } - - fmt.Println("✅ Check created!") - fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) - fmt.Println() - - meta, ok := res.Meta.(map[string]interface{}) - if !ok { - fmt.Println("❌ Meta is not of type TxObjMeta") - return - } - - var checkID string - - affectedNodes := meta["AffectedNodes"].([]interface{}) - - for _, node := range affectedNodes { - affectedNode, ok := node.(map[string]interface{}) - if !ok { - fmt.Println("❌ Node is not of type map[string]interface{}") - return - } - - createdNode, ok := affectedNode["CreatedNode"].(map[string]interface{}) - if !ok { - continue - } - - if createdNode["LedgerEntryType"] == string(ledger.CheckEntry) { - - checkID = createdNode["LedgerIndex"].(string) - } - } - - if checkID == "" { - fmt.Println("Check not found") - return - } - - fmt.Println("⏳ Cashing out check...") - checkCash := &transaction.CheckCash{ - BaseTx: transaction.BaseTx{ - Account: receiverWallet.GetAddress(), - }, - CheckID: types.Hash256(checkID), - Amount: types.XRPCurrencyAmount(1000000), - } - - flatCheckCash := checkCash.Flatten() - - if err := client.Autofill(&flatCheckCash); err != nil { - fmt.Println(err) - return - } - - blob, _, err = receiverWallet.Sign(flatCheckCash) - if err != nil { - fmt.Println(err) - return - } - - res, err = client.SubmitTxBlobAndWait(blob, false) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Check cashed out!") - fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) - fmt.Println() + fmt.Println("⏳ Connecting to testnet...") + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + defer client.Disconnect() + + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + if !client.IsConnected() { + fmt.Println("❌ Failed to connect to testnet") + return + } + + fmt.Println("✅ Connected to testnet") + fmt.Println() + + w, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + receiverWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Setting up wallets...") + if err := client.FundWallet(&w); err != nil { + fmt.Println(err) + return + } + fmt.Println("💸 Sender wallet funded!") + + if err := client.FundWallet(&receiverWallet); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Receiver wallet funded!") + fmt.Println() + + fmt.Println("✅ Wallets setup complete!") + fmt.Println("💳 Sender wallet:", w.ClassicAddress) + fmt.Println("💳 Receiver wallet:", receiverWallet.ClassicAddress) + fmt.Println() + + fmt.Println("⏳ Creating check...") + cc := &transaction.CheckCreate{ + BaseTx: transaction.BaseTx{ + Account: w.GetAddress(), + }, + Destination: receiverWallet.GetAddress(), + SendMax: types.XRPCurrencyAmount(1000000), + InvoiceID: "46060241FABCF692D4D934BA2A6C4427CD4279083E38C77CBE642243E43BE291", + } + + flatCc := cc.Flatten() + + if err := client.Autofill(&flatCc); err != nil { + fmt.Println(err) + return + } + + blob, _, err := w.Sign(flatCc) + if err != nil { + fmt.Println(err) + return + } + + res, err := client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + if !res.Validated { + fmt.Println("❌ Check creation failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Check created!") + fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Println() + + meta, ok := res.Meta.(map[string]interface{}) + if !ok { + fmt.Println("❌ Meta is not of type TxObjMeta") + return + } + + var checkID string + + affectedNodes := meta["AffectedNodes"].([]interface{}) + + for _, node := range affectedNodes { + affectedNode, ok := node.(map[string]interface{}) + if !ok { + fmt.Println("❌ Node is not of type map[string]interface{}") + return + } + + createdNode, ok := affectedNode["CreatedNode"].(map[string]interface{}) + if !ok { + continue + } + + if createdNode["LedgerEntryType"] == string(ledger.CheckEntry) { + + checkID = createdNode["LedgerIndex"].(string) + } + } + + if checkID == "" { + fmt.Println("Check not found") + return + } + + fmt.Println("⏳ Cashing out check...") + checkCash := &transaction.CheckCash{ + BaseTx: transaction.BaseTx{ + Account: receiverWallet.GetAddress(), + }, + CheckID: types.Hash256(checkID), + Amount: types.XRPCurrencyAmount(1000000), + } + + flatCheckCash := checkCash.Flatten() + + if err := client.Autofill(&flatCheckCash); err != nil { + fmt.Println(err) + return + } + + blob, _, err = receiverWallet.Sign(flatCheckCash) + if err != nil { + fmt.Println(err) + return + } + + res, err = client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Check cashed out!") + fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Println() } diff --git a/_code-samples/clawback/go/rpc/main.go b/_code-samples/clawback/go/rpc/main.go index ead2e28eb60..c54c1a186d5 100644 --- a/_code-samples/clawback/go/rpc/main.go +++ b/_code-samples/clawback/go/rpc/main.go @@ -1,251 +1,251 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) const ( - currencyCode = "FOO" + currencyCode = "FOO" ) func main() { - // - // Configure client - // - cfg, err := rpc.NewClientConfig( - "https://s.altnet.rippletest.net:51234/", - rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), - ) - if err != nil { - panic(err) - } - - client := rpc.NewClient(cfg) - - // - // Configure wallets - // - fmt.Println("⏳ Setting up wallets...") - coldWallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Printf("❌ Error creating cold wallet: %s\n", err) - return - } - err = client.FundWallet(&coldWallet) - if err != nil { - fmt.Printf("❌ Error funding cold wallet: %s\n", err) - return - } - fmt.Println("💸 Cold wallet funded!") - - hotWallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Printf("❌ Error creating hot wallet: %s\n", err) - return - } - err = client.FundWallet(&hotWallet) - if err != nil { - fmt.Printf("❌ Error funding hot wallet: %s\n", err) - return - } - fmt.Println("💸 Hot wallet funded!") - fmt.Println() - - fmt.Println("✅ Wallets setup complete!") - fmt.Println("💳 Cold wallet:", coldWallet.ClassicAddress) - fmt.Println("💳 Hot wallet:", hotWallet.ClassicAddress) - fmt.Println() - - // - // Configure cold address settings - // - fmt.Println("⏳ Configuring cold address settings...") - coldWalletAccountSet := &transactions.AccountSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(coldWallet.ClassicAddress), - }, - TickSize: types.TickSize(5), - TransferRate: types.TransferRate(0), - Domain: types.Domain("6578616D706C652E636F6D"), // example.com - } - - coldWalletAccountSet.SetAsfAllowTrustLineClawback() - coldWalletAccountSet.SetDisallowXRP() - - coldWalletAccountSet.SetRequireDestTag() - - flattenedTx := coldWalletAccountSet.Flatten() - - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err := coldWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - response, err := client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) - return - } - - if !response.Validated { - fmt.Println("❌ Cold wallet unfreezing failed!") - fmt.Println("Try again!") - fmt.Println() - return - } - - fmt.Println("✅ Cold address settings configured!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() - - // - // Create trust line from hot to cold address - // - fmt.Println("⏳ Creating trust line from hot to cold address...") - hotColdTrustSet := &transactions.TrustSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(hotWallet.ClassicAddress), - }, - LimitAmount: types.IssuedCurrencyAmount{ - Currency: currencyCode, - Issuer: types.Address(coldWallet.ClassicAddress), - Value: "100000000000000", - }, - } - - flattenedTx = hotColdTrustSet.Flatten() - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err = hotWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - response, err = client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) - return - } - - if !response.Validated { - fmt.Println("❌ Trust line from hot to cold address creation failed!") - fmt.Println("Try again!") - fmt.Println() - return - } - - fmt.Println("✅ Trust line from hot to cold address created!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() - - // - // Send tokens from cold wallet to hot wallet - // - fmt.Println("⏳ Sending tokens from cold wallet to hot wallet...") - coldToHotPayment := &transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(coldWallet.ClassicAddress), - }, - Amount: types.IssuedCurrencyAmount{ - Currency: currencyCode, - Issuer: types.Address(coldWallet.ClassicAddress), - Value: "3800", - }, - Destination: types.Address(hotWallet.ClassicAddress), - DestinationTag: types.DestinationTag(1), - } - - flattenedTx = coldToHotPayment.Flatten() - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err = coldWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - response, err = client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) - return - } - - if !response.Validated { - fmt.Println("❌ Tokens not sent from cold wallet to hot wallet!") - fmt.Println("Try again!") - fmt.Println() - return - } - - fmt.Println("✅ Tokens sent from cold wallet to hot wallet!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() - - // - // Claw back tokens from customer one - // - fmt.Println("⏳ Clawing back tokens from hot wallet...") - - coldWalletClawback := &transactions.Clawback{ - BaseTx: transactions.BaseTx{ - Account: types.Address(coldWallet.ClassicAddress), - }, - Amount: types.IssuedCurrencyAmount{ - Currency: currencyCode, - Issuer: types.Address(hotWallet.ClassicAddress), - Value: "50", - }, - } - - flattenedTx = coldWalletClawback.Flatten() - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err = coldWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - response, err = client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) - return - } - - if !response.Validated { - fmt.Println("❌ Tokens not clawed back from customer one!") - fmt.Println("Try again!") - return - } - - fmt.Println("✅ Tokens clawed back from customer one!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() + // + // Configure client + // + cfg, err := rpc.NewClientConfig( + "https://s.altnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + client := rpc.NewClient(cfg) + + // + // Configure wallets + // + fmt.Println("⏳ Setting up wallets...") + coldWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating cold wallet: %s\n", err) + return + } + err = client.FundWallet(&coldWallet) + if err != nil { + fmt.Printf("❌ Error funding cold wallet: %s\n", err) + return + } + fmt.Println("💸 Cold wallet funded!") + + hotWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating hot wallet: %s\n", err) + return + } + err = client.FundWallet(&hotWallet) + if err != nil { + fmt.Printf("❌ Error funding hot wallet: %s\n", err) + return + } + fmt.Println("💸 Hot wallet funded!") + fmt.Println() + + fmt.Println("✅ Wallets setup complete!") + fmt.Println("💳 Cold wallet:", coldWallet.ClassicAddress) + fmt.Println("💳 Hot wallet:", hotWallet.ClassicAddress) + fmt.Println() + + // + // Configure cold address settings + // + fmt.Println("⏳ Configuring cold address settings...") + coldWalletAccountSet := &transactions.AccountSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + TickSize: types.TickSize(5), + TransferRate: types.TransferRate(0), + Domain: types.Domain("6578616D706C652E636F6D"), // example.com + } + + coldWalletAccountSet.SetAsfAllowTrustLineClawback() + coldWalletAccountSet.SetDisallowXRP() + + coldWalletAccountSet.SetRequireDestTag() + + flattenedTx := coldWalletAccountSet.Flatten() + + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err := coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err := client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Cold wallet unfreezing failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Cold address settings configured!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Create trust line from hot to cold address + // + fmt.Println("⏳ Creating trust line from hot to cold address...") + hotColdTrustSet := &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(hotWallet.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "100000000000000", + }, + } + + flattenedTx = hotColdTrustSet.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = hotWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Trust line from hot to cold address creation failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Trust line from hot to cold address created!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Send tokens from cold wallet to hot wallet + // + fmt.Println("⏳ Sending tokens from cold wallet to hot wallet...") + coldToHotPayment := &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "3800", + }, + Destination: types.Address(hotWallet.ClassicAddress), + DestinationTag: types.DestinationTag(1), + } + + flattenedTx = coldToHotPayment.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Tokens not sent from cold wallet to hot wallet!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Tokens sent from cold wallet to hot wallet!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Claw back tokens from customer one + // + fmt.Println("⏳ Clawing back tokens from hot wallet...") + + coldWalletClawback := &transactions.Clawback{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(hotWallet.ClassicAddress), + Value: "50", + }, + } + + flattenedTx = coldWalletClawback.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Tokens not clawed back from customer one!") + fmt.Println("Try again!") + return + } + + fmt.Println("✅ Tokens clawed back from customer one!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() } diff --git a/_code-samples/clawback/go/ws/main.go b/_code-samples/clawback/go/ws/main.go index 6a689ccde48..9f1950def95 100644 --- a/_code-samples/clawback/go/ws/main.go +++ b/_code-samples/clawback/go/ws/main.go @@ -1,258 +1,258 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" ) const ( - currencyCode = "FOO" + currencyCode = "FOO" ) func main() { - // - // Configure client - // - fmt.Println("⏳ Setting up client...") - client := websocket.NewClient( - websocket.NewClientConfig(). - WithHost("wss://s.altnet.rippletest.net"). - WithFaucetProvider(faucet.NewTestnetFaucetProvider()), - ) - fmt.Println("✅ Client configured!") - fmt.Println() - - fmt.Println("Connecting to server...") - if err := client.Connect(); err != nil { - fmt.Println(err) - return - } - - fmt.Println("Connection: ", client.IsConnected()) - - // - // Configure wallets - // - fmt.Println("⏳ Setting up wallets...") - coldWallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Printf("❌ Error creating cold wallet: %s\n", err) - return - } - err = client.FundWallet(&coldWallet) - if err != nil { - fmt.Printf("❌ Error funding cold wallet: %s\n", err) - return - } - fmt.Println("💸 Cold wallet funded!") - - hotWallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Printf("❌ Error creating hot wallet: %s\n", err) - return - } - err = client.FundWallet(&hotWallet) - if err != nil { - fmt.Printf("❌ Error funding hot wallet: %s\n", err) - return - } - fmt.Println("💸 Hot wallet funded!") - fmt.Println() - - fmt.Println("✅ Wallets setup complete!") - fmt.Println("💳 Cold wallet:", coldWallet.ClassicAddress) - fmt.Println("💳 Hot wallet:", hotWallet.ClassicAddress) - fmt.Println() - - // - // Configure cold address settings - // - fmt.Println("⏳ Configuring cold address settings...") - coldWalletAccountSet := &transactions.AccountSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(coldWallet.ClassicAddress), - }, - TickSize: types.TickSize(5), - TransferRate: types.TransferRate(0), - Domain: types.Domain("6578616D706C652E636F6D"), // example.com - } - - coldWalletAccountSet.SetAsfAllowTrustLineClawback() - coldWalletAccountSet.SetDisallowXRP() - - coldWalletAccountSet.SetRequireDestTag() - - flattenedTx := coldWalletAccountSet.Flatten() - - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err := coldWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - response, err := client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) - return - } - - if !response.Validated { - fmt.Println("❌ Cold wallet unfreezing failed!") - fmt.Println("Try again!") - fmt.Println() - return - } - - fmt.Println("✅ Cold address settings configured!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() - - // - // Create trust line from hot to cold address - // - fmt.Println("⏳ Creating trust line from hot to cold address...") - hotColdTrustSet := &transactions.TrustSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(hotWallet.ClassicAddress), - }, - LimitAmount: types.IssuedCurrencyAmount{ - Currency: currencyCode, - Issuer: types.Address(coldWallet.ClassicAddress), - Value: "100000000000000", - }, - } - - flattenedTx = hotColdTrustSet.Flatten() - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err = hotWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - response, err = client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) - return - } - - if !response.Validated { - fmt.Println("❌ Trust line from hot to cold address creation failed!") - fmt.Println("Try again!") - fmt.Println() - return - } - - fmt.Println("✅ Trust line from hot to cold address created!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() - - // - // Send tokens from cold wallet to hot wallet - // - fmt.Println("⏳ Sending tokens from cold wallet to hot wallet...") - coldToHotPayment := &transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(coldWallet.ClassicAddress), - }, - Amount: types.IssuedCurrencyAmount{ - Currency: currencyCode, - Issuer: types.Address(coldWallet.ClassicAddress), - Value: "3800", - }, - Destination: types.Address(hotWallet.ClassicAddress), - DestinationTag: types.DestinationTag(1), - } - - flattenedTx = coldToHotPayment.Flatten() - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err = coldWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - response, err = client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) - return - } - - if !response.Validated { - fmt.Println("❌ Tokens not sent from cold wallet to hot wallet!") - fmt.Println("Try again!") - fmt.Println() - return - } - - fmt.Println("✅ Tokens sent from cold wallet to hot wallet!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() - - // - // Claw back tokens from customer one - // - fmt.Println("⏳ Clawing back tokens from hot wallet...") - - coldWalletClawback := &transactions.Clawback{ - BaseTx: transactions.BaseTx{ - Account: types.Address(coldWallet.ClassicAddress), - }, - Amount: types.IssuedCurrencyAmount{ - Currency: currencyCode, - Issuer: types.Address(hotWallet.ClassicAddress), - Value: "50", - }, - } - - flattenedTx = coldWalletClawback.Flatten() - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err = coldWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - response, err = client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) - return - } - - if !response.Validated { - fmt.Println("❌ Tokens not clawed back from customer one!") - fmt.Println("Try again!") - return - } - - fmt.Println("✅ Tokens clawed back from customer one!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() + // + // Configure client + // + fmt.Println("⏳ Setting up client...") + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net"). + WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + fmt.Println("✅ Client configured!") + fmt.Println() + + fmt.Println("Connecting to server...") + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + fmt.Println("Connection: ", client.IsConnected()) + + // + // Configure wallets + // + fmt.Println("⏳ Setting up wallets...") + coldWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating cold wallet: %s\n", err) + return + } + err = client.FundWallet(&coldWallet) + if err != nil { + fmt.Printf("❌ Error funding cold wallet: %s\n", err) + return + } + fmt.Println("💸 Cold wallet funded!") + + hotWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating hot wallet: %s\n", err) + return + } + err = client.FundWallet(&hotWallet) + if err != nil { + fmt.Printf("❌ Error funding hot wallet: %s\n", err) + return + } + fmt.Println("💸 Hot wallet funded!") + fmt.Println() + + fmt.Println("✅ Wallets setup complete!") + fmt.Println("💳 Cold wallet:", coldWallet.ClassicAddress) + fmt.Println("💳 Hot wallet:", hotWallet.ClassicAddress) + fmt.Println() + + // + // Configure cold address settings + // + fmt.Println("⏳ Configuring cold address settings...") + coldWalletAccountSet := &transactions.AccountSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + TickSize: types.TickSize(5), + TransferRate: types.TransferRate(0), + Domain: types.Domain("6578616D706C652E636F6D"), // example.com + } + + coldWalletAccountSet.SetAsfAllowTrustLineClawback() + coldWalletAccountSet.SetDisallowXRP() + + coldWalletAccountSet.SetRequireDestTag() + + flattenedTx := coldWalletAccountSet.Flatten() + + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err := coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err := client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Cold wallet unfreezing failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Cold address settings configured!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Create trust line from hot to cold address + // + fmt.Println("⏳ Creating trust line from hot to cold address...") + hotColdTrustSet := &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(hotWallet.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "100000000000000", + }, + } + + flattenedTx = hotColdTrustSet.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = hotWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Trust line from hot to cold address creation failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Trust line from hot to cold address created!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Send tokens from cold wallet to hot wallet + // + fmt.Println("⏳ Sending tokens from cold wallet to hot wallet...") + coldToHotPayment := &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "3800", + }, + Destination: types.Address(hotWallet.ClassicAddress), + DestinationTag: types.DestinationTag(1), + } + + flattenedTx = coldToHotPayment.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Tokens not sent from cold wallet to hot wallet!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Tokens sent from cold wallet to hot wallet!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Claw back tokens from customer one + // + fmt.Println("⏳ Clawing back tokens from hot wallet...") + + coldWalletClawback := &transactions.Clawback{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(hotWallet.ClassicAddress), + Value: "50", + }, + } + + flattenedTx = coldWalletClawback.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Tokens not clawed back from customer one!") + fmt.Println("Try again!") + return + } + + fmt.Println("✅ Tokens clawed back from customer one!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() } diff --git a/_code-samples/credential/go/rpc/main.go b/_code-samples/credential/go/rpc/main.go index ab3bf1a1d07..55834d6fee6 100644 --- a/_code-samples/credential/go/rpc/main.go +++ b/_code-samples/credential/go/rpc/main.go @@ -1,109 +1,109 @@ package main import ( - "encoding/hex" - "fmt" - "time" - - "github.com/Peersyst/xrpl-go/examples/clients" - "github.com/Peersyst/xrpl-go/pkg/crypto" - rippleTime "github.com/Peersyst/xrpl-go/xrpl/time" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "encoding/hex" + "fmt" + "time" + + "github.com/Peersyst/xrpl-go/examples/clients" + "github.com/Peersyst/xrpl-go/pkg/crypto" + rippleTime "github.com/Peersyst/xrpl-go/xrpl/time" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { - // As of February 2025, Credential is only available on Devnet. - client := clients.GetDevnetRpcClient() - - // Configure wallets - - // Issuer - fmt.Println("⏳ Setting up credential issuer wallet...") - issuer, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Printf("❌ Error creating issuer wallet: %s\n", err) - return - } - - err = client.FundWallet(&issuer) - if err != nil { - fmt.Printf("❌ Error funding issuer wallet: %s\n", err) - return - } - fmt.Printf("✅ Issuer wallet funded: %s\n", issuer.ClassicAddress) - - // ----------------------------------------------------- - - // Subject (destination) - fmt.Println("⏳ Setting up Subject wallet...") - subjectWallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Printf("❌ Error creating subject wallet: %s\n", err) - return - } - - err = client.FundWallet(&subjectWallet) - if err != nil { - fmt.Printf("❌ Error funding subject wallet: %s\n", err) - return - } - fmt.Printf("✅ Subject wallet funded: %s\n", subjectWallet.ClassicAddress) - - // ----------------------------------------------------- - - // Creating the CredentialCreate transaction - fmt.Println("⏳ Creating CredentialCreate transaction...") - - expiration, err := rippleTime.IsoTimeToRippleTime(time.Now().Add(time.Hour * 24).Format(time.RFC3339)) - credentialType := types.CredentialType("6D795F63726564656E7469616C") - - if err != nil { - fmt.Printf("❌ Error converting expiration to ripple time: %s\n", err) - return - } - - txn := &transaction.CredentialCreate{ - BaseTx: transaction.BaseTx{ - Account: types.Address(issuer.ClassicAddress), - }, - CredentialType: credentialType, - Subject: types.Address(subjectWallet.ClassicAddress), - Expiration: uint32(expiration), - URI: hex.EncodeToString([]byte("https://example.com")), - } - - clients.SubmitTxBlobAndWait(client, txn, issuer) - - // ----------------------------------------------------- - - // Creating the CredentialAccept transaction - fmt.Println("⏳ Creating CredentialAccept transaction...") - - acceptTxn := &transaction.CredentialAccept{ - BaseTx: transaction.BaseTx{ - Account: types.Address(subjectWallet.ClassicAddress), - }, - CredentialType: credentialType, - Issuer: types.Address(issuer.ClassicAddress), - } - - clients.SubmitTxBlobAndWait(client, acceptTxn, subjectWallet) - - // ----------------------------------------------------- - - // Creating the CredentialDelete transaction - fmt.Println("⏳ Creating CredentialDelete transaction...") - - deleteTxn := &transaction.CredentialDelete{ - BaseTx: transaction.BaseTx{ - Account: types.Address(issuer.ClassicAddress), - }, - CredentialType: credentialType, - Issuer: types.Address(issuer.ClassicAddress), - Subject: types.Address(subjectWallet.ClassicAddress), - } - - clients.SubmitTxBlobAndWait(client, deleteTxn, issuer) + // As of February 2025, Credential is only available on Devnet. + client := clients.GetDevnetRpcClient() + + // Configure wallets + + // Issuer + fmt.Println("⏳ Setting up credential issuer wallet...") + issuer, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating issuer wallet: %s\n", err) + return + } + + err = client.FundWallet(&issuer) + if err != nil { + fmt.Printf("❌ Error funding issuer wallet: %s\n", err) + return + } + fmt.Printf("✅ Issuer wallet funded: %s\n", issuer.ClassicAddress) + + // ----------------------------------------------------- + + // Subject (destination) + fmt.Println("⏳ Setting up Subject wallet...") + subjectWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating subject wallet: %s\n", err) + return + } + + err = client.FundWallet(&subjectWallet) + if err != nil { + fmt.Printf("❌ Error funding subject wallet: %s\n", err) + return + } + fmt.Printf("✅ Subject wallet funded: %s\n", subjectWallet.ClassicAddress) + + // ----------------------------------------------------- + + // Creating the CredentialCreate transaction + fmt.Println("⏳ Creating CredentialCreate transaction...") + + expiration, err := rippleTime.IsoTimeToRippleTime(time.Now().Add(time.Hour * 24).Format(time.RFC3339)) + credentialType := types.CredentialType("6D795F63726564656E7469616C") + + if err != nil { + fmt.Printf("❌ Error converting expiration to ripple time: %s\n", err) + return + } + + txn := &transaction.CredentialCreate{ + BaseTx: transaction.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + CredentialType: credentialType, + Subject: types.Address(subjectWallet.ClassicAddress), + Expiration: uint32(expiration), + URI: hex.EncodeToString([]byte("https://example.com")), + } + + clients.SubmitTxBlobAndWait(client, txn, issuer) + + // ----------------------------------------------------- + + // Creating the CredentialAccept transaction + fmt.Println("⏳ Creating CredentialAccept transaction...") + + acceptTxn := &transaction.CredentialAccept{ + BaseTx: transaction.BaseTx{ + Account: types.Address(subjectWallet.ClassicAddress), + }, + CredentialType: credentialType, + Issuer: types.Address(issuer.ClassicAddress), + } + + clients.SubmitTxBlobAndWait(client, acceptTxn, subjectWallet) + + // ----------------------------------------------------- + + // Creating the CredentialDelete transaction + fmt.Println("⏳ Creating CredentialDelete transaction...") + + deleteTxn := &transaction.CredentialDelete{ + BaseTx: transaction.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + CredentialType: credentialType, + Issuer: types.Address(issuer.ClassicAddress), + Subject: types.Address(subjectWallet.ClassicAddress), + } + + clients.SubmitTxBlobAndWait(client, deleteTxn, issuer) } diff --git a/_code-samples/credential/go/ws/main.go b/_code-samples/credential/go/ws/main.go index 3fd7eabce9d..3f2153e27ba 100644 --- a/_code-samples/credential/go/ws/main.go +++ b/_code-samples/credential/go/ws/main.go @@ -1,122 +1,122 @@ package main import ( - "encoding/hex" - "fmt" - "time" - - "github.com/Peersyst/xrpl-go/examples/clients" - "github.com/Peersyst/xrpl-go/pkg/crypto" - rippleTime "github.com/Peersyst/xrpl-go/xrpl/time" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "encoding/hex" + "fmt" + "time" + + "github.com/Peersyst/xrpl-go/examples/clients" + "github.com/Peersyst/xrpl-go/pkg/crypto" + rippleTime "github.com/Peersyst/xrpl-go/xrpl/time" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { - fmt.Println("⏳ Setting up client...") - - client := clients.GetDevnetWebsocketClient() - fmt.Println("Connecting to server...") - if err := client.Connect(); err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Client configured!") - fmt.Println() - - fmt.Printf("Connection: %t", client.IsConnected()) - fmt.Println() - - // Configure wallets - - // Issuer - fmt.Println("⏳ Setting up credential issuer wallet...") - issuer, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Printf("❌ Error creating issuer wallet: %s\n", err) - return - } - - err = client.FundWallet(&issuer) - if err != nil { - fmt.Printf("❌ Error funding issuer wallet: %s\n", err) - return - } - fmt.Printf("✅ Issuer wallet funded: %s\n", issuer.ClassicAddress) - - // ----------------------------------------------------- - - // Subject (destination) - fmt.Println("⏳ Setting up Subject wallet...") - subjectWallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Printf("❌ Error creating subject wallet: %s\n", err) - return - } - - err = client.FundWallet(&subjectWallet) - if err != nil { - fmt.Printf("❌ Error funding subject wallet: %s\n", err) - return - } - fmt.Printf("✅ Subject wallet funded: %s\n", subjectWallet.ClassicAddress) - - // ----------------------------------------------------- - - // Creating the CredentialCreate transaction - fmt.Println("⏳ Creating CredentialCreate transaction...") - - expiration, err := rippleTime.IsoTimeToRippleTime(time.Now().Add(time.Hour * 24).Format(time.RFC3339)) - credentialType := types.CredentialType("6D795F63726564656E7469616C") - - if err != nil { - fmt.Printf("❌ Error converting expiration to ripple time: %s\n", err) - return - } - - txn := &transaction.CredentialCreate{ - BaseTx: transaction.BaseTx{ - Account: types.Address(issuer.ClassicAddress), - }, - CredentialType: credentialType, - Subject: types.Address(subjectWallet.ClassicAddress), - Expiration: uint32(expiration), - URI: hex.EncodeToString([]byte("https://example.com")), - } - - clients.SubmitTxBlobAndWait(client, txn, issuer) - - // ----------------------------------------------------- - - // Creating the CredentialAccept transaction - fmt.Println("⏳ Creating CredentialAccept transaction...") - - acceptTxn := &transaction.CredentialAccept{ - BaseTx: transaction.BaseTx{ - Account: types.Address(subjectWallet.ClassicAddress), - }, - CredentialType: credentialType, - Issuer: types.Address(issuer.ClassicAddress), - } - - clients.SubmitTxBlobAndWait(client, acceptTxn, subjectWallet) - - // ----------------------------------------------------- - - // Creating the CredentialDelete transaction - fmt.Println("⏳ Creating CredentialDelete transaction...") - - deleteTxn := &transaction.CredentialDelete{ - BaseTx: transaction.BaseTx{ - Account: types.Address(issuer.ClassicAddress), - }, - CredentialType: credentialType, - Issuer: types.Address(issuer.ClassicAddress), - Subject: types.Address(subjectWallet.ClassicAddress), - } - - clients.SubmitTxBlobAndWait(client, deleteTxn, issuer) + fmt.Println("⏳ Setting up client...") + + client := clients.GetDevnetWebsocketClient() + fmt.Println("Connecting to server...") + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Client configured!") + fmt.Println() + + fmt.Printf("Connection: %t", client.IsConnected()) + fmt.Println() + + // Configure wallets + + // Issuer + fmt.Println("⏳ Setting up credential issuer wallet...") + issuer, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating issuer wallet: %s\n", err) + return + } + + err = client.FundWallet(&issuer) + if err != nil { + fmt.Printf("❌ Error funding issuer wallet: %s\n", err) + return + } + fmt.Printf("✅ Issuer wallet funded: %s\n", issuer.ClassicAddress) + + // ----------------------------------------------------- + + // Subject (destination) + fmt.Println("⏳ Setting up Subject wallet...") + subjectWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating subject wallet: %s\n", err) + return + } + + err = client.FundWallet(&subjectWallet) + if err != nil { + fmt.Printf("❌ Error funding subject wallet: %s\n", err) + return + } + fmt.Printf("✅ Subject wallet funded: %s\n", subjectWallet.ClassicAddress) + + // ----------------------------------------------------- + + // Creating the CredentialCreate transaction + fmt.Println("⏳ Creating CredentialCreate transaction...") + + expiration, err := rippleTime.IsoTimeToRippleTime(time.Now().Add(time.Hour * 24).Format(time.RFC3339)) + credentialType := types.CredentialType("6D795F63726564656E7469616C") + + if err != nil { + fmt.Printf("❌ Error converting expiration to ripple time: %s\n", err) + return + } + + txn := &transaction.CredentialCreate{ + BaseTx: transaction.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + CredentialType: credentialType, + Subject: types.Address(subjectWallet.ClassicAddress), + Expiration: uint32(expiration), + URI: hex.EncodeToString([]byte("https://example.com")), + } + + clients.SubmitTxBlobAndWait(client, txn, issuer) + + // ----------------------------------------------------- + + // Creating the CredentialAccept transaction + fmt.Println("⏳ Creating CredentialAccept transaction...") + + acceptTxn := &transaction.CredentialAccept{ + BaseTx: transaction.BaseTx{ + Account: types.Address(subjectWallet.ClassicAddress), + }, + CredentialType: credentialType, + Issuer: types.Address(issuer.ClassicAddress), + } + + clients.SubmitTxBlobAndWait(client, acceptTxn, subjectWallet) + + // ----------------------------------------------------- + + // Creating the CredentialDelete transaction + fmt.Println("⏳ Creating CredentialDelete transaction...") + + deleteTxn := &transaction.CredentialDelete{ + BaseTx: transaction.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + CredentialType: credentialType, + Issuer: types.Address(issuer.ClassicAddress), + Subject: types.Address(subjectWallet.ClassicAddress), + } + + clients.SubmitTxBlobAndWait(client, deleteTxn, issuer) } diff --git a/_code-samples/delegate-set/go/rpc/main.go b/_code-samples/delegate-set/go/rpc/main.go index 4bc070f0bc3..fa8ccea8a01 100644 --- a/_code-samples/delegate-set/go/rpc/main.go +++ b/_code-samples/delegate-set/go/rpc/main.go @@ -1,131 +1,131 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/rpc/types" - transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" - txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/rpc/types" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { - // Configure the client - cfg, err := rpc.NewClientConfig( - "https://s.devnet.rippletest.net:51234/", - rpc.WithFaucetProvider(faucet.NewDevnetFaucetProvider()), - ) - if err != nil { - panic(err) - } - client := rpc.NewClient(cfg) - - // Create and fund wallets - delegatorWallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - - delegateeWallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("⏳ Funding wallets...") - if err := client.FundWallet(&delegatorWallet); err != nil { - fmt.Println(err) - return - } - if err := client.FundWallet(&delegateeWallet); err != nil { - fmt.Println(err) - return - } - fmt.Println("💸 Wallets funded") - - // Check initial balances - delegatorBalance, err := client.GetXrpBalance(delegatorWallet.ClassicAddress) - if err != nil { - delegatorBalance = "0" - } - delegateeBalance, err := client.GetXrpBalance(delegateeWallet.ClassicAddress) - if err != nil { - delegateeBalance = "0" - } - - fmt.Printf("💳 Delegator initial balance: %s XRP\n", delegatorBalance) - fmt.Printf("💳 Delegatee initial balance: %s XRP\n", delegateeBalance) - fmt.Println() - - // Create DelegateSet transaction - delegateSetTx := &transactions.DelegateSet{ - BaseTx: transactions.BaseTx{ - Account: txnTypes.Address(delegatorWallet.ClassicAddress), - }, - Authorize: txnTypes.Address(delegateeWallet.ClassicAddress), - Permissions: []txnTypes.Permission{ - { - Permission: txnTypes.PermissionValue{ - PermissionValue: "Payment", - }, - }, - }, - } - - // Submit DelegateSet transaction - response, err := client.SubmitTxAndWait(delegateSetTx.Flatten(), &types.SubmitOptions{ - Autofill: true, - Wallet: &delegatorWallet, - }) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ DelegateSet transaction submitted") - fmt.Printf("🌐 Hash: %s\n", response.Hash) - fmt.Printf("🌐 Validated: %t\n", response.Validated) - fmt.Println() - - // Create delegated payment transaction - delegatedPaymentTx := &transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: txnTypes.Address(delegatorWallet.ClassicAddress), - Delegate: txnTypes.Address(delegateeWallet.ClassicAddress), - }, - Destination: txnTypes.Address(delegateeWallet.ClassicAddress), - Amount: txnTypes.XRPCurrencyAmount(1000000), // 1 XRP - } - - // Submit delegated payment - response2, err := client.SubmitTxAndWait(delegatedPaymentTx.Flatten(), &types.SubmitOptions{ - Autofill: true, - Wallet: &delegateeWallet, - }) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Delegated payment submitted") - fmt.Printf("🌐 Hash: %s\n", response2.Hash) - fmt.Printf("🌐 Validated: %t\n", response2.Validated) - fmt.Println() - - // Check final balances - finalDelegatorBalance, err := client.GetXrpBalance(delegatorWallet.ClassicAddress) - if err != nil { - finalDelegatorBalance = "0" - } - finalDelegateeBalance, err := client.GetXrpBalance(delegateeWallet.ClassicAddress) - if err != nil { - finalDelegateeBalance = "0" - } - - fmt.Printf("💳 Delegator final balance: %s XRP\n", finalDelegatorBalance) - fmt.Printf("💳 Delegatee final balance: %s XRP\n", finalDelegateeBalance) + // Configure the client + cfg, err := rpc.NewClientConfig( + "https://s.devnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + client := rpc.NewClient(cfg) + + // Create and fund wallets + delegatorWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + delegateeWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Funding wallets...") + if err := client.FundWallet(&delegatorWallet); err != nil { + fmt.Println(err) + return + } + if err := client.FundWallet(&delegateeWallet); err != nil { + fmt.Println(err) + return + } + fmt.Println("💸 Wallets funded") + + // Check initial balances + delegatorBalance, err := client.GetXrpBalance(delegatorWallet.ClassicAddress) + if err != nil { + delegatorBalance = "0" + } + delegateeBalance, err := client.GetXrpBalance(delegateeWallet.ClassicAddress) + if err != nil { + delegateeBalance = "0" + } + + fmt.Printf("💳 Delegator initial balance: %s XRP\n", delegatorBalance) + fmt.Printf("💳 Delegatee initial balance: %s XRP\n", delegateeBalance) + fmt.Println() + + // Create DelegateSet transaction + delegateSetTx := &transactions.DelegateSet{ + BaseTx: transactions.BaseTx{ + Account: txnTypes.Address(delegatorWallet.ClassicAddress), + }, + Authorize: txnTypes.Address(delegateeWallet.ClassicAddress), + Permissions: []txnTypes.Permission{ + { + Permission: txnTypes.PermissionValue{ + PermissionValue: "Payment", + }, + }, + }, + } + + // Submit DelegateSet transaction + response, err := client.SubmitTxAndWait(delegateSetTx.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &delegatorWallet, + }) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ DelegateSet transaction submitted") + fmt.Printf("🌐 Hash: %s\n", response.Hash) + fmt.Printf("🌐 Validated: %t\n", response.Validated) + fmt.Println() + + // Create delegated payment transaction + delegatedPaymentTx := &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: txnTypes.Address(delegatorWallet.ClassicAddress), + Delegate: txnTypes.Address(delegateeWallet.ClassicAddress), + }, + Destination: txnTypes.Address(delegateeWallet.ClassicAddress), + Amount: txnTypes.XRPCurrencyAmount(1000000), // 1 XRP + } + + // Submit delegated payment + response2, err := client.SubmitTxAndWait(delegatedPaymentTx.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &delegateeWallet, + }) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Delegated payment submitted") + fmt.Printf("🌐 Hash: %s\n", response2.Hash) + fmt.Printf("🌐 Validated: %t\n", response2.Validated) + fmt.Println() + + // Check final balances + finalDelegatorBalance, err := client.GetXrpBalance(delegatorWallet.ClassicAddress) + if err != nil { + finalDelegatorBalance = "0" + } + finalDelegateeBalance, err := client.GetXrpBalance(delegateeWallet.ClassicAddress) + if err != nil { + finalDelegateeBalance = "0" + } + + fmt.Printf("💳 Delegator final balance: %s XRP\n", finalDelegatorBalance) + fmt.Printf("💳 Delegatee final balance: %s XRP\n", finalDelegateeBalance) } diff --git a/_code-samples/delegate-set/go/ws/main.go b/_code-samples/delegate-set/go/ws/main.go index 7aac89cc56c..b0a8e88b146 100644 --- a/_code-samples/delegate-set/go/ws/main.go +++ b/_code-samples/delegate-set/go/ws/main.go @@ -1,151 +1,151 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" ) func main() { - // Connect to testnet - client := websocket.NewClient( - websocket.NewClientConfig(). - WithHost("wss://s.devnet.rippletest.net:51233"). - WithFaucetProvider(faucet.NewDevnetFaucetProvider()), - ) - defer client.Disconnect() - - if err := client.Connect(); err != nil { - fmt.Println(err) - return - } - - // Create and fund wallets - delegatorWallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - - delegateeWallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("⏳ Funding wallets...") - if err := client.FundWallet(&delegatorWallet); err != nil { - fmt.Println(err) - return - } - if err := client.FundWallet(&delegateeWallet); err != nil { - fmt.Println(err) - return - } - fmt.Println("💸 Wallets funded") - - // Check initial balances - delegatorBalance, err := client.GetXrpBalance(delegatorWallet.ClassicAddress) - if err != nil { - delegatorBalance = "0" - } - delegateeBalance, err := client.GetXrpBalance(delegateeWallet.ClassicAddress) - if err != nil { - delegateeBalance = "0" - } - - fmt.Printf("💳 Delegator initial balance: %s XRP\n", delegatorBalance) - fmt.Printf("💳 Delegatee initial balance: %s XRP\n", delegateeBalance) - fmt.Println() - - // Create DelegateSet transaction - delegateSetTx := &transactions.DelegateSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(delegatorWallet.ClassicAddress), - }, - Authorize: types.Address(delegateeWallet.ClassicAddress), - Permissions: []types.Permission{ - { - Permission: types.PermissionValue{ - PermissionValue: "Payment", - }, - }, - }, - } - - // Submit DelegateSet transaction - flattenedTx := delegateSetTx.Flatten() - if err := client.Autofill(&flattenedTx); err != nil { - fmt.Println(err) - return - } - - txBlob, _, err := delegatorWallet.Sign(flattenedTx) - if err != nil { - fmt.Println(err) - return - } - - response, err := client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ DelegateSet transaction submitted") - fmt.Printf("🌐 Hash: %s\n", response.Hash) - fmt.Printf("🌐 Validated: %t\n", response.Validated) - fmt.Println() - - // Create delegated payment transaction - delegatedPaymentTx := &transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(delegatorWallet.ClassicAddress), - Delegate: types.Address(delegateeWallet.ClassicAddress), - }, - Destination: types.Address(delegateeWallet.ClassicAddress), - Amount: types.XRPCurrencyAmount(1000000), // 1 XRP - } - - // Submit delegated payment - flatDelegatedPayment := delegatedPaymentTx.Flatten() - if err := client.Autofill(&flatDelegatedPayment); err != nil { - fmt.Println(err) - return - } - - txBlob2, _, err := delegateeWallet.Sign(flatDelegatedPayment) - if err != nil { - fmt.Println(err) - return - } - - response2, err := client.SubmitTxBlobAndWait(txBlob2, false) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Delegated payment submitted") - fmt.Printf("🌐 Hash: %s\n", response2.Hash) - fmt.Printf("🌐 Validated: %t\n", response2.Validated) - fmt.Println() - - // Check final balances - finalDelegatorBalance, err := client.GetXrpBalance(delegatorWallet.ClassicAddress) - if err != nil { - finalDelegatorBalance = "0" - } - finalDelegateeBalance, err := client.GetXrpBalance(delegateeWallet.ClassicAddress) - if err != nil { - finalDelegateeBalance = "0" - } - - fmt.Printf("💳 Delegator final balance: %s XRP\n", finalDelegatorBalance) - fmt.Printf("💳 Delegatee final balance: %s XRP\n", finalDelegateeBalance) + // Connect to testnet + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.devnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) + defer client.Disconnect() + + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + // Create and fund wallets + delegatorWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + delegateeWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Funding wallets...") + if err := client.FundWallet(&delegatorWallet); err != nil { + fmt.Println(err) + return + } + if err := client.FundWallet(&delegateeWallet); err != nil { + fmt.Println(err) + return + } + fmt.Println("💸 Wallets funded") + + // Check initial balances + delegatorBalance, err := client.GetXrpBalance(delegatorWallet.ClassicAddress) + if err != nil { + delegatorBalance = "0" + } + delegateeBalance, err := client.GetXrpBalance(delegateeWallet.ClassicAddress) + if err != nil { + delegateeBalance = "0" + } + + fmt.Printf("💳 Delegator initial balance: %s XRP\n", delegatorBalance) + fmt.Printf("💳 Delegatee initial balance: %s XRP\n", delegateeBalance) + fmt.Println() + + // Create DelegateSet transaction + delegateSetTx := &transactions.DelegateSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(delegatorWallet.ClassicAddress), + }, + Authorize: types.Address(delegateeWallet.ClassicAddress), + Permissions: []types.Permission{ + { + Permission: types.PermissionValue{ + PermissionValue: "Payment", + }, + }, + }, + } + + // Submit DelegateSet transaction + flattenedTx := delegateSetTx.Flatten() + if err := client.Autofill(&flattenedTx); err != nil { + fmt.Println(err) + return + } + + txBlob, _, err := delegatorWallet.Sign(flattenedTx) + if err != nil { + fmt.Println(err) + return + } + + response, err := client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ DelegateSet transaction submitted") + fmt.Printf("🌐 Hash: %s\n", response.Hash) + fmt.Printf("🌐 Validated: %t\n", response.Validated) + fmt.Println() + + // Create delegated payment transaction + delegatedPaymentTx := &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(delegatorWallet.ClassicAddress), + Delegate: types.Address(delegateeWallet.ClassicAddress), + }, + Destination: types.Address(delegateeWallet.ClassicAddress), + Amount: types.XRPCurrencyAmount(1000000), // 1 XRP + } + + // Submit delegated payment + flatDelegatedPayment := delegatedPaymentTx.Flatten() + if err := client.Autofill(&flatDelegatedPayment); err != nil { + fmt.Println(err) + return + } + + txBlob2, _, err := delegateeWallet.Sign(flatDelegatedPayment) + if err != nil { + fmt.Println(err) + return + } + + response2, err := client.SubmitTxBlobAndWait(txBlob2, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Delegated payment submitted") + fmt.Printf("🌐 Hash: %s\n", response2.Hash) + fmt.Printf("🌐 Validated: %t\n", response2.Validated) + fmt.Println() + + // Check final balances + finalDelegatorBalance, err := client.GetXrpBalance(delegatorWallet.ClassicAddress) + if err != nil { + finalDelegatorBalance = "0" + } + finalDelegateeBalance, err := client.GetXrpBalance(delegateeWallet.ClassicAddress) + if err != nil { + finalDelegateeBalance = "0" + } + + fmt.Printf("💳 Delegator final balance: %s XRP\n", finalDelegatorBalance) + fmt.Printf("💳 Delegatee final balance: %s XRP\n", finalDelegateeBalance) } diff --git a/_code-samples/deposit-preauth/go/rpc/main.go b/_code-samples/deposit-preauth/go/rpc/main.go index 1280390928e..e6e38c36405 100644 --- a/_code-samples/deposit-preauth/go/rpc/main.go +++ b/_code-samples/deposit-preauth/go/rpc/main.go @@ -1,220 +1,220 @@ package main import ( - "encoding/hex" - "fmt" - "time" - - "github.com/Peersyst/xrpl-go/examples/clients" - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/queries/account" - "github.com/Peersyst/xrpl-go/xrpl/queries/common" - rippletime "github.com/Peersyst/xrpl-go/xrpl/time" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "encoding/hex" + "fmt" + "time" + + "github.com/Peersyst/xrpl-go/examples/clients" + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/queries/account" + "github.com/Peersyst/xrpl-go/xrpl/queries/common" + rippletime "github.com/Peersyst/xrpl-go/xrpl/time" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { - client := clients.GetDevnetRpcClient() - - // Configure wallets - - // Issuer - fmt.Println("⏳ Setting up credential issuer wallet...") - issuer, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Printf("❌ Error creating credential issuer wallet: %s\n", err) - return - } - - err = client.FundWallet(&issuer) - if err != nil { - fmt.Printf("❌ Error funding credential issuer wallet: %s\n", err) - return - } - fmt.Printf("✅ Credential issuer wallet funded: %s\n", issuer.ClassicAddress) - - // ----------------------------------------------------- - - // Holder 1 - fmt.Println("⏳ Setting up holder 1 wallet...") - holderWallet1, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Printf("❌ Error creating holder 1 wallet: %s\n", err) - return - } - - err = client.FundWallet(&holderWallet1) - if err != nil { - fmt.Printf("❌ Error funding holder 1 wallet: %s\n", err) - return - } - fmt.Printf("✅ Holder 1 wallet funded: %s\n", holderWallet1.ClassicAddress) - - // ----------------------------------------------------- - - // Enabling DepositAuth on the issuer account with an AccountSet transaction - fmt.Println("⏳ Enabling DepositAuth on the issuer account...") - accountSetTx := &transaction.AccountSet{ - BaseTx: transaction.BaseTx{ - Account: issuer.ClassicAddress, - TransactionType: transaction.AccountSetTx, - }, - } - accountSetTx.SetAsfDepositAuth() - - clients.SubmitTxBlobAndWait(client, accountSetTx, issuer) - - // ----------------------------------------------------- - - // Creating the CredentialCreate transaction - fmt.Println("⏳ Creating the CredentialCreate transaction...") - - expiration, err := rippletime.IsoTimeToRippleTime(time.Now().Add(time.Hour * 24).Format(time.RFC3339)) - if err != nil { - fmt.Printf("❌ Error converting expiration to ripple time: %s\n", err) - return - } - credentialType := types.CredentialType("6D795F63726564656E7469616C") // my_credential - - credentialCreateTx := &transaction.CredentialCreate{ - BaseTx: transaction.BaseTx{ - Account: issuer.ClassicAddress, - TransactionType: transaction.CredentialCreateTx, - }, - Expiration: uint32(expiration), - CredentialType: credentialType, - Subject: types.Address(holderWallet1.ClassicAddress), - URI: hex.EncodeToString([]byte("https://example.com")), - } - - clients.SubmitTxBlobAndWait(client, credentialCreateTx, issuer) - - // ----------------------------------------------------- - - // Creating the CredentialAccept transaction - fmt.Println("⏳ Creating the CredentialAccept transaction...") - - credentialAcceptTx := &transaction.CredentialAccept{ - BaseTx: transaction.BaseTx{ - Account: holderWallet1.ClassicAddress, - TransactionType: transaction.CredentialAcceptTx, - }, - CredentialType: credentialType, - Issuer: types.Address(issuer.ClassicAddress), - } - - clients.SubmitTxBlobAndWait(client, credentialAcceptTx, holderWallet1) - - // ----------------------------------------------------- - - // Creating the DepositPreauth transaction - fmt.Println("⏳ Creating the DepositPreauth transaction using AuthorizeCredentials...") - - depositPreauthTx := &transaction.DepositPreauth{ - BaseTx: transaction.BaseTx{ - Account: issuer.ClassicAddress, - TransactionType: transaction.DepositPreauthTx, - }, - AuthorizeCredentials: []types.AuthorizeCredentialsWrapper{ - { - Credential: types.AuthorizeCredentials{ - Issuer: issuer.ClassicAddress, - CredentialType: credentialType, - }, - }, - }, - } - - clients.SubmitTxBlobAndWait(client, depositPreauthTx, issuer) - - // ----------------------------------------------------- - - // Get the credential ID - fmt.Println("⏳ Getting the credential ID from the holder 1 account...") - - objectsRequest := &account.ObjectsRequest{ - Account: holderWallet1.ClassicAddress, - Type: account.CredentialObject, - LedgerIndex: common.Validated, - } - - objectsResponse, err := client.GetAccountObjects(objectsRequest) - if err != nil { - fmt.Printf("❌ Error getting the credential ID: %s\n", err) - return - } - - // Check if we have any credential objects - if len(objectsResponse.AccountObjects) == 0 { - fmt.Println("❌ No credential objects found") - return - } - - // Extract the credential ID - credentialID, ok := objectsResponse.AccountObjects[0]["index"].(string) - if !ok { - fmt.Println("❌ Could not extract credential ID from response") - return - } - - fmt.Printf("✅ Credential ID: %s\n", credentialID) - fmt.Println() - - // ----------------------------------------------------- - - // Sending XRP to the holder 1 account - fmt.Println("⏳ Sending XRP to the issuer account, should succeed...") - - sendTx := &transaction.Payment{ - BaseTx: transaction.BaseTx{ - Account: holderWallet1.ClassicAddress, - TransactionType: transaction.PaymentTx, - }, - Amount: types.XRPCurrencyAmount(1000000), - Destination: issuer.ClassicAddress, - CredentialIDs: types.CredentialIDs{credentialID}, - } - - clients.SubmitTxBlobAndWait(client, sendTx, holderWallet1) - - // ----------------------------------------------------- - - // Unauthorizing the holder 1 account - fmt.Println("⏳ Unauthorizing the holder 1 account with the DepositPreauth transaction and the UnauthorizeCredentials field...") - - unauthorizeTx := &transaction.DepositPreauth{ - BaseTx: transaction.BaseTx{ - Account: issuer.ClassicAddress, - TransactionType: transaction.DepositPreauthTx, - }, - UnauthorizeCredentials: []types.AuthorizeCredentialsWrapper{ - { - Credential: types.AuthorizeCredentials{ - Issuer: issuer.ClassicAddress, - CredentialType: credentialType, - }, - }, - }, - } - - clients.SubmitTxBlobAndWait(client, unauthorizeTx, issuer) - - // ----------------------------------------------------- - - // Sending XRP to the holder 1 account again (which should fail) - fmt.Println("⏳ Sending XRP to the issuer account again (which should fail)...") - - sendTx2 := &transaction.Payment{ - BaseTx: transaction.BaseTx{ - Account: holderWallet1.ClassicAddress, - TransactionType: transaction.PaymentTx, - }, - Amount: types.XRPCurrencyAmount(1000000), - Destination: issuer.ClassicAddress, - CredentialIDs: types.CredentialIDs{credentialID}, - } - - clients.SubmitTxBlobAndWait(client, sendTx2, holderWallet1) + client := clients.GetDevnetRpcClient() + + // Configure wallets + + // Issuer + fmt.Println("⏳ Setting up credential issuer wallet...") + issuer, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating credential issuer wallet: %s\n", err) + return + } + + err = client.FundWallet(&issuer) + if err != nil { + fmt.Printf("❌ Error funding credential issuer wallet: %s\n", err) + return + } + fmt.Printf("✅ Credential issuer wallet funded: %s\n", issuer.ClassicAddress) + + // ----------------------------------------------------- + + // Holder 1 + fmt.Println("⏳ Setting up holder 1 wallet...") + holderWallet1, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating holder 1 wallet: %s\n", err) + return + } + + err = client.FundWallet(&holderWallet1) + if err != nil { + fmt.Printf("❌ Error funding holder 1 wallet: %s\n", err) + return + } + fmt.Printf("✅ Holder 1 wallet funded: %s\n", holderWallet1.ClassicAddress) + + // ----------------------------------------------------- + + // Enabling DepositAuth on the issuer account with an AccountSet transaction + fmt.Println("⏳ Enabling DepositAuth on the issuer account...") + accountSetTx := &transaction.AccountSet{ + BaseTx: transaction.BaseTx{ + Account: issuer.ClassicAddress, + TransactionType: transaction.AccountSetTx, + }, + } + accountSetTx.SetAsfDepositAuth() + + clients.SubmitTxBlobAndWait(client, accountSetTx, issuer) + + // ----------------------------------------------------- + + // Creating the CredentialCreate transaction + fmt.Println("⏳ Creating the CredentialCreate transaction...") + + expiration, err := rippletime.IsoTimeToRippleTime(time.Now().Add(time.Hour * 24).Format(time.RFC3339)) + if err != nil { + fmt.Printf("❌ Error converting expiration to ripple time: %s\n", err) + return + } + credentialType := types.CredentialType("6D795F63726564656E7469616C") // my_credential + + credentialCreateTx := &transaction.CredentialCreate{ + BaseTx: transaction.BaseTx{ + Account: issuer.ClassicAddress, + TransactionType: transaction.CredentialCreateTx, + }, + Expiration: uint32(expiration), + CredentialType: credentialType, + Subject: types.Address(holderWallet1.ClassicAddress), + URI: hex.EncodeToString([]byte("https://example.com")), + } + + clients.SubmitTxBlobAndWait(client, credentialCreateTx, issuer) + + // ----------------------------------------------------- + + // Creating the CredentialAccept transaction + fmt.Println("⏳ Creating the CredentialAccept transaction...") + + credentialAcceptTx := &transaction.CredentialAccept{ + BaseTx: transaction.BaseTx{ + Account: holderWallet1.ClassicAddress, + TransactionType: transaction.CredentialAcceptTx, + }, + CredentialType: credentialType, + Issuer: types.Address(issuer.ClassicAddress), + } + + clients.SubmitTxBlobAndWait(client, credentialAcceptTx, holderWallet1) + + // ----------------------------------------------------- + + // Creating the DepositPreauth transaction + fmt.Println("⏳ Creating the DepositPreauth transaction using AuthorizeCredentials...") + + depositPreauthTx := &transaction.DepositPreauth{ + BaseTx: transaction.BaseTx{ + Account: issuer.ClassicAddress, + TransactionType: transaction.DepositPreauthTx, + }, + AuthorizeCredentials: []types.AuthorizeCredentialsWrapper{ + { + Credential: types.AuthorizeCredentials{ + Issuer: issuer.ClassicAddress, + CredentialType: credentialType, + }, + }, + }, + } + + clients.SubmitTxBlobAndWait(client, depositPreauthTx, issuer) + + // ----------------------------------------------------- + + // Get the credential ID + fmt.Println("⏳ Getting the credential ID from the holder 1 account...") + + objectsRequest := &account.ObjectsRequest{ + Account: holderWallet1.ClassicAddress, + Type: account.CredentialObject, + LedgerIndex: common.Validated, + } + + objectsResponse, err := client.GetAccountObjects(objectsRequest) + if err != nil { + fmt.Printf("❌ Error getting the credential ID: %s\n", err) + return + } + + // Check if we have any credential objects + if len(objectsResponse.AccountObjects) == 0 { + fmt.Println("❌ No credential objects found") + return + } + + // Extract the credential ID + credentialID, ok := objectsResponse.AccountObjects[0]["index"].(string) + if !ok { + fmt.Println("❌ Could not extract credential ID from response") + return + } + + fmt.Printf("✅ Credential ID: %s\n", credentialID) + fmt.Println() + + // ----------------------------------------------------- + + // Sending XRP to the holder 1 account + fmt.Println("⏳ Sending XRP to the issuer account, should succeed...") + + sendTx := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: holderWallet1.ClassicAddress, + TransactionType: transaction.PaymentTx, + }, + Amount: types.XRPCurrencyAmount(1000000), + Destination: issuer.ClassicAddress, + CredentialIDs: types.CredentialIDs{credentialID}, + } + + clients.SubmitTxBlobAndWait(client, sendTx, holderWallet1) + + // ----------------------------------------------------- + + // Unauthorizing the holder 1 account + fmt.Println("⏳ Unauthorizing the holder 1 account with the DepositPreauth transaction and the UnauthorizeCredentials field...") + + unauthorizeTx := &transaction.DepositPreauth{ + BaseTx: transaction.BaseTx{ + Account: issuer.ClassicAddress, + TransactionType: transaction.DepositPreauthTx, + }, + UnauthorizeCredentials: []types.AuthorizeCredentialsWrapper{ + { + Credential: types.AuthorizeCredentials{ + Issuer: issuer.ClassicAddress, + CredentialType: credentialType, + }, + }, + }, + } + + clients.SubmitTxBlobAndWait(client, unauthorizeTx, issuer) + + // ----------------------------------------------------- + + // Sending XRP to the holder 1 account again (which should fail) + fmt.Println("⏳ Sending XRP to the issuer account again (which should fail)...") + + sendTx2 := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: holderWallet1.ClassicAddress, + TransactionType: transaction.PaymentTx, + }, + Amount: types.XRPCurrencyAmount(1000000), + Destination: issuer.ClassicAddress, + CredentialIDs: types.CredentialIDs{credentialID}, + } + + clients.SubmitTxBlobAndWait(client, sendTx2, holderWallet1) } diff --git a/_code-samples/deposit-preauth/go/ws/main.go b/_code-samples/deposit-preauth/go/ws/main.go index 2d0a304ec37..89fb2f42f37 100644 --- a/_code-samples/deposit-preauth/go/ws/main.go +++ b/_code-samples/deposit-preauth/go/ws/main.go @@ -1,234 +1,234 @@ package main import ( - "encoding/hex" - "fmt" - "time" - - "github.com/Peersyst/xrpl-go/examples/clients" - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/queries/account" - "github.com/Peersyst/xrpl-go/xrpl/queries/common" - rippletime "github.com/Peersyst/xrpl-go/xrpl/time" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "encoding/hex" + "fmt" + "time" + + "github.com/Peersyst/xrpl-go/examples/clients" + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/queries/account" + "github.com/Peersyst/xrpl-go/xrpl/queries/common" + rippletime "github.com/Peersyst/xrpl-go/xrpl/time" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { - fmt.Println("⏳ Setting up client...") - - client := clients.GetDevnetWebsocketClient() - fmt.Println("Connecting to server...") - if err := client.Connect(); err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Client configured!") - fmt.Println() - - fmt.Printf("Connection: %t", client.IsConnected()) - fmt.Println() - - // Configure wallets - - // Issuer - fmt.Println("⏳ Setting up credential issuer wallet...") - issuer, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Printf("❌ Error creating credential issuer wallet: %s\n", err) - return - } - - err = client.FundWallet(&issuer) - if err != nil { - fmt.Printf("❌ Error funding credential issuer wallet: %s\n", err) - return - } - fmt.Printf("✅ Credential issuer wallet funded: %s\n", issuer.ClassicAddress) - - // ----------------------------------------------------- - - // Holder 1 - fmt.Println("⏳ Setting up holder 1 wallet...") - holderWallet1, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Printf("❌ Error creating holder 1 wallet: %s\n", err) - return - } - - err = client.FundWallet(&holderWallet1) - if err != nil { - fmt.Printf("❌ Error funding holder 1 wallet: %s\n", err) - return - } - fmt.Printf("✅ Holder 1 wallet funded: %s\n", holderWallet1.ClassicAddress) - - // ----------------------------------------------------- - - // Enabling DepositAuth on the issuer account with an AccountSet transaction - fmt.Println("⏳ Enabling DepositAuth on the issuer account...") - accountSetTx := &transaction.AccountSet{ - BaseTx: transaction.BaseTx{ - Account: issuer.ClassicAddress, - TransactionType: transaction.AccountSetTx, - }, - } - accountSetTx.SetAsfDepositAuth() - - clients.SubmitTxBlobAndWait(client, accountSetTx, issuer) - - // ----------------------------------------------------- - - // Creating the CredentialCreate transaction - fmt.Println("⏳ Creating the CredentialCreate transaction...") - - expiration, err := rippletime.IsoTimeToRippleTime(time.Now().Add(time.Hour * 24).Format(time.RFC3339)) - if err != nil { - fmt.Printf("❌ Error converting expiration to ripple time: %s\n", err) - return - } - credentialType := types.CredentialType("6D795F63726564656E7469616C") // my_credential - - credentialCreateTx := &transaction.CredentialCreate{ - BaseTx: transaction.BaseTx{ - Account: issuer.ClassicAddress, - TransactionType: transaction.CredentialCreateTx, - }, - Expiration: uint32(expiration), - CredentialType: credentialType, - Subject: types.Address(holderWallet1.ClassicAddress), - URI: hex.EncodeToString([]byte("https://example.com")), - } - - clients.SubmitTxBlobAndWait(client, credentialCreateTx, issuer) - - // ----------------------------------------------------- - - // Creating the CredentialAccept transaction - fmt.Println("⏳ Creating the CredentialAccept transaction...") - - credentialAcceptTx := &transaction.CredentialAccept{ - BaseTx: transaction.BaseTx{ - Account: holderWallet1.ClassicAddress, - TransactionType: transaction.CredentialAcceptTx, - }, - CredentialType: credentialType, - Issuer: types.Address(issuer.ClassicAddress), - } - - clients.SubmitTxBlobAndWait(client, credentialAcceptTx, holderWallet1) - - // ----------------------------------------------------- - - // Creating the DepositPreauth transaction - fmt.Println("⏳ Creating the DepositPreauth transaction using AuthorizeCredentials...") - - depositPreauthTx := &transaction.DepositPreauth{ - BaseTx: transaction.BaseTx{ - Account: issuer.ClassicAddress, - TransactionType: transaction.DepositPreauthTx, - }, - AuthorizeCredentials: []types.AuthorizeCredentialsWrapper{ - { - Credential: types.AuthorizeCredentials{ - Issuer: issuer.ClassicAddress, - CredentialType: credentialType, - }, - }, - }, - } - - clients.SubmitTxBlobAndWait(client, depositPreauthTx, issuer) - - // ----------------------------------------------------- - - // Get the credential ID - fmt.Println("⏳ Getting the credential ID from the holder 1 account...") - - objectsRequest := &account.ObjectsRequest{ - Account: holderWallet1.ClassicAddress, - Type: account.CredentialObject, - LedgerIndex: common.Validated, - } - - objectsResponse, err := client.GetAccountObjects(objectsRequest) - if err != nil { - fmt.Printf("❌ Error getting the credential ID: %s\n", err) - return - } - - // Check if we have any credential objects - if len(objectsResponse.AccountObjects) == 0 { - fmt.Println("❌ No credential objects found") - return - } - - // Extract the credential ID - credentialID, ok := objectsResponse.AccountObjects[0]["index"].(string) - if !ok { - fmt.Println("❌ Could not extract credential ID from response") - return - } - - fmt.Printf("✅ Credential ID: %s\n", credentialID) - fmt.Println() - - // ----------------------------------------------------- - - // Sending XRP to the holder 1 account - fmt.Println("⏳ Sending XRP to the issuer account, should succeed...") - - sendTx := &transaction.Payment{ - BaseTx: transaction.BaseTx{ - Account: holderWallet1.ClassicAddress, - TransactionType: transaction.PaymentTx, - }, - Amount: types.XRPCurrencyAmount(1000000), - Destination: issuer.ClassicAddress, - CredentialIDs: types.CredentialIDs{credentialID}, - } - - clients.SubmitTxBlobAndWait(client, sendTx, holderWallet1) - - // ----------------------------------------------------- - - // Unauthorize the holder 1 account - fmt.Println("⏳ Unauthorize the holder 1 account with the DepositPreauth transaction and the UnauthorizeCredentials field...") - - unauthorizeTx := &transaction.DepositPreauth{ - BaseTx: transaction.BaseTx{ - Account: issuer.ClassicAddress, - TransactionType: transaction.DepositPreauthTx, - }, - UnauthorizeCredentials: []types.AuthorizeCredentialsWrapper{ - { - Credential: types.AuthorizeCredentials{ - Issuer: issuer.ClassicAddress, - CredentialType: credentialType, - }, - }, - }, - } - - clients.SubmitTxBlobAndWait(client, unauthorizeTx, issuer) - - // ----------------------------------------------------- - - // Sending XRP to the holder 1 account again (which should fail) - fmt.Println("⏳ Sending XRP to the issuer account again (which should fail)...") - - sendTx2 := &transaction.Payment{ - BaseTx: transaction.BaseTx{ - Account: holderWallet1.ClassicAddress, - TransactionType: transaction.PaymentTx, - }, - Amount: types.XRPCurrencyAmount(1000000), - Destination: issuer.ClassicAddress, - CredentialIDs: types.CredentialIDs{credentialID}, - } - - clients.SubmitTxBlobAndWait(client, sendTx2, holderWallet1) + fmt.Println("⏳ Setting up client...") + + client := clients.GetDevnetWebsocketClient() + fmt.Println("Connecting to server...") + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Client configured!") + fmt.Println() + + fmt.Printf("Connection: %t", client.IsConnected()) + fmt.Println() + + // Configure wallets + + // Issuer + fmt.Println("⏳ Setting up credential issuer wallet...") + issuer, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating credential issuer wallet: %s\n", err) + return + } + + err = client.FundWallet(&issuer) + if err != nil { + fmt.Printf("❌ Error funding credential issuer wallet: %s\n", err) + return + } + fmt.Printf("✅ Credential issuer wallet funded: %s\n", issuer.ClassicAddress) + + // ----------------------------------------------------- + + // Holder 1 + fmt.Println("⏳ Setting up holder 1 wallet...") + holderWallet1, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating holder 1 wallet: %s\n", err) + return + } + + err = client.FundWallet(&holderWallet1) + if err != nil { + fmt.Printf("❌ Error funding holder 1 wallet: %s\n", err) + return + } + fmt.Printf("✅ Holder 1 wallet funded: %s\n", holderWallet1.ClassicAddress) + + // ----------------------------------------------------- + + // Enabling DepositAuth on the issuer account with an AccountSet transaction + fmt.Println("⏳ Enabling DepositAuth on the issuer account...") + accountSetTx := &transaction.AccountSet{ + BaseTx: transaction.BaseTx{ + Account: issuer.ClassicAddress, + TransactionType: transaction.AccountSetTx, + }, + } + accountSetTx.SetAsfDepositAuth() + + clients.SubmitTxBlobAndWait(client, accountSetTx, issuer) + + // ----------------------------------------------------- + + // Creating the CredentialCreate transaction + fmt.Println("⏳ Creating the CredentialCreate transaction...") + + expiration, err := rippletime.IsoTimeToRippleTime(time.Now().Add(time.Hour * 24).Format(time.RFC3339)) + if err != nil { + fmt.Printf("❌ Error converting expiration to ripple time: %s\n", err) + return + } + credentialType := types.CredentialType("6D795F63726564656E7469616C") // my_credential + + credentialCreateTx := &transaction.CredentialCreate{ + BaseTx: transaction.BaseTx{ + Account: issuer.ClassicAddress, + TransactionType: transaction.CredentialCreateTx, + }, + Expiration: uint32(expiration), + CredentialType: credentialType, + Subject: types.Address(holderWallet1.ClassicAddress), + URI: hex.EncodeToString([]byte("https://example.com")), + } + + clients.SubmitTxBlobAndWait(client, credentialCreateTx, issuer) + + // ----------------------------------------------------- + + // Creating the CredentialAccept transaction + fmt.Println("⏳ Creating the CredentialAccept transaction...") + + credentialAcceptTx := &transaction.CredentialAccept{ + BaseTx: transaction.BaseTx{ + Account: holderWallet1.ClassicAddress, + TransactionType: transaction.CredentialAcceptTx, + }, + CredentialType: credentialType, + Issuer: types.Address(issuer.ClassicAddress), + } + + clients.SubmitTxBlobAndWait(client, credentialAcceptTx, holderWallet1) + + // ----------------------------------------------------- + + // Creating the DepositPreauth transaction + fmt.Println("⏳ Creating the DepositPreauth transaction using AuthorizeCredentials...") + + depositPreauthTx := &transaction.DepositPreauth{ + BaseTx: transaction.BaseTx{ + Account: issuer.ClassicAddress, + TransactionType: transaction.DepositPreauthTx, + }, + AuthorizeCredentials: []types.AuthorizeCredentialsWrapper{ + { + Credential: types.AuthorizeCredentials{ + Issuer: issuer.ClassicAddress, + CredentialType: credentialType, + }, + }, + }, + } + + clients.SubmitTxBlobAndWait(client, depositPreauthTx, issuer) + + // ----------------------------------------------------- + + // Get the credential ID + fmt.Println("⏳ Getting the credential ID from the holder 1 account...") + + objectsRequest := &account.ObjectsRequest{ + Account: holderWallet1.ClassicAddress, + Type: account.CredentialObject, + LedgerIndex: common.Validated, + } + + objectsResponse, err := client.GetAccountObjects(objectsRequest) + if err != nil { + fmt.Printf("❌ Error getting the credential ID: %s\n", err) + return + } + + // Check if we have any credential objects + if len(objectsResponse.AccountObjects) == 0 { + fmt.Println("❌ No credential objects found") + return + } + + // Extract the credential ID + credentialID, ok := objectsResponse.AccountObjects[0]["index"].(string) + if !ok { + fmt.Println("❌ Could not extract credential ID from response") + return + } + + fmt.Printf("✅ Credential ID: %s\n", credentialID) + fmt.Println() + + // ----------------------------------------------------- + + // Sending XRP to the holder 1 account + fmt.Println("⏳ Sending XRP to the issuer account, should succeed...") + + sendTx := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: holderWallet1.ClassicAddress, + TransactionType: transaction.PaymentTx, + }, + Amount: types.XRPCurrencyAmount(1000000), + Destination: issuer.ClassicAddress, + CredentialIDs: types.CredentialIDs{credentialID}, + } + + clients.SubmitTxBlobAndWait(client, sendTx, holderWallet1) + + // ----------------------------------------------------- + + // Unauthorize the holder 1 account + fmt.Println("⏳ Unauthorize the holder 1 account with the DepositPreauth transaction and the UnauthorizeCredentials field...") + + unauthorizeTx := &transaction.DepositPreauth{ + BaseTx: transaction.BaseTx{ + Account: issuer.ClassicAddress, + TransactionType: transaction.DepositPreauthTx, + }, + UnauthorizeCredentials: []types.AuthorizeCredentialsWrapper{ + { + Credential: types.AuthorizeCredentials{ + Issuer: issuer.ClassicAddress, + CredentialType: credentialType, + }, + }, + }, + } + + clients.SubmitTxBlobAndWait(client, unauthorizeTx, issuer) + + // ----------------------------------------------------- + + // Sending XRP to the holder 1 account again (which should fail) + fmt.Println("⏳ Sending XRP to the issuer account again (which should fail)...") + + sendTx2 := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: holderWallet1.ClassicAddress, + TransactionType: transaction.PaymentTx, + }, + Amount: types.XRPCurrencyAmount(1000000), + Destination: issuer.ClassicAddress, + CredentialIDs: types.CredentialIDs{credentialID}, + } + + clients.SubmitTxBlobAndWait(client, sendTx2, holderWallet1) } diff --git a/_code-samples/freeze/go/rpc/main.go b/_code-samples/freeze/go/rpc/main.go index e5a874cd758..9848e1d29f9 100644 --- a/_code-samples/freeze/go/rpc/main.go +++ b/_code-samples/freeze/go/rpc/main.go @@ -1,347 +1,347 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/currency" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/currency" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) const ( - currencyCode = "USDA" + currencyCode = "USDA" ) type SubmittableTransaction interface { - TxType() transactions.TxType - Flatten() transactions.FlatTransaction // Ensures all transactions can be flattened + TxType() transactions.TxType + Flatten() transactions.FlatTransaction // Ensures all transactions can be flattened } func main() { - client := getRpcClient() - - // Configure wallets - - // Issuer - fmt.Println("⏳ Setting up issuer wallet...") - issuer, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Printf("❌ Error creating issuer wallet: %s\n", err) - return - } - - err = client.FundWallet(&issuer) - if err != nil { - fmt.Printf("❌ Error funding issuer wallet: %s\n", err) - return - } - fmt.Printf("✅ Issuer wallet funded: %s\n", issuer.ClassicAddress) - - // ----------------------------------------------------- - - // Holder 1 - fmt.Println("⏳ Setting up holder 1 wallet...") - holderWallet1, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Printf("❌ Error creating holder wallet 1: %s\n", err) - return - } - - err = client.FundWallet(&holderWallet1) - if err != nil { - fmt.Printf("❌ Error funding holder wallet 1: %s\n", err) - return - } - fmt.Printf("✅ Holder wallet 1 funded: %s\n", holderWallet1.ClassicAddress) - - // ----------------------------------------------------- - - // Holder 2 - fmt.Println("⏳ Setting up holder 2 wallet...") - holderWallet2, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Printf("❌ Error creating holder wallet 2: %s\n", err) - return - } - - err = client.FundWallet(&holderWallet2) - if err != nil { - fmt.Printf("❌ Error funding holder wallet 2: %s\n", err) - return - } - fmt.Printf("✅ Holder wallet 2 funded: %s\n", holderWallet2.ClassicAddress) - fmt.Println() - - fmt.Println("✅ Wallets setup complete!") - fmt.Println() - - // ----------------------------------------------------- - - // Configuring Issuing account - fmt.Println("⏳ Configuring issuer address settings...") - accountSet := &transactions.AccountSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(issuer.ClassicAddress), - }, - Domain: types.Domain("697373756572"), // issuer - } - - accountSet.SetAsfDefaultRipple() - submitAndWait(client, accountSet, issuer) - - // ----------------------------------------------------- - - // Trustline from the holder 1 to the issuer - fmt.Println("⏳ Setting up trustline from holder 1 to the issuer...") - trustSet := &transactions.TrustSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(holderWallet1.ClassicAddress), - }, - LimitAmount: types.IssuedCurrencyAmount{ - Currency: currency.ConvertStringToHex(currencyCode), - Issuer: types.Address(issuer.ClassicAddress), - Value: "1000000000", - }} - trustSet.SetSetNoRippleFlag() - submitAndWait(client, trustSet, holderWallet1) - - // ----------------------------------------------------- - - // Trustline from the holder 2 to the issuer - fmt.Println("⏳ Setting up trustline from holder 2 to the issuer...") - trustSet = &transactions.TrustSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(holderWallet2.ClassicAddress), - }, - LimitAmount: types.IssuedCurrencyAmount{ - Currency: currency.ConvertStringToHex(currencyCode), - Issuer: types.Address(issuer.ClassicAddress), - Value: "1000000000", - }, - } - trustSet.SetSetNoRippleFlag() - submitAndWait(client, trustSet, holderWallet2) - - // ----------------------------------------------------- - - // Minting to Holder 1 - fmt.Println("⏳ Minting to Holder 1...") - payment := &transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(issuer.ClassicAddress), - }, - Destination: types.Address(holderWallet1.ClassicAddress), - Amount: types.IssuedCurrencyAmount{ - Currency: currency.ConvertStringToHex(currencyCode), - Issuer: types.Address(issuer.ClassicAddress), - Value: "50000", - }, - } - submitAndWait(client, payment, issuer) - - // ----------------------------------------------------- - - // Minting to Holder 2 - fmt.Println("⏳ Minting to Holder 2...") - payment = &transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(issuer.ClassicAddress), - }, - Destination: types.Address(holderWallet2.ClassicAddress), - Amount: types.IssuedCurrencyAmount{ - Currency: currency.ConvertStringToHex(currencyCode), - Issuer: types.Address(issuer.ClassicAddress), - Value: "40000", - }, - } - submitAndWait(client, payment, issuer) - - // ----------------------------------------------------- - - // Sending payment from Holder 1 to Holder 2 - fmt.Println("⏳ Sending payment from Holder 1 to Holder 2...") - payment = &transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(holderWallet1.ClassicAddress), - }, - Destination: types.Address(holderWallet2.ClassicAddress), - Amount: types.IssuedCurrencyAmount{ - Currency: currency.ConvertStringToHex(currencyCode), - Issuer: types.Address(issuer.ClassicAddress), - Value: "20", - }, - } - submitAndWait(client, payment, holderWallet1) - - // ----------------------------------------------------- - - // Freezing and Deep Freezing holder1 - fmt.Println("⏳ Freezing and Deep Freezing holder 1 trustline...") - trustSet = &transactions.TrustSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(issuer.ClassicAddress), - }, - LimitAmount: types.IssuedCurrencyAmount{ - Currency: currency.ConvertStringToHex(currencyCode), - Issuer: types.Address(holderWallet1.ClassicAddress), - Value: "0", - }, - } - trustSet.SetSetFreezeFlag() - trustSet.SetSetDeepFreezeFlag() - - submitAndWait(client, trustSet, issuer) - - // ------------------- SHOULD FAIL ⬇️ ------------------ - - // Sending payment from Holder 1 to Holder 2 (which should fail), Holder 1 can't decrease its balance - fmt.Println("⏳ Sending payment from Holder 1 to Holder 2 (which should fail). Holder 1 can't decrease its balance...") - payment = &transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(holderWallet1.ClassicAddress), - }, - Destination: types.Address(holderWallet2.ClassicAddress), - Amount: types.IssuedCurrencyAmount{ - Currency: currency.ConvertStringToHex(currencyCode), - Issuer: types.Address(issuer.ClassicAddress), - Value: "10", - }, - } - submitAndWait(client, payment, holderWallet1) - - // ------------------- SHOULD FAIL ⬇️ ------------------ - - // Sending payment from Holder 2 to Holder 1 (which should fail), Holder 1 can't increase its balance - fmt.Println("⏳ Sending payment from Holder 2 to Holder 1 (which should fail). Holder 1 can't increase its balance...") - payment = &transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(holderWallet2.ClassicAddress), - }, - Destination: types.Address(holderWallet1.ClassicAddress), - Amount: types.IssuedCurrencyAmount{ - Currency: currency.ConvertStringToHex(currencyCode), - Issuer: types.Address(issuer.ClassicAddress), - Value: "10", - }, - } - submitAndWait(client, payment, holderWallet2) - - // ------------------- SHOULD FAIL ⬇️ ------------------ - - // Creating OfferCreate transaction (which should fail), Holder 1 can't create an offer - fmt.Println("⏳ Creating OfferCreate transaction (which should fail). Holder 1 can't create an offer...") - offerCreate := &transactions.OfferCreate{ - BaseTx: transactions.BaseTx{ - Account: types.Address(holderWallet1.ClassicAddress), - }, - TakerPays: types.IssuedCurrencyAmount{ - Currency: currency.ConvertStringToHex(currencyCode), - Issuer: types.Address(issuer.ClassicAddress), - Value: "10", - }, - TakerGets: types.XRPCurrencyAmount(10), - } - submitAndWait(client, offerCreate, holderWallet1) - - // ----------------------------------------------------- - - // Unfreezing and Deep Unfreezing holder 1 - fmt.Println("⏳ Unfreezing and Deep Unfreezing holder 1 trustline...") - trustSet = &transactions.TrustSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(issuer.ClassicAddress), - }, - LimitAmount: types.IssuedCurrencyAmount{ - Currency: currency.ConvertStringToHex(currencyCode), - Issuer: types.Address(holderWallet1.ClassicAddress), - Value: "0", - }, - } - trustSet.SetClearFreezeFlag() - trustSet.SetClearDeepFreezeFlag() - submitAndWait(client, trustSet, issuer) - - // ----------------------------------------------------- - - // Sending payment from Holder 1 to Holder 2 (which should succeed), Holder 1 can decrease its balance - fmt.Println("⏳ Sending payment from Holder 1 to Holder 2 (which should succeed). Holder 1 can decrease its balance...") - payment = &transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(holderWallet1.ClassicAddress), - }, - Destination: types.Address(holderWallet2.ClassicAddress), - Amount: types.IssuedCurrencyAmount{ - Currency: currency.ConvertStringToHex(currencyCode), - Issuer: types.Address(issuer.ClassicAddress), - Value: "10", - }, - } - submitAndWait(client, payment, holderWallet1) - - // ----------------------------------------------------- - - // Sending payment from Holder 2 to Holder 1 (which should succeed), Holder 1 can increase its balance - fmt.Println("⏳ Sending payment from Holder 2 to Holder 1 (which should succeed). Holder 1 can increase its balance...") - payment = &transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(holderWallet2.ClassicAddress), - }, - Destination: types.Address(holderWallet1.ClassicAddress), - Amount: types.IssuedCurrencyAmount{ - Currency: currency.ConvertStringToHex(currencyCode), - Issuer: types.Address(issuer.ClassicAddress), - Value: "10", - }, - } - submitAndWait(client, payment, holderWallet2) + client := getRpcClient() + + // Configure wallets + + // Issuer + fmt.Println("⏳ Setting up issuer wallet...") + issuer, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating issuer wallet: %s\n", err) + return + } + + err = client.FundWallet(&issuer) + if err != nil { + fmt.Printf("❌ Error funding issuer wallet: %s\n", err) + return + } + fmt.Printf("✅ Issuer wallet funded: %s\n", issuer.ClassicAddress) + + // ----------------------------------------------------- + + // Holder 1 + fmt.Println("⏳ Setting up holder 1 wallet...") + holderWallet1, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating holder wallet 1: %s\n", err) + return + } + + err = client.FundWallet(&holderWallet1) + if err != nil { + fmt.Printf("❌ Error funding holder wallet 1: %s\n", err) + return + } + fmt.Printf("✅ Holder wallet 1 funded: %s\n", holderWallet1.ClassicAddress) + + // ----------------------------------------------------- + + // Holder 2 + fmt.Println("⏳ Setting up holder 2 wallet...") + holderWallet2, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating holder wallet 2: %s\n", err) + return + } + + err = client.FundWallet(&holderWallet2) + if err != nil { + fmt.Printf("❌ Error funding holder wallet 2: %s\n", err) + return + } + fmt.Printf("✅ Holder wallet 2 funded: %s\n", holderWallet2.ClassicAddress) + fmt.Println() + + fmt.Println("✅ Wallets setup complete!") + fmt.Println() + + // ----------------------------------------------------- + + // Configuring Issuing account + fmt.Println("⏳ Configuring issuer address settings...") + accountSet := &transactions.AccountSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + Domain: types.Domain("697373756572"), // issuer + } + + accountSet.SetAsfDefaultRipple() + submitAndWait(client, accountSet, issuer) + + // ----------------------------------------------------- + + // Trustline from the holder 1 to the issuer + fmt.Println("⏳ Setting up trustline from holder 1 to the issuer...") + trustSet := &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet1.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "1000000000", + }} + trustSet.SetSetNoRippleFlag() + submitAndWait(client, trustSet, holderWallet1) + + // ----------------------------------------------------- + + // Trustline from the holder 2 to the issuer + fmt.Println("⏳ Setting up trustline from holder 2 to the issuer...") + trustSet = &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet2.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "1000000000", + }, + } + trustSet.SetSetNoRippleFlag() + submitAndWait(client, trustSet, holderWallet2) + + // ----------------------------------------------------- + + // Minting to Holder 1 + fmt.Println("⏳ Minting to Holder 1...") + payment := &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + Destination: types.Address(holderWallet1.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "50000", + }, + } + submitAndWait(client, payment, issuer) + + // ----------------------------------------------------- + + // Minting to Holder 2 + fmt.Println("⏳ Minting to Holder 2...") + payment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + Destination: types.Address(holderWallet2.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "40000", + }, + } + submitAndWait(client, payment, issuer) + + // ----------------------------------------------------- + + // Sending payment from Holder 1 to Holder 2 + fmt.Println("⏳ Sending payment from Holder 1 to Holder 2...") + payment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet1.ClassicAddress), + }, + Destination: types.Address(holderWallet2.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "20", + }, + } + submitAndWait(client, payment, holderWallet1) + + // ----------------------------------------------------- + + // Freezing and Deep Freezing holder1 + fmt.Println("⏳ Freezing and Deep Freezing holder 1 trustline...") + trustSet = &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(holderWallet1.ClassicAddress), + Value: "0", + }, + } + trustSet.SetSetFreezeFlag() + trustSet.SetSetDeepFreezeFlag() + + submitAndWait(client, trustSet, issuer) + + // ------------------- SHOULD FAIL ⬇️ ------------------ + + // Sending payment from Holder 1 to Holder 2 (which should fail), Holder 1 can't decrease its balance + fmt.Println("⏳ Sending payment from Holder 1 to Holder 2 (which should fail). Holder 1 can't decrease its balance...") + payment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet1.ClassicAddress), + }, + Destination: types.Address(holderWallet2.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "10", + }, + } + submitAndWait(client, payment, holderWallet1) + + // ------------------- SHOULD FAIL ⬇️ ------------------ + + // Sending payment from Holder 2 to Holder 1 (which should fail), Holder 1 can't increase its balance + fmt.Println("⏳ Sending payment from Holder 2 to Holder 1 (which should fail). Holder 1 can't increase its balance...") + payment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet2.ClassicAddress), + }, + Destination: types.Address(holderWallet1.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "10", + }, + } + submitAndWait(client, payment, holderWallet2) + + // ------------------- SHOULD FAIL ⬇️ ------------------ + + // Creating OfferCreate transaction (which should fail), Holder 1 can't create an offer + fmt.Println("⏳ Creating OfferCreate transaction (which should fail). Holder 1 can't create an offer...") + offerCreate := &transactions.OfferCreate{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet1.ClassicAddress), + }, + TakerPays: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "10", + }, + TakerGets: types.XRPCurrencyAmount(10), + } + submitAndWait(client, offerCreate, holderWallet1) + + // ----------------------------------------------------- + + // Unfreezing and Deep Unfreezing holder 1 + fmt.Println("⏳ Unfreezing and Deep Unfreezing holder 1 trustline...") + trustSet = &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(holderWallet1.ClassicAddress), + Value: "0", + }, + } + trustSet.SetClearFreezeFlag() + trustSet.SetClearDeepFreezeFlag() + submitAndWait(client, trustSet, issuer) + + // ----------------------------------------------------- + + // Sending payment from Holder 1 to Holder 2 (which should succeed), Holder 1 can decrease its balance + fmt.Println("⏳ Sending payment from Holder 1 to Holder 2 (which should succeed). Holder 1 can decrease its balance...") + payment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet1.ClassicAddress), + }, + Destination: types.Address(holderWallet2.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "10", + }, + } + submitAndWait(client, payment, holderWallet1) + + // ----------------------------------------------------- + + // Sending payment from Holder 2 to Holder 1 (which should succeed), Holder 1 can increase its balance + fmt.Println("⏳ Sending payment from Holder 2 to Holder 1 (which should succeed). Holder 1 can increase its balance...") + payment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet2.ClassicAddress), + }, + Destination: types.Address(holderWallet1.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "10", + }, + } + submitAndWait(client, payment, holderWallet2) } // getRpcClient returns a new rpc client func getRpcClient() *rpc.Client { - cfg, err := rpc.NewClientConfig( - // DeepFreeze only available on Devnet as of February 2025, change to testnet/mainnet once the amendment passes. - "https://s.devnet.rippletest.net:51234", - rpc.WithFaucetProvider(faucet.NewDevnetFaucetProvider()), - ) - if err != nil { - panic(err) - } - - return rpc.NewClient(cfg) + cfg, err := rpc.NewClientConfig( + // DeepFreeze only available on Devnet as of February 2025, change to testnet/mainnet once the amendment passes. + "https://s.devnet.rippletest.net:51234", + rpc.WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + return rpc.NewClient(cfg) } // submitAndWait submits a transaction and waits for it to be included in a validated ledger func submitAndWait(client *rpc.Client, txn SubmittableTransaction, wallet wallet.Wallet) { - fmt.Printf("⏳ Submitting %s transaction...\n", txn.TxType()) - - flattenedTx := txn.Flatten() - - err := client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling %s transaction: %s\n", txn.TxType(), err) - fmt.Println() - return - } - - txBlob, _, err := wallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing %s transaction: %s\n", txn.TxType(), err) - fmt.Println() - return - } - - response, err := client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting %s transaction: %s\n", txn.TxType(), err) - fmt.Println() - return - } - - fmt.Printf("✅ %s transaction submitted\n", txn.TxType()) - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() + fmt.Printf("⏳ Submitting %s transaction...\n", txn.TxType()) + + flattenedTx := txn.Flatten() + + err := client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling %s transaction: %s\n", txn.TxType(), err) + fmt.Println() + return + } + + txBlob, _, err := wallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing %s transaction: %s\n", txn.TxType(), err) + fmt.Println() + return + } + + response, err := client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting %s transaction: %s\n", txn.TxType(), err) + fmt.Println() + return + } + + fmt.Printf("✅ %s transaction submitted\n", txn.TxType()) + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() } diff --git a/_code-samples/freeze/go/ws/main.go b/_code-samples/freeze/go/ws/main.go index 47e2323178e..1702ca939e5 100644 --- a/_code-samples/freeze/go/ws/main.go +++ b/_code-samples/freeze/go/ws/main.go @@ -1,357 +1,357 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/currency" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/currency" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" ) const ( - currencyCode = "USDA" + currencyCode = "USDA" ) type SubmittableTransaction interface { - TxType() transactions.TxType - Flatten() transactions.FlatTransaction // Ensures all transactions can be flattened + TxType() transactions.TxType + Flatten() transactions.FlatTransaction // Ensures all transactions can be flattened } func main() { - fmt.Println("⏳ Setting up client...") - - client := getClient() - fmt.Println("Connecting to server...") - if err := client.Connect(); err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Client configured!") - fmt.Println() - - fmt.Printf("Connection: %t", client.IsConnected()) - fmt.Println() - - // Configure wallets - - // Issuer - fmt.Println("⏳ Setting up issuer wallet...") - issuer, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Printf("❌ Error creating issuer wallet: %s\n", err) - return - } - - err = client.FundWallet(&issuer) - if err != nil { - fmt.Printf("❌ Error funding issuer wallet: %s\n", err) - return - } - fmt.Printf("✅ Issuer wallet funded: %s\n", issuer.ClassicAddress) - - // ----------------------------------------------------- - - // Holder 1 - fmt.Println("⏳ Setting up holder 1 wallet...") - holderWallet1, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Printf("❌ Error creating holder wallet 1: %s\n", err) - return - } - - err = client.FundWallet(&holderWallet1) - if err != nil { - fmt.Printf("❌ Error funding holder wallet 1: %s\n", err) - return - } - fmt.Printf("✅ Holder wallet 1 funded: %s\n", holderWallet1.ClassicAddress) - - // ----------------------------------------------------- - - // Holder 2 - fmt.Println("⏳ Setting up holder 2 wallet...") - holderWallet2, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Printf("❌ Error creating holder wallet 2: %s\n", err) - return - } - - err = client.FundWallet(&holderWallet2) - if err != nil { - fmt.Printf("❌ Error funding holder wallet 2: %s\n", err) - return - } - fmt.Printf("✅ Holder wallet 2 funded: %s\n", holderWallet2.ClassicAddress) - fmt.Println() - - fmt.Println("✅ Wallets setup complete!") - fmt.Println() - - // ----------------------------------------------------- - - // Configuring Issuing account - fmt.Println("⏳ Configuring issuer address settings...") - accountSet := &transactions.AccountSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(issuer.ClassicAddress), - }, - Domain: types.Domain("697373756572"), // issuer - } - - accountSet.SetAsfDefaultRipple() - submitAndWait(client, accountSet, issuer) - - // ----------------------------------------------------- - - // Trustline from the holder 1 to the issuer - fmt.Println("⏳ Setting up trustline from holder 1 to the issuer...") - trustSet := &transactions.TrustSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(holderWallet1.ClassicAddress), - }, - LimitAmount: types.IssuedCurrencyAmount{ - Currency: currency.ConvertStringToHex(currencyCode), - Issuer: types.Address(issuer.ClassicAddress), - Value: "1000000000", - }} - trustSet.SetSetNoRippleFlag() - submitAndWait(client, trustSet, holderWallet1) - - // ----------------------------------------------------- - - // Trustline from the holder 2 to the issuer - fmt.Println("⏳ Setting up trustline from holder 2 to the issuer...") - trustSet = &transactions.TrustSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(holderWallet2.ClassicAddress), - }, - LimitAmount: types.IssuedCurrencyAmount{ - Currency: currency.ConvertStringToHex(currencyCode), - Issuer: types.Address(issuer.ClassicAddress), - Value: "1000000000", - }, - } - trustSet.SetSetNoRippleFlag() - submitAndWait(client, trustSet, holderWallet2) - - // ----------------------------------------------------- - - // Minting to Holder 1 - fmt.Println("⏳ Minting to Holder 1...") - payment := &transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(issuer.ClassicAddress), - }, - Destination: types.Address(holderWallet1.ClassicAddress), - Amount: types.IssuedCurrencyAmount{ - Currency: currency.ConvertStringToHex(currencyCode), - Issuer: types.Address(issuer.ClassicAddress), - Value: "50000", - }, - } - submitAndWait(client, payment, issuer) - - // ----------------------------------------------------- - - // Minting to Holder 2 - fmt.Println("⏳ Minting to Holder 2...") - payment = &transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(issuer.ClassicAddress), - }, - Destination: types.Address(holderWallet2.ClassicAddress), - Amount: types.IssuedCurrencyAmount{ - Currency: currency.ConvertStringToHex(currencyCode), - Issuer: types.Address(issuer.ClassicAddress), - Value: "40000", - }, - } - submitAndWait(client, payment, issuer) - - // ----------------------------------------------------- - - // Sending payment from Holder 1 to Holder 2 - fmt.Println("⏳ Sending payment from Holder 1 to Holder 2...") - payment = &transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(holderWallet1.ClassicAddress), - }, - Destination: types.Address(holderWallet2.ClassicAddress), - Amount: types.IssuedCurrencyAmount{ - Currency: currency.ConvertStringToHex(currencyCode), - Issuer: types.Address(issuer.ClassicAddress), - Value: "20", - }, - } - submitAndWait(client, payment, holderWallet1) - - // ----------------------------------------------------- - - // Freezing and Deep Freezing holder1 - fmt.Println("⏳ Freezing and Deep Freezing holder 1 trustline...") - trustSet = &transactions.TrustSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(issuer.ClassicAddress), - }, - LimitAmount: types.IssuedCurrencyAmount{ - Currency: currency.ConvertStringToHex(currencyCode), - Issuer: types.Address(holderWallet1.ClassicAddress), - Value: "0", - }, - } - trustSet.SetSetFreezeFlag() - trustSet.SetSetDeepFreezeFlag() - - submitAndWait(client, trustSet, issuer) - - // ------------------- SHOULD FAIL ⬇️ ------------------ - - // Sending payment from Holder 1 to Holder 2 (which should fail), Holder 1 can't decrease its balance - fmt.Println("⏳ Sending payment from Holder 1 to Holder 2 (which should fail). Holder 1 can't decrease its balance...") - payment = &transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(holderWallet1.ClassicAddress), - }, - Destination: types.Address(holderWallet2.ClassicAddress), - Amount: types.IssuedCurrencyAmount{ - Currency: currency.ConvertStringToHex(currencyCode), - Issuer: types.Address(issuer.ClassicAddress), - Value: "10", - }, - } - submitAndWait(client, payment, holderWallet1) - - // ------------------- SHOULD FAIL ⬇️ ------------------ - - // Sending payment from Holder 2 to Holder 1 (which should fail), Holder 1 can't increase its balance - fmt.Println("⏳ Sending payment from Holder 2 to Holder 1 (which should fail). Holder 1 can't increase its balance...") - payment = &transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(holderWallet2.ClassicAddress), - }, - Destination: types.Address(holderWallet1.ClassicAddress), - Amount: types.IssuedCurrencyAmount{ - Currency: currency.ConvertStringToHex(currencyCode), - Issuer: types.Address(issuer.ClassicAddress), - Value: "10", - }, - } - submitAndWait(client, payment, holderWallet2) - - // ------------------- SHOULD FAIL ⬇️ ------------------ - - // Creating OfferCreate transaction (which should fail), Holder 1 can't create an offer - fmt.Println("⏳ Creating OfferCreate transaction (which should fail). Holder 1 can't create an offer...") - offerCreate := &transactions.OfferCreate{ - BaseTx: transactions.BaseTx{ - Account: types.Address(holderWallet1.ClassicAddress), - }, - TakerPays: types.IssuedCurrencyAmount{ - Currency: currency.ConvertStringToHex(currencyCode), - Issuer: types.Address(issuer.ClassicAddress), - Value: "10", - }, - TakerGets: types.XRPCurrencyAmount(10), - } - submitAndWait(client, offerCreate, holderWallet1) - - // ----------------------------------------------------- - - // Unfreezing and Deep Unfreezing holder 1 - fmt.Println("⏳ Unfreezing and Deep Unfreezing holder 1 trustline...") - trustSet = &transactions.TrustSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(issuer.ClassicAddress), - }, - LimitAmount: types.IssuedCurrencyAmount{ - Currency: currency.ConvertStringToHex(currencyCode), - Issuer: types.Address(holderWallet1.ClassicAddress), - Value: "0", - }, - } - trustSet.SetClearFreezeFlag() - trustSet.SetClearDeepFreezeFlag() - submitAndWait(client, trustSet, issuer) - - // ----------------------------------------------------- - - // Sending payment from Holder 1 to Holder 2 (which should succeed), Holder 1 can decrease its balance - fmt.Println("⏳ Sending payment from Holder 1 to Holder 2 (which should succeed). Holder 1 can decrease its balance...") - payment = &transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(holderWallet1.ClassicAddress), - }, - Destination: types.Address(holderWallet2.ClassicAddress), - Amount: types.IssuedCurrencyAmount{ - Currency: currency.ConvertStringToHex(currencyCode), - Issuer: types.Address(issuer.ClassicAddress), - Value: "10", - }, - } - submitAndWait(client, payment, holderWallet1) - - // ----------------------------------------------------- - - // Sending payment from Holder 2 to Holder 1 (which should succeed), Holder 1 can increase its balance - fmt.Println("⏳ Sending payment from Holder 2 to Holder 1 (which should succeed). Holder 1 can increase its balance...") - payment = &transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(holderWallet2.ClassicAddress), - }, - Destination: types.Address(holderWallet1.ClassicAddress), - Amount: types.IssuedCurrencyAmount{ - Currency: currency.ConvertStringToHex(currencyCode), - Issuer: types.Address(issuer.ClassicAddress), - Value: "10", - }, - } - submitAndWait(client, payment, holderWallet2) + fmt.Println("⏳ Setting up client...") + + client := getClient() + fmt.Println("Connecting to server...") + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Client configured!") + fmt.Println() + + fmt.Printf("Connection: %t", client.IsConnected()) + fmt.Println() + + // Configure wallets + + // Issuer + fmt.Println("⏳ Setting up issuer wallet...") + issuer, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating issuer wallet: %s\n", err) + return + } + + err = client.FundWallet(&issuer) + if err != nil { + fmt.Printf("❌ Error funding issuer wallet: %s\n", err) + return + } + fmt.Printf("✅ Issuer wallet funded: %s\n", issuer.ClassicAddress) + + // ----------------------------------------------------- + + // Holder 1 + fmt.Println("⏳ Setting up holder 1 wallet...") + holderWallet1, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating holder wallet 1: %s\n", err) + return + } + + err = client.FundWallet(&holderWallet1) + if err != nil { + fmt.Printf("❌ Error funding holder wallet 1: %s\n", err) + return + } + fmt.Printf("✅ Holder wallet 1 funded: %s\n", holderWallet1.ClassicAddress) + + // ----------------------------------------------------- + + // Holder 2 + fmt.Println("⏳ Setting up holder 2 wallet...") + holderWallet2, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating holder wallet 2: %s\n", err) + return + } + + err = client.FundWallet(&holderWallet2) + if err != nil { + fmt.Printf("❌ Error funding holder wallet 2: %s\n", err) + return + } + fmt.Printf("✅ Holder wallet 2 funded: %s\n", holderWallet2.ClassicAddress) + fmt.Println() + + fmt.Println("✅ Wallets setup complete!") + fmt.Println() + + // ----------------------------------------------------- + + // Configuring Issuing account + fmt.Println("⏳ Configuring issuer address settings...") + accountSet := &transactions.AccountSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + Domain: types.Domain("697373756572"), // issuer + } + + accountSet.SetAsfDefaultRipple() + submitAndWait(client, accountSet, issuer) + + // ----------------------------------------------------- + + // Trustline from the holder 1 to the issuer + fmt.Println("⏳ Setting up trustline from holder 1 to the issuer...") + trustSet := &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet1.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "1000000000", + }} + trustSet.SetSetNoRippleFlag() + submitAndWait(client, trustSet, holderWallet1) + + // ----------------------------------------------------- + + // Trustline from the holder 2 to the issuer + fmt.Println("⏳ Setting up trustline from holder 2 to the issuer...") + trustSet = &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet2.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "1000000000", + }, + } + trustSet.SetSetNoRippleFlag() + submitAndWait(client, trustSet, holderWallet2) + + // ----------------------------------------------------- + + // Minting to Holder 1 + fmt.Println("⏳ Minting to Holder 1...") + payment := &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + Destination: types.Address(holderWallet1.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "50000", + }, + } + submitAndWait(client, payment, issuer) + + // ----------------------------------------------------- + + // Minting to Holder 2 + fmt.Println("⏳ Minting to Holder 2...") + payment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + Destination: types.Address(holderWallet2.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "40000", + }, + } + submitAndWait(client, payment, issuer) + + // ----------------------------------------------------- + + // Sending payment from Holder 1 to Holder 2 + fmt.Println("⏳ Sending payment from Holder 1 to Holder 2...") + payment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet1.ClassicAddress), + }, + Destination: types.Address(holderWallet2.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "20", + }, + } + submitAndWait(client, payment, holderWallet1) + + // ----------------------------------------------------- + + // Freezing and Deep Freezing holder1 + fmt.Println("⏳ Freezing and Deep Freezing holder 1 trustline...") + trustSet = &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(holderWallet1.ClassicAddress), + Value: "0", + }, + } + trustSet.SetSetFreezeFlag() + trustSet.SetSetDeepFreezeFlag() + + submitAndWait(client, trustSet, issuer) + + // ------------------- SHOULD FAIL ⬇️ ------------------ + + // Sending payment from Holder 1 to Holder 2 (which should fail), Holder 1 can't decrease its balance + fmt.Println("⏳ Sending payment from Holder 1 to Holder 2 (which should fail). Holder 1 can't decrease its balance...") + payment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet1.ClassicAddress), + }, + Destination: types.Address(holderWallet2.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "10", + }, + } + submitAndWait(client, payment, holderWallet1) + + // ------------------- SHOULD FAIL ⬇️ ------------------ + + // Sending payment from Holder 2 to Holder 1 (which should fail), Holder 1 can't increase its balance + fmt.Println("⏳ Sending payment from Holder 2 to Holder 1 (which should fail). Holder 1 can't increase its balance...") + payment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet2.ClassicAddress), + }, + Destination: types.Address(holderWallet1.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "10", + }, + } + submitAndWait(client, payment, holderWallet2) + + // ------------------- SHOULD FAIL ⬇️ ------------------ + + // Creating OfferCreate transaction (which should fail), Holder 1 can't create an offer + fmt.Println("⏳ Creating OfferCreate transaction (which should fail). Holder 1 can't create an offer...") + offerCreate := &transactions.OfferCreate{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet1.ClassicAddress), + }, + TakerPays: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "10", + }, + TakerGets: types.XRPCurrencyAmount(10), + } + submitAndWait(client, offerCreate, holderWallet1) + + // ----------------------------------------------------- + + // Unfreezing and Deep Unfreezing holder 1 + fmt.Println("⏳ Unfreezing and Deep Unfreezing holder 1 trustline...") + trustSet = &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(issuer.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(holderWallet1.ClassicAddress), + Value: "0", + }, + } + trustSet.SetClearFreezeFlag() + trustSet.SetClearDeepFreezeFlag() + submitAndWait(client, trustSet, issuer) + + // ----------------------------------------------------- + + // Sending payment from Holder 1 to Holder 2 (which should succeed), Holder 1 can decrease its balance + fmt.Println("⏳ Sending payment from Holder 1 to Holder 2 (which should succeed). Holder 1 can decrease its balance...") + payment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet1.ClassicAddress), + }, + Destination: types.Address(holderWallet2.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "10", + }, + } + submitAndWait(client, payment, holderWallet1) + + // ----------------------------------------------------- + + // Sending payment from Holder 2 to Holder 1 (which should succeed), Holder 1 can increase its balance + fmt.Println("⏳ Sending payment from Holder 2 to Holder 1 (which should succeed). Holder 1 can increase its balance...") + payment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(holderWallet2.ClassicAddress), + }, + Destination: types.Address(holderWallet1.ClassicAddress), + Amount: types.IssuedCurrencyAmount{ + Currency: currency.ConvertStringToHex(currencyCode), + Issuer: types.Address(issuer.ClassicAddress), + Value: "10", + }, + } + submitAndWait(client, payment, holderWallet2) } // getRpcClient returns a new rpc client func getClient() *websocket.Client { - client := websocket.NewClient( - websocket.NewClientConfig(). - WithHost("wss://s.devnet.rippletest.net:51233"). - WithFaucetProvider(faucet.NewDevnetFaucetProvider()), - ) + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.devnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) - return client + return client } // submitAndWait submits a transaction and waits for it to be included in a validated ledger func submitAndWait(client *websocket.Client, txn SubmittableTransaction, wallet wallet.Wallet) { - fmt.Printf("⏳ Submitting %s transaction...\n", txn.TxType()) - - flattenedTx := txn.Flatten() - - err := client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling %s transaction: %s\n", txn.TxType(), err) - fmt.Println() - return - } - - txBlob, _, err := wallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing %s transaction: %s\n", txn.TxType(), err) - fmt.Println() - return - } - - response, err := client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting %s transaction: %s\n", txn.TxType(), err) - fmt.Println() - return - } - - fmt.Printf("✅ %s transaction submitted\n", txn.TxType()) - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() + fmt.Printf("⏳ Submitting %s transaction...\n", txn.TxType()) + + flattenedTx := txn.Flatten() + + err := client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling %s transaction: %s\n", txn.TxType(), err) + fmt.Println() + return + } + + txBlob, _, err := wallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing %s transaction: %s\n", txn.TxType(), err) + fmt.Println() + return + } + + response, err := client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting %s transaction: %s\n", txn.TxType(), err) + fmt.Println() + return + } + + fmt.Printf("✅ %s transaction submitted\n", txn.TxType()) + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() } diff --git a/_code-samples/get-started/go/base/rpc/main.go b/_code-samples/get-started/go/base/rpc/main.go index e4633862548..61ae21ebc67 100644 --- a/_code-samples/get-started/go/base/rpc/main.go +++ b/_code-samples/get-started/go/base/rpc/main.go @@ -1,26 +1,26 @@ package main import ( - "github.com/Peersyst/xrpl-go/xrpl/queries/utility" - "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/queries/utility" + "github.com/Peersyst/xrpl-go/xrpl/rpc" ) func main() { - // Define the network client configuration - cfg, err := rpc.NewClientConfig("https://s.altnet.rippletest.net:51234/") - if err != nil { - panic(err) - } + // Define the network client configuration + cfg, err := rpc.NewClientConfig("https://s.altnet.rippletest.net:51234/") + if err != nil { + panic(err) + } - // Initiate the network client - client := rpc.NewClient(cfg) + // Initiate the network client + client := rpc.NewClient(cfg) - // Ping the network (used to avoid Go unused variable error, but useful to check connectivity) - _, err = client.Ping(&utility.PingRequest{}) - if err != nil { - panic(err) - } + // Ping the network (used to avoid Go unused variable error, but useful to check connectivity) + _, err = client.Ping(&utility.PingRequest{}) + if err != nil { + panic(err) + } - // ... custom code goes here + // ... custom code goes here } diff --git a/_code-samples/get-started/go/base/ws/main.go b/_code-samples/get-started/go/base/ws/main.go index dad84126f16..2a921207ffe 100644 --- a/_code-samples/get-started/go/base/ws/main.go +++ b/_code-samples/get-started/go/base/ws/main.go @@ -1,25 +1,25 @@ package main import ( - "fmt" + "fmt" - "github.com/Peersyst/xrpl-go/xrpl/websocket" + "github.com/Peersyst/xrpl-go/xrpl/websocket" ) func main() { - // Define the network client - client := websocket.NewClient(websocket.NewClientConfig(). - WithHost("wss://s.altnet.rippletest.net:51233")) + // Define the network client + client := websocket.NewClient(websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net:51233")) - // Disconnect the client when done. (Defer executes at the end of the function) - defer client.Disconnect() + // Disconnect the client when done. (Defer executes at the end of the function) + defer client.Disconnect() - // Connect to the network - if err := client.Connect(); err != nil { - fmt.Println(err) - return - } + // Connect to the network + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } - // ... custom code goes here + // ... custom code goes here } diff --git a/_code-samples/get-started/go/get-acc-info/rpc/main.go b/_code-samples/get-started/go/get-acc-info/rpc/main.go index 792e89a3ed7..f933812a6ad 100644 --- a/_code-samples/get-started/go/get-acc-info/rpc/main.go +++ b/_code-samples/get-started/go/get-acc-info/rpc/main.go @@ -1,59 +1,59 @@ package main import ( - "fmt" + "fmt" - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/queries/account" - "github.com/Peersyst/xrpl-go/xrpl/queries/common" - "github.com/Peersyst/xrpl-go/xrpl/queries/ledger" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/queries/account" + "github.com/Peersyst/xrpl-go/xrpl/queries/common" + "github.com/Peersyst/xrpl-go/xrpl/queries/ledger" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { - // Define the network client with a faucet provider - cfg, err := rpc.NewClientConfig( - "https://s.altnet.rippletest.net:51234/", - rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), - ) - if err != nil { - panic(err) - } - client := rpc.NewClient(cfg) + // Define the network client with a faucet provider + cfg, err := rpc.NewClientConfig( + "https://s.altnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + client := rpc.NewClient(cfg) - // Create a new wallet - w, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - fmt.Println("New wallet created:") - fmt.Println("Address:", w.ClassicAddress) + // Create a new wallet + w, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + fmt.Println("New wallet created:") + fmt.Println("Address:", w.ClassicAddress) - // Fund the wallet with testnet XRP - if err := client.FundWallet(&w); err != nil { - fmt.Println(err) - return - } + // Fund the wallet with testnet XRP + if err := client.FundWallet(&w); err != nil { + fmt.Println(err) + return + } - // Get info from the ledger about the address we just funded - acc_info, err := client.GetAccountInfo(&account.InfoRequest{ - Account: w.GetAddress(), - }) - if err != nil { - fmt.Println(err) - return - } - fmt.Println("Account Balance:", acc_info.AccountData.Balance) - fmt.Println("Account Sequence:", acc_info.AccountData.Sequence) + // Get info from the ledger about the address we just funded + acc_info, err := client.GetAccountInfo(&account.InfoRequest{ + Account: w.GetAddress(), + }) + if err != nil { + fmt.Println(err) + return + } + fmt.Println("Account Balance:", acc_info.AccountData.Balance) + fmt.Println("Account Sequence:", acc_info.AccountData.Sequence) - // Get info about the ledger - ledger, err := client.GetLedger(&ledger.Request{LedgerIndex: common.Current}) - if err != nil { - fmt.Println(err) - return - } - fmt.Println("Ledger Index:", ledger.Ledger.LedgerIndex) + // Get info about the ledger + ledger, err := client.GetLedger(&ledger.Request{LedgerIndex: common.Current}) + if err != nil { + fmt.Println(err) + return + } + fmt.Println("Ledger Index:", ledger.Ledger.LedgerIndex) } diff --git a/_code-samples/get-started/go/get-acc-info/ws/main.go b/_code-samples/get-started/go/get-acc-info/ws/main.go index f4ef0ff1297..025143f3985 100644 --- a/_code-samples/get-started/go/get-acc-info/ws/main.go +++ b/_code-samples/get-started/go/get-acc-info/ws/main.go @@ -1,74 +1,74 @@ package main import ( - "fmt" + "fmt" - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/queries/account" - "github.com/Peersyst/xrpl-go/xrpl/queries/common" - "github.com/Peersyst/xrpl-go/xrpl/queries/ledger" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/queries/account" + "github.com/Peersyst/xrpl-go/xrpl/queries/common" + "github.com/Peersyst/xrpl-go/xrpl/queries/ledger" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" ) func main() { - // Define the network client with a faucet provider - client := websocket.NewClient( - websocket.NewClientConfig(). - WithHost("wss://s.altnet.rippletest.net:51233"). - WithFaucetProvider(faucet.NewTestnetFaucetProvider()), - ) + // Define the network client with a faucet provider + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) - // Disconnect the client when done. (Defer executes at the end of the function) - defer client.Disconnect() + // Disconnect the client when done. (Defer executes at the end of the function) + defer client.Disconnect() - // Connect to the network - if err := client.Connect(); err != nil { - fmt.Println(err) - return - } + // Connect to the network + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } - if !client.IsConnected() { - fmt.Println("❌ Failed to connect to testnet") - return - } + if !client.IsConnected() { + fmt.Println("❌ Failed to connect to testnet") + return + } - fmt.Println("✅ Connected to testnet") - fmt.Println() + fmt.Println("✅ Connected to testnet") + fmt.Println() - // Create a new wallet - w, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - fmt.Println("New wallet created:") - fmt.Println("Address:", w.ClassicAddress) + // Create a new wallet + w, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + fmt.Println("New wallet created:") + fmt.Println("Address:", w.ClassicAddress) - // Fund the wallet with testnet XRP - if err := client.FundWallet(&w); err != nil { - fmt.Println(err) - return - } + // Fund the wallet with testnet XRP + if err := client.FundWallet(&w); err != nil { + fmt.Println(err) + return + } - // Get info from the ledger about the address we just funded - acc_info, err := client.GetAccountInfo(&account.InfoRequest{ - Account: w.GetAddress(), - }) - if err != nil { - fmt.Println(err) - return - } - fmt.Println("Account Balance:", acc_info.AccountData.Balance) - fmt.Println("Account Sequence:", acc_info.AccountData.Sequence) + // Get info from the ledger about the address we just funded + acc_info, err := client.GetAccountInfo(&account.InfoRequest{ + Account: w.GetAddress(), + }) + if err != nil { + fmt.Println(err) + return + } + fmt.Println("Account Balance:", acc_info.AccountData.Balance) + fmt.Println("Account Sequence:", acc_info.AccountData.Sequence) - // Get info about the ledger - ledger, err := client.GetLedger(&ledger.Request{LedgerIndex: common.Current}) - if err != nil { - fmt.Println(err) - return - } - fmt.Println("Ledger Index:", ledger.Ledger.LedgerIndex) + // Get info about the ledger + ledger, err := client.GetLedger(&ledger.Request{LedgerIndex: common.Current}) + if err != nil { + fmt.Println(err) + return + } + fmt.Println("Ledger Index:", ledger.Ledger.LedgerIndex) } diff --git a/_code-samples/get-tx/go/main.go b/_code-samples/get-tx/go/main.go index 32a433d90c3..dfac0b27d01 100644 --- a/_code-samples/get-tx/go/main.go +++ b/_code-samples/get-tx/go/main.go @@ -1,46 +1,46 @@ package main import ( - "fmt" + "fmt" - "github.com/Peersyst/xrpl-go/xrpl/queries/common" - "github.com/Peersyst/xrpl-go/xrpl/queries/ledger" - "github.com/Peersyst/xrpl-go/xrpl/queries/transactions" - "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/queries/common" + "github.com/Peersyst/xrpl-go/xrpl/queries/ledger" + "github.com/Peersyst/xrpl-go/xrpl/queries/transactions" + "github.com/Peersyst/xrpl-go/xrpl/rpc" ) func main() { - cfg, err := rpc.NewClientConfig( - "https://s.altnet.rippletest.net:51234/", - ) - if err != nil { - panic(err) - } + cfg, err := rpc.NewClientConfig( + "https://s.altnet.rippletest.net:51234/", + ) + if err != nil { + panic(err) + } - client := rpc.NewClient(cfg) + client := rpc.NewClient(cfg) - // Get the latest validated ledger - led, err := client.GetLedger(&ledger.Request{ - Transactions: true, - LedgerIndex: common.Validated, - }) - if err != nil { - panic(err) - } - fmt.Println("Latest validated ledger:", led) + // Get the latest validated ledger + led, err := client.GetLedger(&ledger.Request{ + Transactions: true, + LedgerIndex: common.Validated, + }) + if err != nil { + panic(err) + } + fmt.Println("Latest validated ledger:", led) - // Get the first transaction hash from the ledger - if len(led.Ledger.Transactions) > 0 { - txHash := led.Ledger.Transactions[0].(string) // type assertion may be needed + // Get the first transaction hash from the ledger + if len(led.Ledger.Transactions) > 0 { + txHash := led.Ledger.Transactions[0].(string) // type assertion may be needed - // Query the transaction details - txResp, err := client.Request(&transactions.TxRequest{ - Transaction: txHash, - }) - if err != nil { - panic(err) - } - fmt.Println("First transaction in the ledger:") - fmt.Println(txResp) - } + // Query the transaction details + txResp, err := client.Request(&transactions.TxRequest{ + Transaction: txHash, + }) + if err != nil { + panic(err) + } + fmt.Println("First transaction in the ledger:") + fmt.Println(txResp) + } } diff --git a/_code-samples/issue-a-token/go/rpc/main.go b/_code-samples/issue-a-token/go/rpc/main.go index bbdec424c72..249d58d971f 100644 --- a/_code-samples/issue-a-token/go/rpc/main.go +++ b/_code-samples/issue-a-token/go/rpc/main.go @@ -1,523 +1,523 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) const ( - currencyCode = "FOO" + currencyCode = "FOO" ) func main() { - // - // Configure client - // - fmt.Println("⏳ Setting up client...") - cfg, err := rpc.NewClientConfig( - "https://s.altnet.rippletest.net:51234/", - rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), - ) - if err != nil { - panic(err) - } - - client := rpc.NewClient(cfg) - fmt.Println("✅ Client configured!") - fmt.Println() - - // - // Configure wallets - // - fmt.Println("⏳ Setting up wallets...") - coldWallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Printf("❌ Error creating cold wallet: %s\n", err) - return - } - err = client.FundWallet(&coldWallet) - if err != nil { - fmt.Printf("❌ Error funding cold wallet: %s\n", err) - return - } - fmt.Println("💸 Cold wallet funded!") - - hotWallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Printf("❌ Error creating hot wallet: %s\n", err) - return - } - err = client.FundWallet(&hotWallet) - if err != nil { - fmt.Printf("❌ Error funding hot wallet: %s\n", err) - return - } - fmt.Println("💸 Hot wallet funded!") - - customerOneWallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Printf("❌ Error creating token wallet: %s\n", err) - return - } - err = client.FundWallet(&customerOneWallet) - if err != nil { - fmt.Printf("❌ Error funding customer one wallet: %s\n", err) - return - } - fmt.Println("💸 Customer one wallet funded!") - fmt.Println() - - fmt.Println("✅ Wallets setup complete!") - fmt.Println("💳 Cold wallet:", coldWallet.ClassicAddress) - fmt.Println("💳 Hot wallet:", hotWallet.ClassicAddress) - fmt.Println("💳 Customer one wallet:", customerOneWallet.ClassicAddress) - fmt.Println() - - // - // Configure cold address settings - // - fmt.Println("⏳ Configuring cold address settings...") - coldWalletAccountSet := &transactions.AccountSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(coldWallet.ClassicAddress), - }, - TickSize: types.TickSize(5), - TransferRate: types.TransferRate(0), - Domain: types.Domain("6578616D706C652E636F6D"), // example.com - } - - coldWalletAccountSet.SetAsfDefaultRipple() - coldWalletAccountSet.SetDisallowXRP() - - coldWalletAccountSet.SetRequireDestTag() - - flattenedTx := coldWalletAccountSet.Flatten() - - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err := coldWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - response, err := client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) - return - } - - if !response.Validated { - fmt.Println("❌ Cold address settings configuration failed!") - fmt.Println("Try again!") - fmt.Println() - return - } - - fmt.Println("✅ Cold address settings configured!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() - - // - // Configure hot address settings - // - fmt.Println("⏳ Configuring hot address settings...") - hotWalletAccountSet := &transactions.AccountSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(hotWallet.ClassicAddress), - }, - Domain: types.Domain("6578616D706C652E636F6D"), // example.com - } - - hotWalletAccountSet.SetAsfRequireAuth() - hotWalletAccountSet.SetDisallowXRP() - hotWalletAccountSet.SetRequireDestTag() - - flattenedTx = hotWalletAccountSet.Flatten() - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err = hotWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - response, err = client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) - return - } - - if !response.Validated { - fmt.Println("❌ Hot address settings configuration failed!") - fmt.Println("Try again!") - fmt.Println() - return - } - - fmt.Println("✅ Hot address settings configured!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() - - // - // Create trust line from hot to cold address - // - fmt.Println("⏳ Creating trust line from hot to cold address...") - hotColdTrustSet := &transactions.TrustSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(hotWallet.ClassicAddress), - }, - LimitAmount: types.IssuedCurrencyAmount{ - Currency: currencyCode, - Issuer: types.Address(coldWallet.ClassicAddress), - Value: "100000000000000", - }, - } - - flattenedTx = hotColdTrustSet.Flatten() - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err = hotWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - response, err = client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) - return - } - - if !response.Validated { - fmt.Println("❌ Trust line from hot to cold address creation failed!") - fmt.Println("Try again!") - fmt.Println() - return - } - - fmt.Println("✅ Trust line from hot to cold address created!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() - - // - // Create trust line from costumer one to cold address - // - fmt.Println("⏳ Creating trust line from customer one to cold address...") - customerOneColdTrustSet := &transactions.TrustSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(customerOneWallet.ClassicAddress), - }, - LimitAmount: types.IssuedCurrencyAmount{ - Currency: currencyCode, - Issuer: types.Address(coldWallet.ClassicAddress), - Value: "100000000000000", - }, - } - - flattenedTx = customerOneColdTrustSet.Flatten() - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err = customerOneWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - response, err = client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) - return - } - - if !response.Validated { - fmt.Println("❌ Trust line from customer one to cold address creation failed!") - fmt.Println("Try again!") - fmt.Println() - return - } - - fmt.Println("✅ Trust line from customer one to cold address created!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() - - // - // Send tokens from cold wallet to hot wallet - // - fmt.Println("⏳ Sending tokens from cold wallet to hot wallet...") - coldToHotPayment := &transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(coldWallet.ClassicAddress), - }, - Amount: types.IssuedCurrencyAmount{ - Currency: currencyCode, - Issuer: types.Address(coldWallet.ClassicAddress), - Value: "3800", - }, - Destination: types.Address(hotWallet.ClassicAddress), - DestinationTag: types.DestinationTag(1), - } - - flattenedTx = coldToHotPayment.Flatten() - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err = coldWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - response, err = client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) - return - } - - if !response.Validated { - fmt.Println("❌ Tokens not sent from cold wallet to hot wallet!") - fmt.Println("Try again!") - fmt.Println() - return - } - - fmt.Println("✅ Tokens sent from cold wallet to hot wallet!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() - - // - // Send tokens from hot wallet to customer one - // - fmt.Println("⏳ Sending tokens from cold wallet to customer one...") - coldToCustomerOnePayment := &transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(coldWallet.ClassicAddress), - }, - Amount: types.IssuedCurrencyAmount{ - Currency: currencyCode, - Issuer: types.Address(coldWallet.ClassicAddress), - Value: "100", - }, - Destination: types.Address(customerOneWallet.ClassicAddress), - } - - flattenedTx = coldToCustomerOnePayment.Flatten() - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err = coldWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - response, err = client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) - return - } - - if !response.Validated { - fmt.Println("❌ Tokens not sent from cold wallet to customer one!") - fmt.Println() - return - } - - fmt.Println("✅ Tokens sent from cold wallet to customer one!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() - - // - // Freeze cold wallet - // - fmt.Println("⏳ Freezing cold wallet...") - freezeColdWallet := &transactions.AccountSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(coldWallet.ClassicAddress), - }, - } - - freezeColdWallet.SetAsfGlobalFreeze() - - flattenedTx = freezeColdWallet.Flatten() - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err = coldWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - response, err = client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) - return - } - - if !response.Validated { - fmt.Println("❌ Cold wallet freezing failed!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() - return - } - - fmt.Println("✅ Cold wallet frozen!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() - - // - // Try to send tokens from hot wallet to customer one - // - fmt.Println("⏳ Trying to send tokens from hot wallet to customer one...") - hotToCustomerOnePayment := &transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(hotWallet.ClassicAddress), - }, - Amount: types.IssuedCurrencyAmount{ - Currency: currencyCode, - Issuer: types.Address(coldWallet.ClassicAddress), - Value: "100", - }, - Destination: types.Address(customerOneWallet.ClassicAddress), - } - - flattenedTx = hotToCustomerOnePayment.Flatten() - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err = hotWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - _, err = client.SubmitTxBlobAndWait(txBlob, false) - if err == nil { - return - } - - fmt.Println("❌ Tokens not sent from hot wallet to customer one!") - fmt.Println() - - // // - // // Unfreeze cold wallet - // // - fmt.Println("⏳ Unfreezing cold wallet...") - unfreezeColdWallet := &transactions.AccountSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(coldWallet.ClassicAddress), - }, - } - - unfreezeColdWallet.ClearAsfGlobalFreeze() - - flattenedTx = unfreezeColdWallet.Flatten() - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err = coldWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - response, err = client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) - return - } - - if !response.Validated { - fmt.Println("❌ Cold wallet unfreezing failed!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() - return - } - - fmt.Println("✅ Cold wallet unfrozen!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() - - // - // Try to send tokens from hot wallet to customer one - // - fmt.Println("⏳ Trying to send tokens from hot wallet to customer one...") - hotToCustomerOnePayment = &transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(hotWallet.ClassicAddress), - }, - Amount: types.IssuedCurrencyAmount{ - Currency: currencyCode, - Issuer: types.Address(coldWallet.ClassicAddress), - Value: "100", - }, - Destination: types.Address(customerOneWallet.ClassicAddress), - } - - flattenedTx = hotToCustomerOnePayment.Flatten() - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err = hotWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - response, err = client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) - return - } - - if !response.Validated { - fmt.Println("❌ Tokens not sent from hot wallet to customer one!") - fmt.Println("Try again!") - return - } - - fmt.Println("✅ Tokens sent from hot wallet to customer one!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() + // + // Configure client + // + fmt.Println("⏳ Setting up client...") + cfg, err := rpc.NewClientConfig( + "https://s.altnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + client := rpc.NewClient(cfg) + fmt.Println("✅ Client configured!") + fmt.Println() + + // + // Configure wallets + // + fmt.Println("⏳ Setting up wallets...") + coldWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating cold wallet: %s\n", err) + return + } + err = client.FundWallet(&coldWallet) + if err != nil { + fmt.Printf("❌ Error funding cold wallet: %s\n", err) + return + } + fmt.Println("💸 Cold wallet funded!") + + hotWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating hot wallet: %s\n", err) + return + } + err = client.FundWallet(&hotWallet) + if err != nil { + fmt.Printf("❌ Error funding hot wallet: %s\n", err) + return + } + fmt.Println("💸 Hot wallet funded!") + + customerOneWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating token wallet: %s\n", err) + return + } + err = client.FundWallet(&customerOneWallet) + if err != nil { + fmt.Printf("❌ Error funding customer one wallet: %s\n", err) + return + } + fmt.Println("💸 Customer one wallet funded!") + fmt.Println() + + fmt.Println("✅ Wallets setup complete!") + fmt.Println("💳 Cold wallet:", coldWallet.ClassicAddress) + fmt.Println("💳 Hot wallet:", hotWallet.ClassicAddress) + fmt.Println("💳 Customer one wallet:", customerOneWallet.ClassicAddress) + fmt.Println() + + // + // Configure cold address settings + // + fmt.Println("⏳ Configuring cold address settings...") + coldWalletAccountSet := &transactions.AccountSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + TickSize: types.TickSize(5), + TransferRate: types.TransferRate(0), + Domain: types.Domain("6578616D706C652E636F6D"), // example.com + } + + coldWalletAccountSet.SetAsfDefaultRipple() + coldWalletAccountSet.SetDisallowXRP() + + coldWalletAccountSet.SetRequireDestTag() + + flattenedTx := coldWalletAccountSet.Flatten() + + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err := coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err := client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Cold address settings configuration failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Cold address settings configured!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Configure hot address settings + // + fmt.Println("⏳ Configuring hot address settings...") + hotWalletAccountSet := &transactions.AccountSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(hotWallet.ClassicAddress), + }, + Domain: types.Domain("6578616D706C652E636F6D"), // example.com + } + + hotWalletAccountSet.SetAsfRequireAuth() + hotWalletAccountSet.SetDisallowXRP() + hotWalletAccountSet.SetRequireDestTag() + + flattenedTx = hotWalletAccountSet.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = hotWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Hot address settings configuration failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Hot address settings configured!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Create trust line from hot to cold address + // + fmt.Println("⏳ Creating trust line from hot to cold address...") + hotColdTrustSet := &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(hotWallet.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "100000000000000", + }, + } + + flattenedTx = hotColdTrustSet.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = hotWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Trust line from hot to cold address creation failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Trust line from hot to cold address created!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Create trust line from costumer one to cold address + // + fmt.Println("⏳ Creating trust line from customer one to cold address...") + customerOneColdTrustSet := &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(customerOneWallet.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "100000000000000", + }, + } + + flattenedTx = customerOneColdTrustSet.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = customerOneWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Trust line from customer one to cold address creation failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Trust line from customer one to cold address created!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Send tokens from cold wallet to hot wallet + // + fmt.Println("⏳ Sending tokens from cold wallet to hot wallet...") + coldToHotPayment := &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "3800", + }, + Destination: types.Address(hotWallet.ClassicAddress), + DestinationTag: types.DestinationTag(1), + } + + flattenedTx = coldToHotPayment.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Tokens not sent from cold wallet to hot wallet!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Tokens sent from cold wallet to hot wallet!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Send tokens from hot wallet to customer one + // + fmt.Println("⏳ Sending tokens from cold wallet to customer one...") + coldToCustomerOnePayment := &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "100", + }, + Destination: types.Address(customerOneWallet.ClassicAddress), + } + + flattenedTx = coldToCustomerOnePayment.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Tokens not sent from cold wallet to customer one!") + fmt.Println() + return + } + + fmt.Println("✅ Tokens sent from cold wallet to customer one!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Freeze cold wallet + // + fmt.Println("⏳ Freezing cold wallet...") + freezeColdWallet := &transactions.AccountSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + } + + freezeColdWallet.SetAsfGlobalFreeze() + + flattenedTx = freezeColdWallet.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Cold wallet freezing failed!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + return + } + + fmt.Println("✅ Cold wallet frozen!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Try to send tokens from hot wallet to customer one + // + fmt.Println("⏳ Trying to send tokens from hot wallet to customer one...") + hotToCustomerOnePayment := &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(hotWallet.ClassicAddress), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "100", + }, + Destination: types.Address(customerOneWallet.ClassicAddress), + } + + flattenedTx = hotToCustomerOnePayment.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = hotWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + _, err = client.SubmitTxBlobAndWait(txBlob, false) + if err == nil { + return + } + + fmt.Println("❌ Tokens not sent from hot wallet to customer one!") + fmt.Println() + + // // + // // Unfreeze cold wallet + // // + fmt.Println("⏳ Unfreezing cold wallet...") + unfreezeColdWallet := &transactions.AccountSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + } + + unfreezeColdWallet.ClearAsfGlobalFreeze() + + flattenedTx = unfreezeColdWallet.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Cold wallet unfreezing failed!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + return + } + + fmt.Println("✅ Cold wallet unfrozen!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Try to send tokens from hot wallet to customer one + // + fmt.Println("⏳ Trying to send tokens from hot wallet to customer one...") + hotToCustomerOnePayment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(hotWallet.ClassicAddress), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "100", + }, + Destination: types.Address(customerOneWallet.ClassicAddress), + } + + flattenedTx = hotToCustomerOnePayment.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = hotWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Tokens not sent from hot wallet to customer one!") + fmt.Println("Try again!") + return + } + + fmt.Println("✅ Tokens sent from hot wallet to customer one!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() } diff --git a/_code-samples/issue-a-token/go/ws/main.go b/_code-samples/issue-a-token/go/ws/main.go index 04a57383ddd..6655fd952d6 100644 --- a/_code-samples/issue-a-token/go/ws/main.go +++ b/_code-samples/issue-a-token/go/ws/main.go @@ -1,529 +1,529 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" ) const ( - currencyCode = "FOO" + currencyCode = "FOO" ) func main() { - // - // Configure client - // - fmt.Println("⏳ Setting up client...") - client := websocket.NewClient( - websocket.NewClientConfig(). - WithHost("wss://s.altnet.rippletest.net"). - WithFaucetProvider(faucet.NewTestnetFaucetProvider()), - ) - defer client.Disconnect() - fmt.Println("✅ Client configured!") - fmt.Println() - - fmt.Println("Connecting to server...") - if err := client.Connect(); err != nil { - fmt.Println(err) - return - } - - fmt.Println("Connection: ", client.IsConnected()) - fmt.Println() - - // - // Configure wallets - // - fmt.Println("⏳ Setting up wallets...") - coldWallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Printf("❌ Error creating cold wallet: %s\n", err) - return - } - err = client.FundWallet(&coldWallet) - if err != nil { - fmt.Printf("❌ Error funding cold wallet: %s\n", err) - return - } - fmt.Println("💸 Cold wallet funded!") - - hotWallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Printf("❌ Error creating hot wallet: %s\n", err) - return - } - err = client.FundWallet(&hotWallet) - if err != nil { - fmt.Printf("❌ Error funding hot wallet: %s\n", err) - return - } - fmt.Println("💸 Hot wallet funded!") - - customerOneWallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Printf("❌ Error creating token wallet: %s\n", err) - return - } - err = client.FundWallet(&customerOneWallet) - if err != nil { - fmt.Printf("❌ Error funding customer one wallet: %s\n", err) - return - } - fmt.Println("💸 Customer one wallet funded!") - fmt.Println() - - fmt.Println("✅ Wallets setup complete!") - fmt.Println("💳 Cold wallet:", coldWallet.ClassicAddress) - fmt.Println("💳 Hot wallet:", hotWallet.ClassicAddress) - fmt.Println("💳 Customer one wallet:", customerOneWallet.ClassicAddress) - fmt.Println() - - // - // Configure cold address settings - // - fmt.Println("⏳ Configuring cold address settings...") - coldWalletAccountSet := &transactions.AccountSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(coldWallet.ClassicAddress), - }, - TickSize: types.TickSize(5), - TransferRate: types.TransferRate(0), - Domain: types.Domain("6578616D706C652E636F6D"), // example.com - } - - coldWalletAccountSet.SetAsfDefaultRipple() - coldWalletAccountSet.SetDisallowXRP() - - coldWalletAccountSet.SetRequireDestTag() - - flattenedTx := coldWalletAccountSet.Flatten() - - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err := coldWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - response, err := client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) - return - } - - if !response.Validated { - fmt.Println("❌ Cold address settings configuration failed!") - fmt.Println("Try again!") - fmt.Println() - return - } - - fmt.Println("✅ Cold address settings configured!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() - - // - // Configure hot address settings - // - fmt.Println("⏳ Configuring hot address settings...") - hotWalletAccountSet := &transactions.AccountSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(hotWallet.ClassicAddress), - }, - Domain: types.Domain("6578616D706C652E636F6D"), // example.com - } - - hotWalletAccountSet.SetAsfRequireAuth() - hotWalletAccountSet.SetDisallowXRP() - hotWalletAccountSet.SetRequireDestTag() - - flattenedTx = hotWalletAccountSet.Flatten() - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err = hotWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - response, err = client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) - return - } - - if !response.Validated { - fmt.Println("❌ Hot address settings configuration failed!") - fmt.Println("Try again!") - fmt.Println() - return - } - - fmt.Println("✅ Hot address settings configured!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() - - // - // Create trust line from hot to cold address - // - fmt.Println("⏳ Creating trust line from hot to cold address...") - hotColdTrustSet := &transactions.TrustSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(hotWallet.ClassicAddress), - }, - LimitAmount: types.IssuedCurrencyAmount{ - Currency: currencyCode, - Issuer: types.Address(coldWallet.ClassicAddress), - Value: "100000000000000", - }, - } - - flattenedTx = hotColdTrustSet.Flatten() - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err = hotWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - response, err = client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) - return - } - - if !response.Validated { - fmt.Println("❌ Trust line from hot to cold address creation failed!") - fmt.Println("Try again!") - fmt.Println() - return - } - - fmt.Println("✅ Trust line from hot to cold address created!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() - - // - // Create trust line from costumer one to cold address - // - fmt.Println("⏳ Creating trust line from customer one to cold address...") - customerOneColdTrustSet := &transactions.TrustSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(customerOneWallet.ClassicAddress), - }, - LimitAmount: types.IssuedCurrencyAmount{ - Currency: currencyCode, - Issuer: types.Address(coldWallet.ClassicAddress), - Value: "100000000000000", - }, - } - - flattenedTx = customerOneColdTrustSet.Flatten() - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err = customerOneWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - response, err = client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) - return - } - - if !response.Validated { - fmt.Println("❌ Trust line from customer one to cold address creation failed!") - fmt.Println("Try again!") - fmt.Println() - return - } - - fmt.Println("✅ Trust line from customer one to cold address created!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() - - // - // Send tokens from cold wallet to hot wallet - // - fmt.Println("⏳ Sending tokens from cold wallet to hot wallet...") - coldToHotPayment := &transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(coldWallet.ClassicAddress), - }, - Amount: types.IssuedCurrencyAmount{ - Currency: currencyCode, - Issuer: types.Address(coldWallet.ClassicAddress), - Value: "3800", - }, - Destination: types.Address(hotWallet.ClassicAddress), - DestinationTag: types.DestinationTag(1), - } - - flattenedTx = coldToHotPayment.Flatten() - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err = coldWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - response, err = client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) - return - } - - if !response.Validated { - fmt.Println("❌ Tokens not sent from cold wallet to hot wallet!") - fmt.Println("Try again!") - fmt.Println() - return - } - - fmt.Println("✅ Tokens sent from cold wallet to hot wallet!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() - - // - // Send tokens from hot wallet to customer one - // - fmt.Println("⏳ Sending tokens from cold wallet to customer one...") - coldToCustomerOnePayment := &transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(coldWallet.ClassicAddress), - }, - Amount: types.IssuedCurrencyAmount{ - Currency: currencyCode, - Issuer: types.Address(coldWallet.ClassicAddress), - Value: "100", - }, - Destination: types.Address(customerOneWallet.ClassicAddress), - } - - flattenedTx = coldToCustomerOnePayment.Flatten() - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err = coldWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - response, err = client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) - return - } - - if !response.Validated { - fmt.Println("❌ Tokens not sent from cold wallet to customer one!") - fmt.Println() - return - } - - fmt.Println("✅ Tokens sent from cold wallet to customer one!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() - - // - // Freeze cold wallet - // - fmt.Println("⏳ Freezing cold wallet...") - freezeColdWallet := &transactions.AccountSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(coldWallet.ClassicAddress), - }, - } - - freezeColdWallet.SetAsfGlobalFreeze() - - flattenedTx = freezeColdWallet.Flatten() - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err = coldWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - response, err = client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) - return - } - - if !response.Validated { - fmt.Println("❌ Cold wallet freezing failed!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() - return - } - - fmt.Println("✅ Cold wallet frozen!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() - - // - // Try to send tokens from hot wallet to customer one - // - fmt.Println("⏳ Trying to send tokens from hot wallet to customer one...") - hotToCustomerOnePayment := &transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(hotWallet.ClassicAddress), - }, - Amount: types.IssuedCurrencyAmount{ - Currency: currencyCode, - Issuer: types.Address(coldWallet.ClassicAddress), - Value: "100", - }, - Destination: types.Address(customerOneWallet.ClassicAddress), - } - - flattenedTx = hotToCustomerOnePayment.Flatten() - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err = hotWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - _, err = client.SubmitTxBlobAndWait(txBlob, false) - if err == nil { - return - } - - fmt.Println("❌ Tokens not sent from hot wallet to customer one!") - fmt.Println() - - // // - // // Unfreeze cold wallet - // // - fmt.Println("⏳ Unfreezing cold wallet...") - unfreezeColdWallet := &transactions.AccountSet{ - BaseTx: transactions.BaseTx{ - Account: types.Address(coldWallet.ClassicAddress), - }, - } - - unfreezeColdWallet.ClearAsfGlobalFreeze() - - flattenedTx = unfreezeColdWallet.Flatten() - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err = coldWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - response, err = client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) - return - } - - if !response.Validated { - fmt.Println("❌ Cold wallet unfreezing failed!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() - return - } - - fmt.Println("✅ Cold wallet unfrozen!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() - - // - // Try to send tokens from hot wallet to customer one - // - fmt.Println("⏳ Trying to send tokens from hot wallet to customer one...") - hotToCustomerOnePayment = &transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(hotWallet.ClassicAddress), - }, - Amount: types.IssuedCurrencyAmount{ - Currency: currencyCode, - Issuer: types.Address(coldWallet.ClassicAddress), - Value: "100", - }, - Destination: types.Address(customerOneWallet.ClassicAddress), - } - - flattenedTx = hotToCustomerOnePayment.Flatten() - err = client.Autofill(&flattenedTx) - if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) - return - } - - txBlob, _, err = hotWallet.Sign(flattenedTx) - if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) - return - } - - response, err = client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) - return - } - - if !response.Validated { - fmt.Println("❌ Tokens not sent from hot wallet to customer one!") - fmt.Println("Try again!") - return - } - - fmt.Println("✅ Tokens sent from hot wallet to customer one!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Println() + // + // Configure client + // + fmt.Println("⏳ Setting up client...") + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net"). + WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + defer client.Disconnect() + fmt.Println("✅ Client configured!") + fmt.Println() + + fmt.Println("Connecting to server...") + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + fmt.Println("Connection: ", client.IsConnected()) + fmt.Println() + + // + // Configure wallets + // + fmt.Println("⏳ Setting up wallets...") + coldWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating cold wallet: %s\n", err) + return + } + err = client.FundWallet(&coldWallet) + if err != nil { + fmt.Printf("❌ Error funding cold wallet: %s\n", err) + return + } + fmt.Println("💸 Cold wallet funded!") + + hotWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating hot wallet: %s\n", err) + return + } + err = client.FundWallet(&hotWallet) + if err != nil { + fmt.Printf("❌ Error funding hot wallet: %s\n", err) + return + } + fmt.Println("💸 Hot wallet funded!") + + customerOneWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Printf("❌ Error creating token wallet: %s\n", err) + return + } + err = client.FundWallet(&customerOneWallet) + if err != nil { + fmt.Printf("❌ Error funding customer one wallet: %s\n", err) + return + } + fmt.Println("💸 Customer one wallet funded!") + fmt.Println() + + fmt.Println("✅ Wallets setup complete!") + fmt.Println("💳 Cold wallet:", coldWallet.ClassicAddress) + fmt.Println("💳 Hot wallet:", hotWallet.ClassicAddress) + fmt.Println("💳 Customer one wallet:", customerOneWallet.ClassicAddress) + fmt.Println() + + // + // Configure cold address settings + // + fmt.Println("⏳ Configuring cold address settings...") + coldWalletAccountSet := &transactions.AccountSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + TickSize: types.TickSize(5), + TransferRate: types.TransferRate(0), + Domain: types.Domain("6578616D706C652E636F6D"), // example.com + } + + coldWalletAccountSet.SetAsfDefaultRipple() + coldWalletAccountSet.SetDisallowXRP() + + coldWalletAccountSet.SetRequireDestTag() + + flattenedTx := coldWalletAccountSet.Flatten() + + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err := coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err := client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Cold address settings configuration failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Cold address settings configured!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Configure hot address settings + // + fmt.Println("⏳ Configuring hot address settings...") + hotWalletAccountSet := &transactions.AccountSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(hotWallet.ClassicAddress), + }, + Domain: types.Domain("6578616D706C652E636F6D"), // example.com + } + + hotWalletAccountSet.SetAsfRequireAuth() + hotWalletAccountSet.SetDisallowXRP() + hotWalletAccountSet.SetRequireDestTag() + + flattenedTx = hotWalletAccountSet.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = hotWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Hot address settings configuration failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Hot address settings configured!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Create trust line from hot to cold address + // + fmt.Println("⏳ Creating trust line from hot to cold address...") + hotColdTrustSet := &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(hotWallet.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "100000000000000", + }, + } + + flattenedTx = hotColdTrustSet.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = hotWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Trust line from hot to cold address creation failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Trust line from hot to cold address created!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Create trust line from costumer one to cold address + // + fmt.Println("⏳ Creating trust line from customer one to cold address...") + customerOneColdTrustSet := &transactions.TrustSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(customerOneWallet.ClassicAddress), + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "100000000000000", + }, + } + + flattenedTx = customerOneColdTrustSet.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = customerOneWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Trust line from customer one to cold address creation failed!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Trust line from customer one to cold address created!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Send tokens from cold wallet to hot wallet + // + fmt.Println("⏳ Sending tokens from cold wallet to hot wallet...") + coldToHotPayment := &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "3800", + }, + Destination: types.Address(hotWallet.ClassicAddress), + DestinationTag: types.DestinationTag(1), + } + + flattenedTx = coldToHotPayment.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Tokens not sent from cold wallet to hot wallet!") + fmt.Println("Try again!") + fmt.Println() + return + } + + fmt.Println("✅ Tokens sent from cold wallet to hot wallet!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Send tokens from hot wallet to customer one + // + fmt.Println("⏳ Sending tokens from cold wallet to customer one...") + coldToCustomerOnePayment := &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "100", + }, + Destination: types.Address(customerOneWallet.ClassicAddress), + } + + flattenedTx = coldToCustomerOnePayment.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Tokens not sent from cold wallet to customer one!") + fmt.Println() + return + } + + fmt.Println("✅ Tokens sent from cold wallet to customer one!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Freeze cold wallet + // + fmt.Println("⏳ Freezing cold wallet...") + freezeColdWallet := &transactions.AccountSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + } + + freezeColdWallet.SetAsfGlobalFreeze() + + flattenedTx = freezeColdWallet.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Cold wallet freezing failed!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + return + } + + fmt.Println("✅ Cold wallet frozen!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Try to send tokens from hot wallet to customer one + // + fmt.Println("⏳ Trying to send tokens from hot wallet to customer one...") + hotToCustomerOnePayment := &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(hotWallet.ClassicAddress), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "100", + }, + Destination: types.Address(customerOneWallet.ClassicAddress), + } + + flattenedTx = hotToCustomerOnePayment.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = hotWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + _, err = client.SubmitTxBlobAndWait(txBlob, false) + if err == nil { + return + } + + fmt.Println("❌ Tokens not sent from hot wallet to customer one!") + fmt.Println() + + // // + // // Unfreeze cold wallet + // // + fmt.Println("⏳ Unfreezing cold wallet...") + unfreezeColdWallet := &transactions.AccountSet{ + BaseTx: transactions.BaseTx{ + Account: types.Address(coldWallet.ClassicAddress), + }, + } + + unfreezeColdWallet.ClearAsfGlobalFreeze() + + flattenedTx = unfreezeColdWallet.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = coldWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Cold wallet unfreezing failed!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + return + } + + fmt.Println("✅ Cold wallet unfrozen!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() + + // + // Try to send tokens from hot wallet to customer one + // + fmt.Println("⏳ Trying to send tokens from hot wallet to customer one...") + hotToCustomerOnePayment = &transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(hotWallet.ClassicAddress), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: currencyCode, + Issuer: types.Address(coldWallet.ClassicAddress), + Value: "100", + }, + Destination: types.Address(customerOneWallet.ClassicAddress), + } + + flattenedTx = hotToCustomerOnePayment.Flatten() + err = client.Autofill(&flattenedTx) + if err != nil { + fmt.Printf("❌ Error autofilling transaction: %s\n", err) + return + } + + txBlob, _, err = hotWallet.Sign(flattenedTx) + if err != nil { + fmt.Printf("❌ Error signing transaction: %s\n", err) + return + } + + response, err = client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Printf("❌ Error submitting transaction: %s\n", err) + return + } + + if !response.Validated { + fmt.Println("❌ Tokens not sent from hot wallet to customer one!") + fmt.Println("Try again!") + return + } + + fmt.Println("✅ Tokens sent from hot wallet to customer one!") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println() } diff --git a/_code-samples/monitor-payments-websocket/go/monitor-incoming-payments.go b/_code-samples/monitor-payments-websocket/go/monitor-incoming-payments.go index 1096a6f5764..ae704cd706d 100644 --- a/_code-samples/monitor-payments-websocket/go/monitor-incoming-payments.go +++ b/_code-samples/monitor-payments-websocket/go/monitor-incoming-payments.go @@ -7,15 +7,15 @@ package main // install: go get github.com/gorilla/websocket import ( - "encoding/json" - "flag" - "log" - "net/url" - "os" - "os/signal" - "time" - - "github.com/gorilla/websocket" + "encoding/json" + "flag" + "log" + "net/url" + "os" + "os/signal" + "time" + + "github.com/gorilla/websocket" ) // websocket address @@ -23,75 +23,75 @@ var addr = flag.String("addr", "s.altnet.rippletest.net:51233", "http service ad // Payload object type message struct { - Command string `json:"command"` - Accounts []string `json:"accounts"` + Command string `json:"command"` + Accounts []string `json:"accounts"` } func main() { - flag.Parse() - log.SetFlags(0) - - var m message - - // check for interrupts and cleanly close the connection - interrupt := make(chan os.Signal, 1) - signal.Notify(interrupt, os.Interrupt) - - u := url.URL{Scheme: "ws", Host: *addr, Path: "/"} - log.Printf("connecting to %s", u.String()) - - // make the connection - c, _, err := websocket.DefaultDialer.Dial(u.String(), nil) - if err != nil { - log.Fatal("dial:", err) - } - // on exit close - defer c.Close() - - done := make(chan struct{}) - - // send a subscribe command and a target XRPL account - m.Command = "subscribe" - m.Accounts = append(m.Accounts, "rUCzEr6jrEyMpjhs4wSdQdz4g8Y382NxfM") - - // struct to JSON marshalling - msg, _ := json.Marshal(m) - // write to the websocket - err = c.WriteMessage(websocket.TextMessage, []byte(string(msg))) - if err != nil { - log.Println("write:", err) - return - } - - // read from the websocket - _, message, err := c.ReadMessage() - if err != nil { - log.Println("read:", err) - return - } - // print the response from the XRP Ledger - log.Printf("recv: %s", message) - - // handle interrupt - for { - select { - case <-done: - return - case <-interrupt: - log.Println("interrupt") - - // Cleanly close the connection by sending a close message and then - // waiting (with timeout) for the server to close the connection. - err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, "")) - if err != nil { - log.Println("write close:", err) - return - } - select { - case <-done: - case <-time.After(time.Second): - } - return - } - } + flag.Parse() + log.SetFlags(0) + + var m message + + // check for interrupts and cleanly close the connection + interrupt := make(chan os.Signal, 1) + signal.Notify(interrupt, os.Interrupt) + + u := url.URL{Scheme: "ws", Host: *addr, Path: "/"} + log.Printf("connecting to %s", u.String()) + + // make the connection + c, _, err := websocket.DefaultDialer.Dial(u.String(), nil) + if err != nil { + log.Fatal("dial:", err) + } + // on exit close + defer c.Close() + + done := make(chan struct{}) + + // send a subscribe command and a target XRPL account + m.Command = "subscribe" + m.Accounts = append(m.Accounts, "rUCzEr6jrEyMpjhs4wSdQdz4g8Y382NxfM") + + // struct to JSON marshalling + msg, _ := json.Marshal(m) + // write to the websocket + err = c.WriteMessage(websocket.TextMessage, []byte(string(msg))) + if err != nil { + log.Println("write:", err) + return + } + + // read from the websocket + _, message, err := c.ReadMessage() + if err != nil { + log.Println("read:", err) + return + } + // print the response from the XRP Ledger + log.Printf("recv: %s", message) + + // handle interrupt + for { + select { + case <-done: + return + case <-interrupt: + log.Println("interrupt") + + // Cleanly close the connection by sending a close message and then + // waiting (with timeout) for the server to close the connection. + err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, "")) + if err != nil { + log.Println("write close:", err) + return + } + select { + case <-done: + case <-time.After(time.Second): + } + return + } + } } diff --git a/_code-samples/multisigning/go/rpc/main.go b/_code-samples/multisigning/go/rpc/main.go index 447c8f8cf1b..b281f86e305 100644 --- a/_code-samples/multisigning/go/rpc/main.go +++ b/_code-samples/multisigning/go/rpc/main.go @@ -1,166 +1,166 @@ package main import ( - "encoding/hex" - "fmt" - "maps" - "strings" - - "github.com/Peersyst/xrpl-go/xrpl" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/ledger-entry-types" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "encoding/hex" + "fmt" + "maps" + "strings" + + "github.com/Peersyst/xrpl-go/xrpl" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/ledger-entry-types" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { - cfg, err := rpc.NewClientConfig( - "https://s.altnet.rippletest.net:51234/", - rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), - ) - if err != nil { - panic(err) - } - - client := rpc.NewClient(cfg) - - w1, err := wallet.FromSeed("sEdTtvLmJmrb7GaivhWoXRkvU4NDjVf", "") - if err != nil { - fmt.Println(err) - return - } - - w2, err := wallet.FromSeed("sEdSFiKMQp7RvYLgH7t7FEpwNRWv2Gr", "") - if err != nil { - fmt.Println(err) - return - } - - master, err := wallet.FromSeed("sEdTMm2yv8c8Rg8YHFHQA9TxVMFy1ze", "") - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("⏳ Funding wallets...") - - if err := client.FundWallet(&w1); err != nil { - fmt.Println(err) - return - } - fmt.Println("💸 Wallet 1 funded") - - if err := client.FundWallet(&w2); err != nil { - fmt.Println(err) - return - } - - fmt.Println("💸 Wallet 2 funded") - - if err := client.FundWallet(&master); err != nil { - fmt.Println(err) - return - } - fmt.Println("💸 Master wallet funded") - fmt.Println() - fmt.Println("⏳ Setting up signer list...") - - ss := &transaction.SignerListSet{ - BaseTx: transaction.BaseTx{ - Account: master.GetAddress(), - }, - SignerQuorum: uint32(2), - SignerEntries: []ledger.SignerEntryWrapper{ - { - SignerEntry: ledger.SignerEntry{ - Account: w1.GetAddress(), - SignerWeight: 1, - }, - }, - { - SignerEntry: ledger.SignerEntry{ - Account: w2.GetAddress(), - SignerWeight: 1, - }, - }, - { - SignerEntry: ledger.SignerEntry{ - Account: "XVYRdEocC28DRx94ZFGP3qNJ1D5Ln7ecXFMd3vREB5Pesju", - SignerWeight: 1, - }, - }, - }, - } - - flatSs := ss.Flatten() - - if err := client.Autofill(&flatSs); err != nil { - fmt.Println(err) - return - } - - blob, _, err := master.Sign(flatSs) - if err != nil { - fmt.Println(err) - return - } - - res, err := client.SubmitTxBlobAndWait(blob, false) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ SignerListSet transaction submitted!") - fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) - fmt.Println() - - fmt.Println("⏳ Setting up AccountSet multisign transaction...") - - as := &transaction.AccountSet{ - BaseTx: transaction.BaseTx{ - Account: master.GetAddress(), - }, - Domain: types.Domain(strings.ToUpper(hex.EncodeToString([]byte("example.com")))), - } - - flatAs := as.Flatten() - - if err := client.AutofillMultisigned(&flatAs, 2); err != nil { - fmt.Println(err) - return - } - - w1As := maps.Clone(flatAs) - - blob1, _, err := w1.Multisign(w1As) - if err != nil { - fmt.Println(err) - return - } - - w2As := maps.Clone(flatAs) - - blob2, _, err := w2.Multisign(w2As) - if err != nil { - fmt.Println(err) - return - } - - blob, err = xrpl.Multisign(blob1, blob2) - if err != nil { - fmt.Println(err) - return - } - - mRes, err := client.SubmitMultisigned(blob, false) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Multisigned transaction submitted!") - fmt.Printf("🌐 Result: %s\n", mRes.EngineResult) + cfg, err := rpc.NewClientConfig( + "https://s.altnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + client := rpc.NewClient(cfg) + + w1, err := wallet.FromSeed("sEdTtvLmJmrb7GaivhWoXRkvU4NDjVf", "") + if err != nil { + fmt.Println(err) + return + } + + w2, err := wallet.FromSeed("sEdSFiKMQp7RvYLgH7t7FEpwNRWv2Gr", "") + if err != nil { + fmt.Println(err) + return + } + + master, err := wallet.FromSeed("sEdTMm2yv8c8Rg8YHFHQA9TxVMFy1ze", "") + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Funding wallets...") + + if err := client.FundWallet(&w1); err != nil { + fmt.Println(err) + return + } + fmt.Println("💸 Wallet 1 funded") + + if err := client.FundWallet(&w2); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet 2 funded") + + if err := client.FundWallet(&master); err != nil { + fmt.Println(err) + return + } + fmt.Println("💸 Master wallet funded") + fmt.Println() + fmt.Println("⏳ Setting up signer list...") + + ss := &transaction.SignerListSet{ + BaseTx: transaction.BaseTx{ + Account: master.GetAddress(), + }, + SignerQuorum: uint32(2), + SignerEntries: []ledger.SignerEntryWrapper{ + { + SignerEntry: ledger.SignerEntry{ + Account: w1.GetAddress(), + SignerWeight: 1, + }, + }, + { + SignerEntry: ledger.SignerEntry{ + Account: w2.GetAddress(), + SignerWeight: 1, + }, + }, + { + SignerEntry: ledger.SignerEntry{ + Account: "XVYRdEocC28DRx94ZFGP3qNJ1D5Ln7ecXFMd3vREB5Pesju", + SignerWeight: 1, + }, + }, + }, + } + + flatSs := ss.Flatten() + + if err := client.Autofill(&flatSs); err != nil { + fmt.Println(err) + return + } + + blob, _, err := master.Sign(flatSs) + if err != nil { + fmt.Println(err) + return + } + + res, err := client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ SignerListSet transaction submitted!") + fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Println() + + fmt.Println("⏳ Setting up AccountSet multisign transaction...") + + as := &transaction.AccountSet{ + BaseTx: transaction.BaseTx{ + Account: master.GetAddress(), + }, + Domain: types.Domain(strings.ToUpper(hex.EncodeToString([]byte("example.com")))), + } + + flatAs := as.Flatten() + + if err := client.AutofillMultisigned(&flatAs, 2); err != nil { + fmt.Println(err) + return + } + + w1As := maps.Clone(flatAs) + + blob1, _, err := w1.Multisign(w1As) + if err != nil { + fmt.Println(err) + return + } + + w2As := maps.Clone(flatAs) + + blob2, _, err := w2.Multisign(w2As) + if err != nil { + fmt.Println(err) + return + } + + blob, err = xrpl.Multisign(blob1, blob2) + if err != nil { + fmt.Println(err) + return + } + + mRes, err := client.SubmitMultisigned(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Multisigned transaction submitted!") + fmt.Printf("🌐 Result: %s\n", mRes.EngineResult) } diff --git a/_code-samples/multisigning/go/ws/main.go b/_code-samples/multisigning/go/ws/main.go index 88abba06a3f..e5ae17d0a79 100644 --- a/_code-samples/multisigning/go/ws/main.go +++ b/_code-samples/multisigning/go/ws/main.go @@ -1,181 +1,181 @@ package main import ( - "encoding/hex" - "fmt" - "maps" - "strings" - - "github.com/Peersyst/xrpl-go/xrpl" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/ledger-entry-types" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" + "encoding/hex" + "fmt" + "maps" + "strings" + + "github.com/Peersyst/xrpl-go/xrpl" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/ledger-entry-types" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" ) func main() { - fmt.Println("⏳ Connecting to testnet...") - client := websocket.NewClient( - websocket.NewClientConfig(). - WithHost("wss://s.altnet.rippletest.net:51233"). - WithFaucetProvider(faucet.NewTestnetFaucetProvider()), - ) - defer client.Disconnect() - - if err := client.Connect(); err != nil { - fmt.Println(err) - return - } - - if !client.IsConnected() { - fmt.Println("❌ Failed to connect to testnet") - return - } - - fmt.Println("✅ Connected to testnet") - fmt.Println() - - w1, err := wallet.FromSeed("sEdTtvLmJmrb7GaivhWoXRkvU4NDjVf", "") - if err != nil { - fmt.Println(err) - return - } - - w2, err := wallet.FromSeed("sEdSFiKMQp7RvYLgH7t7FEpwNRWv2Gr", "") - if err != nil { - fmt.Println(err) - return - } - - master, err := wallet.FromSeed("sEdTMm2yv8c8Rg8YHFHQA9TxVMFy1ze", "") - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("⏳ Funding wallets...") - - if err := client.FundWallet(&w1); err != nil { - fmt.Println(err) - return - } - fmt.Println("💸 Wallet 1 funded") - - if err := client.FundWallet(&w2); err != nil { - fmt.Println(err) - return - } - - fmt.Println("💸 Wallet 2 funded") - - if err := client.FundWallet(&master); err != nil { - fmt.Println(err) - return - } - fmt.Println("💸 Master wallet funded") - fmt.Println() - fmt.Println("⏳ Setting up signer list...") - - ss := &transaction.SignerListSet{ - BaseTx: transaction.BaseTx{ - Account: master.GetAddress(), - }, - SignerQuorum: uint32(2), - SignerEntries: []ledger.SignerEntryWrapper{ - { - SignerEntry: ledger.SignerEntry{ - Account: w1.GetAddress(), - SignerWeight: 1, - }, - }, - { - SignerEntry: ledger.SignerEntry{ - Account: w2.GetAddress(), - SignerWeight: 1, - }, - }, - { - SignerEntry: ledger.SignerEntry{ - Account: "XVYRdEocC28DRx94ZFGP3qNJ1D5Ln7ecXFMd3vREB5Pesju", - SignerWeight: 1, - }, - }, - }, - } - - fmt.Println("⏳ Flattening transaction...") - flatSs := ss.Flatten() - - fmt.Println("⏳ Autofilling transaction...") - if err := client.Autofill(&flatSs); err != nil { - fmt.Println(err) - return - } - - fmt.Println("⏳ Signing transaction...") - blob, _, err := master.Sign(flatSs) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("⏳ Submitting transaction...") - res, err := client.SubmitTxBlobAndWait(blob, false) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ SignerListSet transaction submitted!") - fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) - fmt.Println() - - fmt.Println("⏳ Setting up AccountSet multisign transaction...") - - as := &transaction.AccountSet{ - BaseTx: transaction.BaseTx{ - Account: master.GetAddress(), - }, - Domain: types.Domain(strings.ToUpper(hex.EncodeToString([]byte("example.com")))), - } - - flatAs := as.Flatten() - - if err := client.AutofillMultisigned(&flatAs, 2); err != nil { - fmt.Println(err) - return - } - - w1As := maps.Clone(flatAs) - - blob1, _, err := w1.Multisign(w1As) - if err != nil { - fmt.Println(err) - return - } - - w2As := maps.Clone(flatAs) - - blob2, _, err := w2.Multisign(w2As) - if err != nil { - fmt.Println(err) - return - } - - blob, err = xrpl.Multisign(blob1, blob2) - if err != nil { - fmt.Println(err) - return - } - - mRes, err := client.SubmitMultisigned(blob, false) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Multisigned transaction submitted!") - fmt.Printf("🌐 Result: %s\n", mRes.EngineResult) + fmt.Println("⏳ Connecting to testnet...") + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + defer client.Disconnect() + + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + if !client.IsConnected() { + fmt.Println("❌ Failed to connect to testnet") + return + } + + fmt.Println("✅ Connected to testnet") + fmt.Println() + + w1, err := wallet.FromSeed("sEdTtvLmJmrb7GaivhWoXRkvU4NDjVf", "") + if err != nil { + fmt.Println(err) + return + } + + w2, err := wallet.FromSeed("sEdSFiKMQp7RvYLgH7t7FEpwNRWv2Gr", "") + if err != nil { + fmt.Println(err) + return + } + + master, err := wallet.FromSeed("sEdTMm2yv8c8Rg8YHFHQA9TxVMFy1ze", "") + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Funding wallets...") + + if err := client.FundWallet(&w1); err != nil { + fmt.Println(err) + return + } + fmt.Println("💸 Wallet 1 funded") + + if err := client.FundWallet(&w2); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet 2 funded") + + if err := client.FundWallet(&master); err != nil { + fmt.Println(err) + return + } + fmt.Println("💸 Master wallet funded") + fmt.Println() + fmt.Println("⏳ Setting up signer list...") + + ss := &transaction.SignerListSet{ + BaseTx: transaction.BaseTx{ + Account: master.GetAddress(), + }, + SignerQuorum: uint32(2), + SignerEntries: []ledger.SignerEntryWrapper{ + { + SignerEntry: ledger.SignerEntry{ + Account: w1.GetAddress(), + SignerWeight: 1, + }, + }, + { + SignerEntry: ledger.SignerEntry{ + Account: w2.GetAddress(), + SignerWeight: 1, + }, + }, + { + SignerEntry: ledger.SignerEntry{ + Account: "XVYRdEocC28DRx94ZFGP3qNJ1D5Ln7ecXFMd3vREB5Pesju", + SignerWeight: 1, + }, + }, + }, + } + + fmt.Println("⏳ Flattening transaction...") + flatSs := ss.Flatten() + + fmt.Println("⏳ Autofilling transaction...") + if err := client.Autofill(&flatSs); err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Signing transaction...") + blob, _, err := master.Sign(flatSs) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Submitting transaction...") + res, err := client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ SignerListSet transaction submitted!") + fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Println() + + fmt.Println("⏳ Setting up AccountSet multisign transaction...") + + as := &transaction.AccountSet{ + BaseTx: transaction.BaseTx{ + Account: master.GetAddress(), + }, + Domain: types.Domain(strings.ToUpper(hex.EncodeToString([]byte("example.com")))), + } + + flatAs := as.Flatten() + + if err := client.AutofillMultisigned(&flatAs, 2); err != nil { + fmt.Println(err) + return + } + + w1As := maps.Clone(flatAs) + + blob1, _, err := w1.Multisign(w1As) + if err != nil { + fmt.Println(err) + return + } + + w2As := maps.Clone(flatAs) + + blob2, _, err := w2.Multisign(w2As) + if err != nil { + fmt.Println(err) + return + } + + blob, err = xrpl.Multisign(blob1, blob2) + if err != nil { + fmt.Println(err) + return + } + + mRes, err := client.SubmitMultisigned(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Multisigned transaction submitted!") + fmt.Printf("🌐 Result: %s\n", mRes.EngineResult) } diff --git a/_code-samples/non-fungible-token/go/nft-accept/rpc/main.go b/_code-samples/non-fungible-token/go/nft-accept/rpc/main.go index 72bbe964c78..9b2affc0c28 100644 --- a/_code-samples/non-fungible-token/go/nft-accept/rpc/main.go +++ b/_code-samples/non-fungible-token/go/nft-accept/rpc/main.go @@ -1,128 +1,128 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/rpc/types" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/rpc/types" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { - // Initialize the RPC client configuration - cfg, err := rpc.NewClientConfig( - "https://s.devnet.rippletest.net:51234/", - rpc.WithFaucetProvider(faucet.NewDevnetFaucetProvider()), - ) - if err != nil { - panic(err) - } - - // Create the RPC client - client := rpc.NewClient(cfg) - - // Step 1: Fund wallets - fmt.Println("⏳ Funding wallets...") - - // Create and fund the NFT minter wallet - nftMinter, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println("❌ Error creating NFT minter wallet:", err) - return - } - if err := client.FundWallet(&nftMinter); err != nil { - fmt.Println("❌ Error funding NFT minter wallet:", err) - return - } - fmt.Println("💸 NFT minter wallet funded!") - - // Create and fund the NFT buyer wallet - nftBuyer, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println("❌ Error creating NFT buyer wallet:", err) - return - } - if err := client.FundWallet(&nftBuyer); err != nil { - fmt.Println("❌ Error funding NFT buyer wallet:", err) - return - } - fmt.Println("💸 NFT buyer wallet funded!") - fmt.Println() - - // Step 2: Mint an NFT - fmt.Println("⏳ Minting NFT...") - - nftMint := transaction.NFTokenMint{ - BaseTx: transaction.BaseTx{ - Account: nftMinter.ClassicAddress, - TransactionType: transaction.NFTokenMintTx, - }, - Destination: nftBuyer.ClassicAddress, - Amount: txnTypes.XRPCurrencyAmount(1000000), // 1 XRP - NFTokenTaxon: 0, - URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com - } - nftMint.SetTransferableFlag() - - responseMint, err := client.SubmitTxAndWait(nftMint.Flatten(), &types.SubmitOptions{ - Autofill: true, - Wallet: &nftMinter, - }) - if err != nil { - fmt.Println("❌ Error minting NFT:", err) - return - } - if !responseMint.Validated { - fmt.Println("❌ NFTokenMint txn is not in a validated ledger", responseMint) - return - } - fmt.Println("✅ NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) - fmt.Println() - - // Step 3: Retrieve the NFT token offer ID - fmt.Println("⏳ Retrieving NFT offer ID...") - - metaMap, ok := responseMint.Meta.(map[string]any) - if !ok { - fmt.Println("❌ Meta is not a map[string]any") - return - } - - offerID, ok := metaMap["offer_id"].(string) - if !ok { - fmt.Println("❌ offer_id not found or not a string") - return - } - - fmt.Println("🌎 offer_id:", offerID) - fmt.Println() - - // Step 4: Accept the NFT offer - fmt.Println("⏳ Accepting NFT offer...") - - nftAccept := transaction.NFTokenAcceptOffer{ - BaseTx: transaction.BaseTx{ - Account: nftBuyer.ClassicAddress, - TransactionType: transaction.NFTokenAcceptOfferTx, - }, - NFTokenSellOffer: txnTypes.Hash256(offerID), - } - - response, err := client.SubmitTxAndWait(nftAccept.Flatten(), &types.SubmitOptions{ - Autofill: true, - Wallet: &nftBuyer, - }) - if err != nil { - fmt.Println("❌ Error accepting NFT offer:", err) - return - } - if !response.Validated { - fmt.Println("❌ NFTokenAcceptOffer txn is not in a validated ledger", response) - return - } - fmt.Println("✅ NFT offer accepted successfully! - 🌎 Hash: ", response.Hash) + // Initialize the RPC client configuration + cfg, err := rpc.NewClientConfig( + "https://s.devnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + // Create the RPC client + client := rpc.NewClient(cfg) + + // Step 1: Fund wallets + fmt.Println("⏳ Funding wallets...") + + // Create and fund the NFT minter wallet + nftMinter, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println("❌ Error creating NFT minter wallet:", err) + return + } + if err := client.FundWallet(&nftMinter); err != nil { + fmt.Println("❌ Error funding NFT minter wallet:", err) + return + } + fmt.Println("💸 NFT minter wallet funded!") + + // Create and fund the NFT buyer wallet + nftBuyer, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println("❌ Error creating NFT buyer wallet:", err) + return + } + if err := client.FundWallet(&nftBuyer); err != nil { + fmt.Println("❌ Error funding NFT buyer wallet:", err) + return + } + fmt.Println("💸 NFT buyer wallet funded!") + fmt.Println() + + // Step 2: Mint an NFT + fmt.Println("⏳ Minting NFT...") + + nftMint := transaction.NFTokenMint{ + BaseTx: transaction.BaseTx{ + Account: nftMinter.ClassicAddress, + TransactionType: transaction.NFTokenMintTx, + }, + Destination: nftBuyer.ClassicAddress, + Amount: txnTypes.XRPCurrencyAmount(1000000), // 1 XRP + NFTokenTaxon: 0, + URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com + } + nftMint.SetTransferableFlag() + + responseMint, err := client.SubmitTxAndWait(nftMint.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftMinter, + }) + if err != nil { + fmt.Println("❌ Error minting NFT:", err) + return + } + if !responseMint.Validated { + fmt.Println("❌ NFTokenMint txn is not in a validated ledger", responseMint) + return + } + fmt.Println("✅ NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println() + + // Step 3: Retrieve the NFT token offer ID + fmt.Println("⏳ Retrieving NFT offer ID...") + + metaMap, ok := responseMint.Meta.(map[string]any) + if !ok { + fmt.Println("❌ Meta is not a map[string]any") + return + } + + offerID, ok := metaMap["offer_id"].(string) + if !ok { + fmt.Println("❌ offer_id not found or not a string") + return + } + + fmt.Println("🌎 offer_id:", offerID) + fmt.Println() + + // Step 4: Accept the NFT offer + fmt.Println("⏳ Accepting NFT offer...") + + nftAccept := transaction.NFTokenAcceptOffer{ + BaseTx: transaction.BaseTx{ + Account: nftBuyer.ClassicAddress, + TransactionType: transaction.NFTokenAcceptOfferTx, + }, + NFTokenSellOffer: txnTypes.Hash256(offerID), + } + + response, err := client.SubmitTxAndWait(nftAccept.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftBuyer, + }) + if err != nil { + fmt.Println("❌ Error accepting NFT offer:", err) + return + } + if !response.Validated { + fmt.Println("❌ NFTokenAcceptOffer txn is not in a validated ledger", response) + return + } + fmt.Println("✅ NFT offer accepted successfully! - 🌎 Hash: ", response.Hash) } diff --git a/_code-samples/non-fungible-token/go/nft-accept/ws/main.go b/_code-samples/non-fungible-token/go/nft-accept/ws/main.go index d25ac1e4d07..2d988e6b1e2 100644 --- a/_code-samples/non-fungible-token/go/nft-accept/ws/main.go +++ b/_code-samples/non-fungible-token/go/nft-accept/ws/main.go @@ -1,133 +1,133 @@ package main import ( - "fmt" + "fmt" - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" - "github.com/Peersyst/xrpl-go/xrpl/websocket/types" + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" + "github.com/Peersyst/xrpl-go/xrpl/websocket/types" ) func main() { - // Connect to the XRPL devnet - fmt.Println("⏳ Connecting to devnet...") - client := websocket.NewClient( - websocket.NewClientConfig(). - WithHost("wss://s.devnet.rippletest.net:51233"). - WithFaucetProvider(faucet.NewDevnetFaucetProvider()), - ) - defer client.Disconnect() + // Connect to the XRPL devnet + fmt.Println("⏳ Connecting to devnet...") + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.devnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) + defer client.Disconnect() - if err := client.Connect(); err != nil { - fmt.Println("❌ Error connecting to devnet:", err) - return - } + if err := client.Connect(); err != nil { + fmt.Println("❌ Error connecting to devnet:", err) + return + } - if !client.IsConnected() { - fmt.Println("❌ Failed to connect to devnet") - return - } - fmt.Println("✅ Connected to devnet") - fmt.Println() + if !client.IsConnected() { + fmt.Println("❌ Failed to connect to devnet") + return + } + fmt.Println("✅ Connected to devnet") + fmt.Println() - // Fund wallets - fmt.Println("⏳ Funding wallets...") + // Fund wallets + fmt.Println("⏳ Funding wallets...") - // Create and fund the NFT minter wallet - nftMinter, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println("❌ Error creating NFT minter wallet:", err) - return - } - if err := client.FundWallet(&nftMinter); err != nil { - fmt.Println("❌ Error funding NFT minter wallet:", err) - return - } - fmt.Println("💸 NFT minter wallet funded!") + // Create and fund the NFT minter wallet + nftMinter, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println("❌ Error creating NFT minter wallet:", err) + return + } + if err := client.FundWallet(&nftMinter); err != nil { + fmt.Println("❌ Error funding NFT minter wallet:", err) + return + } + fmt.Println("💸 NFT minter wallet funded!") - // Create and fund the NFT buyer wallet - nftBuyer, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println("❌ Error creating NFT buyer wallet:", err) - return - } - if err := client.FundWallet(&nftBuyer); err != nil { - fmt.Println("❌ Error funding NFT buyer wallet:", err) - return - } - fmt.Println("💸 NFT buyer wallet funded!") - fmt.Println() + // Create and fund the NFT buyer wallet + nftBuyer, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println("❌ Error creating NFT buyer wallet:", err) + return + } + if err := client.FundWallet(&nftBuyer); err != nil { + fmt.Println("❌ Error funding NFT buyer wallet:", err) + return + } + fmt.Println("💸 NFT buyer wallet funded!") + fmt.Println() - // Mint an NFT - fmt.Println("⏳ Minting NFT...") - nftMint := transaction.NFTokenMint{ - BaseTx: transaction.BaseTx{ - Account: nftMinter.ClassicAddress, - TransactionType: transaction.NFTokenMintTx, - }, - Destination: nftBuyer.ClassicAddress, - Amount: txnTypes.XRPCurrencyAmount(1000000), // 1 XRP - NFTokenTaxon: 0, - URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com - } - nftMint.SetTransferableFlag() + // Mint an NFT + fmt.Println("⏳ Minting NFT...") + nftMint := transaction.NFTokenMint{ + BaseTx: transaction.BaseTx{ + Account: nftMinter.ClassicAddress, + TransactionType: transaction.NFTokenMintTx, + }, + Destination: nftBuyer.ClassicAddress, + Amount: txnTypes.XRPCurrencyAmount(1000000), // 1 XRP + NFTokenTaxon: 0, + URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com + } + nftMint.SetTransferableFlag() - responseMint, err := client.SubmitTxAndWait(nftMint.Flatten(), &types.SubmitOptions{ - Autofill: true, - Wallet: &nftMinter, - }) - if err != nil { - fmt.Println("❌ Error minting NFT:", err) - return - } - if !responseMint.Validated { - fmt.Println("❌ NFTokenMint transaction is not in a validated ledger:", responseMint) - return - } - fmt.Println("✅ NFT minted successfully! - 🌎 Hash:", responseMint.Hash) - fmt.Println() + responseMint, err := client.SubmitTxAndWait(nftMint.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftMinter, + }) + if err != nil { + fmt.Println("❌ Error minting NFT:", err) + return + } + if !responseMint.Validated { + fmt.Println("❌ NFTokenMint transaction is not in a validated ledger:", responseMint) + return + } + fmt.Println("✅ NFT minted successfully! - 🌎 Hash:", responseMint.Hash) + fmt.Println() - // Extract the NFT token offer ID from the transaction metadata - fmt.Println("⏳ Extracting offer ID...") - metaMap, ok := responseMint.Meta.(map[string]any) - if !ok { - fmt.Println("❌ Meta is not a map[string]any") - return - } + // Extract the NFT token offer ID from the transaction metadata + fmt.Println("⏳ Extracting offer ID...") + metaMap, ok := responseMint.Meta.(map[string]any) + if !ok { + fmt.Println("❌ Meta is not a map[string]any") + return + } - offerID, ok := metaMap["offer_id"].(string) - if !ok { - fmt.Println("❌ offer_id not found or not a string") - return - } - fmt.Println("🌎 offer_id:", offerID) - fmt.Println() + offerID, ok := metaMap["offer_id"].(string) + if !ok { + fmt.Println("❌ offer_id not found or not a string") + return + } + fmt.Println("🌎 offer_id:", offerID) + fmt.Println() - // Accept the NFT offer - fmt.Println("⏳ Accepting NFT offer...") - nftAccept := transaction.NFTokenAcceptOffer{ - BaseTx: transaction.BaseTx{ - Account: nftBuyer.ClassicAddress, - TransactionType: transaction.NFTokenAcceptOfferTx, - }, - NFTokenSellOffer: txnTypes.Hash256(offerID), - } + // Accept the NFT offer + fmt.Println("⏳ Accepting NFT offer...") + nftAccept := transaction.NFTokenAcceptOffer{ + BaseTx: transaction.BaseTx{ + Account: nftBuyer.ClassicAddress, + TransactionType: transaction.NFTokenAcceptOfferTx, + }, + NFTokenSellOffer: txnTypes.Hash256(offerID), + } - response, err := client.SubmitTxAndWait(nftAccept.Flatten(), &types.SubmitOptions{ - Autofill: true, - Wallet: &nftBuyer, - }) - if err != nil { - fmt.Println("❌ Error accepting NFT offer:", err) - return - } - if !response.Validated { - fmt.Println("❌ NFTokenAcceptOffer transaction is not in a validated ledger:", response) - return - } - fmt.Println("✅ NFT offer accepted successfully! - 🌎 Hash:", response.Hash) + response, err := client.SubmitTxAndWait(nftAccept.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftBuyer, + }) + if err != nil { + fmt.Println("❌ Error accepting NFT offer:", err) + return + } + if !response.Validated { + fmt.Println("❌ NFTokenAcceptOffer transaction is not in a validated ledger:", response) + return + } + fmt.Println("✅ NFT offer accepted successfully! - 🌎 Hash:", response.Hash) } diff --git a/_code-samples/non-fungible-token/go/nft-burn/rpc/main.go b/_code-samples/non-fungible-token/go/nft-burn/rpc/main.go index 317fe6be7e4..179e30d315b 100644 --- a/_code-samples/non-fungible-token/go/nft-burn/rpc/main.go +++ b/_code-samples/non-fungible-token/go/nft-burn/rpc/main.go @@ -1,114 +1,114 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/rpc/types" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/rpc/types" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { - // Initialize the RPC client configuration - cfg, err := rpc.NewClientConfig( - "https://s.devnet.rippletest.net:51234/", - rpc.WithFaucetProvider(faucet.NewDevnetFaucetProvider()), - ) - if err != nil { - panic(err) - } - - // Create the RPC client - client := rpc.NewClient(cfg) - - // Step 1: Fund wallets - fmt.Println("⏳ Funding wallets...") - - // Create and fund the NFT minter wallet - nftMinter, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println("❌ Error creating NFT minter wallet:", err) - return - } - if err := client.FundWallet(&nftMinter); err != nil { - fmt.Println("❌ Error funding NFT minter wallet:", err) - return - } - fmt.Println("💸 NFT minter wallet funded!") - fmt.Println() - - // Step 2: Mint an NFT - fmt.Println("⏳ Minting NFT...") - - nftMint := transaction.NFTokenMint{ - BaseTx: transaction.BaseTx{ - Account: nftMinter.ClassicAddress, - TransactionType: transaction.NFTokenMintTx, - }, - NFTokenTaxon: 0, - URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com - } - nftMint.SetTransferableFlag() - - responseMint, err := client.SubmitTxAndWait(nftMint.Flatten(), &types.SubmitOptions{ - Autofill: true, - Wallet: &nftMinter, - }) - if err != nil { - fmt.Println("❌ Error minting NFT:", err) - return - } - if !responseMint.Validated { - fmt.Println("❌ NFTokenMint txn is not in a validated ledger", responseMint) - return - } - fmt.Println("✅ NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) - fmt.Println() - - // Step 3: Retrieve the token ID - fmt.Println("⏳ Retrieving NFT ID...") - - metaMap, ok := responseMint.Meta.(map[string]any) - if !ok { - fmt.Println("❌ Meta is not a map[string]any") - return - } - - nftokenID, ok := metaMap["nftoken_id"].(string) - if !ok { - fmt.Println("❌ nftoken_id not found or not a string") - return - } - - fmt.Println("🌎 nftoken_id:", nftokenID) - fmt.Println() - - // Step 4: Burn the NFT - fmt.Println("⏳ Burn the NFT...") - - nftBurn := transaction.NFTokenBurn{ - BaseTx: transaction.BaseTx{ - Account: nftMinter.ClassicAddress, - TransactionType: transaction.NFTokenAcceptOfferTx, - }, - NFTokenID: txnTypes.NFTokenID(nftokenID), - } - - responseBurn, err := client.SubmitTxAndWait(nftBurn.Flatten(), &types.SubmitOptions{ - Autofill: true, - Wallet: &nftMinter, - }) - if err != nil { - fmt.Println("❌ Error burning NFT:", err) - return - } - if !responseBurn.Validated { - fmt.Println("❌ NFTokenBurn transactiob is not in a validated ledger", responseBurn) - return - } - fmt.Println("✅ NFT burned successfully! - 🌎 Hash: ", responseBurn.Hash) + // Initialize the RPC client configuration + cfg, err := rpc.NewClientConfig( + "https://s.devnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + // Create the RPC client + client := rpc.NewClient(cfg) + + // Step 1: Fund wallets + fmt.Println("⏳ Funding wallets...") + + // Create and fund the NFT minter wallet + nftMinter, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println("❌ Error creating NFT minter wallet:", err) + return + } + if err := client.FundWallet(&nftMinter); err != nil { + fmt.Println("❌ Error funding NFT minter wallet:", err) + return + } + fmt.Println("💸 NFT minter wallet funded!") + fmt.Println() + + // Step 2: Mint an NFT + fmt.Println("⏳ Minting NFT...") + + nftMint := transaction.NFTokenMint{ + BaseTx: transaction.BaseTx{ + Account: nftMinter.ClassicAddress, + TransactionType: transaction.NFTokenMintTx, + }, + NFTokenTaxon: 0, + URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com + } + nftMint.SetTransferableFlag() + + responseMint, err := client.SubmitTxAndWait(nftMint.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftMinter, + }) + if err != nil { + fmt.Println("❌ Error minting NFT:", err) + return + } + if !responseMint.Validated { + fmt.Println("❌ NFTokenMint txn is not in a validated ledger", responseMint) + return + } + fmt.Println("✅ NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println() + + // Step 3: Retrieve the token ID + fmt.Println("⏳ Retrieving NFT ID...") + + metaMap, ok := responseMint.Meta.(map[string]any) + if !ok { + fmt.Println("❌ Meta is not a map[string]any") + return + } + + nftokenID, ok := metaMap["nftoken_id"].(string) + if !ok { + fmt.Println("❌ nftoken_id not found or not a string") + return + } + + fmt.Println("🌎 nftoken_id:", nftokenID) + fmt.Println() + + // Step 4: Burn the NFT + fmt.Println("⏳ Burn the NFT...") + + nftBurn := transaction.NFTokenBurn{ + BaseTx: transaction.BaseTx{ + Account: nftMinter.ClassicAddress, + TransactionType: transaction.NFTokenAcceptOfferTx, + }, + NFTokenID: txnTypes.NFTokenID(nftokenID), + } + + responseBurn, err := client.SubmitTxAndWait(nftBurn.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftMinter, + }) + if err != nil { + fmt.Println("❌ Error burning NFT:", err) + return + } + if !responseBurn.Validated { + fmt.Println("❌ NFTokenBurn transactiob is not in a validated ledger", responseBurn) + return + } + fmt.Println("✅ NFT burned successfully! - 🌎 Hash: ", responseBurn.Hash) } diff --git a/_code-samples/non-fungible-token/go/nft-burn/ws/main.go b/_code-samples/non-fungible-token/go/nft-burn/ws/main.go index f8a834a563b..fc6cab7ba5c 100644 --- a/_code-samples/non-fungible-token/go/nft-burn/ws/main.go +++ b/_code-samples/non-fungible-token/go/nft-burn/ws/main.go @@ -1,123 +1,123 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" - "github.com/Peersyst/xrpl-go/xrpl/websocket/types" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" + "github.com/Peersyst/xrpl-go/xrpl/websocket/types" ) func main() { - // Connect to the XRPL devnet - fmt.Println("⏳ Connecting to devnet...") - client := websocket.NewClient( - websocket.NewClientConfig(). - WithHost("wss://s.devnet.rippletest.net:51233"). - WithFaucetProvider(faucet.NewDevnetFaucetProvider()), - ) - defer client.Disconnect() - - if err := client.Connect(); err != nil { - fmt.Println("❌ Error connecting to devnet:", err) - return - } - - if !client.IsConnected() { - fmt.Println("❌ Failed to connect to devnet") - return - } - fmt.Println("✅ Connected to devnet") - fmt.Println() - - // Step 1: Fund wallets - fmt.Println("⏳ Funding wallets...") - - // Create and fund the NFT minter wallet - nftMinter, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println("❌ Error creating NFT minter wallet:", err) - return - } - if err := client.FundWallet(&nftMinter); err != nil { - fmt.Println("❌ Error funding NFT minter wallet:", err) - return - } - fmt.Println("💸 NFT minter wallet funded!") - fmt.Println() - - // Step 2: Mint an NFT - fmt.Println("⏳ Minting NFT...") - - nftMint := transaction.NFTokenMint{ - BaseTx: transaction.BaseTx{ - Account: nftMinter.ClassicAddress, - TransactionType: transaction.NFTokenMintTx, - }, - NFTokenTaxon: 0, - URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com - } - nftMint.SetTransferableFlag() - - responseMint, err := client.SubmitTxAndWait(nftMint.Flatten(), &types.SubmitOptions{ - Autofill: true, - Wallet: &nftMinter, - }) - if err != nil { - fmt.Println("❌ Error minting NFT:", err) - return - } - if !responseMint.Validated { - fmt.Println("❌ NFTokenMint txn is not in a validated ledger", responseMint) - return - } - fmt.Println("✅ NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) - fmt.Println() - - // Step 3: Retrieve the token ID - fmt.Println("⏳ Retrieving NFT ID...") - - metaMap, ok := responseMint.Meta.(map[string]any) - if !ok { - fmt.Println("❌ Meta is not a map[string]any") - return - } - - nftokenID, ok := metaMap["nftoken_id"].(string) - if !ok { - fmt.Println("❌ nftoken_id not found or not a string") - return - } - - fmt.Println("🌎 nftoken_id:", nftokenID) - fmt.Println() - - // Step 4: Burn the NFT - fmt.Println("⏳ Burn the NFT...") - - nftBurn := transaction.NFTokenBurn{ - BaseTx: transaction.BaseTx{ - Account: nftMinter.ClassicAddress, - TransactionType: transaction.NFTokenAcceptOfferTx, - }, - NFTokenID: txnTypes.NFTokenID(nftokenID), - } - - responseBurn, err := client.SubmitTxAndWait(nftBurn.Flatten(), &types.SubmitOptions{ - Autofill: true, - Wallet: &nftMinter, - }) - if err != nil { - fmt.Println("❌ Error burning NFT:", err) - return - } - if !responseBurn.Validated { - fmt.Println("❌ NFTokenBurn transactiob is not in a validated ledger", responseBurn) - return - } - fmt.Println("✅ NFT burned successfully! - 🌎 Hash: ", responseBurn.Hash) + // Connect to the XRPL devnet + fmt.Println("⏳ Connecting to devnet...") + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.devnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) + defer client.Disconnect() + + if err := client.Connect(); err != nil { + fmt.Println("❌ Error connecting to devnet:", err) + return + } + + if !client.IsConnected() { + fmt.Println("❌ Failed to connect to devnet") + return + } + fmt.Println("✅ Connected to devnet") + fmt.Println() + + // Step 1: Fund wallets + fmt.Println("⏳ Funding wallets...") + + // Create and fund the NFT minter wallet + nftMinter, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println("❌ Error creating NFT minter wallet:", err) + return + } + if err := client.FundWallet(&nftMinter); err != nil { + fmt.Println("❌ Error funding NFT minter wallet:", err) + return + } + fmt.Println("💸 NFT minter wallet funded!") + fmt.Println() + + // Step 2: Mint an NFT + fmt.Println("⏳ Minting NFT...") + + nftMint := transaction.NFTokenMint{ + BaseTx: transaction.BaseTx{ + Account: nftMinter.ClassicAddress, + TransactionType: transaction.NFTokenMintTx, + }, + NFTokenTaxon: 0, + URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com + } + nftMint.SetTransferableFlag() + + responseMint, err := client.SubmitTxAndWait(nftMint.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftMinter, + }) + if err != nil { + fmt.Println("❌ Error minting NFT:", err) + return + } + if !responseMint.Validated { + fmt.Println("❌ NFTokenMint txn is not in a validated ledger", responseMint) + return + } + fmt.Println("✅ NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println() + + // Step 3: Retrieve the token ID + fmt.Println("⏳ Retrieving NFT ID...") + + metaMap, ok := responseMint.Meta.(map[string]any) + if !ok { + fmt.Println("❌ Meta is not a map[string]any") + return + } + + nftokenID, ok := metaMap["nftoken_id"].(string) + if !ok { + fmt.Println("❌ nftoken_id not found or not a string") + return + } + + fmt.Println("🌎 nftoken_id:", nftokenID) + fmt.Println() + + // Step 4: Burn the NFT + fmt.Println("⏳ Burn the NFT...") + + nftBurn := transaction.NFTokenBurn{ + BaseTx: transaction.BaseTx{ + Account: nftMinter.ClassicAddress, + TransactionType: transaction.NFTokenAcceptOfferTx, + }, + NFTokenID: txnTypes.NFTokenID(nftokenID), + } + + responseBurn, err := client.SubmitTxAndWait(nftBurn.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftMinter, + }) + if err != nil { + fmt.Println("❌ Error burning NFT:", err) + return + } + if !responseBurn.Validated { + fmt.Println("❌ NFTokenBurn transactiob is not in a validated ledger", responseBurn) + return + } + fmt.Println("✅ NFT burned successfully! - 🌎 Hash: ", responseBurn.Hash) } diff --git a/_code-samples/non-fungible-token/go/nft-cancel/rpc/main.go b/_code-samples/non-fungible-token/go/nft-cancel/rpc/main.go index 5d0b59dbbec..3cdb87f7d1c 100644 --- a/_code-samples/non-fungible-token/go/nft-cancel/rpc/main.go +++ b/_code-samples/non-fungible-token/go/nft-cancel/rpc/main.go @@ -1,163 +1,163 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/rpc/types" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/rpc/types" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { - // Initialize the RPC client configuration - cfg, err := rpc.NewClientConfig( - "https://s.devnet.rippletest.net:51234/", - rpc.WithFaucetProvider(faucet.NewDevnetFaucetProvider()), - ) - if err != nil { - panic(err) - } - - // Create the RPC client - client := rpc.NewClient(cfg) - - // Step 1: Fund wallet - fmt.Println("⏳ Funding wallet...") - - // Create and fund the NFT minter wallet - nftMinter, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println("❌ Error creating NFT minter wallet:", err) - return - } - if err := client.FundWallet(&nftMinter); err != nil { - fmt.Println("❌ Error funding NFT minter wallet:", err) - return - } - fmt.Println("💸 NFT minter wallet funded!") - - // Step 2: Mint two NFTs - fmt.Println("⏳ Minting first NFT...") - - nftMint := transaction.NFTokenMint{ - BaseTx: transaction.BaseTx{ - Account: nftMinter.ClassicAddress, - TransactionType: transaction.NFTokenMintTx, - }, - NFTokenTaxon: 0, - URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com - } - nftMint.SetTransferableFlag() - - responseMint, err := client.SubmitTxAndWait(nftMint.Flatten(), &types.SubmitOptions{ - Autofill: true, - Wallet: &nftMinter, - }) - if err != nil { - fmt.Println("❌ Error minting first NFT:", err) - return - } - if !responseMint.Validated { - fmt.Println("❌ First NFTokenMint transaction is not in a validated ledger", responseMint) - return - } - fmt.Println("✅ First NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) - fmt.Println() - - // Step 3: Retrieve the NFT token ID - fmt.Println("⏳ Retrieving NFT ID...") - - metaMap, ok := responseMint.Meta.(map[string]any) - if !ok { - fmt.Println("❌ Meta is not a map[string]any") - return - } - - nftokenID1, ok := metaMap["nftoken_id"].(string) - if !ok { - fmt.Println("❌ nftoken_id not found or not a string") - return - } - - fmt.Println("🌎 nftoken_id:", nftokenID1) - fmt.Println() - - // ------ - - fmt.Println("⏳ Minting second NFT...") - - nftMint2 := transaction.NFTokenMint{ - BaseTx: transaction.BaseTx{ - Account: nftMinter.ClassicAddress, - TransactionType: transaction.NFTokenMintTx, - }, - NFTokenTaxon: 0, - URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com - } - nftMint2.SetTransferableFlag() - - responseMint2, err := client.SubmitTxAndWait(nftMint2.Flatten(), &types.SubmitOptions{ - Autofill: true, - Wallet: &nftMinter, - }) - if err != nil { - fmt.Println("❌ Error minting second NFT:", err) - return - } - if !responseMint.Validated { - fmt.Println("❌ Second NFTokenMint transaction is not in a validated ledger", responseMint) - return - } - fmt.Println("✅ Second NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) - fmt.Println() - - // Step 3: Retrieve the second NFT token ID - fmt.Println("⏳ Retrieving second NFT ID...") - - metaMap2, ok := responseMint2.Meta.(map[string]any) - if !ok { - fmt.Println("❌ Meta is not a map[string]any") - return - } - - nftokenID2, ok := metaMap2["nftoken_id"].(string) - if !ok { - fmt.Println("❌ nftoken_id not found or not a string") - return - } - - fmt.Println("🌎 nftoken_id:", nftokenID2) - fmt.Println() - - // Step 4: Cancel the NFT offers - fmt.Println("⏳ Canceling NFT offers...") - - nftCancel := transaction.NFTokenCancelOffer{ - BaseTx: transaction.BaseTx{ - Account: nftMinter.ClassicAddress, - TransactionType: transaction.NFTokenAcceptOfferTx, - }, - NFTokenOffers: []txnTypes.NFTokenID{ - txnTypes.NFTokenID(nftokenID1), - txnTypes.NFTokenID(nftokenID2), - }, - } - - response, err := client.SubmitTxAndWait(nftCancel.Flatten(), &types.SubmitOptions{ - Autofill: true, - Wallet: &nftMinter, - }) - if err != nil { - fmt.Println("❌ Error canceling NFT offers:", err) - return - } - if !response.Validated { - fmt.Println("❌ NFTokenCancelOffer transaction is not in a validated ledger", response) - return - } - fmt.Println("✅ NFT offers canceled successfully! - 🌎 Hash: ", response.Hash) + // Initialize the RPC client configuration + cfg, err := rpc.NewClientConfig( + "https://s.devnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + // Create the RPC client + client := rpc.NewClient(cfg) + + // Step 1: Fund wallet + fmt.Println("⏳ Funding wallet...") + + // Create and fund the NFT minter wallet + nftMinter, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println("❌ Error creating NFT minter wallet:", err) + return + } + if err := client.FundWallet(&nftMinter); err != nil { + fmt.Println("❌ Error funding NFT minter wallet:", err) + return + } + fmt.Println("💸 NFT minter wallet funded!") + + // Step 2: Mint two NFTs + fmt.Println("⏳ Minting first NFT...") + + nftMint := transaction.NFTokenMint{ + BaseTx: transaction.BaseTx{ + Account: nftMinter.ClassicAddress, + TransactionType: transaction.NFTokenMintTx, + }, + NFTokenTaxon: 0, + URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com + } + nftMint.SetTransferableFlag() + + responseMint, err := client.SubmitTxAndWait(nftMint.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftMinter, + }) + if err != nil { + fmt.Println("❌ Error minting first NFT:", err) + return + } + if !responseMint.Validated { + fmt.Println("❌ First NFTokenMint transaction is not in a validated ledger", responseMint) + return + } + fmt.Println("✅ First NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println() + + // Step 3: Retrieve the NFT token ID + fmt.Println("⏳ Retrieving NFT ID...") + + metaMap, ok := responseMint.Meta.(map[string]any) + if !ok { + fmt.Println("❌ Meta is not a map[string]any") + return + } + + nftokenID1, ok := metaMap["nftoken_id"].(string) + if !ok { + fmt.Println("❌ nftoken_id not found or not a string") + return + } + + fmt.Println("🌎 nftoken_id:", nftokenID1) + fmt.Println() + + // ------ + + fmt.Println("⏳ Minting second NFT...") + + nftMint2 := transaction.NFTokenMint{ + BaseTx: transaction.BaseTx{ + Account: nftMinter.ClassicAddress, + TransactionType: transaction.NFTokenMintTx, + }, + NFTokenTaxon: 0, + URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com + } + nftMint2.SetTransferableFlag() + + responseMint2, err := client.SubmitTxAndWait(nftMint2.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftMinter, + }) + if err != nil { + fmt.Println("❌ Error minting second NFT:", err) + return + } + if !responseMint.Validated { + fmt.Println("❌ Second NFTokenMint transaction is not in a validated ledger", responseMint) + return + } + fmt.Println("✅ Second NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println() + + // Step 3: Retrieve the second NFT token ID + fmt.Println("⏳ Retrieving second NFT ID...") + + metaMap2, ok := responseMint2.Meta.(map[string]any) + if !ok { + fmt.Println("❌ Meta is not a map[string]any") + return + } + + nftokenID2, ok := metaMap2["nftoken_id"].(string) + if !ok { + fmt.Println("❌ nftoken_id not found or not a string") + return + } + + fmt.Println("🌎 nftoken_id:", nftokenID2) + fmt.Println() + + // Step 4: Cancel the NFT offers + fmt.Println("⏳ Canceling NFT offers...") + + nftCancel := transaction.NFTokenCancelOffer{ + BaseTx: transaction.BaseTx{ + Account: nftMinter.ClassicAddress, + TransactionType: transaction.NFTokenAcceptOfferTx, + }, + NFTokenOffers: []txnTypes.NFTokenID{ + txnTypes.NFTokenID(nftokenID1), + txnTypes.NFTokenID(nftokenID2), + }, + } + + response, err := client.SubmitTxAndWait(nftCancel.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftMinter, + }) + if err != nil { + fmt.Println("❌ Error canceling NFT offers:", err) + return + } + if !response.Validated { + fmt.Println("❌ NFTokenCancelOffer transaction is not in a validated ledger", response) + return + } + fmt.Println("✅ NFT offers canceled successfully! - 🌎 Hash: ", response.Hash) } diff --git a/_code-samples/non-fungible-token/go/nft-cancel/ws/main.go b/_code-samples/non-fungible-token/go/nft-cancel/ws/main.go index be2fd945791..784d105ef3c 100644 --- a/_code-samples/non-fungible-token/go/nft-cancel/ws/main.go +++ b/_code-samples/non-fungible-token/go/nft-cancel/ws/main.go @@ -1,172 +1,172 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" - "github.com/Peersyst/xrpl-go/xrpl/websocket/types" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" + "github.com/Peersyst/xrpl-go/xrpl/websocket/types" ) func main() { - // Connect to the XRPL devnet - fmt.Println("⏳ Connecting to devnet...") - client := websocket.NewClient( - websocket.NewClientConfig(). - WithHost("wss://s.devnet.rippletest.net:51233"). - WithFaucetProvider(faucet.NewDevnetFaucetProvider()), - ) - defer client.Disconnect() - - if err := client.Connect(); err != nil { - fmt.Println("❌ Error connecting to devnet:", err) - return - } - - if !client.IsConnected() { - fmt.Println("❌ Failed to connect to devnet") - return - } - fmt.Println("✅ Connected to devnet") - fmt.Println() - - // Step 1: Fund wallet - fmt.Println("⏳ Funding wallet...") - - // Create and fund the NFT minter wallet - nftMinter, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println("❌ Error creating NFT minter wallet:", err) - return - } - if err := client.FundWallet(&nftMinter); err != nil { - fmt.Println("❌ Error funding NFT minter wallet:", err) - return - } - fmt.Println("💸 NFT minter wallet funded!") - - // Step 2: Mint two NFTs - fmt.Println("⏳ Minting first NFT...") - - nftMint := transaction.NFTokenMint{ - BaseTx: transaction.BaseTx{ - Account: nftMinter.ClassicAddress, - TransactionType: transaction.NFTokenMintTx, - }, - NFTokenTaxon: 0, - URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com - } - nftMint.SetTransferableFlag() - - responseMint, err := client.SubmitTxAndWait(nftMint.Flatten(), &types.SubmitOptions{ - Autofill: true, - Wallet: &nftMinter, - }) - if err != nil { - fmt.Println("❌ Error minting first NFT:", err) - return - } - if !responseMint.Validated { - fmt.Println("❌ First NFTokenMint transaction is not in a validated ledger", responseMint) - return - } - fmt.Println("✅ First NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) - fmt.Println() - - // Step 3: Retrieve the NFT token ID - fmt.Println("⏳ Retrieving NFT ID...") - - metaMap, ok := responseMint.Meta.(map[string]any) - if !ok { - fmt.Println("❌ Meta is not a map[string]any") - return - } - - nftokenID1, ok := metaMap["nftoken_id"].(string) - if !ok { - fmt.Println("❌ nftoken_id not found or not a string") - return - } - - fmt.Println("🌎 nftoken_id:", nftokenID1) - fmt.Println() - - // ------ - - fmt.Println("⏳ Minting second NFT...") - - nftMint2 := transaction.NFTokenMint{ - BaseTx: transaction.BaseTx{ - Account: nftMinter.ClassicAddress, - TransactionType: transaction.NFTokenMintTx, - }, - NFTokenTaxon: 0, - URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com - } - nftMint2.SetTransferableFlag() - - responseMint2, err := client.SubmitTxAndWait(nftMint2.Flatten(), &types.SubmitOptions{ - Autofill: true, - Wallet: &nftMinter, - }) - if err != nil { - fmt.Println("❌ Error minting second NFT:", err) - return - } - if !responseMint.Validated { - fmt.Println("❌ Second NFTokenMint transaction is not in a validated ledger", responseMint) - return - } - fmt.Println("✅ Second NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) - fmt.Println() - - // Step 3: Retrieve the second NFT token ID - fmt.Println("⏳ Retrieving second NFT ID...") - - metaMap2, ok := responseMint2.Meta.(map[string]any) - if !ok { - fmt.Println("❌ Meta is not a map[string]any") - return - } - - nftokenID2, ok := metaMap2["nftoken_id"].(string) - if !ok { - fmt.Println("❌ nftoken_id not found or not a string") - return - } - - fmt.Println("🌎 nftoken_id:", nftokenID2) - fmt.Println() - - // Step 4: Cancel the NFT offers - fmt.Println("⏳ Canceling NFT offers...") - - nftCancel := transaction.NFTokenCancelOffer{ - BaseTx: transaction.BaseTx{ - Account: nftMinter.ClassicAddress, - TransactionType: transaction.NFTokenAcceptOfferTx, - }, - NFTokenOffers: []txnTypes.NFTokenID{ - txnTypes.NFTokenID(nftokenID1), - txnTypes.NFTokenID(nftokenID2), - }, - } - - response, err := client.SubmitTxAndWait(nftCancel.Flatten(), &types.SubmitOptions{ - Autofill: true, - Wallet: &nftMinter, - }) - if err != nil { - fmt.Println("❌ Error canceling NFT offers:", err) - return - } - if !response.Validated { - fmt.Println("❌ NFTokenCancelOffer transaction is not in a validated ledger", response) - return - } - fmt.Println("✅ NFT offers canceled successfully! - 🌎 Hash: ", response.Hash) + // Connect to the XRPL devnet + fmt.Println("⏳ Connecting to devnet...") + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.devnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) + defer client.Disconnect() + + if err := client.Connect(); err != nil { + fmt.Println("❌ Error connecting to devnet:", err) + return + } + + if !client.IsConnected() { + fmt.Println("❌ Failed to connect to devnet") + return + } + fmt.Println("✅ Connected to devnet") + fmt.Println() + + // Step 1: Fund wallet + fmt.Println("⏳ Funding wallet...") + + // Create and fund the NFT minter wallet + nftMinter, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println("❌ Error creating NFT minter wallet:", err) + return + } + if err := client.FundWallet(&nftMinter); err != nil { + fmt.Println("❌ Error funding NFT minter wallet:", err) + return + } + fmt.Println("💸 NFT minter wallet funded!") + + // Step 2: Mint two NFTs + fmt.Println("⏳ Minting first NFT...") + + nftMint := transaction.NFTokenMint{ + BaseTx: transaction.BaseTx{ + Account: nftMinter.ClassicAddress, + TransactionType: transaction.NFTokenMintTx, + }, + NFTokenTaxon: 0, + URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com + } + nftMint.SetTransferableFlag() + + responseMint, err := client.SubmitTxAndWait(nftMint.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftMinter, + }) + if err != nil { + fmt.Println("❌ Error minting first NFT:", err) + return + } + if !responseMint.Validated { + fmt.Println("❌ First NFTokenMint transaction is not in a validated ledger", responseMint) + return + } + fmt.Println("✅ First NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println() + + // Step 3: Retrieve the NFT token ID + fmt.Println("⏳ Retrieving NFT ID...") + + metaMap, ok := responseMint.Meta.(map[string]any) + if !ok { + fmt.Println("❌ Meta is not a map[string]any") + return + } + + nftokenID1, ok := metaMap["nftoken_id"].(string) + if !ok { + fmt.Println("❌ nftoken_id not found or not a string") + return + } + + fmt.Println("🌎 nftoken_id:", nftokenID1) + fmt.Println() + + // ------ + + fmt.Println("⏳ Minting second NFT...") + + nftMint2 := transaction.NFTokenMint{ + BaseTx: transaction.BaseTx{ + Account: nftMinter.ClassicAddress, + TransactionType: transaction.NFTokenMintTx, + }, + NFTokenTaxon: 0, + URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com + } + nftMint2.SetTransferableFlag() + + responseMint2, err := client.SubmitTxAndWait(nftMint2.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftMinter, + }) + if err != nil { + fmt.Println("❌ Error minting second NFT:", err) + return + } + if !responseMint.Validated { + fmt.Println("❌ Second NFTokenMint transaction is not in a validated ledger", responseMint) + return + } + fmt.Println("✅ Second NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println() + + // Step 3: Retrieve the second NFT token ID + fmt.Println("⏳ Retrieving second NFT ID...") + + metaMap2, ok := responseMint2.Meta.(map[string]any) + if !ok { + fmt.Println("❌ Meta is not a map[string]any") + return + } + + nftokenID2, ok := metaMap2["nftoken_id"].(string) + if !ok { + fmt.Println("❌ nftoken_id not found or not a string") + return + } + + fmt.Println("🌎 nftoken_id:", nftokenID2) + fmt.Println() + + // Step 4: Cancel the NFT offers + fmt.Println("⏳ Canceling NFT offers...") + + nftCancel := transaction.NFTokenCancelOffer{ + BaseTx: transaction.BaseTx{ + Account: nftMinter.ClassicAddress, + TransactionType: transaction.NFTokenAcceptOfferTx, + }, + NFTokenOffers: []txnTypes.NFTokenID{ + txnTypes.NFTokenID(nftokenID1), + txnTypes.NFTokenID(nftokenID2), + }, + } + + response, err := client.SubmitTxAndWait(nftCancel.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftMinter, + }) + if err != nil { + fmt.Println("❌ Error canceling NFT offers:", err) + return + } + if !response.Validated { + fmt.Println("❌ NFTokenCancelOffer transaction is not in a validated ledger", response) + return + } + fmt.Println("✅ NFT offers canceled successfully! - 🌎 Hash: ", response.Hash) } diff --git a/_code-samples/non-fungible-token/go/nft-modify/rpc/main.go b/_code-samples/non-fungible-token/go/nft-modify/rpc/main.go index 286fb147712..d9161805b17 100644 --- a/_code-samples/non-fungible-token/go/nft-modify/rpc/main.go +++ b/_code-samples/non-fungible-token/go/nft-modify/rpc/main.go @@ -1,107 +1,107 @@ package main import ( - "fmt" + "fmt" - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/rpc/types" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/rpc/types" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { - cfg, err := rpc.NewClientConfig( - "https://s.devnet.rippletest.net:51234/", - rpc.WithFaucetProvider(faucet.NewDevnetFaucetProvider()), - ) - if err != nil { - panic(err) - } + cfg, err := rpc.NewClientConfig( + "https://s.devnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) + if err != nil { + panic(err) + } - client := rpc.NewClient(cfg) - fmt.Println() + client := rpc.NewClient(cfg) + fmt.Println() - fmt.Println("⏳ Funding wallet...") + fmt.Println("⏳ Funding wallet...") - // Create and fund the nft wallet - nftWallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println("❌ Error creating nft wallet:", err) - return - } - if err := client.FundWallet(&nftWallet); err != nil { - fmt.Println("❌ Error funding nft wallet:", err) - return - } - fmt.Println("💸 NFT wallet funded! - #️⃣: ", nftWallet.ClassicAddress) - fmt.Println() + // Create and fund the nft wallet + nftWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println("❌ Error creating nft wallet:", err) + return + } + if err := client.FundWallet(&nftWallet); err != nil { + fmt.Println("❌ Error funding nft wallet:", err) + return + } + fmt.Println("💸 NFT wallet funded! - #️⃣: ", nftWallet.ClassicAddress) + fmt.Println() - // Mint NFT - nftMint := transaction.NFTokenMint{ - BaseTx: transaction.BaseTx{ - Account: nftWallet.ClassicAddress, - TransactionType: transaction.NFTokenMintTx, - }, - NFTokenTaxon: 0, - URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com - } - nftMint.SetMutableFlag() - nftMint.SetTransferableFlag() + // Mint NFT + nftMint := transaction.NFTokenMint{ + BaseTx: transaction.BaseTx{ + Account: nftWallet.ClassicAddress, + TransactionType: transaction.NFTokenMintTx, + }, + NFTokenTaxon: 0, + URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com + } + nftMint.SetMutableFlag() + nftMint.SetTransferableFlag() - responseMint, err := client.SubmitTxAndWait(nftMint.Flatten(), &types.SubmitOptions{ - Autofill: true, - Wallet: &nftWallet, - }) - if err != nil { - fmt.Println("❌ Error minting NFT:", err) - return - } - if !responseMint.Validated { - fmt.Println("❌ NFTokenMint txn is not in a validated ledger", responseMint) - return - } - fmt.Println("✅ NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) - fmt.Println() + responseMint, err := client.SubmitTxAndWait(nftMint.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftWallet, + }) + if err != nil { + fmt.Println("❌ Error minting NFT:", err) + return + } + if !responseMint.Validated { + fmt.Println("❌ NFTokenMint txn is not in a validated ledger", responseMint) + return + } + fmt.Println("✅ NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println() - metaMap, ok := responseMint.Meta.(map[string]any) - if !ok { - fmt.Println("❌ Meta is not a map[string]any") - return - } + metaMap, ok := responseMint.Meta.(map[string]any) + if !ok { + fmt.Println("❌ Meta is not a map[string]any") + return + } - nftokenID, ok := metaMap["nftoken_id"].(string) - if !ok { - fmt.Println("❌ nftoken_id not found or not a string") - return - } + nftokenID, ok := metaMap["nftoken_id"].(string) + if !ok { + fmt.Println("❌ nftoken_id not found or not a string") + return + } - fmt.Println("🌎 nftoken_id:", nftokenID) - fmt.Println() + fmt.Println("🌎 nftoken_id:", nftokenID) + fmt.Println() - // Update NFT - nftModify := transaction.NFTokenModify{ - BaseTx: transaction.BaseTx{ - Account: nftWallet.ClassicAddress, - TransactionType: transaction.NFTokenModifyTx, - }, - URI: "68747470733A2F2F7961686F6F2E636F6D", // https://yahoo.com - NFTokenID: txnTypes.NFTokenID(nftokenID), - } - // nftoken_id - responseModify, err := client.SubmitTxAndWait(nftModify.Flatten(), &types.SubmitOptions{ - Autofill: true, - Wallet: &nftWallet, - }) - if err != nil { - fmt.Println("❌ Error modifying NFT:", err) - return - } - if !responseModify.Validated { - fmt.Println("❌ NFTokenModify txn is not in a validated ledger", responseModify) - return - } - fmt.Println("✅ NFT URI modified successfully! - 🌎 Hash: ", responseModify.Hash) + // Update NFT + nftModify := transaction.NFTokenModify{ + BaseTx: transaction.BaseTx{ + Account: nftWallet.ClassicAddress, + TransactionType: transaction.NFTokenModifyTx, + }, + URI: "68747470733A2F2F7961686F6F2E636F6D", // https://yahoo.com + NFTokenID: txnTypes.NFTokenID(nftokenID), + } + // nftoken_id + responseModify, err := client.SubmitTxAndWait(nftModify.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftWallet, + }) + if err != nil { + fmt.Println("❌ Error modifying NFT:", err) + return + } + if !responseModify.Validated { + fmt.Println("❌ NFTokenModify txn is not in a validated ledger", responseModify) + return + } + fmt.Println("✅ NFT URI modified successfully! - 🌎 Hash: ", responseModify.Hash) } diff --git a/_code-samples/non-fungible-token/go/nft-modify/ws/main.go b/_code-samples/non-fungible-token/go/nft-modify/ws/main.go index 77d28416d4f..328682130ab 100644 --- a/_code-samples/non-fungible-token/go/nft-modify/ws/main.go +++ b/_code-samples/non-fungible-token/go/nft-modify/ws/main.go @@ -1,117 +1,117 @@ package main import ( - "fmt" + "fmt" - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" - "github.com/Peersyst/xrpl-go/xrpl/websocket/types" + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" + "github.com/Peersyst/xrpl-go/xrpl/websocket/types" ) func main() { - fmt.Println("⏳ Connecting to devnet...") - client := websocket.NewClient( - websocket.NewClientConfig(). - WithHost("wss://s.devnet.rippletest.net:51233"). - WithFaucetProvider(faucet.NewDevnetFaucetProvider()), - ) + fmt.Println("⏳ Connecting to devnet...") + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.devnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewDevnetFaucetProvider()), + ) - defer client.Disconnect() + defer client.Disconnect() - if err := client.Connect(); err != nil { - fmt.Println(err) - return - } + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } - if !client.IsConnected() { - fmt.Println("❌ Failed to connect to devnet") - return - } + if !client.IsConnected() { + fmt.Println("❌ Failed to connect to devnet") + return + } - fmt.Println("✅ Connected to devnet") - fmt.Println() + fmt.Println("✅ Connected to devnet") + fmt.Println() - // Create and fund the nft wallet - fmt.Println("⏳ Funding wallet...") - nftWallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println("❌ Error creating nft wallet:", err) - return - } - if err := client.FundWallet(&nftWallet); err != nil { - fmt.Println("❌ Error funding nft wallet:", err) - return - } - fmt.Println("💸 NFT wallet funded!") - fmt.Println() + // Create and fund the nft wallet + fmt.Println("⏳ Funding wallet...") + nftWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println("❌ Error creating nft wallet:", err) + return + } + if err := client.FundWallet(&nftWallet); err != nil { + fmt.Println("❌ Error funding nft wallet:", err) + return + } + fmt.Println("💸 NFT wallet funded!") + fmt.Println() - // Mint NFT - nftMint := transaction.NFTokenMint{ - BaseTx: transaction.BaseTx{ - Account: nftWallet.ClassicAddress, - TransactionType: transaction.NFTokenMintTx, - }, - NFTokenTaxon: 0, - URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com - } - nftMint.SetMutableFlag() - nftMint.SetTransferableFlag() + // Mint NFT + nftMint := transaction.NFTokenMint{ + BaseTx: transaction.BaseTx{ + Account: nftWallet.ClassicAddress, + TransactionType: transaction.NFTokenMintTx, + }, + NFTokenTaxon: 0, + URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com + } + nftMint.SetMutableFlag() + nftMint.SetTransferableFlag() - responseMint, err := client.SubmitTxAndWait(nftMint.Flatten(), &types.SubmitOptions{ - Autofill: true, - Wallet: &nftWallet, - }) - if err != nil { - fmt.Println("❌ Error minting NFT:", err) - return - } - if !responseMint.Validated { - fmt.Println("❌ NFTokenMint txn is not in a validated ledger", responseMint) - return - } - fmt.Println("✅ NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) - fmt.Println() + responseMint, err := client.SubmitTxAndWait(nftMint.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftWallet, + }) + if err != nil { + fmt.Println("❌ Error minting NFT:", err) + return + } + if !responseMint.Validated { + fmt.Println("❌ NFTokenMint txn is not in a validated ledger", responseMint) + return + } + fmt.Println("✅ NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println() - metaMap, ok := responseMint.Meta.(map[string]any) - if !ok { - fmt.Println("❌ Meta is not a map[string]any") - return - } + metaMap, ok := responseMint.Meta.(map[string]any) + if !ok { + fmt.Println("❌ Meta is not a map[string]any") + return + } - nftokenID, ok := metaMap["nftoken_id"].(string) - if !ok { - fmt.Println("❌ nftoken_id not found or not a string") - return - } + nftokenID, ok := metaMap["nftoken_id"].(string) + if !ok { + fmt.Println("❌ nftoken_id not found or not a string") + return + } - fmt.Println("🌎 nftoken_id:", nftokenID) - fmt.Println() + fmt.Println("🌎 nftoken_id:", nftokenID) + fmt.Println() - // Update NFT - nftModify := transaction.NFTokenModify{ - BaseTx: transaction.BaseTx{ - Account: nftWallet.ClassicAddress, - TransactionType: transaction.NFTokenModifyTx, - }, - URI: "68747470733A2F2F7961686F6F2E636F6D", // https://yahoo.com - NFTokenID: txnTypes.NFTokenID(nftokenID), - } + // Update NFT + nftModify := transaction.NFTokenModify{ + BaseTx: transaction.BaseTx{ + Account: nftWallet.ClassicAddress, + TransactionType: transaction.NFTokenModifyTx, + }, + URI: "68747470733A2F2F7961686F6F2E636F6D", // https://yahoo.com + NFTokenID: txnTypes.NFTokenID(nftokenID), + } - responseModify, err := client.SubmitTxAndWait(nftModify.Flatten(), &types.SubmitOptions{ - Autofill: true, - Wallet: &nftWallet, - }) - if err != nil { - fmt.Println("❌ Error modifying NFT:", err) - return - } - if !responseModify.Validated { - fmt.Println("❌ NFTokenModify txn is not in a validated ledger", responseModify) - return - } - fmt.Println("✅ NFT URI modified successfully! - 🌎 Hash: ", responseModify.Hash) + responseModify, err := client.SubmitTxAndWait(nftModify.Flatten(), &types.SubmitOptions{ + Autofill: true, + Wallet: &nftWallet, + }) + if err != nil { + fmt.Println("❌ Error modifying NFT:", err) + return + } + if !responseModify.Validated { + fmt.Println("❌ NFTokenModify txn is not in a validated ledger", responseModify) + return + } + fmt.Println("✅ NFT URI modified successfully! - 🌎 Hash: ", responseModify.Hash) } diff --git a/_code-samples/partial-payment/go/rpc/main.go b/_code-samples/partial-payment/go/rpc/main.go index 73751ffcb76..09436459c72 100644 --- a/_code-samples/partial-payment/go/rpc/main.go +++ b/_code-samples/partial-payment/go/rpc/main.go @@ -1,168 +1,168 @@ package main import ( - "fmt" - "time" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "fmt" + "time" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { - cfg, err := rpc.NewClientConfig( - "https://s.altnet.rippletest.net:51234/", - rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), - ) - if err != nil { - panic(err) - } - - client := rpc.NewClient(cfg) - - fmt.Println("⏳ Funding wallets...") - w1, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - - w2, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - if err := client.FundWallet(&w1); err != nil { - fmt.Println(err) - return - } - - fmt.Println("💸 Wallet 1 funded") - if err := client.FundWallet(&w2); err != nil { - fmt.Println(err) - return - } - - fmt.Println("💸 Wallet 2 funded") - fmt.Println() - - time.Sleep(5 * time.Second) - - fmt.Println("⏳ Sending TrustSet transaction...") - ts := &transaction.TrustSet{ - BaseTx: transaction.BaseTx{ - Account: w2.ClassicAddress, - }, - LimitAmount: types.IssuedCurrencyAmount{ - Currency: "FOO", - Issuer: w1.ClassicAddress, - Value: "10000000000", - }, - } - - flatTs := ts.Flatten() - - err = client.Autofill(&flatTs) - if err != nil { - fmt.Println(err) - return - } - - blob, _, err := w2.Sign(flatTs) - if err != nil { - fmt.Println(err) - return - } - - res, err := client.SubmitTxBlobAndWait(blob, false) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ TrustSet transaction submitted!") - fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) - fmt.Printf("🌐 Validated: %t\n", res.Validated) - fmt.Println() - - fmt.Println("⏳ Issuing tokens for wallet 2...") - p := &transaction.Payment{ - BaseTx: transaction.BaseTx{ - Account: w1.GetAddress(), - }, - Amount: types.IssuedCurrencyAmount{ - Currency: "FOO", - Issuer: w1.GetAddress(), - Value: "50", - }, - Destination: w2.GetAddress(), - } - - flatP := p.Flatten() - - err = client.Autofill(&flatP) - if err != nil { - fmt.Println(err) - return - } - - blob, _, err = w1.Sign(flatP) - if err != nil { - fmt.Println(err) - return - } - - res, err = client.SubmitTxBlobAndWait(blob, false) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Payment transaction submitted!") - fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) - fmt.Printf("🌐 Validated: %t\n", res.Validated) - fmt.Println() - - fmt.Println("⏳ Submitting Partial Payment transaction...") - pp := &transaction.Payment{ - BaseTx: transaction.BaseTx{ - Account: w2.GetAddress(), - }, - Amount: types.IssuedCurrencyAmount{ - Currency: "FOO", - Issuer: w1.GetAddress(), - Value: "10", - }, - Destination: w1.GetAddress(), - } - - pp.SetPartialPaymentFlag() - - flatPP := pp.Flatten() - - err = client.Autofill(&flatPP) - if err != nil { - fmt.Println(err) - return - } - - blob, _, err = w2.Sign(flatPP) - if err != nil { - fmt.Println(err) - return - } - - res, err = client.SubmitTxBlobAndWait(blob, false) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Partial Payment transaction submitted!") - fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) - fmt.Printf("🌐 Validated: %t\n", res.Validated) - fmt.Println() + cfg, err := rpc.NewClientConfig( + "https://s.altnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + client := rpc.NewClient(cfg) + + fmt.Println("⏳ Funding wallets...") + w1, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + w2, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + if err := client.FundWallet(&w1); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet 1 funded") + if err := client.FundWallet(&w2); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet 2 funded") + fmt.Println() + + time.Sleep(5 * time.Second) + + fmt.Println("⏳ Sending TrustSet transaction...") + ts := &transaction.TrustSet{ + BaseTx: transaction.BaseTx{ + Account: w2.ClassicAddress, + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: "FOO", + Issuer: w1.ClassicAddress, + Value: "10000000000", + }, + } + + flatTs := ts.Flatten() + + err = client.Autofill(&flatTs) + if err != nil { + fmt.Println(err) + return + } + + blob, _, err := w2.Sign(flatTs) + if err != nil { + fmt.Println(err) + return + } + + res, err := client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ TrustSet transaction submitted!") + fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println() + + fmt.Println("⏳ Issuing tokens for wallet 2...") + p := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: w1.GetAddress(), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: "FOO", + Issuer: w1.GetAddress(), + Value: "50", + }, + Destination: w2.GetAddress(), + } + + flatP := p.Flatten() + + err = client.Autofill(&flatP) + if err != nil { + fmt.Println(err) + return + } + + blob, _, err = w1.Sign(flatP) + if err != nil { + fmt.Println(err) + return + } + + res, err = client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Payment transaction submitted!") + fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println() + + fmt.Println("⏳ Submitting Partial Payment transaction...") + pp := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: w2.GetAddress(), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: "FOO", + Issuer: w1.GetAddress(), + Value: "10", + }, + Destination: w1.GetAddress(), + } + + pp.SetPartialPaymentFlag() + + flatPP := pp.Flatten() + + err = client.Autofill(&flatPP) + if err != nil { + fmt.Println(err) + return + } + + blob, _, err = w2.Sign(flatPP) + if err != nil { + fmt.Println(err) + return + } + + res, err = client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Partial Payment transaction submitted!") + fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println() } diff --git a/_code-samples/partial-payment/go/ws/main.go b/_code-samples/partial-payment/go/ws/main.go index af18ae9ac43..1c877b39a73 100644 --- a/_code-samples/partial-payment/go/ws/main.go +++ b/_code-samples/partial-payment/go/ws/main.go @@ -1,179 +1,179 @@ package main import ( - "fmt" - "time" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" + "fmt" + "time" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" ) func main() { - fmt.Println("⏳ Connecting to testnet...") - client := websocket.NewClient( - websocket.NewClientConfig(). - WithHost("wss://s.altnet.rippletest.net:51233"). - WithFaucetProvider(faucet.NewTestnetFaucetProvider()), - ) - defer client.Disconnect() - - if err := client.Connect(); err != nil { - fmt.Println(err) - return - } - - if !client.IsConnected() { - fmt.Println("❌ Failed to connect to testnet") - return - } - - fmt.Println("✅ Connected to testnet") - fmt.Println() - - fmt.Println("⏳ Funding wallets...") - w1, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - - w2, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - if err := client.FundWallet(&w1); err != nil { - fmt.Println(err) - return - } - - fmt.Println("💸 Wallet 1 funded") - if err := client.FundWallet(&w2); err != nil { - fmt.Println(err) - return - } - - fmt.Println("💸 Wallet 2 funded") - fmt.Println() - - time.Sleep(5 * time.Second) - - fmt.Println("⏳ Sending TrustSet transaction...") - ts := &transaction.TrustSet{ - BaseTx: transaction.BaseTx{ - Account: w2.ClassicAddress, - }, - LimitAmount: types.IssuedCurrencyAmount{ - Currency: "FOO", - Issuer: w1.ClassicAddress, - Value: "10000000000", - }, - } - - flatTs := ts.Flatten() - - err = client.Autofill(&flatTs) - if err != nil { - fmt.Println(err) - return - } - - blob, _, err := w2.Sign(flatTs) - if err != nil { - fmt.Println(err) - return - } - - res, err := client.SubmitTxBlobAndWait(blob, false) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ TrustSet transaction submitted!") - fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) - fmt.Printf("🌐 Validated: %t\n", res.Validated) - fmt.Println() - - fmt.Println("⏳ Issuing tokens for wallet 2...") - p := &transaction.Payment{ - BaseTx: transaction.BaseTx{ - Account: w1.GetAddress(), - }, - Amount: types.IssuedCurrencyAmount{ - Currency: "FOO", - Issuer: w1.GetAddress(), - Value: "50", - }, - Destination: w2.GetAddress(), - } - - flatP := p.Flatten() - - err = client.Autofill(&flatP) - if err != nil { - fmt.Println(err) - return - } - - blob, _, err = w1.Sign(flatP) - if err != nil { - fmt.Println(err) - return - } - - res, err = client.SubmitTxBlobAndWait(blob, false) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Payment transaction submitted!") - fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) - fmt.Printf("🌐 Validated: %t\n", res.Validated) - fmt.Println() - - fmt.Println("⏳ Submitting Partial Payment transaction...") - pp := &transaction.Payment{ - BaseTx: transaction.BaseTx{ - Account: w2.GetAddress(), - }, - Amount: types.IssuedCurrencyAmount{ - Currency: "FOO", - Issuer: w1.GetAddress(), - Value: "10", - }, - Destination: w1.GetAddress(), - } - - pp.SetPartialPaymentFlag() - - flatPP := pp.Flatten() - - err = client.Autofill(&flatPP) - if err != nil { - fmt.Println(err) - return - } - - blob, _, err = w2.Sign(flatPP) - if err != nil { - fmt.Println(err) - return - } - - res, err = client.SubmitTxBlobAndWait(blob, false) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Partial Payment transaction submitted!") - fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) - fmt.Printf("🌐 Validated: %t\n", res.Validated) - fmt.Println() + fmt.Println("⏳ Connecting to testnet...") + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + defer client.Disconnect() + + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + if !client.IsConnected() { + fmt.Println("❌ Failed to connect to testnet") + return + } + + fmt.Println("✅ Connected to testnet") + fmt.Println() + + fmt.Println("⏳ Funding wallets...") + w1, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + w2, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + if err := client.FundWallet(&w1); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet 1 funded") + if err := client.FundWallet(&w2); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet 2 funded") + fmt.Println() + + time.Sleep(5 * time.Second) + + fmt.Println("⏳ Sending TrustSet transaction...") + ts := &transaction.TrustSet{ + BaseTx: transaction.BaseTx{ + Account: w2.ClassicAddress, + }, + LimitAmount: types.IssuedCurrencyAmount{ + Currency: "FOO", + Issuer: w1.ClassicAddress, + Value: "10000000000", + }, + } + + flatTs := ts.Flatten() + + err = client.Autofill(&flatTs) + if err != nil { + fmt.Println(err) + return + } + + blob, _, err := w2.Sign(flatTs) + if err != nil { + fmt.Println(err) + return + } + + res, err := client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ TrustSet transaction submitted!") + fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println() + + fmt.Println("⏳ Issuing tokens for wallet 2...") + p := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: w1.GetAddress(), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: "FOO", + Issuer: w1.GetAddress(), + Value: "50", + }, + Destination: w2.GetAddress(), + } + + flatP := p.Flatten() + + err = client.Autofill(&flatP) + if err != nil { + fmt.Println(err) + return + } + + blob, _, err = w1.Sign(flatP) + if err != nil { + fmt.Println(err) + return + } + + res, err = client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Payment transaction submitted!") + fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println() + + fmt.Println("⏳ Submitting Partial Payment transaction...") + pp := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: w2.GetAddress(), + }, + Amount: types.IssuedCurrencyAmount{ + Currency: "FOO", + Issuer: w1.GetAddress(), + Value: "10", + }, + Destination: w1.GetAddress(), + } + + pp.SetPartialPaymentFlag() + + flatPP := pp.Flatten() + + err = client.Autofill(&flatPP) + if err != nil { + fmt.Println(err) + return + } + + blob, _, err = w2.Sign(flatPP) + if err != nil { + fmt.Println(err) + return + } + + res, err = client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Partial Payment transaction submitted!") + fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println() } diff --git a/_code-samples/paths/go/rpc/main.go b/_code-samples/paths/go/rpc/main.go index 0e25d00dc22..6a74e1b65dd 100644 --- a/_code-samples/paths/go/rpc/main.go +++ b/_code-samples/paths/go/rpc/main.go @@ -1,111 +1,111 @@ package main import ( - "fmt" + "fmt" - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/queries/path" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/queries/path" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" - pathtypes "github.com/Peersyst/xrpl-go/xrpl/queries/path/types" + pathtypes "github.com/Peersyst/xrpl-go/xrpl/queries/path/types" ) const ( - DestinationAccount = types.Address("rKT4JX4cCof6LcDYRz8o3rGRu7qxzZ2Zwj") + DestinationAccount = types.Address("rKT4JX4cCof6LcDYRz8o3rGRu7qxzZ2Zwj") ) var ( - DestinationAmount = types.IssuedCurrencyAmount{ - Issuer: "rVnYNK9yuxBz4uP8zC8LEFokM2nqH3poc", - Currency: "USD", - Value: "0.001", - } + DestinationAmount = types.IssuedCurrencyAmount{ + Issuer: "rVnYNK9yuxBz4uP8zC8LEFokM2nqH3poc", + Currency: "USD", + Value: "0.001", + } ) func main() { - cfg, err := rpc.NewClientConfig( - "https://s.altnet.rippletest.net:51234/", - rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), - ) - if err != nil { - panic(err) - } - - client := rpc.NewClient(cfg) - - wallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("⏳ Funding wallet...") - if err := client.FundWallet(&wallet); err != nil { - fmt.Println(err) - return - } - - fmt.Println("💸 Wallet funded") - fmt.Println() - - fmt.Println("⏳ Getting paths...") - res, err := client.GetRipplePathFind(&path.RipplePathFindRequest{ - SourceAccount: wallet.GetAddress(), - SourceCurrencies: []pathtypes.RipplePathFindCurrency{ - { - Currency: "XRP", - }, - }, - DestinationAccount: DestinationAccount, - DestinationAmount: DestinationAmount, - }) - if err != nil { - fmt.Println(err) - return - } - - fmt.Printf("🌐 Computed paths: %d\n", len(res.Alternatives)) - fmt.Println() - - if len(res.Alternatives) == 0 { - fmt.Println("❌ No alternatives found") - return - } - - fmt.Println("⏳ Submitting Payment through path: ", res.Alternatives[0].PathsComputed) - p := &transaction.Payment{ - BaseTx: transaction.BaseTx{ - Account: wallet.GetAddress(), - }, - Destination: DestinationAccount, - Amount: DestinationAmount, - Paths: res.Alternatives[0].PathsComputed, - } - - flatP := p.Flatten() - - if err := client.Autofill(&flatP); err != nil { - fmt.Println(err) - return - } - - blob, hash, err := wallet.Sign(flatP) - if err != nil { - fmt.Println(err) - return - } - - txRes, err := client.SubmitTxBlobAndWait(blob, false) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Payment submitted") - fmt.Printf("🌐 Hash: %s\n", hash) - fmt.Printf("🌐 Validated: %t\n", txRes.Validated) + cfg, err := rpc.NewClientConfig( + "https://s.altnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + client := rpc.NewClient(cfg) + + wallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Funding wallet...") + if err := client.FundWallet(&wallet); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet funded") + fmt.Println() + + fmt.Println("⏳ Getting paths...") + res, err := client.GetRipplePathFind(&path.RipplePathFindRequest{ + SourceAccount: wallet.GetAddress(), + SourceCurrencies: []pathtypes.RipplePathFindCurrency{ + { + Currency: "XRP", + }, + }, + DestinationAccount: DestinationAccount, + DestinationAmount: DestinationAmount, + }) + if err != nil { + fmt.Println(err) + return + } + + fmt.Printf("🌐 Computed paths: %d\n", len(res.Alternatives)) + fmt.Println() + + if len(res.Alternatives) == 0 { + fmt.Println("❌ No alternatives found") + return + } + + fmt.Println("⏳ Submitting Payment through path: ", res.Alternatives[0].PathsComputed) + p := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: wallet.GetAddress(), + }, + Destination: DestinationAccount, + Amount: DestinationAmount, + Paths: res.Alternatives[0].PathsComputed, + } + + flatP := p.Flatten() + + if err := client.Autofill(&flatP); err != nil { + fmt.Println(err) + return + } + + blob, hash, err := wallet.Sign(flatP) + if err != nil { + fmt.Println(err) + return + } + + txRes, err := client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Payment submitted") + fmt.Printf("🌐 Hash: %s\n", hash) + fmt.Printf("🌐 Validated: %t\n", txRes.Validated) } diff --git a/_code-samples/paths/go/ws/main.go b/_code-samples/paths/go/ws/main.go index 284b7bed2d9..3049a1aeda4 100644 --- a/_code-samples/paths/go/ws/main.go +++ b/_code-samples/paths/go/ws/main.go @@ -1,122 +1,122 @@ package main import ( - "fmt" + "fmt" - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/queries/path" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/queries/path" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" - pathtypes "github.com/Peersyst/xrpl-go/xrpl/queries/path/types" + pathtypes "github.com/Peersyst/xrpl-go/xrpl/queries/path/types" ) const ( - DestinationAccount = types.Address("rKT4JX4cCof6LcDYRz8o3rGRu7qxzZ2Zwj") + DestinationAccount = types.Address("rKT4JX4cCof6LcDYRz8o3rGRu7qxzZ2Zwj") ) var ( - DestinationAmount = types.IssuedCurrencyAmount{ - Issuer: "rVnYNK9yuxBz4uP8zC8LEFokM2nqH3poc", - Currency: "USD", - Value: "0.001", - } + DestinationAmount = types.IssuedCurrencyAmount{ + Issuer: "rVnYNK9yuxBz4uP8zC8LEFokM2nqH3poc", + Currency: "USD", + Value: "0.001", + } ) func main() { - fmt.Println("⏳ Connecting to testnet...") - client := websocket.NewClient( - websocket.NewClientConfig(). - WithHost("wss://s.altnet.rippletest.net:51233"). - WithFaucetProvider(faucet.NewTestnetFaucetProvider()), - ) - defer client.Disconnect() - - if err := client.Connect(); err != nil { - fmt.Println(err) - return - } - - if !client.IsConnected() { - fmt.Println("❌ Failed to connect to testnet") - return - } - - fmt.Println("✅ Connected to testnet") - fmt.Println() - - wallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("⏳ Funding wallet...") - if err := client.FundWallet(&wallet); err != nil { - fmt.Println(err) - return - } - - fmt.Println("💸 Wallet funded") - fmt.Println() - - fmt.Println("⏳ Getting paths...") - res, err := client.GetRipplePathFind(&path.RipplePathFindRequest{ - SourceAccount: wallet.GetAddress(), - SourceCurrencies: []pathtypes.RipplePathFindCurrency{ - { - Currency: "XRP", - }, - }, - DestinationAccount: DestinationAccount, - DestinationAmount: DestinationAmount, - }) - if err != nil { - fmt.Println(err) - return - } - - fmt.Printf("🌐 Computed paths: %d\n", len(res.Alternatives)) - fmt.Println() - - if len(res.Alternatives) == 0 { - fmt.Println("❌ No alternatives found") - return - } - - fmt.Println("⏳ Submitting Payment through path: ", res.Alternatives[0].PathsComputed) - p := &transaction.Payment{ - BaseTx: transaction.BaseTx{ - Account: wallet.GetAddress(), - }, - Destination: DestinationAccount, - Amount: DestinationAmount, - Paths: res.Alternatives[0].PathsComputed, - } - - flatP := p.Flatten() - - if err := client.Autofill(&flatP); err != nil { - fmt.Println(err) - return - } - - blob, hash, err := wallet.Sign(flatP) - if err != nil { - fmt.Println(err) - return - } - - txRes, err := client.SubmitTxBlobAndWait(blob, false) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Payment submitted") - fmt.Printf("🌐 Hash: %s\n", hash) - fmt.Printf("🌐 Validated: %t\n", txRes.Validated) + fmt.Println("⏳ Connecting to testnet...") + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + defer client.Disconnect() + + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + if !client.IsConnected() { + fmt.Println("❌ Failed to connect to testnet") + return + } + + fmt.Println("✅ Connected to testnet") + fmt.Println() + + wallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Funding wallet...") + if err := client.FundWallet(&wallet); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet funded") + fmt.Println() + + fmt.Println("⏳ Getting paths...") + res, err := client.GetRipplePathFind(&path.RipplePathFindRequest{ + SourceAccount: wallet.GetAddress(), + SourceCurrencies: []pathtypes.RipplePathFindCurrency{ + { + Currency: "XRP", + }, + }, + DestinationAccount: DestinationAccount, + DestinationAmount: DestinationAmount, + }) + if err != nil { + fmt.Println(err) + return + } + + fmt.Printf("🌐 Computed paths: %d\n", len(res.Alternatives)) + fmt.Println() + + if len(res.Alternatives) == 0 { + fmt.Println("❌ No alternatives found") + return + } + + fmt.Println("⏳ Submitting Payment through path: ", res.Alternatives[0].PathsComputed) + p := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: wallet.GetAddress(), + }, + Destination: DestinationAccount, + Amount: DestinationAmount, + Paths: res.Alternatives[0].PathsComputed, + } + + flatP := p.Flatten() + + if err := client.Autofill(&flatP); err != nil { + fmt.Println(err) + return + } + + blob, hash, err := wallet.Sign(flatP) + if err != nil { + fmt.Println(err) + return + } + + txRes, err := client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Payment submitted") + fmt.Printf("🌐 Hash: %s\n", hash) + fmt.Printf("🌐 Validated: %t\n", txRes.Validated) } diff --git a/_code-samples/secure-signing/go/main.go b/_code-samples/secure-signing/go/main.go index daca4f3bd87..91913228f2b 100644 --- a/_code-samples/secure-signing/go/main.go +++ b/_code-samples/secure-signing/go/main.go @@ -1,42 +1,42 @@ package main import ( - "fmt" + "fmt" - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { - w, err := wallet.New(crypto.ED25519()) - if err != nil { - panic(err) - } - - p := &transaction.Payment{ - BaseTx: transaction.BaseTx{ - Account: types.Address(w.GetAddress()), - Fee: types.XRPCurrencyAmount(13), - Sequence: 1, - Flags: 2147483648, - LastLedgerSequence: 7835923, - }, - Destination: "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe", - Amount: types.XRPCurrencyAmount(10000), - DeliverMax: types.XRPCurrencyAmount(10000), - } - - flattenedTx := p.Flatten() - - fmt.Println("Payment object created:", flattenedTx) - - signedTx, txHash, err := w.Sign(flattenedTx) - if err != nil { - panic(err) - } - - fmt.Println("Transaction signed successfully:", signedTx) - fmt.Println("Transaction hash:", txHash) + w, err := wallet.New(crypto.ED25519()) + if err != nil { + panic(err) + } + + p := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: types.Address(w.GetAddress()), + Fee: types.XRPCurrencyAmount(13), + Sequence: 1, + Flags: 2147483648, + LastLedgerSequence: 7835923, + }, + Destination: "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe", + Amount: types.XRPCurrencyAmount(10000), + DeliverMax: types.XRPCurrencyAmount(10000), + } + + flattenedTx := p.Flatten() + + fmt.Println("Payment object created:", flattenedTx) + + signedTx, txHash, err := w.Sign(flattenedTx) + if err != nil { + panic(err) + } + + fmt.Println("Transaction signed successfully:", signedTx) + fmt.Println("Transaction hash:", txHash) } diff --git a/_code-samples/send-a-memo/go/rpc/main.go b/_code-samples/send-a-memo/go/rpc/main.go index 0842b072bd0..0272103f108 100644 --- a/_code-samples/send-a-memo/go/rpc/main.go +++ b/_code-samples/send-a-memo/go/rpc/main.go @@ -1,115 +1,115 @@ package main import ( - "encoding/hex" - "fmt" - "strconv" - - "github.com/Peersyst/xrpl-go/xrpl/currency" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "encoding/hex" + "fmt" + "strconv" + + "github.com/Peersyst/xrpl-go/xrpl/currency" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { - w, err := wallet.FromSeed("sEdSMVV4dJ1JbdBxmakRR4Puu3XVZz2", "") - if err != nil { - fmt.Println(err) - return - } - - receiverWallet, err := wallet.FromSeed("sEd7d8Ci9nevdLCeUMctF3uGXp9WQqJ", "") - if err != nil { - fmt.Println(err) - return - } - - cfg, err := rpc.NewClientConfig( - "https://s.altnet.rippletest.net:51234/", - rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), - ) - if err != nil { - panic(err) - } - - client := rpc.NewClient(cfg) - - balance, err := client.GetXrpBalance(w.GetAddress()) - - if err != nil || balance == "0" { - fmt.Println("⏳ Funding wallet...") - err = client.FundWallet(&w) - if err != nil { - fmt.Println(err) - return - } - fmt.Println("💸 Wallet funded") - } - - balance, _ = client.GetXrpBalance(w.GetAddress()) - - fmt.Printf("💸 Balance: %s\n", balance) - - amount, err := currency.XrpToDrops("1") - if err != nil { - fmt.Println(err) - return - } - - amountUint, err := strconv.ParseUint(amount, 10, 64) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("⏳ Sending payment...") - payment := transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(w.GetAddress()), - Memos: []types.MemoWrapper{ - { - Memo: types.Memo{ - MemoData: hex.EncodeToString([]byte("Hello, World!")), - MemoFormat: hex.EncodeToString([]byte("plain")), - MemoType: hex.EncodeToString([]byte("message")), - }, - }, - { - Memo: types.Memo{ - MemoData: hex.EncodeToString([]byte("Hello, World 2!")), - MemoFormat: hex.EncodeToString([]byte("text/plain")), - MemoType: hex.EncodeToString([]byte("message2")), - }, - }, - }, - }, - Destination: types.Address(receiverWallet.GetAddress()), - Amount: types.XRPCurrencyAmount(amountUint), - } - - flatTx := payment.Flatten() - - err = client.Autofill(&flatTx) - if err != nil { - fmt.Println(err) - return - } - - txBlob, _, err := w.Sign(flatTx) - if err != nil { - fmt.Println(err) - return - } - - response, err := client.SubmitTxBlobAndWait(txBlob, true) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Payment submitted") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Printf("🌐 Validated: %t\n", response.Validated) + w, err := wallet.FromSeed("sEdSMVV4dJ1JbdBxmakRR4Puu3XVZz2", "") + if err != nil { + fmt.Println(err) + return + } + + receiverWallet, err := wallet.FromSeed("sEd7d8Ci9nevdLCeUMctF3uGXp9WQqJ", "") + if err != nil { + fmt.Println(err) + return + } + + cfg, err := rpc.NewClientConfig( + "https://s.altnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + client := rpc.NewClient(cfg) + + balance, err := client.GetXrpBalance(w.GetAddress()) + + if err != nil || balance == "0" { + fmt.Println("⏳ Funding wallet...") + err = client.FundWallet(&w) + if err != nil { + fmt.Println(err) + return + } + fmt.Println("💸 Wallet funded") + } + + balance, _ = client.GetXrpBalance(w.GetAddress()) + + fmt.Printf("💸 Balance: %s\n", balance) + + amount, err := currency.XrpToDrops("1") + if err != nil { + fmt.Println(err) + return + } + + amountUint, err := strconv.ParseUint(amount, 10, 64) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Sending payment...") + payment := transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(w.GetAddress()), + Memos: []types.MemoWrapper{ + { + Memo: types.Memo{ + MemoData: hex.EncodeToString([]byte("Hello, World!")), + MemoFormat: hex.EncodeToString([]byte("plain")), + MemoType: hex.EncodeToString([]byte("message")), + }, + }, + { + Memo: types.Memo{ + MemoData: hex.EncodeToString([]byte("Hello, World 2!")), + MemoFormat: hex.EncodeToString([]byte("text/plain")), + MemoType: hex.EncodeToString([]byte("message2")), + }, + }, + }, + }, + Destination: types.Address(receiverWallet.GetAddress()), + Amount: types.XRPCurrencyAmount(amountUint), + } + + flatTx := payment.Flatten() + + err = client.Autofill(&flatTx) + if err != nil { + fmt.Println(err) + return + } + + txBlob, _, err := w.Sign(flatTx) + if err != nil { + fmt.Println(err) + return + } + + response, err := client.SubmitTxBlobAndWait(txBlob, true) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Payment submitted") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Printf("🌐 Validated: %t\n", response.Validated) } diff --git a/_code-samples/send-a-memo/go/ws/main.go b/_code-samples/send-a-memo/go/ws/main.go index 4fdc94f8df6..69b07be3805 100644 --- a/_code-samples/send-a-memo/go/ws/main.go +++ b/_code-samples/send-a-memo/go/ws/main.go @@ -1,121 +1,121 @@ package main import ( - "encoding/hex" - "fmt" - "strconv" - - "github.com/Peersyst/xrpl-go/xrpl/currency" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" + "encoding/hex" + "fmt" + "strconv" + + "github.com/Peersyst/xrpl-go/xrpl/currency" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" ) func main() { - w, err := wallet.FromSeed("sEdSMVV4dJ1JbdBxmakRR4Puu3XVZz2", "") - if err != nil { - fmt.Println(err) - return - } - - receiverWallet, err := wallet.FromSeed("sEd7d8Ci9nevdLCeUMctF3uGXp9WQqJ", "") - if err != nil { - fmt.Println(err) - return - } - - client := websocket.NewClient( - websocket.NewClientConfig(). - WithHost("wss://s.altnet.rippletest.net:51233"). - WithFaucetProvider(faucet.NewTestnetFaucetProvider()), - ) - defer client.Disconnect() - - fmt.Println("⏳ Connecting to server...") - if err := client.Connect(); err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Connected to server") - fmt.Println() - - balance, err := client.GetXrpBalance(w.GetAddress()) - - if err != nil || balance == "0" { - fmt.Println("⏳ Funding wallet...") - err = client.FundWallet(&w) - if err != nil { - fmt.Println(err) - return - } - fmt.Println("💸 Wallet funded") - } - - balance, _ = client.GetXrpBalance(w.GetAddress()) - - fmt.Printf("💸 Balance: %s\n", balance) - - amount, err := currency.XrpToDrops("1") - if err != nil { - fmt.Println(err) - return - } - - amountUint, err := strconv.ParseUint(amount, 10, 64) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("⏳ Sending payment...") - payment := transactions.Payment{ - BaseTx: transactions.BaseTx{ - Account: types.Address(w.GetAddress()), - Memos: []types.MemoWrapper{ - { - Memo: types.Memo{ - MemoData: hex.EncodeToString([]byte("Hello, World!")), - MemoFormat: hex.EncodeToString([]byte("plain")), - MemoType: hex.EncodeToString([]byte("message")), - }, - }, - { - Memo: types.Memo{ - MemoData: hex.EncodeToString([]byte("Hello, World 2!")), - MemoFormat: hex.EncodeToString([]byte("text/plain")), - MemoType: hex.EncodeToString([]byte("message2")), - }, - }, - }, - }, - Destination: types.Address(receiverWallet.GetAddress()), - Amount: types.XRPCurrencyAmount(amountUint), - } - - flatTx := payment.Flatten() - - err = client.Autofill(&flatTx) - if err != nil { - fmt.Println(err) - return - } - - txBlob, _, err := w.Sign(flatTx) - if err != nil { - fmt.Println(err) - return - } - - response, err := client.SubmitTxBlobAndWait(txBlob, true) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Payment submitted") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Printf("🌐 Validated: %t\n", response.Validated) + w, err := wallet.FromSeed("sEdSMVV4dJ1JbdBxmakRR4Puu3XVZz2", "") + if err != nil { + fmt.Println(err) + return + } + + receiverWallet, err := wallet.FromSeed("sEd7d8Ci9nevdLCeUMctF3uGXp9WQqJ", "") + if err != nil { + fmt.Println(err) + return + } + + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + defer client.Disconnect() + + fmt.Println("⏳ Connecting to server...") + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Connected to server") + fmt.Println() + + balance, err := client.GetXrpBalance(w.GetAddress()) + + if err != nil || balance == "0" { + fmt.Println("⏳ Funding wallet...") + err = client.FundWallet(&w) + if err != nil { + fmt.Println(err) + return + } + fmt.Println("💸 Wallet funded") + } + + balance, _ = client.GetXrpBalance(w.GetAddress()) + + fmt.Printf("💸 Balance: %s\n", balance) + + amount, err := currency.XrpToDrops("1") + if err != nil { + fmt.Println(err) + return + } + + amountUint, err := strconv.ParseUint(amount, 10, 64) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Sending payment...") + payment := transactions.Payment{ + BaseTx: transactions.BaseTx{ + Account: types.Address(w.GetAddress()), + Memos: []types.MemoWrapper{ + { + Memo: types.Memo{ + MemoData: hex.EncodeToString([]byte("Hello, World!")), + MemoFormat: hex.EncodeToString([]byte("plain")), + MemoType: hex.EncodeToString([]byte("message")), + }, + }, + { + Memo: types.Memo{ + MemoData: hex.EncodeToString([]byte("Hello, World 2!")), + MemoFormat: hex.EncodeToString([]byte("text/plain")), + MemoType: hex.EncodeToString([]byte("message2")), + }, + }, + }, + }, + Destination: types.Address(receiverWallet.GetAddress()), + Amount: types.XRPCurrencyAmount(amountUint), + } + + flatTx := payment.Flatten() + + err = client.Autofill(&flatTx) + if err != nil { + fmt.Println(err) + return + } + + txBlob, _, err := w.Sign(flatTx) + if err != nil { + fmt.Println(err) + return + } + + response, err := client.SubmitTxBlobAndWait(txBlob, true) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Payment submitted") + fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Printf("🌐 Validated: %t\n", response.Validated) } diff --git a/_code-samples/send-xrp/go/rpc/main.go b/_code-samples/send-xrp/go/rpc/main.go index fd62e66556b..7081d4b21bd 100644 --- a/_code-samples/send-xrp/go/rpc/main.go +++ b/_code-samples/send-xrp/go/rpc/main.go @@ -1,111 +1,111 @@ package main import ( - "fmt" - "strconv" + "fmt" + "strconv" - "github.com/Peersyst/xrpl-go/xrpl/currency" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/currency" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" - rpctypes "github.com/Peersyst/xrpl-go/xrpl/rpc/types" + rpctypes "github.com/Peersyst/xrpl-go/xrpl/rpc/types" ) const ( - WalletSeed = "sn3nxiW7v8KXzPzAqzyHXbSSKNuN9" + WalletSeed = "sn3nxiW7v8KXzPzAqzyHXbSSKNuN9" ) func main() { - cfg, err := rpc.NewClientConfig( - "https://s.altnet.rippletest.net:51234/", - rpc.WithMaxFeeXRP(5.0), - rpc.WithFeeCushion(1.5), - rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), - ) - if err != nil { - panic(err) - } - - client := rpc.NewClient(cfg) - - w, err := wallet.FromSeed(WalletSeed, "") - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("⏳ Funding wallet...") - if err := client.FundWallet(&w); err != nil { - fmt.Println(err) - return - } - - fmt.Println("💸 Wallet funded") - fmt.Println() - - xrpAmount, err := currency.XrpToDrops("1") - if err != nil { - fmt.Println(err) - return - } - - xrpAmountInt, err := strconv.ParseInt(xrpAmount, 10, 64) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("⏳ Sending 1 XRP to rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe...") - p := &transaction.Payment{ - BaseTx: transaction.BaseTx{ - Account: types.Address(w.GetAddress()), - }, - Destination: "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe", - Amount: types.XRPCurrencyAmount(xrpAmountInt), - DeliverMax: types.XRPCurrencyAmount(xrpAmountInt), - } - - flattenedTx := p.Flatten() - - if err := client.Autofill(&flattenedTx); err != nil { - fmt.Println(err) - return - } - - txBlob, _, err := w.Sign(flattenedTx) - if err != nil { - fmt.Println(err) - return - } - - res, err := client.SubmitTxBlobAndWait(txBlob, false) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Payment submitted") - fmt.Printf("🌐 Hash: %s\n", res.Hash) - fmt.Printf("🌐 Validated: %t\n", res.Validated) - fmt.Println() - fmt.Println("⏳ Using SubmitTxAndWait with wallet") - fmt.Println() - - flattenedTx2 := p.Flatten() - resp, err := client.SubmitTxAndWait(flattenedTx2, &rpctypes.SubmitOptions{ - Autofill: true, - Wallet: &w, - }) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Payment submitted via SubmitTxAndWait") - fmt.Printf("🌐 Hash: %s\n", resp.Hash) - fmt.Printf("🌐 Validated: %t\n", resp.Validated) + cfg, err := rpc.NewClientConfig( + "https://s.altnet.rippletest.net:51234/", + rpc.WithMaxFeeXRP(5.0), + rpc.WithFeeCushion(1.5), + rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + client := rpc.NewClient(cfg) + + w, err := wallet.FromSeed(WalletSeed, "") + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Funding wallet...") + if err := client.FundWallet(&w); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet funded") + fmt.Println() + + xrpAmount, err := currency.XrpToDrops("1") + if err != nil { + fmt.Println(err) + return + } + + xrpAmountInt, err := strconv.ParseInt(xrpAmount, 10, 64) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Sending 1 XRP to rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe...") + p := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: types.Address(w.GetAddress()), + }, + Destination: "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe", + Amount: types.XRPCurrencyAmount(xrpAmountInt), + DeliverMax: types.XRPCurrencyAmount(xrpAmountInt), + } + + flattenedTx := p.Flatten() + + if err := client.Autofill(&flattenedTx); err != nil { + fmt.Println(err) + return + } + + txBlob, _, err := w.Sign(flattenedTx) + if err != nil { + fmt.Println(err) + return + } + + res, err := client.SubmitTxBlobAndWait(txBlob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Payment submitted") + fmt.Printf("🌐 Hash: %s\n", res.Hash) + fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println() + fmt.Println("⏳ Using SubmitTxAndWait with wallet") + fmt.Println() + + flattenedTx2 := p.Flatten() + resp, err := client.SubmitTxAndWait(flattenedTx2, &rpctypes.SubmitOptions{ + Autofill: true, + Wallet: &w, + }) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Payment submitted via SubmitTxAndWait") + fmt.Printf("🌐 Hash: %s\n", resp.Hash) + fmt.Printf("🌐 Validated: %t\n", resp.Validated) } diff --git a/_code-samples/send-xrp/go/ws/main.go b/_code-samples/send-xrp/go/ws/main.go index 84555843acd..d154a9e61a3 100644 --- a/_code-samples/send-xrp/go/ws/main.go +++ b/_code-samples/send-xrp/go/ws/main.go @@ -1,35 +1,35 @@ package main import ( - "fmt" - "strconv" - - "github.com/Peersyst/xrpl-go/xrpl/currency" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/queries/transactions" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" - wstypes "github.com/Peersyst/xrpl-go/xrpl/websocket/types" + "fmt" + "strconv" + + "github.com/Peersyst/xrpl-go/xrpl/currency" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/queries/transactions" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" + wstypes "github.com/Peersyst/xrpl-go/xrpl/websocket/types" ) func main() { client := websocket.NewClient( - websocket.NewClientConfig(). - WithHost("wss://s.altnet.rippletest.net:51233"). - WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewTestnetFaucetProvider()), ) defer client.Disconnect() if err := client.Connect(); err != nil { - fmt.Println(err) - return + fmt.Println(err) + return } if !client.IsConnected() { - fmt.Println("❌ Failed to connect to testnet") - return + fmt.Println("❌ Failed to connect to testnet") + return } fmt.Println("✅ Connected to testnet") @@ -39,15 +39,15 @@ fmt.Println() const WalletSeed = "sEd7zwWAu7vXMCBkkzokJHEXiKw2B2s" w, err := wallet.FromSeed(WalletSeed, "") if err != nil { - fmt.Println(err) - return + fmt.Println(err) + return } // Funding the wallet fmt.Println("⏳ Funding wallet...") if err := client.FundWallet(&w); err != nil { - fmt.Println(err) - return + fmt.Println(err) + return } fmt.Println("💸 Wallet funded") @@ -55,56 +55,56 @@ fmt.Println() xrpAmount, err := currency.XrpToDrops("1") if err != nil { - fmt.Println(err) - return + fmt.Println(err) + return } xrpAmountInt, err := strconv.ParseInt(xrpAmount, 10, 64) if err != nil { - fmt.Println(err) - return + fmt.Println(err) + return } // Prepare a payment transaction p := &transaction.Payment{ - BaseTx: transaction.BaseTx{ - Account: types.Address(w.GetAddress()), - }, - Destination: "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe", - Amount: types.XRPCurrencyAmount(xrpAmountInt), - DeliverMax: types.XRPCurrencyAmount(xrpAmountInt), + BaseTx: transaction.BaseTx{ + Account: types.Address(w.GetAddress()), + }, + Destination: "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe", + Amount: types.XRPCurrencyAmount(xrpAmountInt), + DeliverMax: types.XRPCurrencyAmount(xrpAmountInt), } flattenedTx := p.Flatten() if err := client.Autofill(&flattenedTx); err != nil { - fmt.Println(err) - return + fmt.Println(err) + return } // Sign the transaction using the wallet txBlob, _, err := w.Sign(flattenedTx) if err != nil { - fmt.Println(err) - return + fmt.Println(err) + return } // Submit the transaction and wait for the result res_blob, err := client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Println(err) - return + fmt.Println(err) + return } // Example with SubmitTxAndWait flattenedTx2 := p.Flatten() res_flat, err := client.SubmitTxAndWait(flattenedTx2, &wstypes.SubmitOptions{ - Autofill: true, - Wallet: &w, + Autofill: true, + Wallet: &w, }) if err != nil { - fmt.Println(err) - return + fmt.Println(err) + return } // Wait for validation ------------------------------------------------------- // SubmitTxBlobAndWait() handles this automatically, but it can take 4-7s. @@ -113,7 +113,7 @@ if err != nil { fmt.Printf("🌐 Hash: %s\n", res_blob.Hash) fmt.Printf("🌐 Meta: %t\n", res_blob.Meta) res, _ := client.Request(&transactions.TxRequest{ - Transaction: res_flat.Hash.String(), + Transaction: res_flat.Hash.String(), }) fmt.Printf("🌐 Result: %s\n", res.Result) } diff --git a/_code-samples/set-regular-key/go/rpc/main.go b/_code-samples/set-regular-key/go/rpc/main.go index dd58029a6a1..f4cd3c55693 100644 --- a/_code-samples/set-regular-key/go/rpc/main.go +++ b/_code-samples/set-regular-key/go/rpc/main.go @@ -1,131 +1,131 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { - cfg, err := rpc.NewClientConfig( - "https://s.altnet.rippletest.net:51234/", - rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), - ) - if err != nil { - panic(err) - } - - client := rpc.NewClient(cfg) - - w1, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - - w2, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - - regularKeyWallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("⏳ Funding wallets...") - if err := client.FundWallet(&w1); err != nil { - fmt.Println(err) - return - } - - fmt.Println("💸 Wallet 1 funded") - - if err := client.FundWallet(&w2); err != nil { - fmt.Println(err) - return - } - - fmt.Println("💸 Wallet 2 funded") - - if err := client.FundWallet(®ularKeyWallet); err != nil { - fmt.Println(err) - return - } - - fmt.Println("💸 Regular key wallet funded") - fmt.Println() - - fmt.Println("⏳ Setting regular key...") - rk := &transaction.SetRegularKey{ - BaseTx: transaction.BaseTx{ - Account: w1.GetAddress(), - }, - RegularKey: regularKeyWallet.GetAddress(), - } - - flatRk := rk.Flatten() - - err = client.Autofill(&flatRk) - if err != nil { - fmt.Println(err) - return - } - - blob, _, err := w1.Sign(flatRk) - if err != nil { - fmt.Println(err) - return - } - - res, err := client.SubmitTxBlobAndWait(blob, false) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ SetRegularKey transaction submitted") - fmt.Printf("🌐 Hash: %s\n", res.Hash) - fmt.Printf("🌐 Validated: %t\n", res.Validated) - fmt.Println() - - fmt.Println("⏳ Checking if regular key is set...") - p := &transaction.Payment{ - BaseTx: transaction.BaseTx{ - Account: w1.GetAddress(), - }, - Destination: w2.GetAddress(), - Amount: types.XRPCurrencyAmount(10000), - } - - flatP := p.Flatten() - - err = client.Autofill(&flatP) - if err != nil { - fmt.Println(err) - return - } - - blob, _, err = regularKeyWallet.Sign(flatP) - if err != nil { - fmt.Println(err) - return - } - - res, err = client.SubmitTxBlobAndWait(blob, false) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Payment transaction submitted") - fmt.Printf("🌐 Hash: %s\n", res.Hash) - fmt.Printf("🌐 Validated: %t\n", res.Validated) + cfg, err := rpc.NewClientConfig( + "https://s.altnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + client := rpc.NewClient(cfg) + + w1, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + w2, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + regularKeyWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Funding wallets...") + if err := client.FundWallet(&w1); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet 1 funded") + + if err := client.FundWallet(&w2); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet 2 funded") + + if err := client.FundWallet(®ularKeyWallet); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Regular key wallet funded") + fmt.Println() + + fmt.Println("⏳ Setting regular key...") + rk := &transaction.SetRegularKey{ + BaseTx: transaction.BaseTx{ + Account: w1.GetAddress(), + }, + RegularKey: regularKeyWallet.GetAddress(), + } + + flatRk := rk.Flatten() + + err = client.Autofill(&flatRk) + if err != nil { + fmt.Println(err) + return + } + + blob, _, err := w1.Sign(flatRk) + if err != nil { + fmt.Println(err) + return + } + + res, err := client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ SetRegularKey transaction submitted") + fmt.Printf("🌐 Hash: %s\n", res.Hash) + fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println() + + fmt.Println("⏳ Checking if regular key is set...") + p := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: w1.GetAddress(), + }, + Destination: w2.GetAddress(), + Amount: types.XRPCurrencyAmount(10000), + } + + flatP := p.Flatten() + + err = client.Autofill(&flatP) + if err != nil { + fmt.Println(err) + return + } + + blob, _, err = regularKeyWallet.Sign(flatP) + if err != nil { + fmt.Println(err) + return + } + + res, err = client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Payment transaction submitted") + fmt.Printf("🌐 Hash: %s\n", res.Hash) + fmt.Printf("🌐 Validated: %t\n", res.Validated) } diff --git a/_code-samples/set-regular-key/go/ws/main.go b/_code-samples/set-regular-key/go/ws/main.go index 3bb0ec62567..8f1416a59fd 100644 --- a/_code-samples/set-regular-key/go/ws/main.go +++ b/_code-samples/set-regular-key/go/ws/main.go @@ -1,142 +1,142 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" ) func main() { - fmt.Println("⏳ Connecting to testnet...") - client := websocket.NewClient( - websocket.NewClientConfig(). - WithHost("wss://s.altnet.rippletest.net:51233"). - WithFaucetProvider(faucet.NewTestnetFaucetProvider()), - ) - defer client.Disconnect() - - if err := client.Connect(); err != nil { - fmt.Println(err) - return - } - - if !client.IsConnected() { - fmt.Println("❌ Failed to connect to testnet") - return - } - - fmt.Println("✅ Connected to testnet") - fmt.Println() - - w1, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - - w2, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - - regularKeyWallet, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("⏳ Funding wallets...") - if err := client.FundWallet(&w1); err != nil { - fmt.Println(err) - return - } - - fmt.Println("💸 Wallet 1 funded") - - if err := client.FundWallet(&w2); err != nil { - fmt.Println(err) - return - } - - fmt.Println("💸 Wallet 2 funded") - - if err := client.FundWallet(®ularKeyWallet); err != nil { - fmt.Println(err) - return - } - - fmt.Println("💸 Regular key wallet funded") - fmt.Println() - - fmt.Println("⏳ Setting regular key...") - rk := &transaction.SetRegularKey{ - BaseTx: transaction.BaseTx{ - Account: w1.GetAddress(), - }, - RegularKey: regularKeyWallet.GetAddress(), - } - - flatRk := rk.Flatten() - - err = client.Autofill(&flatRk) - if err != nil { - fmt.Println(err) - return - } - - blob, _, err := w1.Sign(flatRk) - if err != nil { - fmt.Println(err) - return - } - - res, err := client.SubmitTxBlobAndWait(blob, false) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ SetRegularKey transaction submitted") - fmt.Printf("🌐 Hash: %s\n", res.Hash) - fmt.Printf("🌐 Validated: %t\n", res.Validated) - fmt.Println() - - fmt.Println("⏳ Checking if regular key is set...") - p := &transaction.Payment{ - BaseTx: transaction.BaseTx{ - Account: w1.GetAddress(), - }, - Destination: w2.GetAddress(), - Amount: types.XRPCurrencyAmount(10000), - } - - flatP := p.Flatten() - - err = client.Autofill(&flatP) - if err != nil { - fmt.Println(err) - return - } - - blob, _, err = regularKeyWallet.Sign(flatP) - if err != nil { - fmt.Println(err) - return - } - - res, err = client.SubmitTxBlobAndWait(blob, false) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ Payment transaction submitted") - fmt.Printf("🌐 Hash: %s\n", res.Hash) - fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println("⏳ Connecting to testnet...") + client := websocket.NewClient( + websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + defer client.Disconnect() + + if err := client.Connect(); err != nil { + fmt.Println(err) + return + } + + if !client.IsConnected() { + fmt.Println("❌ Failed to connect to testnet") + return + } + + fmt.Println("✅ Connected to testnet") + fmt.Println() + + w1, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + w2, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + regularKeyWallet, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Funding wallets...") + if err := client.FundWallet(&w1); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet 1 funded") + + if err := client.FundWallet(&w2); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet 2 funded") + + if err := client.FundWallet(®ularKeyWallet); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Regular key wallet funded") + fmt.Println() + + fmt.Println("⏳ Setting regular key...") + rk := &transaction.SetRegularKey{ + BaseTx: transaction.BaseTx{ + Account: w1.GetAddress(), + }, + RegularKey: regularKeyWallet.GetAddress(), + } + + flatRk := rk.Flatten() + + err = client.Autofill(&flatRk) + if err != nil { + fmt.Println(err) + return + } + + blob, _, err := w1.Sign(flatRk) + if err != nil { + fmt.Println(err) + return + } + + res, err := client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ SetRegularKey transaction submitted") + fmt.Printf("🌐 Hash: %s\n", res.Hash) + fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println() + + fmt.Println("⏳ Checking if regular key is set...") + p := &transaction.Payment{ + BaseTx: transaction.BaseTx{ + Account: w1.GetAddress(), + }, + Destination: w2.GetAddress(), + Amount: types.XRPCurrencyAmount(10000), + } + + flatP := p.Flatten() + + err = client.Autofill(&flatP) + if err != nil { + fmt.Println(err) + return + } + + blob, _, err = regularKeyWallet.Sign(flatP) + if err != nil { + fmt.Println(err) + return + } + + res, err = client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ Payment transaction submitted") + fmt.Printf("🌐 Hash: %s\n", res.Hash) + fmt.Printf("🌐 Validated: %t\n", res.Validated) } diff --git a/_code-samples/use-tickets/go/main.go b/_code-samples/use-tickets/go/main.go index 626e8932d93..e56852c85a5 100644 --- a/_code-samples/use-tickets/go/main.go +++ b/_code-samples/use-tickets/go/main.go @@ -1,134 +1,134 @@ package main import ( - "encoding/json" - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/queries/account" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "encoding/json" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/queries/account" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { - cfg, err := rpc.NewClientConfig( - "https://s.altnet.rippletest.net:51234/", - rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), - ) - if err != nil { - panic(err) - } - - client := rpc.NewClient(cfg) - - w, err := wallet.New(crypto.ED25519()) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("⏳ Funding wallet...") - if err := client.FundWallet(&w); err != nil { - fmt.Println(err) - return - } - - fmt.Println("💸 Wallet funded") - fmt.Println() - - info, err := client.GetAccountInfo(&account.InfoRequest{ - Account: w.GetAddress(), - }) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("🌐 Current wallet sequence:", info.AccountData.Sequence) - fmt.Println() - - fmt.Println("⏳ Submitting TicketCreate transaction...") - tc := &transaction.TicketCreate{ - BaseTx: transaction.BaseTx{ - Account: w.GetAddress(), - Sequence: info.AccountData.Sequence, - }, - TicketCount: 10, - } - - flatTc := tc.Flatten() - - if err := client.Autofill(&flatTc); err != nil { - fmt.Println(err) - return - } - - blob, _, err := w.Sign(flatTc) - if err != nil { - fmt.Println(err) - return - } - - res, err := client.SubmitTxBlobAndWait(blob, false) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ TicketCreate transaction submitted") - fmt.Printf("🌐 Hash: %s\n", res.Hash) - fmt.Printf("🌐 Validated: %t\n", res.Validated) - fmt.Println() - - objects, err := client.GetAccountObjects(&account.ObjectsRequest{ - Account: w.GetAddress(), - }) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("🌐 Account objects:", objects.AccountObjects[0]["TicketSequence"]) - - seq, err := objects.AccountObjects[0]["TicketSequence"].(json.Number).Int64() - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("⏳ Submitting AccountSet transaction...") - as := &transaction.AccountSet{ - BaseTx: transaction.BaseTx{ - Account: w.GetAddress(), - Sequence: 0, - TicketSequence: uint32(seq), - }, - } - - flatAs := as.Flatten() - - if err := client.Autofill(&flatAs); err != nil { - fmt.Println(err) - return - } - - flatAs["Sequence"] = uint32(0) - - blob, _, err = w.Sign(flatAs) - if err != nil { - fmt.Println(err) - return - } - - res, err = client.SubmitTxBlobAndWait(blob, false) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println("✅ AccountSet transaction submitted") - fmt.Printf("🌐 Hash: %s\n", res.Hash) - fmt.Printf("🌐 Validated: %t\n", res.Validated) + cfg, err := rpc.NewClientConfig( + "https://s.altnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) + if err != nil { + panic(err) + } + + client := rpc.NewClient(cfg) + + w, err := wallet.New(crypto.ED25519()) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Funding wallet...") + if err := client.FundWallet(&w); err != nil { + fmt.Println(err) + return + } + + fmt.Println("💸 Wallet funded") + fmt.Println() + + info, err := client.GetAccountInfo(&account.InfoRequest{ + Account: w.GetAddress(), + }) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("🌐 Current wallet sequence:", info.AccountData.Sequence) + fmt.Println() + + fmt.Println("⏳ Submitting TicketCreate transaction...") + tc := &transaction.TicketCreate{ + BaseTx: transaction.BaseTx{ + Account: w.GetAddress(), + Sequence: info.AccountData.Sequence, + }, + TicketCount: 10, + } + + flatTc := tc.Flatten() + + if err := client.Autofill(&flatTc); err != nil { + fmt.Println(err) + return + } + + blob, _, err := w.Sign(flatTc) + if err != nil { + fmt.Println(err) + return + } + + res, err := client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ TicketCreate transaction submitted") + fmt.Printf("🌐 Hash: %s\n", res.Hash) + fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println() + + objects, err := client.GetAccountObjects(&account.ObjectsRequest{ + Account: w.GetAddress(), + }) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("🌐 Account objects:", objects.AccountObjects[0]["TicketSequence"]) + + seq, err := objects.AccountObjects[0]["TicketSequence"].(json.Number).Int64() + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("⏳ Submitting AccountSet transaction...") + as := &transaction.AccountSet{ + BaseTx: transaction.BaseTx{ + Account: w.GetAddress(), + Sequence: 0, + TicketSequence: uint32(seq), + }, + } + + flatAs := as.Flatten() + + if err := client.Autofill(&flatAs); err != nil { + fmt.Println(err) + return + } + + flatAs["Sequence"] = uint32(0) + + blob, _, err = w.Sign(flatAs) + if err != nil { + fmt.Println(err) + return + } + + res, err = client.SubmitTxBlobAndWait(blob, false) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("✅ AccountSet transaction submitted") + fmt.Printf("🌐 Hash: %s\n", res.Hash) + fmt.Printf("🌐 Validated: %t\n", res.Validated) } From 22d67e640dd220d5a6df47e284b65aa3d845afe5 Mon Sep 17 00:00:00 2001 From: Carles <75954325+banasa44@users.noreply.github.com> Date: Mon, 25 Aug 2025 10:58:26 +0200 Subject: [PATCH 15/18] Apply suggestions from code review Co-authored-by: Maria Shodunke Co-authored-by: oeggert <117319296+oeggert@users.noreply.github.com> --- _code-samples/get-started/README.md | 2 +- _code-samples/get-started/go/base/rpc/main.go | 5 +- _code-samples/get-started/go/base/ws/main.go | 6 +- docs/index.page.tsx | 12 +-- docs/references/client-libraries.md | 2 +- docs/references/index.md | 2 +- docs/tutorials/go/build-apps/get-started.md | 87 ++++++++----------- docs/tutorials/go/build-apps/index.md | 3 - docs/tutorials/go/index.md | 7 +- docs/tutorials/how-tos/send-xrp.md | 34 ++++---- docs/tutorials/index.md | 2 +- sidebars.yaml | 2 +- 12 files changed, 69 insertions(+), 95 deletions(-) diff --git a/_code-samples/get-started/README.md b/_code-samples/get-started/README.md index c8a36d8a9ea..ef6de058b46 100644 --- a/_code-samples/get-started/README.md +++ b/_code-samples/get-started/README.md @@ -8,4 +8,4 @@ For more context, see the Get Started tutorial for your preferred language: - [Java](https://xrpl.org/get-started-using-java.html) - [JavaScript](https://xrpl.org/get-started-using-javascript.html) - [PHP](https://xrpl.org/get-started-using-php.html) -- [GoLang](https://xrpl.org/get-started-using-golang.html) +- [Go](https://xrpl.org/get-started-using-go.html) diff --git a/_code-samples/get-started/go/base/rpc/main.go b/_code-samples/get-started/go/base/rpc/main.go index 61ae21ebc67..b88b945138e 100644 --- a/_code-samples/get-started/go/base/rpc/main.go +++ b/_code-samples/get-started/go/base/rpc/main.go @@ -7,7 +7,10 @@ import ( func main() { // Define the network client configuration - cfg, err := rpc.NewClientConfig("https://s.altnet.rippletest.net:51234/") + cfg, err := rpc.NewClientConfig( + "https://s.altnet.rippletest.net:51234/", + rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) if err != nil { panic(err) } diff --git a/_code-samples/get-started/go/base/ws/main.go b/_code-samples/get-started/go/base/ws/main.go index 2a921207ffe..40d4f17a967 100644 --- a/_code-samples/get-started/go/base/ws/main.go +++ b/_code-samples/get-started/go/base/ws/main.go @@ -9,8 +9,10 @@ import ( func main() { // Define the network client - client := websocket.NewClient(websocket.NewClientConfig(). - WithHost("wss://s.altnet.rippletest.net:51233")) + client := websocket.NewClient(websocket.NewClientConfig(). + WithHost("wss://s.altnet.rippletest.net:51233"). + WithFaucetProvider(faucet.NewTestnetFaucetProvider()), + ) // Disconnect the client when done. (Defer executes at the end of the function) defer client.Disconnect() diff --git a/docs/index.page.tsx b/docs/index.page.tsx index cf9cedf2c63..7632e5e6d84 100644 --- a/docs/index.page.tsx +++ b/docs/index.page.tsx @@ -337,17 +337,7 @@ export default function Docs() {
GoLang Logo -
{translate("GoLang")}
- -
-
- - GoLang Logo diff --git a/docs/references/client-libraries.md b/docs/references/client-libraries.md index dacecf3ce6d..1c79420d887 100644 --- a/docs/references/client-libraries.md +++ b/docs/references/client-libraries.md @@ -13,7 +13,7 @@ For other programming languages, you can access the XRP Ledger through the [HTTP | Language | Library Name | Get Started | API Reference | Source Code | |---------------------------------|---------------------------|-------------|--------------|-------------| | **Python** | `xrpl-py` | [Get Started Using Python](../tutorials/python/build-apps/get-started.md) | [API Reference](https://xrpl-py.readthedocs.io/) | [Repo](https://github.com/XRPLF/xrpl-py) | -| **GoLang** | `xrpl-go` | [Get Started Using Go](../tutorials/go/build-apps/get-started.md) | [API Reference](https://pkg.go.dev/github.com/Peersyst/xrpl-go) | [Repo](https://github.com/Peersyst/xrpl-go) | +| **Go** | `xrpl-go` | [Get Started Using Go](../tutorials/go/build-apps/get-started.md) | [API Reference](https://pkg.go.dev/github.com/Peersyst/xrpl-go) | [Repo](https://github.com/Peersyst/xrpl-go) | | **JavaScript** / **TypeScript** | `xrpl.js` | [Get Started](../tutorials/javascript/build-apps/get-started.md) | [API Reference](https://js.xrpl.org/) | [Repo](https://github.com/XRPLF/xrpl.js) | | **JavaScript** / **TypeScript** | `xrpl-client` | [Get Started](https://jsfiddle.net/WietseWind/35az6p1b/) | [NPM Reference](https://www.npmjs.com/package/xrpl-client) | [Repo](https://github.com/XRPL-Labs/xrpl-client) | | **JavaScript** / **TypeScript** | `xrpl-accountlib` | [Get Started](https://jsfiddle.net/WietseWind/gkefpnu0/) | [NPM Reference](https://www.npmjs.com/package/xrpl-accountlib) | [Repo](https://github.com/WietseWind/xrpl-accountlib) | diff --git a/docs/references/index.md b/docs/references/index.md index ab75af78018..ef06021fe00 100644 --- a/docs/references/index.md +++ b/docs/references/index.md @@ -16,7 +16,7 @@ Use these libraries to access the XRP Ledger from your programming language of c {% xrpl-card title="Python" body="xrpl.py - a pure Python library" href="https://xrpl-py.readthedocs.io/" image="/img/logos/python.svg" imageAlt="Python logo" /%} -{% xrpl-card title="GoLang" body="xrpl.go - a pure GoLang library" href="https://pkg.go.dev/github.com/Peersyst/xrpl-go" image="/img/logos/golang.svg" imageAlt="GoLang logo" /%} +{% xrpl-card title="Go" body="xrpl.go - a pure Go library" href="https://pkg.go.dev/github.com/Peersyst/xrpl-go" image="/img/logos/golang.svg" imageAlt="Go logo" /%} {% xrpl-card title="Java" body="xrpl4j - a pure Java library" href="https://javadoc.io/doc/org.xrpl/" image="/img/logos/java.svg" imageAlt="Java logo" /%} diff --git a/docs/tutorials/go/build-apps/get-started.md b/docs/tutorials/go/build-apps/get-started.md index 96881c298ec..4e5c1da0e44 100644 --- a/docs/tutorials/go/build-apps/get-started.md +++ b/docs/tutorials/go/build-apps/get-started.md @@ -1,21 +1,13 @@ --- -html: get-started-using-golang-library.html -parent: golang.html -funnel: Build -doc_type: Tutorials -category: Get Started seo: - description: Build a GoLang application that interacts with the XRP Ledger. -top_nav_name: GoLang -top_nav_grouping: Get Started + description: Build a Go application that interacts with the XRP Ledger. labels: - Development -showcase_icon: assets/img/logos/golang.svg --- -# Get Started Using GoLang Library +# Get Started Using Go Library -This tutorial walks you through the basics of building an XRP Ledger-connected application using [`xrpl-go`](https://github.com/Peersyst/xrpl-go), a pure GoLang library built to interact with the XRP Ledger. +This tutorial walks you through the basics of building an XRP Ledger-connected application using [`xrpl-go`](https://github.com/Peersyst/xrpl-go), a pure Go library built to interact with the XRP Ledger. This tutorial is intended for beginners and should take no longer than 30 minutes to complete. @@ -30,8 +22,8 @@ In this tutorial, you'll learn: ## Requirements -Requiring Go version `1.22.0` and later. -[Download latest Go version](https://go.dev/dl/) +To follow this tutorial, you should have Go version `1.22.0` or later installed. +[Download latest Go version](https://go.dev/dl/). ## Installation @@ -53,15 +45,15 @@ When you're working with the XRP Ledger, there are a few things you'll need to m Here are the basic steps you'll need to cover for almost any XRP Ledger project: -1. [Connect to the XRP Ledger.](#1-connect-to-the-xrp-ledger) -1. [Get an account.](#2-get-account) -1. [Query the XRP Ledger.](#3-query-the-xrp-ledger) +1. [Connect to the XRP Ledger.](#1.-connect-to-the-xrp-ledger) +2. [Get an account.](#2.-get-account) +3. [Query the XRP Ledger.](#3.-query-the-xrp-ledger) ### 1. Connect to the XRP Ledger To make queries and submit transactions, you need to connect to the XRP Ledger. To do this with `xrpl-go`, you have two main options: -1. Via `websocket`: +1. Via WebSocket: ```go // Define the network client client := websocket.NewClient(websocket.NewClientConfig(). @@ -76,16 +68,9 @@ To make queries and submit transactions, you need to connect to the XRP Ledger. return } ``` -2. Via `RPC`: - ```go - cfg, err := rpc.NewClientConfig("https://s.altnet.rippletest.net:51234/") - if err != nil { - panic(err) - } +2. Via RPC: - // Initiate the network client - client := rpc.NewClient(cfg) - ``` + {% code-snippet file="/_code-samples/get-started/go/base/rpc/main.go" from="func main()" language="go" /%} #### Connect to the production XRP Ledger @@ -95,40 +80,38 @@ The sample code in the previous section shows you how to connect to the Testnet, - By [installing the core server](../../../infrastructure/installation/index.md) (`rippled`) and running a node yourself. The core server connects to the Mainnet by default, but you can [change the configuration to use Testnet or Devnet](../../../infrastructure/configuration/connect-your-rippled-to-the-xrp-test-net.md). [There are good reasons to run your own core server](../../../concepts/networks-and-servers/index.md#reasons-to-run-your-own-server). If you run your own server, you can connect to it like so: ```go - import "github.com/Peersyst/xrpl-go/xrpl/websocket" - const MyServer := "ws://localhost:6006/" - client := websocket.NewClient(websocket.NewClientConfig().WithHost(MyServer)) - ``` + import "github.com/Peersyst/xrpl-go/xrpl/websocket" + + const MY_SERVER = "ws://localhost:6006/" + + func main() { + client := websocket.NewClient(websocket.NewClientConfig().WithHost(MY_SERVER)) + + // ... custom code goes here + } See the example [core server config file](https://github.com/XRPLF/rippled/blob/c0a0b79d2d483b318ce1d82e526bd53df83a4a2c/cfg/rippled-example.cfg#L1562) for more information about default values. - By using one of the available [public servers][]: ```go - import "github.com/Peersyst/xrpl-go/xrpl/websocket" - const PublicServer = "wss://xrplcluster.com/" - client := websocket.NewClient(websocket.NewClientConfig().WithHost(PublicServer)) - ``` + import "github.com/Peersyst/xrpl-go/xrpl/websocket" + + const PUBLIC_SERVER = "wss://xrplcluster.com/" + + func main() { + client := websocket.NewClient(websocket.NewClientConfig().WithHost(PUBLIC_SERVER)) + + // ... custom code goes here + } ### 2. Get account -In `xrpl-go`, account creation and key management live in the wallet package, and on Testnet you can use the built-in faucet provider on your WebSocket (or RPC) client to fund a brand-new account immediately. +In `xrpl-go`, account creation and key management live in the `wallet` package, and on Testnet you can use the built-in faucet provider on your WebSocket (or RPC) client to fund a brand-new account immediately. -Here we spin up a Testnet‐connected WebSocket client, generate a fresh ED25519 wallet, then fund it automatically via the public faucet. +On Testnet, you can fund a new ED25519 account like this: ```go -client := websocket.NewClient( - websocket.NewClientConfig(). - WithHost("wss://s.altnet.rippletest.net:51233"). - WithFaucetProvider(faucet.NewTestnetFaucetProvider()), -) - -defer client.Disconnect() -if err := client.Connect(); err != nil { - fmt.Println(err) - return -} - w, err := wallet.New(crypto.ED25519()) if err != nil { fmt.Println(err) @@ -161,16 +144,18 @@ If you already have a seed encoded in [base58][], you can make a `Wallet` instan You can query the XRP Ledger to get information about [a specific account](../../../references/http-websocket-apis/public-api-methods/account-methods/index.md), [a specific transaction](../../../references/http-websocket-apis/public-api-methods/transaction-methods/tx.md), the state of a [current or a historical ledger](../../../references/http-websocket-apis/public-api-methods/ledger-methods/index.md), and [the XRP Ledger's decentralized exchange](../../../references/http-websocket-apis/public-api-methods/path-and-order-book-methods/index.md). You need to make these queries, among other reasons, to look up account info to follow best practices for [reliable transaction submission](../../../concepts/transactions/reliable-transaction-submission.md). -You can use either the Client's `request()` method to access the XRP Ledger's [WebSocket API](../../../references/http-websocket-apis/api-conventions/request-formatting.md). For example: +Use the Client's `Request()` method to access the XRP Ledger's [WebSocket API](../../../references/http-websocket-apis/api-conventions/request-formatting.md). For example: {% code-snippet file="/_code-samples/get-tx/go/main.go" from="// Get the latest validated ledger" language="go" /%} -Or use the [`websocket` or `rpc` packages](https://pkg.go.dev/github.com/Peersyst/xrpl-go@v0.1.12/xrpl/websocket#Client.GetAccountChannels) getter methods: +Or, use the getter methods from the [`websocket`](https://pkg.go.dev/github.com/Peersyst/xrpl-go@v0.1.12/xrpl/websocket) or [`rpc`](https://pkg.go.dev/github.com/Peersyst/xrpl-go@v0.1.12/xrpl/rpc) packages: {% code-snippet file="/_code-samples/get-started/go/get-acc-info/ws/main.go" from="// Get info from" before="// Get info about" language="go" /%} ## Keep on Building -Now that you know how to use `xrpl.js` to connect to the XRP Ledger, get an account, and look up information about it, you can also: +Now that you know how to use `xrpl-go` to connect to the XRP Ledger, get an account, and look up information about it, you can also: - [Send XRP](../../how-tos/send-xrp.md). + +{% raw-partial file="/docs/_snippets/common-links.md" /%} diff --git a/docs/tutorials/go/build-apps/index.md b/docs/tutorials/go/build-apps/index.md index d2d4fd8edd7..e8b19e23c9a 100644 --- a/docs/tutorials/go/build-apps/index.md +++ b/docs/tutorials/go/build-apps/index.md @@ -1,7 +1,4 @@ --- -html: build-apps-in-golang.html -parent: golang.html -top_nav_grouping: Article Types metadata: indexPage: true --- diff --git a/docs/tutorials/go/index.md b/docs/tutorials/go/index.md index e6baea3531f..fe13267d5f2 100644 --- a/docs/tutorials/go/index.md +++ b/docs/tutorials/go/index.md @@ -1,12 +1,9 @@ --- -html: golang.html -parent: tutorials.html -top_nav_grouping: Article Types metadata: indexPage: true --- -# GoLang +# Go You can create your own interface to try out the capabilities and support your specific business needs. These tutorials build a test harness interface to try out features of the XRP Ledger. @@ -17,7 +14,7 @@ Typically, the example functions involve four steps. - Get the state of accounts and tokens on the XRP Ledger using requests. - Disconnect from the XRP Ledger. -Once familiar with the library functions, you can build sample applications in GoLang. We anticipate that the applications you build greatly improve upon these examples. Your feedback and contributions are most welcome. +Once familiar with the library functions, you can build sample applications in Go. We anticipate that the applications you build greatly improve upon these examples. Your feedback and contributions are most welcome. ## Tutorial Modules diff --git a/docs/tutorials/how-tos/send-xrp.md b/docs/tutorials/how-tos/send-xrp.md index a5aa52e03cb..e7242ea34df 100644 --- a/docs/tutorials/how-tos/send-xrp.md +++ b/docs/tutorials/how-tos/send-xrp.md @@ -28,7 +28,7 @@ To interact with the XRP Ledger, you need to set up a dev environment with the n - **Python** with the [`xrpl-py` library](https://xrpl-py.readthedocs.io/). See [Get Started using Python](../python/build-apps/get-started.md) for setup steps. - **Java** with the [xrpl4j library](https://github.com/XRPLF/xrpl4j). See [Get Started Using Java](../java/build-apps/get-started.md) for setup steps. - **PHP** with the [XRPL_PHP library](https://github.com/AlexanderBuzz/xrpl-php). See [Get Started Using PHP](../php/build-apps/get-started.md) for setup steps. -- **GoLang** with the [xrpl-go library](https://github.com/Peersyst/xrpl-go). See [Get Started Using GoLang](../go/build-apps/get-started.md) for setup steps. +- **Go** with the [xrpl-go library](https://github.com/Peersyst/xrpl-go). See [Get Started Using Go](../go/build-apps/get-started.md) for setup steps. ## Send a Payment on the Test Net @@ -54,7 +54,7 @@ To transact on the XRP Ledger, you need an address and secret key, and some XRP. {% code-snippet file="/_code-samples/send-xrp/php/send-xrp.php" from="// Example credentials" before="// Create" language="php" /%} {% /tab %} -{% tab label="GoLang" %} +{% tab label="Go" %} {% code-snippet file="/_code-samples/send-xrp/go/ws/main.go" from="// Example credentials" before="// Funding" language="go" /%} {% /tab %} @@ -91,7 +91,7 @@ The following code connects to a public Testnet servers: {% code-snippet file="/_code-samples/send-xrp/php/send-xrp.php" from="// Create a client" before="// Transaction definition" language="php" /%} {% /tab %} -{% tab label="GoLang" %} +{% tab label="Go" %} {% code-snippet file="/_code-samples/send-xrp/go/ws/main.go" from="func main()" before="if !client.IsConnected() " language="go" /%} {% /tab %} @@ -150,7 +150,7 @@ Here's an example of preparing the above payment: {% code-snippet file="/_code-samples/send-xrp/php/send-xrp.php" from="// Transaction definition" before="// Sign" language="php" /%} {% /tab %} -{% tab label="GoLang" %} +{% tab label="Go" %} {% code-snippet file="/_code-samples/send-xrp/go/ws/main.go" from="// Prepare " before="// Sign" language="go" /%} {% /tab %} @@ -184,7 +184,7 @@ Signing a transaction uses your credentials to authorize the transaction on your - **Python:** Use the [`xrpl.transaction.safe_sign_transaction()` method](https://xrpl-py.readthedocs.io/en/latest/source/xrpl.transaction.html#xrpl.transaction.safe_sign_transaction) with a model and `Wallet` object. - **Java:** Use a [`SignatureService`](https://javadoc.io/doc/org.xrpl/xrpl4j-crypto-core/latest/org/xrpl/xrpl4j/crypto/signing/SignatureService.html) instance to sign the transaction. For this tutorial, use the [`SingleKeySignatureService`](https://javadoc.io/doc/org.xrpl/xrpl4j-crypto-bouncycastle/latest/org/xrpl/xrpl4j/crypto/signing/SingleKeySignatureService.html). - **PHP:** Use a [`sign()` method of a `Wallet` instance](https://alexanderbuzz.github.io/xrpl-php-docs/wallet.html#signing-a-transaction) instance to sign the transaction. The input to this step is a completed array of transaction instructions. -- **GoLang:** Use the [`Sign()` method of the `Wallet` package](https://pkg.go.dev/github.com/Peersyst/xrpl-go@v0.1.12/xrpl/wallet) to sign the transaction. +- **Go:** Use the [`Sign()` method of the `Wallet` package](https://pkg.go.dev/github.com/Peersyst/xrpl-go@v0.1.12/xrpl/wallet) to sign the transaction. {% tabs %} @@ -204,7 +204,7 @@ Signing a transaction uses your credentials to authorize the transaction on your {% code-snippet file="/_code-samples/send-xrp/php/send-xrp.php" from="// Sign" before="// Submit" language="php" /%} {% /tab %} -{% tab label="GoLang" %} +{% tab label="Go" %} {% code-snippet file="/_code-samples/send-xrp/go/ws/main.go" from="// Sign" before="// Submit" language="go" /%} {% /tab %} @@ -235,7 +235,7 @@ Now that you have a signed transaction, you can submit it to an XRP Ledger serve - **Python:** Use the [`xrpl.transaction.submit_and_wait()` method](https://xrpl-py.readthedocs.io/en/stable/source/xrpl.transaction.html#xrpl.transaction.submit_and_wait) to submit a transaction to the network and wait for a response. - **Java:** Use the [`XrplClient.submit(SignedTransaction)` method](https://javadoc.io/doc/org.xrpl/xrpl4j-client/latest/org/xrpl/xrpl4j/client/XrplClient.html#submit(org.xrpl.xrpl4j.crypto.signing.SignedTransaction)) to submit a transaction to the network. Use the [`XrplClient.ledger()`](https://javadoc.io/doc/org.xrpl/xrpl4j-client/latest/org/xrpl/xrpl4j/client/XrplClient.html#ledger(org.xrpl.xrpl4j.model.client.ledger.LedgerRequestParams)) method to get the latest validated ledger index. - **PHP:** Use the [`submitAndWait()` method of the Client](https://alexanderbuzz.github.io/xrpl-php-docs/client.html) to submit a transaction to the network and wait for the response. -- **GoLang:** Use [`SubmitTxAndWait()` or `SubmitTxBlobAndWait()` methods os the Client](https://pkg.go.dev/github.com/Peersyst/xrpl-go@v0.1.12/xrpl/websocket#Client.SubmitTxAndWait) to submit a transaction to the network and wait for the response. +- **Go:** Use [`SubmitTxAndWait()` or `SubmitTxBlobAndWait()` methods os the Client](https://pkg.go.dev/github.com/Peersyst/xrpl-go@v0.1.12/xrpl/websocket#Client.SubmitTxAndWait) to submit a transaction to the network and wait for the response. {% tabs %} @@ -255,7 +255,7 @@ Now that you have a signed transaction, you can submit it to an XRP Ledger serve {% code-snippet file="/_code-samples/send-xrp/php/send-xrp.php" from="// Submit" before="// Wait" language="php" /%} {% /tab %} -{% tab label="GoLang" %} +{% tab label="Go" %} {% code-snippet file="/_code-samples/send-xrp/go/ws/main.go" from="// Submit" before="// Wait" language="go" /%} {% /tab %} @@ -296,7 +296,7 @@ Most transactions are accepted into the next ledger version after they're submit - **PHP:** If you used the [`.submitAndWait()` method](https://alexanderbuzz.github.io/xrpl-php-docs/client.html), you can wait until the returned Promise resolves. Other, more asynchronous approaches are also possible. -- **GoLang:** If you used the `SubmitTxAndWait()` or `SubmitTxBlobAndWait()` methods, the client will handle submission and wait until the transaction is confirmed in a ledger. Internally, these methods use a polling mechanism, querying the transaction status with the client's `Request()` method and a `TxRequest`. +- **Go:** If you used the `SubmitTxAndWait()` or `SubmitTxBlobAndWait()` methods, the client will handle submission and wait until the transaction is confirmed in a ledger. Internally, these methods use a polling mechanism, querying the transaction status with the client's `Request()` method and a `TxRequest`. {% tabs %} @@ -316,7 +316,7 @@ Most transactions are accepted into the next ledger version after they're submit {% code-snippet file="/_code-samples/send-xrp/php/send-xrp.php" from="// Wait" before="// Check" language="php" /%} {% /tab %} -{% tab label="GoLang" %} +{% tab label="Go" %} {% code-snippet file="/_code-samples/send-xrp/go/ws/main.go" from="// Wait" before="// Check" language="go" /%} {% /tab %} @@ -339,7 +339,7 @@ To know for sure what a transaction did, you must look up the outcome of the tra - **PHP:** Use the response from `submitAndWait()` or call the `tx method` using [`$client->syncRequest()`](https://alexanderbuzz.github.io/xrpl-php-docs/client.html). -- **GoLang:** Use the response from `SubmitTxAndWait()` or `SubmitTxBlobAndWait()`, or manually query the transaction status using a `TxRequest` with the client's `Request()` method. +- **Go:** Use the response from `SubmitTxAndWait()` or `SubmitTxBlobAndWait()`, or manually query the transaction status using a `TxRequest` with the client's `Request()` method. {% tabs %} @@ -359,7 +359,7 @@ To know for sure what a transaction did, you must look up the outcome of the tra {% code-snippet file="/_code-samples/send-xrp/php/send-xrp.php" from="// Check" language="php" /%} {% /tab %} -{% tab label="GoLang" %} +{% tab label="Go" %} {% code-snippet file="/_code-samples/send-xrp/go/ws/main.go" from="// Check" language="go" /%} {% /tab %} @@ -426,12 +426,12 @@ print_r("Seed: " . $wallet->getSeed()); // Example: sp6JS7f14BuwFY8Mw6bTtLKWauoU ``` {% /tab %} -{% tab label="GoLang" %} +{% tab label="Go" %} ```go wallet, err := wallet.New(crypto.ED25519()) -fmt.Println("🌐 Classic Address:", wallet.ClassicAddress) // Example: r9ESeQQswbTxV8neiDTLTHXbXfUwiihyJk -fmt.Println("🌐 Seed:", wallet.Seed) // Example: sEd7XGFGSWteam777HQHvw7vHypEWy2 +fmt.Println("Classic Address:", wallet.ClassicAddress) // Example: r9ESeQQswbTxV8neiDTLTHXbXfUwiihyJk +fmt.Println("Seed:", wallet.Seed) // Example: sEd7XGFGSWteam777HQHvw7vHypEWy2 ``` {% /tab %} @@ -478,7 +478,7 @@ $client = new JsonRpcClient("https://xrplcluster.com"); ``` {% /tab %} -{% tab label="GoLang" %} +{% tab label="Go" %} ```go client := websocket.NewClient( @@ -528,7 +528,7 @@ $client = new JsonRpcClient("http://localhost:5005"); ``` {% /tab %} -{% tab label="GoLang" %} +{% tab label="Go" %} ```go client := websocket.NewClient( diff --git a/docs/tutorials/index.md b/docs/tutorials/index.md index 773c1d0b447..8fb00320f39 100644 --- a/docs/tutorials/index.md +++ b/docs/tutorials/index.md @@ -16,7 +16,7 @@ These tutorials walk you through the basics of building a very simple XRP Ledger {% xrpl-card title="Python" body="Using xrpl.py, a pure Python library." href="/docs/tutorials/python/" image="/img/logos/python.svg" imageAlt="Python logo" /%} -{% xrpl-card title="GoLang" body="Using xrpl-go, a pure GoLang library." href="/docs/tutorials/go/" image="/img/logos/golang.svg" imageAlt="GoLang logo" /%} +{% xrpl-card title="Go" body="Using xrpl-go, a pure Go library." href="/docs/tutorials/go/" image="/img/logos/golang.svg" imageAlt="Go logo" /%} {% xrpl-card title="Java" body="Using xrpl4j, a pure Java library." href="/docs/tutorials/java/" image="/img/logos/java.svg" imageAlt="Java logo" /%} diff --git a/sidebars.yaml b/sidebars.yaml index 1125575b90f..17d7b048e9d 100644 --- a/sidebars.yaml +++ b/sidebars.yaml @@ -476,7 +476,7 @@ - label: Ruby Client Library href: https://www.rubydoc.info/gems/xrbp external: true - - label: GoLang Client Library + - label: Go Client Library href: https://pkg.go.dev/github.com/Peersyst/xrpl-go external: true - page: docs/references/http-websocket-apis/index.md From 162a97887e4c3fc4b8d27c6a5a6e9f5df2eae379 Mon Sep 17 00:00:00 2001 From: banasa44 Date: Mon, 25 Aug 2025 11:27:50 +0200 Subject: [PATCH 16/18] chore(code-samples): remove all emojis --- _code-samples/batch/go/rpc/main.go | 58 +++--- _code-samples/batch/go/ws/main.go | 58 +++--- _code-samples/checks/go/rpc/main.go | 48 ++--- _code-samples/checks/go/ws/main.go | 54 ++--- _code-samples/clawback/go/rpc/main.go | 92 ++++----- _code-samples/clawback/go/ws/main.go | 96 ++++----- _code-samples/credential/go/rpc/main.go | 44 ++--- _code-samples/credential/go/ws/main.go | 48 ++--- _code-samples/delegate-set/go/rpc/main.go | 42 ++-- _code-samples/delegate-set/go/ws/main.go | 40 ++-- _code-samples/deposit-preauth/go/rpc/main.go | 66 +++---- _code-samples/deposit-preauth/go/ws/main.go | 70 +++---- _code-samples/freeze/go/rpc/main.go | 88 ++++----- _code-samples/freeze/go/ws/main.go | 92 ++++----- _code-samples/get-started/go/base/rpc/main.go | 5 +- _code-samples/get-started/go/base/ws/main.go | 5 +- .../get-started/go/get-acc-info/ws/main.go | 20 +- _code-samples/issue-a-token/go/rpc/main.go | 186 +++++++++--------- _code-samples/issue-a-token/go/ws/main.go | 186 +++++++++--------- _code-samples/multisigning/go/rpc/main.go | 44 ++--- _code-samples/multisigning/go/ws/main.go | 58 +++--- .../go/nft-accept/rpc/main.go | 56 +++--- .../go/nft-accept/ws/main.go | 62 +++--- .../go/nft-burn/rpc/main.go | 50 ++--- .../non-fungible-token/go/nft-burn/ws/main.go | 58 +++--- .../go/nft-cancel/rpc/main.go | 66 +++---- .../go/nft-cancel/ws/main.go | 74 +++---- .../go/nft-modify/rpc/main.go | 42 ++-- .../go/nft-modify/ws/main.go | 48 ++--- _code-samples/partial-payment/go/rpc/main.go | 48 ++--- _code-samples/partial-payment/go/ws/main.go | 54 ++--- _code-samples/paths/go/rpc/main.go | 36 ++-- _code-samples/paths/go/ws/main.go | 42 ++-- _code-samples/send-a-memo/go/rpc/main.go | 34 ++-- _code-samples/send-a-memo/go/ws/main.go | 38 ++-- _code-samples/send-xrp/go/rpc/main.go | 38 ++-- _code-samples/send-xrp/go/ws/main.go | 36 ++-- _code-samples/set-regular-key/go/rpc/main.go | 40 ++-- _code-samples/set-regular-key/go/ws/main.go | 46 ++--- _code-samples/use-tickets/go/main.go | 42 ++-- 40 files changed, 1156 insertions(+), 1154 deletions(-) diff --git a/_code-samples/batch/go/rpc/main.go b/_code-samples/batch/go/rpc/main.go index 8280b1b032e..3ce33b7fce6 100644 --- a/_code-samples/batch/go/rpc/main.go +++ b/_code-samples/batch/go/rpc/main.go @@ -1,15 +1,15 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/rpc/types" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/rpc/types" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) var ( @@ -56,7 +56,7 @@ func main() { return } - fmt.Println("⏳ Funding wallets...") + fmt.Println("Funding wallets...") if err := client.FundWallet(&userWallet); err != nil { fmt.Println(err) return @@ -65,7 +65,7 @@ func main() { fmt.Println(err) return } - fmt.Println("💸 Wallets funded") + fmt.Println("Wallets funded") // Check initial balances userBalance, err := client.GetXrpBalance(userWallet.ClassicAddress) @@ -82,9 +82,9 @@ func main() { receiverBalance = "0" } - fmt.Printf("💳 User initial balance: %s XRP\n", userBalance) - fmt.Printf("💳 User2 initial balance: %s XRP\n", user2Balance) - fmt.Printf("💳 Receiver initial balance: %s XRP\n", receiverBalance) + fmt.Printf("User initial balance: %s XRP\n", userBalance) + fmt.Printf("User2 initial balance: %s XRP\n", user2Balance) + fmt.Printf("Receiver initial balance: %s XRP\n", receiverBalance) fmt.Println() fmt.Printf("Batch transaction test\n") @@ -103,13 +103,13 @@ func main() { batchTx.SetAllOrNothingFlag() flattenedBatchTx := batchTx.Flatten() - fmt.Println("⏳ Autofilling flattened batch transaction...") + fmt.Println("Autofilling flattened batch transaction...") if err := client.Autofill(&flattenedBatchTx); err != nil { fmt.Println("Autofill error:", err) return } - fmt.Println("⏳ Signing batch transaction...") + fmt.Println("Signing batch transaction...") response, err := client.SubmitTxAndWait(flattenedBatchTx, &types.SubmitOptions{ Autofill: false, Wallet: &userWallet, @@ -119,9 +119,9 @@ func main() { return } - fmt.Println("✅ Batch transaction submitted") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Printf("🌐 Validated: %t\n", response.Validated) + fmt.Println("Batch transaction submitted") + fmt.Printf("Hash: %s\n", response.Hash.String()) + fmt.Printf("Validated: %t\n", response.Validated) fmt.Println() // Check final balances @@ -134,9 +134,9 @@ func main() { finalReceiverBalance = "0" } - fmt.Printf("💳 User final balance: %s XRP\n", finalUserBalance) + fmt.Printf("User final balance: %s XRP\n", finalUserBalance) - fmt.Printf("💳 Receiver final balance: %s XRP\n", finalReceiverBalance) + fmt.Printf("Receiver final balance: %s XRP\n", finalReceiverBalance) fmt.Println() fmt.Printf("Multisig Batch transaction test\n") @@ -163,13 +163,13 @@ func main() { multiBatchTx.SetAllOrNothingFlag() flattenedMultiBatchTx := multiBatchTx.Flatten() - fmt.Println("⏳ Autofilling flattened multi batch transaction...") + fmt.Println("Autofilling flattened multi batch transaction...") if err := client.AutofillMultisigned(&flattenedMultiBatchTx, 1); err != nil { fmt.Println("Autofill error:", err) return } - fmt.Println("⏳ Signing multi batch transaction...") + fmt.Println("Signing multi batch transaction...") if err := wallet.SignMultiBatch(user2Wallet, &flattenedMultiBatchTx, nil); err != nil { fmt.Println("Signing error:", err) return @@ -184,9 +184,9 @@ func main() { return } - fmt.Println("✅ Multisig Batch transaction submitted") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Printf("🌐 Validated: %t\n", response.Validated) + fmt.Println("Multisig Batch transaction submitted") + fmt.Printf("Hash: %s\n", response.Hash.String()) + fmt.Printf("Validated: %t\n", response.Validated) fmt.Println() // Check final balances @@ -202,7 +202,7 @@ func main() { if err != nil { finalReceiverBalance = "0" } - fmt.Printf("💳 User final balance: %s XRP\n", finalUserBalance) - fmt.Printf("💳 User2 final balance: %s XRP\n", finalUser2Balance) - fmt.Printf("💳 Receiver final balance: %s XRP\n", finalReceiverBalance) + fmt.Printf("User final balance: %s XRP\n", finalUserBalance) + fmt.Printf("User2 final balance: %s XRP\n", finalUser2Balance) + fmt.Printf("Receiver final balance: %s XRP\n", finalReceiverBalance) } diff --git a/_code-samples/batch/go/ws/main.go b/_code-samples/batch/go/ws/main.go index 921986e8b2b..fe0615ca5b0 100644 --- a/_code-samples/batch/go/ws/main.go +++ b/_code-samples/batch/go/ws/main.go @@ -1,15 +1,15 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" - "github.com/Peersyst/xrpl-go/xrpl/websocket/types" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" + "github.com/Peersyst/xrpl-go/xrpl/websocket/types" ) var ( @@ -58,7 +58,7 @@ func main() { return } - fmt.Println("⏳ Funding wallets...") + fmt.Println("Funding wallets...") if err := client.FundWallet(&userWallet); err != nil { fmt.Println(err) return @@ -67,7 +67,7 @@ func main() { fmt.Println(err) return } - fmt.Println("💸 Wallets funded") + fmt.Println("Wallets funded") // Check initial balances userBalance, err := client.GetXrpBalance(userWallet.ClassicAddress) @@ -84,9 +84,9 @@ func main() { receiverBalance = "0" } - fmt.Printf("💳 User initial balance: %s XRP\n", userBalance) - fmt.Printf("💳 User2 initial balance: %s XRP\n", user2Balance) - fmt.Printf("💳 Receiver initial balance: %s XRP\n", receiverBalance) + fmt.Printf("User initial balance: %s XRP\n", userBalance) + fmt.Printf("User2 initial balance: %s XRP\n", user2Balance) + fmt.Printf("Receiver initial balance: %s XRP\n", receiverBalance) fmt.Println() fmt.Printf("Batch transaction test\n") @@ -105,13 +105,13 @@ func main() { batchTx.SetAllOrNothingFlag() flattenedBatchTx := batchTx.Flatten() - fmt.Println("⏳ Autofilling flattened batch transaction...") + fmt.Println("Autofilling flattened batch transaction...") if err := client.Autofill(&flattenedBatchTx); err != nil { fmt.Println("Autofill error:", err) return } - fmt.Println("⏳ Signing batch transaction...") + fmt.Println("Signing batch transaction...") response, err := client.SubmitTxAndWait(flattenedBatchTx, &types.SubmitOptions{ Autofill: false, Wallet: &userWallet, @@ -121,9 +121,9 @@ func main() { return } - fmt.Println("✅ Batch transaction submitted") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Printf("🌐 Validated: %t\n", response.Validated) + fmt.Println("Batch transaction submitted") + fmt.Printf("Hash: %s\n", response.Hash.String()) + fmt.Printf("Validated: %t\n", response.Validated) fmt.Println() // Check final balances @@ -136,9 +136,9 @@ func main() { finalReceiverBalance = "0" } - fmt.Printf("💳 User final balance: %s XRP\n", finalUserBalance) + fmt.Printf("User final balance: %s XRP\n", finalUserBalance) - fmt.Printf("💳 Receiver final balance: %s XRP\n", finalReceiverBalance) + fmt.Printf("Receiver final balance: %s XRP\n", finalReceiverBalance) fmt.Println() fmt.Printf("Multisig Batch transaction test\n") @@ -165,13 +165,13 @@ func main() { multiBatchTx.SetAllOrNothingFlag() flattenedMultiBatchTx := multiBatchTx.Flatten() - fmt.Println("⏳ Autofilling flattened multi batch transaction...") + fmt.Println("Autofilling flattened multi batch transaction...") if err := client.AutofillMultisigned(&flattenedMultiBatchTx, 1); err != nil { fmt.Println("Autofill error:", err) return } - fmt.Println("⏳ Signing multi batch transaction...") + fmt.Println("Signing multi batch transaction...") if err := wallet.SignMultiBatch(user2Wallet, &flattenedMultiBatchTx, nil); err != nil { fmt.Println("Signing error:", err) return @@ -186,9 +186,9 @@ func main() { return } - fmt.Println("✅ Multisig Batch transaction submitted") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Printf("🌐 Validated: %t\n", response.Validated) + fmt.Println("Multisig Batch transaction submitted") + fmt.Printf("Hash: %s\n", response.Hash.String()) + fmt.Printf("Validated: %t\n", response.Validated) fmt.Println() // Check final balances @@ -204,7 +204,7 @@ func main() { if err != nil { finalReceiverBalance = "0" } - fmt.Printf("💳 User final balance: %s XRP\n", finalUserBalance) - fmt.Printf("💳 User2 final balance: %s XRP\n", finalUser2Balance) - fmt.Printf("💳 Receiver final balance: %s XRP\n", finalReceiverBalance) + fmt.Printf("User final balance: %s XRP\n", finalUserBalance) + fmt.Printf("User2 final balance: %s XRP\n", finalUser2Balance) + fmt.Printf("Receiver final balance: %s XRP\n", finalReceiverBalance) } diff --git a/_code-samples/checks/go/rpc/main.go b/_code-samples/checks/go/rpc/main.go index cfa65a2b1fa..8683f81b6bb 100644 --- a/_code-samples/checks/go/rpc/main.go +++ b/_code-samples/checks/go/rpc/main.go @@ -1,15 +1,15 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/ledger-entry-types" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/ledger-entry-types" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { @@ -35,27 +35,27 @@ func main() { return } - fmt.Println("⏳ Setting up wallets...") + fmt.Println("Setting up wallets...") if err := client.FundWallet(&w); err != nil { fmt.Println(err) return } - fmt.Println("💸 Sender wallet funded!") + fmt.Println("Sender wallet funded!") if err := client.FundWallet(&receiverWallet); err != nil { fmt.Println(err) return } - fmt.Println("💸 Receiver wallet funded!") + fmt.Println("Receiver wallet funded!") fmt.Println() - fmt.Println("✅ Wallets setup complete!") - fmt.Println("💳 Sender wallet:", w.ClassicAddress) - fmt.Println("💳 Receiver wallet:", receiverWallet.ClassicAddress) + fmt.Println("Wallets setup complete!") + fmt.Println("Sender wallet:", w.ClassicAddress) + fmt.Println("Receiver wallet:", receiverWallet.ClassicAddress) fmt.Println() - fmt.Println("⏳ Creating check...") + fmt.Println("Creating check...") cc := &transaction.CheckCreate{ BaseTx: transaction.BaseTx{ Account: w.GetAddress(), @@ -85,19 +85,19 @@ func main() { } if !res.Validated { - fmt.Println("❌ Check creation failed!") + fmt.Println("Check creation failed!") fmt.Println("Try again!") fmt.Println() return } - fmt.Println("✅ Check created!") - fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Println("Check created!") + fmt.Printf("Hash: %s\n", res.Hash.String()) fmt.Println() meta, ok := res.Meta.(map[string]interface{}) if !ok { - fmt.Println("❌ Meta is not of type TxObjMeta") + fmt.Println("Meta is not of type TxObjMeta") return } @@ -108,7 +108,7 @@ func main() { for _, node := range affectedNodes { affectedNode, ok := node.(map[string]interface{}) if !ok { - fmt.Println("❌ Node is not of type map[string]interface{}") + fmt.Println("Node is not of type map[string]interface{}") return } @@ -128,7 +128,7 @@ func main() { return } - fmt.Println("⏳ Cashing out check...") + fmt.Println("Cashing out check...") checkCash := &transaction.CheckCash{ BaseTx: transaction.BaseTx{ Account: receiverWallet.GetAddress(), @@ -156,7 +156,7 @@ func main() { return } - fmt.Println("✅ Check cashed out!") - fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Println("Check cashed out!") + fmt.Printf("Hash: %s\n", res.Hash.String()) fmt.Println() } diff --git a/_code-samples/checks/go/ws/main.go b/_code-samples/checks/go/ws/main.go index 323be583d5d..4a7f02899f9 100644 --- a/_code-samples/checks/go/ws/main.go +++ b/_code-samples/checks/go/ws/main.go @@ -1,19 +1,19 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/ledger-entry-types" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/ledger-entry-types" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" ) func main() { - fmt.Println("⏳ Connecting to testnet...") + fmt.Println("Connecting to testnet...") client := websocket.NewClient( websocket.NewClientConfig(). WithHost("wss://s.altnet.rippletest.net:51233"). @@ -27,11 +27,11 @@ func main() { } if !client.IsConnected() { - fmt.Println("❌ Failed to connect to testnet") + fmt.Println("Failed to connect to testnet") return } - fmt.Println("✅ Connected to testnet") + fmt.Println("Connected to testnet") fmt.Println() w, err := wallet.New(crypto.ED25519()) @@ -46,27 +46,27 @@ func main() { return } - fmt.Println("⏳ Setting up wallets...") + fmt.Println("Setting up wallets...") if err := client.FundWallet(&w); err != nil { fmt.Println(err) return } - fmt.Println("💸 Sender wallet funded!") + fmt.Println("Sender wallet funded!") if err := client.FundWallet(&receiverWallet); err != nil { fmt.Println(err) return } - fmt.Println("💸 Receiver wallet funded!") + fmt.Println("Receiver wallet funded!") fmt.Println() - fmt.Println("✅ Wallets setup complete!") - fmt.Println("💳 Sender wallet:", w.ClassicAddress) - fmt.Println("💳 Receiver wallet:", receiverWallet.ClassicAddress) + fmt.Println("Wallets setup complete!") + fmt.Println("Sender wallet:", w.ClassicAddress) + fmt.Println("Receiver wallet:", receiverWallet.ClassicAddress) fmt.Println() - fmt.Println("⏳ Creating check...") + fmt.Println("Creating check...") cc := &transaction.CheckCreate{ BaseTx: transaction.BaseTx{ Account: w.GetAddress(), @@ -96,19 +96,19 @@ func main() { } if !res.Validated { - fmt.Println("❌ Check creation failed!") + fmt.Println("Check creation failed!") fmt.Println("Try again!") fmt.Println() return } - fmt.Println("✅ Check created!") - fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Println("Check created!") + fmt.Printf("Hash: %s\n", res.Hash.String()) fmt.Println() meta, ok := res.Meta.(map[string]interface{}) if !ok { - fmt.Println("❌ Meta is not of type TxObjMeta") + fmt.Println("Meta is not of type TxObjMeta") return } @@ -119,7 +119,7 @@ func main() { for _, node := range affectedNodes { affectedNode, ok := node.(map[string]interface{}) if !ok { - fmt.Println("❌ Node is not of type map[string]interface{}") + fmt.Println("Node is not of type map[string]interface{}") return } @@ -139,7 +139,7 @@ func main() { return } - fmt.Println("⏳ Cashing out check...") + fmt.Println("Cashing out check...") checkCash := &transaction.CheckCash{ BaseTx: transaction.BaseTx{ Account: receiverWallet.GetAddress(), @@ -167,7 +167,7 @@ func main() { return } - fmt.Println("✅ Check cashed out!") - fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Println("Check cashed out!") + fmt.Printf("Hash: %s\n", res.Hash.String()) fmt.Println() } diff --git a/_code-samples/clawback/go/rpc/main.go b/_code-samples/clawback/go/rpc/main.go index c54c1a186d5..7019832250e 100644 --- a/_code-samples/clawback/go/rpc/main.go +++ b/_code-samples/clawback/go/rpc/main.go @@ -1,14 +1,14 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) const ( @@ -32,41 +32,41 @@ func main() { // // Configure wallets // - fmt.Println("⏳ Setting up wallets...") + fmt.Println("Setting up wallets...") coldWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("❌ Error creating cold wallet: %s\n", err) + fmt.Printf("Error creating cold wallet: %s\n", err) return } err = client.FundWallet(&coldWallet) if err != nil { - fmt.Printf("❌ Error funding cold wallet: %s\n", err) + fmt.Printf("Error funding cold wallet: %s\n", err) return } - fmt.Println("💸 Cold wallet funded!") + fmt.Println("Cold wallet funded!") hotWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("❌ Error creating hot wallet: %s\n", err) + fmt.Printf("Error creating hot wallet: %s\n", err) return } err = client.FundWallet(&hotWallet) if err != nil { - fmt.Printf("❌ Error funding hot wallet: %s\n", err) + fmt.Printf("Error funding hot wallet: %s\n", err) return } - fmt.Println("💸 Hot wallet funded!") + fmt.Println("Hot wallet funded!") fmt.Println() - fmt.Println("✅ Wallets setup complete!") - fmt.Println("💳 Cold wallet:", coldWallet.ClassicAddress) - fmt.Println("💳 Hot wallet:", hotWallet.ClassicAddress) + fmt.Println("Wallets setup complete!") + fmt.Println("Cold wallet:", coldWallet.ClassicAddress) + fmt.Println("Hot wallet:", hotWallet.ClassicAddress) fmt.Println() // // Configure cold address settings // - fmt.Println("⏳ Configuring cold address settings...") + fmt.Println("Configuring cold address settings...") coldWalletAccountSet := &transactions.AccountSet{ BaseTx: transactions.BaseTx{ Account: types.Address(coldWallet.ClassicAddress), @@ -85,37 +85,37 @@ func main() { err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err := coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } response, err := client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) + fmt.Printf("Error submitting transaction: %s\n", err) return } if !response.Validated { - fmt.Println("❌ Cold wallet unfreezing failed!") + fmt.Println("Cold wallet unfreezing failed!") fmt.Println("Try again!") fmt.Println() return } - fmt.Println("✅ Cold address settings configured!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Cold address settings configured!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() // // Create trust line from hot to cold address // - fmt.Println("⏳ Creating trust line from hot to cold address...") + fmt.Println("Creating trust line from hot to cold address...") hotColdTrustSet := &transactions.TrustSet{ BaseTx: transactions.BaseTx{ Account: types.Address(hotWallet.ClassicAddress), @@ -130,37 +130,37 @@ func main() { flattenedTx = hotColdTrustSet.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err = hotWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) + fmt.Printf("Error submitting transaction: %s\n", err) return } if !response.Validated { - fmt.Println("❌ Trust line from hot to cold address creation failed!") + fmt.Println("Trust line from hot to cold address creation failed!") fmt.Println("Try again!") fmt.Println() return } - fmt.Println("✅ Trust line from hot to cold address created!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Trust line from hot to cold address created!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() // // Send tokens from cold wallet to hot wallet // - fmt.Println("⏳ Sending tokens from cold wallet to hot wallet...") + fmt.Println("Sending tokens from cold wallet to hot wallet...") coldToHotPayment := &transactions.Payment{ BaseTx: transactions.BaseTx{ Account: types.Address(coldWallet.ClassicAddress), @@ -177,37 +177,37 @@ func main() { flattenedTx = coldToHotPayment.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err = coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) + fmt.Printf("Error submitting transaction: %s\n", err) return } if !response.Validated { - fmt.Println("❌ Tokens not sent from cold wallet to hot wallet!") + fmt.Println("Tokens not sent from cold wallet to hot wallet!") fmt.Println("Try again!") fmt.Println() return } - fmt.Println("✅ Tokens sent from cold wallet to hot wallet!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Tokens sent from cold wallet to hot wallet!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() // // Claw back tokens from customer one // - fmt.Println("⏳ Clawing back tokens from hot wallet...") + fmt.Println("Clawing back tokens from hot wallet...") coldWalletClawback := &transactions.Clawback{ BaseTx: transactions.BaseTx{ @@ -223,29 +223,29 @@ func main() { flattenedTx = coldWalletClawback.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err = coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) + fmt.Printf("Error submitting transaction: %s\n", err) return } if !response.Validated { - fmt.Println("❌ Tokens not clawed back from customer one!") + fmt.Println("Tokens not clawed back from customer one!") fmt.Println("Try again!") return } - fmt.Println("✅ Tokens clawed back from customer one!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Tokens clawed back from customer one!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() } diff --git a/_code-samples/clawback/go/ws/main.go b/_code-samples/clawback/go/ws/main.go index 9f1950def95..1ef7b03efe4 100644 --- a/_code-samples/clawback/go/ws/main.go +++ b/_code-samples/clawback/go/ws/main.go @@ -1,14 +1,14 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" ) const ( @@ -19,13 +19,13 @@ func main() { // // Configure client // - fmt.Println("⏳ Setting up client...") + fmt.Println("Setting up client...") client := websocket.NewClient( websocket.NewClientConfig(). WithHost("wss://s.altnet.rippletest.net"). WithFaucetProvider(faucet.NewTestnetFaucetProvider()), ) - fmt.Println("✅ Client configured!") + fmt.Println("Client configured!") fmt.Println() fmt.Println("Connecting to server...") @@ -39,41 +39,41 @@ func main() { // // Configure wallets // - fmt.Println("⏳ Setting up wallets...") + fmt.Println("Setting up wallets...") coldWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("❌ Error creating cold wallet: %s\n", err) + fmt.Printf("Error creating cold wallet: %s\n", err) return } err = client.FundWallet(&coldWallet) if err != nil { - fmt.Printf("❌ Error funding cold wallet: %s\n", err) + fmt.Printf("Error funding cold wallet: %s\n", err) return } - fmt.Println("💸 Cold wallet funded!") + fmt.Println("Cold wallet funded!") hotWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("❌ Error creating hot wallet: %s\n", err) + fmt.Printf("Error creating hot wallet: %s\n", err) return } err = client.FundWallet(&hotWallet) if err != nil { - fmt.Printf("❌ Error funding hot wallet: %s\n", err) + fmt.Printf("Error funding hot wallet: %s\n", err) return } - fmt.Println("💸 Hot wallet funded!") + fmt.Println("Hot wallet funded!") fmt.Println() - fmt.Println("✅ Wallets setup complete!") - fmt.Println("💳 Cold wallet:", coldWallet.ClassicAddress) - fmt.Println("💳 Hot wallet:", hotWallet.ClassicAddress) + fmt.Println("Wallets setup complete!") + fmt.Println("Cold wallet:", coldWallet.ClassicAddress) + fmt.Println("Hot wallet:", hotWallet.ClassicAddress) fmt.Println() // // Configure cold address settings // - fmt.Println("⏳ Configuring cold address settings...") + fmt.Println("Configuring cold address settings...") coldWalletAccountSet := &transactions.AccountSet{ BaseTx: transactions.BaseTx{ Account: types.Address(coldWallet.ClassicAddress), @@ -92,37 +92,37 @@ func main() { err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err := coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } response, err := client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) + fmt.Printf("Error submitting transaction: %s\n", err) return } if !response.Validated { - fmt.Println("❌ Cold wallet unfreezing failed!") + fmt.Println("Cold wallet unfreezing failed!") fmt.Println("Try again!") fmt.Println() return } - fmt.Println("✅ Cold address settings configured!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Cold address settings configured!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() // // Create trust line from hot to cold address // - fmt.Println("⏳ Creating trust line from hot to cold address...") + fmt.Println("Creating trust line from hot to cold address...") hotColdTrustSet := &transactions.TrustSet{ BaseTx: transactions.BaseTx{ Account: types.Address(hotWallet.ClassicAddress), @@ -137,37 +137,37 @@ func main() { flattenedTx = hotColdTrustSet.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err = hotWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) + fmt.Printf("Error submitting transaction: %s\n", err) return } if !response.Validated { - fmt.Println("❌ Trust line from hot to cold address creation failed!") + fmt.Println("Trust line from hot to cold address creation failed!") fmt.Println("Try again!") fmt.Println() return } - fmt.Println("✅ Trust line from hot to cold address created!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Trust line from hot to cold address created!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() // // Send tokens from cold wallet to hot wallet // - fmt.Println("⏳ Sending tokens from cold wallet to hot wallet...") + fmt.Println("Sending tokens from cold wallet to hot wallet...") coldToHotPayment := &transactions.Payment{ BaseTx: transactions.BaseTx{ Account: types.Address(coldWallet.ClassicAddress), @@ -184,37 +184,37 @@ func main() { flattenedTx = coldToHotPayment.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err = coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) + fmt.Printf("Error submitting transaction: %s\n", err) return } if !response.Validated { - fmt.Println("❌ Tokens not sent from cold wallet to hot wallet!") + fmt.Println("Tokens not sent from cold wallet to hot wallet!") fmt.Println("Try again!") fmt.Println() return } - fmt.Println("✅ Tokens sent from cold wallet to hot wallet!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Tokens sent from cold wallet to hot wallet!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() // // Claw back tokens from customer one // - fmt.Println("⏳ Clawing back tokens from hot wallet...") + fmt.Println("Clawing back tokens from hot wallet...") coldWalletClawback := &transactions.Clawback{ BaseTx: transactions.BaseTx{ @@ -230,29 +230,29 @@ func main() { flattenedTx = coldWalletClawback.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err = coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) + fmt.Printf("Error submitting transaction: %s\n", err) return } if !response.Validated { - fmt.Println("❌ Tokens not clawed back from customer one!") + fmt.Println("Tokens not clawed back from customer one!") fmt.Println("Try again!") return } - fmt.Println("✅ Tokens clawed back from customer one!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Tokens clawed back from customer one!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() } diff --git a/_code-samples/credential/go/rpc/main.go b/_code-samples/credential/go/rpc/main.go index 55834d6fee6..95c63507e87 100644 --- a/_code-samples/credential/go/rpc/main.go +++ b/_code-samples/credential/go/rpc/main.go @@ -1,16 +1,16 @@ package main import ( - "encoding/hex" - "fmt" - "time" - - "github.com/Peersyst/xrpl-go/examples/clients" - "github.com/Peersyst/xrpl-go/pkg/crypto" - rippleTime "github.com/Peersyst/xrpl-go/xrpl/time" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "encoding/hex" + "fmt" + "time" + + "github.com/Peersyst/xrpl-go/examples/clients" + "github.com/Peersyst/xrpl-go/pkg/crypto" + rippleTime "github.com/Peersyst/xrpl-go/xrpl/time" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { @@ -20,47 +20,47 @@ func main() { // Configure wallets // Issuer - fmt.Println("⏳ Setting up credential issuer wallet...") + fmt.Println("Setting up credential issuer wallet...") issuer, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("❌ Error creating issuer wallet: %s\n", err) + fmt.Printf("Error creating issuer wallet: %s\n", err) return } err = client.FundWallet(&issuer) if err != nil { - fmt.Printf("❌ Error funding issuer wallet: %s\n", err) + fmt.Printf("Error funding issuer wallet: %s\n", err) return } - fmt.Printf("✅ Issuer wallet funded: %s\n", issuer.ClassicAddress) + fmt.Printf("Issuer wallet funded: %s\n", issuer.ClassicAddress) // ----------------------------------------------------- // Subject (destination) - fmt.Println("⏳ Setting up Subject wallet...") + fmt.Println("Setting up Subject wallet...") subjectWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("❌ Error creating subject wallet: %s\n", err) + fmt.Printf("Error creating subject wallet: %s\n", err) return } err = client.FundWallet(&subjectWallet) if err != nil { - fmt.Printf("❌ Error funding subject wallet: %s\n", err) + fmt.Printf("Error funding subject wallet: %s\n", err) return } - fmt.Printf("✅ Subject wallet funded: %s\n", subjectWallet.ClassicAddress) + fmt.Printf("Subject wallet funded: %s\n", subjectWallet.ClassicAddress) // ----------------------------------------------------- // Creating the CredentialCreate transaction - fmt.Println("⏳ Creating CredentialCreate transaction...") + fmt.Println("Creating CredentialCreate transaction...") expiration, err := rippleTime.IsoTimeToRippleTime(time.Now().Add(time.Hour * 24).Format(time.RFC3339)) credentialType := types.CredentialType("6D795F63726564656E7469616C") if err != nil { - fmt.Printf("❌ Error converting expiration to ripple time: %s\n", err) + fmt.Printf("Error converting expiration to ripple time: %s\n", err) return } @@ -79,7 +79,7 @@ func main() { // ----------------------------------------------------- // Creating the CredentialAccept transaction - fmt.Println("⏳ Creating CredentialAccept transaction...") + fmt.Println("Creating CredentialAccept transaction...") acceptTxn := &transaction.CredentialAccept{ BaseTx: transaction.BaseTx{ @@ -94,7 +94,7 @@ func main() { // ----------------------------------------------------- // Creating the CredentialDelete transaction - fmt.Println("⏳ Creating CredentialDelete transaction...") + fmt.Println("Creating CredentialDelete transaction...") deleteTxn := &transaction.CredentialDelete{ BaseTx: transaction.BaseTx{ diff --git a/_code-samples/credential/go/ws/main.go b/_code-samples/credential/go/ws/main.go index 3f2153e27ba..7aee85962f4 100644 --- a/_code-samples/credential/go/ws/main.go +++ b/_code-samples/credential/go/ws/main.go @@ -1,21 +1,21 @@ package main import ( - "encoding/hex" - "fmt" - "time" - - "github.com/Peersyst/xrpl-go/examples/clients" - "github.com/Peersyst/xrpl-go/pkg/crypto" - rippleTime "github.com/Peersyst/xrpl-go/xrpl/time" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "encoding/hex" + "fmt" + "time" + + "github.com/Peersyst/xrpl-go/examples/clients" + "github.com/Peersyst/xrpl-go/pkg/crypto" + rippleTime "github.com/Peersyst/xrpl-go/xrpl/time" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { - fmt.Println("⏳ Setting up client...") + fmt.Println("Setting up client...") client := clients.GetDevnetWebsocketClient() fmt.Println("Connecting to server...") @@ -24,7 +24,7 @@ func main() { return } - fmt.Println("✅ Client configured!") + fmt.Println("Client configured!") fmt.Println() fmt.Printf("Connection: %t", client.IsConnected()) @@ -33,47 +33,47 @@ func main() { // Configure wallets // Issuer - fmt.Println("⏳ Setting up credential issuer wallet...") + fmt.Println("Setting up credential issuer wallet...") issuer, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("❌ Error creating issuer wallet: %s\n", err) + fmt.Printf("Error creating issuer wallet: %s\n", err) return } err = client.FundWallet(&issuer) if err != nil { - fmt.Printf("❌ Error funding issuer wallet: %s\n", err) + fmt.Printf("Error funding issuer wallet: %s\n", err) return } - fmt.Printf("✅ Issuer wallet funded: %s\n", issuer.ClassicAddress) + fmt.Printf("Issuer wallet funded: %s\n", issuer.ClassicAddress) // ----------------------------------------------------- // Subject (destination) - fmt.Println("⏳ Setting up Subject wallet...") + fmt.Println("Setting up Subject wallet...") subjectWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("❌ Error creating subject wallet: %s\n", err) + fmt.Printf("Error creating subject wallet: %s\n", err) return } err = client.FundWallet(&subjectWallet) if err != nil { - fmt.Printf("❌ Error funding subject wallet: %s\n", err) + fmt.Printf("Error funding subject wallet: %s\n", err) return } - fmt.Printf("✅ Subject wallet funded: %s\n", subjectWallet.ClassicAddress) + fmt.Printf("Subject wallet funded: %s\n", subjectWallet.ClassicAddress) // ----------------------------------------------------- // Creating the CredentialCreate transaction - fmt.Println("⏳ Creating CredentialCreate transaction...") + fmt.Println("Creating CredentialCreate transaction...") expiration, err := rippleTime.IsoTimeToRippleTime(time.Now().Add(time.Hour * 24).Format(time.RFC3339)) credentialType := types.CredentialType("6D795F63726564656E7469616C") if err != nil { - fmt.Printf("❌ Error converting expiration to ripple time: %s\n", err) + fmt.Printf("Error converting expiration to ripple time: %s\n", err) return } @@ -92,7 +92,7 @@ func main() { // ----------------------------------------------------- // Creating the CredentialAccept transaction - fmt.Println("⏳ Creating CredentialAccept transaction...") + fmt.Println("Creating CredentialAccept transaction...") acceptTxn := &transaction.CredentialAccept{ BaseTx: transaction.BaseTx{ @@ -107,7 +107,7 @@ func main() { // ----------------------------------------------------- // Creating the CredentialDelete transaction - fmt.Println("⏳ Creating CredentialDelete transaction...") + fmt.Println("Creating CredentialDelete transaction...") deleteTxn := &transaction.CredentialDelete{ BaseTx: transaction.BaseTx{ diff --git a/_code-samples/delegate-set/go/rpc/main.go b/_code-samples/delegate-set/go/rpc/main.go index fa8ccea8a01..8372a2309b0 100644 --- a/_code-samples/delegate-set/go/rpc/main.go +++ b/_code-samples/delegate-set/go/rpc/main.go @@ -1,15 +1,15 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/rpc/types" - transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" - txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/rpc/types" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { @@ -36,7 +36,7 @@ func main() { return } - fmt.Println("⏳ Funding wallets...") + fmt.Println("Funding wallets...") if err := client.FundWallet(&delegatorWallet); err != nil { fmt.Println(err) return @@ -45,7 +45,7 @@ func main() { fmt.Println(err) return } - fmt.Println("💸 Wallets funded") + fmt.Println("Wallets funded") // Check initial balances delegatorBalance, err := client.GetXrpBalance(delegatorWallet.ClassicAddress) @@ -57,8 +57,8 @@ func main() { delegateeBalance = "0" } - fmt.Printf("💳 Delegator initial balance: %s XRP\n", delegatorBalance) - fmt.Printf("💳 Delegatee initial balance: %s XRP\n", delegateeBalance) + fmt.Printf("Delegator initial balance: %s XRP\n", delegatorBalance) + fmt.Printf("Delegatee initial balance: %s XRP\n", delegateeBalance) fmt.Println() // Create DelegateSet transaction @@ -86,9 +86,9 @@ func main() { return } - fmt.Println("✅ DelegateSet transaction submitted") - fmt.Printf("🌐 Hash: %s\n", response.Hash) - fmt.Printf("🌐 Validated: %t\n", response.Validated) + fmt.Println("DelegateSet transaction submitted") + fmt.Printf("Hash: %s\n", response.Hash) + fmt.Printf("Validated: %t\n", response.Validated) fmt.Println() // Create delegated payment transaction @@ -111,9 +111,9 @@ func main() { return } - fmt.Println("✅ Delegated payment submitted") - fmt.Printf("🌐 Hash: %s\n", response2.Hash) - fmt.Printf("🌐 Validated: %t\n", response2.Validated) + fmt.Println("Delegated payment submitted") + fmt.Printf("Hash: %s\n", response2.Hash) + fmt.Printf("Validated: %t\n", response2.Validated) fmt.Println() // Check final balances @@ -126,6 +126,6 @@ func main() { finalDelegateeBalance = "0" } - fmt.Printf("💳 Delegator final balance: %s XRP\n", finalDelegatorBalance) - fmt.Printf("💳 Delegatee final balance: %s XRP\n", finalDelegateeBalance) + fmt.Printf("Delegator final balance: %s XRP\n", finalDelegatorBalance) + fmt.Printf("Delegatee final balance: %s XRP\n", finalDelegateeBalance) } diff --git a/_code-samples/delegate-set/go/ws/main.go b/_code-samples/delegate-set/go/ws/main.go index b0a8e88b146..78bd2f85403 100644 --- a/_code-samples/delegate-set/go/ws/main.go +++ b/_code-samples/delegate-set/go/ws/main.go @@ -1,14 +1,14 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" ) func main() { @@ -38,7 +38,7 @@ func main() { return } - fmt.Println("⏳ Funding wallets...") + fmt.Println("Funding wallets...") if err := client.FundWallet(&delegatorWallet); err != nil { fmt.Println(err) return @@ -47,7 +47,7 @@ func main() { fmt.Println(err) return } - fmt.Println("💸 Wallets funded") + fmt.Println("Wallets funded") // Check initial balances delegatorBalance, err := client.GetXrpBalance(delegatorWallet.ClassicAddress) @@ -59,8 +59,8 @@ func main() { delegateeBalance = "0" } - fmt.Printf("💳 Delegator initial balance: %s XRP\n", delegatorBalance) - fmt.Printf("💳 Delegatee initial balance: %s XRP\n", delegateeBalance) + fmt.Printf("Delegator initial balance: %s XRP\n", delegatorBalance) + fmt.Printf("Delegatee initial balance: %s XRP\n", delegateeBalance) fmt.Println() // Create DelegateSet transaction @@ -97,9 +97,9 @@ func main() { return } - fmt.Println("✅ DelegateSet transaction submitted") - fmt.Printf("🌐 Hash: %s\n", response.Hash) - fmt.Printf("🌐 Validated: %t\n", response.Validated) + fmt.Println("DelegateSet transaction submitted") + fmt.Printf("Hash: %s\n", response.Hash) + fmt.Printf("Validated: %t\n", response.Validated) fmt.Println() // Create delegated payment transaction @@ -131,9 +131,9 @@ func main() { return } - fmt.Println("✅ Delegated payment submitted") - fmt.Printf("🌐 Hash: %s\n", response2.Hash) - fmt.Printf("🌐 Validated: %t\n", response2.Validated) + fmt.Println("Delegated payment submitted") + fmt.Printf("Hash: %s\n", response2.Hash) + fmt.Printf("Validated: %t\n", response2.Validated) fmt.Println() // Check final balances @@ -146,6 +146,6 @@ func main() { finalDelegateeBalance = "0" } - fmt.Printf("💳 Delegator final balance: %s XRP\n", finalDelegatorBalance) - fmt.Printf("💳 Delegatee final balance: %s XRP\n", finalDelegateeBalance) + fmt.Printf("Delegator final balance: %s XRP\n", finalDelegatorBalance) + fmt.Printf("Delegatee final balance: %s XRP\n", finalDelegateeBalance) } diff --git a/_code-samples/deposit-preauth/go/rpc/main.go b/_code-samples/deposit-preauth/go/rpc/main.go index e6e38c36405..9d4657cd4f1 100644 --- a/_code-samples/deposit-preauth/go/rpc/main.go +++ b/_code-samples/deposit-preauth/go/rpc/main.go @@ -1,18 +1,18 @@ package main import ( - "encoding/hex" - "fmt" - "time" - - "github.com/Peersyst/xrpl-go/examples/clients" - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/queries/account" - "github.com/Peersyst/xrpl-go/xrpl/queries/common" - rippletime "github.com/Peersyst/xrpl-go/xrpl/time" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "encoding/hex" + "fmt" + "time" + + "github.com/Peersyst/xrpl-go/examples/clients" + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/queries/account" + "github.com/Peersyst/xrpl-go/xrpl/queries/common" + rippletime "github.com/Peersyst/xrpl-go/xrpl/time" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { @@ -21,41 +21,41 @@ func main() { // Configure wallets // Issuer - fmt.Println("⏳ Setting up credential issuer wallet...") + fmt.Println("Setting up credential issuer wallet...") issuer, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("❌ Error creating credential issuer wallet: %s\n", err) + fmt.Printf("Error creating credential issuer wallet: %s\n", err) return } err = client.FundWallet(&issuer) if err != nil { - fmt.Printf("❌ Error funding credential issuer wallet: %s\n", err) + fmt.Printf("Error funding credential issuer wallet: %s\n", err) return } - fmt.Printf("✅ Credential issuer wallet funded: %s\n", issuer.ClassicAddress) + fmt.Printf("Credential issuer wallet funded: %s\n", issuer.ClassicAddress) // ----------------------------------------------------- // Holder 1 - fmt.Println("⏳ Setting up holder 1 wallet...") + fmt.Println("Setting up holder 1 wallet...") holderWallet1, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("❌ Error creating holder 1 wallet: %s\n", err) + fmt.Printf("Error creating holder 1 wallet: %s\n", err) return } err = client.FundWallet(&holderWallet1) if err != nil { - fmt.Printf("❌ Error funding holder 1 wallet: %s\n", err) + fmt.Printf("Error funding holder 1 wallet: %s\n", err) return } - fmt.Printf("✅ Holder 1 wallet funded: %s\n", holderWallet1.ClassicAddress) + fmt.Printf("Holder 1 wallet funded: %s\n", holderWallet1.ClassicAddress) // ----------------------------------------------------- // Enabling DepositAuth on the issuer account with an AccountSet transaction - fmt.Println("⏳ Enabling DepositAuth on the issuer account...") + fmt.Println("Enabling DepositAuth on the issuer account...") accountSetTx := &transaction.AccountSet{ BaseTx: transaction.BaseTx{ Account: issuer.ClassicAddress, @@ -69,11 +69,11 @@ func main() { // ----------------------------------------------------- // Creating the CredentialCreate transaction - fmt.Println("⏳ Creating the CredentialCreate transaction...") + fmt.Println("Creating the CredentialCreate transaction...") expiration, err := rippletime.IsoTimeToRippleTime(time.Now().Add(time.Hour * 24).Format(time.RFC3339)) if err != nil { - fmt.Printf("❌ Error converting expiration to ripple time: %s\n", err) + fmt.Printf("Error converting expiration to ripple time: %s\n", err) return } credentialType := types.CredentialType("6D795F63726564656E7469616C") // my_credential @@ -94,7 +94,7 @@ func main() { // ----------------------------------------------------- // Creating the CredentialAccept transaction - fmt.Println("⏳ Creating the CredentialAccept transaction...") + fmt.Println("Creating the CredentialAccept transaction...") credentialAcceptTx := &transaction.CredentialAccept{ BaseTx: transaction.BaseTx{ @@ -110,7 +110,7 @@ func main() { // ----------------------------------------------------- // Creating the DepositPreauth transaction - fmt.Println("⏳ Creating the DepositPreauth transaction using AuthorizeCredentials...") + fmt.Println("Creating the DepositPreauth transaction using AuthorizeCredentials...") depositPreauthTx := &transaction.DepositPreauth{ BaseTx: transaction.BaseTx{ @@ -132,7 +132,7 @@ func main() { // ----------------------------------------------------- // Get the credential ID - fmt.Println("⏳ Getting the credential ID from the holder 1 account...") + fmt.Println("Getting the credential ID from the holder 1 account...") objectsRequest := &account.ObjectsRequest{ Account: holderWallet1.ClassicAddress, @@ -142,30 +142,30 @@ func main() { objectsResponse, err := client.GetAccountObjects(objectsRequest) if err != nil { - fmt.Printf("❌ Error getting the credential ID: %s\n", err) + fmt.Printf("Error getting the credential ID: %s\n", err) return } // Check if we have any credential objects if len(objectsResponse.AccountObjects) == 0 { - fmt.Println("❌ No credential objects found") + fmt.Println("No credential objects found") return } // Extract the credential ID credentialID, ok := objectsResponse.AccountObjects[0]["index"].(string) if !ok { - fmt.Println("❌ Could not extract credential ID from response") + fmt.Println("Could not extract credential ID from response") return } - fmt.Printf("✅ Credential ID: %s\n", credentialID) + fmt.Printf("Credential ID: %s\n", credentialID) fmt.Println() // ----------------------------------------------------- // Sending XRP to the holder 1 account - fmt.Println("⏳ Sending XRP to the issuer account, should succeed...") + fmt.Println("Sending XRP to the issuer account, should succeed...") sendTx := &transaction.Payment{ BaseTx: transaction.BaseTx{ @@ -182,7 +182,7 @@ func main() { // ----------------------------------------------------- // Unauthorizing the holder 1 account - fmt.Println("⏳ Unauthorizing the holder 1 account with the DepositPreauth transaction and the UnauthorizeCredentials field...") + fmt.Println("Unauthorizing the holder 1 account with the DepositPreauth transaction and the UnauthorizeCredentials field...") unauthorizeTx := &transaction.DepositPreauth{ BaseTx: transaction.BaseTx{ @@ -204,7 +204,7 @@ func main() { // ----------------------------------------------------- // Sending XRP to the holder 1 account again (which should fail) - fmt.Println("⏳ Sending XRP to the issuer account again (which should fail)...") + fmt.Println("Sending XRP to the issuer account again (which should fail)...") sendTx2 := &transaction.Payment{ BaseTx: transaction.BaseTx{ diff --git a/_code-samples/deposit-preauth/go/ws/main.go b/_code-samples/deposit-preauth/go/ws/main.go index 89fb2f42f37..0a70db62642 100644 --- a/_code-samples/deposit-preauth/go/ws/main.go +++ b/_code-samples/deposit-preauth/go/ws/main.go @@ -1,23 +1,23 @@ package main import ( - "encoding/hex" - "fmt" - "time" - - "github.com/Peersyst/xrpl-go/examples/clients" - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/queries/account" - "github.com/Peersyst/xrpl-go/xrpl/queries/common" - rippletime "github.com/Peersyst/xrpl-go/xrpl/time" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "encoding/hex" + "fmt" + "time" + + "github.com/Peersyst/xrpl-go/examples/clients" + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/queries/account" + "github.com/Peersyst/xrpl-go/xrpl/queries/common" + rippletime "github.com/Peersyst/xrpl-go/xrpl/time" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { - fmt.Println("⏳ Setting up client...") + fmt.Println("Setting up client...") client := clients.GetDevnetWebsocketClient() fmt.Println("Connecting to server...") @@ -26,7 +26,7 @@ func main() { return } - fmt.Println("✅ Client configured!") + fmt.Println("Client configured!") fmt.Println() fmt.Printf("Connection: %t", client.IsConnected()) @@ -35,41 +35,41 @@ func main() { // Configure wallets // Issuer - fmt.Println("⏳ Setting up credential issuer wallet...") + fmt.Println("Setting up credential issuer wallet...") issuer, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("❌ Error creating credential issuer wallet: %s\n", err) + fmt.Printf("Error creating credential issuer wallet: %s\n", err) return } err = client.FundWallet(&issuer) if err != nil { - fmt.Printf("❌ Error funding credential issuer wallet: %s\n", err) + fmt.Printf("Error funding credential issuer wallet: %s\n", err) return } - fmt.Printf("✅ Credential issuer wallet funded: %s\n", issuer.ClassicAddress) + fmt.Printf("Credential issuer wallet funded: %s\n", issuer.ClassicAddress) // ----------------------------------------------------- // Holder 1 - fmt.Println("⏳ Setting up holder 1 wallet...") + fmt.Println("Setting up holder 1 wallet...") holderWallet1, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("❌ Error creating holder 1 wallet: %s\n", err) + fmt.Printf("Error creating holder 1 wallet: %s\n", err) return } err = client.FundWallet(&holderWallet1) if err != nil { - fmt.Printf("❌ Error funding holder 1 wallet: %s\n", err) + fmt.Printf("Error funding holder 1 wallet: %s\n", err) return } - fmt.Printf("✅ Holder 1 wallet funded: %s\n", holderWallet1.ClassicAddress) + fmt.Printf("Holder 1 wallet funded: %s\n", holderWallet1.ClassicAddress) // ----------------------------------------------------- // Enabling DepositAuth on the issuer account with an AccountSet transaction - fmt.Println("⏳ Enabling DepositAuth on the issuer account...") + fmt.Println("Enabling DepositAuth on the issuer account...") accountSetTx := &transaction.AccountSet{ BaseTx: transaction.BaseTx{ Account: issuer.ClassicAddress, @@ -83,11 +83,11 @@ func main() { // ----------------------------------------------------- // Creating the CredentialCreate transaction - fmt.Println("⏳ Creating the CredentialCreate transaction...") + fmt.Println("Creating the CredentialCreate transaction...") expiration, err := rippletime.IsoTimeToRippleTime(time.Now().Add(time.Hour * 24).Format(time.RFC3339)) if err != nil { - fmt.Printf("❌ Error converting expiration to ripple time: %s\n", err) + fmt.Printf("Error converting expiration to ripple time: %s\n", err) return } credentialType := types.CredentialType("6D795F63726564656E7469616C") // my_credential @@ -108,7 +108,7 @@ func main() { // ----------------------------------------------------- // Creating the CredentialAccept transaction - fmt.Println("⏳ Creating the CredentialAccept transaction...") + fmt.Println("Creating the CredentialAccept transaction...") credentialAcceptTx := &transaction.CredentialAccept{ BaseTx: transaction.BaseTx{ @@ -124,7 +124,7 @@ func main() { // ----------------------------------------------------- // Creating the DepositPreauth transaction - fmt.Println("⏳ Creating the DepositPreauth transaction using AuthorizeCredentials...") + fmt.Println("Creating the DepositPreauth transaction using AuthorizeCredentials...") depositPreauthTx := &transaction.DepositPreauth{ BaseTx: transaction.BaseTx{ @@ -146,7 +146,7 @@ func main() { // ----------------------------------------------------- // Get the credential ID - fmt.Println("⏳ Getting the credential ID from the holder 1 account...") + fmt.Println("Getting the credential ID from the holder 1 account...") objectsRequest := &account.ObjectsRequest{ Account: holderWallet1.ClassicAddress, @@ -156,30 +156,30 @@ func main() { objectsResponse, err := client.GetAccountObjects(objectsRequest) if err != nil { - fmt.Printf("❌ Error getting the credential ID: %s\n", err) + fmt.Printf("Error getting the credential ID: %s\n", err) return } // Check if we have any credential objects if len(objectsResponse.AccountObjects) == 0 { - fmt.Println("❌ No credential objects found") + fmt.Println("No credential objects found") return } // Extract the credential ID credentialID, ok := objectsResponse.AccountObjects[0]["index"].(string) if !ok { - fmt.Println("❌ Could not extract credential ID from response") + fmt.Println("Could not extract credential ID from response") return } - fmt.Printf("✅ Credential ID: %s\n", credentialID) + fmt.Printf("Credential ID: %s\n", credentialID) fmt.Println() // ----------------------------------------------------- // Sending XRP to the holder 1 account - fmt.Println("⏳ Sending XRP to the issuer account, should succeed...") + fmt.Println("Sending XRP to the issuer account, should succeed...") sendTx := &transaction.Payment{ BaseTx: transaction.BaseTx{ @@ -196,7 +196,7 @@ func main() { // ----------------------------------------------------- // Unauthorize the holder 1 account - fmt.Println("⏳ Unauthorize the holder 1 account with the DepositPreauth transaction and the UnauthorizeCredentials field...") + fmt.Println("Unauthorize the holder 1 account with the DepositPreauth transaction and the UnauthorizeCredentials field...") unauthorizeTx := &transaction.DepositPreauth{ BaseTx: transaction.BaseTx{ @@ -218,7 +218,7 @@ func main() { // ----------------------------------------------------- // Sending XRP to the holder 1 account again (which should fail) - fmt.Println("⏳ Sending XRP to the issuer account again (which should fail)...") + fmt.Println("Sending XRP to the issuer account again (which should fail)...") sendTx2 := &transaction.Payment{ BaseTx: transaction.BaseTx{ diff --git a/_code-samples/freeze/go/rpc/main.go b/_code-samples/freeze/go/rpc/main.go index 9848e1d29f9..a60c6a4f5da 100644 --- a/_code-samples/freeze/go/rpc/main.go +++ b/_code-samples/freeze/go/rpc/main.go @@ -1,15 +1,15 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/currency" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/currency" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) const ( @@ -27,62 +27,62 @@ func main() { // Configure wallets // Issuer - fmt.Println("⏳ Setting up issuer wallet...") + fmt.Println("Setting up issuer wallet...") issuer, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("❌ Error creating issuer wallet: %s\n", err) + fmt.Printf("Error creating issuer wallet: %s\n", err) return } err = client.FundWallet(&issuer) if err != nil { - fmt.Printf("❌ Error funding issuer wallet: %s\n", err) + fmt.Printf("Error funding issuer wallet: %s\n", err) return } - fmt.Printf("✅ Issuer wallet funded: %s\n", issuer.ClassicAddress) + fmt.Printf("Issuer wallet funded: %s\n", issuer.ClassicAddress) // ----------------------------------------------------- // Holder 1 - fmt.Println("⏳ Setting up holder 1 wallet...") + fmt.Println("Setting up holder 1 wallet...") holderWallet1, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("❌ Error creating holder wallet 1: %s\n", err) + fmt.Printf("Error creating holder wallet 1: %s\n", err) return } err = client.FundWallet(&holderWallet1) if err != nil { - fmt.Printf("❌ Error funding holder wallet 1: %s\n", err) + fmt.Printf("Error funding holder wallet 1: %s\n", err) return } - fmt.Printf("✅ Holder wallet 1 funded: %s\n", holderWallet1.ClassicAddress) + fmt.Printf("Holder wallet 1 funded: %s\n", holderWallet1.ClassicAddress) // ----------------------------------------------------- // Holder 2 - fmt.Println("⏳ Setting up holder 2 wallet...") + fmt.Println("Setting up holder 2 wallet...") holderWallet2, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("❌ Error creating holder wallet 2: %s\n", err) + fmt.Printf("Error creating holder wallet 2: %s\n", err) return } err = client.FundWallet(&holderWallet2) if err != nil { - fmt.Printf("❌ Error funding holder wallet 2: %s\n", err) + fmt.Printf("Error funding holder wallet 2: %s\n", err) return } - fmt.Printf("✅ Holder wallet 2 funded: %s\n", holderWallet2.ClassicAddress) + fmt.Printf("Holder wallet 2 funded: %s\n", holderWallet2.ClassicAddress) fmt.Println() - fmt.Println("✅ Wallets setup complete!") + fmt.Println("Wallets setup complete!") fmt.Println() // ----------------------------------------------------- // Configuring Issuing account - fmt.Println("⏳ Configuring issuer address settings...") + fmt.Println("Configuring issuer address settings...") accountSet := &transactions.AccountSet{ BaseTx: transactions.BaseTx{ Account: types.Address(issuer.ClassicAddress), @@ -96,7 +96,7 @@ func main() { // ----------------------------------------------------- // Trustline from the holder 1 to the issuer - fmt.Println("⏳ Setting up trustline from holder 1 to the issuer...") + fmt.Println("Setting up trustline from holder 1 to the issuer...") trustSet := &transactions.TrustSet{ BaseTx: transactions.BaseTx{ Account: types.Address(holderWallet1.ClassicAddress), @@ -112,7 +112,7 @@ func main() { // ----------------------------------------------------- // Trustline from the holder 2 to the issuer - fmt.Println("⏳ Setting up trustline from holder 2 to the issuer...") + fmt.Println("Setting up trustline from holder 2 to the issuer...") trustSet = &transactions.TrustSet{ BaseTx: transactions.BaseTx{ Account: types.Address(holderWallet2.ClassicAddress), @@ -129,7 +129,7 @@ func main() { // ----------------------------------------------------- // Minting to Holder 1 - fmt.Println("⏳ Minting to Holder 1...") + fmt.Println("Minting to Holder 1...") payment := &transactions.Payment{ BaseTx: transactions.BaseTx{ Account: types.Address(issuer.ClassicAddress), @@ -146,7 +146,7 @@ func main() { // ----------------------------------------------------- // Minting to Holder 2 - fmt.Println("⏳ Minting to Holder 2...") + fmt.Println("Minting to Holder 2...") payment = &transactions.Payment{ BaseTx: transactions.BaseTx{ Account: types.Address(issuer.ClassicAddress), @@ -163,7 +163,7 @@ func main() { // ----------------------------------------------------- // Sending payment from Holder 1 to Holder 2 - fmt.Println("⏳ Sending payment from Holder 1 to Holder 2...") + fmt.Println("Sending payment from Holder 1 to Holder 2...") payment = &transactions.Payment{ BaseTx: transactions.BaseTx{ Account: types.Address(holderWallet1.ClassicAddress), @@ -180,7 +180,7 @@ func main() { // ----------------------------------------------------- // Freezing and Deep Freezing holder1 - fmt.Println("⏳ Freezing and Deep Freezing holder 1 trustline...") + fmt.Println("Freezing and Deep Freezing holder 1 trustline...") trustSet = &transactions.TrustSet{ BaseTx: transactions.BaseTx{ Account: types.Address(issuer.ClassicAddress), @@ -196,10 +196,10 @@ func main() { submitAndWait(client, trustSet, issuer) - // ------------------- SHOULD FAIL ⬇️ ------------------ + // ------------------- SHOULD FAIL ------------------ // Sending payment from Holder 1 to Holder 2 (which should fail), Holder 1 can't decrease its balance - fmt.Println("⏳ Sending payment from Holder 1 to Holder 2 (which should fail). Holder 1 can't decrease its balance...") + fmt.Println("Sending payment from Holder 1 to Holder 2 (which should fail). Holder 1 can't decrease its balance...") payment = &transactions.Payment{ BaseTx: transactions.BaseTx{ Account: types.Address(holderWallet1.ClassicAddress), @@ -213,10 +213,10 @@ func main() { } submitAndWait(client, payment, holderWallet1) - // ------------------- SHOULD FAIL ⬇️ ------------------ + // ------------------- SHOULD FAIL ------------------ // Sending payment from Holder 2 to Holder 1 (which should fail), Holder 1 can't increase its balance - fmt.Println("⏳ Sending payment from Holder 2 to Holder 1 (which should fail). Holder 1 can't increase its balance...") + fmt.Println("Sending payment from Holder 2 to Holder 1 (which should fail). Holder 1 can't increase its balance...") payment = &transactions.Payment{ BaseTx: transactions.BaseTx{ Account: types.Address(holderWallet2.ClassicAddress), @@ -230,10 +230,10 @@ func main() { } submitAndWait(client, payment, holderWallet2) - // ------------------- SHOULD FAIL ⬇️ ------------------ + // ------------------- SHOULD FAIL ------------------ // Creating OfferCreate transaction (which should fail), Holder 1 can't create an offer - fmt.Println("⏳ Creating OfferCreate transaction (which should fail). Holder 1 can't create an offer...") + fmt.Println("Creating OfferCreate transaction (which should fail). Holder 1 can't create an offer...") offerCreate := &transactions.OfferCreate{ BaseTx: transactions.BaseTx{ Account: types.Address(holderWallet1.ClassicAddress), @@ -250,7 +250,7 @@ func main() { // ----------------------------------------------------- // Unfreezing and Deep Unfreezing holder 1 - fmt.Println("⏳ Unfreezing and Deep Unfreezing holder 1 trustline...") + fmt.Println("Unfreezing and Deep Unfreezing holder 1 trustline...") trustSet = &transactions.TrustSet{ BaseTx: transactions.BaseTx{ Account: types.Address(issuer.ClassicAddress), @@ -268,7 +268,7 @@ func main() { // ----------------------------------------------------- // Sending payment from Holder 1 to Holder 2 (which should succeed), Holder 1 can decrease its balance - fmt.Println("⏳ Sending payment from Holder 1 to Holder 2 (which should succeed). Holder 1 can decrease its balance...") + fmt.Println("Sending payment from Holder 1 to Holder 2 (which should succeed). Holder 1 can decrease its balance...") payment = &transactions.Payment{ BaseTx: transactions.BaseTx{ Account: types.Address(holderWallet1.ClassicAddress), @@ -285,7 +285,7 @@ func main() { // ----------------------------------------------------- // Sending payment from Holder 2 to Holder 1 (which should succeed), Holder 1 can increase its balance - fmt.Println("⏳ Sending payment from Holder 2 to Holder 1 (which should succeed). Holder 1 can increase its balance...") + fmt.Println("Sending payment from Holder 2 to Holder 1 (which should succeed). Holder 1 can increase its balance...") payment = &transactions.Payment{ BaseTx: transactions.BaseTx{ Account: types.Address(holderWallet2.ClassicAddress), @@ -316,32 +316,32 @@ func getRpcClient() *rpc.Client { // submitAndWait submits a transaction and waits for it to be included in a validated ledger func submitAndWait(client *rpc.Client, txn SubmittableTransaction, wallet wallet.Wallet) { - fmt.Printf("⏳ Submitting %s transaction...\n", txn.TxType()) + fmt.Printf("Submitting %s transaction...\n", txn.TxType()) flattenedTx := txn.Flatten() err := client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling %s transaction: %s\n", txn.TxType(), err) + fmt.Printf("Error autofilling %s transaction: %s\n", txn.TxType(), err) fmt.Println() return } txBlob, _, err := wallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing %s transaction: %s\n", txn.TxType(), err) + fmt.Printf("Error signing %s transaction: %s\n", txn.TxType(), err) fmt.Println() return } response, err := client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting %s transaction: %s\n", txn.TxType(), err) + fmt.Printf("Error submitting %s transaction: %s\n", txn.TxType(), err) fmt.Println() return } - fmt.Printf("✅ %s transaction submitted\n", txn.TxType()) - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Printf("%s transaction submitted\n", txn.TxType()) + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() } diff --git a/_code-samples/freeze/go/ws/main.go b/_code-samples/freeze/go/ws/main.go index 1702ca939e5..de9377147b3 100644 --- a/_code-samples/freeze/go/ws/main.go +++ b/_code-samples/freeze/go/ws/main.go @@ -1,15 +1,15 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/currency" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/currency" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" ) const ( @@ -22,7 +22,7 @@ type SubmittableTransaction interface { } func main() { - fmt.Println("⏳ Setting up client...") + fmt.Println("Setting up client...") client := getClient() fmt.Println("Connecting to server...") @@ -31,7 +31,7 @@ func main() { return } - fmt.Println("✅ Client configured!") + fmt.Println("Client configured!") fmt.Println() fmt.Printf("Connection: %t", client.IsConnected()) @@ -40,62 +40,62 @@ func main() { // Configure wallets // Issuer - fmt.Println("⏳ Setting up issuer wallet...") + fmt.Println("Setting up issuer wallet...") issuer, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("❌ Error creating issuer wallet: %s\n", err) + fmt.Printf("Error creating issuer wallet: %s\n", err) return } err = client.FundWallet(&issuer) if err != nil { - fmt.Printf("❌ Error funding issuer wallet: %s\n", err) + fmt.Printf("Error funding issuer wallet: %s\n", err) return } - fmt.Printf("✅ Issuer wallet funded: %s\n", issuer.ClassicAddress) + fmt.Printf("Issuer wallet funded: %s\n", issuer.ClassicAddress) // ----------------------------------------------------- // Holder 1 - fmt.Println("⏳ Setting up holder 1 wallet...") + fmt.Println("Setting up holder 1 wallet...") holderWallet1, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("❌ Error creating holder wallet 1: %s\n", err) + fmt.Printf("Error creating holder wallet 1: %s\n", err) return } err = client.FundWallet(&holderWallet1) if err != nil { - fmt.Printf("❌ Error funding holder wallet 1: %s\n", err) + fmt.Printf("Error funding holder wallet 1: %s\n", err) return } - fmt.Printf("✅ Holder wallet 1 funded: %s\n", holderWallet1.ClassicAddress) + fmt.Printf("Holder wallet 1 funded: %s\n", holderWallet1.ClassicAddress) // ----------------------------------------------------- // Holder 2 - fmt.Println("⏳ Setting up holder 2 wallet...") + fmt.Println("Setting up holder 2 wallet...") holderWallet2, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("❌ Error creating holder wallet 2: %s\n", err) + fmt.Printf("Error creating holder wallet 2: %s\n", err) return } err = client.FundWallet(&holderWallet2) if err != nil { - fmt.Printf("❌ Error funding holder wallet 2: %s\n", err) + fmt.Printf("Error funding holder wallet 2: %s\n", err) return } - fmt.Printf("✅ Holder wallet 2 funded: %s\n", holderWallet2.ClassicAddress) + fmt.Printf("Holder wallet 2 funded: %s\n", holderWallet2.ClassicAddress) fmt.Println() - fmt.Println("✅ Wallets setup complete!") + fmt.Println("Wallets setup complete!") fmt.Println() // ----------------------------------------------------- // Configuring Issuing account - fmt.Println("⏳ Configuring issuer address settings...") + fmt.Println("Configuring issuer address settings...") accountSet := &transactions.AccountSet{ BaseTx: transactions.BaseTx{ Account: types.Address(issuer.ClassicAddress), @@ -109,7 +109,7 @@ func main() { // ----------------------------------------------------- // Trustline from the holder 1 to the issuer - fmt.Println("⏳ Setting up trustline from holder 1 to the issuer...") + fmt.Println("Setting up trustline from holder 1 to the issuer...") trustSet := &transactions.TrustSet{ BaseTx: transactions.BaseTx{ Account: types.Address(holderWallet1.ClassicAddress), @@ -125,7 +125,7 @@ func main() { // ----------------------------------------------------- // Trustline from the holder 2 to the issuer - fmt.Println("⏳ Setting up trustline from holder 2 to the issuer...") + fmt.Println("Setting up trustline from holder 2 to the issuer...") trustSet = &transactions.TrustSet{ BaseTx: transactions.BaseTx{ Account: types.Address(holderWallet2.ClassicAddress), @@ -142,7 +142,7 @@ func main() { // ----------------------------------------------------- // Minting to Holder 1 - fmt.Println("⏳ Minting to Holder 1...") + fmt.Println("Minting to Holder 1...") payment := &transactions.Payment{ BaseTx: transactions.BaseTx{ Account: types.Address(issuer.ClassicAddress), @@ -159,7 +159,7 @@ func main() { // ----------------------------------------------------- // Minting to Holder 2 - fmt.Println("⏳ Minting to Holder 2...") + fmt.Println("Minting to Holder 2...") payment = &transactions.Payment{ BaseTx: transactions.BaseTx{ Account: types.Address(issuer.ClassicAddress), @@ -176,7 +176,7 @@ func main() { // ----------------------------------------------------- // Sending payment from Holder 1 to Holder 2 - fmt.Println("⏳ Sending payment from Holder 1 to Holder 2...") + fmt.Println("Sending payment from Holder 1 to Holder 2...") payment = &transactions.Payment{ BaseTx: transactions.BaseTx{ Account: types.Address(holderWallet1.ClassicAddress), @@ -193,7 +193,7 @@ func main() { // ----------------------------------------------------- // Freezing and Deep Freezing holder1 - fmt.Println("⏳ Freezing and Deep Freezing holder 1 trustline...") + fmt.Println("Freezing and Deep Freezing holder 1 trustline...") trustSet = &transactions.TrustSet{ BaseTx: transactions.BaseTx{ Account: types.Address(issuer.ClassicAddress), @@ -209,10 +209,10 @@ func main() { submitAndWait(client, trustSet, issuer) - // ------------------- SHOULD FAIL ⬇️ ------------------ + // ------------------- SHOULD FAIL ------------------ // Sending payment from Holder 1 to Holder 2 (which should fail), Holder 1 can't decrease its balance - fmt.Println("⏳ Sending payment from Holder 1 to Holder 2 (which should fail). Holder 1 can't decrease its balance...") + fmt.Println("Sending payment from Holder 1 to Holder 2 (which should fail). Holder 1 can't decrease its balance...") payment = &transactions.Payment{ BaseTx: transactions.BaseTx{ Account: types.Address(holderWallet1.ClassicAddress), @@ -226,10 +226,10 @@ func main() { } submitAndWait(client, payment, holderWallet1) - // ------------------- SHOULD FAIL ⬇️ ------------------ + // ------------------- SHOULD FAIL ------------------ // Sending payment from Holder 2 to Holder 1 (which should fail), Holder 1 can't increase its balance - fmt.Println("⏳ Sending payment from Holder 2 to Holder 1 (which should fail). Holder 1 can't increase its balance...") + fmt.Println("Sending payment from Holder 2 to Holder 1 (which should fail). Holder 1 can't increase its balance...") payment = &transactions.Payment{ BaseTx: transactions.BaseTx{ Account: types.Address(holderWallet2.ClassicAddress), @@ -243,10 +243,10 @@ func main() { } submitAndWait(client, payment, holderWallet2) - // ------------------- SHOULD FAIL ⬇️ ------------------ + // ------------------- SHOULD FAIL ------------------ // Creating OfferCreate transaction (which should fail), Holder 1 can't create an offer - fmt.Println("⏳ Creating OfferCreate transaction (which should fail). Holder 1 can't create an offer...") + fmt.Println("Creating OfferCreate transaction (which should fail). Holder 1 can't create an offer...") offerCreate := &transactions.OfferCreate{ BaseTx: transactions.BaseTx{ Account: types.Address(holderWallet1.ClassicAddress), @@ -263,7 +263,7 @@ func main() { // ----------------------------------------------------- // Unfreezing and Deep Unfreezing holder 1 - fmt.Println("⏳ Unfreezing and Deep Unfreezing holder 1 trustline...") + fmt.Println("Unfreezing and Deep Unfreezing holder 1 trustline...") trustSet = &transactions.TrustSet{ BaseTx: transactions.BaseTx{ Account: types.Address(issuer.ClassicAddress), @@ -281,7 +281,7 @@ func main() { // ----------------------------------------------------- // Sending payment from Holder 1 to Holder 2 (which should succeed), Holder 1 can decrease its balance - fmt.Println("⏳ Sending payment from Holder 1 to Holder 2 (which should succeed). Holder 1 can decrease its balance...") + fmt.Println("Sending payment from Holder 1 to Holder 2 (which should succeed). Holder 1 can decrease its balance...") payment = &transactions.Payment{ BaseTx: transactions.BaseTx{ Account: types.Address(holderWallet1.ClassicAddress), @@ -298,7 +298,7 @@ func main() { // ----------------------------------------------------- // Sending payment from Holder 2 to Holder 1 (which should succeed), Holder 1 can increase its balance - fmt.Println("⏳ Sending payment from Holder 2 to Holder 1 (which should succeed). Holder 1 can increase its balance...") + fmt.Println("Sending payment from Holder 2 to Holder 1 (which should succeed). Holder 1 can increase its balance...") payment = &transactions.Payment{ BaseTx: transactions.BaseTx{ Account: types.Address(holderWallet2.ClassicAddress), @@ -326,32 +326,32 @@ func getClient() *websocket.Client { // submitAndWait submits a transaction and waits for it to be included in a validated ledger func submitAndWait(client *websocket.Client, txn SubmittableTransaction, wallet wallet.Wallet) { - fmt.Printf("⏳ Submitting %s transaction...\n", txn.TxType()) + fmt.Printf("Submitting %s transaction...\n", txn.TxType()) flattenedTx := txn.Flatten() err := client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling %s transaction: %s\n", txn.TxType(), err) + fmt.Printf("Error autofilling %s transaction: %s\n", txn.TxType(), err) fmt.Println() return } txBlob, _, err := wallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing %s transaction: %s\n", txn.TxType(), err) + fmt.Printf("Error signing %s transaction: %s\n", txn.TxType(), err) fmt.Println() return } response, err := client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting %s transaction: %s\n", txn.TxType(), err) + fmt.Printf("Error submitting %s transaction: %s\n", txn.TxType(), err) fmt.Println() return } - fmt.Printf("✅ %s transaction submitted\n", txn.TxType()) - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Printf("%s transaction submitted\n", txn.TxType()) + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() } diff --git a/_code-samples/get-started/go/base/rpc/main.go b/_code-samples/get-started/go/base/rpc/main.go index b88b945138e..c25428ad888 100644 --- a/_code-samples/get-started/go/base/rpc/main.go +++ b/_code-samples/get-started/go/base/rpc/main.go @@ -1,8 +1,9 @@ package main import ( - "github.com/Peersyst/xrpl-go/xrpl/queries/utility" - "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/queries/utility" + "github.com/Peersyst/xrpl-go/xrpl/rpc" ) func main() { diff --git a/_code-samples/get-started/go/base/ws/main.go b/_code-samples/get-started/go/base/ws/main.go index 40d4f17a967..02786553e2d 100644 --- a/_code-samples/get-started/go/base/ws/main.go +++ b/_code-samples/get-started/go/base/ws/main.go @@ -1,9 +1,10 @@ package main import ( - "fmt" + "fmt" - "github.com/Peersyst/xrpl-go/xrpl/websocket" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" ) func main() { diff --git a/_code-samples/get-started/go/get-acc-info/ws/main.go b/_code-samples/get-started/go/get-acc-info/ws/main.go index 025143f3985..ed9fc336d73 100644 --- a/_code-samples/get-started/go/get-acc-info/ws/main.go +++ b/_code-samples/get-started/go/get-acc-info/ws/main.go @@ -1,15 +1,15 @@ package main import ( - "fmt" + "fmt" - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/queries/account" - "github.com/Peersyst/xrpl-go/xrpl/queries/common" - "github.com/Peersyst/xrpl-go/xrpl/queries/ledger" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/queries/account" + "github.com/Peersyst/xrpl-go/xrpl/queries/common" + "github.com/Peersyst/xrpl-go/xrpl/queries/ledger" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" ) func main() { @@ -31,11 +31,11 @@ func main() { } if !client.IsConnected() { - fmt.Println("❌ Failed to connect to testnet") + fmt.Println("Failed to connect to testnet") return } - fmt.Println("✅ Connected to testnet") + fmt.Println("Connected to testnet") fmt.Println() // Create a new wallet diff --git a/_code-samples/issue-a-token/go/rpc/main.go b/_code-samples/issue-a-token/go/rpc/main.go index 249d58d971f..08f591c0a6d 100644 --- a/_code-samples/issue-a-token/go/rpc/main.go +++ b/_code-samples/issue-a-token/go/rpc/main.go @@ -1,14 +1,14 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) const ( @@ -19,7 +19,7 @@ func main() { // // Configure client // - fmt.Println("⏳ Setting up client...") + fmt.Println("Setting up client...") cfg, err := rpc.NewClientConfig( "https://s.altnet.rippletest.net:51234/", rpc.WithFaucetProvider(faucet.NewTestnetFaucetProvider()), @@ -29,60 +29,60 @@ func main() { } client := rpc.NewClient(cfg) - fmt.Println("✅ Client configured!") + fmt.Println("Client configured!") fmt.Println() // // Configure wallets // - fmt.Println("⏳ Setting up wallets...") + fmt.Println("Setting up wallets...") coldWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("❌ Error creating cold wallet: %s\n", err) + fmt.Printf("Error creating cold wallet: %s\n", err) return } err = client.FundWallet(&coldWallet) if err != nil { - fmt.Printf("❌ Error funding cold wallet: %s\n", err) + fmt.Printf("Error funding cold wallet: %s\n", err) return } - fmt.Println("💸 Cold wallet funded!") + fmt.Println("Cold wallet funded!") hotWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("❌ Error creating hot wallet: %s\n", err) + fmt.Printf("Error creating hot wallet: %s\n", err) return } err = client.FundWallet(&hotWallet) if err != nil { - fmt.Printf("❌ Error funding hot wallet: %s\n", err) + fmt.Printf("Error funding hot wallet: %s\n", err) return } - fmt.Println("💸 Hot wallet funded!") + fmt.Println("Hot wallet funded!") customerOneWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("❌ Error creating token wallet: %s\n", err) + fmt.Printf("Error creating token wallet: %s\n", err) return } err = client.FundWallet(&customerOneWallet) if err != nil { - fmt.Printf("❌ Error funding customer one wallet: %s\n", err) + fmt.Printf("Error funding customer one wallet: %s\n", err) return } - fmt.Println("💸 Customer one wallet funded!") + fmt.Println("Customer one wallet funded!") fmt.Println() - fmt.Println("✅ Wallets setup complete!") - fmt.Println("💳 Cold wallet:", coldWallet.ClassicAddress) - fmt.Println("💳 Hot wallet:", hotWallet.ClassicAddress) - fmt.Println("💳 Customer one wallet:", customerOneWallet.ClassicAddress) + fmt.Println("Wallets setup complete!") + fmt.Println("Cold wallet:", coldWallet.ClassicAddress) + fmt.Println("Hot wallet:", hotWallet.ClassicAddress) + fmt.Println("Customer one wallet:", customerOneWallet.ClassicAddress) fmt.Println() // // Configure cold address settings // - fmt.Println("⏳ Configuring cold address settings...") + fmt.Println("Configuring cold address settings...") coldWalletAccountSet := &transactions.AccountSet{ BaseTx: transactions.BaseTx{ Account: types.Address(coldWallet.ClassicAddress), @@ -101,37 +101,37 @@ func main() { err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err := coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } response, err := client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) + fmt.Printf("Error submitting transaction: %s\n", err) return } if !response.Validated { - fmt.Println("❌ Cold address settings configuration failed!") + fmt.Println("Cold address settings configuration failed!") fmt.Println("Try again!") fmt.Println() return } - fmt.Println("✅ Cold address settings configured!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Cold address settings configured!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() // // Configure hot address settings // - fmt.Println("⏳ Configuring hot address settings...") + fmt.Println("Configuring hot address settings...") hotWalletAccountSet := &transactions.AccountSet{ BaseTx: transactions.BaseTx{ Account: types.Address(hotWallet.ClassicAddress), @@ -146,37 +146,37 @@ func main() { flattenedTx = hotWalletAccountSet.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err = hotWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) + fmt.Printf("Error submitting transaction: %s\n", err) return } if !response.Validated { - fmt.Println("❌ Hot address settings configuration failed!") + fmt.Println("Hot address settings configuration failed!") fmt.Println("Try again!") fmt.Println() return } - fmt.Println("✅ Hot address settings configured!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Hot address settings configured!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() // // Create trust line from hot to cold address // - fmt.Println("⏳ Creating trust line from hot to cold address...") + fmt.Println("Creating trust line from hot to cold address...") hotColdTrustSet := &transactions.TrustSet{ BaseTx: transactions.BaseTx{ Account: types.Address(hotWallet.ClassicAddress), @@ -191,37 +191,37 @@ func main() { flattenedTx = hotColdTrustSet.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err = hotWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) + fmt.Printf("Error submitting transaction: %s\n", err) return } if !response.Validated { - fmt.Println("❌ Trust line from hot to cold address creation failed!") + fmt.Println("Trust line from hot to cold address creation failed!") fmt.Println("Try again!") fmt.Println() return } - fmt.Println("✅ Trust line from hot to cold address created!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Trust line from hot to cold address created!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() // // Create trust line from costumer one to cold address // - fmt.Println("⏳ Creating trust line from customer one to cold address...") + fmt.Println("Creating trust line from customer one to cold address...") customerOneColdTrustSet := &transactions.TrustSet{ BaseTx: transactions.BaseTx{ Account: types.Address(customerOneWallet.ClassicAddress), @@ -236,37 +236,37 @@ func main() { flattenedTx = customerOneColdTrustSet.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err = customerOneWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) + fmt.Printf("Error submitting transaction: %s\n", err) return } if !response.Validated { - fmt.Println("❌ Trust line from customer one to cold address creation failed!") + fmt.Println("Trust line from customer one to cold address creation failed!") fmt.Println("Try again!") fmt.Println() return } - fmt.Println("✅ Trust line from customer one to cold address created!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Trust line from customer one to cold address created!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() // // Send tokens from cold wallet to hot wallet // - fmt.Println("⏳ Sending tokens from cold wallet to hot wallet...") + fmt.Println("Sending tokens from cold wallet to hot wallet...") coldToHotPayment := &transactions.Payment{ BaseTx: transactions.BaseTx{ Account: types.Address(coldWallet.ClassicAddress), @@ -283,37 +283,37 @@ func main() { flattenedTx = coldToHotPayment.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err = coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) + fmt.Printf("Error submitting transaction: %s\n", err) return } if !response.Validated { - fmt.Println("❌ Tokens not sent from cold wallet to hot wallet!") + fmt.Println("Tokens not sent from cold wallet to hot wallet!") fmt.Println("Try again!") fmt.Println() return } - fmt.Println("✅ Tokens sent from cold wallet to hot wallet!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Tokens sent from cold wallet to hot wallet!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() // // Send tokens from hot wallet to customer one // - fmt.Println("⏳ Sending tokens from cold wallet to customer one...") + fmt.Println("Sending tokens from cold wallet to customer one...") coldToCustomerOnePayment := &transactions.Payment{ BaseTx: transactions.BaseTx{ Account: types.Address(coldWallet.ClassicAddress), @@ -329,36 +329,36 @@ func main() { flattenedTx = coldToCustomerOnePayment.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err = coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) + fmt.Printf("Error submitting transaction: %s\n", err) return } if !response.Validated { - fmt.Println("❌ Tokens not sent from cold wallet to customer one!") + fmt.Println("Tokens not sent from cold wallet to customer one!") fmt.Println() return } - fmt.Println("✅ Tokens sent from cold wallet to customer one!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Tokens sent from cold wallet to customer one!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() // // Freeze cold wallet // - fmt.Println("⏳ Freezing cold wallet...") + fmt.Println("Freezing cold wallet...") freezeColdWallet := &transactions.AccountSet{ BaseTx: transactions.BaseTx{ Account: types.Address(coldWallet.ClassicAddress), @@ -370,37 +370,37 @@ func main() { flattenedTx = freezeColdWallet.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err = coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) + fmt.Printf("Error submitting transaction: %s\n", err) return } if !response.Validated { - fmt.Println("❌ Cold wallet freezing failed!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Cold wallet freezing failed!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() return } - fmt.Println("✅ Cold wallet frozen!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Cold wallet frozen!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() // // Try to send tokens from hot wallet to customer one // - fmt.Println("⏳ Trying to send tokens from hot wallet to customer one...") + fmt.Println("Trying to send tokens from hot wallet to customer one...") hotToCustomerOnePayment := &transactions.Payment{ BaseTx: transactions.BaseTx{ Account: types.Address(hotWallet.ClassicAddress), @@ -416,13 +416,13 @@ func main() { flattenedTx = hotToCustomerOnePayment.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err = hotWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } @@ -431,13 +431,13 @@ func main() { return } - fmt.Println("❌ Tokens not sent from hot wallet to customer one!") + fmt.Println("Tokens not sent from hot wallet to customer one!") fmt.Println() // // // // Unfreeze cold wallet // // - fmt.Println("⏳ Unfreezing cold wallet...") + fmt.Println("Unfreezing cold wallet...") unfreezeColdWallet := &transactions.AccountSet{ BaseTx: transactions.BaseTx{ Account: types.Address(coldWallet.ClassicAddress), @@ -449,37 +449,37 @@ func main() { flattenedTx = unfreezeColdWallet.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err = coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) + fmt.Printf("Error submitting transaction: %s\n", err) return } if !response.Validated { - fmt.Println("❌ Cold wallet unfreezing failed!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Cold wallet unfreezing failed!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() return } - fmt.Println("✅ Cold wallet unfrozen!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Cold wallet unfrozen!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() // // Try to send tokens from hot wallet to customer one // - fmt.Println("⏳ Trying to send tokens from hot wallet to customer one...") + fmt.Println("Trying to send tokens from hot wallet to customer one...") hotToCustomerOnePayment = &transactions.Payment{ BaseTx: transactions.BaseTx{ Account: types.Address(hotWallet.ClassicAddress), @@ -495,29 +495,29 @@ func main() { flattenedTx = hotToCustomerOnePayment.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err = hotWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) + fmt.Printf("Error submitting transaction: %s\n", err) return } if !response.Validated { - fmt.Println("❌ Tokens not sent from hot wallet to customer one!") + fmt.Println("Tokens not sent from hot wallet to customer one!") fmt.Println("Try again!") return } - fmt.Println("✅ Tokens sent from hot wallet to customer one!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Tokens sent from hot wallet to customer one!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() } diff --git a/_code-samples/issue-a-token/go/ws/main.go b/_code-samples/issue-a-token/go/ws/main.go index 6655fd952d6..e052df2e899 100644 --- a/_code-samples/issue-a-token/go/ws/main.go +++ b/_code-samples/issue-a-token/go/ws/main.go @@ -1,14 +1,14 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" ) const ( @@ -19,14 +19,14 @@ func main() { // // Configure client // - fmt.Println("⏳ Setting up client...") + fmt.Println("Setting up client...") client := websocket.NewClient( websocket.NewClientConfig(). WithHost("wss://s.altnet.rippletest.net"). WithFaucetProvider(faucet.NewTestnetFaucetProvider()), ) defer client.Disconnect() - fmt.Println("✅ Client configured!") + fmt.Println("Client configured!") fmt.Println() fmt.Println("Connecting to server...") @@ -41,54 +41,54 @@ func main() { // // Configure wallets // - fmt.Println("⏳ Setting up wallets...") + fmt.Println("Setting up wallets...") coldWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("❌ Error creating cold wallet: %s\n", err) + fmt.Printf("Error creating cold wallet: %s\n", err) return } err = client.FundWallet(&coldWallet) if err != nil { - fmt.Printf("❌ Error funding cold wallet: %s\n", err) + fmt.Printf("Error funding cold wallet: %s\n", err) return } - fmt.Println("💸 Cold wallet funded!") + fmt.Println("Cold wallet funded!") hotWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("❌ Error creating hot wallet: %s\n", err) + fmt.Printf("Error creating hot wallet: %s\n", err) return } err = client.FundWallet(&hotWallet) if err != nil { - fmt.Printf("❌ Error funding hot wallet: %s\n", err) + fmt.Printf("Error funding hot wallet: %s\n", err) return } - fmt.Println("💸 Hot wallet funded!") + fmt.Println("Hot wallet funded!") customerOneWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("❌ Error creating token wallet: %s\n", err) + fmt.Printf("Error creating token wallet: %s\n", err) return } err = client.FundWallet(&customerOneWallet) if err != nil { - fmt.Printf("❌ Error funding customer one wallet: %s\n", err) + fmt.Printf("Error funding customer one wallet: %s\n", err) return } - fmt.Println("💸 Customer one wallet funded!") + fmt.Println("Customer one wallet funded!") fmt.Println() - fmt.Println("✅ Wallets setup complete!") - fmt.Println("💳 Cold wallet:", coldWallet.ClassicAddress) - fmt.Println("💳 Hot wallet:", hotWallet.ClassicAddress) - fmt.Println("💳 Customer one wallet:", customerOneWallet.ClassicAddress) + fmt.Println("Wallets setup complete!") + fmt.Println("Cold wallet:", coldWallet.ClassicAddress) + fmt.Println("Hot wallet:", hotWallet.ClassicAddress) + fmt.Println("Customer one wallet:", customerOneWallet.ClassicAddress) fmt.Println() // // Configure cold address settings // - fmt.Println("⏳ Configuring cold address settings...") + fmt.Println("Configuring cold address settings...") coldWalletAccountSet := &transactions.AccountSet{ BaseTx: transactions.BaseTx{ Account: types.Address(coldWallet.ClassicAddress), @@ -107,37 +107,37 @@ func main() { err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err := coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } response, err := client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) + fmt.Printf("Error submitting transaction: %s\n", err) return } if !response.Validated { - fmt.Println("❌ Cold address settings configuration failed!") + fmt.Println("Cold address settings configuration failed!") fmt.Println("Try again!") fmt.Println() return } - fmt.Println("✅ Cold address settings configured!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Cold address settings configured!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() // // Configure hot address settings // - fmt.Println("⏳ Configuring hot address settings...") + fmt.Println("Configuring hot address settings...") hotWalletAccountSet := &transactions.AccountSet{ BaseTx: transactions.BaseTx{ Account: types.Address(hotWallet.ClassicAddress), @@ -152,37 +152,37 @@ func main() { flattenedTx = hotWalletAccountSet.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err = hotWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) + fmt.Printf("Error submitting transaction: %s\n", err) return } if !response.Validated { - fmt.Println("❌ Hot address settings configuration failed!") + fmt.Println("Hot address settings configuration failed!") fmt.Println("Try again!") fmt.Println() return } - fmt.Println("✅ Hot address settings configured!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Hot address settings configured!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() // // Create trust line from hot to cold address // - fmt.Println("⏳ Creating trust line from hot to cold address...") + fmt.Println("Creating trust line from hot to cold address...") hotColdTrustSet := &transactions.TrustSet{ BaseTx: transactions.BaseTx{ Account: types.Address(hotWallet.ClassicAddress), @@ -197,37 +197,37 @@ func main() { flattenedTx = hotColdTrustSet.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err = hotWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) + fmt.Printf("Error submitting transaction: %s\n", err) return } if !response.Validated { - fmt.Println("❌ Trust line from hot to cold address creation failed!") + fmt.Println("Trust line from hot to cold address creation failed!") fmt.Println("Try again!") fmt.Println() return } - fmt.Println("✅ Trust line from hot to cold address created!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Trust line from hot to cold address created!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() // // Create trust line from costumer one to cold address // - fmt.Println("⏳ Creating trust line from customer one to cold address...") + fmt.Println("Creating trust line from customer one to cold address...") customerOneColdTrustSet := &transactions.TrustSet{ BaseTx: transactions.BaseTx{ Account: types.Address(customerOneWallet.ClassicAddress), @@ -242,37 +242,37 @@ func main() { flattenedTx = customerOneColdTrustSet.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err = customerOneWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) + fmt.Printf("Error submitting transaction: %s\n", err) return } if !response.Validated { - fmt.Println("❌ Trust line from customer one to cold address creation failed!") + fmt.Println("Trust line from customer one to cold address creation failed!") fmt.Println("Try again!") fmt.Println() return } - fmt.Println("✅ Trust line from customer one to cold address created!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Trust line from customer one to cold address created!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() // // Send tokens from cold wallet to hot wallet // - fmt.Println("⏳ Sending tokens from cold wallet to hot wallet...") + fmt.Println("Sending tokens from cold wallet to hot wallet...") coldToHotPayment := &transactions.Payment{ BaseTx: transactions.BaseTx{ Account: types.Address(coldWallet.ClassicAddress), @@ -289,37 +289,37 @@ func main() { flattenedTx = coldToHotPayment.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err = coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) + fmt.Printf("Error submitting transaction: %s\n", err) return } if !response.Validated { - fmt.Println("❌ Tokens not sent from cold wallet to hot wallet!") + fmt.Println("Tokens not sent from cold wallet to hot wallet!") fmt.Println("Try again!") fmt.Println() return } - fmt.Println("✅ Tokens sent from cold wallet to hot wallet!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Tokens sent from cold wallet to hot wallet!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() // // Send tokens from hot wallet to customer one // - fmt.Println("⏳ Sending tokens from cold wallet to customer one...") + fmt.Println("Sending tokens from cold wallet to customer one...") coldToCustomerOnePayment := &transactions.Payment{ BaseTx: transactions.BaseTx{ Account: types.Address(coldWallet.ClassicAddress), @@ -335,36 +335,36 @@ func main() { flattenedTx = coldToCustomerOnePayment.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err = coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) + fmt.Printf("Error submitting transaction: %s\n", err) return } if !response.Validated { - fmt.Println("❌ Tokens not sent from cold wallet to customer one!") + fmt.Println("Tokens not sent from cold wallet to customer one!") fmt.Println() return } - fmt.Println("✅ Tokens sent from cold wallet to customer one!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Tokens sent from cold wallet to customer one!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() // // Freeze cold wallet // - fmt.Println("⏳ Freezing cold wallet...") + fmt.Println("Freezing cold wallet...") freezeColdWallet := &transactions.AccountSet{ BaseTx: transactions.BaseTx{ Account: types.Address(coldWallet.ClassicAddress), @@ -376,37 +376,37 @@ func main() { flattenedTx = freezeColdWallet.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err = coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) + fmt.Printf("Error submitting transaction: %s\n", err) return } if !response.Validated { - fmt.Println("❌ Cold wallet freezing failed!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Cold wallet freezing failed!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() return } - fmt.Println("✅ Cold wallet frozen!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Cold wallet frozen!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() // // Try to send tokens from hot wallet to customer one // - fmt.Println("⏳ Trying to send tokens from hot wallet to customer one...") + fmt.Println("Trying to send tokens from hot wallet to customer one...") hotToCustomerOnePayment := &transactions.Payment{ BaseTx: transactions.BaseTx{ Account: types.Address(hotWallet.ClassicAddress), @@ -422,13 +422,13 @@ func main() { flattenedTx = hotToCustomerOnePayment.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err = hotWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } @@ -437,13 +437,13 @@ func main() { return } - fmt.Println("❌ Tokens not sent from hot wallet to customer one!") + fmt.Println("Tokens not sent from hot wallet to customer one!") fmt.Println() // // // // Unfreeze cold wallet // // - fmt.Println("⏳ Unfreezing cold wallet...") + fmt.Println("Unfreezing cold wallet...") unfreezeColdWallet := &transactions.AccountSet{ BaseTx: transactions.BaseTx{ Account: types.Address(coldWallet.ClassicAddress), @@ -455,37 +455,37 @@ func main() { flattenedTx = unfreezeColdWallet.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err = coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) + fmt.Printf("Error submitting transaction: %s\n", err) return } if !response.Validated { - fmt.Println("❌ Cold wallet unfreezing failed!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Cold wallet unfreezing failed!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() return } - fmt.Println("✅ Cold wallet unfrozen!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Cold wallet unfrozen!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() // // Try to send tokens from hot wallet to customer one // - fmt.Println("⏳ Trying to send tokens from hot wallet to customer one...") + fmt.Println("Trying to send tokens from hot wallet to customer one...") hotToCustomerOnePayment = &transactions.Payment{ BaseTx: transactions.BaseTx{ Account: types.Address(hotWallet.ClassicAddress), @@ -501,29 +501,29 @@ func main() { flattenedTx = hotToCustomerOnePayment.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("❌ Error autofilling transaction: %s\n", err) + fmt.Printf("Error autofilling transaction: %s\n", err) return } txBlob, _, err = hotWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("❌ Error signing transaction: %s\n", err) + fmt.Printf("Error signing transaction: %s\n", err) return } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("❌ Error submitting transaction: %s\n", err) + fmt.Printf("Error submitting transaction: %s\n", err) return } if !response.Validated { - fmt.Println("❌ Tokens not sent from hot wallet to customer one!") + fmt.Println("Tokens not sent from hot wallet to customer one!") fmt.Println("Try again!") return } - fmt.Println("✅ Tokens sent from hot wallet to customer one!") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) + fmt.Println("Tokens sent from hot wallet to customer one!") + fmt.Printf("Hash: %s\n", response.Hash.String()) fmt.Println() } diff --git a/_code-samples/multisigning/go/rpc/main.go b/_code-samples/multisigning/go/rpc/main.go index b281f86e305..56a687f96a1 100644 --- a/_code-samples/multisigning/go/rpc/main.go +++ b/_code-samples/multisigning/go/rpc/main.go @@ -1,18 +1,18 @@ package main import ( - "encoding/hex" - "fmt" - "maps" - "strings" - - "github.com/Peersyst/xrpl-go/xrpl" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/ledger-entry-types" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "encoding/hex" + "fmt" + "maps" + "strings" + + "github.com/Peersyst/xrpl-go/xrpl" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/ledger-entry-types" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { @@ -44,28 +44,28 @@ func main() { return } - fmt.Println("⏳ Funding wallets...") + fmt.Println("Funding wallets...") if err := client.FundWallet(&w1); err != nil { fmt.Println(err) return } - fmt.Println("💸 Wallet 1 funded") + fmt.Println("Wallet 1 funded") if err := client.FundWallet(&w2); err != nil { fmt.Println(err) return } - fmt.Println("💸 Wallet 2 funded") + fmt.Println("Wallet 2 funded") if err := client.FundWallet(&master); err != nil { fmt.Println(err) return } - fmt.Println("💸 Master wallet funded") + fmt.Println("Master wallet funded") fmt.Println() - fmt.Println("⏳ Setting up signer list...") + fmt.Println("Setting up signer list...") ss := &transaction.SignerListSet{ BaseTx: transaction.BaseTx{ @@ -113,11 +113,11 @@ func main() { return } - fmt.Println("✅ SignerListSet transaction submitted!") - fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Println("SignerListSet transaction submitted!") + fmt.Printf("Hash: %s\n", res.Hash.String()) fmt.Println() - fmt.Println("⏳ Setting up AccountSet multisign transaction...") + fmt.Println("Setting up AccountSet multisign transaction...") as := &transaction.AccountSet{ BaseTx: transaction.BaseTx{ @@ -161,6 +161,6 @@ func main() { return } - fmt.Println("✅ Multisigned transaction submitted!") - fmt.Printf("🌐 Result: %s\n", mRes.EngineResult) + fmt.Println("Multisigned transaction submitted!") + fmt.Printf("Result: %s\n", mRes.EngineResult) } diff --git a/_code-samples/multisigning/go/ws/main.go b/_code-samples/multisigning/go/ws/main.go index e5ae17d0a79..0fd7a61ee4a 100644 --- a/_code-samples/multisigning/go/ws/main.go +++ b/_code-samples/multisigning/go/ws/main.go @@ -1,22 +1,22 @@ package main import ( - "encoding/hex" - "fmt" - "maps" - "strings" - - "github.com/Peersyst/xrpl-go/xrpl" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/ledger-entry-types" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" + "encoding/hex" + "fmt" + "maps" + "strings" + + "github.com/Peersyst/xrpl-go/xrpl" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/ledger-entry-types" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" ) func main() { - fmt.Println("⏳ Connecting to testnet...") + fmt.Println("Connecting to testnet...") client := websocket.NewClient( websocket.NewClientConfig(). WithHost("wss://s.altnet.rippletest.net:51233"). @@ -30,11 +30,11 @@ func main() { } if !client.IsConnected() { - fmt.Println("❌ Failed to connect to testnet") + fmt.Println("Failed to connect to testnet") return } - fmt.Println("✅ Connected to testnet") + fmt.Println("Connected to testnet") fmt.Println() w1, err := wallet.FromSeed("sEdTtvLmJmrb7GaivhWoXRkvU4NDjVf", "") @@ -55,28 +55,28 @@ func main() { return } - fmt.Println("⏳ Funding wallets...") + fmt.Println("Funding wallets...") if err := client.FundWallet(&w1); err != nil { fmt.Println(err) return } - fmt.Println("💸 Wallet 1 funded") + fmt.Println("Wallet 1 funded") if err := client.FundWallet(&w2); err != nil { fmt.Println(err) return } - fmt.Println("💸 Wallet 2 funded") + fmt.Println("Wallet 2 funded") if err := client.FundWallet(&master); err != nil { fmt.Println(err) return } - fmt.Println("💸 Master wallet funded") + fmt.Println("Master wallet funded") fmt.Println() - fmt.Println("⏳ Setting up signer list...") + fmt.Println("Setting up signer list...") ss := &transaction.SignerListSet{ BaseTx: transaction.BaseTx{ @@ -105,34 +105,34 @@ func main() { }, } - fmt.Println("⏳ Flattening transaction...") + fmt.Println("Flattening transaction...") flatSs := ss.Flatten() - fmt.Println("⏳ Autofilling transaction...") + fmt.Println("Autofilling transaction...") if err := client.Autofill(&flatSs); err != nil { fmt.Println(err) return } - fmt.Println("⏳ Signing transaction...") + fmt.Println("Signing transaction...") blob, _, err := master.Sign(flatSs) if err != nil { fmt.Println(err) return } - fmt.Println("⏳ Submitting transaction...") + fmt.Println("Submitting transaction...") res, err := client.SubmitTxBlobAndWait(blob, false) if err != nil { fmt.Println(err) return } - fmt.Println("✅ SignerListSet transaction submitted!") - fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) + fmt.Println("SignerListSet transaction submitted!") + fmt.Printf("Hash: %s\n", res.Hash.String()) fmt.Println() - fmt.Println("⏳ Setting up AccountSet multisign transaction...") + fmt.Println("Setting up AccountSet multisign transaction...") as := &transaction.AccountSet{ BaseTx: transaction.BaseTx{ @@ -176,6 +176,6 @@ func main() { return } - fmt.Println("✅ Multisigned transaction submitted!") - fmt.Printf("🌐 Result: %s\n", mRes.EngineResult) + fmt.Println("Multisigned transaction submitted!") + fmt.Printf("Result: %s\n", mRes.EngineResult) } diff --git a/_code-samples/non-fungible-token/go/nft-accept/rpc/main.go b/_code-samples/non-fungible-token/go/nft-accept/rpc/main.go index 9b2affc0c28..611620bb277 100644 --- a/_code-samples/non-fungible-token/go/nft-accept/rpc/main.go +++ b/_code-samples/non-fungible-token/go/nft-accept/rpc/main.go @@ -1,15 +1,15 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/rpc/types" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/rpc/types" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { @@ -26,35 +26,35 @@ func main() { client := rpc.NewClient(cfg) // Step 1: Fund wallets - fmt.Println("⏳ Funding wallets...") + fmt.Println("Funding wallets...") // Create and fund the NFT minter wallet nftMinter, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println("❌ Error creating NFT minter wallet:", err) + fmt.Println("Error creating NFT minter wallet:", err) return } if err := client.FundWallet(&nftMinter); err != nil { - fmt.Println("❌ Error funding NFT minter wallet:", err) + fmt.Println("Error funding NFT minter wallet:", err) return } - fmt.Println("💸 NFT minter wallet funded!") + fmt.Println("NFT minter wallet funded!") // Create and fund the NFT buyer wallet nftBuyer, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println("❌ Error creating NFT buyer wallet:", err) + fmt.Println("Error creating NFT buyer wallet:", err) return } if err := client.FundWallet(&nftBuyer); err != nil { - fmt.Println("❌ Error funding NFT buyer wallet:", err) + fmt.Println("Error funding NFT buyer wallet:", err) return } - fmt.Println("💸 NFT buyer wallet funded!") + fmt.Println("NFT buyer wallet funded!") fmt.Println() // Step 2: Mint an NFT - fmt.Println("⏳ Minting NFT...") + fmt.Println("Minting NFT...") nftMint := transaction.NFTokenMint{ BaseTx: transaction.BaseTx{ @@ -73,36 +73,36 @@ func main() { Wallet: &nftMinter, }) if err != nil { - fmt.Println("❌ Error minting NFT:", err) + fmt.Println("Error minting NFT:", err) return } if !responseMint.Validated { - fmt.Println("❌ NFTokenMint txn is not in a validated ledger", responseMint) + fmt.Println("NFTokenMint txn is not in a validated ledger", responseMint) return } - fmt.Println("✅ NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println("NFT minted successfully! - Hash: ", responseMint.Hash) fmt.Println() // Step 3: Retrieve the NFT token offer ID - fmt.Println("⏳ Retrieving NFT offer ID...") + fmt.Println("Retrieving NFT offer ID...") metaMap, ok := responseMint.Meta.(map[string]any) if !ok { - fmt.Println("❌ Meta is not a map[string]any") + fmt.Println("Meta is not a map[string]any") return } offerID, ok := metaMap["offer_id"].(string) if !ok { - fmt.Println("❌ offer_id not found or not a string") + fmt.Println("offer_id not found or not a string") return } - fmt.Println("🌎 offer_id:", offerID) + fmt.Println("offer_id:", offerID) fmt.Println() // Step 4: Accept the NFT offer - fmt.Println("⏳ Accepting NFT offer...") + fmt.Println("Accepting NFT offer...") nftAccept := transaction.NFTokenAcceptOffer{ BaseTx: transaction.BaseTx{ @@ -117,12 +117,12 @@ func main() { Wallet: &nftBuyer, }) if err != nil { - fmt.Println("❌ Error accepting NFT offer:", err) + fmt.Println("Error accepting NFT offer:", err) return } if !response.Validated { - fmt.Println("❌ NFTokenAcceptOffer txn is not in a validated ledger", response) + fmt.Println("NFTokenAcceptOffer txn is not in a validated ledger", response) return } - fmt.Println("✅ NFT offer accepted successfully! - 🌎 Hash: ", response.Hash) + fmt.Println("NFT offer accepted successfully! - Hash: ", response.Hash) } diff --git a/_code-samples/non-fungible-token/go/nft-accept/ws/main.go b/_code-samples/non-fungible-token/go/nft-accept/ws/main.go index 2d988e6b1e2..c7837f89bb2 100644 --- a/_code-samples/non-fungible-token/go/nft-accept/ws/main.go +++ b/_code-samples/non-fungible-token/go/nft-accept/ws/main.go @@ -1,20 +1,20 @@ package main import ( - "fmt" + "fmt" - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" - "github.com/Peersyst/xrpl-go/xrpl/websocket/types" + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" + "github.com/Peersyst/xrpl-go/xrpl/websocket/types" ) func main() { // Connect to the XRPL devnet - fmt.Println("⏳ Connecting to devnet...") + fmt.Println("Connecting to devnet...") client := websocket.NewClient( websocket.NewClientConfig(). WithHost("wss://s.devnet.rippletest.net:51233"). @@ -23,47 +23,47 @@ func main() { defer client.Disconnect() if err := client.Connect(); err != nil { - fmt.Println("❌ Error connecting to devnet:", err) + fmt.Println("Error connecting to devnet:", err) return } if !client.IsConnected() { - fmt.Println("❌ Failed to connect to devnet") + fmt.Println("Failed to connect to devnet") return } - fmt.Println("✅ Connected to devnet") + fmt.Println("Connected to devnet") fmt.Println() // Fund wallets - fmt.Println("⏳ Funding wallets...") + fmt.Println("Funding wallets...") // Create and fund the NFT minter wallet nftMinter, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println("❌ Error creating NFT minter wallet:", err) + fmt.Println("Error creating NFT minter wallet:", err) return } if err := client.FundWallet(&nftMinter); err != nil { - fmt.Println("❌ Error funding NFT minter wallet:", err) + fmt.Println("Error funding NFT minter wallet:", err) return } - fmt.Println("💸 NFT minter wallet funded!") + fmt.Println("NFT minter wallet funded!") // Create and fund the NFT buyer wallet nftBuyer, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println("❌ Error creating NFT buyer wallet:", err) + fmt.Println("Error creating NFT buyer wallet:", err) return } if err := client.FundWallet(&nftBuyer); err != nil { - fmt.Println("❌ Error funding NFT buyer wallet:", err) + fmt.Println("Error funding NFT buyer wallet:", err) return } - fmt.Println("💸 NFT buyer wallet funded!") + fmt.Println("NFT buyer wallet funded!") fmt.Println() // Mint an NFT - fmt.Println("⏳ Minting NFT...") + fmt.Println("Minting NFT...") nftMint := transaction.NFTokenMint{ BaseTx: transaction.BaseTx{ Account: nftMinter.ClassicAddress, @@ -81,34 +81,34 @@ func main() { Wallet: &nftMinter, }) if err != nil { - fmt.Println("❌ Error minting NFT:", err) + fmt.Println("Error minting NFT:", err) return } if !responseMint.Validated { - fmt.Println("❌ NFTokenMint transaction is not in a validated ledger:", responseMint) + fmt.Println("NFTokenMint transaction is not in a validated ledger:", responseMint) return } - fmt.Println("✅ NFT minted successfully! - 🌎 Hash:", responseMint.Hash) + fmt.Println("NFT minted successfully! - Hash:", responseMint.Hash) fmt.Println() // Extract the NFT token offer ID from the transaction metadata - fmt.Println("⏳ Extracting offer ID...") + fmt.Println("Extracting offer ID...") metaMap, ok := responseMint.Meta.(map[string]any) if !ok { - fmt.Println("❌ Meta is not a map[string]any") + fmt.Println("Meta is not a map[string]any") return } offerID, ok := metaMap["offer_id"].(string) if !ok { - fmt.Println("❌ offer_id not found or not a string") + fmt.Println("offer_id not found or not a string") return } - fmt.Println("🌎 offer_id:", offerID) + fmt.Println("offer_id:", offerID) fmt.Println() // Accept the NFT offer - fmt.Println("⏳ Accepting NFT offer...") + fmt.Println("Accepting NFT offer...") nftAccept := transaction.NFTokenAcceptOffer{ BaseTx: transaction.BaseTx{ Account: nftBuyer.ClassicAddress, @@ -122,12 +122,12 @@ func main() { Wallet: &nftBuyer, }) if err != nil { - fmt.Println("❌ Error accepting NFT offer:", err) + fmt.Println("Error accepting NFT offer:", err) return } if !response.Validated { - fmt.Println("❌ NFTokenAcceptOffer transaction is not in a validated ledger:", response) + fmt.Println("NFTokenAcceptOffer transaction is not in a validated ledger:", response) return } - fmt.Println("✅ NFT offer accepted successfully! - 🌎 Hash:", response.Hash) + fmt.Println("NFT offer accepted successfully! - Hash:", response.Hash) } diff --git a/_code-samples/non-fungible-token/go/nft-burn/rpc/main.go b/_code-samples/non-fungible-token/go/nft-burn/rpc/main.go index 179e30d315b..5d952372529 100644 --- a/_code-samples/non-fungible-token/go/nft-burn/rpc/main.go +++ b/_code-samples/non-fungible-token/go/nft-burn/rpc/main.go @@ -1,15 +1,15 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/rpc/types" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/rpc/types" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { @@ -26,23 +26,23 @@ func main() { client := rpc.NewClient(cfg) // Step 1: Fund wallets - fmt.Println("⏳ Funding wallets...") + fmt.Println("Funding wallets...") // Create and fund the NFT minter wallet nftMinter, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println("❌ Error creating NFT minter wallet:", err) + fmt.Println("Error creating NFT minter wallet:", err) return } if err := client.FundWallet(&nftMinter); err != nil { - fmt.Println("❌ Error funding NFT minter wallet:", err) + fmt.Println("Error funding NFT minter wallet:", err) return } - fmt.Println("💸 NFT minter wallet funded!") + fmt.Println("NFT minter wallet funded!") fmt.Println() // Step 2: Mint an NFT - fmt.Println("⏳ Minting NFT...") + fmt.Println("Minting NFT...") nftMint := transaction.NFTokenMint{ BaseTx: transaction.BaseTx{ @@ -59,36 +59,36 @@ func main() { Wallet: &nftMinter, }) if err != nil { - fmt.Println("❌ Error minting NFT:", err) + fmt.Println("Error minting NFT:", err) return } if !responseMint.Validated { - fmt.Println("❌ NFTokenMint txn is not in a validated ledger", responseMint) + fmt.Println("NFTokenMint txn is not in a validated ledger", responseMint) return } - fmt.Println("✅ NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println("NFT minted successfully! - Hash: ", responseMint.Hash) fmt.Println() // Step 3: Retrieve the token ID - fmt.Println("⏳ Retrieving NFT ID...") + fmt.Println("Retrieving NFT ID...") metaMap, ok := responseMint.Meta.(map[string]any) if !ok { - fmt.Println("❌ Meta is not a map[string]any") + fmt.Println("Meta is not a map[string]any") return } nftokenID, ok := metaMap["nftoken_id"].(string) if !ok { - fmt.Println("❌ nftoken_id not found or not a string") + fmt.Println("nftoken_id not found or not a string") return } - fmt.Println("🌎 nftoken_id:", nftokenID) + fmt.Println("nftoken_id:", nftokenID) fmt.Println() // Step 4: Burn the NFT - fmt.Println("⏳ Burn the NFT...") + fmt.Println("Burn the NFT...") nftBurn := transaction.NFTokenBurn{ BaseTx: transaction.BaseTx{ @@ -103,12 +103,12 @@ func main() { Wallet: &nftMinter, }) if err != nil { - fmt.Println("❌ Error burning NFT:", err) + fmt.Println("Error burning NFT:", err) return } if !responseBurn.Validated { - fmt.Println("❌ NFTokenBurn transactiob is not in a validated ledger", responseBurn) + fmt.Println("NFTokenBurn transactiob is not in a validated ledger", responseBurn) return } - fmt.Println("✅ NFT burned successfully! - 🌎 Hash: ", responseBurn.Hash) + fmt.Println("NFT burned successfully! - Hash: ", responseBurn.Hash) } diff --git a/_code-samples/non-fungible-token/go/nft-burn/ws/main.go b/_code-samples/non-fungible-token/go/nft-burn/ws/main.go index fc6cab7ba5c..9b9c2e1e37c 100644 --- a/_code-samples/non-fungible-token/go/nft-burn/ws/main.go +++ b/_code-samples/non-fungible-token/go/nft-burn/ws/main.go @@ -1,20 +1,20 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" - "github.com/Peersyst/xrpl-go/xrpl/websocket/types" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" + "github.com/Peersyst/xrpl-go/xrpl/websocket/types" ) func main() { // Connect to the XRPL devnet - fmt.Println("⏳ Connecting to devnet...") + fmt.Println("Connecting to devnet...") client := websocket.NewClient( websocket.NewClientConfig(). WithHost("wss://s.devnet.rippletest.net:51233"). @@ -23,35 +23,35 @@ func main() { defer client.Disconnect() if err := client.Connect(); err != nil { - fmt.Println("❌ Error connecting to devnet:", err) + fmt.Println("Error connecting to devnet:", err) return } if !client.IsConnected() { - fmt.Println("❌ Failed to connect to devnet") + fmt.Println("Failed to connect to devnet") return } - fmt.Println("✅ Connected to devnet") + fmt.Println("Connected to devnet") fmt.Println() // Step 1: Fund wallets - fmt.Println("⏳ Funding wallets...") + fmt.Println("Funding wallets...") // Create and fund the NFT minter wallet nftMinter, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println("❌ Error creating NFT minter wallet:", err) + fmt.Println("Error creating NFT minter wallet:", err) return } if err := client.FundWallet(&nftMinter); err != nil { - fmt.Println("❌ Error funding NFT minter wallet:", err) + fmt.Println("Error funding NFT minter wallet:", err) return } - fmt.Println("💸 NFT minter wallet funded!") + fmt.Println("NFT minter wallet funded!") fmt.Println() // Step 2: Mint an NFT - fmt.Println("⏳ Minting NFT...") + fmt.Println("Minting NFT...") nftMint := transaction.NFTokenMint{ BaseTx: transaction.BaseTx{ @@ -68,36 +68,36 @@ func main() { Wallet: &nftMinter, }) if err != nil { - fmt.Println("❌ Error minting NFT:", err) + fmt.Println("Error minting NFT:", err) return } if !responseMint.Validated { - fmt.Println("❌ NFTokenMint txn is not in a validated ledger", responseMint) + fmt.Println("NFTokenMint txn is not in a validated ledger", responseMint) return } - fmt.Println("✅ NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println("NFT minted successfully! - Hash: ", responseMint.Hash) fmt.Println() // Step 3: Retrieve the token ID - fmt.Println("⏳ Retrieving NFT ID...") + fmt.Println("Retrieving NFT ID...") metaMap, ok := responseMint.Meta.(map[string]any) if !ok { - fmt.Println("❌ Meta is not a map[string]any") + fmt.Println("Meta is not a map[string]any") return } nftokenID, ok := metaMap["nftoken_id"].(string) if !ok { - fmt.Println("❌ nftoken_id not found or not a string") + fmt.Println("nftoken_id not found or not a string") return } - fmt.Println("🌎 nftoken_id:", nftokenID) + fmt.Println("nftoken_id:", nftokenID) fmt.Println() // Step 4: Burn the NFT - fmt.Println("⏳ Burn the NFT...") + fmt.Println("Burn the NFT...") nftBurn := transaction.NFTokenBurn{ BaseTx: transaction.BaseTx{ @@ -112,12 +112,12 @@ func main() { Wallet: &nftMinter, }) if err != nil { - fmt.Println("❌ Error burning NFT:", err) + fmt.Println("Error burning NFT:", err) return } if !responseBurn.Validated { - fmt.Println("❌ NFTokenBurn transactiob is not in a validated ledger", responseBurn) + fmt.Println("NFTokenBurn transactiob is not in a validated ledger", responseBurn) return } - fmt.Println("✅ NFT burned successfully! - 🌎 Hash: ", responseBurn.Hash) + fmt.Println("NFT burned successfully! - Hash: ", responseBurn.Hash) } diff --git a/_code-samples/non-fungible-token/go/nft-cancel/rpc/main.go b/_code-samples/non-fungible-token/go/nft-cancel/rpc/main.go index 3cdb87f7d1c..d8c8ab8a538 100644 --- a/_code-samples/non-fungible-token/go/nft-cancel/rpc/main.go +++ b/_code-samples/non-fungible-token/go/nft-cancel/rpc/main.go @@ -1,15 +1,15 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/rpc/types" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/rpc/types" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { @@ -26,22 +26,22 @@ func main() { client := rpc.NewClient(cfg) // Step 1: Fund wallet - fmt.Println("⏳ Funding wallet...") + fmt.Println("Funding wallet...") // Create and fund the NFT minter wallet nftMinter, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println("❌ Error creating NFT minter wallet:", err) + fmt.Println("Error creating NFT minter wallet:", err) return } if err := client.FundWallet(&nftMinter); err != nil { - fmt.Println("❌ Error funding NFT minter wallet:", err) + fmt.Println("Error funding NFT minter wallet:", err) return } - fmt.Println("💸 NFT minter wallet funded!") + fmt.Println("NFT minter wallet funded!") // Step 2: Mint two NFTs - fmt.Println("⏳ Minting first NFT...") + fmt.Println("Minting first NFT...") nftMint := transaction.NFTokenMint{ BaseTx: transaction.BaseTx{ @@ -58,37 +58,37 @@ func main() { Wallet: &nftMinter, }) if err != nil { - fmt.Println("❌ Error minting first NFT:", err) + fmt.Println("Error minting first NFT:", err) return } if !responseMint.Validated { - fmt.Println("❌ First NFTokenMint transaction is not in a validated ledger", responseMint) + fmt.Println("First NFTokenMint transaction is not in a validated ledger", responseMint) return } - fmt.Println("✅ First NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println("First NFT minted successfully! - Hash: ", responseMint.Hash) fmt.Println() // Step 3: Retrieve the NFT token ID - fmt.Println("⏳ Retrieving NFT ID...") + fmt.Println("Retrieving NFT ID...") metaMap, ok := responseMint.Meta.(map[string]any) if !ok { - fmt.Println("❌ Meta is not a map[string]any") + fmt.Println("Meta is not a map[string]any") return } nftokenID1, ok := metaMap["nftoken_id"].(string) if !ok { - fmt.Println("❌ nftoken_id not found or not a string") + fmt.Println("nftoken_id not found or not a string") return } - fmt.Println("🌎 nftoken_id:", nftokenID1) + fmt.Println("nftoken_id:", nftokenID1) fmt.Println() // ------ - fmt.Println("⏳ Minting second NFT...") + fmt.Println("Minting second NFT...") nftMint2 := transaction.NFTokenMint{ BaseTx: transaction.BaseTx{ @@ -105,36 +105,36 @@ func main() { Wallet: &nftMinter, }) if err != nil { - fmt.Println("❌ Error minting second NFT:", err) + fmt.Println("Error minting second NFT:", err) return } if !responseMint.Validated { - fmt.Println("❌ Second NFTokenMint transaction is not in a validated ledger", responseMint) + fmt.Println("Second NFTokenMint transaction is not in a validated ledger", responseMint) return } - fmt.Println("✅ Second NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println("Second NFT minted successfully! - Hash: ", responseMint.Hash) fmt.Println() // Step 3: Retrieve the second NFT token ID - fmt.Println("⏳ Retrieving second NFT ID...") + fmt.Println("Retrieving second NFT ID...") metaMap2, ok := responseMint2.Meta.(map[string]any) if !ok { - fmt.Println("❌ Meta is not a map[string]any") + fmt.Println("Meta is not a map[string]any") return } nftokenID2, ok := metaMap2["nftoken_id"].(string) if !ok { - fmt.Println("❌ nftoken_id not found or not a string") + fmt.Println("nftoken_id not found or not a string") return } - fmt.Println("🌎 nftoken_id:", nftokenID2) + fmt.Println("nftoken_id:", nftokenID2) fmt.Println() // Step 4: Cancel the NFT offers - fmt.Println("⏳ Canceling NFT offers...") + fmt.Println("Canceling NFT offers...") nftCancel := transaction.NFTokenCancelOffer{ BaseTx: transaction.BaseTx{ @@ -152,12 +152,12 @@ func main() { Wallet: &nftMinter, }) if err != nil { - fmt.Println("❌ Error canceling NFT offers:", err) + fmt.Println("Error canceling NFT offers:", err) return } if !response.Validated { - fmt.Println("❌ NFTokenCancelOffer transaction is not in a validated ledger", response) + fmt.Println("NFTokenCancelOffer transaction is not in a validated ledger", response) return } - fmt.Println("✅ NFT offers canceled successfully! - 🌎 Hash: ", response.Hash) + fmt.Println("NFT offers canceled successfully! - Hash: ", response.Hash) } diff --git a/_code-samples/non-fungible-token/go/nft-cancel/ws/main.go b/_code-samples/non-fungible-token/go/nft-cancel/ws/main.go index 784d105ef3c..2aefccb49af 100644 --- a/_code-samples/non-fungible-token/go/nft-cancel/ws/main.go +++ b/_code-samples/non-fungible-token/go/nft-cancel/ws/main.go @@ -1,20 +1,20 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" - "github.com/Peersyst/xrpl-go/xrpl/websocket/types" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" + "github.com/Peersyst/xrpl-go/xrpl/websocket/types" ) func main() { // Connect to the XRPL devnet - fmt.Println("⏳ Connecting to devnet...") + fmt.Println("Connecting to devnet...") client := websocket.NewClient( websocket.NewClientConfig(). WithHost("wss://s.devnet.rippletest.net:51233"). @@ -23,34 +23,34 @@ func main() { defer client.Disconnect() if err := client.Connect(); err != nil { - fmt.Println("❌ Error connecting to devnet:", err) + fmt.Println("Error connecting to devnet:", err) return } if !client.IsConnected() { - fmt.Println("❌ Failed to connect to devnet") + fmt.Println("Failed to connect to devnet") return } - fmt.Println("✅ Connected to devnet") + fmt.Println("Connected to devnet") fmt.Println() // Step 1: Fund wallet - fmt.Println("⏳ Funding wallet...") + fmt.Println("Funding wallet...") // Create and fund the NFT minter wallet nftMinter, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println("❌ Error creating NFT minter wallet:", err) + fmt.Println("Error creating NFT minter wallet:", err) return } if err := client.FundWallet(&nftMinter); err != nil { - fmt.Println("❌ Error funding NFT minter wallet:", err) + fmt.Println("Error funding NFT minter wallet:", err) return } - fmt.Println("💸 NFT minter wallet funded!") + fmt.Println("NFT minter wallet funded!") // Step 2: Mint two NFTs - fmt.Println("⏳ Minting first NFT...") + fmt.Println("Minting first NFT...") nftMint := transaction.NFTokenMint{ BaseTx: transaction.BaseTx{ @@ -67,37 +67,37 @@ func main() { Wallet: &nftMinter, }) if err != nil { - fmt.Println("❌ Error minting first NFT:", err) + fmt.Println("Error minting first NFT:", err) return } if !responseMint.Validated { - fmt.Println("❌ First NFTokenMint transaction is not in a validated ledger", responseMint) + fmt.Println("First NFTokenMint transaction is not in a validated ledger", responseMint) return } - fmt.Println("✅ First NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println("First NFT minted successfully! - Hash: ", responseMint.Hash) fmt.Println() // Step 3: Retrieve the NFT token ID - fmt.Println("⏳ Retrieving NFT ID...") + fmt.Println("Retrieving NFT ID...") metaMap, ok := responseMint.Meta.(map[string]any) if !ok { - fmt.Println("❌ Meta is not a map[string]any") + fmt.Println("Meta is not a map[string]any") return } nftokenID1, ok := metaMap["nftoken_id"].(string) if !ok { - fmt.Println("❌ nftoken_id not found or not a string") + fmt.Println("nftoken_id not found or not a string") return } - fmt.Println("🌎 nftoken_id:", nftokenID1) + fmt.Println("nftoken_id:", nftokenID1) fmt.Println() // ------ - fmt.Println("⏳ Minting second NFT...") + fmt.Println("Minting second NFT...") nftMint2 := transaction.NFTokenMint{ BaseTx: transaction.BaseTx{ @@ -114,36 +114,36 @@ func main() { Wallet: &nftMinter, }) if err != nil { - fmt.Println("❌ Error minting second NFT:", err) + fmt.Println("Error minting second NFT:", err) return } if !responseMint.Validated { - fmt.Println("❌ Second NFTokenMint transaction is not in a validated ledger", responseMint) + fmt.Println("Second NFTokenMint transaction is not in a validated ledger", responseMint) return } - fmt.Println("✅ Second NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println("Second NFT minted successfully! - Hash: ", responseMint.Hash) fmt.Println() // Step 3: Retrieve the second NFT token ID - fmt.Println("⏳ Retrieving second NFT ID...") + fmt.Println("Retrieving second NFT ID...") metaMap2, ok := responseMint2.Meta.(map[string]any) if !ok { - fmt.Println("❌ Meta is not a map[string]any") + fmt.Println("Meta is not a map[string]any") return } nftokenID2, ok := metaMap2["nftoken_id"].(string) if !ok { - fmt.Println("❌ nftoken_id not found or not a string") + fmt.Println("nftoken_id not found or not a string") return } - fmt.Println("🌎 nftoken_id:", nftokenID2) + fmt.Println("nftoken_id:", nftokenID2) fmt.Println() // Step 4: Cancel the NFT offers - fmt.Println("⏳ Canceling NFT offers...") + fmt.Println("Canceling NFT offers...") nftCancel := transaction.NFTokenCancelOffer{ BaseTx: transaction.BaseTx{ @@ -161,12 +161,12 @@ func main() { Wallet: &nftMinter, }) if err != nil { - fmt.Println("❌ Error canceling NFT offers:", err) + fmt.Println("Error canceling NFT offers:", err) return } if !response.Validated { - fmt.Println("❌ NFTokenCancelOffer transaction is not in a validated ledger", response) + fmt.Println("NFTokenCancelOffer transaction is not in a validated ledger", response) return } - fmt.Println("✅ NFT offers canceled successfully! - 🌎 Hash: ", response.Hash) + fmt.Println("NFT offers canceled successfully! - Hash: ", response.Hash) } diff --git a/_code-samples/non-fungible-token/go/nft-modify/rpc/main.go b/_code-samples/non-fungible-token/go/nft-modify/rpc/main.go index d9161805b17..e4346b87d51 100644 --- a/_code-samples/non-fungible-token/go/nft-modify/rpc/main.go +++ b/_code-samples/non-fungible-token/go/nft-modify/rpc/main.go @@ -1,15 +1,15 @@ package main import ( - "fmt" + "fmt" - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/rpc/types" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/rpc/types" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { @@ -24,19 +24,19 @@ func main() { client := rpc.NewClient(cfg) fmt.Println() - fmt.Println("⏳ Funding wallet...") + fmt.Println("Funding wallet...") // Create and fund the nft wallet nftWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println("❌ Error creating nft wallet:", err) + fmt.Println("Error creating nft wallet:", err) return } if err := client.FundWallet(&nftWallet); err != nil { - fmt.Println("❌ Error funding nft wallet:", err) + fmt.Println("Error funding nft wallet:", err) return } - fmt.Println("💸 NFT wallet funded! - #️⃣: ", nftWallet.ClassicAddress) + fmt.Println("NFT wallet funded: ", nftWallet.ClassicAddress) fmt.Println() // Mint NFT @@ -56,29 +56,29 @@ func main() { Wallet: &nftWallet, }) if err != nil { - fmt.Println("❌ Error minting NFT:", err) + fmt.Println("Error minting NFT:", err) return } if !responseMint.Validated { - fmt.Println("❌ NFTokenMint txn is not in a validated ledger", responseMint) + fmt.Println("NFTokenMint txn is not in a validated ledger", responseMint) return } - fmt.Println("✅ NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println("NFT minted successfully! - Hash: ", responseMint.Hash) fmt.Println() metaMap, ok := responseMint.Meta.(map[string]any) if !ok { - fmt.Println("❌ Meta is not a map[string]any") + fmt.Println("Meta is not a map[string]any") return } nftokenID, ok := metaMap["nftoken_id"].(string) if !ok { - fmt.Println("❌ nftoken_id not found or not a string") + fmt.Println("nftoken_id not found or not a string") return } - fmt.Println("🌎 nftoken_id:", nftokenID) + fmt.Println("nftoken_id:", nftokenID) fmt.Println() // Update NFT @@ -96,12 +96,12 @@ func main() { Wallet: &nftWallet, }) if err != nil { - fmt.Println("❌ Error modifying NFT:", err) + fmt.Println("Error modifying NFT:", err) return } if !responseModify.Validated { - fmt.Println("❌ NFTokenModify txn is not in a validated ledger", responseModify) + fmt.Println("NFTokenModify txn is not in a validated ledger", responseModify) return } - fmt.Println("✅ NFT URI modified successfully! - 🌎 Hash: ", responseModify.Hash) + fmt.Println("NFT URI modified successfully! - Hash: ", responseModify.Hash) } diff --git a/_code-samples/non-fungible-token/go/nft-modify/ws/main.go b/_code-samples/non-fungible-token/go/nft-modify/ws/main.go index 328682130ab..f51e8faa1a9 100644 --- a/_code-samples/non-fungible-token/go/nft-modify/ws/main.go +++ b/_code-samples/non-fungible-token/go/nft-modify/ws/main.go @@ -1,19 +1,19 @@ package main import ( - "fmt" + "fmt" - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" - "github.com/Peersyst/xrpl-go/xrpl/websocket/types" + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" + "github.com/Peersyst/xrpl-go/xrpl/websocket/types" ) func main() { - fmt.Println("⏳ Connecting to devnet...") + fmt.Println("Connecting to devnet...") client := websocket.NewClient( websocket.NewClientConfig(). WithHost("wss://s.devnet.rippletest.net:51233"). @@ -28,25 +28,25 @@ func main() { } if !client.IsConnected() { - fmt.Println("❌ Failed to connect to devnet") + fmt.Println("Failed to connect to devnet") return } - fmt.Println("✅ Connected to devnet") + fmt.Println("Connected to devnet") fmt.Println() // Create and fund the nft wallet - fmt.Println("⏳ Funding wallet...") + fmt.Println("Funding wallet...") nftWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println("❌ Error creating nft wallet:", err) + fmt.Println("Error creating nft wallet:", err) return } if err := client.FundWallet(&nftWallet); err != nil { - fmt.Println("❌ Error funding nft wallet:", err) + fmt.Println("Error funding nft wallet:", err) return } - fmt.Println("💸 NFT wallet funded!") + fmt.Println("NFT wallet funded!") fmt.Println() // Mint NFT @@ -66,29 +66,29 @@ func main() { Wallet: &nftWallet, }) if err != nil { - fmt.Println("❌ Error minting NFT:", err) + fmt.Println("Error minting NFT:", err) return } if !responseMint.Validated { - fmt.Println("❌ NFTokenMint txn is not in a validated ledger", responseMint) + fmt.Println("NFTokenMint txn is not in a validated ledger", responseMint) return } - fmt.Println("✅ NFT minted successfully! - 🌎 Hash: ", responseMint.Hash) + fmt.Println("NFT minted successfully! - Hash: ", responseMint.Hash) fmt.Println() metaMap, ok := responseMint.Meta.(map[string]any) if !ok { - fmt.Println("❌ Meta is not a map[string]any") + fmt.Println("Meta is not a map[string]any") return } nftokenID, ok := metaMap["nftoken_id"].(string) if !ok { - fmt.Println("❌ nftoken_id not found or not a string") + fmt.Println("nftoken_id not found or not a string") return } - fmt.Println("🌎 nftoken_id:", nftokenID) + fmt.Println("nftoken_id:", nftokenID) fmt.Println() // Update NFT @@ -106,12 +106,12 @@ func main() { Wallet: &nftWallet, }) if err != nil { - fmt.Println("❌ Error modifying NFT:", err) + fmt.Println("Error modifying NFT:", err) return } if !responseModify.Validated { - fmt.Println("❌ NFTokenModify txn is not in a validated ledger", responseModify) + fmt.Println("NFTokenModify txn is not in a validated ledger", responseModify) return } - fmt.Println("✅ NFT URI modified successfully! - 🌎 Hash: ", responseModify.Hash) + fmt.Println("NFT URI modified successfully! - Hash: ", responseModify.Hash) } diff --git a/_code-samples/partial-payment/go/rpc/main.go b/_code-samples/partial-payment/go/rpc/main.go index 09436459c72..b58dc13a7f1 100644 --- a/_code-samples/partial-payment/go/rpc/main.go +++ b/_code-samples/partial-payment/go/rpc/main.go @@ -1,15 +1,15 @@ package main import ( - "fmt" - "time" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "fmt" + "time" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { @@ -23,7 +23,7 @@ func main() { client := rpc.NewClient(cfg) - fmt.Println("⏳ Funding wallets...") + fmt.Println("Funding wallets...") w1, err := wallet.New(crypto.ED25519()) if err != nil { fmt.Println(err) @@ -40,18 +40,18 @@ func main() { return } - fmt.Println("💸 Wallet 1 funded") + fmt.Println("Wallet 1 funded") if err := client.FundWallet(&w2); err != nil { fmt.Println(err) return } - fmt.Println("💸 Wallet 2 funded") + fmt.Println("Wallet 2 funded") fmt.Println() time.Sleep(5 * time.Second) - fmt.Println("⏳ Sending TrustSet transaction...") + fmt.Println("Sending TrustSet transaction...") ts := &transaction.TrustSet{ BaseTx: transaction.BaseTx{ Account: w2.ClassicAddress, @@ -83,12 +83,12 @@ func main() { return } - fmt.Println("✅ TrustSet transaction submitted!") - fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) - fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println("TrustSet transaction submitted!") + fmt.Printf("Hash: %s\n", res.Hash.String()) + fmt.Printf("Validated: %t\n", res.Validated) fmt.Println() - fmt.Println("⏳ Issuing tokens for wallet 2...") + fmt.Println("Issuing tokens for wallet 2...") p := &transaction.Payment{ BaseTx: transaction.BaseTx{ Account: w1.GetAddress(), @@ -121,12 +121,12 @@ func main() { return } - fmt.Println("✅ Payment transaction submitted!") - fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) - fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println("Payment transaction submitted!") + fmt.Printf("Hash: %s\n", res.Hash.String()) + fmt.Printf("Validated: %t\n", res.Validated) fmt.Println() - fmt.Println("⏳ Submitting Partial Payment transaction...") + fmt.Println("Submitting Partial Payment transaction...") pp := &transaction.Payment{ BaseTx: transaction.BaseTx{ Account: w2.GetAddress(), @@ -161,8 +161,8 @@ func main() { return } - fmt.Println("✅ Partial Payment transaction submitted!") - fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) - fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println("Partial Payment transaction submitted!") + fmt.Printf("Hash: %s\n", res.Hash.String()) + fmt.Printf("Validated: %t\n", res.Validated) fmt.Println() } diff --git a/_code-samples/partial-payment/go/ws/main.go b/_code-samples/partial-payment/go/ws/main.go index 1c877b39a73..6d43e7e54eb 100644 --- a/_code-samples/partial-payment/go/ws/main.go +++ b/_code-samples/partial-payment/go/ws/main.go @@ -1,19 +1,19 @@ package main import ( - "fmt" - "time" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" + "fmt" + "time" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" ) func main() { - fmt.Println("⏳ Connecting to testnet...") + fmt.Println("Connecting to testnet...") client := websocket.NewClient( websocket.NewClientConfig(). WithHost("wss://s.altnet.rippletest.net:51233"). @@ -27,14 +27,14 @@ func main() { } if !client.IsConnected() { - fmt.Println("❌ Failed to connect to testnet") + fmt.Println("Failed to connect to testnet") return } - fmt.Println("✅ Connected to testnet") + fmt.Println("Connected to testnet") fmt.Println() - fmt.Println("⏳ Funding wallets...") + fmt.Println("Funding wallets...") w1, err := wallet.New(crypto.ED25519()) if err != nil { fmt.Println(err) @@ -51,18 +51,18 @@ func main() { return } - fmt.Println("💸 Wallet 1 funded") + fmt.Println("Wallet 1 funded") if err := client.FundWallet(&w2); err != nil { fmt.Println(err) return } - fmt.Println("💸 Wallet 2 funded") + fmt.Println("Wallet 2 funded") fmt.Println() time.Sleep(5 * time.Second) - fmt.Println("⏳ Sending TrustSet transaction...") + fmt.Println("Sending TrustSet transaction...") ts := &transaction.TrustSet{ BaseTx: transaction.BaseTx{ Account: w2.ClassicAddress, @@ -94,12 +94,12 @@ func main() { return } - fmt.Println("✅ TrustSet transaction submitted!") - fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) - fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println("TrustSet transaction submitted!") + fmt.Printf("Hash: %s\n", res.Hash.String()) + fmt.Printf("Validated: %t\n", res.Validated) fmt.Println() - fmt.Println("⏳ Issuing tokens for wallet 2...") + fmt.Println("Issuing tokens for wallet 2...") p := &transaction.Payment{ BaseTx: transaction.BaseTx{ Account: w1.GetAddress(), @@ -132,12 +132,12 @@ func main() { return } - fmt.Println("✅ Payment transaction submitted!") - fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) - fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println("Payment transaction submitted!") + fmt.Printf("Hash: %s\n", res.Hash.String()) + fmt.Printf("Validated: %t\n", res.Validated) fmt.Println() - fmt.Println("⏳ Submitting Partial Payment transaction...") + fmt.Println("Submitting Partial Payment transaction...") pp := &transaction.Payment{ BaseTx: transaction.BaseTx{ Account: w2.GetAddress(), @@ -172,8 +172,8 @@ func main() { return } - fmt.Println("✅ Partial Payment transaction submitted!") - fmt.Printf("🌐 Hash: %s\n", res.Hash.String()) - fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println("Partial Payment transaction submitted!") + fmt.Printf("Hash: %s\n", res.Hash.String()) + fmt.Printf("Validated: %t\n", res.Validated) fmt.Println() } diff --git a/_code-samples/paths/go/rpc/main.go b/_code-samples/paths/go/rpc/main.go index 6a74e1b65dd..8b31b038ff3 100644 --- a/_code-samples/paths/go/rpc/main.go +++ b/_code-samples/paths/go/rpc/main.go @@ -1,17 +1,17 @@ package main import ( - "fmt" + "fmt" - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/queries/path" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/queries/path" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" - pathtypes "github.com/Peersyst/xrpl-go/xrpl/queries/path/types" + pathtypes "github.com/Peersyst/xrpl-go/xrpl/queries/path/types" ) const ( @@ -43,16 +43,16 @@ func main() { return } - fmt.Println("⏳ Funding wallet...") + fmt.Println("Funding wallet...") if err := client.FundWallet(&wallet); err != nil { fmt.Println(err) return } - fmt.Println("💸 Wallet funded") + fmt.Println("Wallet funded") fmt.Println() - fmt.Println("⏳ Getting paths...") + fmt.Println("Getting paths...") res, err := client.GetRipplePathFind(&path.RipplePathFindRequest{ SourceAccount: wallet.GetAddress(), SourceCurrencies: []pathtypes.RipplePathFindCurrency{ @@ -68,15 +68,15 @@ func main() { return } - fmt.Printf("🌐 Computed paths: %d\n", len(res.Alternatives)) + fmt.Printf("Computed paths: %d\n", len(res.Alternatives)) fmt.Println() if len(res.Alternatives) == 0 { - fmt.Println("❌ No alternatives found") + fmt.Println("No alternatives found") return } - fmt.Println("⏳ Submitting Payment through path: ", res.Alternatives[0].PathsComputed) + fmt.Println("Submitting Payment through path: ", res.Alternatives[0].PathsComputed) p := &transaction.Payment{ BaseTx: transaction.BaseTx{ Account: wallet.GetAddress(), @@ -105,7 +105,7 @@ func main() { return } - fmt.Println("✅ Payment submitted") - fmt.Printf("🌐 Hash: %s\n", hash) - fmt.Printf("🌐 Validated: %t\n", txRes.Validated) + fmt.Println("Payment submitted") + fmt.Printf("Hash: %s\n", hash) + fmt.Printf("Validated: %t\n", txRes.Validated) } diff --git a/_code-samples/paths/go/ws/main.go b/_code-samples/paths/go/ws/main.go index 3049a1aeda4..680acdeee75 100644 --- a/_code-samples/paths/go/ws/main.go +++ b/_code-samples/paths/go/ws/main.go @@ -1,17 +1,17 @@ package main import ( - "fmt" + "fmt" - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/queries/path" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/queries/path" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" - pathtypes "github.com/Peersyst/xrpl-go/xrpl/queries/path/types" + pathtypes "github.com/Peersyst/xrpl-go/xrpl/queries/path/types" ) const ( @@ -27,7 +27,7 @@ var ( ) func main() { - fmt.Println("⏳ Connecting to testnet...") + fmt.Println("Connecting to testnet...") client := websocket.NewClient( websocket.NewClientConfig(). WithHost("wss://s.altnet.rippletest.net:51233"). @@ -41,11 +41,11 @@ func main() { } if !client.IsConnected() { - fmt.Println("❌ Failed to connect to testnet") + fmt.Println("Failed to connect to testnet") return } - fmt.Println("✅ Connected to testnet") + fmt.Println("Connected to testnet") fmt.Println() wallet, err := wallet.New(crypto.ED25519()) @@ -54,16 +54,16 @@ func main() { return } - fmt.Println("⏳ Funding wallet...") + fmt.Println("Funding wallet...") if err := client.FundWallet(&wallet); err != nil { fmt.Println(err) return } - fmt.Println("💸 Wallet funded") + fmt.Println("Wallet funded") fmt.Println() - fmt.Println("⏳ Getting paths...") + fmt.Println("Getting paths...") res, err := client.GetRipplePathFind(&path.RipplePathFindRequest{ SourceAccount: wallet.GetAddress(), SourceCurrencies: []pathtypes.RipplePathFindCurrency{ @@ -79,15 +79,15 @@ func main() { return } - fmt.Printf("🌐 Computed paths: %d\n", len(res.Alternatives)) + fmt.Printf("Computed paths: %d\n", len(res.Alternatives)) fmt.Println() if len(res.Alternatives) == 0 { - fmt.Println("❌ No alternatives found") + fmt.Println("No alternatives found") return } - fmt.Println("⏳ Submitting Payment through path: ", res.Alternatives[0].PathsComputed) + fmt.Println("Submitting Payment through path: ", res.Alternatives[0].PathsComputed) p := &transaction.Payment{ BaseTx: transaction.BaseTx{ Account: wallet.GetAddress(), @@ -116,7 +116,7 @@ func main() { return } - fmt.Println("✅ Payment submitted") - fmt.Printf("🌐 Hash: %s\n", hash) - fmt.Printf("🌐 Validated: %t\n", txRes.Validated) + fmt.Println("Payment submitted") + fmt.Printf("Hash: %s\n", hash) + fmt.Printf("Validated: %t\n", txRes.Validated) } diff --git a/_code-samples/send-a-memo/go/rpc/main.go b/_code-samples/send-a-memo/go/rpc/main.go index 0272103f108..fa32f26bf5a 100644 --- a/_code-samples/send-a-memo/go/rpc/main.go +++ b/_code-samples/send-a-memo/go/rpc/main.go @@ -1,16 +1,16 @@ package main import ( - "encoding/hex" - "fmt" - "strconv" - - "github.com/Peersyst/xrpl-go/xrpl/currency" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "encoding/hex" + "fmt" + "strconv" + + "github.com/Peersyst/xrpl-go/xrpl/currency" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { @@ -39,18 +39,18 @@ func main() { balance, err := client.GetXrpBalance(w.GetAddress()) if err != nil || balance == "0" { - fmt.Println("⏳ Funding wallet...") + fmt.Println("Funding wallet...") err = client.FundWallet(&w) if err != nil { fmt.Println(err) return } - fmt.Println("💸 Wallet funded") + fmt.Println("Wallet funded") } balance, _ = client.GetXrpBalance(w.GetAddress()) - fmt.Printf("💸 Balance: %s\n", balance) + fmt.Printf("Balance: %s\n", balance) amount, err := currency.XrpToDrops("1") if err != nil { @@ -64,7 +64,7 @@ func main() { return } - fmt.Println("⏳ Sending payment...") + fmt.Println("Sending payment...") payment := transactions.Payment{ BaseTx: transactions.BaseTx{ Account: types.Address(w.GetAddress()), @@ -109,7 +109,7 @@ func main() { return } - fmt.Println("✅ Payment submitted") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Printf("🌐 Validated: %t\n", response.Validated) + fmt.Println("Payment submitted") + fmt.Printf("Hash: %s\n", response.Hash.String()) + fmt.Printf("Validated: %t\n", response.Validated) } diff --git a/_code-samples/send-a-memo/go/ws/main.go b/_code-samples/send-a-memo/go/ws/main.go index 69b07be3805..30daaf0dac1 100644 --- a/_code-samples/send-a-memo/go/ws/main.go +++ b/_code-samples/send-a-memo/go/ws/main.go @@ -1,16 +1,16 @@ package main import ( - "encoding/hex" - "fmt" - "strconv" - - "github.com/Peersyst/xrpl-go/xrpl/currency" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" + "encoding/hex" + "fmt" + "strconv" + + "github.com/Peersyst/xrpl-go/xrpl/currency" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + transactions "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" ) func main() { @@ -33,30 +33,30 @@ func main() { ) defer client.Disconnect() - fmt.Println("⏳ Connecting to server...") + fmt.Println("Connecting to server...") if err := client.Connect(); err != nil { fmt.Println(err) return } - fmt.Println("✅ Connected to server") + fmt.Println("Connected to server") fmt.Println() balance, err := client.GetXrpBalance(w.GetAddress()) if err != nil || balance == "0" { - fmt.Println("⏳ Funding wallet...") + fmt.Println("Funding wallet...") err = client.FundWallet(&w) if err != nil { fmt.Println(err) return } - fmt.Println("💸 Wallet funded") + fmt.Println("Wallet funded") } balance, _ = client.GetXrpBalance(w.GetAddress()) - fmt.Printf("💸 Balance: %s\n", balance) + fmt.Printf("Balance: %s\n", balance) amount, err := currency.XrpToDrops("1") if err != nil { @@ -70,7 +70,7 @@ func main() { return } - fmt.Println("⏳ Sending payment...") + fmt.Println("Sending payment...") payment := transactions.Payment{ BaseTx: transactions.BaseTx{ Account: types.Address(w.GetAddress()), @@ -115,7 +115,7 @@ func main() { return } - fmt.Println("✅ Payment submitted") - fmt.Printf("🌐 Hash: %s\n", response.Hash.String()) - fmt.Printf("🌐 Validated: %t\n", response.Validated) + fmt.Println("Payment submitted") + fmt.Printf("Hash: %s\n", response.Hash.String()) + fmt.Printf("Validated: %t\n", response.Validated) } diff --git a/_code-samples/send-xrp/go/rpc/main.go b/_code-samples/send-xrp/go/rpc/main.go index 7081d4b21bd..651b36e5612 100644 --- a/_code-samples/send-xrp/go/rpc/main.go +++ b/_code-samples/send-xrp/go/rpc/main.go @@ -1,17 +1,17 @@ package main import ( - "fmt" - "strconv" + "fmt" + "strconv" - "github.com/Peersyst/xrpl-go/xrpl/currency" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/currency" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" - rpctypes "github.com/Peersyst/xrpl-go/xrpl/rpc/types" + rpctypes "github.com/Peersyst/xrpl-go/xrpl/rpc/types" ) const ( @@ -38,13 +38,13 @@ func main() { return } - fmt.Println("⏳ Funding wallet...") + fmt.Println("Funding wallet...") if err := client.FundWallet(&w); err != nil { fmt.Println(err) return } - fmt.Println("💸 Wallet funded") + fmt.Println("Wallet funded") fmt.Println() xrpAmount, err := currency.XrpToDrops("1") @@ -59,7 +59,7 @@ func main() { return } - fmt.Println("⏳ Sending 1 XRP to rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe...") + fmt.Println("Sending 1 XRP to rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe...") p := &transaction.Payment{ BaseTx: transaction.BaseTx{ Account: types.Address(w.GetAddress()), @@ -88,11 +88,11 @@ func main() { return } - fmt.Println("✅ Payment submitted") - fmt.Printf("🌐 Hash: %s\n", res.Hash) - fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println("Payment submitted") + fmt.Printf("Hash: %s\n", res.Hash) + fmt.Printf("Validated: %t\n", res.Validated) fmt.Println() - fmt.Println("⏳ Using SubmitTxAndWait with wallet") + fmt.Println("Using SubmitTxAndWait with wallet") fmt.Println() flattenedTx2 := p.Flatten() @@ -105,7 +105,7 @@ func main() { return } - fmt.Println("✅ Payment submitted via SubmitTxAndWait") - fmt.Printf("🌐 Hash: %s\n", resp.Hash) - fmt.Printf("🌐 Validated: %t\n", resp.Validated) + fmt.Println("Payment submitted via SubmitTxAndWait") + fmt.Printf("Hash: %s\n", resp.Hash) + fmt.Printf("Validated: %t\n", resp.Validated) } diff --git a/_code-samples/send-xrp/go/ws/main.go b/_code-samples/send-xrp/go/ws/main.go index d154a9e61a3..07b1870e443 100644 --- a/_code-samples/send-xrp/go/ws/main.go +++ b/_code-samples/send-xrp/go/ws/main.go @@ -1,17 +1,17 @@ package main import ( - "fmt" - "strconv" - - "github.com/Peersyst/xrpl-go/xrpl/currency" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/queries/transactions" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" - wstypes "github.com/Peersyst/xrpl-go/xrpl/websocket/types" + "fmt" + "strconv" + + "github.com/Peersyst/xrpl-go/xrpl/currency" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/queries/transactions" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" + wstypes "github.com/Peersyst/xrpl-go/xrpl/websocket/types" ) func main() { @@ -28,11 +28,11 @@ if err := client.Connect(); err != nil { } if !client.IsConnected() { - fmt.Println("❌ Failed to connect to testnet") + fmt.Println("Failed to connect to testnet") return } -fmt.Println("✅ Connected to testnet") +fmt.Println("Connected to testnet") fmt.Println() // Example credentials @@ -44,13 +44,13 @@ if err != nil { } // Funding the wallet -fmt.Println("⏳ Funding wallet...") +fmt.Println("Funding wallet...") if err := client.FundWallet(&w); err != nil { fmt.Println(err) return } -fmt.Println("💸 Wallet funded") +fmt.Println("Wallet funded") fmt.Println() xrpAmount, err := currency.XrpToDrops("1") @@ -110,10 +110,10 @@ if err != nil { // SubmitTxBlobAndWait() handles this automatically, but it can take 4-7s. // Check transaction results ------------------------------------------------- -fmt.Printf("🌐 Hash: %s\n", res_blob.Hash) -fmt.Printf("🌐 Meta: %t\n", res_blob.Meta) +fmt.Printf("Hash: %s\n", res_blob.Hash) +fmt.Printf("Meta: %t\n", res_blob.Meta) res, _ := client.Request(&transactions.TxRequest{ Transaction: res_flat.Hash.String(), }) -fmt.Printf("🌐 Result: %s\n", res.Result) +fmt.Printf("Result: %s\n", res.Result) } diff --git a/_code-samples/set-regular-key/go/rpc/main.go b/_code-samples/set-regular-key/go/rpc/main.go index f4cd3c55693..2b476955268 100644 --- a/_code-samples/set-regular-key/go/rpc/main.go +++ b/_code-samples/set-regular-key/go/rpc/main.go @@ -1,14 +1,14 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { @@ -40,30 +40,30 @@ func main() { return } - fmt.Println("⏳ Funding wallets...") + fmt.Println("Funding wallets...") if err := client.FundWallet(&w1); err != nil { fmt.Println(err) return } - fmt.Println("💸 Wallet 1 funded") + fmt.Println("Wallet 1 funded") if err := client.FundWallet(&w2); err != nil { fmt.Println(err) return } - fmt.Println("💸 Wallet 2 funded") + fmt.Println("Wallet 2 funded") if err := client.FundWallet(®ularKeyWallet); err != nil { fmt.Println(err) return } - fmt.Println("💸 Regular key wallet funded") + fmt.Println("Regular key wallet funded") fmt.Println() - fmt.Println("⏳ Setting regular key...") + fmt.Println("Setting regular key...") rk := &transaction.SetRegularKey{ BaseTx: transaction.BaseTx{ Account: w1.GetAddress(), @@ -91,12 +91,12 @@ func main() { return } - fmt.Println("✅ SetRegularKey transaction submitted") - fmt.Printf("🌐 Hash: %s\n", res.Hash) - fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println("SetRegularKey transaction submitted") + fmt.Printf("Hash: %s\n", res.Hash) + fmt.Printf("Validated: %t\n", res.Validated) fmt.Println() - fmt.Println("⏳ Checking if regular key is set...") + fmt.Println("Checking if regular key is set...") p := &transaction.Payment{ BaseTx: transaction.BaseTx{ Account: w1.GetAddress(), @@ -125,7 +125,7 @@ func main() { return } - fmt.Println("✅ Payment transaction submitted") - fmt.Printf("🌐 Hash: %s\n", res.Hash) - fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println("Payment transaction submitted") + fmt.Printf("Hash: %s\n", res.Hash) + fmt.Printf("Validated: %t\n", res.Validated) } diff --git a/_code-samples/set-regular-key/go/ws/main.go b/_code-samples/set-regular-key/go/ws/main.go index 8f1416a59fd..7c7c26ca343 100644 --- a/_code-samples/set-regular-key/go/ws/main.go +++ b/_code-samples/set-regular-key/go/ws/main.go @@ -1,18 +1,18 @@ package main import ( - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/transaction/types" - "github.com/Peersyst/xrpl-go/xrpl/wallet" - "github.com/Peersyst/xrpl-go/xrpl/websocket" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/transaction/types" + "github.com/Peersyst/xrpl-go/xrpl/wallet" + "github.com/Peersyst/xrpl-go/xrpl/websocket" ) func main() { - fmt.Println("⏳ Connecting to testnet...") + fmt.Println("Connecting to testnet...") client := websocket.NewClient( websocket.NewClientConfig(). WithHost("wss://s.altnet.rippletest.net:51233"). @@ -26,11 +26,11 @@ func main() { } if !client.IsConnected() { - fmt.Println("❌ Failed to connect to testnet") + fmt.Println("Failed to connect to testnet") return } - fmt.Println("✅ Connected to testnet") + fmt.Println("Connected to testnet") fmt.Println() w1, err := wallet.New(crypto.ED25519()) @@ -51,30 +51,30 @@ func main() { return } - fmt.Println("⏳ Funding wallets...") + fmt.Println("Funding wallets...") if err := client.FundWallet(&w1); err != nil { fmt.Println(err) return } - fmt.Println("💸 Wallet 1 funded") + fmt.Println("Wallet 1 funded") if err := client.FundWallet(&w2); err != nil { fmt.Println(err) return } - fmt.Println("💸 Wallet 2 funded") + fmt.Println("Wallet 2 funded") if err := client.FundWallet(®ularKeyWallet); err != nil { fmt.Println(err) return } - fmt.Println("💸 Regular key wallet funded") + fmt.Println("Regular key wallet funded") fmt.Println() - fmt.Println("⏳ Setting regular key...") + fmt.Println("Setting regular key...") rk := &transaction.SetRegularKey{ BaseTx: transaction.BaseTx{ Account: w1.GetAddress(), @@ -102,12 +102,12 @@ func main() { return } - fmt.Println("✅ SetRegularKey transaction submitted") - fmt.Printf("🌐 Hash: %s\n", res.Hash) - fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println("SetRegularKey transaction submitted") + fmt.Printf("Hash: %s\n", res.Hash) + fmt.Printf("Validated: %t\n", res.Validated) fmt.Println() - fmt.Println("⏳ Checking if regular key is set...") + fmt.Println("Checking if regular key is set...") p := &transaction.Payment{ BaseTx: transaction.BaseTx{ Account: w1.GetAddress(), @@ -136,7 +136,7 @@ func main() { return } - fmt.Println("✅ Payment transaction submitted") - fmt.Printf("🌐 Hash: %s\n", res.Hash) - fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println("Payment transaction submitted") + fmt.Printf("Hash: %s\n", res.Hash) + fmt.Printf("Validated: %t\n", res.Validated) } diff --git a/_code-samples/use-tickets/go/main.go b/_code-samples/use-tickets/go/main.go index e56852c85a5..2561aae1983 100644 --- a/_code-samples/use-tickets/go/main.go +++ b/_code-samples/use-tickets/go/main.go @@ -1,15 +1,15 @@ package main import ( - "encoding/json" - "fmt" - - "github.com/Peersyst/xrpl-go/pkg/crypto" - "github.com/Peersyst/xrpl-go/xrpl/faucet" - "github.com/Peersyst/xrpl-go/xrpl/queries/account" - "github.com/Peersyst/xrpl-go/xrpl/rpc" - "github.com/Peersyst/xrpl-go/xrpl/transaction" - "github.com/Peersyst/xrpl-go/xrpl/wallet" + "encoding/json" + "fmt" + + "github.com/Peersyst/xrpl-go/pkg/crypto" + "github.com/Peersyst/xrpl-go/xrpl/faucet" + "github.com/Peersyst/xrpl-go/xrpl/queries/account" + "github.com/Peersyst/xrpl-go/xrpl/rpc" + "github.com/Peersyst/xrpl-go/xrpl/transaction" + "github.com/Peersyst/xrpl-go/xrpl/wallet" ) func main() { @@ -29,13 +29,13 @@ func main() { return } - fmt.Println("⏳ Funding wallet...") + fmt.Println("Funding wallet...") if err := client.FundWallet(&w); err != nil { fmt.Println(err) return } - fmt.Println("💸 Wallet funded") + fmt.Println("Wallet funded") fmt.Println() info, err := client.GetAccountInfo(&account.InfoRequest{ @@ -46,10 +46,10 @@ func main() { return } - fmt.Println("🌐 Current wallet sequence:", info.AccountData.Sequence) + fmt.Println("Current wallet sequence:", info.AccountData.Sequence) fmt.Println() - fmt.Println("⏳ Submitting TicketCreate transaction...") + fmt.Println("Submitting TicketCreate transaction...") tc := &transaction.TicketCreate{ BaseTx: transaction.BaseTx{ Account: w.GetAddress(), @@ -77,9 +77,9 @@ func main() { return } - fmt.Println("✅ TicketCreate transaction submitted") - fmt.Printf("🌐 Hash: %s\n", res.Hash) - fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println("TicketCreate transaction submitted") + fmt.Printf("Hash: %s\n", res.Hash) + fmt.Printf("Validated: %t\n", res.Validated) fmt.Println() objects, err := client.GetAccountObjects(&account.ObjectsRequest{ @@ -90,7 +90,7 @@ func main() { return } - fmt.Println("🌐 Account objects:", objects.AccountObjects[0]["TicketSequence"]) + fmt.Println("Account objects:", objects.AccountObjects[0]["TicketSequence"]) seq, err := objects.AccountObjects[0]["TicketSequence"].(json.Number).Int64() if err != nil { @@ -98,7 +98,7 @@ func main() { return } - fmt.Println("⏳ Submitting AccountSet transaction...") + fmt.Println("Submitting AccountSet transaction...") as := &transaction.AccountSet{ BaseTx: transaction.BaseTx{ Account: w.GetAddress(), @@ -128,7 +128,7 @@ func main() { return } - fmt.Println("✅ AccountSet transaction submitted") - fmt.Printf("🌐 Hash: %s\n", res.Hash) - fmt.Printf("🌐 Validated: %t\n", res.Validated) + fmt.Println("AccountSet transaction submitted") + fmt.Printf("Hash: %s\n", res.Hash) + fmt.Printf("Validated: %t\n", res.Validated) } From 31be92a37c60d0cb00e8b5141b4f1ac1a4c603ef Mon Sep 17 00:00:00 2001 From: banasa44 Date: Mon, 25 Aug 2025 12:44:07 +0200 Subject: [PATCH 17/18] chore(sample-docs): unify error handling with panic(err). --- _code-samples/batch/go/rpc/main.go | 30 ++--- _code-samples/batch/go/ws/main.go | 33 ++---- _code-samples/checks/go/rpc/main.go | 30 ++--- _code-samples/checks/go/ws/main.go | 34 ++---- _code-samples/clawback/go/rpc/main.go | 48 +++----- _code-samples/clawback/go/ws/main.go | 51 +++------ _code-samples/credential/go/rpc/main.go | 15 +-- _code-samples/credential/go/ws/main.go | 18 +-- _code-samples/delegate-set/go/rpc/main.go | 18 +-- _code-samples/delegate-set/go/ws/main.go | 33 ++---- _code-samples/deposit-preauth/go/rpc/main.go | 18 +-- _code-samples/deposit-preauth/go/ws/main.go | 21 ++-- _code-samples/freeze/go/rpc/main.go | 30 ++--- _code-samples/freeze/go/ws/main.go | 33 ++---- _code-samples/get-started/go/base/ws/main.go | 5 +- .../get-started/go/get-acc-info/rpc/main.go | 12 +- .../get-started/go/get-acc-info/ws/main.go | 15 +-- _code-samples/issue-a-token/go/rpc/main.go | 105 ++++++----------- _code-samples/issue-a-token/go/ws/main.go | 108 ++++++------------ .../go/monitor-incoming-payments.go | 11 +- _code-samples/multisigning/go/rpc/main.go | 42 +++---- _code-samples/multisigning/go/ws/main.go | 45 +++----- .../go/nft-accept/rpc/main.go | 18 +-- .../go/nft-accept/ws/main.go | 21 ++-- .../go/nft-burn/rpc/main.go | 12 +- .../non-fungible-token/go/nft-burn/ws/main.go | 15 +-- .../go/nft-cancel/rpc/main.go | 15 +-- .../go/nft-cancel/ws/main.go | 18 +-- .../go/nft-modify/rpc/main.go | 12 +- .../go/nft-modify/ws/main.go | 15 +-- _code-samples/partial-payment/go/rpc/main.go | 39 +++---- _code-samples/partial-payment/go/ws/main.go | 42 +++---- _code-samples/paths/go/rpc/main.go | 18 +-- _code-samples/paths/go/ws/main.go | 21 ++-- _code-samples/send-a-memo/go/rpc/main.go | 24 ++-- _code-samples/send-a-memo/go/ws/main.go | 27 ++--- _code-samples/send-xrp/go/rpc/main.go | 24 ++-- _code-samples/send-xrp/go/ws/main.go | 27 ++--- _code-samples/set-regular-key/go/rpc/main.go | 36 ++---- _code-samples/set-regular-key/go/ws/main.go | 39 +++---- _code-samples/use-tickets/go/main.go | 33 ++---- 41 files changed, 402 insertions(+), 809 deletions(-) diff --git a/_code-samples/batch/go/rpc/main.go b/_code-samples/batch/go/rpc/main.go index 3ce33b7fce6..33740c43eca 100644 --- a/_code-samples/batch/go/rpc/main.go +++ b/_code-samples/batch/go/rpc/main.go @@ -40,30 +40,25 @@ func main() { // Create and fund wallets userWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } user2Wallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } receiverWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Funding wallets...") if err := client.FundWallet(&userWallet); err != nil { - fmt.Println(err) - return + panic(err) } if err := client.FundWallet(&user2Wallet); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Wallets funded") @@ -105,8 +100,7 @@ func main() { flattenedBatchTx := batchTx.Flatten() fmt.Println("Autofilling flattened batch transaction...") if err := client.Autofill(&flattenedBatchTx); err != nil { - fmt.Println("Autofill error:", err) - return + panic(err) } fmt.Println("Signing batch transaction...") @@ -115,8 +109,7 @@ func main() { Wallet: &userWallet, }) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Batch transaction submitted") @@ -165,14 +158,12 @@ func main() { flattenedMultiBatchTx := multiBatchTx.Flatten() fmt.Println("Autofilling flattened multi batch transaction...") if err := client.AutofillMultisigned(&flattenedMultiBatchTx, 1); err != nil { - fmt.Println("Autofill error:", err) - return + panic(err) } fmt.Println("Signing multi batch transaction...") if err := wallet.SignMultiBatch(user2Wallet, &flattenedMultiBatchTx, nil); err != nil { - fmt.Println("Signing error:", err) - return + panic(err) } response, err = client.SubmitTxAndWait(flattenedMultiBatchTx, &types.SubmitOptions{ @@ -180,8 +171,7 @@ func main() { Wallet: &userWallet, }) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Multisig Batch transaction submitted") diff --git a/_code-samples/batch/go/ws/main.go b/_code-samples/batch/go/ws/main.go index fe0615ca5b0..027e0664808 100644 --- a/_code-samples/batch/go/ws/main.go +++ b/_code-samples/batch/go/ws/main.go @@ -36,36 +36,30 @@ func main() { defer client.Disconnect() if err := client.Connect(); err != nil { - fmt.Println(err) - return + panic(err) } // Create and fund wallets userWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } user2Wallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } receiverWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Funding wallets...") if err := client.FundWallet(&userWallet); err != nil { - fmt.Println(err) - return + panic(err) } if err := client.FundWallet(&user2Wallet); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Wallets funded") @@ -107,8 +101,7 @@ func main() { flattenedBatchTx := batchTx.Flatten() fmt.Println("Autofilling flattened batch transaction...") if err := client.Autofill(&flattenedBatchTx); err != nil { - fmt.Println("Autofill error:", err) - return + panic(err) } fmt.Println("Signing batch transaction...") @@ -117,8 +110,7 @@ func main() { Wallet: &userWallet, }) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Batch transaction submitted") @@ -167,14 +159,12 @@ func main() { flattenedMultiBatchTx := multiBatchTx.Flatten() fmt.Println("Autofilling flattened multi batch transaction...") if err := client.AutofillMultisigned(&flattenedMultiBatchTx, 1); err != nil { - fmt.Println("Autofill error:", err) - return + panic(err) } fmt.Println("Signing multi batch transaction...") if err := wallet.SignMultiBatch(user2Wallet, &flattenedMultiBatchTx, nil); err != nil { - fmt.Println("Signing error:", err) - return + panic(err) } response, err = client.SubmitTxAndWait(flattenedMultiBatchTx, &types.SubmitOptions{ @@ -182,8 +172,7 @@ func main() { Wallet: &userWallet, }) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Multisig Batch transaction submitted") diff --git a/_code-samples/checks/go/rpc/main.go b/_code-samples/checks/go/rpc/main.go index 8683f81b6bb..7c8dcf12994 100644 --- a/_code-samples/checks/go/rpc/main.go +++ b/_code-samples/checks/go/rpc/main.go @@ -25,26 +25,22 @@ func main() { w, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } receiverWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Setting up wallets...") if err := client.FundWallet(&w); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Sender wallet funded!") if err := client.FundWallet(&receiverWallet); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Receiver wallet funded!") @@ -68,20 +64,17 @@ func main() { flatCc := cc.Flatten() if err := client.Autofill(&flatCc); err != nil { - fmt.Println(err) - return + panic(err) } blob, _, err := w.Sign(flatCc) if err != nil { - fmt.Println(err) - return + panic(err) } res, err := client.SubmitTxBlobAndWait(blob, false) if err != nil { - fmt.Println(err) - return + panic(err) } if !res.Validated { @@ -140,20 +133,17 @@ func main() { flatCheckCash := checkCash.Flatten() if err := client.Autofill(&flatCheckCash); err != nil { - fmt.Println(err) - return + panic(err) } blob, _, err = receiverWallet.Sign(flatCheckCash) if err != nil { - fmt.Println(err) - return + panic(err) } res, err = client.SubmitTxBlobAndWait(blob, false) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Check cashed out!") diff --git a/_code-samples/checks/go/ws/main.go b/_code-samples/checks/go/ws/main.go index 4a7f02899f9..65eede13006 100644 --- a/_code-samples/checks/go/ws/main.go +++ b/_code-samples/checks/go/ws/main.go @@ -22,8 +22,7 @@ func main() { defer client.Disconnect() if err := client.Connect(); err != nil { - fmt.Println(err) - return + panic(err) } if !client.IsConnected() { @@ -36,26 +35,22 @@ func main() { w, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } receiverWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Setting up wallets...") if err := client.FundWallet(&w); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Sender wallet funded!") if err := client.FundWallet(&receiverWallet); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Receiver wallet funded!") @@ -79,20 +74,18 @@ func main() { flatCc := cc.Flatten() if err := client.Autofill(&flatCc); err != nil { - fmt.Println(err) - return + panic(err) } + blob, _, err := w.Sign(flatCc) if err != nil { - fmt.Println(err) - return + panic(err) } res, err := client.SubmitTxBlobAndWait(blob, false) if err != nil { - fmt.Println(err) - return + panic(err) } if !res.Validated { @@ -151,20 +144,17 @@ func main() { flatCheckCash := checkCash.Flatten() if err := client.Autofill(&flatCheckCash); err != nil { - fmt.Println(err) - return + panic(err) } blob, _, err = receiverWallet.Sign(flatCheckCash) if err != nil { - fmt.Println(err) - return + panic(err) } res, err = client.SubmitTxBlobAndWait(blob, false) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Check cashed out!") diff --git a/_code-samples/clawback/go/rpc/main.go b/_code-samples/clawback/go/rpc/main.go index 7019832250e..0d83713b202 100644 --- a/_code-samples/clawback/go/rpc/main.go +++ b/_code-samples/clawback/go/rpc/main.go @@ -35,25 +35,21 @@ func main() { fmt.Println("Setting up wallets...") coldWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("Error creating cold wallet: %s\n", err) - return + panic(err) } err = client.FundWallet(&coldWallet) if err != nil { - fmt.Printf("Error funding cold wallet: %s\n", err) - return + panic(err) } fmt.Println("Cold wallet funded!") hotWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("Error creating hot wallet: %s\n", err) - return + panic(err) } err = client.FundWallet(&hotWallet) if err != nil { - fmt.Printf("Error funding hot wallet: %s\n", err) - return + panic(err) } fmt.Println("Hot wallet funded!") fmt.Println() @@ -85,20 +81,17 @@ func main() { err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err := coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } response, err := client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting transaction: %s\n", err) - return + panic(err) } if !response.Validated { @@ -130,20 +123,17 @@ func main() { flattenedTx = hotColdTrustSet.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err = hotWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting transaction: %s\n", err) - return + panic(err) } if !response.Validated { @@ -177,20 +167,17 @@ func main() { flattenedTx = coldToHotPayment.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err = coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting transaction: %s\n", err) - return + panic(err) } if !response.Validated { @@ -223,20 +210,17 @@ func main() { flattenedTx = coldWalletClawback.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err = coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting transaction: %s\n", err) - return + panic(err) } if !response.Validated { diff --git a/_code-samples/clawback/go/ws/main.go b/_code-samples/clawback/go/ws/main.go index 1ef7b03efe4..88119fac615 100644 --- a/_code-samples/clawback/go/ws/main.go +++ b/_code-samples/clawback/go/ws/main.go @@ -30,8 +30,7 @@ func main() { fmt.Println("Connecting to server...") if err := client.Connect(); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Connection: ", client.IsConnected()) @@ -42,25 +41,21 @@ func main() { fmt.Println("Setting up wallets...") coldWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("Error creating cold wallet: %s\n", err) - return + panic(err) } err = client.FundWallet(&coldWallet) if err != nil { - fmt.Printf("Error funding cold wallet: %s\n", err) - return + panic(err) } fmt.Println("Cold wallet funded!") hotWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("Error creating hot wallet: %s\n", err) - return + panic(err) } err = client.FundWallet(&hotWallet) if err != nil { - fmt.Printf("Error funding hot wallet: %s\n", err) - return + panic(err) } fmt.Println("Hot wallet funded!") fmt.Println() @@ -92,20 +87,17 @@ func main() { err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err := coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } response, err := client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting transaction: %s\n", err) - return + panic(err) } if !response.Validated { @@ -137,20 +129,17 @@ func main() { flattenedTx = hotColdTrustSet.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err = hotWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting transaction: %s\n", err) - return + panic(err) } if !response.Validated { @@ -184,20 +173,17 @@ func main() { flattenedTx = coldToHotPayment.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err = coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting transaction: %s\n", err) - return + panic(err) } if !response.Validated { @@ -230,20 +216,17 @@ func main() { flattenedTx = coldWalletClawback.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err = coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting transaction: %s\n", err) - return + panic(err) } if !response.Validated { diff --git a/_code-samples/credential/go/rpc/main.go b/_code-samples/credential/go/rpc/main.go index 95c63507e87..04736674660 100644 --- a/_code-samples/credential/go/rpc/main.go +++ b/_code-samples/credential/go/rpc/main.go @@ -23,14 +23,12 @@ func main() { fmt.Println("Setting up credential issuer wallet...") issuer, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("Error creating issuer wallet: %s\n", err) - return + panic(err) } err = client.FundWallet(&issuer) if err != nil { - fmt.Printf("Error funding issuer wallet: %s\n", err) - return + panic(err) } fmt.Printf("Issuer wallet funded: %s\n", issuer.ClassicAddress) @@ -40,14 +38,12 @@ func main() { fmt.Println("Setting up Subject wallet...") subjectWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("Error creating subject wallet: %s\n", err) - return + panic(err) } err = client.FundWallet(&subjectWallet) if err != nil { - fmt.Printf("Error funding subject wallet: %s\n", err) - return + panic(err) } fmt.Printf("Subject wallet funded: %s\n", subjectWallet.ClassicAddress) @@ -60,8 +56,7 @@ func main() { credentialType := types.CredentialType("6D795F63726564656E7469616C") if err != nil { - fmt.Printf("Error converting expiration to ripple time: %s\n", err) - return + panic(err) } txn := &transaction.CredentialCreate{ diff --git a/_code-samples/credential/go/ws/main.go b/_code-samples/credential/go/ws/main.go index 7aee85962f4..1093d6d462d 100644 --- a/_code-samples/credential/go/ws/main.go +++ b/_code-samples/credential/go/ws/main.go @@ -20,8 +20,7 @@ func main() { client := clients.GetDevnetWebsocketClient() fmt.Println("Connecting to server...") if err := client.Connect(); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Client configured!") @@ -36,14 +35,12 @@ func main() { fmt.Println("Setting up credential issuer wallet...") issuer, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("Error creating issuer wallet: %s\n", err) - return + panic(err) } err = client.FundWallet(&issuer) if err != nil { - fmt.Printf("Error funding issuer wallet: %s\n", err) - return + panic(err) } fmt.Printf("Issuer wallet funded: %s\n", issuer.ClassicAddress) @@ -53,14 +50,12 @@ func main() { fmt.Println("Setting up Subject wallet...") subjectWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("Error creating subject wallet: %s\n", err) - return + panic(err) } err = client.FundWallet(&subjectWallet) if err != nil { - fmt.Printf("Error funding subject wallet: %s\n", err) - return + panic(err) } fmt.Printf("Subject wallet funded: %s\n", subjectWallet.ClassicAddress) @@ -73,8 +68,7 @@ func main() { credentialType := types.CredentialType("6D795F63726564656E7469616C") if err != nil { - fmt.Printf("Error converting expiration to ripple time: %s\n", err) - return + panic(err) } txn := &transaction.CredentialCreate{ diff --git a/_code-samples/delegate-set/go/rpc/main.go b/_code-samples/delegate-set/go/rpc/main.go index 8372a2309b0..a2314cef673 100644 --- a/_code-samples/delegate-set/go/rpc/main.go +++ b/_code-samples/delegate-set/go/rpc/main.go @@ -26,24 +26,20 @@ func main() { // Create and fund wallets delegatorWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } delegateeWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Funding wallets...") if err := client.FundWallet(&delegatorWallet); err != nil { - fmt.Println(err) - return + panic(err) } if err := client.FundWallet(&delegateeWallet); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Wallets funded") @@ -82,8 +78,7 @@ func main() { Wallet: &delegatorWallet, }) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("DelegateSet transaction submitted") @@ -107,8 +102,7 @@ func main() { Wallet: &delegateeWallet, }) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Delegated payment submitted") diff --git a/_code-samples/delegate-set/go/ws/main.go b/_code-samples/delegate-set/go/ws/main.go index 78bd2f85403..6b303c4c045 100644 --- a/_code-samples/delegate-set/go/ws/main.go +++ b/_code-samples/delegate-set/go/ws/main.go @@ -21,31 +21,26 @@ func main() { defer client.Disconnect() if err := client.Connect(); err != nil { - fmt.Println(err) - return + panic(err) } // Create and fund wallets delegatorWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } delegateeWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Funding wallets...") if err := client.FundWallet(&delegatorWallet); err != nil { - fmt.Println(err) - return + panic(err) } if err := client.FundWallet(&delegateeWallet); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Wallets funded") @@ -81,20 +76,17 @@ func main() { // Submit DelegateSet transaction flattenedTx := delegateSetTx.Flatten() if err := client.Autofill(&flattenedTx); err != nil { - fmt.Println(err) - return + panic(err) } txBlob, _, err := delegatorWallet.Sign(flattenedTx) if err != nil { - fmt.Println(err) - return + panic(err) } response, err := client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("DelegateSet transaction submitted") @@ -115,20 +107,17 @@ func main() { // Submit delegated payment flatDelegatedPayment := delegatedPaymentTx.Flatten() if err := client.Autofill(&flatDelegatedPayment); err != nil { - fmt.Println(err) - return + panic(err) } txBlob2, _, err := delegateeWallet.Sign(flatDelegatedPayment) if err != nil { - fmt.Println(err) - return + panic(err) } response2, err := client.SubmitTxBlobAndWait(txBlob2, false) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Delegated payment submitted") diff --git a/_code-samples/deposit-preauth/go/rpc/main.go b/_code-samples/deposit-preauth/go/rpc/main.go index 9d4657cd4f1..54eef31f91b 100644 --- a/_code-samples/deposit-preauth/go/rpc/main.go +++ b/_code-samples/deposit-preauth/go/rpc/main.go @@ -24,14 +24,12 @@ func main() { fmt.Println("Setting up credential issuer wallet...") issuer, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("Error creating credential issuer wallet: %s\n", err) - return + panic(err) } err = client.FundWallet(&issuer) if err != nil { - fmt.Printf("Error funding credential issuer wallet: %s\n", err) - return + panic(err) } fmt.Printf("Credential issuer wallet funded: %s\n", issuer.ClassicAddress) @@ -41,14 +39,12 @@ func main() { fmt.Println("Setting up holder 1 wallet...") holderWallet1, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("Error creating holder 1 wallet: %s\n", err) - return + panic(err) } err = client.FundWallet(&holderWallet1) if err != nil { - fmt.Printf("Error funding holder 1 wallet: %s\n", err) - return + panic(err) } fmt.Printf("Holder 1 wallet funded: %s\n", holderWallet1.ClassicAddress) @@ -73,8 +69,7 @@ func main() { expiration, err := rippletime.IsoTimeToRippleTime(time.Now().Add(time.Hour * 24).Format(time.RFC3339)) if err != nil { - fmt.Printf("Error converting expiration to ripple time: %s\n", err) - return + panic(err) } credentialType := types.CredentialType("6D795F63726564656E7469616C") // my_credential @@ -142,8 +137,7 @@ func main() { objectsResponse, err := client.GetAccountObjects(objectsRequest) if err != nil { - fmt.Printf("Error getting the credential ID: %s\n", err) - return + panic(err) } // Check if we have any credential objects diff --git a/_code-samples/deposit-preauth/go/ws/main.go b/_code-samples/deposit-preauth/go/ws/main.go index 0a70db62642..95d9842b7dd 100644 --- a/_code-samples/deposit-preauth/go/ws/main.go +++ b/_code-samples/deposit-preauth/go/ws/main.go @@ -22,8 +22,7 @@ func main() { client := clients.GetDevnetWebsocketClient() fmt.Println("Connecting to server...") if err := client.Connect(); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Client configured!") @@ -38,14 +37,12 @@ func main() { fmt.Println("Setting up credential issuer wallet...") issuer, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("Error creating credential issuer wallet: %s\n", err) - return + panic(err) } err = client.FundWallet(&issuer) if err != nil { - fmt.Printf("Error funding credential issuer wallet: %s\n", err) - return + panic(err) } fmt.Printf("Credential issuer wallet funded: %s\n", issuer.ClassicAddress) @@ -55,14 +52,12 @@ func main() { fmt.Println("Setting up holder 1 wallet...") holderWallet1, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("Error creating holder 1 wallet: %s\n", err) - return + panic(err) } err = client.FundWallet(&holderWallet1) if err != nil { - fmt.Printf("Error funding holder 1 wallet: %s\n", err) - return + panic(err) } fmt.Printf("Holder 1 wallet funded: %s\n", holderWallet1.ClassicAddress) @@ -87,8 +82,7 @@ func main() { expiration, err := rippletime.IsoTimeToRippleTime(time.Now().Add(time.Hour * 24).Format(time.RFC3339)) if err != nil { - fmt.Printf("Error converting expiration to ripple time: %s\n", err) - return + panic(err) } credentialType := types.CredentialType("6D795F63726564656E7469616C") // my_credential @@ -156,8 +150,7 @@ func main() { objectsResponse, err := client.GetAccountObjects(objectsRequest) if err != nil { - fmt.Printf("Error getting the credential ID: %s\n", err) - return + panic(err) } // Check if we have any credential objects diff --git a/_code-samples/freeze/go/rpc/main.go b/_code-samples/freeze/go/rpc/main.go index a60c6a4f5da..c8b72e6527d 100644 --- a/_code-samples/freeze/go/rpc/main.go +++ b/_code-samples/freeze/go/rpc/main.go @@ -30,14 +30,12 @@ func main() { fmt.Println("Setting up issuer wallet...") issuer, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("Error creating issuer wallet: %s\n", err) - return + panic(err) } err = client.FundWallet(&issuer) if err != nil { - fmt.Printf("Error funding issuer wallet: %s\n", err) - return + panic(err) } fmt.Printf("Issuer wallet funded: %s\n", issuer.ClassicAddress) @@ -47,14 +45,12 @@ func main() { fmt.Println("Setting up holder 1 wallet...") holderWallet1, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("Error creating holder wallet 1: %s\n", err) - return + panic(err) } err = client.FundWallet(&holderWallet1) if err != nil { - fmt.Printf("Error funding holder wallet 1: %s\n", err) - return + panic(err) } fmt.Printf("Holder wallet 1 funded: %s\n", holderWallet1.ClassicAddress) @@ -64,14 +60,12 @@ func main() { fmt.Println("Setting up holder 2 wallet...") holderWallet2, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("Error creating holder wallet 2: %s\n", err) - return + panic(err) } err = client.FundWallet(&holderWallet2) if err != nil { - fmt.Printf("Error funding holder wallet 2: %s\n", err) - return + panic(err) } fmt.Printf("Holder wallet 2 funded: %s\n", holderWallet2.ClassicAddress) fmt.Println() @@ -322,23 +316,17 @@ func submitAndWait(client *rpc.Client, txn SubmittableTransaction, wallet wallet err := client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling %s transaction: %s\n", txn.TxType(), err) - fmt.Println() - return + panic(err) } txBlob, _, err := wallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing %s transaction: %s\n", txn.TxType(), err) - fmt.Println() - return + panic(err) } response, err := client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting %s transaction: %s\n", txn.TxType(), err) - fmt.Println() - return + panic(err) } fmt.Printf("%s transaction submitted\n", txn.TxType()) diff --git a/_code-samples/freeze/go/ws/main.go b/_code-samples/freeze/go/ws/main.go index de9377147b3..5ea6c2a7808 100644 --- a/_code-samples/freeze/go/ws/main.go +++ b/_code-samples/freeze/go/ws/main.go @@ -27,8 +27,7 @@ func main() { client := getClient() fmt.Println("Connecting to server...") if err := client.Connect(); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Client configured!") @@ -43,14 +42,12 @@ func main() { fmt.Println("Setting up issuer wallet...") issuer, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("Error creating issuer wallet: %s\n", err) - return + panic(err) } err = client.FundWallet(&issuer) if err != nil { - fmt.Printf("Error funding issuer wallet: %s\n", err) - return + panic(err) } fmt.Printf("Issuer wallet funded: %s\n", issuer.ClassicAddress) @@ -60,14 +57,12 @@ func main() { fmt.Println("Setting up holder 1 wallet...") holderWallet1, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("Error creating holder wallet 1: %s\n", err) - return + panic(err) } err = client.FundWallet(&holderWallet1) if err != nil { - fmt.Printf("Error funding holder wallet 1: %s\n", err) - return + panic(err) } fmt.Printf("Holder wallet 1 funded: %s\n", holderWallet1.ClassicAddress) @@ -77,14 +72,12 @@ func main() { fmt.Println("Setting up holder 2 wallet...") holderWallet2, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("Error creating holder wallet 2: %s\n", err) - return + panic(err) } err = client.FundWallet(&holderWallet2) if err != nil { - fmt.Printf("Error funding holder wallet 2: %s\n", err) - return + panic(err) } fmt.Printf("Holder wallet 2 funded: %s\n", holderWallet2.ClassicAddress) fmt.Println() @@ -332,23 +325,17 @@ func submitAndWait(client *websocket.Client, txn SubmittableTransaction, wallet err := client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling %s transaction: %s\n", txn.TxType(), err) - fmt.Println() - return + panic(err) } txBlob, _, err := wallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing %s transaction: %s\n", txn.TxType(), err) - fmt.Println() - return + panic(err) } response, err := client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting %s transaction: %s\n", txn.TxType(), err) - fmt.Println() - return + panic(err) } fmt.Printf("%s transaction submitted\n", txn.TxType()) diff --git a/_code-samples/get-started/go/base/ws/main.go b/_code-samples/get-started/go/base/ws/main.go index 02786553e2d..ddfe3f3ecfb 100644 --- a/_code-samples/get-started/go/base/ws/main.go +++ b/_code-samples/get-started/go/base/ws/main.go @@ -1,8 +1,6 @@ package main import ( - "fmt" - "github.com/Peersyst/xrpl-go/xrpl/faucet" "github.com/Peersyst/xrpl-go/xrpl/websocket" ) @@ -20,8 +18,7 @@ func main() { // Connect to the network if err := client.Connect(); err != nil { - fmt.Println(err) - return + panic(err) } // ... custom code goes here diff --git a/_code-samples/get-started/go/get-acc-info/rpc/main.go b/_code-samples/get-started/go/get-acc-info/rpc/main.go index f933812a6ad..dbc0bd50e24 100644 --- a/_code-samples/get-started/go/get-acc-info/rpc/main.go +++ b/_code-samples/get-started/go/get-acc-info/rpc/main.go @@ -26,16 +26,14 @@ func main() { // Create a new wallet w, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("New wallet created:") fmt.Println("Address:", w.ClassicAddress) // Fund the wallet with testnet XRP if err := client.FundWallet(&w); err != nil { - fmt.Println(err) - return + panic(err) } // Get info from the ledger about the address we just funded @@ -43,8 +41,7 @@ func main() { Account: w.GetAddress(), }) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Account Balance:", acc_info.AccountData.Balance) fmt.Println("Account Sequence:", acc_info.AccountData.Sequence) @@ -52,8 +49,7 @@ func main() { // Get info about the ledger ledger, err := client.GetLedger(&ledger.Request{LedgerIndex: common.Current}) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Ledger Index:", ledger.Ledger.LedgerIndex) } diff --git a/_code-samples/get-started/go/get-acc-info/ws/main.go b/_code-samples/get-started/go/get-acc-info/ws/main.go index ed9fc336d73..ae157443087 100644 --- a/_code-samples/get-started/go/get-acc-info/ws/main.go +++ b/_code-samples/get-started/go/get-acc-info/ws/main.go @@ -26,8 +26,7 @@ func main() { // Connect to the network if err := client.Connect(); err != nil { - fmt.Println(err) - return + panic(err) } if !client.IsConnected() { @@ -41,16 +40,14 @@ func main() { // Create a new wallet w, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("New wallet created:") fmt.Println("Address:", w.ClassicAddress) // Fund the wallet with testnet XRP if err := client.FundWallet(&w); err != nil { - fmt.Println(err) - return + panic(err) } // Get info from the ledger about the address we just funded @@ -58,8 +55,7 @@ func main() { Account: w.GetAddress(), }) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Account Balance:", acc_info.AccountData.Balance) fmt.Println("Account Sequence:", acc_info.AccountData.Sequence) @@ -67,8 +63,7 @@ func main() { // Get info about the ledger ledger, err := client.GetLedger(&ledger.Request{LedgerIndex: common.Current}) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Ledger Index:", ledger.Ledger.LedgerIndex) } diff --git a/_code-samples/issue-a-token/go/rpc/main.go b/_code-samples/issue-a-token/go/rpc/main.go index 08f591c0a6d..c9ae903a827 100644 --- a/_code-samples/issue-a-token/go/rpc/main.go +++ b/_code-samples/issue-a-token/go/rpc/main.go @@ -38,37 +38,31 @@ func main() { fmt.Println("Setting up wallets...") coldWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("Error creating cold wallet: %s\n", err) - return + panic(err) } err = client.FundWallet(&coldWallet) if err != nil { - fmt.Printf("Error funding cold wallet: %s\n", err) - return + panic(err) } fmt.Println("Cold wallet funded!") hotWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("Error creating hot wallet: %s\n", err) - return + panic(err) } err = client.FundWallet(&hotWallet) if err != nil { - fmt.Printf("Error funding hot wallet: %s\n", err) - return + panic(err) } fmt.Println("Hot wallet funded!") customerOneWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("Error creating token wallet: %s\n", err) - return + panic(err) } err = client.FundWallet(&customerOneWallet) if err != nil { - fmt.Printf("Error funding customer one wallet: %s\n", err) - return + panic(err) } fmt.Println("Customer one wallet funded!") fmt.Println() @@ -101,20 +95,17 @@ func main() { err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err := coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } response, err := client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting transaction: %s\n", err) - return + panic(err) } if !response.Validated { @@ -146,20 +137,17 @@ func main() { flattenedTx = hotWalletAccountSet.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err = hotWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting transaction: %s\n", err) - return + panic(err) } if !response.Validated { @@ -191,20 +179,17 @@ func main() { flattenedTx = hotColdTrustSet.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err = hotWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting transaction: %s\n", err) - return + panic(err) } if !response.Validated { @@ -236,20 +221,17 @@ func main() { flattenedTx = customerOneColdTrustSet.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err = customerOneWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting transaction: %s\n", err) - return + panic(err) } if !response.Validated { @@ -283,20 +265,17 @@ func main() { flattenedTx = coldToHotPayment.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err = coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting transaction: %s\n", err) - return + panic(err) } if !response.Validated { @@ -329,20 +308,17 @@ func main() { flattenedTx = coldToCustomerOnePayment.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err = coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting transaction: %s\n", err) - return + panic(err) } if !response.Validated { @@ -370,20 +346,17 @@ func main() { flattenedTx = freezeColdWallet.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err = coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting transaction: %s\n", err) - return + panic(err) } if !response.Validated { @@ -416,14 +389,12 @@ func main() { flattenedTx = hotToCustomerOnePayment.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err = hotWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } _, err = client.SubmitTxBlobAndWait(txBlob, false) @@ -449,20 +420,17 @@ func main() { flattenedTx = unfreezeColdWallet.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err = coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting transaction: %s\n", err) - return + panic(err) } if !response.Validated { @@ -495,20 +463,17 @@ func main() { flattenedTx = hotToCustomerOnePayment.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err = hotWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting transaction: %s\n", err) - return + panic(err) } if !response.Validated { diff --git a/_code-samples/issue-a-token/go/ws/main.go b/_code-samples/issue-a-token/go/ws/main.go index e052df2e899..99dd4640139 100644 --- a/_code-samples/issue-a-token/go/ws/main.go +++ b/_code-samples/issue-a-token/go/ws/main.go @@ -31,8 +31,7 @@ func main() { fmt.Println("Connecting to server...") if err := client.Connect(); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Connection: ", client.IsConnected()) @@ -44,37 +43,31 @@ func main() { fmt.Println("Setting up wallets...") coldWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("Error creating cold wallet: %s\n", err) - return + panic(err) } err = client.FundWallet(&coldWallet) if err != nil { - fmt.Printf("Error funding cold wallet: %s\n", err) - return + panic(err) } fmt.Println("Cold wallet funded!") hotWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("Error creating hot wallet: %s\n", err) - return + panic(err) } err = client.FundWallet(&hotWallet) if err != nil { - fmt.Printf("Error funding hot wallet: %s\n", err) - return + panic(err) } fmt.Println("Hot wallet funded!") customerOneWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Printf("Error creating token wallet: %s\n", err) - return + panic(err) } err = client.FundWallet(&customerOneWallet) if err != nil { - fmt.Printf("Error funding customer one wallet: %s\n", err) - return + panic(err) } fmt.Println("Customer one wallet funded!") fmt.Println() @@ -107,20 +100,17 @@ func main() { err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err := coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } response, err := client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting transaction: %s\n", err) - return + panic(err) } if !response.Validated { @@ -152,20 +142,17 @@ func main() { flattenedTx = hotWalletAccountSet.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err = hotWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting transaction: %s\n", err) - return + panic(err) } if !response.Validated { @@ -197,20 +184,17 @@ func main() { flattenedTx = hotColdTrustSet.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err = hotWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting transaction: %s\n", err) - return + panic(err) } if !response.Validated { @@ -242,20 +226,17 @@ func main() { flattenedTx = customerOneColdTrustSet.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err = customerOneWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting transaction: %s\n", err) - return + panic(err) } if !response.Validated { @@ -289,20 +270,17 @@ func main() { flattenedTx = coldToHotPayment.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err = coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting transaction: %s\n", err) - return + panic(err) } if !response.Validated { @@ -335,20 +313,17 @@ func main() { flattenedTx = coldToCustomerOnePayment.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err = coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting transaction: %s\n", err) - return + panic(err) } if !response.Validated { @@ -376,20 +351,17 @@ func main() { flattenedTx = freezeColdWallet.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err = coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting transaction: %s\n", err) - return + panic(err) } if !response.Validated { @@ -422,14 +394,12 @@ func main() { flattenedTx = hotToCustomerOnePayment.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err = hotWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } _, err = client.SubmitTxBlobAndWait(txBlob, false) @@ -455,20 +425,17 @@ func main() { flattenedTx = unfreezeColdWallet.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err = coldWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting transaction: %s\n", err) - return + panic(err) } if !response.Validated { @@ -501,20 +468,17 @@ func main() { flattenedTx = hotToCustomerOnePayment.Flatten() err = client.Autofill(&flattenedTx) if err != nil { - fmt.Printf("Error autofilling transaction: %s\n", err) - return + panic(err) } txBlob, _, err = hotWallet.Sign(flattenedTx) if err != nil { - fmt.Printf("Error signing transaction: %s\n", err) - return + panic(err) } response, err = client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Printf("Error submitting transaction: %s\n", err) - return + panic(err) } if !response.Validated { diff --git a/_code-samples/monitor-payments-websocket/go/monitor-incoming-payments.go b/_code-samples/monitor-payments-websocket/go/monitor-incoming-payments.go index ae704cd706d..f0bcf93331a 100644 --- a/_code-samples/monitor-payments-websocket/go/monitor-incoming-payments.go +++ b/_code-samples/monitor-payments-websocket/go/monitor-incoming-payments.go @@ -43,7 +43,7 @@ func main() { // make the connection c, _, err := websocket.DefaultDialer.Dial(u.String(), nil) if err != nil { - log.Fatal("dial:", err) + panic(err) } // on exit close defer c.Close() @@ -59,15 +59,13 @@ func main() { // write to the websocket err = c.WriteMessage(websocket.TextMessage, []byte(string(msg))) if err != nil { - log.Println("write:", err) - return + panic(err) } // read from the websocket _, message, err := c.ReadMessage() if err != nil { - log.Println("read:", err) - return + panic(err) } // print the response from the XRP Ledger log.Printf("recv: %s", message) @@ -84,8 +82,7 @@ func main() { // waiting (with timeout) for the server to close the connection. err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, "")) if err != nil { - log.Println("write close:", err) - return + panic(err) } select { case <-done: diff --git a/_code-samples/multisigning/go/rpc/main.go b/_code-samples/multisigning/go/rpc/main.go index 56a687f96a1..62a889a3924 100644 --- a/_code-samples/multisigning/go/rpc/main.go +++ b/_code-samples/multisigning/go/rpc/main.go @@ -28,40 +28,34 @@ func main() { w1, err := wallet.FromSeed("sEdTtvLmJmrb7GaivhWoXRkvU4NDjVf", "") if err != nil { - fmt.Println(err) - return + panic(err) } w2, err := wallet.FromSeed("sEdSFiKMQp7RvYLgH7t7FEpwNRWv2Gr", "") if err != nil { - fmt.Println(err) - return + panic(err) } master, err := wallet.FromSeed("sEdTMm2yv8c8Rg8YHFHQA9TxVMFy1ze", "") if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Funding wallets...") if err := client.FundWallet(&w1); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Wallet 1 funded") if err := client.FundWallet(&w2); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Wallet 2 funded") if err := client.FundWallet(&master); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Master wallet funded") fmt.Println() @@ -97,20 +91,17 @@ func main() { flatSs := ss.Flatten() if err := client.Autofill(&flatSs); err != nil { - fmt.Println(err) - return + panic(err) } blob, _, err := master.Sign(flatSs) if err != nil { - fmt.Println(err) - return + panic(err) } res, err := client.SubmitTxBlobAndWait(blob, false) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("SignerListSet transaction submitted!") @@ -129,36 +120,31 @@ func main() { flatAs := as.Flatten() if err := client.AutofillMultisigned(&flatAs, 2); err != nil { - fmt.Println(err) - return + panic(err) } w1As := maps.Clone(flatAs) blob1, _, err := w1.Multisign(w1As) if err != nil { - fmt.Println(err) - return + panic(err) } w2As := maps.Clone(flatAs) blob2, _, err := w2.Multisign(w2As) if err != nil { - fmt.Println(err) - return + panic(err) } blob, err = xrpl.Multisign(blob1, blob2) if err != nil { - fmt.Println(err) - return + panic(err) } mRes, err := client.SubmitMultisigned(blob, false) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Multisigned transaction submitted!") diff --git a/_code-samples/multisigning/go/ws/main.go b/_code-samples/multisigning/go/ws/main.go index 0fd7a61ee4a..05e8665cf99 100644 --- a/_code-samples/multisigning/go/ws/main.go +++ b/_code-samples/multisigning/go/ws/main.go @@ -25,8 +25,7 @@ func main() { defer client.Disconnect() if err := client.Connect(); err != nil { - fmt.Println(err) - return + panic(err) } if !client.IsConnected() { @@ -39,40 +38,34 @@ func main() { w1, err := wallet.FromSeed("sEdTtvLmJmrb7GaivhWoXRkvU4NDjVf", "") if err != nil { - fmt.Println(err) - return + panic(err) } w2, err := wallet.FromSeed("sEdSFiKMQp7RvYLgH7t7FEpwNRWv2Gr", "") if err != nil { - fmt.Println(err) - return + panic(err) } master, err := wallet.FromSeed("sEdTMm2yv8c8Rg8YHFHQA9TxVMFy1ze", "") if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Funding wallets...") if err := client.FundWallet(&w1); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Wallet 1 funded") if err := client.FundWallet(&w2); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Wallet 2 funded") if err := client.FundWallet(&master); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Master wallet funded") fmt.Println() @@ -110,22 +103,19 @@ func main() { fmt.Println("Autofilling transaction...") if err := client.Autofill(&flatSs); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Signing transaction...") blob, _, err := master.Sign(flatSs) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Submitting transaction...") res, err := client.SubmitTxBlobAndWait(blob, false) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("SignerListSet transaction submitted!") @@ -144,36 +134,31 @@ func main() { flatAs := as.Flatten() if err := client.AutofillMultisigned(&flatAs, 2); err != nil { - fmt.Println(err) - return + panic(err) } w1As := maps.Clone(flatAs) blob1, _, err := w1.Multisign(w1As) if err != nil { - fmt.Println(err) - return + panic(err) } w2As := maps.Clone(flatAs) blob2, _, err := w2.Multisign(w2As) if err != nil { - fmt.Println(err) - return + panic(err) } blob, err = xrpl.Multisign(blob1, blob2) if err != nil { - fmt.Println(err) - return + panic(err) } mRes, err := client.SubmitMultisigned(blob, false) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Multisigned transaction submitted!") diff --git a/_code-samples/non-fungible-token/go/nft-accept/rpc/main.go b/_code-samples/non-fungible-token/go/nft-accept/rpc/main.go index 611620bb277..93d92d0ce81 100644 --- a/_code-samples/non-fungible-token/go/nft-accept/rpc/main.go +++ b/_code-samples/non-fungible-token/go/nft-accept/rpc/main.go @@ -31,24 +31,20 @@ func main() { // Create and fund the NFT minter wallet nftMinter, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println("Error creating NFT minter wallet:", err) - return + panic(err) } if err := client.FundWallet(&nftMinter); err != nil { - fmt.Println("Error funding NFT minter wallet:", err) - return + panic(err) } fmt.Println("NFT minter wallet funded!") // Create and fund the NFT buyer wallet nftBuyer, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println("Error creating NFT buyer wallet:", err) - return + panic(err) } if err := client.FundWallet(&nftBuyer); err != nil { - fmt.Println("Error funding NFT buyer wallet:", err) - return + panic(err) } fmt.Println("NFT buyer wallet funded!") fmt.Println() @@ -73,8 +69,7 @@ func main() { Wallet: &nftMinter, }) if err != nil { - fmt.Println("Error minting NFT:", err) - return + panic(err) } if !responseMint.Validated { fmt.Println("NFTokenMint txn is not in a validated ledger", responseMint) @@ -117,8 +112,7 @@ func main() { Wallet: &nftBuyer, }) if err != nil { - fmt.Println("Error accepting NFT offer:", err) - return + panic(err) } if !response.Validated { fmt.Println("NFTokenAcceptOffer txn is not in a validated ledger", response) diff --git a/_code-samples/non-fungible-token/go/nft-accept/ws/main.go b/_code-samples/non-fungible-token/go/nft-accept/ws/main.go index c7837f89bb2..c9424a56eef 100644 --- a/_code-samples/non-fungible-token/go/nft-accept/ws/main.go +++ b/_code-samples/non-fungible-token/go/nft-accept/ws/main.go @@ -23,8 +23,7 @@ func main() { defer client.Disconnect() if err := client.Connect(); err != nil { - fmt.Println("Error connecting to devnet:", err) - return + panic(err) } if !client.IsConnected() { @@ -40,24 +39,20 @@ func main() { // Create and fund the NFT minter wallet nftMinter, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println("Error creating NFT minter wallet:", err) - return + panic(err) } if err := client.FundWallet(&nftMinter); err != nil { - fmt.Println("Error funding NFT minter wallet:", err) - return + panic(err) } fmt.Println("NFT minter wallet funded!") // Create and fund the NFT buyer wallet nftBuyer, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println("Error creating NFT buyer wallet:", err) - return + panic(err) } if err := client.FundWallet(&nftBuyer); err != nil { - fmt.Println("Error funding NFT buyer wallet:", err) - return + panic(err) } fmt.Println("NFT buyer wallet funded!") fmt.Println() @@ -81,8 +76,7 @@ func main() { Wallet: &nftMinter, }) if err != nil { - fmt.Println("Error minting NFT:", err) - return + panic(err) } if !responseMint.Validated { fmt.Println("NFTokenMint transaction is not in a validated ledger:", responseMint) @@ -122,8 +116,7 @@ func main() { Wallet: &nftBuyer, }) if err != nil { - fmt.Println("Error accepting NFT offer:", err) - return + panic(err) } if !response.Validated { fmt.Println("NFTokenAcceptOffer transaction is not in a validated ledger:", response) diff --git a/_code-samples/non-fungible-token/go/nft-burn/rpc/main.go b/_code-samples/non-fungible-token/go/nft-burn/rpc/main.go index 5d952372529..18a158613c1 100644 --- a/_code-samples/non-fungible-token/go/nft-burn/rpc/main.go +++ b/_code-samples/non-fungible-token/go/nft-burn/rpc/main.go @@ -31,12 +31,10 @@ func main() { // Create and fund the NFT minter wallet nftMinter, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println("Error creating NFT minter wallet:", err) - return + panic(err) } if err := client.FundWallet(&nftMinter); err != nil { - fmt.Println("Error funding NFT minter wallet:", err) - return + panic(err) } fmt.Println("NFT minter wallet funded!") fmt.Println() @@ -59,8 +57,7 @@ func main() { Wallet: &nftMinter, }) if err != nil { - fmt.Println("Error minting NFT:", err) - return + panic(err) } if !responseMint.Validated { fmt.Println("NFTokenMint txn is not in a validated ledger", responseMint) @@ -103,8 +100,7 @@ func main() { Wallet: &nftMinter, }) if err != nil { - fmt.Println("Error burning NFT:", err) - return + panic(err) } if !responseBurn.Validated { fmt.Println("NFTokenBurn transactiob is not in a validated ledger", responseBurn) diff --git a/_code-samples/non-fungible-token/go/nft-burn/ws/main.go b/_code-samples/non-fungible-token/go/nft-burn/ws/main.go index 9b9c2e1e37c..7fce1576da8 100644 --- a/_code-samples/non-fungible-token/go/nft-burn/ws/main.go +++ b/_code-samples/non-fungible-token/go/nft-burn/ws/main.go @@ -23,8 +23,7 @@ func main() { defer client.Disconnect() if err := client.Connect(); err != nil { - fmt.Println("Error connecting to devnet:", err) - return + panic(err) } if !client.IsConnected() { @@ -40,12 +39,10 @@ func main() { // Create and fund the NFT minter wallet nftMinter, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println("Error creating NFT minter wallet:", err) - return + panic(err) } if err := client.FundWallet(&nftMinter); err != nil { - fmt.Println("Error funding NFT minter wallet:", err) - return + panic(err) } fmt.Println("NFT minter wallet funded!") fmt.Println() @@ -68,8 +65,7 @@ func main() { Wallet: &nftMinter, }) if err != nil { - fmt.Println("Error minting NFT:", err) - return + panic(err) } if !responseMint.Validated { fmt.Println("NFTokenMint txn is not in a validated ledger", responseMint) @@ -112,8 +108,7 @@ func main() { Wallet: &nftMinter, }) if err != nil { - fmt.Println("Error burning NFT:", err) - return + panic(err) } if !responseBurn.Validated { fmt.Println("NFTokenBurn transactiob is not in a validated ledger", responseBurn) diff --git a/_code-samples/non-fungible-token/go/nft-cancel/rpc/main.go b/_code-samples/non-fungible-token/go/nft-cancel/rpc/main.go index d8c8ab8a538..fb661316530 100644 --- a/_code-samples/non-fungible-token/go/nft-cancel/rpc/main.go +++ b/_code-samples/non-fungible-token/go/nft-cancel/rpc/main.go @@ -31,12 +31,10 @@ func main() { // Create and fund the NFT minter wallet nftMinter, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println("Error creating NFT minter wallet:", err) - return + panic(err) } if err := client.FundWallet(&nftMinter); err != nil { - fmt.Println("Error funding NFT minter wallet:", err) - return + panic(err) } fmt.Println("NFT minter wallet funded!") @@ -58,8 +56,7 @@ func main() { Wallet: &nftMinter, }) if err != nil { - fmt.Println("Error minting first NFT:", err) - return + panic(err) } if !responseMint.Validated { fmt.Println("First NFTokenMint transaction is not in a validated ledger", responseMint) @@ -105,8 +102,7 @@ func main() { Wallet: &nftMinter, }) if err != nil { - fmt.Println("Error minting second NFT:", err) - return + panic(err) } if !responseMint.Validated { fmt.Println("Second NFTokenMint transaction is not in a validated ledger", responseMint) @@ -152,8 +148,7 @@ func main() { Wallet: &nftMinter, }) if err != nil { - fmt.Println("Error canceling NFT offers:", err) - return + panic(err) } if !response.Validated { fmt.Println("NFTokenCancelOffer transaction is not in a validated ledger", response) diff --git a/_code-samples/non-fungible-token/go/nft-cancel/ws/main.go b/_code-samples/non-fungible-token/go/nft-cancel/ws/main.go index 2aefccb49af..410bb221950 100644 --- a/_code-samples/non-fungible-token/go/nft-cancel/ws/main.go +++ b/_code-samples/non-fungible-token/go/nft-cancel/ws/main.go @@ -23,8 +23,7 @@ func main() { defer client.Disconnect() if err := client.Connect(); err != nil { - fmt.Println("Error connecting to devnet:", err) - return + panic(err) } if !client.IsConnected() { @@ -40,12 +39,10 @@ func main() { // Create and fund the NFT minter wallet nftMinter, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println("Error creating NFT minter wallet:", err) - return + panic(err) } if err := client.FundWallet(&nftMinter); err != nil { - fmt.Println("Error funding NFT minter wallet:", err) - return + panic(err) } fmt.Println("NFT minter wallet funded!") @@ -67,8 +64,7 @@ func main() { Wallet: &nftMinter, }) if err != nil { - fmt.Println("Error minting first NFT:", err) - return + panic(err) } if !responseMint.Validated { fmt.Println("First NFTokenMint transaction is not in a validated ledger", responseMint) @@ -114,8 +110,7 @@ func main() { Wallet: &nftMinter, }) if err != nil { - fmt.Println("Error minting second NFT:", err) - return + panic(err) } if !responseMint.Validated { fmt.Println("Second NFTokenMint transaction is not in a validated ledger", responseMint) @@ -161,8 +156,7 @@ func main() { Wallet: &nftMinter, }) if err != nil { - fmt.Println("Error canceling NFT offers:", err) - return + panic(err) } if !response.Validated { fmt.Println("NFTokenCancelOffer transaction is not in a validated ledger", response) diff --git a/_code-samples/non-fungible-token/go/nft-modify/rpc/main.go b/_code-samples/non-fungible-token/go/nft-modify/rpc/main.go index e4346b87d51..f0783ffd320 100644 --- a/_code-samples/non-fungible-token/go/nft-modify/rpc/main.go +++ b/_code-samples/non-fungible-token/go/nft-modify/rpc/main.go @@ -29,12 +29,10 @@ func main() { // Create and fund the nft wallet nftWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println("Error creating nft wallet:", err) - return + panic(err) } if err := client.FundWallet(&nftWallet); err != nil { - fmt.Println("Error funding nft wallet:", err) - return + panic(err) } fmt.Println("NFT wallet funded: ", nftWallet.ClassicAddress) fmt.Println() @@ -56,8 +54,7 @@ func main() { Wallet: &nftWallet, }) if err != nil { - fmt.Println("Error minting NFT:", err) - return + panic(err) } if !responseMint.Validated { fmt.Println("NFTokenMint txn is not in a validated ledger", responseMint) @@ -96,8 +93,7 @@ func main() { Wallet: &nftWallet, }) if err != nil { - fmt.Println("Error modifying NFT:", err) - return + panic(err) } if !responseModify.Validated { fmt.Println("NFTokenModify txn is not in a validated ledger", responseModify) diff --git a/_code-samples/non-fungible-token/go/nft-modify/ws/main.go b/_code-samples/non-fungible-token/go/nft-modify/ws/main.go index f51e8faa1a9..5f65893dd88 100644 --- a/_code-samples/non-fungible-token/go/nft-modify/ws/main.go +++ b/_code-samples/non-fungible-token/go/nft-modify/ws/main.go @@ -23,8 +23,7 @@ func main() { defer client.Disconnect() if err := client.Connect(); err != nil { - fmt.Println(err) - return + panic(err) } if !client.IsConnected() { @@ -39,12 +38,10 @@ func main() { fmt.Println("Funding wallet...") nftWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println("Error creating nft wallet:", err) - return + panic(err) } if err := client.FundWallet(&nftWallet); err != nil { - fmt.Println("Error funding nft wallet:", err) - return + panic(err) } fmt.Println("NFT wallet funded!") fmt.Println() @@ -66,8 +63,7 @@ func main() { Wallet: &nftWallet, }) if err != nil { - fmt.Println("Error minting NFT:", err) - return + panic(err) } if !responseMint.Validated { fmt.Println("NFTokenMint txn is not in a validated ledger", responseMint) @@ -106,8 +102,7 @@ func main() { Wallet: &nftWallet, }) if err != nil { - fmt.Println("Error modifying NFT:", err) - return + panic(err) } if !responseModify.Validated { fmt.Println("NFTokenModify txn is not in a validated ledger", responseModify) diff --git a/_code-samples/partial-payment/go/rpc/main.go b/_code-samples/partial-payment/go/rpc/main.go index b58dc13a7f1..c1c333b359a 100644 --- a/_code-samples/partial-payment/go/rpc/main.go +++ b/_code-samples/partial-payment/go/rpc/main.go @@ -26,24 +26,20 @@ func main() { fmt.Println("Funding wallets...") w1, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } w2, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } if err := client.FundWallet(&w1); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Wallet 1 funded") if err := client.FundWallet(&w2); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Wallet 2 funded") @@ -67,20 +63,17 @@ func main() { err = client.Autofill(&flatTs) if err != nil { - fmt.Println(err) - return + panic(err) } blob, _, err := w2.Sign(flatTs) if err != nil { - fmt.Println(err) - return + panic(err) } res, err := client.SubmitTxBlobAndWait(blob, false) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("TrustSet transaction submitted!") @@ -105,20 +98,17 @@ func main() { err = client.Autofill(&flatP) if err != nil { - fmt.Println(err) - return + panic(err) } blob, _, err = w1.Sign(flatP) if err != nil { - fmt.Println(err) - return + panic(err) } res, err = client.SubmitTxBlobAndWait(blob, false) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Payment transaction submitted!") @@ -145,20 +135,17 @@ func main() { err = client.Autofill(&flatPP) if err != nil { - fmt.Println(err) - return + panic(err) } blob, _, err = w2.Sign(flatPP) if err != nil { - fmt.Println(err) - return + panic(err) } res, err = client.SubmitTxBlobAndWait(blob, false) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Partial Payment transaction submitted!") diff --git a/_code-samples/partial-payment/go/ws/main.go b/_code-samples/partial-payment/go/ws/main.go index 6d43e7e54eb..965453a8ac3 100644 --- a/_code-samples/partial-payment/go/ws/main.go +++ b/_code-samples/partial-payment/go/ws/main.go @@ -22,8 +22,7 @@ func main() { defer client.Disconnect() if err := client.Connect(); err != nil { - fmt.Println(err) - return + panic(err) } if !client.IsConnected() { @@ -37,24 +36,20 @@ func main() { fmt.Println("Funding wallets...") w1, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } w2, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } if err := client.FundWallet(&w1); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Wallet 1 funded") if err := client.FundWallet(&w2); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Wallet 2 funded") @@ -78,20 +73,17 @@ func main() { err = client.Autofill(&flatTs) if err != nil { - fmt.Println(err) - return + panic(err) } blob, _, err := w2.Sign(flatTs) if err != nil { - fmt.Println(err) - return + panic(err) } res, err := client.SubmitTxBlobAndWait(blob, false) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("TrustSet transaction submitted!") @@ -116,20 +108,17 @@ func main() { err = client.Autofill(&flatP) if err != nil { - fmt.Println(err) - return + panic(err) } blob, _, err = w1.Sign(flatP) if err != nil { - fmt.Println(err) - return + panic(err) } res, err = client.SubmitTxBlobAndWait(blob, false) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Payment transaction submitted!") @@ -156,20 +145,17 @@ func main() { err = client.Autofill(&flatPP) if err != nil { - fmt.Println(err) - return + panic(err) } blob, _, err = w2.Sign(flatPP) if err != nil { - fmt.Println(err) - return + panic(err) } res, err = client.SubmitTxBlobAndWait(blob, false) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Partial Payment transaction submitted!") diff --git a/_code-samples/paths/go/rpc/main.go b/_code-samples/paths/go/rpc/main.go index 8b31b038ff3..4cb880a66be 100644 --- a/_code-samples/paths/go/rpc/main.go +++ b/_code-samples/paths/go/rpc/main.go @@ -39,14 +39,12 @@ func main() { wallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Funding wallet...") if err := client.FundWallet(&wallet); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Wallet funded") @@ -64,8 +62,7 @@ func main() { DestinationAmount: DestinationAmount, }) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Printf("Computed paths: %d\n", len(res.Alternatives)) @@ -89,20 +86,17 @@ func main() { flatP := p.Flatten() if err := client.Autofill(&flatP); err != nil { - fmt.Println(err) - return + panic(err) } blob, hash, err := wallet.Sign(flatP) if err != nil { - fmt.Println(err) - return + panic(err) } txRes, err := client.SubmitTxBlobAndWait(blob, false) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Payment submitted") diff --git a/_code-samples/paths/go/ws/main.go b/_code-samples/paths/go/ws/main.go index 680acdeee75..f3e2d59a22a 100644 --- a/_code-samples/paths/go/ws/main.go +++ b/_code-samples/paths/go/ws/main.go @@ -36,8 +36,7 @@ func main() { defer client.Disconnect() if err := client.Connect(); err != nil { - fmt.Println(err) - return + panic(err) } if !client.IsConnected() { @@ -50,14 +49,12 @@ func main() { wallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Funding wallet...") if err := client.FundWallet(&wallet); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Wallet funded") @@ -75,8 +72,7 @@ func main() { DestinationAmount: DestinationAmount, }) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Printf("Computed paths: %d\n", len(res.Alternatives)) @@ -100,20 +96,17 @@ func main() { flatP := p.Flatten() if err := client.Autofill(&flatP); err != nil { - fmt.Println(err) - return + panic(err) } blob, hash, err := wallet.Sign(flatP) if err != nil { - fmt.Println(err) - return + panic(err) } txRes, err := client.SubmitTxBlobAndWait(blob, false) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Payment submitted") diff --git a/_code-samples/send-a-memo/go/rpc/main.go b/_code-samples/send-a-memo/go/rpc/main.go index fa32f26bf5a..b1e10ee987b 100644 --- a/_code-samples/send-a-memo/go/rpc/main.go +++ b/_code-samples/send-a-memo/go/rpc/main.go @@ -16,14 +16,12 @@ import ( func main() { w, err := wallet.FromSeed("sEdSMVV4dJ1JbdBxmakRR4Puu3XVZz2", "") if err != nil { - fmt.Println(err) - return + panic(err) } receiverWallet, err := wallet.FromSeed("sEd7d8Ci9nevdLCeUMctF3uGXp9WQqJ", "") if err != nil { - fmt.Println(err) - return + panic(err) } cfg, err := rpc.NewClientConfig( @@ -42,8 +40,7 @@ func main() { fmt.Println("Funding wallet...") err = client.FundWallet(&w) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Wallet funded") } @@ -54,14 +51,12 @@ func main() { amount, err := currency.XrpToDrops("1") if err != nil { - fmt.Println(err) - return + panic(err) } amountUint, err := strconv.ParseUint(amount, 10, 64) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Sending payment...") @@ -93,20 +88,17 @@ func main() { err = client.Autofill(&flatTx) if err != nil { - fmt.Println(err) - return + panic(err) } txBlob, _, err := w.Sign(flatTx) if err != nil { - fmt.Println(err) - return + panic(err) } response, err := client.SubmitTxBlobAndWait(txBlob, true) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Payment submitted") diff --git a/_code-samples/send-a-memo/go/ws/main.go b/_code-samples/send-a-memo/go/ws/main.go index 30daaf0dac1..cc0e9b027b5 100644 --- a/_code-samples/send-a-memo/go/ws/main.go +++ b/_code-samples/send-a-memo/go/ws/main.go @@ -16,14 +16,12 @@ import ( func main() { w, err := wallet.FromSeed("sEdSMVV4dJ1JbdBxmakRR4Puu3XVZz2", "") if err != nil { - fmt.Println(err) - return + panic(err) } receiverWallet, err := wallet.FromSeed("sEd7d8Ci9nevdLCeUMctF3uGXp9WQqJ", "") if err != nil { - fmt.Println(err) - return + panic(err) } client := websocket.NewClient( @@ -35,8 +33,7 @@ func main() { fmt.Println("Connecting to server...") if err := client.Connect(); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Connected to server") @@ -48,8 +45,7 @@ func main() { fmt.Println("Funding wallet...") err = client.FundWallet(&w) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Wallet funded") } @@ -60,14 +56,12 @@ func main() { amount, err := currency.XrpToDrops("1") if err != nil { - fmt.Println(err) - return + panic(err) } amountUint, err := strconv.ParseUint(amount, 10, 64) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Sending payment...") @@ -99,20 +93,17 @@ func main() { err = client.Autofill(&flatTx) if err != nil { - fmt.Println(err) - return + panic(err) } txBlob, _, err := w.Sign(flatTx) if err != nil { - fmt.Println(err) - return + panic(err) } response, err := client.SubmitTxBlobAndWait(txBlob, true) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Payment submitted") diff --git a/_code-samples/send-xrp/go/rpc/main.go b/_code-samples/send-xrp/go/rpc/main.go index 651b36e5612..0d16ec9f95f 100644 --- a/_code-samples/send-xrp/go/rpc/main.go +++ b/_code-samples/send-xrp/go/rpc/main.go @@ -34,14 +34,12 @@ func main() { w, err := wallet.FromSeed(WalletSeed, "") if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Funding wallet...") if err := client.FundWallet(&w); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Wallet funded") @@ -49,14 +47,12 @@ func main() { xrpAmount, err := currency.XrpToDrops("1") if err != nil { - fmt.Println(err) - return + panic(err) } xrpAmountInt, err := strconv.ParseInt(xrpAmount, 10, 64) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Sending 1 XRP to rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe...") @@ -72,20 +68,17 @@ func main() { flattenedTx := p.Flatten() if err := client.Autofill(&flattenedTx); err != nil { - fmt.Println(err) - return + panic(err) } txBlob, _, err := w.Sign(flattenedTx) if err != nil { - fmt.Println(err) - return + panic(err) } res, err := client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Payment submitted") @@ -101,8 +94,7 @@ func main() { Wallet: &w, }) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Payment submitted via SubmitTxAndWait") diff --git a/_code-samples/send-xrp/go/ws/main.go b/_code-samples/send-xrp/go/ws/main.go index 07b1870e443..5e07e216788 100644 --- a/_code-samples/send-xrp/go/ws/main.go +++ b/_code-samples/send-xrp/go/ws/main.go @@ -23,8 +23,7 @@ client := websocket.NewClient( defer client.Disconnect() if err := client.Connect(); err != nil { - fmt.Println(err) - return + panic(err) } if !client.IsConnected() { @@ -39,15 +38,13 @@ fmt.Println() const WalletSeed = "sEd7zwWAu7vXMCBkkzokJHEXiKw2B2s" w, err := wallet.FromSeed(WalletSeed, "") if err != nil { - fmt.Println(err) - return + panic(err) } // Funding the wallet fmt.Println("Funding wallet...") if err := client.FundWallet(&w); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Wallet funded") @@ -55,14 +52,12 @@ fmt.Println() xrpAmount, err := currency.XrpToDrops("1") if err != nil { - fmt.Println(err) - return + panic(err) } xrpAmountInt, err := strconv.ParseInt(xrpAmount, 10, 64) if err != nil { - fmt.Println(err) - return + panic(err) } // Prepare a payment transaction @@ -78,22 +73,19 @@ p := &transaction.Payment{ flattenedTx := p.Flatten() if err := client.Autofill(&flattenedTx); err != nil { - fmt.Println(err) - return + panic(err) } // Sign the transaction using the wallet txBlob, _, err := w.Sign(flattenedTx) if err != nil { - fmt.Println(err) - return + panic(err) } // Submit the transaction and wait for the result res_blob, err := client.SubmitTxBlobAndWait(txBlob, false) if err != nil { - fmt.Println(err) - return + panic(err) } // Example with SubmitTxAndWait @@ -103,8 +95,7 @@ res_flat, err := client.SubmitTxAndWait(flattenedTx2, &wstypes.SubmitOptions{ Wallet: &w, }) if err != nil { - fmt.Println(err) - return + panic(err) } // Wait for validation ------------------------------------------------------- // SubmitTxBlobAndWait() handles this automatically, but it can take 4-7s. diff --git a/_code-samples/set-regular-key/go/rpc/main.go b/_code-samples/set-regular-key/go/rpc/main.go index 2b476955268..8a4b7ec15b3 100644 --- a/_code-samples/set-regular-key/go/rpc/main.go +++ b/_code-samples/set-regular-key/go/rpc/main.go @@ -24,40 +24,34 @@ func main() { w1, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } w2, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } regularKeyWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Funding wallets...") if err := client.FundWallet(&w1); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Wallet 1 funded") if err := client.FundWallet(&w2); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Wallet 2 funded") if err := client.FundWallet(®ularKeyWallet); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Regular key wallet funded") @@ -75,20 +69,17 @@ func main() { err = client.Autofill(&flatRk) if err != nil { - fmt.Println(err) - return + panic(err) } blob, _, err := w1.Sign(flatRk) if err != nil { - fmt.Println(err) - return + panic(err) } res, err := client.SubmitTxBlobAndWait(blob, false) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("SetRegularKey transaction submitted") @@ -109,20 +100,17 @@ func main() { err = client.Autofill(&flatP) if err != nil { - fmt.Println(err) - return + panic(err) } blob, _, err = regularKeyWallet.Sign(flatP) if err != nil { - fmt.Println(err) - return + panic(err) } res, err = client.SubmitTxBlobAndWait(blob, false) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Payment transaction submitted") diff --git a/_code-samples/set-regular-key/go/ws/main.go b/_code-samples/set-regular-key/go/ws/main.go index 7c7c26ca343..ffcf42549b6 100644 --- a/_code-samples/set-regular-key/go/ws/main.go +++ b/_code-samples/set-regular-key/go/ws/main.go @@ -21,8 +21,7 @@ func main() { defer client.Disconnect() if err := client.Connect(); err != nil { - fmt.Println(err) - return + panic(err) } if !client.IsConnected() { @@ -35,40 +34,34 @@ func main() { w1, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } w2, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } regularKeyWallet, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Funding wallets...") if err := client.FundWallet(&w1); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Wallet 1 funded") if err := client.FundWallet(&w2); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Wallet 2 funded") if err := client.FundWallet(®ularKeyWallet); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Regular key wallet funded") @@ -86,20 +79,17 @@ func main() { err = client.Autofill(&flatRk) if err != nil { - fmt.Println(err) - return + panic(err) } blob, _, err := w1.Sign(flatRk) if err != nil { - fmt.Println(err) - return + panic(err) } res, err := client.SubmitTxBlobAndWait(blob, false) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("SetRegularKey transaction submitted") @@ -120,20 +110,17 @@ func main() { err = client.Autofill(&flatP) if err != nil { - fmt.Println(err) - return + panic(err) } blob, _, err = regularKeyWallet.Sign(flatP) if err != nil { - fmt.Println(err) - return + panic(err) } res, err = client.SubmitTxBlobAndWait(blob, false) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Payment transaction submitted") diff --git a/_code-samples/use-tickets/go/main.go b/_code-samples/use-tickets/go/main.go index 2561aae1983..ccf7d05098b 100644 --- a/_code-samples/use-tickets/go/main.go +++ b/_code-samples/use-tickets/go/main.go @@ -25,14 +25,12 @@ func main() { w, err := wallet.New(crypto.ED25519()) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Funding wallet...") if err := client.FundWallet(&w); err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Wallet funded") @@ -42,8 +40,7 @@ func main() { Account: w.GetAddress(), }) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Current wallet sequence:", info.AccountData.Sequence) @@ -61,20 +58,17 @@ func main() { flatTc := tc.Flatten() if err := client.Autofill(&flatTc); err != nil { - fmt.Println(err) - return + panic(err) } blob, _, err := w.Sign(flatTc) if err != nil { - fmt.Println(err) - return + panic(err) } res, err := client.SubmitTxBlobAndWait(blob, false) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("TicketCreate transaction submitted") @@ -86,16 +80,14 @@ func main() { Account: w.GetAddress(), }) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Account objects:", objects.AccountObjects[0]["TicketSequence"]) seq, err := objects.AccountObjects[0]["TicketSequence"].(json.Number).Int64() if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("Submitting AccountSet transaction...") @@ -110,22 +102,19 @@ func main() { flatAs := as.Flatten() if err := client.Autofill(&flatAs); err != nil { - fmt.Println(err) - return + panic(err) } flatAs["Sequence"] = uint32(0) blob, _, err = w.Sign(flatAs) if err != nil { - fmt.Println(err) - return + panic(err) } res, err = client.SubmitTxBlobAndWait(blob, false) if err != nil { - fmt.Println(err) - return + panic(err) } fmt.Println("AccountSet transaction submitted") From 0228e2e3c34fc69881e095bf468410e6b9e763cc Mon Sep 17 00:00:00 2001 From: banasa44 Date: Mon, 25 Aug 2025 14:58:14 +0200 Subject: [PATCH 18/18] fix(docs): correct terminology from "GoLang" to "Go" in tutorial files, replace code snippets to references. --- docs/tutorials/go/build-apps/get-started.md | 24 ++++++--------------- docs/tutorials/go/build-apps/index.md | 4 ++-- 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/docs/tutorials/go/build-apps/get-started.md b/docs/tutorials/go/build-apps/get-started.md index 4e5c1da0e44..6ba4f0d090e 100644 --- a/docs/tutorials/go/build-apps/get-started.md +++ b/docs/tutorials/go/build-apps/get-started.md @@ -27,7 +27,7 @@ To follow this tutorial, you should have Go version `1.22.0` or later installed. ## Installation -The [`xrpl-go` library](https://github.com/Peersyst/xrpl-go) is available on +The [`xrpl-go` library](https://github.com/Peersyst/xrpl-go) is available on [pkg.go.dev](https://pkg.go.dev/github.com/Peersyst/xrpl-go). Start a new project (or use an existing one) and install the `xrpl-go` library via Go modules: @@ -54,24 +54,12 @@ Here are the basic steps you'll need to cover for almost any XRP Ledger project: To make queries and submit transactions, you need to connect to the XRP Ledger. To do this with `xrpl-go`, you have two main options: 1. Via WebSocket: - ```go - // Define the network client - client := websocket.NewClient(websocket.NewClientConfig(). - WithHost("wss://s.altnet.rippletest.net:51233")) - - // Disconnect the client when done. (Defer executes at the end of the function) - defer client.Disconnect() - - // Connect to the network - if err := client.Connect(); err != nil { - fmt.Println(err) - return - } - ``` -2. Via RPC: - {% code-snippet file="/_code-samples/get-started/go/base/rpc/main.go" from="func main()" language="go" /%} + {% code-snippet file="/_code-samples/get-started/go/base/ws/main.go" from="func main()" language="go" /%} + +2. Via RPC: + {% code-snippet file="/_code-samples/get-started/go/base/rpc/main.go" from="func main()" language="go" /%} #### Connect to the production XRP Ledger @@ -89,6 +77,7 @@ The sample code in the previous section shows you how to connect to the Testnet, // ... custom code goes here } + ``` See the example [core server config file](https://github.com/XRPLF/rippled/blob/c0a0b79d2d483b318ce1d82e526bd53df83a4a2c/cfg/rippled-example.cfg#L1562) for more information about default values. @@ -104,6 +93,7 @@ The sample code in the previous section shows you how to connect to the Testnet, // ... custom code goes here } + ``` ### 2. Get account diff --git a/docs/tutorials/go/build-apps/index.md b/docs/tutorials/go/build-apps/index.md index e8b19e23c9a..7a95406085b 100644 --- a/docs/tutorials/go/build-apps/index.md +++ b/docs/tutorials/go/build-apps/index.md @@ -3,8 +3,8 @@ metadata: indexPage: true --- -# Build Applications with GoLang Library +# Build Applications with Go Library -Build full-featured applications in GoLang. +Build full-featured applications in Go. {% child-pages /%}