Functions/Invoke-CoinbaseRequest.ps1

function Invoke-CoinbaseProRequest {
    Param (
        [Parameter()] $Request    
    )

    $EpochStart = Get-Date -Date "01/01/1970"
    $Timestamp = (New-TimeSpan -Start $EpochStart -End (Get-Date).ToUniversalTime()).TotalSeconds
    $Timestamp = ([math]::Round($Timestamp, 0)).ToString()
    $Prehash = $Timestamp + $request.method.ToUpper() + $request.url + $request.body
    $Signature_b64 = Get-HMAC -Message $prehash -Secret $request.secret
    $Header = @{
        "CB-ACCESS-KEY"        = $request.key
        "CB-ACCESS-SIGN"       = $signature_b64
        "CB-ACCESS-TIMESTAMP"  = $Timestamp
        "CB-ACCESS-PASSPHRASE" = $request.passphrase
        "Content-Type"         = 'application/json'
        "accept"               = 'application/json'
    }
    $Uri = $request.endpoint + $request.url
    if ($request.method.ToUpper() -eq 'POST') {
        try { $response = Invoke-RestMethod -Method $request.method -Uri $uri -Headers $header -Body $request.body }
        catch { $Statuscode = $_.exception.message }
    } else {
        try { $response = Invoke-RestMethod -Method $request.method -Uri $uri -Headers $header }
        catch { $Statuscode = $_.exception.message }
    }
        
    if ($Statuscode) {
        $Errorcode = $Statuscode | Select-String -Pattern '\d{3,3}'
        $Errorcode = $Errorcode.Matches.Value
            
        Switch ($Errorcode) {
            '400' { Write-Error "Bad Request. Invalid request format" }
            '401' { Write-Error "Unauthorized. Invalid API Key" }
            '403' { Write-Error "Forbidden. You do not have access to the requested resource" } 
            '404' { Write-Error "Not Found" }
            '500' { Write-Error "Internal Server Error" } 
        }
    }
    Return $response
}

function Get-HMAC {
    Param(
        [Parameter()] $Message,
        [Parameter()] $Secret    
    )

    $hmacsha = New-Object System.Security.Cryptography.HMACSHA256
    $hmacsha.key = [Convert]::FromBase64String($secret)
    $signature = $hmacsha.ComputeHash([Text.Encoding]::ASCII.GetBytes($message))
    $signature = [Convert]::ToBase64String($signature)
    return $signature
}

Function Get-BlankAPI {
    Param(
        [Parameter()] [switch] $SandboxAPI   
    )

    $api = @{
        "endpoint"   = 'https://api.pro.coinbase.com'
        "url"        = ''
        "method"     = ''
        "body"       = ''
        "key"        = ''
        "secret"     = ''
        "passphrase" = ''
    }

    if ($SandboxAPI) {
        $api.endpoint = "https://api-public.sandbox.pro.coinbase.com"
    }
    Return $api
}

Function Test-Product {
    Param(
        [Parameter(Position = 0)] [string] $Product   
    )

    $ValidProducts = Import-Csv "$([system.io.path]::GetTempPath())/CoinbaseProPS-Products.csv"

    if ($ValidProducts.id.Contains($Product.ToUpper())) {
        Return $true
    } else {
        Throw "Invalid Product!"
        Return $false
    }
}

Function Test-Currency {
    Param(
        [Parameter(Position = 0)] [string] $Currency   
    )

    $ValidCurrencies = Import-Csv "$([system.io.path]::GetTempPath())/CoinbaseProPS-currencies.csv"

    if ($ValidCurrencies.id.Contains($Currency.ToUpper())) {
        Return $true
    } else {
        Throw "Invalid Currency!"
        Return $false
    }
}