klaytn 0.0.7 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Gemfile.lock +6 -10
- data/klaytn.gemspec +7 -1
- data/lib/klaytn/contract.rb +7 -7
- data/lib/klaytn/decoder.rb +10 -2
- data/lib/klaytn/encoder.rb +123 -4
- data/lib/klaytn/token.rb +1 -1
- data/lib/klaytn/transaction.rb +1 -1
- data/lib/klaytn/version.rb +1 -1
- data/lib/klaytn.rb +3 -1
- metadata +23 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1b2ecedaa55657b6727db503cd9cd03aa8042da5bda490431c75be6739f2f957
|
4
|
+
data.tar.gz: 4dceec99b7cba5c3622e24fa93d2b7959213de6c687824a38395fd0dfc37f097
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5fb1d6e532804b44232fa1e889e95955987d18c043564a77c8e376be76317c749d8827f1a8427ffbcabcae6afdab01f26b9492617805758d4ed06c624b795d3a
|
7
|
+
data.tar.gz: 063c1e02aa2b2ad4e0c36182bd43b58459a2e80d56bdc80ef9410467378e1ef61061f61fe299cb716aa469dbbb35c311b92e1c88f6141f3b971ba78bc2b06e71
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,30 +1,27 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
klaytn (0.0.
|
5
|
-
|
4
|
+
klaytn (0.0.9)
|
5
|
+
activesupport (>= 4.2)
|
6
6
|
httparty (~> 0.20.0)
|
7
|
+
keccak (~> 1.3)
|
7
8
|
|
8
9
|
GEM
|
9
10
|
remote: https://rubygems.org/
|
10
11
|
specs:
|
11
|
-
activesupport (
|
12
|
+
activesupport (7.0.2.2)
|
12
13
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
13
14
|
i18n (>= 1.6, < 2)
|
14
15
|
minitest (>= 5.1)
|
15
16
|
tzinfo (~> 2.0)
|
16
|
-
zeitwerk (~> 2.3)
|
17
17
|
concurrent-ruby (1.1.9)
|
18
18
|
diff-lcs (1.5.0)
|
19
|
-
digest-sha3 (1.1.0)
|
20
|
-
ethereum.rb (2.5)
|
21
|
-
activesupport (>= 4.0)
|
22
|
-
digest-sha3 (~> 1.1)
|
23
19
|
httparty (0.20.0)
|
24
20
|
mime-types (~> 3.0)
|
25
21
|
multi_xml (>= 0.5.2)
|
26
22
|
i18n (1.10.0)
|
27
23
|
concurrent-ruby (~> 1.0)
|
24
|
+
keccak (1.3.0)
|
28
25
|
mime-types (3.4.1)
|
29
26
|
mime-types-data (~> 3.2015)
|
30
27
|
mime-types-data (3.2022.0105)
|
@@ -46,7 +43,6 @@ GEM
|
|
46
43
|
rspec-support (3.11.0)
|
47
44
|
tzinfo (2.0.4)
|
48
45
|
concurrent-ruby (~> 1.0)
|
49
|
-
zeitwerk (2.5.4)
|
50
46
|
|
51
47
|
PLATFORMS
|
52
48
|
ruby
|
@@ -57,4 +53,4 @@ DEPENDENCIES
|
|
57
53
|
rspec (~> 3.0)
|
58
54
|
|
59
55
|
BUNDLED WITH
|
60
|
-
2.
|
56
|
+
2.2.33
|
data/klaytn.gemspec
CHANGED
@@ -31,7 +31,13 @@ Gem::Specification.new do |spec|
|
|
31
31
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
32
32
|
spec.require_paths = ["lib", "bin"]
|
33
33
|
|
34
|
+
|
34
35
|
spec.add_development_dependency "rspec", "~> 3.9.1"
|
36
|
+
|
37
|
+
spec.add_dependency "activesupport", ">= 4.2"
|
35
38
|
spec.add_dependency "httparty", "~> 0.20.0"
|
36
|
-
spec.add_dependency "
|
39
|
+
spec.add_dependency "keccak", "~> 1.3" # https://github.com/q9f/keccak.rb
|
40
|
+
|
41
|
+
# spec.add_dependency "ethereum.rb", "~> 2.5"
|
42
|
+
|
37
43
|
end
|
data/lib/klaytn/contract.rb
CHANGED
@@ -17,11 +17,11 @@ module Klaytn
|
|
17
17
|
super
|
18
18
|
end
|
19
19
|
|
20
|
-
def deploy(bytecode, submit: true)
|
20
|
+
def deploy(bytecode, submit: true, gas: 900000)
|
21
21
|
body = {
|
22
22
|
from: kas_account_wallet_address, # must be created inside KAS console > Account Pool, and MUST be capital version from Klaytn Scope!
|
23
23
|
input: bytecode,
|
24
|
-
gas:
|
24
|
+
gas: gas,
|
25
25
|
submit: submit
|
26
26
|
}
|
27
27
|
|
@@ -31,10 +31,10 @@ module Klaytn
|
|
31
31
|
|
32
32
|
## DEPRECATE: definition ex: 'addAddressToWhitelist(address)' - string literal Solidity function definition
|
33
33
|
# definition ex: 'addAddressToWhitelist' - string literal Solidity function definition, without parameters/parens
|
34
|
-
# inputs ex: [
|
34
|
+
# inputs ex: [OpenStruct.new({ "internalType": "address", "name": "addr", "type": "address" })] - array of dot-notation object from ABI
|
35
35
|
# params ex: ['0x0xxxx'] - array of arguments accepted by function
|
36
36
|
|
37
|
-
def invoke_function(definition, params)
|
37
|
+
def invoke_function(definition, params, gas: 0)
|
38
38
|
raise MISSING_CONTRACT if contract_address.blank?
|
39
39
|
raise MISSING_ABI if abi.blank?
|
40
40
|
|
@@ -44,17 +44,17 @@ module Klaytn
|
|
44
44
|
built_defintion = "#{definition}(#{found_function[:inputs].map {|i| i[:type]}.join(',')})"
|
45
45
|
built_inputs = found_function[:inputs].map { |i| OpenStruct.new(i) }
|
46
46
|
|
47
|
-
body = function_body_builder(built_defintion, built_inputs, params)
|
47
|
+
body = function_body_builder(built_defintion, built_inputs, params, gas)
|
48
48
|
resp = HTTParty.post(BASE_URL + '/execute', body: body.to_json, headers: headers.merge('x-krn' => kas_account_pool_krn), basic_auth: basic_auth)
|
49
49
|
JSON.parse(resp.body)
|
50
50
|
end
|
51
51
|
|
52
|
-
def function_body_builder(definition, inputs, params)
|
52
|
+
def function_body_builder(definition, inputs, params, gas)
|
53
53
|
{
|
54
54
|
from: kas_account_wallet_address,
|
55
55
|
to: contract_address,
|
56
56
|
input: encoder.encode_function(definition, inputs, params),
|
57
|
-
|
57
|
+
gas: gas,
|
58
58
|
submit: true
|
59
59
|
}
|
60
60
|
end
|
data/lib/klaytn/decoder.rb
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
module Klaytn
|
2
2
|
class Decoder
|
3
|
-
def decode_uint(
|
4
|
-
|
3
|
+
def decode_uint(value, subtype = "256", start = 0) # ex: 0x4563918244f40000 => 5000000000000000000 (5 KLAY)
|
4
|
+
trim(value, start, bitsize(subtype)).hex
|
5
|
+
end
|
6
|
+
|
7
|
+
def trim(value, start, bitsize = 256)
|
8
|
+
value[start+63-(bitsize/4-1)..start+63]
|
9
|
+
end
|
10
|
+
|
11
|
+
def bitsize(subtype, default = 256)
|
12
|
+
subtype.present? ? subtype.to_i : default
|
5
13
|
end
|
6
14
|
end
|
7
15
|
end
|
data/lib/klaytn/encoder.rb
CHANGED
@@ -2,16 +2,135 @@ module Klaytn
|
|
2
2
|
class Encoder
|
3
3
|
def encode_function(definition, inputs, params)
|
4
4
|
prefix = '0x'
|
5
|
-
str =
|
6
|
-
num =
|
5
|
+
str = Digest::Keccak.hexdigest(definition, 256)[0..7] # ex: "getEarnout(uint256)"
|
6
|
+
num = encode_arguments(inputs, params)
|
7
7
|
|
8
8
|
"#{prefix}#{str}#{num}"
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
11
|
+
def encode_integer(integer) # ex: 5000000000000000000 (5 KLAY) => 0x4563918244f40000
|
12
12
|
return '0x0' if integer.zero?
|
13
|
-
long =
|
13
|
+
long = encode_uint(integer)
|
14
14
|
'0x' + long.sub!(/^[0]+/,'')
|
15
15
|
end
|
16
|
+
|
17
|
+
# code below this point was adopted from ethereum.rb gem in order to
|
18
|
+
# avoid dependency issues with Digest requiring older Ruby versions
|
19
|
+
def encode(type, value)
|
20
|
+
is_array, arity, array_subtype = parse_array_type(type)
|
21
|
+
if is_array && arity
|
22
|
+
encode_static_array(arity, array_subtype, value)
|
23
|
+
elsif is_array
|
24
|
+
encode_dynamic_array(array_subtype, value)
|
25
|
+
else
|
26
|
+
core, subtype = parse_type(type)
|
27
|
+
method_name = "encode_#{core}".to_sym
|
28
|
+
self.send(method_name, value, subtype)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def encode_static_array(arity, array_subtype, array)
|
33
|
+
raise "Wrong number of arguments" if arity != array.size
|
34
|
+
array.inject("") { |a, e| a << encode(array_subtype, e) }
|
35
|
+
end
|
36
|
+
|
37
|
+
def encode_dynamic_array(array_subtype, array)
|
38
|
+
location = encode_uint(@inputs ? size_of_inputs(@inputs) + @tail.size/2 : 32)
|
39
|
+
size = encode_uint(array.size)
|
40
|
+
data = array.inject("") { |a, e| a << encode(array_subtype, e) }
|
41
|
+
[location, size + data]
|
42
|
+
end
|
43
|
+
|
44
|
+
def parse_array_type(type)
|
45
|
+
match = /(.+)\[(\d*)\]\z/.match(type)
|
46
|
+
if match
|
47
|
+
[true, match[2].present? ? match[2].to_i : nil, match[1]]
|
48
|
+
else
|
49
|
+
[false, nil, nil]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def parse_type(type)
|
54
|
+
puts "TYPE: #{type}"
|
55
|
+
# raise NotImplementedError if type.ends_with?("]")
|
56
|
+
raise NotImplementedError if type[-1] == "]"
|
57
|
+
match = /(\D+)(\d.*)?/.match(type)
|
58
|
+
[match[1], match[2]]
|
59
|
+
end
|
60
|
+
|
61
|
+
def encode_arguments(inputs, args)
|
62
|
+
raise "Wrong number of arguments" if inputs.length != args.length
|
63
|
+
@head = ""
|
64
|
+
@tail = ""
|
65
|
+
@inputs = inputs
|
66
|
+
inputs.each.with_index do |input, index|
|
67
|
+
encoded = encode(input.type, args[index])
|
68
|
+
if encoded.is_a? Array
|
69
|
+
@head << encoded[0]
|
70
|
+
@tail << encoded[1]
|
71
|
+
else
|
72
|
+
@head << encoded
|
73
|
+
end
|
74
|
+
end
|
75
|
+
@head + @tail
|
76
|
+
end
|
77
|
+
|
78
|
+
def encode_bool(value, _)
|
79
|
+
(value ? "1" : "0").rjust(64, '0')
|
80
|
+
end
|
81
|
+
|
82
|
+
def encode_fixed(value, subtype)
|
83
|
+
n = subtype.nil? ? 128 : /(\d+)x(\d+)/.match(subtype)[2].to_i
|
84
|
+
do_encode_fixed(value, n)
|
85
|
+
end
|
86
|
+
|
87
|
+
def do_encode_fixed(value, n)
|
88
|
+
encode_uint((value * 2**n).to_i)
|
89
|
+
end
|
90
|
+
|
91
|
+
def encode_ufixed(_value, _)
|
92
|
+
raise NotImplementedError
|
93
|
+
end
|
94
|
+
|
95
|
+
def encode_bytes(value, subtype)
|
96
|
+
subtype.nil? ? encode_dynamic_bytes(value) : encode_static_bytes(value)
|
97
|
+
end
|
98
|
+
|
99
|
+
def encode_static_bytes(value)
|
100
|
+
value.bytes.map {|x| x.to_s(16).rjust(2, '0')}.join("").ljust(64, '0')
|
101
|
+
end
|
102
|
+
|
103
|
+
def encode_dynamic_bytes(value)
|
104
|
+
location = encode_uint(@inputs ? size_of_inputs(@inputs) + @tail.size/2 : 32)
|
105
|
+
size = encode_uint(value.size)
|
106
|
+
content = encode_static_bytes(value)
|
107
|
+
[location, size + content]
|
108
|
+
end
|
109
|
+
|
110
|
+
def encode_string(value, _)
|
111
|
+
location = encode_uint(@inputs ? size_of_inputs(@inputs) + @tail.size/2 : 32)
|
112
|
+
size = encode_uint(value.bytes.size)
|
113
|
+
content = value.bytes.map {|x| x.to_s(16).rjust(2, '0')}.join("").ljust(64, '0')
|
114
|
+
[location, size + content]
|
115
|
+
end
|
116
|
+
|
117
|
+
def encode_address(value, _)
|
118
|
+
value = "0" * 24 + value.gsub(/^0x/,'')
|
119
|
+
raise ArgumentError if value.size != 64
|
120
|
+
value
|
121
|
+
end
|
122
|
+
|
123
|
+
def encode_uint(value, _ = nil)
|
124
|
+
raise ArgumentError if value < 0
|
125
|
+
encode_int(value)
|
126
|
+
end
|
127
|
+
|
128
|
+
def encode_int(value, _ = nil)
|
129
|
+
to_twos_complement(value).to_s(16).rjust(64, '0')
|
130
|
+
end
|
131
|
+
|
132
|
+
def to_twos_complement(number)
|
133
|
+
(number & ((1 << 256) - 1))
|
134
|
+
end
|
16
135
|
end
|
17
136
|
end
|
data/lib/klaytn/token.rb
CHANGED
data/lib/klaytn/transaction.rb
CHANGED
@@ -23,7 +23,7 @@ module Klaytn
|
|
23
23
|
body = {
|
24
24
|
from: kas_account_wallet_address,
|
25
25
|
to: address,
|
26
|
-
value: encoder.
|
26
|
+
value: encoder.encode_integer(amount_in_peb), # '0x0' = 0 KLAY, '0x4563918244f40000' = 5 KLAY
|
27
27
|
memo: opts[:memo], # can be a text note; viewable on Klaytn Scope!
|
28
28
|
gas: opts[:gas] || 200000, # not required, default is 1,000,000 if excluded
|
29
29
|
submit: should_submit?(opts) # create real transaction by default
|
data/lib/klaytn/version.rb
CHANGED
data/lib/klaytn.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: klaytn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Kulp
|
8
8
|
- Ooju
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2022-03-
|
12
|
+
date: 2022-03-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -25,6 +25,20 @@ dependencies:
|
|
25
25
|
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: 3.9.1
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: activesupport
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '4.2'
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '4.2'
|
28
42
|
- !ruby/object:Gem::Dependency
|
29
43
|
name: httparty
|
30
44
|
requirement: !ruby/object:Gem::Requirement
|
@@ -40,19 +54,19 @@ dependencies:
|
|
40
54
|
- !ruby/object:Gem::Version
|
41
55
|
version: 0.20.0
|
42
56
|
- !ruby/object:Gem::Dependency
|
43
|
-
name:
|
57
|
+
name: keccak
|
44
58
|
requirement: !ruby/object:Gem::Requirement
|
45
59
|
requirements:
|
46
60
|
- - "~>"
|
47
61
|
- !ruby/object:Gem::Version
|
48
|
-
version: '
|
62
|
+
version: '1.3'
|
49
63
|
type: :runtime
|
50
64
|
prerelease: false
|
51
65
|
version_requirements: !ruby/object:Gem::Requirement
|
52
66
|
requirements:
|
53
67
|
- - "~>"
|
54
68
|
- !ruby/object:Gem::Version
|
55
|
-
version: '
|
69
|
+
version: '1.3'
|
56
70
|
description: Interact with transactions, smart contracts, and NFTs on the Klaytn blockchain
|
57
71
|
in pure Ruby.
|
58
72
|
email:
|
@@ -91,7 +105,7 @@ metadata:
|
|
91
105
|
homepage_uri: https://github.com/OojuTeam/klaytn-ruby
|
92
106
|
source_code_uri: https://github.com/OojuTeam/klaytn-ruby
|
93
107
|
changelog_uri: https://github.com/usefomo/fomo-ruby-sdk/releases
|
94
|
-
post_install_message:
|
108
|
+
post_install_message:
|
95
109
|
rdoc_options: []
|
96
110
|
require_paths:
|
97
111
|
- lib
|
@@ -107,8 +121,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
107
121
|
- !ruby/object:Gem::Version
|
108
122
|
version: '0'
|
109
123
|
requirements: []
|
110
|
-
rubygems_version: 3.
|
111
|
-
signing_key:
|
124
|
+
rubygems_version: 3.2.32
|
125
|
+
signing_key:
|
112
126
|
specification_version: 4
|
113
127
|
summary: Klaytn is a Ruby wrapper for the Klaytn blockchain.
|
114
128
|
test_files: []
|